diff --git a/config/RCUL.yaml b/config/RCUL.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2ba1f015b44fe2aa11ea782ce4392d571d705f16
--- /dev/null
+++ b/config/RCUL.yaml
@@ -0,0 +1,537 @@
+version: "1.0"
+description: "1234"
+
+drivers:
+ - name: I2C1 #TCA9548
+   type: i2c_switch
+   devreg: [0x70] #0x70 / 0x00=disabled
+   parameters: [1] #I2C port number
+ - name: I2C_RCU 
+   type: i2c_array #An array of similar devices connected to an I2C switch
+   parent: I2C1
+   parameters: [0,31] #start,number of RCUs
+   status: RCU_I2C_STATUS
+ - name: I2Cbb1 
+   type: i2cbitbang1 #I2C bitbang via GPIO expander
+   devreg: [IO3.GPIO2,IO3.GPIO2,IO3.CONF2]
+   parameters: [5,6,6] #pins
+   parent: I2C_RCU
+ - name: I2Cbb2
+   type: i2cbitbang1
+   devreg: [IO3.GPIO2,IO3.GPIO2,IO3.CONF2]
+   parameters: [4,6,6]
+   parent: I2C_RCU
+ - name: I2Cbb3
+   type: i2cbitbang1
+   devreg: [IO3.GPIO2,IO3.GPIO2,IO3.CONF2]
+   parameters: [3,6,6]
+   parent: I2C_RCU
+ - name: SPIbb1 
+   type: spibitbang1 #SPI bitbang via GPIO expander: CLK, SDIO, SDIOdir,CS
+   devreg: [IO3.GPIO1,IO3.GPIO1,IO3.CONF1,IO3.GPIO2]
+   parameters: [1,0,0,0]
+   parent: I2C_RCU
+ - name: SPIbb2
+   type: spibitbang1
+   devreg: [IO3.GPIO1,IO3.GPIO1,IO3.CONF1,IO3.GPIO2]
+   parameters: [3,2,2,1]
+   parent: I2C_RCU
+ - name: SPIbb3
+   type: spibitbang1
+   devreg: [IO3.GPIO1,IO3.GPIO1,IO3.CONF1,IO3.GPIO2]
+   parameters: [5,4,4,2]
+   parent: I2C_RCU
+
+#This is the I2C devices in the RCU
+device_registers:
+ - name: IO
+   dim: 3
+   description: [IO-Expander for filter selection,IO-Expander for ON/OFF, Band, BUFx2,IO-Expander for ADC control]
+   address: [0x75,0x76,0x20]
+   device: [TCA9539,TCA9539,TCA6416]
+   driver: I2C1
+   registers:
+   - name: CONF1
+     description: Direction of port1
+     address: 6
+     store: True
+   - name: CONF2
+     description: Direction of port2
+     address: 7
+     store: True
+   - name: GPIO1
+     description: Input/Ouput port 1
+     address: [0,2]  #Read / Write address different
+     store: True
+   - name: GPIO2
+     description: Input/Ouput port 2
+     address: [1,3]
+     store: True
+
+ - name: ROM
+   description: IO-Expander for filter selection
+   address: 0x50
+   driver: I2C1
+   registers:
+   - name: ID
+     description: Random
+     address: 0xfc
+   - name: Version
+     description: Set in production
+     address: 0
+ 
+ - name: AN
+   description: Monitor ADC on RCU
+   address: 0x74
+   device: LTC2495
+   driver: I2C1
+   registers:
+   - name: V_1v8
+     address: 0xB080
+   - name: V_2v5
+     address: 0xB880
+   - name: V_3v3
+     address: 0xB180
+   - name: I_Ant0
+     address: 0xB980
+   - name: I_Ant1
+     address: 0xB280
+   - name: I_Ant2
+     address: 0xBA80
+   - name: V_Ant_I0
+     address: 0xB380
+   - name: V_Ant_O0
+     address: 0xBB80
+   - name: V_Ant_I1
+     address: 0xB480
+   - name: V_Ant_O1
+     address: 0xBC80
+   - name: V_Ant_I2
+     address: 0xB580
+   - name: V_Ant_O2
+     address: 0xBD80
+   - name: Temp
+     address: 0xA0C0
+
+#This 'special' devices that uses I2C
+
+ - name: HB_UC
+   description: RCU microcontroller 
+   address: 0x40
+   driver: I2C1
+   registers:
+   - name: ID
+     description: Device ID
+     address: 0
+
+ - name: ADC
+   dim: 3
+   description:  ADC SPI control
+   device: AD9683
+   driver: [SPIbb1,SPIbb2,SPIbb3]
+   registers:
+    - name: PLL_stat
+      description: PLL locked status
+      address: 0x0A
+    - name: JESD_control1
+      description: JESD link control
+      address: 0x5F
+    - name: SYNC_control
+      address: 0x3A
+    - name: CML_level
+      description: CML output adjust
+      address: 0x15
+    - name: Offset
+      address: 0x10
+    - name: Update
+      description: Global device uptate
+      address: 0xFF
+
+ - name: DTH
+   dim: 3
+   description: CW dither source
+   device: SI4012
+   driver: [I2Cbb1,I2Cbb1,I2Cbb1]
+   address: 0x70
+   registers:
+    - name: Freq
+      description: Frequency
+      address: [0x1240,0x1140]
+    - name: Property
+      description: Properties
+      address: [0x12,0x11]
+    - name: Start
+      description: Start CW
+      address: [0x62,0x62]
+    - name: Stop
+      description: Stop CW
+      address: [0x67,0x67]
+    - name: Rev
+      address: 0x10
+
+variables:
+   - name: Ant_mask
+     description: Only masked RF chains are updated
+     driver: I2C_RCU
+     rw:  variable #server RW variable, not linked to IO
+     dtype: boolean
+     dim: 96
+
+   - name: RCU_mask
+     description: Only masked RCUs are updated
+     driver: I2C_RCU
+     rw:  variable #server RW variable, not linked to IO
+     dtype: boolean
+     dim: 32
+
+   - name: RCU_I2C_STATUS
+     description: 0=Good, 1=No communication, 2=error
+     driver: I2C_RCU
+     rw:  ro #server RW variable, not linked to IO
+     dtype: uint8
+     mask: RCU_mask
+     dim: 32
+
+#   - name: RCU_state
+#     description: State of RCUs 0=unknown, 1=ready, 2=busy, 3= wait PPS, 4=error
+#     driver: I2C_RCU
+#     rw:  ro #server variable, not linked to IO
+#     dtype: uint8
+#     dim: 1
+
+   - name: RCU_translator_busy
+     description: False when idle
+     rw:  ro #server variable, not linked to IO
+     dtype: boolean
+     dim: 1
+
+   - name: RCU_attenuator
+     description: Attenuator before ADC
+     driver: I2C_RCU
+     devreg:  [IO1.GPIO1,IO1.GPIO2,IO2.GPIO1]
+     bitoffset: [0,0,0]
+     width: 5
+     rw:  rw
+     dtype: uint8
+     dim: 96
+     mask: Ant_mask
+
+   - name: RCU_band
+     description: Band select switch 1=10MHz,2=30MHz
+     driver: I2C_RCU
+     devreg:  [IO2.GPIO2,IO2.GPIO2,IO2.GPIO2]
+     bitoffset: [0,2,4]
+     width: 2
+     rw:  rw
+     dtype: uint8
+     dim: 96
+     mask: Ant_mask
+
+   - name: [RCU_IO1_GPIO1,RCU_IO1_GPIO2,RCU_IO2_GPIO1,RCU_IO2_GPIO2,RCU_IO3_GPIO1,RCU_IO3_GPIO2]
+     driver: I2C_RCU
+     devreg:  [IO1.GPIO1,IO1.GPIO2,IO2.GPIO1,IO2.GPIO2,IO3.GPIO1,IO3.GPIO2]
+     width: 8
+     rw:  ro
+     dtype: uint8
+     dim: 32
+     mask: RCU_mask
+     debug: True
+
+   - name: RCU_LED0
+     driver: I2C_RCU
+     description: LED on RCU
+     devreg:  IO2.GPIO2
+     bitoffset: 6
+     width: 1
+     rw:  rw
+     dtype: boolean
+     dim: 32
+     mask: RCU_mask
+
+   - name: RCU_LED1
+     driver: I2C_RCU
+     description: LED on RCU
+     devreg:  IO2.GPIO2
+     bitoffset: 7
+     width: 1
+     rw:  rw
+     dtype: boolean
+     dim: 32
+     mask: RCU_mask
+
+   - name: RCU_temperature
+     description: Temperature sensor on RCU
+     driver: I2C_RCU
+     devreg:  AN.Temp
+     width: 23
+     scale: 3.8265e-3
+     rw:  ro
+     dtype: double
+     dim: 32
+     monitor: true
+     mask: RCU_I2C_STATUS
+
+   - name: RCU_3V3
+     driver: I2C_RCU
+     devreg:  AN.V_3v3
+     width: 23
+     scale: 1.463e-6
+     rw:  ro
+     dtype: double
+     dim: 32
+#     monitor: true
+     mask: RCU_I2C_STATUS
+
+   - name: RCU_1V8
+     driver: I2C_RCU
+     devreg:  AN.V_1v8
+     width: 23
+     scale: 7.1526e-7
+     rw:  ro
+     dtype: double
+     dim: 32
+#     monitor: true
+     mask: RCU_I2C_STATUS
+
+   - name: RCU_2V5
+     driver: I2C_RCU
+     devreg:  AN.V_2v5
+     width: 23
+     scale: 7.1526e-7
+     rw:  ro
+     dtype: double
+     dim: 32
+#     monitor: true
+     mask: RCU_I2C_STATUS
+
+   - name: ANT_Vout
+     driver: I2C_RCU
+     devreg:  [AN.V_Ant_O0,AN.V_Ant_O1,AN.V_Ant_O2]
+     width: 23
+     scale: 2.7895e-6
+     rw:  ro
+     dtype: double
+     dim: 96
+     mask: Ant_mask
+
+   - name: ANT_Vin
+     driver: I2C_RCU
+     devreg:  [AN.V_Ant_I0,AN.V_Ant_I1,AN.V_Ant_I2]
+     width: 23
+     scale: 2.7895e-6
+     rw:  ro
+     dtype: double
+     dim: 96
+     mask: Ant_mask
+
+   - name: ANT_I
+     driver: I2C_RCU
+     devreg:  [AN.I_Ant0,AN.I_Ant1,AN.I_Ant2]
+     width: 23
+     scale: 7.1526e-8
+     rw:  ro
+     dtype: double
+     dim: 96
+     mask: Ant_mask
+
+   - name: RCU_Pwr_dig
+     description: Enable LDOs
+     driver: I2C_RCU
+     devreg:  IO2.GPIO1
+     width: 1
+     bitoffset: 6
+     rw:  ro
+     dtype: boolean
+     dim: 32
+     mask: RCU_mask
+
+
+
+   - name: RCU_ID
+     description: Unique RCU ID
+     driver: I2C_RCU
+     devreg:  ROM.ID
+     width: 32
+     rw:  ro
+     dtype: uint32
+     dim: 32
+     mask: RCU_mask
+
+   - name: RCU_version
+     description: RCU version number
+     driver: I2C_RCU
+     devreg:  ROM.Version
+     width: 80  #10 characters
+     rw:  ro
+     dtype: string
+     dim: 32
+     mask: RCU_mask
+     
+   - name: RCU_ADC_lock
+     description: 0x81=locked
+     driver: I2C_RCU
+     devreg:  [ADC1.PLL_stat,ADC2.PLL_stat,ADC3.PLL_stat]
+     width: 8
+     rw:  ro
+     dtype: uint8
+     dim: 96
+     monitor: true
+
+   - name: RCU_ADC_sync
+     driver: I2C_RCU
+     devreg:  [ADC1.SYNC_control,ADC2.SYNC_control,ADC3.SYNC_control]
+     width: 8
+     rw:  ro
+     dtype: uint8
+     dim: 96
+     debug: true
+
+   - name: RCU_ADC_JESD
+     driver: I2C_RCU
+     devreg:  [ADC1.JESD_control1,ADC2.JESD_control1,ADC3.JESD_control1]
+     width: 8
+     rw:  ro
+     dtype: uint8
+     dim: 96
+     debug: true
+
+   - name: RCU_ADC_CML_level
+     driver: I2C_RCU
+     devreg:  [ADC1.CML_level,ADC2.CML_level,ADC3.CML_level]
+     width: 8
+     rw:  ro
+     dtype: uint8
+     dim: 96
+     debug: true
+
+   - name: RCU_DTH_freq
+     driver: I2C_RCU
+     devreg:  [DTH1.Freq,DTH2.Freq,DTH3.Freq]
+     width: 32
+     rw:  rw
+     dtype: uint32
+     dim: 96
+     mask: Ant_mask
+
+   - name: RCU_DTH_Rev
+     driver: I2C_RCU
+     devreg:  [DTH1.Rev,DTH2.Rev,DTH3.Rev]
+     width: 88
+     rw:  rw
+     dtype: uint32
+     dim: 96
+     mask: Ant_mask
+
+methods:
+  - name: RCU_Init #Called after startup to load. Should have all stored registers  
+    driver: I2C_RCU
+    debug: True
+    instructions:   
+    - RCU_IO1_GPIO1: Update
+    - RCU_IO1_GPIO2: Update
+    - RCU_IO2_GPIO1: Update
+    - RCU_IO2_GPIO2: Update
+    - RCU_IO3_GPIO1: Update
+    - RCU_IO3_GPIO2: Update
+#    - IO1.GPIO2: Update
+#    - IO2.GPIO1: Update
+#    - IO2.GPIO2: Update
+#    - IO3.GPIO1: Update
+#    - IO3.GPIO2: Update
+    - IO3.CONF1: Update
+    - RCU_update: 0
+
+  - name: RCU_SETUP_IO1
+    driver: I2C_RCU
+    mask: RCU_mask
+    rw: hidden
+    instructions:
+     - IO2.CONF1: 0    #Set device register, can also specify a register adress direction e.g. OIO2.0: 0
+     - IO2.GPIO1: 0x4A
+     - IO2.GPIO2: 0x55
+     - IO1.GPIO1: 0xCA
+     - IO1.GPIO2: 0xCA
+     - IO2.CONF2: 0
+     - IO1.CONF1: 0
+     - IO1.CONF2: 0
+
+  - name: RCU_on
+    driver: I2C_RCU
+    mask: RCU_mask
+    instructions:
+     - RCU_I2C_STATUS: 0
+     - RCU_SETUP_IO1: 0    
+     - IO3.GPIO1: 0x15
+     - IO3.GPIO2: 0x47
+     - IO3.CONF1: 0
+     - IO3.CONF2: 0
+#     - RCU_GPIO1: Update
+#     - RCU_GPIO2: Update
+#     - RCU_attenuator: [10,10,10]  #Set OPC-UA variable
+     - WAIT: 500         #ms to wait
+     - ADC1_on: 0        #call another opc-ua method
+     - ADC2_on: 0
+     - ADC3_on: 0
+     - WAIT: 500         #ms to wait
+     - RCU_update: 0
+
+  - name: RCU_update
+    driver: I2C_RCU
+    mask: RCU_mask
+    debug: True
+    instructions:
+      - RCU_Pwr_dig: Update  #Read value and update the OPC-UA variable
+      - RCU_ID: Update
+      - RCU_version: Update
+      - RCU_LED0: Update
+      - RCU_attenuator: Update
+      - RCU_band: Update
+      - RCU_ADC_lock: Update
+      - RCU_ADC_sync: Update
+
+
+  - name: ADC1_on
+    driver: I2C_RCU
+    debug: True
+#    rw: hidden
+    instructions:
+     - ADC1.JESD_control1 : 0x14
+     - ADC1.SYNC_control: 1  #Setup ADCs
+     - ADC1.CML_level: 0x7
+     - ADC1.Update: 1       #Needed to update ADC registers
+     
+  - name: ADC2_on
+    driver: I2C_RCU
+    debug: True
+#    rw: hidden
+    instructions:
+     - ADC2.JESD_control1 : 0x14
+     - ADC2.SYNC_control: 1  #Setup ADCs
+     - ADC2.CML_level: 0x7
+     - ADC2.Update: 1       #Needed to update ADC registers
+
+  - name: ADC3_on
+    driver: I2C_RCU
+    debug: True
+#    rw: hidden
+    instructions:
+     - ADC3.JESD_control1 : 0x14
+     - ADC3.SYNC_control: 1  #Setup ADCs
+     - ADC3.CML_level: 0x7
+     - ADC3.Update: 1       #Needed to update ADC registers
+
+  - name: RCU_off
+    driver: I2C_RCU
+    mask: RCU_mask
+    instructions:
+     - RCU_I2C_STATUS: 0
+     - RCU_Pwr_dig: 0 #Switch power off
+     - IO2.GPIO1: 0
+     - IO2.GPIO2: 0
+     - IO3.GPIO1: 0
+     - IO3.GPIO2: 0
+     - IO1.GPIO1: 0
+     - IO1.GPIO2: 0
+     - RCU_update: 0
+     #todo, also make all GPIO pins (except power enables) inputs to remove all power from devices.
+
diff --git a/i2cserv/i2c_array.py b/i2cserv/i2c_array.py
index bb0dd699c23863c5f007862c5072e5eda00bbe63..41c4d8823e1057017080128bb05948b1b92dca94 100644
--- a/i2cserv/i2c_array.py
+++ b/i2cserv/i2c_array.py
@@ -201,7 +201,8 @@ class i2c_array(i2c_dev):
 #        print(width,bitoffset,l1)
         value2=value
         reg=devreg['register_R']
