diff --git a/clk/CLK.py b/clk/CLK.py
index f5a70f15e76b4c541adb251f65b0e79f1aaa94e7..f71fe4de5f2eb5a48b97611a38ea03ca938c289c 100644
--- a/clk/CLK.py
+++ b/clk/CLK.py
@@ -49,7 +49,8 @@ class RCU1():
         self.N=number;
         self.I2Ccallback=I2Ccallback
         self.SWcallback=Switchcallback
-        self.previous=np.zeros([number,Vars.RCU_storeReg],dtype='int')
+        self.previous   =np.zeros([number,Vars.RCU_storeReg],dtype='int')
+        self.previousHBA=np.zeros([number,3,32],dtype='int')
 
     def load(self):
         Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_init,0,[])  #Read the current status of GPIO IOs
@@ -80,13 +81,13 @@ class RCU1():
         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
+              if len(Mask)==0:  Mask=Vars.RCU_mask.OPCW.get_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
+            if len(Mask)==0:  Mask=Vars.RCU_mask.OPCW.get_value()
             mask=0;
             RCU0=-1;
             for RCUi in range(self.N):
@@ -112,7 +113,7 @@ class RCU1():
              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
+          Instr.dev.OPCW.set_value(Instr.value)
           logging.debug("Update internal variable")
           return
 #        if V1.Vars[0].type==Vars.DevType.Internal: return;
@@ -120,10 +121,10 @@ class RCU1():
         Step2=int(V1.size/V1.nVars)
         if (self.N>1):
            Mask=(Vars.RCU_mask if Step==1 else Vars.Ant_mask)
-           Mask=Mask.OPCW.get_data_value().Value.Value
-        value1=strs2bytes(Instr.value) if V1.OPCR is None else strs2bytes(V1.OPCR.get_data_value().Value.Value)
+           Mask=Mask.OPCW.get_value()
+        value1=strs2bytes(Instr.value) if V1.OPCR is None else strs2bytes(V1.OPCR.get_value())
         if (len(value1)==V1.nVars) and (self.N>1):  value1=(value1*self.N);
-        if (Instr.type==Vars.DevType.Var) or ((self.N==1) and (Instr.type==Vars.DevType.VarUpdate)):
+        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):
@@ -134,11 +135,22 @@ class RCU1():
                 value2=value1[i0:i1]
                 self.GetVarValue(RCUi,V1.Vars[Vari],value2)
                 value1[i0:i1]=value2
-          if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type)
+          if not(V1.OPCR is None): V1.OPCR.set_value(bytes2strs(value1,Step2,V1.type))
+
         elif Instr.type==Vars.DevType.VarUpdate:
-           self.GetVarValueAll(V1,value1)
-           if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type)
-#          V1.OPCR.get_data_value().Value.Value=value1
+          if self.N==1:
+             for Vari in range(Step):
+                i0=(Vari)*Step2
+                i1=(Vari+1)*Step2
+                value2=value1[i0:i1]
+                self.GetVarValue(0,V1.Vars[Vari],value2)
+                value1[i0:i1]=value2
+             if not(V1.OPCR is None): V1.OPCR.set_value(bytes2strs(value1,Step2,V1.type))
+          else:
+             self.GetVarValueAll(V1,value1)
+#            if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type)
+             if not(V1.OPCR is None): V1.OPCR.set_value(bytes2strs(value1,Step2,V1.type))
+#            V1.OPCR.get_data_value().Value.Value=value1
 
         logging.info(str(('** Readback:',V1.name,value1)))
 
@@ -147,13 +159,14 @@ class RCU1():
             if var.type==Vars.DevType.I2C:
                 self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi])
                 self.GetI2C(RCUi,var.devreg,var.width,var.bitoffset,value)
+            elif var.type==Vars.DevType.HBA1:
+                self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi])
+                self.GetI2CHBA1(RCUi,var.devreg,var.width,var.bitoffset,value)
             elif var.type==Vars.DevType.I2Cbb:
                 logging.error("I2Cbb Implemented")
             elif var.type==Vars.DevType.SPIbb:
                 self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi])
                 GetSPIbb(self.SetI2C,self.GetI2C,RCUi,var.devreg,value)
-#                self.GetSPIBB(RCUi,var.devreg,var.width,var.bitoffset,value)
-#                logging.error("SPIbb Implemented")
             else:
                 logging.error("Not Implemented")
 
@@ -183,6 +196,22 @@ class RCU1():
             elif V1.Vars[0].type==Vars.DevType.SPIbb:
               self.GetBBValueAll(V1,value1,mask)
 #              logging.info("SPIbb all not implemented yet")
+            elif V1.Vars[0].type==Vars.DevType.HBA1:
+              for Vari in range(Step):  
+                var=V1.Vars[Vari]
+                for RCUi in range(self.N):
+                    self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi])
+#                    print(Step,Step2,len(value1),V1.size)
+                    i0=(RCUi*Step+    Vari)*Step2
+                    i1=(RCUi*Step+(Vari+1))*Step2
+                    value2=value1[i0:i1]
+                    self.GetI2CHBA1(RCUi,var.devreg,var.width,var.bitoffset,value2)
+                    value1[i0:i1]=value2
+#                    i0=(RCUi*Step+    Vari)*Step2+16
+#                    i1=(RCUi*Step+(Vari+1))*Step2
+#                    value2=value1[i0:i1]
+#                    self.GetI2Cnoreg(RCUi,var.devreg,var.width,var.bitoffset,value2)
+#                    value1[i0:i1]=value2
             else:
                logging.error("Type not implemented")
 #            print(value1)
@@ -217,6 +246,10 @@ class RCU1():
             if var.type==Vars.DevType.I2C:
                 self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi])
                 self.SetI2C(RCUi,var.devreg,var.width,var.bitoffset,value)
+            elif var.type==Vars.DevType.HBA1:
+                self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi])
+                self.SetHBA1I2C(RCUi,var.devreg,var.width,var.bitoffset,value)
+#                 print("RCU1 Set",RCUi,var,value)
             elif var.type==Vars.DevType.I2Cbb:
                 logging.error("I2Cbb Implemented")
             elif var.type==Vars.DevType.SPIbb:
@@ -234,6 +267,20 @@ class RCU1():
         if buffer: return True;
         return self.I2Ccallback(dev.Addr,value,reg=dev.Register_W)
 
+    def SetHBA1I2C(self,RCUi,dev,width,bitoffset,value,buffer=False):
+#        if dev.store>0:
+        previous=self.previousHBA[RCUi,dev.store-1];
+        L=len(value)
+        for i in range(L):
+          value[i]=ApplyMask(value[i],width,bitoffset,previous[i]);
+        self.previousHBA[RCUi,dev.store-1]=value
+#        if buffer: return True;
+        self.I2Ccallback(dev.Addr,value[:16],reg=dev.Register_W)
+        if L>16: self.I2Ccallback(dev.Addr,value[16:],reg=dev.Register_W+16)
+        self.I2Ccallback(dev.Addr,[500],reg=dev.Register_W,read=3) #Wait 500ms
+        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];
@@ -305,6 +352,20 @@ class RCU1():
         #if (len(value)>1) and (width<8): print value
         return True;
 
+    def GetI2CHBA1(self,RCUi,dev,width,bitoffset,value):
+        #print(width,len(value))
+        value2=value
+        reg=dev.Register_R
+        if not(self.I2Ccallback(dev.Addr,value2,read=1)): return False;
+        if value2[0] is None:  return False
+        value[:]=value2[:];
+        if dev.store>0:
+            self.previousHBA[RCUi,dev.store-1]=value
+        for i in range(len(value)): 
+              value[i]=UnMask(value[i],width,bitoffset)      
+        return True;
+
+
     def start(self,Q1):
       def RCUthread(Q1):
          while True:
@@ -318,13 +379,12 @@ class RCU1():
       
       return RCUthread1 
  
-    def Queue_Monitor(self,Q1):
-#         Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_temp,32,[0]*32)
-#         Q1.put(Inst1)
+    def Queue_Monitor(self,Q1,NRCU):
+#          Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_temp,NRCU,[0]*NRCU)
+#          Q1.put(Inst1)
 #         Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_ADC_lock,96,[0]*96)
 #         Q1.put(Inst1)
-        return 
-
+          return 
     def AddVars(self,Q1,AddVarR,AddVarW):
      for v in Vars.OPC_devvars:
         dim1=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.nVars
@@ -333,6 +393,7 @@ class RCU1():
         #print(v.name,dim)
         varvalue2=0
         if   v.type==Vars.datatype.dInt:    varvalue2=dim2*[0]
+        elif v.type==Vars.datatype.dbool:   varvalue2=dim2*[False]
         elif v.type==Vars.datatype.dfloat:  varvalue2=dim2*[0.0] 
         elif v.type==Vars.datatype.dstring: varvalue2=dim1*[" "*dim3]
         print(len(varvalue2),varvalue2)
diff --git a/clk/HWconf.py b/clk/HWconf.py
index 36f14375ea723d11bb5ac124e893176503a0b13d..b975665baded666250e115e29c9a372c03a72852 100644
--- a/clk/HWconf.py
+++ b/clk/HWconf.py
@@ -14,6 +14,6 @@ RCU_storeReg=4; #Number of stored registers
 
 
 
-SPIBB_PLL=BBdev(4,[CLK_IO3_OUT1,CLK_IO3_OUT1,CLK_IO3_OUT1,CLK_IO3_OUT2],[4,7,5,6],0) #CLK,SDI,SDO,CS
+SPIBB_PLL=BBdev(4,[CLK_IO3_OUT1,CLK_IO3_OUT1,CLK_IO3_OUT1,CLK_IO3_OUT1],[4,7,5,6],0) #CLK,SDI,SDO,CS
 
 CLK_PLL_lock =DevReg(SPIBB_PLL,0X00,0X00,0) # PLL locked status
