package inp.camac;

import java.util.Date;
import java.io.*;

public class test extends Thread{

  Module module;

  public test(Module m){
     module=m;
  }
  
  public static void delay(){
    try{ Thread.currentThread().sleep(100); } 
    catch(Exception e){}  
  }
  

  public void run(){
       int[] data = new int[1];
       int NBITS = module.dataBits();
       int mask  = 0x00ffffff >> (24-NBITS);

       try{          
          while(true){
             System.out.flush();          
             
             Crate crate = module.getCrate();
             crate.Z();      delay(); delay();

             crate.C();      delay(); delay();

             crate.I(true);  
             crate.executeNAF(1,0,0,data,0);
             delay(); delay();

             crate.I(false); 
             crate.executeNAF(1,0,0,data,0);
             delay(); delay();

             

             for(int i=0;i<5;i++) {
                 data[0]=0;
                 synchronized(module) {
                    try{
                       module.AF(0,1<<i,data);
                    } catch(Exception e) {}
                    delay();
                 }
             }
             
             for(int i=0;i<4;i++) {
                 data[0]=0;
                 synchronized(module) {
                     try{
                        module.AF(1<<i,0,data);                        
                     } catch(Exception e) {}
                     delay();
                 }
             }

             for(int i=0;i<NBITS;i++) {
                 data[0]=1<<i;
                 //data[1]=1<<i;                 
                 synchronized(module) {
                     module.AF(0,16,data);
                     delay();
                     module.AF(0,0,data);
                     delay();                     
                 }
                 String s=Integer.toString(data[0],16);
                 if((data[0]&mask)!=(1<<i)) {
                    System.out.println("Write:"+Integer.toString(1<<i,16)+" Read:"+Integer.toString(data[0],16));
                 }                
             }
             synchronized(this){wait();
             }
          }  
      }
      catch(Exception e){
       e.printStackTrace();
      }
          
  }

/* test for cc232 

  public static void main(String[] args) {
   try{
       CamacDriver driver = CamacDriver.loadDriver("inp.camac.cc232.DriverCC232");
       Crate crate        = driver.getCrate(0);

       
       Module module      = new Module();
       crate.addModule(module,2);       
       crate.Z();
       crate.C();
       crate.I(true);
       
       module.addLAMlistener(new myLAMlistener());
       
       test t1 = new test(module);
       test t2 = new test(module);
       test t3 = new test(module);
       test t4 = new test(module);
       t1.start();
       t2.start();
       t3.start();
       t4.start();
   }
   catch(Exception e){
    e.printStackTrace();
   }

  }  
 */


 public static void main(String[] args) {
  try{
      Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
      CamacDriver driver = CamacDriver.loadDriver("inp.camac.PPI6.PPI6");
      Crate crate = driver.getCrate(0);
                        
      Module module      = new Module();
      crate.addModule(module,2);       
      
      module.addLAMlistener(new myLAMlistener());
      
      test t1 = new test(module);
      t1.setPriority(Thread.MAX_PRIORITY);      
      t1.start();
  }
  catch(Exception e){
   e.printStackTrace();
  }

 }  

  
}



  class myLAMlistener implements LAMlistener {
       public void onLAM(LAMevent lam_event) {
          System.out.println("LAM in Module" + lam_event.getSource().getModuleName()+" position="+lam_event.getN()+"   "+(new Date(lam_event.getWhen())));
       }
  }
