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