-        if reg>255: #This is for the monitor ADC
+        if reg>255: #This is for the monitor ADC (+ DTH)
+          callback(0,[250],read=3)
           if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False;
           callback(0,[250],read=3)
           if not(callback(devreg['addr'],value2,read=1)): return False;
diff --git a/i2cserv/i2c_switch.py b/i2cserv/i2c_switch.py
index fc59cf5bfd9e2ab206b394f4aaf9f794d6e4153e..c77bb902b3f0c194901f395e0006adb4388249c4 100644
--- a/i2cserv/i2c_switch.py
+++ b/i2cserv/i2c_switch.py
@@ -8,7 +8,7 @@ class i2c_switch(i2c):
         i2c.__init__(self,config)
         self.SWaddr=config['devreg'][0]['addr']
         self.CurrentChannel=0
-        self.NoSwitch=False;
+        self.NoSwitch=self.SWaddr==0;
         logging.info("i2c switch at address "+str(self.SWaddr))
         if self.NoSwitch:
            logging.warn("i2c switch disabled!")
diff --git a/i2cserv/i2cbitbang1.py b/i2cserv/i2cbitbang1.py
index 8aacf743f7fe6f395dfdfb6ab6d1fc7238da1bbb..ea1adfe7e692eac90d15c682682b06a3c4a97804 100644
--- a/i2cserv/i2cbitbang1.py
+++ b/i2cserv/i2cbitbang1.py
@@ -2,146 +2,143 @@ from enum import Enum
 import logging
 import numpy as np
 from .hwdev import hwdev
