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