diff --git a/HWconf.py b/HWconf.py
new file mode 100644
index 0000000000000000000000000000000000000000..497616312bfebd8d0e90c2b41f46a8f72030f95b
--- /dev/null
+++ b/HWconf.py
@@ -0,0 +1,93 @@
+from collections import namedtuple
+from enum import Enum
+
+#Mid plane address
+MPaddr=namedtuple("MPaddr","nI2C I2C nSwitch Switch"); 
+RCU_MPaddr=MPaddr(1,[1],4,[1,2,3,4])
+CLK_MPaddr=MPaddr(1,[1],1,[7])
+
+DevReg=namedtuple("DevReg","Addr Register_R Register_W store"); 
+#I2C:Addr=I2C addr (int)
+#BBdev: Addr=BBdev (pointer)
+
+#Control board switch
+#dev: TCA9548
+SW1_ch=DevReg(0x70,0,0,0) 
+#I2C IO-Expanders
+#Device: TCA9539
+RCU_IO1_OUT1=DevReg(0x75,0,2,1)
+RCU_IO1_OUT2=DevReg(0x75,1,3,2)
+RCU_IO1_CONF1=DevReg(0x75,6,6,3)
+RCU_IO1_CONF2=DevReg(0x75,7,7,4)
+#Device: TCA9539
+RCU_IO2_OUT1=DevReg(0x76,0,2,5)
+RCU_IO2_OUT2=DevReg(0x76,1,3,6)
+RCU_IO2_CONF1=DevReg(0x76,6,6,7)
+RCU_IO2_CONF2=DevReg(0x76,7,7,8)
+#Device: TCA6416
+RCU_IO3_OUT1=DevReg(0x20,0,2,9)
+RCU_IO3_OUT2=DevReg(0x20,1,3,10)
+RCU_IO3_CONF1=DevReg(0x20,6,6,11)
+RCU_IO3_CONF2=DevReg(0x20,7,7,12)
+
+RCU_storeReg=13; #Number of stored registers
+
+#I2C monitor ADC
+RCU_AN_Ch0=DevReg(0x14,0xB080,-1,0)
+RCU_AN_Ch1=DevReg(0x14,0xB880,-1,0)
+RCU_AN_Ch2=DevReg(0x14,0xB180,-1,0)
+#etc
+RCU_AN_Temp=DevReg(0x14,0xA0C0,-1,0)
+
+#Bitbang devices
+BBdev=namedtuple("BBdev","nPins devs pins addr")
+I2CBB_dth3=BBdev(3,[RCU_IO1_OUT1,RCU_IO2_OUT2,RCU_IO2_CONF2],[6,3,3],0x70); #SCL,SDIO,SDIOdir
+I2CBB_dth2=BBdev(3,[RCU_IO1_OUT2,RCU_IO2_OUT1,RCU_IO1_CONF1],[7,7,7],0x70);
+I2CBB_dth1=BBdev(3,[RCU_IO1_OUT2,RCU_IO2_OUT1,RCU_IO1_CONF1],[7,7,7],0x70);
+SPIBB_ADC1=BBdev(4,[RCU_IO3_OUT1,RCU_IO3_OUT1,RCU_IO3_CONF1,RCU_IO3_OUT2],[1,0,0,0],0) #CLK,SDIO,SDIOdir,CS
+SPIBB_ADC2=BBdev(4,[RCU_IO3_OUT1,RCU_IO3_OUT1,RCU_IO3_CONF1,RCU_IO3_OUT2],[3,2,2,1],0) #CLK,SDIO,SDIOdir,CS
+SPIBB_ADC3=BBdev(4,[RCU_IO3_OUT1,RCU_IO3_OUT1,RCU_IO3_CONF1,RCU_IO3_OUT2],[5,4,4,2],0) #CLK,SDIO,SDIOdir,CS
+
+#SPI ADC 
+#Dev: AD9683 
+RCU_ADC1_PLL_stat =DevReg(SPIBB_ADC1,0X0A,0X0A,0) # PLL locked status
+RCU_ADC1_JESD_ctr =DevReg(SPIBB_ADC1,0X5F,0X5F,0) #JESD link control, ILAS mode
+RCU_ADC1_CML_level=DevReg(SPIBB_ADC1,0X15,0X15,0) #CML output adjust
+RCU_ADC1_SYNC_ctr =DevReg(SPIBB_ADC1,0X3A,0X3A,0) #SYNC / SYSREF control
+RCU_ADC1_update   =DevReg(SPIBB_ADC1,0XFF,0xFF,0)    # Global device update
+
+RCU_ADC2_PLL_stat =DevReg(SPIBB_ADC2,0X0A,0X0A,0) # PLL locked status
+RCU_ADC2_JESD_ctr =DevReg(SPIBB_ADC2,0X5F,0X5F,0) #JESD link control, ILAS mode
+RCU_ADC2_CML_level=DevReg(SPIBB_ADC2,0X15,0X15,0) #CML output adjust
+RCU_ADC2_SYNC_ctr =DevReg(SPIBB_ADC2,0X3A,0X3A,0) #SYNC / SYSREF control
+RCU_ADC2_update   =DevReg(SPIBB_ADC2,0XFF,0xFF,0)    # Global device update
+
+RCU_ADC3_PLL_stat =DevReg(SPIBB_ADC3,0X0A,0X0A,0) # PLL locked status
+RCU_ADC3_JESD_ctr =DevReg(SPIBB_ADC3,0X5F,0X5F,0) #JESD link control, ILAS mode
+RCU_ADC3_CML_level=DevReg(SPIBB_ADC3,0X15,0X15,0) #CML output adjust
+RCU_ADC3_SYNC_ctr =DevReg(SPIBB_ADC3,0X3A,0X3A,0) #SYNC / SYSREF control
+RCU_ADC3_update   =DevReg(SPIBB_ADC3,0XFF,0xFF,0)    # Global device update
+
+#I2C_dither 
+#Dev: SI4010
+RCU_Dth1_Freq =DevReg(I2CBB_dth1,0x1140,0x1141,0) ##TBC
+RCU_Dth1_Prop =DevReg(I2CBB_dth1,0x11  ,0x11,0) 
+RCU_Dth1_Start=DevReg(I2CBB_dth1,0x62  ,0x62,0) 
+RCU_Dth1_Stop =DevReg(I2CBB_dth1,0x67  ,0x67,0) 
+RCU_Dth2_Freq =DevReg(I2CBB_dth2,0x1140,0x1141,0) ##TBC
+RCU_Dth2_Prop =DevReg(I2CBB_dth2,0x11  ,0x11,0) 
+RCU_Dth2_Start=DevReg(I2CBB_dth2,0x62  ,0x62,0) 
+RCU_Dth2_Stop =DevReg(I2CBB_dth2,0x67  ,0x67,0) 
+RCU_Dth3_Freq =DevReg(I2CBB_dth3,0x1140,0x1141,0) ##TBC
+RCU_Dth3_Prop =DevReg(I2CBB_dth3,0x11  ,0x11,0) 
+RCU_Dth3_Start=DevReg(I2CBB_dth3,0x62  ,0x62,0) 
+RCU_Dth3_Stop =DevReg(I2CBB_dth3,0x67  ,0x67,0) 
+
+class DevType(Enum):
+    Var = 0
+    I2C  = 1
+    SPIbb= 2
+    I2Cbb= 3
+    Instr =4
+    VarUpdate = 5
+    Internal = 6
diff --git a/I2C.py b/I2C.py
new file mode 100644
index 0000000000000000000000000000000000000000..037725621622007f7019883d53ab1bfdf446d8e1
--- /dev/null
+++ b/I2C.py
@@ -0,0 +1,38 @@
+import pylibi2c;
+import time
+import logging
+#bus = pylibi2c.I2CDevice('/dev/i2c-1'
+#read=0: write to register
+#read=1: read from register
+#read=2: write to register (common in group)
+#read=3: wait ms second
+I2Ccounter=0;
+
+def I2C1server(addr,data,reg=None,read=0):
+  try:
+       if read==3:
+           time.sleep(data[0]/1000.)
+           return True
+       logging.debug(str(("I2C",addr,reg,data,read)))
+
+#       print("I2C",addr,reg,data,read)
+#       return True;
+       bus=pylibi2c.I2CDevice('/dev/i2c-1',addr)
+       if read==1:
+         length=len(data)
+         bus.iaddr_bytes=0
+         if not(reg is None):
+             bus.ioctl_write(0,str(bytearray([reg])))
+         data[:]=[int(x) for x in bus.ioctl_read(0,length)]
+       else:
+            if reg is None: 
+               bus.iaddr_bytes=0
+               reg=0;
+            bus.ioctl_write(reg,str(bytearray(data)))
+       bus.close()
+       return True;
+  except:
+       if bus: bus.close()
+       data[0]=0
+       return False;
+
diff --git a/I2C_dummy.py b/I2C_dummy.py
new file mode 100644
index 0000000000000000000000000000000000000000..09214ba6bbb078fdf1e0cb44ca023dce7bc7654f
--- /dev/null
+++ b/I2C_dummy.py
@@ -0,0 +1,20 @@
+#import pylibi2c;
+import time
+import logging
+#bus = pylibi2c.I2CDevice('/dev/i2c-1'
+#read=0: write to register
+#read=1: read from register
+#read=2: write to register (common in group)
+#read=3: wait ms second
+I2Ccounter=0;
+def I2C1server(addr,data,reg=None,read=0):
+       global I2Ccounter;
+       if read==3:
+           time.sleep(data[0]/1000.)
+           return True
+       if read==1:
+           data[0]=0
+       if reg: I2Ccounter+=1;
+       I2Ccounter+=len(data)
+       logging.debug(str(("I2C",addr,reg,data,read)))
+       return True
diff --git a/I2Cswitch1.py b/I2Cswitch1.py
new file mode 100644
index 0000000000000000000000000000000000000000..a877678ceec748bc6525de130e530655533ffb00
--- /dev/null
+++ b/I2Cswitch1.py
@@ -0,0 +1,17 @@
+import numpy as np
+import logging
+import HWconf
+class I2Cswitch1():
+    def __init__(self,callback1):
+        self.callback1=callback1;
+        self.CurrentChannel=0;
+
+    def SetChannel(self,channel):
+        if (channel)==self.CurrentChannel: return True;
+        logging.debug(str(("SetChannel",channel,self.CurrentChannel)))
+        self.CurrentChannel=channel
+        return self.callback1(HWconf.SW1_ch.Addr,[channel])
+
+    def I2Ccallback(self,RCU,addr,data,reg=None,read=0):
+        self.callback1(addr,data,reg,read)    
+        
diff --git a/RCU.py b/RCU.py
new file mode 100644
index 0000000000000000000000000000000000000000..4d2e55965c9f5e3d36fa122d0f62b9192b462bba
--- /dev/null
+++ b/RCU.py
@@ -0,0 +1,247 @@
+import Vars
+import numpy as np
+import logging
+from spibitbang1 import *
+
+def ApplyMask(value,width=8,bitoffset=0,previous=0):
+    mask=(1<<width)-1
+    if bitoffset>0:
+      value<<=bitoffset;
+      mask<<=bitoffset;
+    return (value & mask) + (previous - (previous & mask));
+def UnMask(value,width=8,bitoffset=0):
+    mask=(1<<width)-1
+    if bitoffset>0:
+      value>>=bitoffset;
+    value=value&mask;
+    return value;
+
+def bytes2int(bts):
+   x=0;
+   for b in bts:
+     x=x*256+b;
+   return x;
+def int2bytes(i):
+   b=[];
+   while i>255: 
+        b=[i%256]+b;
+        i>>=8;
+   return [i]+b;
+
+class RCU1():
+    def __init__(self,number,I2Ccallback,Switchcallback):
+        self.N=number;
+        self.I2Ccallback=I2Ccallback
+        self.SWcallback=Switchcallback
+        self.previous=np.zeros([number,Vars.RCU_storeReg],dtype='int')
+
+    def SetVar(self,Instr,Mask=[]):
+        if Instr.type==Vars.DevType.Instr:
+              #Execute instructions
+              Iset=Instr.dev;
+              if len(Mask)==0:  Mask=Vars.RCU_mask.OPCW.get_data_value().Value.Value
+              for i in Iset.instr:
+                  logging.debug(str(("Inst",i)))
+                  self.SetVar(i,Mask=Mask)
+              return;
+        if Instr.type in [Vars.DevType.I2C,Vars.DevType.SPIbb,Vars.DevType.I2Cbb]:
+            if len(Mask)==0:  Mask=Vars.RCU_mask.OPCW.get_data_value().Value.Value
+            mask=0;
+            RCU0=-1;
+            for RCUi in range(self.N):
+                 if (Mask[RCUi]): 
+                      mask+=1<<Vars.RCU_MPaddr.Switch[RCUi]
+                      if RCU0<0: RCU0=RCUi;
+            if RCU0<0: return; #Mask all zero
+            self.SWcallback(mask)
+            if Instr.type==Vars.DevType.I2C:
+              logging.info(str(('** Set I2C:',Instr.dev,Instr.value)))
+              self.SetI2C(RCU0,Instr.dev,8,0,Instr.value)
+              return;
+            elif Instr.type==Vars.DevType.SPIbb:
+              logging.debug(str(('** Set SPIbb:',Instr.dev,Instr.value)))
+              SetSPIbb(self.SetI2C,RCU0,Instr.dev,Instr.value)
+              return;
+            elif Instr.type==Vars.DevType.I2Cbb:
+              logging.info(str(('** Set I2Cbb:',Instr.dev,Instr.value)))
+#              self.SetI2C(RCUi,Instr.dev,8,0,Instr.value)
+              return;
+        V1=Instr.dev
+        if not((Instr.nvalue==V1.nVars) and (Instr.type==Vars.DevType.VarUpdate)) and not(Instr.nvalue==V1.nVars*self.N):
+             logging.error("Wrong size of value")
+             return False
+        if V1.Vars[0].type==Vars.DevType.Internal:
+          Instr.dev.OPCW.get_data_value().Value.Value=Instr.value
+          logging.debug("Update internal variable")
+          return
+#        if V1.Vars[0].type==Vars.DevType.Internal: return;
+        Step=V1.nVars
+        Mask=(Vars.RCU_mask if Step==1 else Vars.Ant_mask)
+        Mask=Mask.OPCW.get_data_value().Value.Value
+        value1=Instr.value if V1.OPCR is None else V1.OPCR.get_data_value().Value.Value
+        if (len(value1)==V1.nVars) and (self.N>1):  value1=(value1*self.N);
+        if Instr.type==Vars.DevType.Var:
+          logging.info(str(('** Set Var:',V1.name,value1)))
+          for RCUi in range(self.N):
+            for Vari in range(Step):
+                if not(Mask[RCUi*Step+Vari]): continue
+                self.SetVarValue(RCUi,V1.Vars[Vari],Instr.value[RCUi*Step+Vari:RCUi*Step+Vari+1])
+                value2=value1[RCUi*Step+Vari:RCUi*Step+Vari+1]
+                self.GetVarValue(RCUi,V1.Vars[Vari],value2)
+                value1[RCUi*Step+Vari:RCUi*Step+Vari+1]=value2
+          if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=value1
+
+        elif Instr.type==Vars.DevType.VarUpdate:
+          self.GetVarValueAll(V1,value1)
+          if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=value1
+#          V1.OPCR.get_data_value().Value.Value=value1
+
+        logging.info(str(('** Readback:',V1.name,value1)))
+
+    def GetVarValue(self,RCUi,var,value):
+            logging.info(str(("RCU1 Get ",RCUi,var,value)))
+            if var.type==Vars.DevType.I2C:
+                self.SWcallback(1<<var.MPaddr.Switch[RCUi])
+                self.GetI2C(RCUi,var.devreg,var.width,var.bitoffset,value)
+            elif var.type==Vars.DevType.I2Cbb:
+                logging.error("I2Cbb Implemented")
+            elif var.type==Vars.DevType.SPIbb:
+                logging.error("SPIbb Implemented")
+            else:
+                logging.error("Not Implemented")
+
+    def GetVarValueAll(self,V1,value1):
+            mask=0;
+            for RCUi in range(self.N):
+                mask+=1<<V1.Vars[0].MPaddr.Switch[RCUi]
+            Step=V1.nVars
+            if V1.Vars[0].type==Vars.DevType.I2C:
+              for Vari in range(Step):  
+                DevReg=V1.Vars[Vari].devreg
+                self.SWcallback(mask)
+                self.SetI2CAddr(self,DevReg)
+                if DevReg.Register_R>255: self.I2Ccallback(DevReg.Addr,[250],read=3) #Wait for ADC
+                for RCUi in range(self.N):
+                    self.SWcallback(1<<V1.Vars[0].MPaddr.Switch[RCUi])
+                    value2=value1[RCUi*Step+Vari:RCUi*Step+Vari+1]
+                    var=V1.Vars[Vari]
+                    self.GetI2Cnoreg(RCUi,var.devreg,var.width,var.bitoffset,value2)
+                    if (var.Scale!=0): value2[0]*=var.Scale;
+                    value1[RCUi*Step+Vari:RCUi*Step+Vari+1]=value2
+            elif V1.Vars[0].type==Vars.DevType.SPIbb:
+              self.GetBBValueAll(V1,value1,mask)
+#              logging.info("SPIbb all not implemented yet")
+            else:
+               logging.error("Type not implemented")
+    def GetBBValueAll(self,V1,value1,mask):
+        def SetBit(RCUi,dev,width,bitoffset,value,buffer=False):
+            if not(buffer): self.SWcallback(mask)
+            self.SetI2C(RCUi,dev,width,bitoffset,value,buffer=buffer)
+        def GetBit(RCUixx,dev,width,bitoffset,buffer=False):
+            value=[0 for RCUi in range(self.N)]
+            value2=[0]
+            if buffer: 
+                for RCUi in range(self.N):
+                  self.GetI2Cbuffer(RCUi,dev,width,bitoffset,value2)
+                  value[RCUi]=value2[0]
+                return value
+            self.SWcallback(mask)
+            self.SetI2CAddr(self,dev)
+            for RCUi in range(self.N):
+                self.SWcallback(1<<V1.Vars[0].MPaddr.Switch[RCUi])
+                self.GetI2Cnoreg(RCUi,dev,width,bitoffset,value2)
+                value[RCUi]=value2[0]
+            return value;
+        devs=[V1.Vars[Vari].devreg for Vari in range(V1.nVars)]
+        GetSPIbb2(SetBit,GetBit,0,devs,value1)
+
+
+    def SetVarValue(self,RCUi,var,value):
+            if var.devreg.Register_W==-1: return True; #We can not set it, only read it e.g. temperature
+            logging.debug(str(("RCU1 Set ",RCUi,var,value)))
+            if var.type==Vars.DevType.I2C:
+                self.SWcallback(1<<var.MPaddr.Switch[RCUi])
+                self.SetI2C(RCUi,var.devreg,var.width,var.bitoffset,value)
+            elif var.type==Vars.DevType.I2Cbb:
+                logging.error("I2Cbb Implemented")
+            elif var.type==Vars.DevType.SPIbb:
+                logging.error("SPIbb Implemented")
+            else:
+                logging.error("Not Implemented")
+
+    def SetI2C(self,RCUi,dev,width,bitoffset,value,buffer=False):
+        if dev.store>0:
+            previous=self.previous[RCUi,dev.store-1];
+            value[0]=ApplyMask(value[0],width,bitoffset,previous);
+            self.previous[RCUi,dev.store-1]=value[0]
+#            logging.debug(str(('masked to',value)))
+#            logging.debug(str(("Store buffer",RCUi,dev.store,value[0])))
+        if buffer: return True;
+        return self.I2Ccallback(dev.Addr,value,reg=dev.Register_W)
+
+    def GetI2Cbuffer(self,RCUi,dev,width,bitoffset,value):
+        if not(dev.store>0): return False;
+        value[0]=self.previous[RCUi,dev.store-1];
+#        logging.debug(str(("GetI2Cbuffer",RCUi,dev.store,value)))
+        l1=int(np.floor((width+bitoffset+7)/8))
+        if (width!=l1*8) or (bitoffset>0): 
+            value[0]=UnMask(value[0],width,bitoffset)      
+        return True
+
+    def GetI2C(self,RCUi,dev,width,bitoffset,value):
+#        if dev.store>0:
+#            value[0]=self.previous[RCUi,dev.store-1]
+#        return True          
+        l1=int(np.floor((width+bitoffset+7)/8))
+#        print(width,bitoffset,l1)
+        makesinglevalue=((len(value)==1) and (l1>1));
+        if makesinglevalue: value2=[0 for x in range(l1)]
+        else: value2=value
+        reg=dev.Register_R
+        if reg>255: #This is for the monitor ADC
+          if not(self.I2Ccallback(dev.Addr,int2bytes(reg),read=2)): return False;
+          I2Ccallback(Addr,[250],read=3)
+          if not(self.I2Ccallback(dev.Addr,value2,read=1)): return False;
+        else:
+          if not(self.I2Ccallback(dev.Addr,value2,reg=reg,read=1)): return False;
+        if value2[0] is None:  return False
+        if makesinglevalue: value[0]=bytes2int(value2)
+        else: value[:]=value2[:];
+        if dev.store>0:
+            self.previous[RCUi,dev.store-1]=value[0]
+#            logging.debug(str(("Store buffer",RCUi,dev.store,value[0])))
+        if (width!=l1*8) or (bitoffset>0): 
+            value[0]=UnMask(value[0],width,bitoffset)      
+        else: value[0]=value2[0]
+        return True;
+    def GetI2Cbit(self,RCUi,dev,pin):
+           value2=[value]
+           self.I2CGet(RCUi,dev,1,1<<pin,value2)
+           return value2[0]
+
+
+    def SetI2CAddr(self,RCUi,dev):
+        return self.I2Ccallback(dev.Addr,int2bytes(dev.Register_R),read=2)
+
+
+
+    def GetI2Cnoreg(self,RCUi,dev,width,bitoffset,value):
+        l1=int(np.floor((width+bitoffset+7)/8))
+        makesinglevalue=((len(value)==1) and (l1>1));
+        if makesinglevalue: value2=[0 for x in range(l1)]
+        else: value2=value
+        reg=dev.Register_R
+        if not(self.I2Ccallback(dev.Addr,value2,read=1)): return False;
+        if value2[0] is None:  return False
+        if makesinglevalue: value[0]=bytes2int(value2)
+        else: value[:]=value2[:];
+        if dev.store>0:
+            self.previous[RCUi,dev.store-1]=value[0]
+#            logging.debug(str(("Store buffer",RCUi,dev.store,value[0])))
+        if (width!=l1*8) or (bitoffset>0): 
+            value[0]=UnMask(value[0],width,bitoffset)      
+        #else: value[0]=value2[0]
+        return True;
+
+
+
diff --git a/Vars.py b/Vars.py
new file mode 100644
index 0000000000000000000000000000000000000000..28ce0df7ef819a978995f1d672e0c4d9654687d8
--- /dev/null
+++ b/Vars.py
@@ -0,0 +1,156 @@
+from collections import namedtuple
+from recordclass import recordclass
+from enum import Enum
+from HWconf import *
+
+#OPCUA variables
+class RW(Enum):
+    Hidden = 0  #Not an OPC_UA variable
+    ReadOnly = 1  #OPC_variable name_R
+    WriteOnly = 2 #OPC_variable name_RW
+    ReadWrite = 3  #both of above
+
+class datatype(Enum):
+   dInt = 0
+   dfloat = 1
+
+Var2dev=namedtuple("Var2dev","name MPaddr type devreg width bitoffset Scale")
+VarArray=recordclass("VarArray","name nVars Vars RW type OPCR OPCW") #OPCR and OPCW linked at runtime
+RCU_att1= Var2dev("RCU_att1" ,RCU_MPaddr,DevType.I2C,RCU_IO1_OUT1,5 ,0,1)
+RCU_att2= Var2dev("RCU_att2" ,RCU_MPaddr,DevType.I2C,RCU_IO1_OUT2,5 ,0,1)
+RCU_att3= Var2dev("RCU_att3" ,RCU_MPaddr,DevType.I2C,RCU_IO2_OUT1,5 ,0,1)
+RCU_band1=Var2dev("RCU_band1",RCU_MPaddr,DevType.I2C,RCU_IO2_OUT2,2 ,0,1)
+RCU_band2=Var2dev("RCU_band2",RCU_MPaddr,DevType.I2C,RCU_IO2_OUT2,2 ,2,1)
+RCU_band3=Var2dev("RCU_band3",RCU_MPaddr,DevType.I2C,RCU_IO2_OUT2,2 ,4,1)
+RCU_led0= Var2dev("RCU_led0" ,RCU_MPaddr,DevType.I2C,RCU_IO2_OUT2,2 ,6,1)
+RCU_pwrd1=Var2dev("RCU_pwrd1",RCU_MPaddr,DevType.I2C,RCU_IO2_OUT1,1 ,6,1)
+RCU_temp1=Var2dev("RCU_temp1",RCU_MPaddr,DevType.I2C,RCU_AN_Temp ,23,0,4.21e-3)
+
+dummy=Var2dev("Dummy",RCU_MPaddr,DevType.Internal,None,8,0,1)
+
+
+Ant_mask=VarArray("Ant_mask"       ,3,[dummy,dummy,dummy]            ,RW.WriteOnly,datatype.dInt,None,None)
+RCU_att =VarArray("RCU_attenuator" ,3,[RCU_att1 ,RCU_att2 ,RCU_att3] ,RW.ReadWrite,datatype.dInt,None,None)
+RCU_band=VarArray("RCU_band"       ,3,[RCU_band1,RCU_band2,RCU_band3],RW.ReadWrite,datatype.dInt,None,None)
+
+RCU_mask=VarArray("RCU_mask"       ,1,[dummy]    ,RW.WriteOnly,datatype.dInt  ,None,None)
+RCU_temp=VarArray("RCU_temperature",1,[RCU_temp1],RW.ReadOnly ,datatype.dfloat,None,None)
+RCU_pwrd=VarArray("RCU_Pwr_dig"    ,1,[RCU_pwrd1],RW.ReadOnly ,datatype.dInt  ,None,None)
+RCU_LED =VarArray("RCU_LED0"       ,1,[RCU_led0] ,RW.ReadWrite,datatype.dInt  ,None,None)
+
+RCU_Dth3_freq=Var2dev("RCU_dth1_freq",RCU_MPaddr,DevType.I2Cbb,RCU_Dth3_Freq,32,0,1e-6)
+RCU_Dth2_freq=Var2dev("RCU_dth1_freq",RCU_MPaddr,DevType.I2Cbb,RCU_Dth2_Freq,32,0,1e-6)
+RCU_Dth1_freq=Var2dev("RCU_dth1_freq",RCU_MPaddr,DevType.I2Cbb,RCU_Dth1_Freq,32,0,1e-6)
+RCU_dth_freq=VarArray("RCU_dither_freq",3,[RCU_Dth1_freq,RCU_Dth2_freq,RCU_Dth3_freq],RW.ReadWrite,datatype.dfloat,None,None)
+
+RCU_ADC1_lock=Var2dev("RCU_ADC1_lock",RCU_MPaddr,DevType.SPIbb,RCU_ADC1_PLL_stat,8,0,1)
+RCU_ADC2_lock=Var2dev("RCU_ADC2_lock",RCU_MPaddr,DevType.SPIbb,RCU_ADC2_PLL_stat,8,0,1)
+RCU_ADC3_lock=Var2dev("RCU_ADC3_lock",RCU_MPaddr,DevType.SPIbb,RCU_ADC3_PLL_stat,8,0,1)
+RCU_ADC_lock=VarArray("RCU_ADC_lock",3,[RCU_ADC1_lock,RCU_ADC2_lock,RCU_ADC3_lock],RW.ReadOnly,datatype.dInt,None,None)
+
+RCU_ADC1_SYNC=Var2dev("RCU_ADC1_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC1_SYNC_ctr,8,0,1)
+RCU_ADC2_SYNC=Var2dev("RCU_ADC2_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC2_SYNC_ctr,8,0,1)
+RCU_ADC3_SYNC=Var2dev("RCU_ADC3_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC3_SYNC_ctr,8,0,1)
+RCU_ADC_SYNC=VarArray("RCU_ADC_SYNC",3,[RCU_ADC1_SYNC,RCU_ADC2_SYNC,RCU_ADC3_SYNC],RW.ReadOnly,datatype.dInt,None,None)
+
+RCU_ADC1_JESD=Var2dev("RCU_ADC1_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC1_JESD_ctr,8,0,1)
+RCU_ADC2_JESD=Var2dev("RCU_ADC2_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC2_JESD_ctr,8,0,1)
+RCU_ADC3_JESD=Var2dev("RCU_ADC3_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC3_JESD_ctr,8,0,1)
+RCU_ADC_JESD=VarArray("RCU_ADC_JESD",3,[RCU_ADC1_JESD,RCU_ADC2_JESD,RCU_ADC3_JESD],RW.ReadOnly,datatype.dInt,None,None)
+
+RCU_ADC1_CML=Var2dev("RCU_ADC1_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC1_CML_level,8,0,1)
+RCU_ADC2_CML=Var2dev("RCU_ADC2_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC2_CML_level,8,0,1)
+RCU_ADC3_CML=Var2dev("RCU_ADC3_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC3_CML_level,8,0,1)
+RCU_ADC_CML=VarArray("RCU_ADC_CML",3,[RCU_ADC1_CML,RCU_ADC2_CML,RCU_ADC3_CML],RW.ReadOnly,datatype.dInt,None,None)
+
+
+RCU_IO1_1= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO1_OUT1,8,0,1)
+RCU_IO1_2= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO1_OUT2,8,0,1)
+#RCU_IO1_3= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO1_CONF1,8,0,1)
+#RCU_IO1_4= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO1_CONF2,8,0,1)
+#RCU_IO1=VarArray("RCU_IO1",3,[RCU_IO1_1,RCU_IO1_2,RCU_IO1_3],RW.ReadOnly,datatype.dInt,None,None)
+RCU_IO2_1= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO2_OUT1,8,0,1)
+RCU_IO2_2= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO2_OUT2,8,0,1)
+#RCU_IO2_3= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO2_CONF1,8,0,1)
+#RCU_IO2_4= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO2_CONF2,8,0,1)
+#RCU_IO2=VarArray("RCU_IO2",3,[RCU_IO2_1,RCU_IO2_2,RCU_IO2_3],RW.ReadOnly,datatype.dInt,None,None)
+RCU_IO3_1= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO3_OUT1,8,0,1)
+RCU_IO3_2= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO3_OUT2,8,0,1)
+#RCU_IO3_3= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO3_CONF1,8,0,1)
+#RCU_IO3_4= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO3_CONF2,8,0,1)
+#RCU_IO3=VarArray("RCU_IO3",3,[RCU_IO3_1,RCU_IO3_2,RCU_IO3_3],RW.ReadOnly,datatype.dInt,None,None)
+
+RCU_OUT1=VarArray("RCU_OUT1",3,[RCU_IO1_1,RCU_IO2_1,RCU_IO3_1],RW.ReadOnly,datatype.dInt,None,None)
+RCU_OUT2=VarArray("RCU_OUT2",3,[RCU_IO1_2,RCU_IO2_2,RCU_IO3_2],RW.ReadOnly,datatype.dInt,None,None)
+#RCU_CNF1=VarArray("RCU_CONF1",3,[RCU_IO1_3,RCU_IO2_3,RCU_IO3_3],RW.ReadOnly,datatype.dInt,None,None)
+#RCU_CNF2=VarArray("RCU_CONF2",3,[RCU_IO1_4,RCU_IO2_4,RCU_IO3_4],RW.ReadOnly,datatype.dInt,None,None)
+
+
+
+OPC_devvars=[RCU_mask,Ant_mask,RCU_att,RCU_band,RCU_temp,RCU_pwrd,RCU_LED,RCU_ADC_lock,RCU_ADC_SYNC,RCU_ADC_JESD,RCU_ADC_CML,RCU_OUT1,RCU_OUT2]#,RCU_CNF1,RCU_CNF2]
+
+
+
+
+
+
+Instr=namedtuple("DevInstr","type dev nvalue value")
+
+#OPCUA methods
+Instrs=namedtuple("Instr","name ninstr instr")
+
+RCU_init=Instrs("ReadRegisters",2,[
+   Instr(DevType.VarUpdate,RCU_OUT1,3,[0,0,0]),
+   Instr(DevType.VarUpdate,RCU_OUT2,3,[0,0,0])
+])
+
+ADC_on=Instrs("ADC_on",15,[
+   Instr(DevType.SPIbb,RCU_ADC1_JESD_ctr,1,[14]),
+   Instr(DevType.SPIbb,RCU_ADC1_CML_level,1,[0x7]),
+   Instr(DevType.SPIbb,RCU_ADC1_SYNC_ctr,1,[1]),
+   Instr(DevType.SPIbb,RCU_ADC1_update,1,[1]),
+   Instr(DevType.SPIbb,RCU_ADC2_JESD_ctr,1,[14]),
+   Instr(DevType.SPIbb,RCU_ADC2_CML_level,1,[0x7]),
+   Instr(DevType.SPIbb,RCU_ADC2_SYNC_ctr,1,[1]),
+   Instr(DevType.SPIbb,RCU_ADC2_update,1,[1]),
+   Instr(DevType.SPIbb,RCU_ADC3_JESD_ctr,1,[14]),
+   Instr(DevType.SPIbb,RCU_ADC3_CML_level,1,[0x7]),
+   Instr(DevType.SPIbb,RCU_ADC3_SYNC_ctr,1,[1]),
+   Instr(DevType.SPIbb,RCU_ADC3_update,1,[1]),
+#   Instr(DevType.VarUpdate,RCU_ADC_lock,3,[0,0,0]),
+   Instr(DevType.VarUpdate,RCU_ADC_SYNC,3,[0,0,0]),
+   Instr(DevType.VarUpdate,RCU_ADC_JESD,3,[0,0,0]),
+   Instr(DevType.VarUpdate,RCU_ADC_CML,3,[0,0,0])
+])
+
+RCU_on=Instrs("RCU_on",12,[
+   Instr(DevType.I2C,RCU_IO2_CONF1,1,[0]),
+   Instr(DevType.I2C,RCU_IO2_CONF2,1,[0]),
+   Instr(DevType.I2C,RCU_IO3_CONF1,1,[0]),
+   Instr(DevType.I2C,RCU_IO3_CONF2,1,[0]),
+   Instr(DevType.I2C,RCU_IO1_CONF1,1,[0]),
+   Instr(DevType.I2C,RCU_IO1_CONF2,1,[0]),
+   Instr(DevType.I2C,RCU_IO2_OUT1,1,[0x4A]),
+   Instr(DevType.I2C,RCU_IO2_OUT2,1,[0x55]),
+   Instr(DevType.I2C,RCU_IO3_OUT1,1,[0x15]),
+   Instr(DevType.I2C,RCU_IO3_OUT2,1,[0x47]),
+   Instr(DevType.I2C,RCU_IO1_OUT1,1,[0xCA]),
+   Instr(DevType.I2C,RCU_IO1_OUT2,1,[0xCA]),
+#   Instr(DevType.VarUpdate,RCU_att,3,[0,0,0]),
+   Instr(DevType.VarUpdate,RCU_pwrd,1,[0]),
+   Instr(DevType.VarUpdate,RCU_OUT1,3,[0,0,0]),
+   Instr(DevType.VarUpdate,RCU_OUT2,3,[0,0,0]),
+#   Instr(DevType.Instr,ADC1_on,0,[]),
+#   Instr(DevType.Instr,ADC2_on,0,[]),
+#   Instr(DevType.Instr,ADC3_on,0,[])
+#   Instr(DevType.VarUpdate,RCU_ADC_lock,3,[0,0,0])
+])
+
+RCU_off=Instrs("RCU_off",1,[
+#   Instr(DevType.Var,RCU_mask,4,[1,1,1,1]),
+   Instr(DevType.Var,RCU_pwrd,4,[0,0,0,0]),
+#   Instr(DevType.Var,RCU_mask,4,[0,0,0,0])
+])
+
+
+OPC_methods=[RCU_on,RCU_off,ADC_on]
diff --git a/main.py b/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..cf7efd79fc95290170f48111d2ae6fe6d73f302d
--- /dev/null
+++ b/main.py
@@ -0,0 +1,123 @@
+import opcuaserv
+try:
+ import queue
+except ImportError:
+ import Queue as queue;
+import RCU
+import I2Cswitch1
+import threading
+import signal
+import sys
+import time
+import Vars
+import logging
+import argparse
+
+parser = argparse.ArgumentParser()
+parser.add_argument("-s", "--simulator", help="Do not connect to I2c, but simulate behaviour.", action="store_true")
+parser.add_argument("-p", "--port", help="Port number to listen on [%(default)s].", type=int, default=4842)
+parser.add_argument("-l", "--loglevel", help="Log level [%(default)s].", type=str, choices=["DEBUG","INFO","WARNING","ERROR"], default="INFO")
+args = parser.parse_args()
+
+# set log level
+loglevel_nr = getattr(logging, args.loglevel.upper(), None)
+if not isinstance(loglevel_nr, int):
+    raise ValueError('Invalid log level: %s' % args.loglevel)
+#logging.basicConfig(level=loglevel_nr, format="%(asctime)s [%(levelname)8s] %(message)s")
+
+logging.basicConfig(level=loglevel_nr,format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s')
+if args.simulator:
+    import I2C_dummy as I2C
+else:
+    import I2C
+
+#Queue used to pass instructions from opc-ua server to RCU
+Q1=queue.Queue()
+
+#Setup OPCUA server (running in its own thread)
+opcuaserv.EventPipes.append(Q1)
+opcuaserv.InitServer(port=args.port)
+logging.info("OPC-UA Server started")   
+
+
+SW1=I2Cswitch1.I2Cswitch1(I2C.I2C1server)
+
+RCU=RCU.RCU1(4,I2C.I2C1server,SW1.SetChannel)
+
+#Vars.RCU_mask.OPCW.get_data_value().Value.Value=[1,1,0,0]
+#Vars.Ant_mask.OPCW.get_data_value().Value.Value=[1,1,0,0,0,0,0,0,0,0,1,0]
+
+Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_init,0,[])  #Read the current status of GPIO IOs
+RCU.SetVar(Inst1)
+
+#Inst1=Vars.Instr(Vars.DevType.Var,Vars.RCU_att,12,[0,1,2,3,4,5,6,7,8,9,11])
+#RCU.SetVar(Inst1)
+
+#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_off,0,[])
+#RCU.SetVar(Inst1)
+
+#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_on,0,[])
+#RCU.SetVar(Inst1)
+
+#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.ADC1_on,0,[])
+#RCU.SetVar(Inst1)
+
+#print(Vars.RCU)
+logging.debug(str(("I2C bytes=",I2C.I2Ccounter)))
+
+if False:
+  opcuaserv.server.stop()
+  exit()
+
+def RCUthread(Q1,RCU):
+    while True:
+      item = Q1.get()
+      if item is None: break;
+      RCU.SetVar(item)
+    logging.info("End RCU thread")
+
+RCUthread1 = threading.Thread(target=RCUthread, args=(Q1,RCU))
+RCUthread1.start()
+
+RunTimer=True;
+def TimerThread(Q1,RCU):
+    V1=opcuaserv.AddVar("RCU_monitor_rate",10)
+    cnt=0;#Count second ticks
+    while RunTimer:
+       time.sleep(1)
+       T1=V1.get_data_value().Value.Value
+       if T1==0:
+           continue;
+       cnt+=1;
+       if cnt>=T1:
+         if Q1.qsize()>3: continue;
+         cnt=0;
+         logging.debug(str(("I2C bytes=",I2C.I2Ccounter," Qlength=",Q1.qsize())))
+         Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_temp,4,[0]*4)
+         Q1.put(Inst1)
+         Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_ADC_lock,12,[0]*12)
+         Q1.put(Inst1)
+
+    logging.info("End Timer thread")
+
+Timerthread1 = threading.Thread(target=TimerThread, args=(Q1,RCU))
+Timerthread1.start()
+
+# on SIGINT: stop thread(s) by adding None to instruction queue(s)
+def signal_handler(sig, frame):
+    logging.info('Stop RCU thread')
+    Q1.put(None)
+    logging.info('Stop timer thread')
+    global RunTimer; 
+    RunTimer=False
+signal.signal(signal.SIGINT, signal_handler)
+
+try:
+#Do nothing.
+ while RunTimer:
+    time.sleep(1)
+finally:
+        logging.info("Stop OPC-UA server")
+        opcuaserv.server.stop()
+        RCUthread1.join()
+        Timerthread1.join()
diff --git a/opcuaserv.py b/opcuaserv.py
index be0d9a9dfd12edbf2184c71f29d760470864959d..94d685e7ab2a9e81ecb97a72331828327a0634dc 100644
--- a/opcuaserv.py
+++ b/opcuaserv.py
@@ -5,33 +5,61 @@ sys.path.insert(0, "..")
 import time
 from opcua import ua, Server
 from datetime import datetime;
-import argparse
 import logging
+import Vars
+#import HWconf
 
-parser = argparse.ArgumentParser()
-parser.add_argument("-s", "--simulator", help="Do not connect to I2c, but simulate behaviour.", action="store_true")
-parser.add_argument("--no-lib-hack", help="Do not require a hacked opcua library. Breaks behaviour.", action="store_true")
-parser.add_argument("-p", "--port", help="Port number to listen on [%(default)s].", type=int, default=4842)
-parser.add_argument("-l", "--loglevel", help="Log level [%(default)s].", type=str, choices=["DEBUG","INFO","WARNING","ERROR"], default="DEBUG")
-args = parser.parse_args()
+Vars_R={}
+Vars_W={}
+EventPipes=[]
+running=False
+class SubHandler(object):
+    """
+    Subscription Handler. To receive events from server for a subscription
+    """
+    def datachange_notification(self, node, val, data):
+#        print("Python: New data change event", node, val,data)
+        if not(running): return
+        vname,myvar,VarD=Vars_W[node.nodeid.Identifier]
+#        val=(val if isinstance(val, list) else [val] )
+        logging.info(str(("Datachange callback",vname,val)))
+#        myvar2.Value.Value=val
+#        myvar2.SourceTimestamp = datetime.utcnow()
+
+        Inst=Vars.Instr(Vars.DevType.Var,VarD,len(val),val)
+        EventPipes[0].put(Inst)
+ #       P1.SetVarValue(vname,val)
+        #readback
+#        if True:
+#        print(Vars_R,Vars_R.values())
+#        for vname2,myvar2,oldvalue in Vars_R.values():
+#            if vname2==vname:
+#              res=P1.GetVarValue(vname,val)
+#              print("Read callback",vname,": Result:",res,oldvalue)
+#              if res:
+
+    def event_notification(self, event):
+        logging.info(str(("Python: New event", event)))
+
+
+def CallMethod(ObjectID,instrs):
+        logging.info(str(("Callmethod",ObjectID,instrs)))
+        Inst1=Vars.Instr(Vars.DevType.Instr,instrs,0,[])
+        EventPipes[0].put(Inst1)
 
-# set log level
-loglevel_nr = getattr(logging, args.loglevel.upper(), None)
-if not isinstance(loglevel_nr, int):
-    raise ValueError('Invalid log level: %s' % args.loglevel)
-logging.basicConfig(level=loglevel_nr, format="%(asctime)s [%(levelname)8s] %(message)s")
+#        P1.CallMethod(name,None)
 
-if args.simulator:
-    import pypcc_test as pypcc
-else:
-    import pypcc
+def AddVar(name,value):
+    myvar2 = PCCobj.add_variable(idx, name, value)
+    myvar2.set_writable()
+    return myvar2
 
-P1=pypcc.pypcc("LTS_pypcc.yaml")
+def InitServer(port=4840):
 
-if True:
 # setup our server
+    global server,running,PCCobj,idx;
     server = Server()
-    server.set_endpoint("opc.tcp://0.0.0.0:{}/PCC/".format(args.port))
+    server.set_endpoint("opc.tcp://0.0.0.0:{}/PCC/".format(port))
 
     idx = server.register_namespace("http://lofar.eu")
 #    uri = "http://examples.freeopcua.github.io"
@@ -41,140 +69,66 @@ if True:
 
     # populating our address space
     PCCobj = objects.add_object(idx, "PCC")
+#    self.PCCobj=PCCobj
     
-    #    myvar = myobj.add_variable(idx, "MyVariable", 6.7)
-#    myvar.set_writable()    # Set MyVariable to be writable by clients
-
     # starting!
-
-#Vars={}
-#Vars[1]='123'
-#logging.info("%s", Vars)
-#exit()
-def ValCallback(nodeid,force=False):
-    vname,myvar,oldvalue=Vars_R[nodeid.Identifier]
-#    logging.info("Value callback %s",vname)
-#    vname=vname[vname.find('_')+1:]
-#    logging.info("RCU variable: %s=%s",vname,oldvalue)
-#    X=RCU1.Getvar2(vname)
-#    if not(running): 
-    if False: 
-        myvar.Value.Value=(oldvalue[0] if len(oldvalue)==1 else oldvalue)
-        myvar.SourceTimestamp = datetime.utcnow()
-        return myvar
-    timenow=datetime.utcnow()
-    timediff=(timenow-myvar.SourceTimestamp).total_seconds()
-#    logging.info("%s",timediff)
-    if not(force) and timediff<90: return myvar;
-    res=P1.GetVarValue(vname,oldvalue)
-    logging.info("Read callback %s: Result: %s Value: %s",vname,res,oldvalue)
-    if res:
-        myvar.Value.Value=(oldvalue[0] if len(oldvalue)==1 else oldvalue)
-        myvar.SourceTimestamp = datetime.utcnow()
-#        Vars_R[nodeid.Identifier][3]=oldvalue
-    return myvar
-
-
-
-class SubHandler(object):
-    """
-    Subscription Handler. To receive events from server for a subscription
-    """
-
-    def datachange_notification(self, node, val, data):
-        #        logging.info("Python: New data change event: %s %s %s", node, val,data)
-        if not(running): return
-        vname,myvar=Vars_W[node.nodeid.Identifier]
-        val=(val if isinstance(val, list) else [val] )
-        logging.info("Write callback %s=%s",vname,val)
-        P1.SetVarValue(vname,val)
-        #readback
-#        if True:
-#        logging.info(Vars_R,Vars_R.values())
-        for vname2,myvar2,oldvalue in Vars_R.values():
-            if vname2==vname:
-              if args.simulator:
-                res=True
-                logging.info("Simulating fallthrough _RW->_R for",vname,": Result:",res,oldvalue)
-              else:
-                res=P1.GetVarValue(vname,val)
-                logging.info("Read callback",vname,": Result:",res,oldvalue)
-              if res:
-                myvar2.Value.Value=(val[0] if len(val)==1 else val)
-                myvar2.SourceTimestamp = datetime.utcnow()
-
-
-    def event_notification(self, event):
-        logging.debug("Python: New event %s", event)
-
-
-def CallMethod(ObjectID,name):
-        logging.debug("Callmethod %s",name)
-        P1.CallMethod(name,None)
-
-
-
-#P1.RunMethod("RCU_on",None)
-#P1.SetVarValue("Band1",3)
-Vars_R={}
-Vars_W={}
-def AddVar(name,dtype=0,RW=0,cnt=1):
-   if dtype==1:
-          varvalue2=([0.0] if cnt<=1 else cnt*[0.0])
-   else:
-          varvalue2=([0] if cnt<=1 else cnt*[0])
-   if RW in [1,3]:
-        vname=name+"_R";
-        if dtype==1:
-            myvar = (PCCobj.add_variable(idx, vname, 0.0) if cnt<=1 else PCCobj.add_variable(idx, vname, cnt*[0.0]))
-        else:
-            myvar = (PCCobj.add_variable(idx, vname, 0)   if cnt<=1 else PCCobj.add_variable(idx, vname, cnt*[0]))
-        logging.info("Variable added: %s",vname)
-        Vars_R[myvar.nodeid.Identifier]=[name,myvar.get_data_value(),varvalue2]
-        ValCallback(myvar.nodeid,force=True)
-#        logging.info("%s",myvar.get_value())
-        if not args.no_lib_hack:
-            server.set_attribute_callback(myvar.nodeid, ValCallback)
+    logging.info("Start server");
+    server.start()
+    handler = SubHandler()
+    sub = server.create_subscription(500, handler)
+    running=False;
+    logging.info("Add variables:")
+#P1.GetVarNames("",AddVar);
+
+    for v in Vars.OPC_devvars:
+#  print(v)
+        dim=v.Vars[0].MPaddr.nI2C*v.Vars[0].MPaddr.nSwitch*v.nVars
+        #print(v.name,dim)
+        varvalue2=(dim*[0.0] if v.type==Vars.datatype.dfloat else dim*[0])
+        if v.RW in [Vars.RW.ReadOnly,Vars.RW.ReadWrite]:
+            vname=v.name+"_R";
+            myvar = PCCobj.add_variable(idx, vname, varvalue2)
+            logging.info(str(("Variable added: ",vname,dim)))
+            Vars_R[myvar.nodeid.Identifier]=[v.name,myvar.get_data_value(),varvalue2,v]
+            v.OPCR=myvar
+
+            #Inst1=Vars.Instr(Vars.DevType.Var,Vars.RCU_att,12,[0,1,2,3,4,5,6,7,8,9,11])
+            #RCU.SetVar(Inst1)
+            Inst=Vars.Instr(Vars.DevType.VarUpdate,v,dim,varvalue2)
+            EventPipes[0].put(Inst)
+
+#        ValCallback(myvar.nodeid,force=True)
+#        print(myvar.get_value())
+#        server.set_attribute_callback(myvar.nodeid, ValCallback)
 #        varvalue=myvar.get_data_value().Value
 #        Vars_R[myvar.nodeid.Identifier][2]=varvalue
-#        logging.info("%s %s",varvalue2,varvalue)
-
-   if RW in [2,3]:
-        vname=name+"_RW";
-        logging.info("Variable added: %s",vname)#,'=',varvalue2)
-        myvar2 = PCCobj.add_variable(idx, vname, (varvalue2[0] if len(varvalue2)==1 else varvalue2))
-        myvar2.set_writable()
-        Vars_W[myvar2.nodeid.Identifier]=[name,myvar2.get_data_value()]
+#        print(varvalue2,varvalue)
+        if v.RW in [Vars.RW.WriteOnly,Vars.RW.ReadWrite]:
+            vname=v.name+"_RW";
+            logging.info(str(("Variable added: ",vname)))#,'=',varvalue2)
+            myvar2 = PCCobj.add_variable(idx, vname, varvalue2)
+            myvar2.set_writable()
+            v.OPCW=myvar2
+            Vars_W[myvar2.nodeid.Identifier]=[v.name,myvar2.get_data_value(),v]
         handle = sub.subscribe_data_change(myvar2)
 
 
-def AddMethod(name):
-        vname=name;
-        myvar = PCCobj.add_method(idx, vname, lambda ObjectId : CallMethod(ObjectId,name), [],[] )
-        logging.info("AddMethod: %s",vname)
+    for v in Vars.OPC_methods:
+        vname=v.name;
+        myvar = PCCobj.add_method(idx, vname, lambda ObjectId,inst=v : CallMethod(ObjectId,inst), [],[] )
+        logging.info(str(("AddMethod:",vname)))
 
-logging.info("Start server");
-server.start()
-handler = SubHandler()
-sub = server.create_subscription(500, handler)
-running=False;
-logging.info("Add variables:")
-P1.GetVarNames("",AddVar);
 
-logging.info("Add modes:")
-P1.GetMethodNames("",AddMethod);
+    time.sleep(1)
+    running=True
+    return Vars_R,Vars_W
+
+#exit()
+
+#print("Add modes:")
+#P1.GetMethodNames("",AddMethod);
 
-time.sleep(1)
-running=True;
 
-logging.info("Server started")   
-    
-try:
-    while True:
-        time.sleep(1)
-finally:
-        logging.info("Stop server");
-        server.stop()
 
 
 
@@ -198,16 +152,16 @@ finally:
 #RCU.Setvar2('Power_Ant1',[0])
 
 
-#logging.info(RCU.Getvar2('Amp_Gain0'))
+#print(RCU.Getvar2('Amp_Gain0'))
 
 
-#logging.info(RCU.Getvar2('ID'))
+#print(RCU.Getvar2('ID'))
 
 
-#logging.info(RCU.Getvar2('ADC_lock1'))
+#print(RCU.Getvar2('ADC_lock1'))
 
 
-#logging.info(RCU.Getvar2('HBA_DelayX1',element=1))
+#print(RCU.Getvar2('HBA_DelayX1',element=1))
 
 
 
diff --git a/spibitbang1.py b/spibitbang1.py
new file mode 100644
index 0000000000000000000000000000000000000000..14541d75b70c1961a206a5c39533afccccec0d6e
--- /dev/null
+++ b/spibitbang1.py
@@ -0,0 +1,138 @@
+from enum import Enum
+import logging
+import numpy as np
+
+class SPIBB_pins(Enum):
+    CLK = 0  
+    SDIO = 1  
+    SDIOdir = 2 
+    CS = 3  
+
+def SetSPIbb(SetI2C,RCUi,dev,value):
+        ADC_address=dev.Register_W
+        CSdev=dev.Addr.devs[SPIBB_pins.CS.value]
+        CSpin=dev.Addr.pins[SPIBB_pins.CS.value]
+        SDOdev=dev.Addr.devs[SPIBB_pins.SDIO.value]
+        SDOpin=dev.Addr.pins[SPIBB_pins.SDIO.value]
+        CLKdev=dev.Addr.devs[SPIBB_pins.CLK.value]
+        CLKpin=dev.Addr.pins[SPIBB_pins.CLK.value]
+
+        logging.info(str(("SPIbb set",ADC_address,value)))
+
+        ADC_bytes = 0x00
+        ADC_rw    = 0x00 # 0 for write, 1 for read
+        data2 = ( ADC_rw << 23 ) + ( ADC_bytes << 21 ) + ( ADC_address << 8 ) + value[0]
+          
+        bit_array = "{0:{fill}24b}".format(data2, fill='0')
+      #    print(bit_array)
+        SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable
+        for bit in bit_array:
+              SetI2C(RCUi,SDOdev,1,SDOpin,[int(bit)]) 
+              SetI2C(RCUi,CLKdev,1,CLKpin,[1]) 
+              SetI2C(RCUi,CLKdev,1,CLKpin,[0]) 
+        SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable
+        SetI2C(RCUi,SDOdev,1,SDOpin,[1]) #high when finished
+        return True;
+
+def GetSPIbb(SetI2C,GetI2C,RCUi,dev,value):
+        ADC_reg_address=dev.Register_R
+        CSdev=dev.Addr.devs[Vars.SPIBB_pins.CS.value]
+        CSpin=dev.Addr.pins[Vars.SPIBB_pins.CS.value]
+        SDOdev=dev.Addr.devs[Vars.SPIBB_pins.SDIO.value]
+        SDOpin=dev.Addr.pins[Vars.SPIBB_pins.SDIO.value]
+        CLKdev=dev.Addr.devs[Vars.SPIBB_pins.CLK.value]
+        CLKpin=dev.Addr.pins[Vars.SPIBB_pins.CLK.value]
+        SDIOdirdev=dev.Addr.devs[Vars.SPIBB_pins.SDIOdir.value]
+        SDIOdirpin=dev.Addr.pins[Vars.SPIBB_pins.SDIOdir.value]
+
+        logging.info(str(("SPIbb get",ADC_reg_address)))
+          
+        ADC_bytes = 0x00
+        ADC_rw    = 0x01 # 0 for write, 1 for read
+        
+        data = ( ADC_rw << 15) + ( ADC_bytes << 13 ) + ADC_reg_address
+          
+        SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable
+
+
+        bit_array = "{0:{fill}16b}".format(data, fill='0')
+        for bit in bit_array:
+              SetI2C(RCUi,SDOdev,1,SDOpin,[int(bit)]) 
+              SetI2C(RCUi,CLKdev,1,CLKpin,[1]) 
+              SetI2C(RCUi,CLKdev,1,CLKpin,[0]) 
+
+        SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable
+
+          #    print("read byte")
+        SetI2C(RCUi,SDIOdirdev,1,SDIOdirpin,[1]) #input
+        SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable
+        a=[0]
+        N=len(value)
+        for i in range(N): value[i]=0
+        for cnt in range(8*(ADC_bytes+1)):
+              ret_value=GetI2C(RCUi,SDOdev,1,SDOpin) #enable
+              for i in range(N): value[i]=(value[i]<<1)+ ret_value[i]
+              SetI2C(RCUi,CLKdev,1,CLKpin,[1]) 
+              SetI2C(RCUi,CLKdev,1,CLKpin,[0])  #read after falling edge
+        SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable
+        SetI2C(RCUi,SDIOdirdev,1,SDIOdirpin,[0]) #output
+        return True;
+
+def GetSPIbb2(SetI2C,GetI2C,RCUi,devs,value):
+        ADC_reg_address=devs[0].Register_R
+        def Setbit(pintype,value):
+           for dev in devs:
+             dev1=dev.Addr.devs[pintype.value]
+             pin1=dev.Addr.pins[pintype.value]
+             SetI2C(RCUi,dev1,1,pin1,[value],buffer=True) 
+           SetI2C(RCUi,dev1,1,pin1,[value]) 
+        def Getbit(pintype):
+           retvalue=np.zeros_like(value)
+           step=len(devs)
+           dev1=devs[0].Addr.devs[pintype.value]
+           pin1=devs[0].Addr.pins[pintype.value]
+           retvalue[0::step]=GetI2C(RCUi,dev1,1,pin1)
+           for i,dev in enumerate(devs[1:]):
+             dev1=dev.Addr.devs[pintype.value]
+             pin1=dev.Addr.pins[pintype.value]
+             retvalue[i+1::step]=GetI2C(RCUi,dev1,1,pin1,buffer=True)
+           return retvalue
+           
+        CS=SPIBB_pins.CS
+        SDIO=SPIBB_pins.SDIO
+        CLK=SPIBB_pins.CLK
+        SDIOdir=SPIBB_pins.SDIOdir
+
+        logging.debug(str(("SPIbb get",ADC_reg_address)))
+          
+        ADC_bytes = 0x00
+        ADC_rw    = 0x01 # 0 for write, 1 for read
+        
+        data = ( ADC_rw << 15) + ( ADC_bytes << 13 ) + ADC_reg_address
+          
+        Setbit(CS,0) #enable
+
+        bit_array = "{0:{fill}16b}".format(data, fill='0')
+        logging.debug(str(("SPI TX",bit_array)))
+        for bit in bit_array:
+              Setbit(SDIO,int(bit)) 
+              Setbit(CLK,1) 
+              Setbit(CLK,0) 
+
+        Setbit(CS,1) #disable
+
+          #    print("read byte")
+        Setbit(SDIOdir,1) #input
+        Setbit(CS,0) #enable
+        a=[0]
+        N=len(value)
+        for i in range(N): value[i]=0
+        for cnt in range(8*(ADC_bytes+1)):
+              ret_value=Getbit(SDIO)
+              for i in range(N): value[i]=(value[i]<<1)+ ret_value[i]
+              Setbit(CLK,1) 
+              Setbit(CLK,0)  #read after falling edge
+        Setbit(CS,1) #disable
+        Setbit(SDIO,1)#High when finished 
+        Setbit(SDIOdir,0) #output
+        return True;
\ No newline at end of file
diff --git a/test/test1.py b/test/test1.py
deleted file mode 100644
index ece510b6697587a741c470b62b45b4f744511f44..0000000000000000000000000000000000000000
--- a/test/test1.py
+++ /dev/null
@@ -1,29 +0,0 @@
-import pypcc;
-
-P1=pypcc.pypcc("pypcc.yaml")
-
-def AddMethod(name):
-    print("Method:",name)
-P1.GetMethodNames("",AddMethod);
-
-P1.CallMethod("RCU01_RCU_on",None)
-P1.CallMethod("RCU02_RCU_on",None)
-
-def AddVar(name,dtype=0):
-    print("Var:",name)
-P1.GetVarNames("",AddVar);
-
-
-a=[0]
-print(P1.GetVarValue("RCU01_Band1",a))
-assert(a[0]==1)
-print(P1.GetVarValue("RCU02_Band1",a))
-assert(a[0]==1)
-print(P1.SetVarValue("RCU01_Band1",3))
-print(P1.SetVarValue("RCU02_Band1",0))
-print(P1.GetVarValue("RCU01_Band1",a))
-assert(a[0]==3)
-print(P1.GetVarValue("RCU02_Band1",a))
-assert(a[0]==0)
-
-
diff --git a/test/test2.py b/test/test2.py
deleted file mode 100644
index b780d8ccd71c9334c46a6112a83ab0dc628a9d65..0000000000000000000000000000000000000000
--- a/test/test2.py
+++ /dev/null
@@ -1,116 +0,0 @@
-#import pypcc;
-import pypcc_test as pypcc;
-
-P1=pypcc.pypcc("LTS_pypcc.yaml")
-
-def Getvalue(name):
-  a=[0]
-  P1.GetVarValue("RCU01_"+name,a)
-  print("GET:",name,a[0])
-
-def Setvalue(name,value):
-  P1.SetVarValue("RCU01_"+name,[value])
-  print("SET:",name,value)
-
-
-def AddMethod(name):
-    print("Method:",name)
-P1.GetMethodNames("",AddMethod);
-
-def AddVar(name,dtype=0,RW=3):
-    Types={0:'int',1:'float'}
-    RWs={0:'hidden',1:'RO',2:'WO',3:'RW'}
-    print("Var:",name,Types[dtype],RWs[RW])
-P1.GetVarNames("",AddVar);
-exit()
-#P1.CallMethod("RCU01_RCU_on",None)
-#P1.CallMethod("RCU01_Dither_on",None)
-#P1.CallMethod("RCU02_RCU_on",None)
-exit()
-if False:
-  P1.CallMethod("RCU01_Init_ADCR",None)
-  Getvalue("ADC_lock1")
-
-if False:
- Setvalue("Band1",1)
- Setvalue("Band2",0)
- Setvalue("Band3",1)
- Getvalue("Band1")
- Getvalue("Band2")
- Getvalue("Band3")
-#exit()
-
-if False:
-#  Setvalue("Dth3_Pwr",0)
-#  Setvalue("Dth2_Pwr",0)
-#  Setvalue("Dth3_Pwr",1)
-#  Setvalue("Dth2_Pwr",1)
-  P1.CallMethod("RCU01_Dither1_Setup",None)
-  P1.CallMethod("RCU01_Dither2_Setup",None)
-  P1.CallMethod("RCU01_Dither3_Setup",None)
-
-#  a=[0,0,0,0]
-#  P1.GetVarValue("RCU01_Dth1_FREQ",a)
-#  print("GET:",a[0])
-#  Getvalue("Dither1_Frequency")
-  Setvalue("Dither1_Frequency",101.0)
-  Setvalue("Dither2_Frequency",101.2)
-  Getvalue("Dither1_Frequency")
-  Getvalue("Dither2_Frequency")
-#  Getvalue("Dth1_FREQ")
-
-if False:
-#  a=[0,0,0]
-#  P1.GetVarValue("RCU01_V_x",a)
-#  print("GET:",a[0])
-#  import time
-#  time.sleep(0.2)
-#  Setvalue("V_x",0xC0)
-#  time.sleep(0.2)
-#  a=[0,0,0]
-#  P1.GetVarValue("RCU01_Temp",a)
-#  print("GET:",a[0])
-  Getvalue("Temp")
-#exit()
-if False:
-  P1.CallMethod("RCU01_ADC1_Switch_on",None)
-  Getvalue("ADC1_locked")
-  Getvalue("ADC2_locked")
-  Getvalue("ADC3_locked")
-#Getvalue("ADC_lock3")
-#Getvalue("ADC_lock1")
-#Setvalue("LED0",1)
-#Getvalue("LED0")
-#Setvalue("Band2",1)
-#Getvalue("Band2")
-#Getvalue("LED0")
-exit()
-
-#Setvalue("Dth3_Pwr",1)
-Setvalue("Dth2_Pwr",0)
-Setvalue("Dth2_SDA",0)
-Setvalue("Dth2_SCL",0)
-Setvalue("Dth3_Pwr",0)
-Setvalue("Dth3_SDA",0)
-Setvalue("Dth3_SCL",0)
-
-Setvalue("LED0",2)
-
-Setvalue("Att1",10)
-Setvalue("Att2",10)
-Setvalue("Att3",10)
-
-
-#Setvalue("Dth3_Pwr",1)
-#Setvalue("Dth2_SCL",1)
-
-#assert(a[0]==1)
-#print(P1.SetVarValue("RCU01_Band1",3))
-#print(P1.SetVarValue("RCU02_Band1",0))
-#print(P1.GetVarValue("RCU01_Band1",a))
-#print(a[0])
-#assert(a[0]==3)
-#print(P1.GetVarValue("RCU02_Band1",a))
-#assert(a[0]==0)
-
-
diff --git a/test/test3.py b/test/test3.py
deleted file mode 100644
index d6bdca5b37e9d898a45f90c9581c68b0b9e56185..0000000000000000000000000000000000000000
--- a/test/test3.py
+++ /dev/null
@@ -1,36 +0,0 @@
-import pypcc;
-
-P1=pypcc.pypcc("pypcc.yaml")
-
-def AddMethod(name):
-    print("Method:",name)
-P1.GetMethodNames("",AddMethod);
-
-P1.CallMethod("RCU01_RCU_on",None)
-P1.CallMethod("RCU02_RCU_on",None)
-#a=[0]
-#print(P1.GetVarValue("RCU01_ADC_lock",a))
-#print("ADC lock=",a[0])
-
-
-
-def AddVar(name,dtype=0):
-    print("Var:",name)
-P1.GetVarNames("",AddVar);
-
-#print(P1.SetVarValue("RCU01_LED0",0))
-
-exit()
-a=[0]
-print(P1.GetVarValue("RCU01_Band1",a))
-print(a[0])
-#assert(a[0]==1)
-print(P1.SetVarValue("RCU01_Band1",3))
-#print(P1.SetVarValue("RCU02_Band1",0))
-print(P1.GetVarValue("RCU01_Band1",a))
-print(a[0])
-#assert(a[0]==3)
-#print(P1.GetVarValue("RCU02_Band1",a))
-#assert(a[0]==0)
-
-
diff --git a/test/test_ADCs.py b/test/test_ADCs.py
deleted file mode 100644
index 3be2fa979f976cb867efa14f351deaaeae88914e..0000000000000000000000000000000000000000
--- a/test/test_ADCs.py
+++ /dev/null
@@ -1,47 +0,0 @@
-import pypcc;
-#import pypcc_test as pypcc;
-
-P1=pypcc.pypcc("LTS_pypcc.yaml")
-
-##Print all the visible methods
-def AddMethod(name):
-    print("Method:",name)
-P1.GetMethodNames("",AddMethod);
-
-##Print all the visible variables
-def AddVar(name,dtype=0,RW=3,cnt=1):
-    Types={0:'int',1:'float'}
-    RWs={0:'hidden',1:'RO',2:'WO',3:'RW'}
-    print("Var:",name,Types[dtype],RWs[RW],cnt)
-P1.GetVarNames("",AddVar);
-
-a=[0]
-##Setup ADC RCU1
-P1.CallMethod("RCU01_RCU_off",None)
-P1.CallMethod("RCU01_RCU_on",None)
-#P1.GetVarValue("RCU01_ADC1_locked",a);print(a[0]);
-P1.GetVarValue("RCU01_ADC1_SYNC",a);print(a[0]);
-P1.GetVarValue("RCU01_ADC1_CML",a);print(a[0]);
-P1.GetVarValue("RCU01_ADC1_JESD",a);print(a[0]);
-P1.GetVarValue("RCU01_ADC2_SYNC",a);print(a[0]);
-P1.GetVarValue("RCU01_ADC2_CML",a);print(a[0]);
-P1.GetVarValue("RCU01_ADC2_JESD",a);print(a[0]);
-P1.GetVarValue("RCU01_ADC3_SYNC",a);print(a[0]);
-P1.GetVarValue("RCU01_ADC3_CML",a);print(a[0]);
-P1.GetVarValue("RCU01_ADC3_JESD",a);print(a[0]);
-#P1.GetVarValue("RCU01_ADC1_JESD_control1",a);print(a[0]);
-#P1.GetVarValue("RCU01_ADC1_CML_level",a);print(a[0]);
-#P1.GetVarValue("RCU01_ADC1_locked",a);print(a[0]);
-#P1.GetVarValue("RCU01_ADC1_locked",a);print(a[0]);
-#        - ADC1.SYNC_control: [1]  #Setup ADCs
-#        - ADC1.JESD_control1: [14]  #Setup ADCs
-#        - ADC1.CML_level: [0x7]
-#        - ADC1.Update: [1]       #Needed to update ADC registers
-
-exit()
-##Setup ADC RCU3
-P1.CallMethod("RCU01_RCU_off",None)
-P1.CallMethod("RCU03_RCU_on",None)
-P1.GetVarValue("RCU03_ADC1_locked",a);print(a[0]);
-P1.GetVarValue("RCU03_ADC2_locked",a);print(a[0]);
-P1.GetVarValue("RCU03_ADC3_locked",a);print(a[0]);
diff --git a/test/test_clk.py b/test/test_clk.py
deleted file mode 100644
index da3e84bb7e72045d7ad03530f7438515958298eb..0000000000000000000000000000000000000000
--- a/test/test_clk.py
+++ /dev/null
@@ -1,41 +0,0 @@
-#import pypcc;
-import pypcc_test as pypcc;
-
-P1=pypcc.pypcc("LTS_pypcc.yaml")
-
-def Getvalue(name):
-  a=[0]
-  P1.GetVarValue("CLK_"+name,a)
-  print("GET:",name,a[0])
-
-def Setvalue(name,value):
-  P1.SetVarValue("CLK_"+name,[value])
-  print("SET:",name,value)
-
-
-def AddMethod(name):
-    print("Method:",name)
-P1.GetMethodNames("",AddMethod);
-
-def AddVar(name,dtype=0,RW=3,cnt=1):
-    Types={0:'int',1:'float'}
-    RWs={0:'hidden',1:'RO',2:'WO',3:'RW'}
-    print("Var:",name,Types[dtype],RWs[RW],cnt)
-
-P1.GetVarNames("",AddVar);
-#exit()
-#P1.CallMethod("RCU01_RCU_on",None)
-#P1.CallMethod("RCU01_Dither_on",None)
-#P1.CallMethod("RCU02_RCU_on",None)
-if True:
-  Getvalue("CONF")
-  Getvalue("OUT")
-  Getvalue("IN")
-  P1.CallMethod("CLK_on1",None)
-  Getvalue("CONF")
-  Getvalue("OUT")
-  Getvalue("IN")
-  Getvalue("PLL_locked")
-#  P1.CallMethod("CLK_PLL_Setup",None)
-  Getvalue("PLL_locked")
-
diff --git a/test/test_dither.py b/test/test_dither.py
deleted file mode 100644
index 9a904f08c27e5ffd2efd8a2428d36f40b25752fa..0000000000000000000000000000000000000000
--- a/test/test_dither.py
+++ /dev/null
@@ -1,47 +0,0 @@
-import pypcc;
-
-P1=pypcc.pypcc("LTS_pypcc.yaml")
-
-def Getvalue(name):
-  a=[0]
-  P1.GetVarValue("RCU01_"+name,a)
-  print("GET:",name,a[0])
-
-def Setvalue(name,value):
-  P1.SetVarValue("RCU01_"+name,[value])
-  print("SET:",name,value)
-
-
-def AddMethod(name):
-    print("Method:",name)
-P1.GetMethodNames("",AddMethod);
-
-def AddVar(name,dtype=0,RW=3):
-    Types={0:'int',1:'float'}
-    RWs={0:'hidden',1:'RO',2:'WO',3:'RW'}
-    print("Var:",name,Types[dtype],RWs[RW])
-P1.GetVarNames("",AddVar);
-
-#P1.CallMethod("RCU01_RCU_on",None)
-#P1.CallMethod("RCU01_Dither_on",None)
-#P1.CallMethod("RCU02_RCU_on",None)
-
-if True:
-#  Setvalue("Dth3_Pwr",0)
-#  Setvalue("Dth2_Pwr",0)
-  Setvalue("Dth3_Pwr",1)
-  Setvalue("Dth2_Pwr",1)
-  P1.CallMethod("RCU01_Dither1_Setup",None)
-  P1.CallMethod("RCU01_Dither2_Setup",None)
-  P1.CallMethod("RCU01_Dither3_Setup",None)
-
-#  a=[0,0,0,0]
-#  P1.GetVarValue("RCU01_Dth1_FREQ",a)
-#  print("GET:",a[0])
-#  Getvalue("Dither1_Frequency")
-  Setvalue("Dither1_Frequency",101.0)
-  Setvalue("Dither2_Frequency",101.2)
-  Getvalue("Dither1_Frequency")
-  Getvalue("Dither2_Frequency")
-#  Getvalue("Dth1_FREQ")
-