+import time
 #This is copy of spibitbang. Need to be updated!!
 class SPIBB_pins(Enum):
     CLK = 0  
-    SDIO = 1  
-    SDIOdir = 2 
-    CS = 3  
+    SDA = 1  
+    SDAdir = 2 
 
 class i2cbitbang1(hwdev):
   def __init__(self,config):
     hwdev.__init__(self,config)
-    logging.info("i2cbitbang todo")
 
   def i2csetget(self,addr,data,reg=None,read=0):
-    logging.info("i2cbitbang todo")
+#    print("I2Cbbset",addr,data,reg,read);
+    if read==0: 
+       if not(reg is None): 
+            if reg>255: data=[reg//256,reg%256]+data;
+            else:       data=[reg]+data;
+       return self.SetI2Cbb(addr,data)
+    if read==2: return self.SetI2Cbb(addr,data)
+    elif read==1: 
+       if not(reg is None): 
+            if reg>255: reg=[reg//256,reg%256];
+            else:       reg=[reg];
+            self.SetI2Cbb(addr,reg)
+       return self.GetI2Cbb(addr,data)
+    elif read==3: 
+              time.sleep(data[0]/1000);
+              return True
+    else: logging.warn("Not implemented!")
     return False;
 
 
-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]
+  def SetI2Cbb(self,address,value):
+        SDAdev=self.conf['devreg'][SPIBB_pins.SDA.value]
+        SDApin=self.conf['parameters'][SPIBB_pins.SDA.value]
+        CLKdev=self.conf['devreg'][SPIBB_pins.CLK.value]
+        CLKpin=self.conf['parameters'][SPIBB_pins.CLK.value]
+        DIRdev=self.conf['devreg'][SPIBB_pins.SDAdir.value]
+        DIRpin=self.conf['parameters'][SPIBB_pins.SDAdir.value]
+        SetI2C=self.conf['parentcls'].SetVarValue
+        GetI2C=self.conf['parentcls'].GetVarValue
 
-        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
+#        ADC_address=dev.Register_W<<1; #Write
+        ADC_address=address<<1;#dev.Register_W<<1; #Write
+        logging.info(str(("I2Cbb set",hex(ADC_address),value)))
         
-        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,SPIdev,I2Cdev,I2Cpins,value):
-#Read 3 SPI devices in parallel from same IOexpander
-        ADC_reg_address=SPIdev[0].Register_R
-        Nv=len(SPIdev)
-        def Setbit(pintype,value):
-           for i in range(1,Nv):
-             SetI2C(RCUi,I2Cdev[i][pintype],1,I2Cpins[i][pintype],[value],buffer=True) 
-           SetI2C(RCUi,I2Cdev[0][pintype],1,I2Cpins[0][pintype],[value]) 
-        def Getbit(pintype):
-           print("N=",Nv,len(value))
-           retvalue=np.zeros_like(value)
-           retvalue[0::Nv]=GetI2C(RCUi,I2Cdev[0][pintype],1,I2Cpins[0][pintype])
-           for i in range(1,Nv):
-             retvalue[i::Nv]=GetI2C(RCUi,I2Cdev[i][pintype],1,I2Cpins[i][pintype],buffer=True)
-           return retvalue
-           
-        CLK=0
-        SDIO=1
-        SDIOdir=2
-        CS=3
-
-        logging.debug(str(("SPIbb get",ADC_reg_address)))
-          
-        ADC_bytes = 0x00
-        ADC_rw    = 0x01 # 0 for write, 1 for read
+        SetI2C(DIRdev,1,DIRpin,[1]) #Input = high
+        SetI2C(CLKdev,1,CLKpin,[1]) #Should be high
+	#start
+        SetI2C(SDAdev,1,SDApin,[0]) #Output = low
+        SetI2C(DIRdev,1,DIRpin,[0]) #Output = low
+        SetI2C(CLKdev,1,CLKpin,[0]) 
+        ack=[0];
+        def TXbyte(b):
+          for bit in "{0:{fill}8b}".format(b, fill='0'):
+              SetI2C(DIRdev,1,DIRpin,[int(bit)]) 
+              SetI2C(CLKdev,1,CLKpin,[1]) 
+              SetI2C(CLKdev,1,CLKpin,[0]) 
+          SetI2C(DIRdev,1,DIRpin,[1]) #input 
+#          GetI2C(SDAdev,1,SDApin,ack)
+#          print("Ack=",ack[0]);
+          SetI2C(CLKdev,1,CLKpin,[1]) 
+          GetI2C(SDAdev,1,SDApin,ack)
+#          print("Ack=",ack[0]);
+          SetI2C(CLKdev,1,CLKpin,[0]) 
+          return ack[0];
+ 
+        TXbyte(ADC_address);
+        for v in value:
+           TXbyte(v);
+        #stop
+        SetI2C(DIRdev,1,DIRpin,[0]) #low
+        SetI2C(CLKdev,1,CLKpin,[1]) #Should be high
+        SetI2C(DIRdev,1,DIRpin,[1]) #Input = high
         
