From 19737ee4b578239da5b99ca441a273b1ec831cac Mon Sep 17 00:00:00 2001 From: Paulus <kruger@astron.nl> Date: Wed, 22 Sep 2021 08:40:11 +0100 Subject: [PATCH] I2C error counter added --- config/RCU.yaml | 2 +- i2cserv/i2c_array.py | 33 +++++++++++++++++++-------------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/config/RCU.yaml b/config/RCU.yaml index 74cb1a9..84d2d70 100644 --- a/config/RCU.yaml +++ b/config/RCU.yaml @@ -9,7 +9,7 @@ drivers: - 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 + parameters: [0,31,5] #start,number of RCUs, error count to disable I2C status: RCU_I2C_STATUS - name: I2C_HBAT type: hba1 #Special driver to manage HBAT1s. diff --git a/i2cserv/i2c_array.py b/i2cserv/i2c_array.py index 14a6c20..bb0dd69 100644 --- a/i2cserv/i2c_array.py +++ b/i2cserv/i2c_array.py @@ -24,8 +24,9 @@ class i2c_array(i2c_dev): self.RCU_Switch1=range(pars[0],pars[1]+1); self.N=len(self.RCU_Switch1); self.I2Cmask=[0]*self.N - self.disableI2ConError=True; - + self.I2Ccut=pars[2]; + print("I2Ccut=",pars[2]) + self.disableI2ConError=pars[2]>0; # self.devregs,RCU_storeReg=DevRegList(yaml) # print("Init",config['name'],'len=',len(self.RCU_Switch1),' stored reg=',RCU_storeReg) # self.previous =np.zeros([self.N,RCU_storeReg],dtype='int') @@ -40,7 +41,7 @@ class i2c_array(i2c_dev): def SetSwitchMask(self,mask): m=0; for RCUi in range(self.N): - if (mask[RCUi]) and (self.I2Cmask[RCUi]==0): + if (mask[RCUi]) and (self.I2Cmask[RCUi]<=self.I2Ccut): m|=1<<self.RCU_Switch1[RCUi]; self.conf['parentcls'].SetChannel(m); @@ -63,7 +64,7 @@ class i2c_array(i2c_dev): for RCUi in range(self.N): for Vari in range(Step): if not(mask[RCUi*Step+Vari]): continue - if not(self.I2Cmask[RCUi]==0): + if not(self.I2Cmask[RCUi]<=self.I2Ccut): mask[RCUi*Step+Vari]=False; continue; i0=(RCUi*Step+ Vari)*Step2 @@ -75,17 +76,19 @@ class i2c_array(i2c_dev): self.RCUi=RCUi; res=self.SetVarValue(devreg,width,bitoffset,data[i0:i1]) if not(res): - if self.disableI2ConError: self.I2Cmask[RCUi]=1; - mask[RCUi*Step+Vari]=False; + if self.disableI2ConError: self.I2Cmask[RCUi]+=1; + if self.I2Cmask[RCUi]>self.I2Ccut: mask[RCUi*Step+Vari]=False; continue; + self.I2Cmask[RCUi]=0; if getalso: value2=value1[i0:i1] res=self.GetVarValue(devreg,width,bitoffset,value2) if not(res): - if self.disableI2ConError: self.I2Cmask[RCUi]=1; - mask[RCUi*Step+Vari]=False; + if self.disableI2ConError: self.I2Cmask[RCUi]+=1; + if self.I2Cmask[RCUi]>self.I2Ccut: mask[RCUi*Step+Vari]=False; continue; value1[i0:i1]=value2 + self.I2Cmask[RCUi]=0; return value1,mask @@ -104,7 +107,7 @@ class i2c_array(i2c_dev): for RCUi in range(self.N): for Vari in range(Step): if not(mask[RCUi*Step+Vari]): continue - if not(self.I2Cmask[RCUi]==0): + if not(self.I2Cmask[RCUi]<=self.I2Ccut): mask[RCUi*Step+Vari]=False; continue; i0=(RCUi*Step+ Vari)*Step2 @@ -117,9 +120,10 @@ class i2c_array(i2c_dev): self.RCUi=RCUi; res=self.GetVarValue(devreg,width,bitoffset,value2) if not(res): - if self.disableI2ConError: self.I2Cmask[RCUi]=1; - mask[RCUi*Step+Vari]=False; + if self.disableI2ConError: self.I2Cmask[RCUi]+=1; + if self.I2Cmask[RCUi]>self.I2Ccut: mask[RCUi*Step+Vari]=False; continue; + self.I2Cmask[RCUi]=0; value1[i0:i1]=value2 return value1,mask @@ -141,7 +145,7 @@ class i2c_array(i2c_dev): if devreg.get('store'): storearray=self.getstorearray(devreg); for RCUi in range(self.N): - if (mask[RCUi]) and (self.I2Cmask[RCUi]==0): + if (mask[RCUi]) and (self.I2Cmask[RCUi]<=self.I2Ccut): storearray[RCUi]=value[0] self.RCUi=RCUi; logging.debug(str(("Stored values:",self.getstorearray(devreg)))) @@ -156,13 +160,14 @@ class i2c_array(i2c_dev): i2c=self.conf['parentcls']; for RCUi in range(self.N): if not(mask[RCUi]): continue - if not(self.I2Cmask[RCUi]==0): continue + if not(self.I2Cmask[RCUi]<=self.I2Ccut): continue self.SetSwitch(RCUi); value2=[value1[RCUi]] self.RCUi=RCUi; res=self.GetVarValue(devreg,8,0,value2) if not(res): - if self.disableI2ConError: self.I2Cmask[RCUi]=1; + if self.disableI2ConError: self.I2Cmask[RCUi]+=1; + self.I2Cmask[RCUi]=0; value1[RCUi]=value2[0] if devreg.get('store'): if mask[RCUi]: -- GitLab