diff --git a/config/CLK.yaml b/config/CLK.yaml index 2470e5dfc325bb7a92ca79e5ca892b92be76ad01..446fde4db1633bc6e46dfa4d29e3c628523e46cb 100644 --- a/config/CLK.yaml +++ b/config/CLK.yaml @@ -8,6 +8,7 @@ drivers: - name: I2C_CLK type: i2c_dev #I2C devices parent: I2C + mask: CLK_I2C_OK - name: SPIbb1 type: spibitbang2 #SPI bitbang via GPIO expander: CLK, SDI,SDO,CS parent: I2C_CLK @@ -42,7 +43,7 @@ device_registers: variables: - - name: CLK_I2C_STATUS + - name: CLK_I2C_OK driver: I2C_CLK rw: variable #server RW variable, not linked to IO dtype: boolean @@ -93,13 +94,22 @@ variables: dtype: uint8 debug: True + - name: RCU_IO1_GPIO1 + driver: I2C_CLK + devreg: IO1.GPIO1 + width: 8 + rw: ro + dtype: uint8 + mask: RCU_mask + debug: True methods: - name: Init #Called after startup to load. Should have all stored registers driver: I2C_CLK hidden: True instructions: - - IO1.GPIO1: Update + - RCU_IO1_GPIO1 : Update + - IO1.CONF1: Update - name: CLK_on driver: I2C_CLK diff --git a/config/RCU.yaml b/config/RCU.yaml index 4507b0ded90c4408b1c2a23a8bbd963aa14b0595..c17fd0b83e8f0e6228ac64ccd775feb8e1ca2962 100644 --- a/config/RCU.yaml +++ b/config/RCU.yaml @@ -205,6 +205,7 @@ variables: driver: I2C_RCU rw: variable #server RW variable, not linked to IO dtype: boolean + mask: RCU_mask dim: 32 - name: RCU_state @@ -342,19 +343,23 @@ variables: dim: 96 mask: Ant_mask - - methods: - name: Init #Called after startup to load. Should have all stored registers driver: I2C_RCU hidden: True instructions: - RCU_IO1_GPIO1: Update - - IO1.GPIO2: Update - - IO2.GPIO1: Update - - IO2.GPIO2: Update - - IO3.GPIO1: Update - - IO3.GPIO2: Update + - RCU_IO1_GPIO2: Update + - RCU_IO2_GPIO1: Update + - RCU_IO2_GPIO2: Update + - RCU_IO3_GPIO1: Update + - RCU_IO3_GPIO2: Update +# - IO1.GPIO2: Update +# - IO2.GPIO1: Update +# - IO2.GPIO2: Update +# - IO3.GPIO1: Update +# - IO3.GPIO2: Update + - IO3.CONF1: Update - name: RCU_on driver: I2C_RCU diff --git a/i2cserv/i2c_array.py b/i2cserv/i2c_array.py index a9c3a2aec20bf76f902592865b22b504e85c0090..976274a8a3222952a1fcc08257a017e0a5e7b3c3 100644 --- a/i2cserv/i2c_array.py +++ b/i2cserv/i2c_array.py @@ -11,15 +11,10 @@ def GetSteps(V1): Step2=V1.get('dim',1)*((V1.get('width',8)+7)//8)//Step #int(V1.size/V1.nVars) logging.debug(str(("GetStep",Step,Step2))); return Step,Step2 -def list_different(A,B): - if not(len(A)==len(B)): return True; - for i,m in enumerate(B): - if not(m==A[i]): return True - return False class i2c_array(i2c_dev): def __init__(self,config): - hwdev.__init__(self,config); + i2c_dev.__init__(self,config); # self.Qout=Qout; # self.Qin=Qin; # self.I2Ccallback=I2Ccallback @@ -29,26 +24,14 @@ class i2c_array(i2c_dev): self.RCU_Switch1=range(pars[0],pars[1]+1); self.N=len(self.RCU_Switch1); self.I2Cmask=[True]*self.N - self.I2Cmaskid=config.get('maskid') - if not(self.I2Cmaskid): logging.warn(config['name']+" I2C mask not found!") + # 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') - def OPCUASetVariable(self,varid,var1,data,mask): - oldmask=self.I2Cmask.copy() - Data=i2c_dev.OPCUASetVariable(self,varid,var1,data,mask) - if list_different(self.I2Cmask,oldmask): - Data.append(OPCUAset(varid,InstType.varSet,self.I2Cmask,[])) - return Data def OPCUAReadVariable(self,varid,var1,mask): if len(mask)==0: mask=[True]*self.N; - oldmask=self.I2Cmask.copy() - Data=i2c_dev.OPCUAReadVariable(self,varid,var1,mask) - if list_different(self.I2Cmask,oldmask): - if self.I2Cmaskid: - Data.append(OPCUAset(self.I2Cmaskid,InstType.varSet,self.I2Cmask,[])) - return Data + return i2c_dev.OPCUAReadVariable(self,varid,var1,mask) def SetSwitch(self,RCUi): self.conf['parentcls'].SetSW1(self.RCU_Switch1[RCUi]); diff --git a/i2cserv/i2c_dev.py b/i2cserv/i2c_dev.py index 17be113387d560db73fd5bcc1b007c588f5d60a5..2d7ee15c4379e47749a7dbb35f357959648d6b0f 100644 --- a/i2cserv/i2c_dev.py +++ b/i2cserv/i2c_dev.py @@ -75,30 +75,54 @@ def DevRegList(D): # print(devreglist) return devreglist,store - +def list_different(A,B): + if not(len(A)==len(B)): return True; + for i,m in enumerate(B): + if not(m==A[i]): return True + return False class i2c_dev(hwdev): def __init__(self,config): hwdev.__init__(self,config); + self.I2Cmask=[True] + self.I2Cmaskid=config.get('maskid',None) + if self.I2Cmaskid is None: logging.warn(config['name']+" I2C mask not found!") def OPCUASetVariable(self,varid,var1,data,mask): - if var1['rw']=='variable': return; + if var1['rw']=='variable': + if varid==self.I2Cmaskid: + if len(mask)==0: mask=[True]*len(data); + if len(data)!=len(mask): + logging.warn("Trying to set I2C OK with wrong mask length!") + return + for x,m in enumerate(mask): + if m: self.I2Cmask[x]=data[x]; + return [OPCUAset(self.I2Cmaskid,InstType.varSet,self.I2Cmask.copy(),[])] + return; logging.info(str(("Set Var",var1['name'],data,mask))) + oldmask=self.I2Cmask.copy() data,mask2=self.SetGetVarValueMask(var1,data,mask); # if len(mask)==len(mask2): mask[:]=mask2[:]; # elif len(mask)==0: (mask.append(x) for x in mask2); - Data=OPCUAset(varid,InstType.varSet,data,mask2) - return [Data] + Data=OPCUAset(varid,InstType.varSet,data.copy(),mask2.copy()) + if list_different(self.I2Cmask,oldmask): + Data=[Data,OPCUAset(self.I2Cmaskid,InstType.varSet,self.I2Cmask.copy(),[])] + else: Data=[Data] + return Data def OPCUAReadVariable(self,varid,var1,mask): logging.info(str(("Read Var",var1['name'],mask))) #data=self.GetVarValueAll(var1) #else: + oldmask=self.I2Cmask.copy() data,mask2=self.GetVarValueMask(var1,mask); # if len(mask)==len(mask2): mask[:]=mask2[:]; # elif len(mask)==0: (mask.append(x) for x in mask2); - Data=OPCUAset(varid,InstType.varSet,data,mask2) - return [Data] + Data=OPCUAset(varid,InstType.varSet,data.copy(),mask2.copy()) + if list_different(self.I2Cmask,oldmask): + Data=[Data,OPCUAset(self.I2Cmaskid,InstType.varSet,self.I2Cmask.copy(),[])] + else: Data=[Data] + return Data # def OPCUAcallMethod(self,var1,data,mask): # print("Call Method",var1) @@ -121,15 +145,25 @@ class i2c_dev(hwdev): return; for Vari in range(Step): if not(mask[Vari]): continue + if not(self.I2Cmask[0]): + mask[Vari]=False; + continue; i0=(Vari)*Step i1=(Vari+1)*Step devreg=var1['devreg'][Vari]; width=var1.get('width',8) bitoffset=GetField(var1,'bitoffset',Vari,0) - mask[Vari]=self.SetVarValue(devreg,width,bitoffset,data[i0:i1]) - if not(mask[Vari]): continue + res=self.SetVarValue(devreg,width,bitoffset,data[i0:i1]) + if not(res): + self.I2Cmask[0]=False; + mask[Vari]=False; + continue; value2=value1[i0:i1] - mask[Vari]=self.GetVarValue(devreg,width,bitoffset,value2) + res=self.GetVarValue(devreg,width,bitoffset,value2) + if not(res): + self.I2Cmask[0]=False; + mask[Vari]=False; + continue; value1[i0:i1]=value2 return value1,mask @@ -146,13 +180,20 @@ class i2c_dev(hwdev): return; for Vari in range(Step): if not(mask[Vari]): continue + if not(self.I2Cmask[0]): + mask[Vari]=False; + continue; i0=( Vari)*Step i1=(Vari+1)*Step devreg=var1['devreg'][Vari]; width=var1.get('width',8) bitoffset=GetField(var1,'bitoffset',Vari,0) value2=value1[i0:i1] - mask[Vari]=self.GetVarValue(devreg,width,bitoffset,value2) + res=self.GetVarValue(devreg,width,bitoffset,value2) + if not(res): + self.I2Cmask[0]=False; + mask[Vari]=False; + continue; value1[i0:i1]=value2 return value1,mask @@ -167,14 +208,22 @@ class i2c_dev(hwdev): def Setdevreg(self,devreg,value,mask=[]): # if devreg.get('store'): logging.debug("Stored") # print(devreg['store']) + if not(self.I2Cmask[0]): return False; + res=self.SetVarValue(devreg,8,0,value) + if not(res): + self.I2Cmask[0]=False; + return False; if devreg.get('store'): devreg['storeval']=value[0]; - self.SetVarValue(devreg,8,0,value) return True; def Getdevreg(self,devreg,mask=[]): value=[0]; - mask=self.GetVarValue(devreg,8,0,value) + if not(self.I2Cmask[0]): return False; + res=self.GetVarValue(devreg,8,0,value) + if not(res): + self.I2Cmask[0]=False; + return False; if devreg.get('store'): devreg['storeval']=value[0]; logging.debug("Stored value:"+str(value[0])) diff --git a/testCLK.py b/testCLK.py index bc522458e010b02f703fadcb09517348f565cffc..34f5b9fcde37bf83f86f090c3ea0338b97c3802f 100644 --- a/testCLK.py +++ b/testCLK.py @@ -33,13 +33,16 @@ I2Cclients.append(RCU_I2C) RCU_conf=yamlreader.yamlreader(RCU_I2C,yamlfile=name) RCU_conf.CallInit() +var1=RCU_conf.getvarid('CLK_I2C_OK') +#RCU_I2C.setvar(var1,[True]) var1=RCU_conf.getvarid('CLK_PLL_locked') #RCU_I2C.readvar(var1,[]) + var1=RCU_conf.getvarid('CLK_PLL_locked_SPI') #var1=RCU_conf.getvarid('CLK_PLL_r3') -#RCU_I2C.readvar(var1,[]) +RCU_I2C.readvar(var1,[]) @@ -51,7 +54,7 @@ time.sleep(2); while RCU_I2C.data_waiting(): varid,data,mask=RCU_I2C.readdata() - print("Results:",RCU_conf.getvar1(varid)['name'],data) + print("Results:",RCU_conf.getvar1(varid)['name'],data,mask) logging.info("Stop threads") diff --git a/testRCU.py b/testRCU.py index 146ff23133340c08ec83a4faad5ade27cd66fba6..868e96ab3d25a8a2a3fd37a09b6794e37dd5c7f5 100644 --- a/testRCU.py +++ b/testRCU.py @@ -81,7 +81,7 @@ time.sleep(2); while RCU_I2C.data_waiting(): varid,data,mask=RCU_I2C.readdata() - print("Results:",RCU_conf.getvar1(varid)['name'],data,mask) + print("Results:",RCU_conf.getvar1(varid)['name'],data[:12],mask[:12]) logging.info("Stop threads") diff --git a/yamlconfig.py b/yamlconfig.py index 3f17a3d6f09c0311855805026a4b4f836278f69e..171ab94db81798e0095ea376dc189479ff839215 100644 --- a/yamlconfig.py +++ b/yamlconfig.py @@ -3,11 +3,11 @@ import struct import time import logging -def Find(L,name,value): +def Find(L,name,value,default=False): for x in L: if x[name]==value: return x; - return False; + return default; def GetField(D,name,dev_number,default=None): @@ -38,8 +38,8 @@ class yamlconfig(): def getvar1(self,varid): return self.conf['variables'][varid]; def getvarid(self,name): - var1=Find(self.conf['variables'],'name',name); - return (var1['id'] if var1 else var1); + var1=Find(self.conf['variables'],'name',name,None); + return (var1['id'] if not(var1 is None) else None); def getmethod(self,methodid): return self.conf['methods'][methodid]; @@ -138,7 +138,7 @@ class yamlconfig(): mask=D.get('mask'); if not(mask): continue; mask=self.getvarid(mask) - if not(mask): + if mask is None: logging.warn("Variable %s not found",mask) continue; D['maskid']=mask