Skip to content
Snippets Groups Projects
Commit ff4d6f3e authored by Paulus Kruger's avatar Paulus Kruger
Browse files

I2C status added

parent f2269f17
No related branches found
No related tags found
1 merge request!11Pypcc2
...@@ -8,6 +8,7 @@ drivers: ...@@ -8,6 +8,7 @@ drivers:
- name: I2C_CLK - name: I2C_CLK
type: i2c_dev #I2C devices type: i2c_dev #I2C devices
parent: I2C parent: I2C
mask: CLK_I2C_OK
- name: SPIbb1 - name: SPIbb1
type: spibitbang2 #SPI bitbang via GPIO expander: CLK, SDI,SDO,CS type: spibitbang2 #SPI bitbang via GPIO expander: CLK, SDI,SDO,CS
parent: I2C_CLK parent: I2C_CLK
...@@ -42,7 +43,7 @@ device_registers: ...@@ -42,7 +43,7 @@ device_registers:
variables: variables:
- name: CLK_I2C_STATUS - name: CLK_I2C_OK
driver: I2C_CLK driver: I2C_CLK
rw: variable #server RW variable, not linked to IO rw: variable #server RW variable, not linked to IO
dtype: boolean dtype: boolean
...@@ -93,13 +94,22 @@ variables: ...@@ -93,13 +94,22 @@ variables:
dtype: uint8 dtype: uint8
debug: True debug: True
- name: RCU_IO1_GPIO1
driver: I2C_CLK
devreg: IO1.GPIO1
width: 8
rw: ro
dtype: uint8
mask: RCU_mask
debug: True
methods: methods:
- name: Init #Called after startup to load. Should have all stored registers - name: Init #Called after startup to load. Should have all stored registers
driver: I2C_CLK driver: I2C_CLK
hidden: True hidden: True
instructions: instructions:
- IO1.GPIO1: Update - RCU_IO1_GPIO1 : Update
- IO1.CONF1: Update
- name: CLK_on - name: CLK_on
driver: I2C_CLK driver: I2C_CLK
......
...@@ -205,6 +205,7 @@ variables: ...@@ -205,6 +205,7 @@ variables:
driver: I2C_RCU driver: I2C_RCU
rw: variable #server RW variable, not linked to IO rw: variable #server RW variable, not linked to IO
dtype: boolean dtype: boolean
mask: RCU_mask
dim: 32 dim: 32
- name: RCU_state - name: RCU_state
...@@ -342,19 +343,23 @@ variables: ...@@ -342,19 +343,23 @@ variables:
dim: 96 dim: 96
mask: Ant_mask mask: Ant_mask
methods: methods:
- name: Init #Called after startup to load. Should have all stored registers - name: Init #Called after startup to load. Should have all stored registers
driver: I2C_RCU driver: I2C_RCU
hidden: True hidden: True
instructions: instructions:
- RCU_IO1_GPIO1: Update - RCU_IO1_GPIO1: Update
- IO1.GPIO2: Update - RCU_IO1_GPIO2: Update
- IO2.GPIO1: Update - RCU_IO2_GPIO1: Update
- IO2.GPIO2: Update - RCU_IO2_GPIO2: Update
- IO3.GPIO1: Update - RCU_IO3_GPIO1: Update
- IO3.GPIO2: 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 - name: RCU_on
driver: I2C_RCU driver: I2C_RCU
......
...@@ -11,15 +11,10 @@ def GetSteps(V1): ...@@ -11,15 +11,10 @@ def GetSteps(V1):
Step2=V1.get('dim',1)*((V1.get('width',8)+7)//8)//Step #int(V1.size/V1.nVars) Step2=V1.get('dim',1)*((V1.get('width',8)+7)//8)//Step #int(V1.size/V1.nVars)
logging.debug(str(("GetStep",Step,Step2))); logging.debug(str(("GetStep",Step,Step2)));
return 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): class i2c_array(i2c_dev):
def __init__(self,config): def __init__(self,config):
hwdev.__init__(self,config); i2c_dev.__init__(self,config);
# self.Qout=Qout; # self.Qout=Qout;
# self.Qin=Qin; # self.Qin=Qin;
# self.I2Ccallback=I2Ccallback # self.I2Ccallback=I2Ccallback
...@@ -29,26 +24,14 @@ class i2c_array(i2c_dev): ...@@ -29,26 +24,14 @@ class i2c_array(i2c_dev):
self.RCU_Switch1=range(pars[0],pars[1]+1); self.RCU_Switch1=range(pars[0],pars[1]+1);
self.N=len(self.RCU_Switch1); self.N=len(self.RCU_Switch1);
self.I2Cmask=[True]*self.N 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) # self.devregs,RCU_storeReg=DevRegList(yaml)
# print("Init",config['name'],'len=',len(self.RCU_Switch1),' stored reg=',RCU_storeReg) # print("Init",config['name'],'len=',len(self.RCU_Switch1),' stored reg=',RCU_storeReg)
# self.previous =np.zeros([self.N,RCU_storeReg],dtype='int') # 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): def OPCUAReadVariable(self,varid,var1,mask):
if len(mask)==0: mask=[True]*self.N; if len(mask)==0: mask=[True]*self.N;
oldmask=self.I2Cmask.copy() return i2c_dev.OPCUAReadVariable(self,varid,var1,mask)
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
def SetSwitch(self,RCUi): def SetSwitch(self,RCUi):
self.conf['parentcls'].SetSW1(self.RCU_Switch1[RCUi]); self.conf['parentcls'].SetSW1(self.RCU_Switch1[RCUi]);
......
...@@ -75,30 +75,54 @@ def DevRegList(D): ...@@ -75,30 +75,54 @@ def DevRegList(D):
# print(devreglist) # print(devreglist)
return devreglist,store 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): class i2c_dev(hwdev):
def __init__(self,config): def __init__(self,config):
hwdev.__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): 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))) logging.info(str(("Set Var",var1['name'],data,mask)))
oldmask=self.I2Cmask.copy()
data,mask2=self.SetGetVarValueMask(var1,data,mask); data,mask2=self.SetGetVarValueMask(var1,data,mask);
# if len(mask)==len(mask2): mask[:]=mask2[:]; # if len(mask)==len(mask2): mask[:]=mask2[:];
# elif len(mask)==0: (mask.append(x) for x in mask2); # elif len(mask)==0: (mask.append(x) for x in mask2);
Data=OPCUAset(varid,InstType.varSet,data,mask2) Data=OPCUAset(varid,InstType.varSet,data.copy(),mask2.copy())
return [Data] 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): def OPCUAReadVariable(self,varid,var1,mask):
logging.info(str(("Read Var",var1['name'],mask))) logging.info(str(("Read Var",var1['name'],mask)))
#data=self.GetVarValueAll(var1) #data=self.GetVarValueAll(var1)
#else: #else:
oldmask=self.I2Cmask.copy()
data,mask2=self.GetVarValueMask(var1,mask); data,mask2=self.GetVarValueMask(var1,mask);
# if len(mask)==len(mask2): mask[:]=mask2[:]; # if len(mask)==len(mask2): mask[:]=mask2[:];
# elif len(mask)==0: (mask.append(x) for x in mask2); # elif len(mask)==0: (mask.append(x) for x in mask2);
Data=OPCUAset(varid,InstType.varSet,data,mask2) Data=OPCUAset(varid,InstType.varSet,data.copy(),mask2.copy())
return [Data] 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): # def OPCUAcallMethod(self,var1,data,mask):
# print("Call Method",var1) # print("Call Method",var1)
...@@ -121,15 +145,25 @@ class i2c_dev(hwdev): ...@@ -121,15 +145,25 @@ class i2c_dev(hwdev):
return; return;
for Vari in range(Step): for Vari in range(Step):
if not(mask[Vari]): continue if not(mask[Vari]): continue
if not(self.I2Cmask[0]):
mask[Vari]=False;
continue;
i0=(Vari)*Step i0=(Vari)*Step
i1=(Vari+1)*Step i1=(Vari+1)*Step
devreg=var1['devreg'][Vari]; devreg=var1['devreg'][Vari];
width=var1.get('width',8) width=var1.get('width',8)
bitoffset=GetField(var1,'bitoffset',Vari,0) bitoffset=GetField(var1,'bitoffset',Vari,0)
mask[Vari]=self.SetVarValue(devreg,width,bitoffset,data[i0:i1]) res=self.SetVarValue(devreg,width,bitoffset,data[i0:i1])
if not(mask[Vari]): continue if not(res):
self.I2Cmask[0]=False;
mask[Vari]=False;
continue;
value2=value1[i0:i1] 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 value1[i0:i1]=value2
return value1,mask return value1,mask
...@@ -146,13 +180,20 @@ class i2c_dev(hwdev): ...@@ -146,13 +180,20 @@ class i2c_dev(hwdev):
return; return;
for Vari in range(Step): for Vari in range(Step):
if not(mask[Vari]): continue if not(mask[Vari]): continue
if not(self.I2Cmask[0]):
mask[Vari]=False;
continue;
i0=( Vari)*Step i0=( Vari)*Step
i1=(Vari+1)*Step i1=(Vari+1)*Step
devreg=var1['devreg'][Vari]; devreg=var1['devreg'][Vari];
width=var1.get('width',8) width=var1.get('width',8)
bitoffset=GetField(var1,'bitoffset',Vari,0) bitoffset=GetField(var1,'bitoffset',Vari,0)
value2=value1[i0:i1] 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 value1[i0:i1]=value2
return value1,mask return value1,mask
...@@ -167,14 +208,22 @@ class i2c_dev(hwdev): ...@@ -167,14 +208,22 @@ class i2c_dev(hwdev):
def Setdevreg(self,devreg,value,mask=[]): def Setdevreg(self,devreg,value,mask=[]):
# if devreg.get('store'): logging.debug("Stored") # if devreg.get('store'): logging.debug("Stored")
# print(devreg['store']) # 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'): if devreg.get('store'):
devreg['storeval']=value[0]; devreg['storeval']=value[0];
self.SetVarValue(devreg,8,0,value)
return True; return True;
def Getdevreg(self,devreg,mask=[]): def Getdevreg(self,devreg,mask=[]):
value=[0]; 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'): if devreg.get('store'):
devreg['storeval']=value[0]; devreg['storeval']=value[0];
logging.debug("Stored value:"+str(value[0])) logging.debug("Stored value:"+str(value[0]))
......
...@@ -33,13 +33,16 @@ I2Cclients.append(RCU_I2C) ...@@ -33,13 +33,16 @@ I2Cclients.append(RCU_I2C)
RCU_conf=yamlreader.yamlreader(RCU_I2C,yamlfile=name) RCU_conf=yamlreader.yamlreader(RCU_I2C,yamlfile=name)
RCU_conf.CallInit() RCU_conf.CallInit()
var1=RCU_conf.getvarid('CLK_I2C_OK')
#RCU_I2C.setvar(var1,[True])
var1=RCU_conf.getvarid('CLK_PLL_locked') var1=RCU_conf.getvarid('CLK_PLL_locked')
#RCU_I2C.readvar(var1,[]) #RCU_I2C.readvar(var1,[])
var1=RCU_conf.getvarid('CLK_PLL_locked_SPI') var1=RCU_conf.getvarid('CLK_PLL_locked_SPI')
#var1=RCU_conf.getvarid('CLK_PLL_r3') #var1=RCU_conf.getvarid('CLK_PLL_r3')
#RCU_I2C.readvar(var1,[]) RCU_I2C.readvar(var1,[])
...@@ -51,7 +54,7 @@ time.sleep(2); ...@@ -51,7 +54,7 @@ time.sleep(2);
while RCU_I2C.data_waiting(): while RCU_I2C.data_waiting():
varid,data,mask=RCU_I2C.readdata() 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") logging.info("Stop threads")
......
...@@ -81,7 +81,7 @@ time.sleep(2); ...@@ -81,7 +81,7 @@ time.sleep(2);
while RCU_I2C.data_waiting(): while RCU_I2C.data_waiting():
varid,data,mask=RCU_I2C.readdata() 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") logging.info("Stop threads")
......
...@@ -3,11 +3,11 @@ import struct ...@@ -3,11 +3,11 @@ import struct
import time import time
import logging import logging
def Find(L,name,value): def Find(L,name,value,default=False):
for x in L: for x in L:
if x[name]==value: if x[name]==value:
return x; return x;
return False; return default;
def GetField(D,name,dev_number,default=None): def GetField(D,name,dev_number,default=None):
...@@ -38,8 +38,8 @@ class yamlconfig(): ...@@ -38,8 +38,8 @@ class yamlconfig():
def getvar1(self,varid): def getvar1(self,varid):
return self.conf['variables'][varid]; return self.conf['variables'][varid];
def getvarid(self,name): def getvarid(self,name):
var1=Find(self.conf['variables'],'name',name); var1=Find(self.conf['variables'],'name',name,None);
return (var1['id'] if var1 else var1); return (var1['id'] if not(var1 is None) else None);
def getmethod(self,methodid): def getmethod(self,methodid):
return self.conf['methods'][methodid]; return self.conf['methods'][methodid];
...@@ -138,7 +138,7 @@ class yamlconfig(): ...@@ -138,7 +138,7 @@ class yamlconfig():
mask=D.get('mask'); mask=D.get('mask');
if not(mask): continue; if not(mask): continue;
mask=self.getvarid(mask) mask=self.getvarid(mask)
if not(mask): if mask is None:
logging.warn("Variable %s not found",mask) logging.warn("Variable %s not found",mask)
continue; continue;
D['maskid']=mask D['maskid']=mask
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment