From b8559b808fe8bebe6c8a60fa482c8b31898affa0 Mon Sep 17 00:00:00 2001
From: kruger <kruger@astron.nl>
Date: Wed, 18 Dec 2024 11:50:06 +0100
Subject: [PATCH] Fast return when I2C switch fails

---
 pypcc/i2cserv/i2c_array.py    | 21 ++++++++++++++-------
 pypcc/i2cserv/i2c_array2.py   |  9 ++++++---
 pypcc/i2cserv/i2c_switch.py   |  2 +-
 pypcc/i2cserv/i2c_switch2.py  |  2 +-
 pypcc/opcuaserv/yamlreader.py |  2 +-
 5 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/pypcc/i2cserv/i2c_array.py b/pypcc/i2cserv/i2c_array.py
index 102474f..daa46c2 100644
--- a/pypcc/i2cserv/i2c_array.py
+++ b/pypcc/i2cserv/i2c_array.py
@@ -33,7 +33,7 @@ class i2c_array(i2c_dev):
       return i2c_dev.OPCUAReadVariable(self,varid,var1,mask)
 
     def SetSwitch(self,RCUi):
-        self.conf['parentcls'].SetSW1(self.RCU_Switch1[RCUi]);
+        return self.conf['parentcls'].SetSW1(self.RCU_Switch1[RCUi]);
 
     def SetSwitchMask(self,mask):
         m=0;
@@ -90,7 +90,10 @@ class i2c_array(i2c_dev):
                  for RCUi in self.RCUorder:
                     if not(mask[RCUi*Step+Vari]): continue
                     self.mask=[RCUi];
-                    self.SetSwitch(RCUi);
+                    if not(self.SetSwitch(RCUi)):
+                           #self.I2Cmask[RCUi]+=1;
+                           return
+#                           continue;
                     self.RCUi=RCUi;
                     i0=(RCUi*Step+    Vari)*Step2
                     i1=(RCUi*Step+(Vari+1))*Step2
@@ -114,7 +117,11 @@ class i2c_array(i2c_dev):
                 devreg=var1['devreg'][Vari];
                 width=var1.get('width',8)
                 bitoffset=GetField(var1,'bitoffset',Vari,0)
-                self.SetSwitch(RCUi);
+                if not(self.SetSwitch(RCUi)):
+                       #self.I2Cmask[RCUi]+=1;
+                       #mask[RCUi*Step+Vari]=False;
+                       return
+#                       continue;
                 self.RCUi=RCUi;
                 res=self.SetVarValue(devreg,width,bitoffset,data[i0:i1])
                 if getalso and (var1.get('wait',0)>0): sleep(var1['wait']/1000)
@@ -167,7 +174,7 @@ class i2c_array(i2c_dev):
                width=var1.get('width',8)
                bitoffset=GetField(var1,'bitoffset',Vari,0)
                mask2=[mask[RCUi*Step+Vari] & (self.I2Cmask[RCUi]<=self.I2Ccut) for RCUi in range(self.N)]
-               self.SetSwitchMask(mask2);
+               self.SetSwitchMask(mask2)
 #               self.mask=mask2;
                value2=[0]*self.N*Step2;
                res=self.GetVarValue(devreg,width,bitoffset,value2,0)
@@ -203,7 +210,7 @@ class i2c_array(i2c_dev):
                 devreg=var1['devreg'][Vari];
                 width=var1.get('width',8)
                 bitoffset=GetField(var1,'bitoffset',Vari,0)
-                self.SetSwitch(RCUi);
+                if not(self.SetSwitch(RCUi)): return value1,[False for x in mask]
                 value2=value1[i0:i1]
                 self.RCUi=RCUi;
                 res=self.GetVarValue(devreg,width,bitoffset,value2,mode=mode)
@@ -307,7 +314,7 @@ class i2c_array(i2c_dev):
         for RCUi in self.RCUorder:
                 if not(mask[RCUi]): continue
                 if not(self.I2Cmask[RCUi]<=self.I2Ccut): continue
-                self.SetSwitch(RCUi);
+                if not(self.SetSwitch(RCUi)): return False;
                 value2=[value1[RCUi]]
                 self.RCUi=RCUi;
                 res=self.GetVarValue(devreg,8,0,value2)
@@ -411,7 +418,7 @@ class i2c_array(i2c_dev):
            callback(devreg['addr'],int2bytes(reg),read=2)
            for x in self.mask:
               value3=value2[x*step2:(x+1)*step2]