diff --git a/clk/Vars.py b/clk/Vars.py
index 20c67abf5ded629feca9327cac797dc80d689ba6..7e4d4b02e5e8a06021fac03eacfc8abad5b0a01e 100644
--- a/clk/Vars.py
+++ b/clk/Vars.py
@@ -3,33 +3,38 @@ from .HWconf import *
 CLKmod=I2Cmodules.CLK
 
 
-CLK_IGNORE_PPS= VarArray("CLK_Ignore_PPS",1,[Var2dev("",CLKmod,DevType.I2C,CLK_IO3_OUT1,1 ,6,1)],RW.ReadOnly,datatype.dInt,1,None,None)
-CLK_Enable_PWR= VarArray("CLK_Enable_PWR",1,[Var2dev("",CLKmod,DevType.I2C,CLK_IO3_OUT1,1 ,7,1)],RW.ReadOnly,datatype.dInt,1,None,None)
-CLK_Stat1     = VarArray("CLK_Stat"      ,1,[Var2dev("",CLKmod,DevType.I2C,CLK_IO3_OUT1,1 ,4,1)],RW.ReadOnly,datatype.dInt,1,None,None)
+CLK_IGNORE_PPS= VarArray("CLK_Ignore_PPS",1,[Var2dev("",CLKmod,DevType.I2C,CLK_IO3_OUT2,1 ,2,1)],RW.ReadOnly,datatype.dInt,1,None,None)
+CLK_Enable_PWR= VarArray("CLK_Enable_PWR",1,[Var2dev("",CLKmod,DevType.I2C,CLK_IO3_OUT1,1 ,1,1)],RW.ReadOnly,datatype.dInt,1,None,None)
+CLK_Stat1     = VarArray("CLK_Stat"      ,1,[Var2dev("",CLKmod,DevType.I2C,CLK_IO3_OUT1,1 ,2,1)],RW.ReadOnly,datatype.dInt,1,None,None)
 CLK_lock1      = VarArray("CLK_Lock"      ,1,[Var2dev("",CLKmod,DevType.SPIbb,CLK_PLL_lock,8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None)
 
 
-OPC_devvars=[CLK_IGNORE_PPS,CLK_Enable_PWR,CLK_Stat1,CLK_lock1]
+OPC_devvars=[CLK_Enable_PWR,CLK_lock1]
 
 RCU_init=Instrs("ReadRegisters",2,[
    Instr(DevType.VarUpdate,CLK_IGNORE_PPS,1,[0]),
    Instr(DevType.VarUpdate,CLK_Enable_PWR,1,[0])
 ])
 
-CLK_on=Instrs("CLK_on",2,[
+CLK_on=Instrs("CLK_on",3,[
    Instr(DevType.I2C,CLK_IO3_CONF1,1,[0x2C]),
    Instr(DevType.I2C,CLK_IO3_OUT1 ,1,[0x42]),
+   Instr(DevType.VarUpdate,CLK_lock1,1,[0]),
+   Instr(DevType.VarUpdate,CLK_Enable_PWR,1,[0])
 ])
 
-CLK_off=Instrs("CLK_off",2,[
+CLK_off=Instrs("CLK_off",3,[
    Instr(DevType.I2C,CLK_IO3_CONF1,1,[0x2C]),
    Instr(DevType.I2C,CLK_IO3_OUT1 ,1,[0x40]),
+   Instr(DevType.VarUpdate,CLK_Enable_PWR,1,[0])
 ])
 
 def SPIinst(reg,value):
-  return Instr(DevType.SPIbb,DevReg(SPIBB_PLL,0,reg,0),1,[value]),
-CLK_PLL_setup=Instrs("CLK_PLL_setup",2,[
-   SPIinst(0x03,0x08),
+  return Instr(DevType.SPIbb,DevReg(SPIBB_PLL,0,reg,0),1,[value])
+
+CLK_PLL_setup=Instrs("CLK_PLL_setup",15,[
+#   SPIinst(0x03,0x08),
+#   Instr(DevType.I2C,CLK_IO3_CONF1,1,[0x2C]),
    SPIinst(0x05,0x97),
    SPIinst(0x06,0x10),
    SPIinst(0x07,0x04),
@@ -41,7 +46,9 @@ CLK_PLL_setup=Instrs("CLK_PLL_setup",2,[
    SPIinst(0x0D,0x01),#was 2
    SPIinst(0x0F,0x01),
    SPIinst(0x11,0x01),
-   SPIinst(0x13,0x01)
+   SPIinst(0x13,0x01),
+   Instr(DevType.VarUpdate,CLK_lock1,1,[0])
 ])
 
+
 OPC_methods=[CLK_on,CLK_off,CLK_PLL_setup]
diff --git a/clk/spibitbang2.py b/clk/spibitbang2.py
index d7d6be041507d88a6ffd8889cbf8c11a09885c75..d312d5b6560f7bfaaaa75a9cef2773bc9b636f71 100644
--- a/clk/spibitbang2.py
+++ b/clk/spibitbang2.py
@@ -27,11 +27,14 @@ def SetSPIbb(SetI2C,RCUi,dev,value):
           
         bit_array = "{0:{fill}16b}".format(data2, fill='0')
       #    print(bit_array)
+        SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable
         SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable
         for bit in bit_array:
+              SetI2C(RCUi,CLKdev,1,CLKpin,[0]) 
               SetI2C(RCUi,SDIdev,1,SDIpin,[int(bit)]) 
               SetI2C(RCUi,CLKdev,1,CLKpin,[1]) 
-              SetI2C(RCUi,CLKdev,1,CLKpin,[0]) 
+        SetI2C(RCUi,CLKdev,1,CLKpin,[0])#Why? 
+        SetI2C(RCUi,CLKdev,1,CLKpin,[1]) 
         SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable
      #   SetI2C(RCUi,SDIdev,1,SDIpin,[1]) #high when finished
         return True;
@@ -52,14 +55,15 @@ def GetSPIbb(SetI2C,GetI2C,RCUi,dev,value):
         #          ADC_rw    = 0x01 # 0 for write, 1 for read
         data =  (ADC_reg_address << 1) + 1 #was 7??
           
+        SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable
         SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable
 
 
         bit_array = "{0:{fill}8b}".format(data, fill='0')
         for bit in bit_array:
               SetI2C(RCUi,SDIdev,1,SDIpin,[int(bit)]) 
-              SetI2C(RCUi,CLKdev,1,CLKpin,[1]) 
               SetI2C(RCUi,CLKdev,1,CLKpin,[0]) 
+              SetI2C(RCUi,CLKdev,1,CLKpin,[1]) 
 
      #   SetI2C(RCUi,SDIdev,1,SDIpin,[1]) #high when finished
 
@@ -69,10 +73,11 @@ def GetSPIbb(SetI2C,GetI2C,RCUi,dev,value):
         ret_value=[0]
         for i in range(N): value[i]=0
         for cnt in range(8*(ADC_bytes+1)):
+              SetI2C(RCUi,CLKdev,1,CLKpin,[0]) 
+              SetI2C(RCUi,CLKdev,1,CLKpin,[1])  #read after rising
               GetI2C(RCUi,SDOdev,1,SDOpin,ret_value) 
               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,CLKdev,1,CLKpin,[0]) 
         SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable
         return True;
 
diff --git a/i2c/I2C.py b/i2c/I2C.py
index 108cee4b8db1c8627e8fdde009a3aa2a9da117c4..d3a60c9655f3b77cb094800511f99f5b6b41dd3b 100644
--- a/i2c/I2C.py
+++ b/i2c/I2C.py
@@ -10,13 +10,13 @@ import logging
 I2Ccounter=0;
 
 def I2C1server(addr,data,reg=None,read=0):
+#  print("I2C",addr,reg,data,read)
   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:
@@ -25,6 +25,37 @@ def I2C1server(addr,data,reg=None,read=0):
          if not(reg is None):
              bus.ioctl_write(0,str(bytearray([reg])))
          data[:]=[int(x) for x in bus.ioctl_read(0,length)]
+#         print("I2C read",addr,reg,data,read)
+       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]=0xff
+       return False;
+
+def I2C4server(addr,data,reg=None,read=0):
+#  print("I2C4",addr,reg,data,read)
+  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-4',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)]
+#         print(data)
        else:
             if reg is None:
                bus.iaddr_bytes=0
@@ -63,6 +94,7 @@ def I2C2server(addr,data,reg=None,read=0):
        return True;
   except:
        if bus: bus.close()
-#       data[0]=0
+       print("I2C4 error")
+#       data[0]=0xff
        return False;
 
diff --git a/i2c/I2C.py.old b/i2c/I2C.py.old
new file mode 100644
index 0000000000000000000000000000000000000000..1982b43c9c0e13bf33d61d4bf48e8c2b940b5d06
--- /dev/null
+++ b/i2c/I2C.py.old
@@ -0,0 +1,70 @@
+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):
+#  print("I2C",addr,reg,data,read)
+  try:
+       if read==3:
+           time.sleep(data[0]/1000.)
+           return True
+       logging.debug(str(("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)]
+#         print("I2C read",addr,reg,data,read)
+       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]=0xff
+       return False;
+
+def I2C4server(addr,data,reg=None,read=0):
+#  print("I2C4",addr,reg,data,read)
+  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-4',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)]
+#         print(data)
+       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()
+       print("I2C4 error")
+#       data[0]=0xff
+       return False;
+
diff --git a/i2c/I2C_dummy.py b/i2c/I2C_dummy.py
index d6351b08d07e2271ddae4ff7d15c527bf8ac1649..ba39c1a5d6e1df962bc6f5e1eab79140cd5ec122 100644
--- a/i2c/I2C_dummy.py
+++ b/i2c/I2C_dummy.py
@@ -20,9 +20,9 @@ def I2C1server(addr,data,reg=None,read=0):
 #       logging.debug(str(("I2C",addr,reg,data,read)))
        return True
 
-def I2C2server(addr,data,reg=None,read=0):
+def I2C4server(addr,data,reg=None,read=0):
        global I2Ccounter;
-       logging.debug(str(("I2C2",addr,reg,data,read)))
+       logging.debug(str(("I2C4",addr,reg,data,read)))
        if read==3:
            time.sleep(data[0]/1000.)
            return True
diff --git a/i2c/I2Cswitch1.py b/i2c/I2Cswitch1.py
index 50a72c6cdb195c9f0f2efff6848e4d36b2d52d1d..187456b1d6cc9eb2d15330d216ff89e72fe42a18 100644
--- a/i2c/I2Cswitch1.py
+++ b/i2c/I2Cswitch1.py
@@ -16,8 +16,6 @@ class I2Cswitch1():
     def I2Ccallback(self,RCU,addr,data,reg=None,read=0):
         self.callback1(addr,data,reg,read)    
         
-
-        
 class I2Cswitch0():
     def __init__(self,callback1):
        return
diff --git a/i2c/I2Cv2.py b/i2c/I2Cv2.py
new file mode 100644
index 0000000000000000000000000000000000000000..1627b362488d3a250654c41856f4ecfe1baa41ad
--- /dev/null
+++ b/i2c/I2Cv2.py
@@ -0,0 +1,62 @@
+#import pylibi2c;
+#import 
+from periphery import I2C;
+
+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;
+
+
+i2c1=I2C("/dev/i2c-1")
+
+def I2C1server(addr,data,reg=None,read=0):
+#  print("I2C",addr,reg,data,read)
+  try:
+       if read==3:
+           time.sleep(data[0]/1000.)
+           return True
+       logging.debug(str(("I2C",addr,reg,data,read)))
+       if read==1:
+          if not(reg is None):  i2c1.transfer(addr,[I2C.Message([reg])])
+          msgs=[I2C.Message(data,read=True)]
+          i2c1.transfer(addr,msgs)
+          data[:]=msgs[0].data
+       else:
+            if reg is None: 
+               msgs=[I2C.Message(data)]
+            else:
+               msgs=[I2C.Message([reg]+data)]
+            i2c1.transfer(addr,msgs)
+       return True;
+  except:
+       return False;
+
+i2c4=I2C("/dev/i2c-4")
+
+def I2C4server(addr,data,reg=None,read=0):
+#  print("I2C",addr,reg,data,read)
+  try:
+       if read==3:
+           time.sleep(data[0]/1000.)
+           return True
+       logging.debug(str(("I2C",addr,reg,data,read)))
+
+       if read==1:
+          if not(reg is None):  i2c4.transfer(addr,[I2C.Message([reg])])
+          msgs=[I2C.Message(data,read=True)]
+          i2c4.transfer(addr,msgs)
+          data[:]=msgs[0].data
+       else:
+            if reg is None: 
+               msgs=[I2C.Message(data)]
+            else:
+               msgs=[I2C.Message([reg]+data)]
+            i2c4.transfer(addr,msgs)
+       return True;
+  except:
+       return False;
diff --git a/i2c/setswitch.py b/i2c/setswitch.py
new file mode 100644
index 0000000000000000000000000000000000000000..45f43942a9b3dc1fc7cde1b4efa5a06b674bde92
--- /dev/null
+++ b/i2c/setswitch.py
@@ -0,0 +1,36 @@
+from I2C import *
+import time
+RCU=3
+Ver="RCU2H v0.2"
+R1=0
+ROM=0x50
+
+#Set switch
+print("Set switch")
+if not(I2C1server(0x70,[1<<RCU],reg=None,read=0)):
+   print("Error setting switch!")
+   exit() #select RCU
+exit()
+#Get ID
+print("Get ID")
+ID=[0]*4
+if not(I2C1server(ROM,ID,reg=0xFC,read=1)): exit() #select RCU
+print(ID)
+exit()
+
+#Upload version
+Ver2=[(c.encode('utf-8')[0]) for c in Ver]
+print(len(Ver),Ver,Ver2)
+V2=[0]
+for i,v in enumerate(Ver2):
+ time.sleep(0.1)
+ I2C1server(ROM,[v],reg=R1+i,read=0) #select RCU
+# I2C1server(ROM,[v],reg=None,read=0) #select RCU
+ time.sleep(0.1)
+ I2C1server(ROM,V2,reg=R1+i,read=1) #select RCU
+ print(i,v,V2)
+
+#Download version
+Ver2=[0]*10
+I2C1server(ROM,Ver2,reg=R1,read=1) #select RCU
+print(Ver2)
diff --git a/i2c/test.py b/i2c/test.py
new file mode 100644
index 0000000000000000000000000000000000000000..92ee093a8b833322558341cd664855f643f57dd1
--- /dev/null
+++ b/i2c/test.py
@@ -0,0 +1,37 @@
+from I2C import *
+import time
+RCU=1
+Ver="RCU2H v0.2"
+R1=0
+ROM=0x50
+
+ID=[0]*7
+I2C1server(0x20,ID,reg=2,read=1)
+print(ID)
+I2C1server(0x20,ID,reg=2,read=1)
+print(ID)
+exit()
+#0=0
+#1=0   #debug?
+#2=21  #spd1
+#3=7   #spd2
+#4=175 #TXspeed
+#5=0
+#6=0
+
+#Upload version
+Ver2=[(c.encode('utf-8')[0]) for c in Ver]
+print(len(Ver),Ver,Ver2)
+V2=[0]
+for i,v in enumerate(Ver2):
+ time.sleep(0.1)
+ I2C1server(ROM,[v],reg=R1+i,read=0) #select RCU
+# I2C1server(ROM,[v],reg=None,read=0) #select RCU
+ time.sleep(0.1)
+ I2C1server(ROM,V2,reg=R1+i,read=1) #select RCU
+ print(i,v,V2)
+
+#Download version
+Ver2=[0]*10
+I2C1server(ROM,Ver2,reg=R1,read=1) #select RCU
+print(Ver2)
diff --git a/pcctypes.py b/pcctypes.py
index 1450ec4701ec6f76d6a96a1141b592e874666fc2..56c4bc7da636ed670e6d4bfcfc69adda86a663d8 100644
--- a/pcctypes.py
+++ b/pcctypes.py
@@ -35,6 +35,7 @@ class DevType(Enum):
     Internal = 6
     HBA1 = 7
     HBA2 = 8
+    Wait = 9
 
 class RW(Enum):
     Hidden = 0  #Not an OPC_UA variable
@@ -46,6 +47,7 @@ class datatype(Enum):
    dInt = 0
    dfloat = 1
    dstring = 2
+   dbool = 3
 
 #Variable two device link
 Var2dev=namedtuple("Var2dev","name module type devreg width bitoffset Scale")
diff --git a/pypcc2.py b/pypcc2.py
index 9907c49deb224044a780d1129cb57f5b7c6bbf56..4c873a2909dcd12b887880178b0738adfef8aec3 100644
--- a/pypcc2.py
+++ b/pypcc2.py
@@ -14,6 +14,8 @@ import time
 import logging
 import argparse
 
+NRCU=32
+
 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)
@@ -31,6 +33,7 @@ if args.simulator:
     from i2c import I2C_dummy as I2C
 else:
     from i2c import I2C
+#   from i2c import I2Cv2 as I2C
 
 #Queue used to pass instructions from opc-ua server to RCU
 Q1=queue.Queue() #RCUs
@@ -41,14 +44,14 @@ opcuaserv.InitServer(port=args.port)
 logging.info("OPC-UA Server started")   
 
 SW1=I2Cswitch1.I2Cswitch1(I2C.I2C1server)
-SW0=I2Cswitch1.I2Cswitch0(I2C.I2C2server) #Dummy switch as their is no switch on LTS
+SW0=I2Cswitch1.I2Cswitch0(None) #Dummy switch as their is no switch on LTS
 
-RCU=RCU.RCU1(32,I2C.I2C1server,SW1.SetChannel)
-RCU.AddVars(Q1,opcuaserv.AddVarR,opcuaserv.AddVarW)
+RCU=RCU.RCU1(NRCU,I2C.I2C1server,SW1.SetChannel)
+RCU.AddVars(Q1,opcuaserv.AddVarR,opcuaserv.AddVarW,opcuaserv.AddVar)
 RCU.AddMethod(Q1,opcuaserv.Addmethod)
 RCU.load() #Load current register values from HW
 
-CLK=CLK.RCU1(1,I2C.I2C2server,SW0.SetChannel)
+CLK=CLK.RCU1(1,I2C.I2C4server,SW0.SetChannel)
 CLK.AddVars(Q2,opcuaserv.AddVarR,opcuaserv.AddVarW)
 CLK.AddMethod(Q2,opcuaserv.Addmethod)
 CLK.load() #Load current register values from HW
@@ -76,7 +79,7 @@ def TimerThread(Q1,RCU):
          if Q1.qsize()>3: continue;
          cnt=0;
          logging.debug(str(("I2C bytes=",I2C.I2Ccounter," Qlength=",Q1.qsize())))
-         RCU.Queue_Monitor(Q1)
+         RCU.Queue_Monitor(Q1,NRCU)
 
     logging.info("End Timer thread")
 
@@ -104,5 +107,5 @@ finally:
         logging.info("Stop OPC-UA server")
         opcuaserv.server.stop()
         RCUthread1.join()
-#        CLKthread1.join()
+        CLKthread1.join()
         Timerthread1.join()
diff --git a/rcu/HWconf.py b/rcu/HWconf.py
index 8f9323da309bfa5e3fc21896738e93c3592e4240..44b75df15fe7bc8caef46d1986a452fe154e5703 100644
--- a/rcu/HWconf.py
+++ b/rcu/HWconf.py
@@ -4,6 +4,8 @@ from pcctypes import *
 #Mid plane address
 #MPaddr=namedtuple("MPaddr","nI2C I2C nSwitch Switch"); 
 RCU_MPaddr=MPaddr(1,[1],32,[0,1,2,3,4,5,6,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5])
+#RCU_MPaddr=MPaddr(1,[1],2,[0,1])
+#RCU_MPaddr=MPaddr(1,[1],1,[0])
 #CLK_MPaddr=MPaddr(1,[1],1,[7])
 
 #DevReg=namedtuple("DevReg","Addr Register_R Register_W store"); 
@@ -40,9 +42,10 @@ RCU_AN_Ch2=DevReg(0x14,0xB180,-1,0)
 RCU_AN_Temp=DevReg(0x14,0xA0C0,-1,0)
 
 #HBA1
-RCU_HBA1=DevReg(0x41,0,0,1)
-RCU_HBA2=DevReg(0x42,0,0,2)
-RCU_HBA3=DevReg(0x43,0,0,3)
+RCU_HBA1=DevReg(0x41,0x10,0x10,1)
+RCU_HBA2=DevReg(0x42,0x10,0x10,2)
+RCU_HBA3=DevReg(0x43,0x10,0x10,3)
+
 
 
 RCU_ROM_ID =DevReg(0x50,0xfc,0xfc,0) #32 bit ID=4 bytes
@@ -60,18 +63,21 @@ SPIBB_ADC3=BBdev(4,[RCU_IO3_OUT1,RCU_IO3_OUT1,RCU_IO3_CONF1,RCU_IO3_OUT2],[5,4,4
 #SPI ADC 
 #Dev: AD9683 
 RCU_ADC1_PLL_stat =DevReg(SPIBB_ADC1,0X0A,0X0A,0) # PLL locked status
+RCU_ADC1_PLL_enc =DevReg(SPIBB_ADC1,0X21,0X21,0) # PLL low encode
 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_PLL_enc =DevReg(SPIBB_ADC2,0X21,0X21,0) # PLL low encode
 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_PLL_enc =DevReg(SPIBB_ADC3,0X21,0X21,0) # PLL low encode
 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
diff --git a/rcu/RCU.py b/rcu/RCU.py
index 2c0511a932f9d4796f9cf18ec2c8d1a41ca56d9d..98978660f16f68fa5f3d0a07de694fb1305b2e2d 100644
--- a/rcu/RCU.py
+++ b/rcu/RCU.py
@@ -3,6 +3,7 @@ import numpy as np
 import logging
 from .spibitbang1 import *
 import threading
+import time
 
 
 def ApplyMask(value,width=8,bitoffset=0,previous=0):
@@ -49,7 +50,8 @@ class RCU1():
         self.N=number;
         self.I2Ccallback=I2Ccallback
         self.SWcallback=Switchcallback
-        self.previous=np.zeros([number,Vars.RCU_storeReg],dtype='int')
+        self.previous   =np.zeros([number,Vars.RCU_storeReg],dtype='int')
+        self.previousHBA=np.zeros([number,3,32],dtype='int')
 
     def load(self):
         Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_init,0,[])  #Read the current status of GPIO IOs
@@ -76,16 +78,20 @@ class RCU1():
 
     def SetVar(self,Instr,Mask=[]):
 #        Instr.value=strs2bytes(Instr.value) #Alwast be an array of bytes
+        if Instr.type==Vars.DevType.Wait:
+#            time.sleep(Instr.value[0]/1000.)
+            print("Sleep",Instr.value[0]/1000.,"s")
+            return;
         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
+              if len(Mask)==0:  Mask=Vars.RCU_mask.OPCW.get_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
+            if len(Mask)==0:  Mask=Vars.RCU_mask.OPCW.get_value()
             mask=0;
             RCU0=-1;
             for RCUi in range(self.N):
@@ -107,19 +113,20 @@ class RCU1():
 #              self.SetI2C(RCUi,Instr.dev,8,0,strs2bytes(Instr.value))
               return;
         V1=Instr.dev
+#        print(Instr.nvalue,V1.nVars,V1.size)
         if not((Instr.nvalue==V1.nVars) and (Instr.type==Vars.DevType.VarUpdate)) and not(Instr.nvalue==V1.size*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
+          Instr.dev.OPCW.set_value(Instr.value)
           logging.debug("Update internal variable")
           return
 #        if V1.Vars[0].type==Vars.DevType.Internal: return;
         Step=V1.nVars
         Step2=int(V1.size/V1.nVars)
         Mask=(Vars.RCU_mask if Step==1 else Vars.Ant_mask)
-        Mask=Mask.OPCW.get_data_value().Value.Value
-        value1=strs2bytes(Instr.value) if V1.OPCR is None else strs2bytes(V1.OPCR.get_data_value().Value.Value)
+        Mask=Mask.OPCW.get_value()
+        value1=strs2bytes(Instr.value) if V1.OPCR is None else strs2bytes(V1.OPCR.get_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)))
@@ -132,11 +139,12 @@ class RCU1():
                 value2=value1[i0:i1]
                 self.GetVarValue(RCUi,V1.Vars[Vari],value2)
                 value1[i0:i1]=value2
-          if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type)
+          if not(V1.OPCR is None): V1.OPCR.set_value(bytes2strs(value1,Step2,V1.type))
 
         elif Instr.type==Vars.DevType.VarUpdate:
           self.GetVarValueAll(V1,value1)
-          if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type)
+#          if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type)
+          if not(V1.OPCR is None): V1.OPCR.set_value(bytes2strs(value1,Step2,V1.type))
 #          V1.OPCR.get_data_value().Value.Value=value1
 
         logging.info(str(('** Readback:',V1.name,value1)))
@@ -146,6 +154,9 @@ class RCU1():
             if var.type==Vars.DevType.I2C:
                 self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi])
                 self.GetI2C(RCUi,var.devreg,var.width,var.bitoffset,value)
+            elif var.type==Vars.DevType.HBA1:
+                self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi])
+                self.GetI2CHBA1(RCUi,var.devreg,var.width,var.bitoffset,value)
             elif var.type==Vars.DevType.I2Cbb:
                 logging.error("I2Cbb Implemented")
             elif var.type==Vars.DevType.SPIbb:
@@ -179,6 +190,27 @@ class RCU1():
             elif V1.Vars[0].type==Vars.DevType.SPIbb:
               self.GetBBValueAll(V1,value1,mask)
 #              logging.info("SPIbb all not implemented yet")
+            elif V1.Vars[0].type==Vars.DevType.HBA1:
+              for Vari in range(Step):  
+                var=V1.Vars[Vari]
+#                self.SWcallback(mask)
+#                self.SetI2CAddr(self,DevReg)
+                for RCUi in range(self.N):
+                    self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi])
+#                    print(Step,Step2,len(value1),V1.size)
+                    WX=[0]
+                    self.I2Ccallback(0x40,WX,reg=0,read=1)#wakeup, do nothing
+                    self.I2Ccallback(0x40,[10],read=3)
+                    i0=(RCUi*Step+    Vari)*Step2
+                    i1=(RCUi*Step+(Vari+1))*Step2
+                    value2=value1[i0:i1]
+                    self.GetI2CHBA1(RCUi,var.devreg,var.width,var.bitoffset,value2)
+                    value1[i0:i1]=value2
+#                    i0=(RCUi*Step+    Vari)*Step2+16
+#                    i1=(RCUi*Step+(Vari+1))*Step2
+#                    value2=value1[i0:i1]
+#                    self.GetI2Cnoreg(RCUi,var.devreg,var.width,var.bitoffset,value2)
+#                    value1[i0:i1]=value2
             else:
                logging.error("Type not implemented")
 #            print(value1)
@@ -213,6 +245,10 @@ class RCU1():
             if var.type==Vars.DevType.I2C:
                 self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi])
                 self.SetI2C(RCUi,var.devreg,var.width,var.bitoffset,value)
+            elif var.type==Vars.DevType.HBA1:
+                self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi])
+                self.SetHBA1I2C(RCUi,var.devreg,var.width,var.bitoffset,value)
+#                 print("RCU1 Set",RCUi,var,value)
             elif var.type==Vars.DevType.I2Cbb:
                 logging.error("I2Cbb Implemented")
             elif var.type==Vars.DevType.SPIbb:
@@ -230,6 +266,26 @@ class RCU1():
         if buffer: return True;
         return self.I2Ccallback(dev.Addr,value,reg=dev.Register_W)
 
+    def SetHBA1I2C(self,RCUi,dev,width,bitoffset,value,buffer=False):
+#        if dev.store>0:
+        previous=self.previousHBA[RCUi,dev.store-1];
+        L=len(value)
+        for i in range(L):
+          value[i]=ApplyMask(value[i],width,bitoffset,previous[i]);
+        self.previousHBA[RCUi,dev.store-1]=value
+#        if buffer: return True;
+        print("HBA set:",value);
+        XX=[0]
+        self.I2Ccallback(0x40,XX,reg=0,read=1)#wakeup, do nothing
+        self.I2Ccallback(dev.Addr,[10],read=3)
+        self.I2Ccallback(dev.Addr,value[:16],reg=dev.Register_W)
+        if L>16: 
+              self.I2Ccallback(dev.Addr,[10],read=3)
+              self.I2Ccallback(dev.Addr,value[16:],reg=dev.Register_W+16)
+        self.I2Ccallback(dev.Addr,[600],read=3) #Wait 500ms
+        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];
@@ -301,12 +357,30 @@ class RCU1():
         #if (len(value)>1) and (width<8): print value
         return True;
 
+    def GetI2CHBA1(self,RCUi,dev,width,bitoffset,value):
+        #print(width,len(value))
+        value2=value
+        reg=dev.Register_R
+#        if not(self.I2Ccallback(dev.Addr,[],reg=0x0)): return False;
+        if not(self.I2Ccallback(dev.Addr,value2,read=1)): return False;
+        if value2[0] is None:  return False
+        value[:]=value2[:];
+        print("HBA ",RCUi,dev.Addr," received:",value);
+#        if dev.store>0: #This is disabled due to noise on readback
+#            self.previousHBA[RCUi,dev.store-1]=value[:]
+        for i in range(len(value)): 
+              value[i]=UnMask(value[i],width,bitoffset)      
+        return True;
+
+
     def start(self,Q1):
       def RCUthread(Q1):
          while True:
            item = Q1.get()
            if item is None: break;
+           self.statevar.set_value("busy");
            self.SetVar(item)
+           if Q1.qsize()==0: self.statevar.set_value("ready");
          logging.info("End RCU thread")
 
       RCUthread1 = threading.Thread(target=RCUthread, args=(Q1,))
@@ -314,13 +388,14 @@ class RCU1():
       
       return RCUthread1 
  
-    def Queue_Monitor(self,Q1):
-         Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_temp,32,[0]*32)
-         Q1.put(Inst1)
-#         Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_ADC_lock,96,[0]*96)
-#         Q1.put(Inst1)
-
-    def AddVars(self,Q1,AddVarR,AddVarW):
+    def Queue_Monitor(self,Q1,NRCU):
+	Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_temp,NRCU,[0]*NRCU)
+	Q1.put(Inst1)
+	Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_ADC_lock,96,[0]*96)
+	Q1.put(Inst1)
+	return 
+    def AddVars(self,Q1,AddVarR,AddVarW,AddVar):
+     self.statevar=AddVar("RCU_state_R","busy")
      for v in Vars.OPC_devvars:
         dim1=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.nVars
         dim2=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.size