-        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) 
+        return True;
 
-#        Setbit(CS,1) #disable
-        Setbit(SDIOdir,1) #input
-        Setbit(CLK,0) 
+  def GetI2Cbb(self,reg_address,value):
+        SDAdev=self.conf['devreg'][SPIBB_pins.SDA.value]
+        SDApin=self.conf['parameters'][SPIBB_pins.SDA.value]
+        CLKdev=self.conf['devreg'][SPIBB_pins.CLK.value]
+        CLKpin=self.conf['parameters'][SPIBB_pins.CLK.value]
+        DIRdev=self.conf['devreg'][SPIBB_pins.SDAdir.value]
+        DIRpin=self.conf['parameters'][SPIBB_pins.SDAdir.value]
+        SetI2C=self.conf['parentcls'].SetVarValue
+        GetI2C=self.conf['parentcls'].GetVarValue
+
+
+        ADC_address=1+(reg_address<<1); #Read
+        logging.info(str(("I2Cbb get",hex(ADC_address),value)))
+
+        SetI2C(DIRdev,1,DIRpin,[1]) #Input = high
+        SetI2C(CLKdev,1,CLKpin,[1]) #Should be high
+	#start
+        SetI2C(SDAdev,1,SDApin,[0]) #Output = low
+        SetI2C(DIRdev,1,DIRpin,[0]) #Output = low
+        SetI2C(CLKdev,1,CLKpin,[0]) 
+        ack=[0];
+        def TXbyte(b):
+          for bit in "{0:{fill}8b}".format(b, fill='0'):
+              SetI2C(DIRdev,1,DIRpin,[int(bit)]) 
+              SetI2C(CLKdev,1,CLKpin,[1]) 
+              SetI2C(CLKdev,1,CLKpin,[0]) 
+          SetI2C(DIRdev,1,DIRpin,[1]) #input 
+#          GetI2C(SDAdev,1,SDApin,ack)
+#          print("Ack=",ack[0]);
+          SetI2C(CLKdev,1,CLKpin,[1]) 
+          GetI2C(SDAdev,1,SDApin,ack)
+#          print("Ack=",ack[0]);
+          SetI2C(SDAdev,1,SDApin,[0]) 
+          SetI2C(CLKdev,1,CLKpin,[0]) 
+          return ack[0];
+
+        def RXbyte(last=False):
+          b=0;
+          for i in range(8):
+              SetI2C(CLKdev,1,CLKpin,[1]) 
+              GetI2C(SDAdev,1,SDApin,ack)
+#              print(ack[0])
+              b=(b<<1)+ack[0];
+              SetI2C(CLKdev,1,CLKpin,[0]) 
+#          print("RXbyte",hex(b));
+          SetI2C(SDAdev,1,SDApin,[0]) 
+          SetI2C(DIRdev,1,DIRpin,[1 if last else 0]) #outout = low = ack 
+          SetI2C(CLKdev,1,CLKpin,[1]) 
+          SetI2C(CLKdev,1,CLKpin,[0]) 
+          SetI2C(DIRdev,1,DIRpin,[1])
+          return b;
+ 
+        TXbyte(ADC_address);
+        print("si status:",hex(RXbyte()))#should be 0x80
+        for i in range(len(value)):
+          value[i]=RXbyte(last=(i==len(value)-1))
+        #stop
+        #SetI2C(DIRdev,1,DIRpin,[0]) #low
+        SetI2C(CLKdev,1,CLKpin,[1]) #Should be high
+        SetI2C(DIRdev,1,DIRpin,[1]) #Input = high
 