-              self.SetSwitch(x);
+              if not(self.SetSwitch(x)): return value2
               callback(devreg['addr'],value3,read=1)
               if devreg.get('store')==True:
                  storearray=self.getstorearray(devreg,step2);
diff --git a/pypcc/i2cserv/i2c_array2.py b/pypcc/i2cserv/i2c_array2.py
index d45c5fd..b5fa8d5 100644
--- a/pypcc/i2cserv/i2c_array2.py
+++ b/pypcc/i2cserv/i2c_array2.py
@@ -35,20 +35,23 @@ class i2c_array2(i2c_array):
 
     def SetSwitch(self,RCUi):
         #print("Set switch element",RCUi,'=',self.sw1[RCUi],self.sw2[RCUi],(self.sw3[RCUi] if len(self.sw3)<0 else 'x'))
-        self.conf['parentcls'].SetSW1(self.sw1[RCUi]);
-        self.conf['parentcls'].SetSW2(self.sw2[RCUi]);
+        if not(self.conf['parentcls'].SetSW1(self.sw1[RCUi])): return False;
+        if not(self.conf['parentcls'].SetSW2(self.sw2[RCUi])): return False;
         if len(self.sw3)>0:
-                self.conf['parentcls'].SetSW3(self.sw3[RCUi]);
+                if not(self.conf['parentcls'].SetSW3(self.sw3[RCUi])): return False;
+        return True
 
     def SetSwitchMask(self,mask):
         sw1=[];sw2=[];sw3=[];
         m=0;
+        self.RCUi=0
         for RCUi in range(self.N):
            if mask[RCUi]: 
                  if self.sw1[RCUi] not in sw1: sw1.append(self.sw1[RCUi])
                  if self.sw2[RCUi] not in sw2: sw2.append(self.sw2[RCUi])
                  if len(self.sw3)>0:
                     if self.sw3[RCUi] not in sw3: sw3.append(self.sw3[RCUi])
+                 self.RCUi=RCUi
         logging.info(str(("SetSwitchMask",sw1,sw2,sw3)))
         self.conf['parentcls'].SetSWx(sw1,sw2,sw3)
 #        self.conf['parentcls'].SetSW1(self.sw1[RCUi]);
diff --git a/pypcc/i2cserv/i2c_switch.py b/pypcc/i2cserv/i2c_switch.py
index dadae41..7555621 100644
--- a/pypcc/i2cserv/i2c_switch.py
+++ b/pypcc/i2cserv/i2c_switch.py
@@ -38,7 +38,7 @@ class i2c_switch(i2c):
                  logging.debug("SetChannel addr %i = val %i" % (x,0));
                  self.CurrentChannel[x]=0
                  if not(self.i2csetget(self.SWaddrs[x],[0])): result=False
-        if not(result): logging.info("Switch set error!")
+        if not(result): logging.warning("Switch set error!")
         return result
 
     def ClearNewChannel(self):
diff --git a/pypcc/i2cserv/i2c_switch2.py b/pypcc/i2cserv/i2c_switch2.py
index 16ff3d4..b8d8fad 100644
--- a/pypcc/i2cserv/i2c_switch2.py
+++ b/pypcc/i2cserv/i2c_switch2.py
@@ -16,7 +16,7 @@ class i2c_switch2(i2c):
     def setI2Cswitch(self,addr,state):
         res=self.i2csetget(addr,[state]);
         if not(res):
-           logging.info("Error setting switch, switch reset not implemented!");
+           logging.warning("Error setting switch, switch reset not implemented!");
         return res;
 
     def SetSW1(self,channelbit):
diff --git a/pypcc/opcuaserv/yamlreader.py b/pypcc/opcuaserv/yamlreader.py
index aaf29f3..23c1b59 100644
--- a/pypcc/opcuaserv/yamlreader.py
+++ b/pypcc/opcuaserv/yamlreader.py
@@ -225,7 +225,7 @@ class yamlreader(yamlconfig):
 
     def callMethod(self,id1):
         v=self.conf['methods'][id1];
-        logging.debug("Method called!"+v['name'])
+        logging.warning("Method called:"+v['name'])
         mask=v.get('maskOPC',None);
         mask=mask.get_value() if (mask!=None) else [];
         if not(self.GetBusy()): self.lastRecv=time.time()
-- 
GitLab