@@ -328,6 +403,7 @@ class RCU1():
         #print(v.name,dim)
         varvalue2=0
         if   v.type==Vars.datatype.dInt:    varvalue2=dim2*[0]
+        elif v.type==Vars.datatype.dbool:   varvalue2=dim2*[False]
         elif v.type==Vars.datatype.dfloat:  varvalue2=dim2*[0.0] 
         elif v.type==Vars.datatype.dstring: varvalue2=dim1*[" "*dim3]
         print(len(varvalue2),varvalue2)
diff --git a/rcu/Vars.py b/rcu/Vars.py
index b8b389656e072d90020b18056ff66da2e280772f..7a14380585d0fab79f5dbe035b7eb8bd5d88e29d 100644
--- a/rcu/Vars.py
+++ b/rcu/Vars.py
@@ -21,11 +21,11 @@ RCU_temp1=Var2dev("RCU_temp1",RCUmod,DevType.I2C,RCU_AN_Temp ,23,0,4.21e-3)
 dummy=Var2dev("Dummy",RCUmod,DevType.Internal,None,8,0,1)
 
 
-Ant_mask=VarArray("Ant_mask"       ,3,[dummy,dummy,dummy]            ,RW.WriteOnly,datatype.dInt,3,None,None)
+Ant_mask=VarArray("Ant_mask"       ,3,[dummy,dummy,dummy]            ,RW.WriteOnly,datatype.dbool,3,None,None)
 RCU_att =VarArray("RCU_attenuator" ,3,[RCU_att1 ,RCU_att2 ,RCU_att3] ,RW.ReadWrite,datatype.dInt,3,None,None)
 RCU_band=VarArray("RCU_band"       ,3,[RCU_band1,RCU_band2,RCU_band3],RW.ReadWrite,datatype.dInt,3,None,None)
 
-RCU_mask=VarArray("RCU_mask"       ,1,[dummy]    ,RW.WriteOnly,datatype.dInt  ,1,None,None)
+RCU_mask=VarArray("RCU_mask"       ,1,[dummy]    ,RW.WriteOnly,datatype.dbool  ,1,None,None)
 RCU_temp=VarArray("RCU_temperature",1,[RCU_temp1],RW.ReadOnly ,datatype.dfloat,1,None,None)
 RCU_pwrd=VarArray("RCU_Pwr_dig"    ,1,[RCU_pwrd1],RW.ReadOnly ,datatype.dInt  ,1,None,None)
 RCU_LED =VarArray("RCU_LED0"       ,1,[RCU_led0] ,RW.ReadWrite,datatype.dInt  ,1,None,None)
@@ -36,13 +36,21 @@ RCU_Dth1_freq=Var2dev("RCU_dth1_freq",RCUmod,DevType.I2Cbb,RCU_Dth1_Freq,32,0,1e
 RCU_dth_freq=VarArray("RCU_dither_freq",3,[RCU_Dth1_freq,RCU_Dth2_freq,RCU_Dth3_freq],RW.ReadWrite,datatype.dfloat,3,None,None)
 
 HBA1_Delay=Var2dev("",RCUmod,DevType.HBA1,RCU_HBA1,5,2,1)
-HBA1_Pwr  =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA1,1,1,1)
 HBA2_Delay=Var2dev("",RCUmod,DevType.HBA1,RCU_HBA2,5,2,1)
-HBA2_Pwr  =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA2,1,1,1)
 HBA3_Delay=Var2dev("",RCUmod,DevType.HBA1,RCU_HBA3,5,2,1)
-HBA3_Pwr  =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA3,1,1,1)
-HBA1_Delay=VarArray("HBA_element_beamformer_delays",3,[HBA1_Delay,HBA2_Delay,HBA3_Delay],RW.ReadWrite,datatype.dInt,96,None,None)
-HBA1_Pwr  =VarArray("HBA_element_pwr"  ,3,[HBA1_Pwr  ,HBA2_Pwr  ,HBA3_Pwr  ],RW.ReadWrite,datatype.dInt,96,None,None)
+HBA1_led  =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA1,1,0,1)
+HBA2_led  =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA2,1,0,1)
+HBA3_led  =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA3,1,0,1)
+HBA1_pwr  =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA1,1,7,1)
+HBA2_pwr  =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA2,1,7,1)
+HBA3_pwr  =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA3,1,7,1)
+HBA1_pwr2  =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA1,1,1,1)
+HBA2_pwr2  =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA2,1,1,1)
+HBA3_pwr2  =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA3,1,1,1)
+HBA_Delay=VarArray("HBA_element_beamformer_delays",3,[HBA1_Delay,HBA2_Delay,HBA3_Delay],RW.ReadWrite,datatype.dInt,96,None,None)
+HBA_led  =VarArray("HBA_element_led"  ,3,[HBA1_led  ,HBA2_led  ,HBA3_led  ],RW.ReadWrite,datatype.dInt,96,None,None)
+HBA_pwr  =VarArray("HBA_element_pwr"  ,3,[HBA1_pwr  ,HBA2_pwr  ,HBA3_pwr  ],RW.ReadWrite,datatype.dInt,96,None,None)
+HBA_pwr2 =VarArray("HBA_element_pwr2"  ,3,[HBA1_pwr2  ,HBA2_pwr2  ,HBA3_pwr2  ],RW.ReadWrite,datatype.dInt,96,None,None)
 
 #RCU_ID0=Var2dev("",RCUmod,DevType.I2C,RCU_ROM,8,0,1)
 #RCU_ID=VarArray("RCU_ID",1,[RCU_ID0],RW.ReadOnly,datatype.dInt,4,None,None)
@@ -53,6 +61,14 @@ RCU_Ver0=Var2dev("",RCUmod,DevType.I2C,RCU_ROM_Ver,7,0,1)
 RCU_VER=VarArray("RCU_version",1,[RCU_Ver0],RW.ReadOnly,datatype.dstring,10,None,None)
 
 
