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:
- 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
......
......@@ -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
......
......@@ -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]);
......
......@@ -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]))
......
......@@ -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")
......
......@@ -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")
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment