From 569cf223aaf8079caa0465e70d24718f1c7b0736 Mon Sep 17 00:00:00 2001
From: kruger <kruger@astron.nl>
Date: Tue, 8 Jun 2021 14:09:56 +0100
Subject: [PATCH] HBAT working

---
 i2cserv/i2c_array.py    |  8 ++++++--
 i2cserv/i2c_switch.py   |  7 +++++--
 i2cserv/i2cthread.py    |  9 +++++----
 opcuaserv/yamlreader.py | 14 ++++++++------
 scripts/SetHBAT_BFs.py  | 37 +++++++++++++++++++++++++++++++++++++
 5 files changed, 61 insertions(+), 14 deletions(-)
 create mode 100644 scripts/SetHBAT_BFs.py

diff --git a/i2cserv/i2c_array.py b/i2cserv/i2c_array.py
index ce2c610..b2b31de 100644
--- a/i2cserv/i2c_array.py
+++ b/i2cserv/i2c_array.py
@@ -96,7 +96,7 @@ class i2c_array(i2c_dev):
         if (len(mask)==self.N):
           mask=[m for m in mask for x in range(Step)]
         if not(len(mask)==Step*self.N):
-            print("Check mask length!");
+            print("Check mask length!",len(mask),Step,self.N);
             return;
 #        if (len(value1)==V1.nVars) and (self.N>1):  value1=(value1*self.N);
         i2c=self.conf['parentcls'];
@@ -133,6 +133,9 @@ class i2c_array(i2c_dev):
     def Setdevreg(self,devreg,value,mask=[]):
 #        if devreg.get('store'): logging.debug("Stored")
 #        print(devreg['store'])
+        if len(mask)==0: 
+             mask=[True]*self.N;
+             self.RCUi=0; 
         self.SetSwitchMask(mask)
         if not(self.SetVarValue(devreg,8,0,value)): return False;
         if devreg.get('store'):
@@ -174,8 +177,9 @@ class i2c_array(i2c_dev):
             if devreg['store']:
                 storearray=self.getstorearray(devreg);
                 previous=storearray[self.RCUi];
+#                print(value,previous)
                 for x in range(len(value)):
-                  value[x]=ApplyMask(value[x],width,bitoffset,previous);
+                  value[x]=ApplyMask(value[x],width,bitoffset,(previous[x] if isinstance(previous,list) else previous));
                 storearray[self.RCUi]=(value[0] if len(value)==1 else value[:])
                 logging.debug("Stored value:"+str(storearray[self.RCUi]))
             #  devreg['drivercls'].i2csetget
diff --git a/i2cserv/i2c_switch.py b/i2cserv/i2c_switch.py
index 6863b5a..59c2641 100644
--- a/i2cserv/i2c_switch.py
+++ b/i2cserv/i2c_switch.py
@@ -8,21 +8,24 @@ class i2c_switch(i2c):
         i2c.__init__(self,config)
         self.SWaddr=config['devreg'][0]['addr']
         self.CurrentChannel=0
+        self.NoSwitch=True;
         logging.info("i2c switch at address "+str(self.SWaddr))
+        if self.NoSwitch:
+           logging.warn("i2c switch disabled!")
 
     def SetSW1(self,channelbit):
         channel=(0 if (channelbit>5) else 1<<(channelbit)) #LTS
         if (channel)==self.CurrentChannel: return True;
         logging.debug("SetChannelbit=%i" % channelbit)
         self.CurrentChannel=channel
-        return self.i2csetget(self.SWaddr,[channel])
+        return (True if self.NoSwitch else self.i2csetget(self.SWaddr,[channel]))
 
     def SetChannel(self,channel):
         channel&=0x3F;#LTS
         if (channel)==self.CurrentChannel: return True;
         logging.debug("SetChannel=%i" % channel)
         self.CurrentChannel=channel
-        return self.i2csetget(self.SWaddr,[channel])
+        return (True if self.NoSwitch else self.i2csetget(self.SWaddr,[channel]))
 
 #    def I2Ccallback(self,RCU,addr,data,reg=None,read=0):
 #        self.callback1(addr,data,reg,read)    
diff --git a/i2cserv/i2cthread.py b/i2cserv/i2cthread.py
index d4066a0..62f1c1b 100644
--- a/i2cserv/i2cthread.py
+++ b/i2cserv/i2cthread.py
@@ -83,10 +83,11 @@ def setvar(conf,Qout,varid,data,mask):
     if not(drv): 
         logging.warn(var1['name']+" driver not found!")
         return;
-    for data in drv.OPCUASetVariable(varid,var1,data,mask):
-        if len(mask)==len(data.mask): mask[:]=data.mask[:];
-        elif len(mask)==0: mask=data.mask.copy();
-        Qout.put(data)
+    for data2 in drv.OPCUASetVariable(varid,var1,data,mask):
+        if len(mask)==len(data2.mask): mask[:]=data2.mask[:];
+        elif len(mask)==0: mask=data2.mask.copy();
+#        print(data2.data[:64]);
+        Qout.put(data2)
     return mask;
 
 def getvar(conf,Qout,varid,mask):
diff --git a/opcuaserv/yamlreader.py b/opcuaserv/yamlreader.py
index 6e0de63..fa5a456 100644
--- a/opcuaserv/yamlreader.py
+++ b/opcuaserv/yamlreader.py
@@ -98,11 +98,12 @@ class yamlreader(yamlconfig):
         if not(v):
             logging.warn(self.yamlfile+"_Init method not found for initialisation!") 
             return;
-        self.server.callmethod(v['id'],[]) 
+        self.callMethod(v['id'])
 
     def setvar(self,id1,data=[]):
         v=self.conf['variables'][id1];
         if v['rw']=='variable': return;
+        endian=v.get('endian','>');
         mask=v.get('maskOPC',None);
         mask=mask.get_value() if (mask!=None) else [];
 #        print("M2:",mask)
@@ -118,14 +119,14 @@ class yamlreader(yamlconfig):
             if width<=1: 
                 data2=bytearray(data)
             elif width==2:
-                data2 = struct.pack('>%sH' % len(data), *data)
+                data2 = struct.pack(endian+'%sH' % len(data), *data)
             elif width==3:
                 data2=bytearray()
                 for a in data: data2.extend(struct.pack('>L',a)[1:])
             elif width==4:
-                data2 = struct.pack('>%sL' % len(data), *data)
+                data2 = struct.pack(endian+'%sL' % len(data), *data)
             elif width==8:
-                data2 = struct.pack('>%sQ' % len(data), *data)
+                data2 = struct.pack(endian+'%sQ' % len(data), *data)
             else:
                 logging.warn("setvar"+v['name']+" unsupported width!"+str(width))
                 return;
@@ -201,7 +202,7 @@ class yamlreader(yamlconfig):
            return;
         data3=var1.get_value();
         if not(isinstance(data3,list)): data3=[data3];
-#        print("OPCset",v['name'],data3,mask)
+#        print("OPCset",v['name'],data2[:64],mask)
         if mask: #Only update masked values
             step=len(data2)//len(mask)
             #print("mask step=",step)
@@ -209,8 +210,9 @@ class yamlreader(yamlconfig):
                 if mask[i//step]: data3[i]=data2[i]
         else:
             data3=data2;
+#        print("OPCset",v['name'],data3[:64],mask)
+        logging.info(str(("OPCset",v['name'],data3[:64])))
         if len(data3)==1: data3=data3[0];
-        logging.info(str(("OPCset",v['name'],data3)))
         var1.set_value(data3);
 
     def Monitor(self):
diff --git a/scripts/SetHBAT_BFs.py b/scripts/SetHBAT_BFs.py
new file mode 100644
index 0000000..7f64d0f
--- /dev/null
+++ b/scripts/SetHBAT_BFs.py
@@ -0,0 +1,37 @@
+RCU=0
+#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"
+AntMask=[True,True,True]
+NewVal=[2]*64
+
+from test_common import *
+import numpy as np
+
+setAntmask([RCU],AntMask)
+
+i=(RCU*3)*32
+
+val=get_value(name+"_R")
+print("old:",val[i:i+64])
+
+val[i:i+64]=NewVal
+
+set_value(name+"_RW",val)
+print("set:",val[i:i+64])
+time.sleep(2)
+val=get_value(name+"_R")
+print("new:",val[i:i+64])
+
+#time.sleep(5)
+#val[i:i+64]=[0]*64
+
+#set_value(name+"_RW",val)
+#print("set:",val[i:i+64])
+#time.sleep(1)
+#val=get_value(name+"_R")
+#print("new:",val[i:i+64])
+
+disconnect()
-- 
GitLab