+RCU_uCV_ID    =VarArray("uC_ID  "  ,1,[Var2dev("",RCUmod,DevType.I2C,DevReg(0x40,0,0,0),8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None)
+RCU_uCV_spd0  =VarArray("uC_spd0"  ,1,[Var2dev("",RCUmod,DevType.I2C,DevReg(0x40,1,1,0),8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None)
+RCU_uCV_debug =VarArray("uC_debug" ,1,[Var2dev("",RCUmod,DevType.I2C,DevReg(0x40,2,2,0),8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None)
+RCU_uCV_RXspd1=VarArray("uC_RXspd1",1,[Var2dev("",RCUmod,DevType.I2C,DevReg(0x40,3,3,0),8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None)
+RCU_uCV_RXspd2=VarArray("uC_RXspd2",1,[Var2dev("",RCUmod,DevType.I2C,DevReg(0x40,4,4,0),8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None)
+RCU_uCV_TXspd1=VarArray("uC_TXspd1",1,[Var2dev("",RCUmod,DevType.I2C,DevReg(0x40,6,6,0),8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None)
+
+
 RCU_ADC1_lock=Var2dev("RCU_ADC1_lock",RCUmod,DevType.SPIbb,RCU_ADC1_PLL_stat,8,0,1)
 RCU_ADC2_lock=Var2dev("RCU_ADC2_lock",RCUmod,DevType.SPIbb,RCU_ADC2_PLL_stat,8,0,1)
 RCU_ADC3_lock=Var2dev("RCU_ADC3_lock",RCUmod,DevType.SPIbb,RCU_ADC3_PLL_stat,8,0,1)
@@ -95,15 +111,10 @@ RCU_OUT2=VarArray("RCU_OUT2",3,[RCU_IO1_2,RCU_IO2_2,RCU_IO3_2],RW.ReadOnly,datat
 #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_ID,RCU_VER,HBA1_Delay,HBA1_Pwr]#,RCU_CNF1,RCU_CNF2]
-
-
-
-
-
-
+#OPC_devvars=[RCU_mask,Ant_mask,RCU_att,RCU_band,RCU_temp,RCU_pwrd,RCU_LED,RCU_ID,RCU_VER,HBA_Delay,HBA_led]
+#OPC_devvars=[RCU_mask,Ant_mask,RCU_att,RCU_band,RCU_temp,RCU_pwrd,RCU_LED,RCU_ID,RCU_VER,HBA_Delay,HBA_led,RCU_uCV_ID]
+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_ID,RCU_VER,HBA_Delay,HBA_led,HBA_pwr,HBA_pwr2,RCU_uCV_ID]
+#OPC_devvars=[RCU_mask,Ant_mask,RCU_att,RCU_band,RCU_temp,RCU_pwrd,RCU_LED,RCU_uCV_ID,RCU_uCV_spd0,RCU_uCV_RXspd1,RCU_uCV_RXspd2,RCU_uCV_TXspd1,RCU_uCV_debug ]#,HBA1_Pwr]#,RCU_CNF1,RCU_CNF2]
 #Instr=namedtuple("DevInstr","type dev nvalue value")
 #Instrs=namedtuple("Instr","name ninstr instr")
 
@@ -114,46 +125,52 @@ RCU_init=Instrs("ReadRegisters",2,[
    Instr(DevType.VarUpdate,RCU_OUT2,3,[0,0,0])
 ])
 
-ADC_on=Instrs("ADC_on",16,[
+ADC_on=Instrs("ADC_on",17,[
    Instr(DevType.SPIbb,RCU_ADC1_JESD_ctr,1,[0x14]),
    Instr(DevType.SPIbb,RCU_ADC1_CML_level,1,[0x7]),
    Instr(DevType.SPIbb,RCU_ADC1_SYNC_ctr,1,[1]),
+   Instr(DevType.SPIbb,RCU_ADC1_PLL_enc,1,[0x8]),
    Instr(DevType.SPIbb,RCU_ADC1_update,1,[1]),
+   Instr(DevType.Wait,0,0,[100]),
    Instr(DevType.SPIbb,RCU_ADC2_JESD_ctr,1,[0x14]),
    Instr(DevType.SPIbb,RCU_ADC2_CML_level,1,[0x7]),
    Instr(DevType.SPIbb,RCU_ADC2_SYNC_ctr,1,[1]),
+   Instr(DevType.SPIbb,RCU_ADC2_PLL_enc,1,[0x8]),
    Instr(DevType.SPIbb,RCU_ADC2_update,1,[1]),
+   Instr(DevType.Wait,0,0,[100]),
    Instr(DevType.SPIbb,RCU_ADC3_JESD_ctr,1,[0x14]),
    Instr(DevType.SPIbb,RCU_ADC3_CML_level,1,[0x7]),
    Instr(DevType.SPIbb,RCU_ADC3_SYNC_ctr,1,[1]),
+   Instr(DevType.SPIbb,RCU_ADC3_PLL_enc,1,[0x8]),
    Instr(DevType.SPIbb,RCU_ADC3_update,1,[1]),
+   Instr(DevType.Wait,0,0,[500]),
    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]),
    Instr(DevType.VarUpdate,RCU_ADC_lock,3,[0,0,0])
 ])
 
-RCU_on=Instrs("RCU_on",12,[
+RCU_on=Instrs("RCU_on",20,[
    Instr(DevType.I2C,RCU_IO2_CONF1,1,[0]),
    Instr(DevType.I2C,RCU_IO2_CONF2,1,[0]),
+   Instr(DevType.I2C,RCU_IO2_OUT1,1,[0x4A]),
+   Instr(DevType.I2C,RCU_IO2_OUT2,1,[0x55]),
+   Instr(DevType.Wait,0,0,[300]),
    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.Wait,0,0,[200]),
+   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])
+#   Instr(DevType.Wait,0,0,[300]),
+   Instr(DevType.Instr,ADC_on,0,[])
 ])
 
 RCU_off=Instrs("RCU_off",1,[
@@ -170,7 +187,7 @@ RCU_update=Instrs("RCU_update",11,[
 #   Instr(DevType.VarUpdate,RCU_VER,1,[0]*10),
    Instr(DevType.VarUpdate,RCU_att,3,[0,0,0]),
    Instr(DevType.VarUpdate,RCU_band,3,[0,0,0]),
-   Instr(DevType.VarUpdate,RCU_LED,3,[0,0,0]),
+   Instr(DevType.VarUpdate,RCU_LED,1,[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]),
diff --git a/rcu/spibitbang1.py b/rcu/spibitbang1.py
index 14541d75b70c1961a206a5c39533afccccec0d6e..ca8fd300bdb46cd1463318a9ea9b727d1c323580 100644
--- a/rcu/spibitbang1.py
+++ b/rcu/spibitbang1.py
@@ -109,21 +109,23 @@ def GetSPIbb2(SetI2C,GetI2C,RCUi,devs,value):
         ADC_rw    = 0x01 # 0 for write, 1 for read
         
         data = ( ADC_rw << 15) + ( ADC_bytes << 13 ) + ADC_reg_address
+        Setbit(CLK,0) 
           
         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(CLK,0) 
               Setbit(SDIO,int(bit)) 
               Setbit(CLK,1) 
-              Setbit(CLK,0) 
 
-        Setbit(CS,1) #disable
+#        Setbit(CS,1) #disable
+        Setbit(SDIOdir,1) #input
+        Setbit(CLK,0) 
 
           #    print("read byte")
-        Setbit(SDIOdir,1) #input
-        Setbit(CS,0) #enable
+#        Setbit(CS,0) #enable
         a=[0]
         N=len(value)
         for i in range(N): value[i]=0
diff --git a/scripts/ADCreset.py b/scripts/ADCreset.py
index b0f208abaf03277f350b210cc2ee279566f3c96a..e42c94acc4acadf705c19747f1f63955e81d6814 100644
--- a/scripts/ADCreset.py
+++ b/scripts/ADCreset.py
@@ -1,13 +1,14 @@
 from test_common import *
 
-RCUs=[0];
+RCUs=[0,1,2,3];
 setRCUmask(RCUs)
 
-callmethod("RCU_off")
-time.sleep(1)
+#callmethod("RCU_off")
+#exit()
+#time.sleep(2)
 callmethod("RCU_on")
-callmethod("RCU_on")
-time.sleep(1)
-callmethod("ADC_on")
+#callmethod("RCU_on")
+#time.sleep(1)
+#callmethod("ADC_on")
 
 disconnect();
diff --git a/scripts/Att.py b/scripts/Att.py
index 6e5d7b14ec651ce3f809a7a380db6e671faff67c..65ca66bb1801a2ea14de4937014a258053f663e4 100644
--- a/scripts/Att.py
+++ b/scripts/Att.py
@@ -1,26 +1,20 @@
 from test_common import *
 
 name="RCU_attenuator"
-RCU=0;
-Att=[5,5,5]
+RCU=[0];
+Att=[1,1,1]
 
 
-#setAntmask([RCU])
+setAntmask(RCU)
 
 att=get_value(name+"_R")
-val=att.Value.Value
-print("Att old:",val)
-#print("Att old:",att[3*RCU:3*RCU+3])
-
-val[3*RCU:3*RCU+3]=Att
-att.Value.Value=val
-print("Att set:",val)
-#att[3*RCU]+=1
+print("Att old:",att[:12])
+for r in RCU:
+  att[3*r:3*r+3]=Att
 set_value(name+"_RW",att)
 
 time.sleep(0.5)
 att=get_value(name+"_R")
-print("Att new:",att.Value.Value)
-#print("Att new:",att[3*RCU:3*RCU+3])
+print("Att new:",att[:12])
 
 disconnect()
\ No newline at end of file
diff --git a/scripts/Band.py b/scripts/Band.py
new file mode 100644
index 0000000000000000000000000000000000000000..c4502783269cb5937749a4016a63878b301e6216
--- /dev/null
+++ b/scripts/Band.py
@@ -0,0 +1,20 @@
+from test_common import *
+
+name="RCU_band"
+RCU=3;
+Att=[3,3,3]
+
+
+setAntmask([RCU])
+
+att=get_value(name+"_R")
+print("Att old:",att[3*RCU:3*RCU+3])
+
+att[3*RCU:3*RCU+3]=Att
+set_value(name+"_RW",att)
+
+time.sleep(0.5)
+att=get_value(name+"_R")
+print("Att new:",att[3*RCU:3*RCU+3])
+
+disconnect()
\ No newline at end of file
diff --git a/scripts/CLK.py b/scripts/CLK.py
new file mode 100644
index 0000000000000000000000000000000000000000..4dbf2b4179174154d421998068cee27faa7108cb
--- /dev/null
+++ b/scripts/CLK.py
@@ -0,0 +1,16 @@
+from test_common import *
+
+#callmethod("CLK_off")
+#time.sleep(1)
+
+callmethod("CLK_on")
+time.sleep(1)
+callmethod("CLK_PLL_setup")
+#exit()
+#time.sleep(1)
+#callmethod("RCU_on")
+#callmethod("RCU_on")
+#time.sleep(1)
+#callmethod("ADC_on")
+
+disconnect();
diff --git a/scripts/LED.py b/scripts/LED.py
index d1857ae8879599d05c32afecce64f161f5cba1ea..c4d882325cf9d3d547e1962b9701541a162cc143 100644
--- a/scripts/LED.py
+++ b/scripts/LED.py
@@ -1,15 +1,14 @@
 from test_common import *
 
 name="RCU_LED0"
-RCU=1;
-LEDvalue="on";
+RCU=0;
+LEDvalue=2;
 
 setRCUmask([RCU])
-#exit()
+
 led=get_value(name+"_R")
 print("LED old:",led)
 led[RCU]=LEDvalue
-print("LED changed:",led)
 
 set_value(name+"_RW",led)
 time.sleep(0.1)
diff --git a/scripts/RCUupdate.py b/scripts/RCUupdate.py
index 42dde847e5ad4c65793086b57396c55856d6d292..3d9d5857a37a76a1f32c3853d5732dcc1456518a 100644
--- a/scripts/RCUupdate.py
+++ b/scripts/RCUupdate.py
@@ -1,7 +1,9 @@
 from test_common import *
 
-RCUs=[0];
+RCUs=[3];
 setRCUmask(RCUs)
+#for RCU in RCUs: 
+setAntmask(RCUs,[True,True,True])
 
 callmethod("RCU_update")
 
diff --git a/scripts/SetHBAT_BF.py b/scripts/SetHBAT_BF.py
new file mode 100644
index 0000000000000000000000000000000000000000..9147882137cc238a7db4626624d62b243f1d10ff
--- /dev/null
+++ b/scripts/SetHBAT_BF.py
@@ -0,0 +1,26 @@
+RCU=3
+HBAT=1 #HBAT on RCU 0..2
+#HBA=5; #HBA Element in HBAT
+#BFX=11 #delay in 0.5ns
+#BFY=BFX+1
+name="HBA_element_beamformer_delays"
+
+from test_common import *
+import numpy as np
+
+AntMask=[(x==HBAT) for x in range(3)]
+setAntmask([RCU],AntMask)
+
+i=(RCU*3+HBAT)*32
+
+val=get_value(name+"_R")
+print("old:",val[i:i+32])
+
+val[i:i+32]=np.array(range(32))[::]*0+1
+
+set_value(name+"_RW",val)
+time.sleep(1)
+val=get_value(name+"_R")
+print("new:",val[i:i+32])
+
+disconnect()
diff --git a/scripts/SetHBAT_LED.py b/scripts/SetHBAT_LED.py
new file mode 100644
index 0000000000000000000000000000000000000000..8a7c090771951628e69beaec00a32a859ae78dbe
--- /dev/null
+++ b/scripts/SetHBAT_LED.py
@@ -0,0 +1,28 @@
+RCU=3
+HBAT=1 #HBAT on RCU 0..2
+LED=1 #on
+name="HBA_element_led"
+
+from test_common import *
+import numpy as np
+
+AntMask=[(x==HBAT) for x in range(3)]
+setAntmask([RCU],AntMask)
+
+i=(RCU*3+HBAT)*32
+
+val=get_value(name+"_R")
+#print("old:",val)
+print("old:",val[i:i+32])
+for x in range(32):
+  val[i+x]=LED
+#val[i]=LED #Not needed for LED
+#val[i+1]=LED
+
+set_value(name+"_RW",val)
+time.sleep(1)
+val=get_value(name+"_R")
+#print("new:",val)
+print("new:",val[i:i+32])
+
+disconnect()
diff --git a/scripts/SetHBAT_pwr.py b/scripts/SetHBAT_pwr.py
new file mode 100644
index 0000000000000000000000000000000000000000..f20d4cee1d054b52e32f39f34c4ac177fe227a65
--- /dev/null
+++ b/scripts/SetHBAT_pwr.py
@@ -0,0 +1,41 @@
+RCU=3
+HBAT=1 #HBAT on RCU 0..2
+#HBA=5; #HBA Element in HBAT
+#BFX=11 #delay in 0.5ns
+#BFY=BFX+1
+name="HBA_element_pwr"
+
+from test_common import *
+import numpy as np
+
+AntMask=[(x==HBAT) for x in range(3)]
+setAntmask([RCU],AntMask)
+
+i=(RCU*3+HBAT)*32
+
+val=get_value(name+"_R")
+print("old:",val[i:i+32])
+
+val[i:i+32]=np.ones([32])
+#val[i:i+32]=np.zeros([32])
+
+set_value(name+"_RW",val)
+
+#time.sleep(0.5)
+#busy=get_value("RCU_state_R")
+#print(busy)
+for x in range(10):
+  busy=get_value("RCU_state_R")
+#  print(busy)
+  if (busy=='busy'): break;
+  time.sleep(0.05)
+while not(busy=='ready'):
+  busy=get_value("RCU_state_R")
+#  print(busy)
+  time.sleep(0.05)
+
+val=get_value(name+"_R")
+print("new:",val[i:i+32])
+
+
+disconnect()
diff --git a/scripts/SetHBAT_pwr_loop.py b/scripts/SetHBAT_pwr_loop.py
new file mode 100644
index 0000000000000000000000000000000000000000..6bae64c4a9fe3d204cf4dabdc87d87f1a0640c1b
--- /dev/null
+++ b/scripts/SetHBAT_pwr_loop.py
@@ -0,0 +1,62 @@
+RCU=3
+HBAT=1 #HBAT on RCU 0..2
+#HBA=5; #HBA Element in HBAT
+#BFX=11 #delay in 0.5ns
+#BFY=BFX+1
+name="HBA_element_pwr"
+
+from test_common import *
+import numpy as np
+
+AntMask=[(x==HBAT) for x in range(3)]
+setAntmask([RCU],AntMask)
+
+i=(RCU*3+HBAT)*32
+
+val=get_value(name+"_R")
+print("old:",val[i:i+32])
+
+for ii in range(10):
+ val[i:i+32]=np.ones([32])
+#val[i:i+32]=np.zeros([32])
+
+ set_value(name+"_RW",val)
+
+#time.sleep(0.5)
+#busy=get_value("RCU_state_R")
+#print(busy)
+ for x in range(10):
+  busy=get_value("RCU_state_R")
+#  print(busy)
+  if (busy=='busy'): break;
+  time.sleep(0.05)
+ while not(busy=='ready'):
+  busy=get_value("RCU_state_R")
+#  print(busy)
+  time.sleep(0.05)
+
+ val=get_value(name+"_R")
+ print("new:",val[i:i+32])
+
+#val[i:i+32]=np.ones([32])
+ val[i:i+32]=np.zeros([32])
+
+ set_value(name+"_RW",val)
+
+#time.sleep(0.5)
+#busy=get_value("RCU_state_R")
+#print(busy)
+ for x in range(10):
+  busy=get_value("RCU_state_R")
+#  print(busy)
+  if (busy=='busy'): break;
+  time.sleep(0.05)
+ while not(busy=='ready'):
+  busy=get_value("RCU_state_R")
+#  print(busy)
+  time.sleep(0.05)
+
+ val=get_value(name+"_R")
+ print("new:",val[i:i+32])
+
+disconnect()
diff --git a/scripts/SetHBA_BF.py b/scripts/SetHBA_BF.py
index 160cf79a86a1bec3f1fe46c282f08f2c59e0928c..697a9a2a6c32ae88cbb330ed49b79ee10c26c928 100644
--- a/scripts/SetHBA_BF.py
+++ b/scripts/SetHBA_BF.py
@@ -1,7 +1,7 @@
-RCU=0
-HBAT=1 #HBAT on RCU 0..2
+RCU=1
+HBAT=0 #HBAT on RCU 0..2
 HBA=5; #HBA Element in HBAT
-BFX=1 #delay in 0.5ns
+BFX=11 #delay in 0.5ns
 BFY=BFX+1
 name="HBA_element_beamformer_delays"
 
diff --git a/scripts/SetHBA_LED.py b/scripts/SetHBA_LED.py
index b334ed02b06d505b3c727555f5b9860ad76f37ad..7869dacb128c127c124fdbdfb0d6b77b2d16ce50 100644
--- a/scripts/SetHBA_LED.py
+++ b/scripts/SetHBA_LED.py
@@ -1,6 +1,6 @@
-RCU=0
+RCU=1
 HBAT=1 #HBAT on RCU 0..2
-HBA=5; #HBA Element in HBAT
+HBA=14; #HBA Element in HBAT
 LED=0 #on
 name="HBA_element_led"
 
diff --git a/scripts/SetMonitor.py b/scripts/SetMonitor.py
index fa97710d7db14ece16520288bb451e8a60d83b89..b303a5a94743d6c6e1a22c443214b6323133c37a 100644
--- a/scripts/SetMonitor.py
+++ b/scripts/SetMonitor.py
@@ -1,6 +1,6 @@
 from test_common import *
 
-rate= 60 #seconds
+rate= 10 #seconds
 name="RCU_monitor_rate_RW"
 
 print("old:",get_value(name))
diff --git a/scripts/i2clinetest.py b/scripts/i2clinetest.py
new file mode 100644
index 0000000000000000000000000000000000000000..eebbb0324564c823e275e0be738c45fc07fa6448
--- /dev/null
+++ b/scripts/i2clinetest.py
@@ -0,0 +1,17 @@
+#from gpiozero import LED,Button
+import RPi.GPIO as GPIO
+#SCL=3
+#SDA=2
+
+SCL=24
+SDA=23
+
+GPIO.setmode(GPIO.BCM)
+
+GPIO.setup(SDA,GPIO.IN)
+GPIO.setup(SCL,GPIO.IN)
+print("SDA ",GPIO.input(SDA))
+print("SCL ",GPIO.input(SCL))
+
+GPIO.cleanup()
+
diff --git a/scripts/i2creset.py b/scripts/i2creset.py
new file mode 100644
index 0000000000000000000000000000000000000000..2e992b0ff5d25b3c3538f4048f6b097689a95a9f
--- /dev/null
+++ b/scripts/i2creset.py
@@ -0,0 +1,43 @@
+#from gpiozero import LED,Button
+import RPi.GPIO as GPIO
+SCL=3
+SDA=2
+
+GPIO.setmode(GPIO.BCM)
+GPIO.setup(SDA,GPIO.IN)
+GPIO.setup(SCL,GPIO.IN)
+print("SDA=",GPIO.input(SDA))
+print("SCL=",GPIO.input(SCL))
+GPIO.cleanup()
+
+exit()
+GPIO.setmode(GPIO.BCM)
+print("Clock")
+GPIO.setup(SDA,GPIO.IN)
+GPIO.setup(SCL,GPIO.OUT)
+for x in range(10):
+  GPIO.output(SCL,0)
+  print("SDA=",GPIO.input(SDA))
+  GPIO.output(SCL,1)
+  print("SDA=",GPIO.input(SDA))
+
+print("STOP")
+#GPIO.setup(SCL,GPIO.OUT)
+GPIO.output(SCL,0)
+GPIO.setup(SDA,GPIO.OUT)
+GPIO.output(SDA,0)
+GPIO.output(SCL,1)
+GPIO.output(SDA,1)
+GPIO.setup(SDA,GPIO.IN)
+print("SDA=",GPIO.input(SDA))
+
+GPIO.cleanup()
+
+#SCL=LED(9)
+#SDA=Button(8)
+
+#if Button.is_pressed: print("High")
+#SCL.on()
+#SCL.off()
+
+
diff --git a/scripts/i2creset2.py b/scripts/i2creset2.py
new file mode 100644
index 0000000000000000000000000000000000000000..2ff714e32cb493d6beb6099a615cd86d9b8303e7
--- /dev/null
+++ b/scripts/i2creset2.py
@@ -0,0 +1,71 @@
+#from gpiozero import LED,Button
+import RPi.GPIO as GPIO
+SCL=3
+SDA=2
+Addr=0x70 #SWITCH
+#Addr=0x20 #io expander
+Value=0
+data=[(Addr<<1)+0,Value] #Write
+#data=[Addr<<1+1] #Read
+
+GPIO.setmode(GPIO.BCM)
+
+GPIO.setup(SDA,GPIO.IN)
+GPIO.setup(SCL,GPIO.IN)
+print("SDA high",GPIO.input(SDA)==1)
+print("SCL high",GPIO.input(SCL)==1)
+
+#GPIO.setup(SDA,GPIO.OUT)
+GPIO.setup(SCL,GPIO.OUT)
+
+#GPIO.output(SDA,1)
+GPIO.output(SCL,1)
+
+#Start
+#GPIO.output(SDA,0)
+GPIO.setup(SDA,GPIO.OUT)
+GPIO.output(SDA,0)
+GPIO.output(SCL,0)
+
+for b in data:
+ ba="{0:{fill}8b}".format(b,fill='0')
+ print("Sending",ba)
+ for bit in ba:
+   if int(bit)==0: 
+      GPIO.setup(SDA,GPIO.OUT)
+      GPIO.output(SDA,0)
+   else:
+      GPIO.setup(SDA,GPIO.IN)
+#   GPIO.output(SDA,int(bit))
+   GPIO.output(SCL,1)
+   GPIO.output(SCL,0)
+
+
+ GPIO.setup(SDA,GPIO.IN)
+# GPIO.output(SDA,0)
+# print("Ack",GPIO.input(SDA)==0)
+# GPIO.setup(SDA,GPIO.OUT)
+
+ #ack clock
+ GPIO.output(SCL,1)
+# GPIO.setup(SDA,GPIO.IN)
+ print("Ack",GPIO.input(SDA)==0)
+# GPIO.setup(SDA,GPIO.OUT)
+ GPIO.output(SCL,0)
+ print("Ack released",GPIO.input(SDA)==1)
+
+
+#Stop
+#GPIO.output(SDA,0)
+GPIO.setup(SDA,GPIO.OUT)
+GPIO.output(SDA,0)
+GPIO.output(SCL,1)
+GPIO.output(SDA,1)
+#GPIO.setup(SDA,GPIO.IN)
+
+GPIO.setup(SDA,GPIO.IN)
+GPIO.setup(SCL,GPIO.IN)
+print("SDA high",GPIO.input(SDA)==1)
+print("SCL high",GPIO.input(SCL)==1)
+GPIO.cleanup()
+
diff --git a/scripts/i2creset2b.py b/scripts/i2creset2b.py
new file mode 100644
index 0000000000000000000000000000000000000000..a41c4c209f05533f9af90e080a65e96befd94d70
--- /dev/null
+++ b/scripts/i2creset2b.py
@@ -0,0 +1,70 @@
+#from gpiozero import LED,Button
+import RPi.GPIO as GPIO
+SCL=3
+SDA=2
+Addr=0x70 #SWITCH
+#Addr=0x20 #io expander
+Value=0
+data=[(Addr<<1)+0,Value] #Write
+#data=[Addr<<1+1] #Read
+
+GPIO.setmode(GPIO.BCM)
+
+GPIO.setup(SDA,GPIO.IN)
+GPIO.setup(SCL,GPIO.IN)
+print("SDA high",GPIO.input(SDA)==1)
+print("SCL high",GPIO.input(SCL)==1)
+
+GPIO.setup(SDA,GPIO.OUT)
+GPIO.setup(SCL,GPIO.OUT)
+
+GPIO.output(SDA,1)
+GPIO.output(SCL,1)
+
+#Start
+#GPIO.output(SDA,0)
+#GPIO.setup(SDA,GPIO.OUT)
+GPIO.output(SDA,0)
+GPIO.output(SCL,0)
+
+for b in data:
+ ba="{0:{fill}8b}".format(b,fill='0')
+ print("Sending",ba)
+ for bit in ba:
+#   if int(bit)==0: 
+#      GPIO.setup(SDA,GPIO.OUT)
+#      GPIO.output(SDA,0)
+#   else:
+#      GPIO.setup(SDA,GPIO.IN)
+   GPIO.output(SDA,int(bit))
+   GPIO.output(SCL,1)
+   GPIO.output(SCL,0)
+
+
+ GPIO.setup(SDA,GPIO.IN)
+# GPIO.output(SDA,0)
+# print("Ack",GPIO.input(SDA)==0)
+# GPIO.setup(SDA,GPIO.OUT)
+
+ #ack clock
+ GPIO.output(SCL,1)
+# GPIO.setup(SDA,GPIO.IN)
+ print("Ack",GPIO.input(SDA)==0)
+ GPIO.output(SCL,0)
+ print("Ack released",GPIO.input(SDA)==1)
+ GPIO.setup(SDA,GPIO.OUT)
+
+#Stop
+#GPIO.output(SDA,0)
+#GPIO.setup(SDA,GPIO.OUT)
+GPIO.output(SDA,0)
+GPIO.output(SCL,1)
+GPIO.output(SDA,1)
+#GPIO.setup(SDA,GPIO.IN)
+
+GPIO.setup(SDA,GPIO.IN)
+GPIO.setup(SCL,GPIO.IN)
+print("SDA high",GPIO.input(SDA)==1)
+print("SCL high",GPIO.input(SCL)==1)
+GPIO.cleanup()
+
diff --git a/scripts/i2cresetCLK.py b/scripts/i2cresetCLK.py
new file mode 100644
index 0000000000000000000000000000000000000000..aa09dbbf67dbb500cc983044b0d7d5ff05721f5c
--- /dev/null
+++ b/scripts/i2cresetCLK.py
@@ -0,0 +1,70 @@
+#from gpiozero import LED,Button
+import RPi.GPIO as GPIO
+SCL=24
+SDA=23
+Addr=0x20 #SWITCH
+#Addr=0x20 #io expander
+Value=0
+data=[(Addr<<1)+0,Value] #Write
+#data=[Addr<<1+1] #Read
+
+GPIO.setmode(GPIO.BCM)
+
+GPIO.setup(SDA,GPIO.IN)
+GPIO.setup(SCL,GPIO.IN)
+print("SDA high",GPIO.input(SDA)==1)
+print("SCL high",GPIO.input(SCL)==1)
+
+GPIO.setup(SDA,GPIO.OUT)
+GPIO.setup(SCL,GPIO.OUT)
+
+GPIO.output(SDA,1)
+GPIO.output(SCL,1)
+
+#Start
+#GPIO.output(SDA,0)
+#GPIO.setup(SDA,GPIO.OUT)
+GPIO.output(SDA,0)
+GPIO.output(SCL,0)
+
+for b in data:
+ ba="{0:{fill}8b}".format(b,fill='0')
+ print("Sending",ba)
+ for bit in ba:
+#   if int(bit)==0: 
+#      GPIO.setup(SDA,GPIO.OUT)
+#      GPIO.output(SDA,0)
+#   else:
+#      GPIO.setup(SDA,GPIO.IN)
+   GPIO.output(SDA,int(bit))
+   GPIO.output(SCL,1)
+   GPIO.output(SCL,0)
+
+
+ GPIO.setup(SDA,GPIO.IN)
+# GPIO.output(SDA,0)
+# print("Ack",GPIO.input(SDA)==0)
+# GPIO.setup(SDA,GPIO.OUT)
+
+ #ack clock
+ GPIO.output(SCL,1)
+# GPIO.setup(SDA,GPIO.IN)
+ print("Ack",GPIO.input(SDA)==0)
+ GPIO.output(SCL,0)
+ print("Ack released",GPIO.input(SDA)==1)
+ GPIO.setup(SDA,GPIO.OUT)
+
+#Stop
+#GPIO.output(SDA,0)
+#GPIO.setup(SDA,GPIO.OUT)
+GPIO.output(SDA,0)
+GPIO.output(SCL,1)
+GPIO.output(SDA,1)
+#GPIO.setup(SDA,GPIO.IN)
+
+GPIO.setup(SDA,GPIO.IN)
+GPIO.setup(SCL,GPIO.IN)
+print("SDA high",GPIO.input(SDA)==1)
+print("SCL high",GPIO.input(SCL)==1)
+GPIO.cleanup()
+
diff --git a/scripts/test_common.py b/scripts/test_common.py
index f9e5b4273446be810256f18409c13ae1be6de240..6df8d703b8cf7868d60474dffd610dad8406eb1e 100644
--- a/scripts/test_common.py
+++ b/scripts/test_common.py
@@ -1,6 +1,5 @@
 #Address="opc.tcp://odroidRCU2:4842/"
-Address="opc.tcp://dop444:4840/"
-#Address="opc.tcp://ltspi:4842/"
+Address="opc.tcp://LTSpi:4842/"
 import sys
 sys.path.insert(0, "..")
 import logging
@@ -28,13 +27,11 @@ def disconnect():
 
 def get_value(name):
   var1 = root.get_child(["0:Objects", "2:PCC", "2:"+name])
-#  return var1.get_value()
-  return var1.get_data_value()
+  return var1.get_value()
 
 def set_value(name,value):
   var1 = root.get_child(["0:Objects", "2:PCC", "2:"+name])
   var1.set_value(value)
-#  var1.set_data_value(value,7)
 
 def setRCUmask(rcu=[]):
     name="RCU_mask_RW"
@@ -42,7 +39,6 @@ def setRCUmask(rcu=[]):
     print(name," old:",M)
     M=[False for m in M]
     for r in rcu:
-#        M[r]=1
         M[r]=True
     set_value(name,M)
     print(name," new:",get_value(name))