-          #    print("read byte")
-#        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/log.txt b/log.txt
new file mode 100644
index 0000000000000000000000000000000000000000..71156f50a3ec5dff55b1112e09a980860fe23f56
--- /dev/null
+++ b/log.txt
@@ -0,0 +1,8 @@
+ID= ['0x0', '0x81', '0x3a', '0x24']
+Frequency set= 150000000
+['0x8', '0xf0', '0xd1', '0x80']
+si status: 0x80
+si status: 0x80
+si status: 0x80
+Frequency read back= 150000000
+['0x8', '0xf0', '0xd1', '0x80', '0x8', '0xf0', '0xd1', '0x80', '0x8', '0xf0', '0xd1', '0x80', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0']
diff --git a/testRCUL.py b/testRCUL.py
new file mode 100644
index 0000000000000000000000000000000000000000..f9f3525492baa6667ceea1d6c2fa56fbe1b80d4d
--- /dev/null
+++ b/testRCUL.py
@@ -0,0 +1,168 @@
+import logging
+import argparse
+from opcuaserv import opcuaserv
+from opcuaserv import i2client
+from opcuaserv import yamlreader
+#from opcuaserv import pypcc2
+from i2cserv import i2cthread
+import threading
+import time
+import sys
+import signal
+from yamlconfig import Find;
+import yamlconfig as yc
+
+logging.basicConfig(level="WARNING",format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s')
+
+RunTimer=True;
+#def signal_handler(sig, frame):
+#    logging.warn('Stop signal received!')
+#    global RunTimer; 
+#    RunTimer=False
+#signal.signal(signal.SIGINT, signal_handler)
+
+#logging.info("Start I2C processes")   
+#threads=[]
+#I2Cclients=[]
+name='RCUL'
+#RCU_I2C=i2client.i2client(name=name)
+
+conf=yc.yamlconfig(name)
+conf.linkdevices()
+conf.loaddrivers()
+conf.linkdrivers()
+
+def GetVal(name,N=1):
+ varid=conf.getvarid(name);
+ var1=conf.getvars()[varid]
+ drv=var1.get('drivercls');
+ mask=[True]*N+[False]*((32-1)*N);
+ data=drv.OPCUAReadVariable(varid,var1,mask)
+ return data[0].data,var1
+
+data,var1=GetVal('RCU_ID');
+print("ID=",[hex(d) for d in data[:4]]);
+
+if False:
+ data,var1=GetVal('RCU_temperature');
+ D=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
+ print("Temp=",D,"K")
+ if (D<290) or (D>350): exit()
+
+ data,var1=GetVal('RCU_3V3');
+ D=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
+ print("3V3=",D,"V")
+ if (D<3.2) or (D>3.4): exit()
+#print("data=",[hex(d) for d in data[:3]]);
+
+
+def SetRegister(regname,value):
+  methodid=conf.getmethodid("RCU_on");
+  var1=conf.getmethod(methodid)
+  drv=var1.get('drivercls');
+  v1=conf.getdevreg(regname)
+  drv2=v1.get('drivercls')
+  mask=[True]+[False]*31;
+  if drv:  drv.Setdevreg(v1,value,mask)
+  elif drv2: drv2.Setdevreg(v1,value,mask)
+  else: logging.warn("Driver not specified for instruction"+key)
+
+if False:
+ SetRegister("IO1.GPIO1",[0])
+ SetRegister("IO1.GPIO2",[0x80]) #Analog power on
+ SetRegister("IO2.GPIO1",[0x40]) #Digital power on
+ SetRegister("IO2.GPIO2",[0])
+
+ SetRegister("IO1.CONF1",[0])
+ SetRegister("IO1.CONF2",[0])
+ SetRegister("IO2.CONF1",[0x80]) #Pgood on P07
+ SetRegister("IO2.CONF2",[0])
+
+ print("IO expander status:");
+ data,var=GetVal('RCU_IO1_GPIO1');print("IO1_1",hex(data[0]))
+ data,var=GetVal('RCU_IO1_GPIO2');print("IO1_2",hex(data[0]))
+ data,var=GetVal('RCU_IO2_GPIO1');print("IO2_1",hex(data[0]))
+ data,var=GetVal('RCU_IO2_GPIO2');print("IO2_2",hex(data[0]))
+
+if False:
+ data,var1=GetVal('RCU_1V8');
+ D=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
+ print("1V8=",D,"")
+
+ data,var1=GetVal('RCU_2V5');
+ D=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
+ print("2V5=",D,"")
+
+if False:
+ data,var1=GetVal('ANT_Vin');
+ D0=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
+ D1=((data[3]*256+data[4])*256+data[5])*var1.get('scale',1.)
+ D2=((data[6]*256+data[7])*256+data[8])*var1.get('scale',1.)
+ print("Vant_in=",D0,D1,D2)
+
+# SetRegister("IO1.GPIO1",[0xC0]) #Antenna power on
+# SetRegister("IO1.GPIO2",[0xC0]) #Analog power on
+
+ data,var1=GetVal('ANT_Vout');
+ D0=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
+ D1=((data[3]*256+data[4])*256+data[5])*var1.get('scale',1.)
+ D2=((data[6]*256+data[7])*256+data[8])*var1.get('scale',1.)
+ print("Vant_out=",D0,D1,D2)
+
+ data,var1=GetVal('ANT_I');
+ D0=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
+ D1=((data[3]*256+data[4])*256+data[5])*var1.get('scale',1.)
+ D2=((data[6]*256+data[7])*256+data[8])*var1.get('scale',1.)
+ print("Iant=",D0,D1,D2)
+
+if False:
+ SetRegister("IO3.GPIO1",[0x15]) #ADC_SDIO=high, clk=low,  DTH_EN=low
+ SetRegister("IO3.GPIO2",[0x47]) #ADC SC=high, DTH_SDA=high
+ SetRegister("IO3.CONF1",[0]) #All output
+ SetRegister("IO3.CONF2",[0])
+ data,var=GetVal('RCU_IO3_GPIO1');print("IO3_1",hex(data[0]))
+ data,var=GetVal('RCU_IO3_GPIO2');print("IO3_2",hex(data[0]))
+
+if False:
+ #Test reading register from ADCs
+ data,var=GetVal('RCU_ADC_JESD');print("ADC JESD",[hex(d) for d in data[:3]])
+
+ #Test writing ADC register
+ SetRegister("ADC1.SYNC_control",[1])
+ SetRegister("ADC1.Update",[1])
+ data,var=GetVal('RCU_ADC_sync');print("ADC sync",[hex(d) for d in data[:3]])
+
+#Need to update I2c bitbang....
+if True:
+ SetRegister("IO3.GPIO1",[0x15]) #ADC_SDIO=high, clk=low,  DTH_SDN=low
+ SetRegister("IO3.GPIO2",[0x3F]) #ADC SC=high, DTH_SDA=low, DTH_CLK=high
+ SetRegister("IO3.CONF1",[0]) #All output
+ SetRegister("IO3.CONF2",[0x40]) #DTH_SDA=input
+
+# data,var=GetVal('RCU_IO3_GPIO1');print("IO3_1",hex(data[0]))
+# data,var=GetVal('RCU_IO3_GPIO2');print("IO3_2",hex(data[0]))
+ f=int(150e6)
+ print("Frequency set=",f)
+ d=[0]*4;
+ for i in range(4):
+   d[3-i]=f%256;f//=256
+# print([hex(h) for h in d])
+ SetRegister("DTH1.Freq",d) #DTH_SDA=input
+
+ data,var1=GetVal("RCU_DTH_freq")
+# data,var1=GetVal("RCU_DTH_Rev")
+ f=0;
+ for i in range(4):
+  f=f*256+data[i];
+ print("Frequency read back=",f)
+# print([hex(h) for h in data[:30]])
+
+
+#print(data)
+#scale=float(scale)
+#data2=[(d*scale) for d in data2]
+
+#print("ID=",[hex(d) for d in data[:4]]);
+
+
+
diff --git a/testRCUL_on.py b/testRCUL_on.py
new file mode 100644
index 0000000000000000000000000000000000000000..1ffe1efc477a287c8f4026c07a86414dd365898b
--- /dev/null
+++ b/testRCUL_on.py
@@ -0,0 +1,204 @@
+import logging
+import argparse
+from opcuaserv import opcuaserv
+from opcuaserv import i2client
+from opcuaserv import yamlreader
+#from opcuaserv import pypcc2
+from i2cserv import i2cthread
+import threading
+import time
+import sys
+import signal
+from yamlconfig import Find;
+import yamlconfig as yc
+
+logging.basicConfig(level="WARNING",format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s')
+RCU=5
+#Gain=0; #15dB
+#Gain=0x0a; #5dB
+#Gain=0xf; #0dB
+#Gain=0x15; #-6dB
+#Gain=[0x00,0xf,0x00]
+Gain=[0x15,0x15,0x15]
+print("Power on RCU=",RCU);
+RunTimer=True;
+#def signal_handler(sig, frame):
+#    logging.warn('Stop signal received!')
+#    global RunTimer; 
+#    RunTimer=False
+#signal.signal(signal.SIGINT, signal_handler)
+
+#logging.info("Start I2C processes")   
+#threads=[]
+#I2Cclients=[]
+name='RCUL'
+#RCU_I2C=i2client.i2client(name=name)
+
+conf=yc.yamlconfig(name)
+conf.linkdevices()
+conf.loaddrivers()
+conf.linkdrivers()
+
+def GetVal(name,N=1):
+ varid=conf.getvarid(name);
+ var1=conf.getvars()[varid]
+ drv=var1.get('drivercls');
+ mask=[False]*((32)*N);
+ mask[RCU]=True;
+ data=drv.OPCUAReadVariable(varid,var1,mask)
+ return data[0].data,var1
+
+data,var1=GetVal('RCU_ID');
+#print(data);
+i=RCU*4;
+print("ID=",[hex(d) for d in data[i:i+4]]);
+
+if True:
+ data,var1=GetVal('RCU_temperature');
+# print(data);
+ i=RCU*3;
+ D=((data[i]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
+ print("Temp=",D,"K")
+ if (D<290) or (D>350): exit()
+
+ data,var1=GetVal('RCU_3V3');
+ D=((data[i]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
+ print("3V3=",D,"V")
+ if (D<3.2) or (D>3.4): exit()
+#print("data=",[hex(d) for d in data[:3]]);
+
+
+def SetRegister(regname,value):
+  methodid=conf.getmethodid("RCU_on");
+  var1=conf.getmethod(methodid)
+  drv=var1.get('drivercls');
+  v1=conf.getdevreg(regname)
+  drv2=v1.get('drivercls')
+  mask=[False]*32;
+  mask[RCU]=True;
+  if drv:  drv.Setdevreg(v1,value,mask)
+  elif drv2: drv2.Setdevreg(v1,value,mask)
+  else: logging.warn("Driver not specified for instruction"+key)
+
+if True:
+# AntPower=0xC0
+ SetRegister("IO1.GPIO1",[Gain[0]])
+ SetRegister("IO1.GPIO2",[0x80+Gain[1]]) #Analog power on
+# SetRegister("IO1.GPIO1",[0xC0+Gain])
+# SetRegister("IO1.GPIO2",[0xC0+Gain]) #Analog power on
+ SetRegister("IO2.GPIO1",[0x40+Gain[2]]) #Digital power on
+# SetRegister("IO1.GPIO2",[0x00]) #Analog power off
+# SetRegister("IO2.GPIO1",[0x00]) #Digital power off
+ SetRegister("IO2.GPIO2",[0x15]) #Band select all band0, leds on (low) 10MHz
+# SetRegister("IO2.GPIO2",[0x2a]) #Band select all band1, leds on (low) 30MHz
+# SetRegister("IO2.GPIO2",[0x00]) #
+
+ SetRegister("IO1.CONF1",[0])
+ SetRegister("IO1.CONF2",[0])
+ SetRegister("IO2.CONF1",[0x80]) #Pgood on P07
+ SetRegister("IO2.CONF2",[0])
+
+ print("IO expander status:");
+ data,var=GetVal('RCU_IO1_GPIO1');print("IO1_1",hex(data[RCU]))
+ data,var=GetVal('RCU_IO1_GPIO2');print("IO1_2",hex(data[RCU]))
+ data,var=GetVal('RCU_IO2_GPIO1');print("IO2_1",hex(data[RCU]))
+ data,var=GetVal('RCU_IO2_GPIO2');print("IO2_2",hex(data[RCU]))
+
+if True:
+ i=RCU*3;
+ data,var1=GetVal('RCU_1V8');
+ D=((data[i]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
+ print("1V8=",D,"")
+ if (D<1.6) or (D>2.0): exit()
+
+ data,var1=GetVal('RCU_2V5');
+ D=((data[i]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
+ print("2V5=",D,"")
+#exit()
+if False:
+ data,var1=GetVal('ANT_Vin');
+ D0=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
+ D1=((data[3]*256+data[4])*256+data[5])*var1.get('scale',1.)
+ D2=((data[6]*256+data[7])*256+data[8])*var1.get('scale',1.)
+ print("Vant_in=",D0,D1,D2)
+
+
+# SetRegister("IO1.GPIO1",[0xC0]) #Antenna power on
+# SetRegister("IO1.GPIO2",[0xC0]) #Analog power on
+
+ data,var1=GetVal('ANT_Vout');
+ D0=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
+ D1=((data[3]*256+data[4])*256+data[5])*var1.get('scale',1.)
+ D2=((data[6]*256+data[7])*256+data[8])*var1.get('scale',1.)
+ print("Vant_out=",D0,D1,D2)
+
+ data,var1=GetVal('ANT_I');
+ D0=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
+ D1=((data[3]*256+data[4])*256+data[5])*var1.get('scale',1.)
+ D2=((data[6]*256+data[7])*256+data[8])*var1.get('scale',1.)
+ print("Iant=",D0,D1,D2)
+
+print("Setup ADC")
+if True:
+ SetRegister("IO3.GPIO1",[0x15]) #ADC_SDIO=high, clk=low,  DTH_EN=low
+ SetRegister("IO3.GPIO2",[0x47]) #ADC SC=high, DTH_SDA=high
+ SetRegister("IO3.CONF1",[0]) #All output
+ SetRegister("IO3.CONF2",[0])
+ data,var=GetVal('RCU_IO3_GPIO1');print("IO3_1",hex(data[RCU]))
+ data,var=GetVal('RCU_IO3_GPIO2');print("IO3_2",hex(data[RCU]))
+# data,var=GetVal('RCU_ADC_sync');print("ADC sync",[hex(d) for d in data[RCU*3:RCU*3+3]])
+ if True:
+ #Test writing ADC register
+
+  SetRegister("ADC1.SYNC_control",[1])
+  SetRegister("ADC1.JESD_control1",[0x14])
+  SetRegister("ADC1.CML_level",[0x7])
+#  SetRegister("ADC1.Offset",[0x0])
+  SetRegister("ADC1.Update",[1])
+
+  SetRegister("ADC2.SYNC_control",[1])
+  SetRegister("ADC2.JESD_control1",[0x14])
+  SetRegister("ADC2.CML_level",[0x7])
+#  SetRegister("ADC2.Offset",[0x0])
+  SetRegister("ADC2.Update",[1])
+
+  SetRegister("ADC3.SYNC_control",[1])
+  SetRegister("ADC3.JESD_control1",[0x14])
+  SetRegister("ADC3.CML_level",[0x7])
+#  SetRegister("ADC3.Offset",[0x0])
+  SetRegister("ADC3.Update",[1])
+
+if True:
+ data,var=GetVal('RCU_ADC_sync'); print("ADC sync",[hex(d) for d in data[RCU*3:RCU*3+3]])
+ data,var1=GetVal("RCU_ADC_lock");print("ADC lock",[hex(d) for d in data[RCU*3:RCU*3+3]])
+ data,var1=GetVal("RCU_ADC_CML_level");print("CML level",[hex(d) for d in data[RCU*3:RCU*3+3]])
+
+
+if True:
+ print("Switch antenna voltages on")
+# SetRegister("IO1.GPIO1",[0xC0]) #Antenna power on
+# SetRegister("IO1.GPIO2",[0xC0]) #Analog power on
+ SetRegister("IO1.GPIO1",[0xC0+Gain[0]])
+ SetRegister("IO1.GPIO2",[0xC0+Gain[1]]) #Analog power on
+
+ data,var1=GetVal('ANT_Vin');
+ i=RCU*9;
+ D0=((data[i+0]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
+ D1=((data[i+3]*256+data[i+4])*256+data[i+5])*var1.get('scale',1.)
+ D2=((data[i+6]*256+data[i+7])*256+data[i+8])*var1.get('scale',1.)
+ print("Vant_in=",D0,D1,D2)
+
+
+ data,var1=GetVal('ANT_Vout');
+ D0=((data[i+0]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
+ D1=((data[i+3]*256+data[i+4])*256+data[i+5])*var1.get('scale',1.)
+ D2=((data[i+6]*256+data[i+7])*256+data[i+8])*var1.get('scale',1.)
+ print("Vant_out=",D0,D1,D2)
+
+ data,var1=GetVal('ANT_I');
+ D0=((data[i+0]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
+ D1=((data[i+3]*256+data[i+4])*256+data[i+5])*var1.get('scale',1.)
+ D2=((data[i+6]*256+data[i+7])*256+data[i+8])*var1.get('scale',1.)
+ print("Iant=",D0,D1,D2)
+
+