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

None and NaN added

parent 007db685
Branches
Tags
No related merge requests found
......@@ -100,11 +100,12 @@ 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]<=self.I2Ccut):
mask[RCUi*Step+Vari]=False;
continue;
i0=(RCUi*Step+ Vari)*Step2
i1=(RCUi*Step+(Vari+1))*Step2
if not(self.I2Cmask[RCUi]<=self.I2Ccut):
# mask[RCUi*Step+Vari]=False; #Use this if we do not what to update opc-ua var with NaN
value1[i0]=None
continue;
devreg=var1['devreg'][Vari];
width=var1.get('width',8)
bitoffset=GetField(var1,'bitoffset',Vari,0)
......@@ -115,6 +116,7 @@ class i2c_array(i2c_dev):
if not(res):
if self.disableI2ConError: self.I2Cmask[RCUi]+=1;
if self.I2Cmask[RCUi]>self.I2Ccut: mask[RCUi*Step+Vari]=False;
value1[i0]=None
continue;
self.I2Cmask[RCUi]=0;
value1[i0:i1]=value2
......@@ -138,7 +140,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]<=self.I2Ccut):
if (mask[RCUi]) and (self.I2Cmask[RCUi]<=self.I2Ccut) and not(value[0] is None):
storearray[RCUi]=value[0]
self.RCUi=RCUi;
logging.debug(str(("Stored values:",self.getstorearray(devreg))))
......@@ -163,7 +165,7 @@ class i2c_array(i2c_dev):
self.I2Cmask[RCUi]=0;
value1[RCUi]=value2[0]
if devreg.get('store'):
if mask[RCUi]:
if mask[RCUi] and not(value2[0] is None):
storearray[RCUi]=value2[0]
logging.debug(str(("Stored values:",self.getstorearray(devreg))))
return True;
......@@ -194,6 +196,7 @@ class i2c_array(i2c_dev):
# print(width,bitoffset,l1)
value2=value
reg=devreg['register_R']
value2[0]=None; #default
if reg>255: #This is for the monitor ADC (+ DTH)
callback(0,[250],read=3)
if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False;
......
......@@ -126,12 +126,13 @@ class i2c_dev(hwdev):
def OPCUAReadVariable(self,varid,var1,mask):
if len(mask)==0: mask=[True];
logging.info(str(("Read Var",var1['name'],mask)))
logging.info(str(("Read Var",var1['name'],"Mask=",mask)))
if not(var1.get('devreg')): return []
#data=self.GetVarValueAll(var1)
#else:
oldmask=self.I2Cmask.copy()
data,mask2=self.GetVarValueMask(var1,mask);
logging.info(str(("Read Var",var1['name'],"Data=",data)))
# if len(mask)==len(mask2): mask[:]=mask2[:];
# elif len(mask)==0: (mask.append(x) for x in mask2);
Data=OPCUAset(varid,InstType.varSet,data.copy(),mask2.copy())
......
......@@ -48,7 +48,7 @@ class i2cbitbang1(hwdev):
# ADC_address=dev.Register_W<<1; #Write
ADC_address=address<<1;#dev.Register_W<<1; #Write
logging.info(str(("I2Cbb set",hex(ADC_address),value)))
logging.debug(str(("I2Cbb set",hex(ADC_address),value)))
SetI2C(DIRdev,1,DIRpin,[1]) #Input = high
SetI2C(CLKdev,1,CLKpin,[1]) #Should be high for start
......@@ -94,7 +94,7 @@ class i2cbitbang1(hwdev):
ADC_address=1+(reg_address<<1); #Read
logging.info(str(("I2Cbb get",hex(ADC_address),value)))
logging.debug(str(("I2Cbb get",hex(ADC_address),value)))
SetI2C(DIRdev,1,DIRpin,[1]) #Input = high
SetI2C(CLKdev,1,CLKpin,[1]) #Should be high for start bit
......@@ -124,7 +124,8 @@ class i2cbitbang1(hwdev):
SetI2C(CLKdev,1,CLKpin,[1])
GetI2C(SDAdev,1,SDApin,ack)
# print(ack[0])
b=(b<<1)+ack[0];
if ack[0] is None: b=None
elif not b is None: b=(b<<1)+ack[0];
SetI2C(CLKdev,1,CLKpin,[0])
# print("RXbyte",hex(b));
SetI2C(SDAdev,1,SDApin,[0])
......@@ -139,7 +140,7 @@ class i2cbitbang1(hwdev):
# if not(RXbyte()==0x80): return False;
for i in range(len(value)):
value[i]=RXbyte(last=(i==len(value)-1))
logging.debug(str(("si status:",hex(status),[hex(v) for v in value])))#should be 0x80
logging.debug(str(("si status:",hex(status),[hex(v) for v in value])))#should be 0x80 - will fail for None!!
#stop
#SetI2C(DIRdev,1,DIRpin,[0]) #low
SetI2C(CLKdev,1,CLKpin,[1])
......
......@@ -93,7 +93,9 @@ class spibitbang1(hwdev):
for cnt in range(8*(ADC_bytes+1)):
GetI2C(SDOdev,1,SDOpin,ret_value) #enable
# logging.debug("Got bit"+str((ret_value)))
for i in range(N): value[i]=(value[i]<<1)+ ret_value[i]
for i in range(N):
if ret_value is None: value[i]=None
elif not value[i] is None: value[i]=(value[i]<<1)+ ret_value[i]
SetI2C(CLKdev,1,CLKpin,[1])
SetI2C(CLKdev,1,CLKpin,[0]) #read after falling edge
SetI2C(CSdev,1,CSpin,[1]) #disable
......
......@@ -87,7 +87,10 @@ class spibitbang2(hwdev):
SetI2C(CLKdev,1,CLKpin,[0])
SetI2C(CLKdev,1,CLKpin,[1]) #read after rising
GetI2C(SDOdev,1,SDOpin,ret_value)
for i in range(N): value[i]=(value[i]<<1)+ ret_value[i]
# for i in range(N): value[i]=(value[i]<<1)+ ret_value[i]
for i in range(N):
if ret_value is None: value[i]=None
elif not value[i] is None: value[i]=(value[i]<<1)+ ret_value[i]
SetI2C(CLKdev,1,CLKpin,[0])
SetI2C(CSdev,1,CSpin,[1]) #disable
return True;
......
......@@ -168,10 +168,19 @@ class yamlreader(yamlconfig):
width=(v.get('width',8)-1)//8+1
endian=v.get('endian','>');
logging.debug(str(("OPCset",width,data)))
notvalid=[(d is None) for d in data[::width]]
cnt=int(len(data)//width)
assert(cnt==len(notvalid))
# print(notvalid)
for x in range(len(data)):
if data[x] is None: data[x]=0;
if dtype=="boolean":
data2=[d==1 for d in data];
convert=v.get("convert_unit")
if convert: data2=[eval("convert_unit."+convert)(d) for d in data2]
if convert:
data2=[eval("convert_unit."+convert)(d) for d in data2]
for x in range(cnt):
if notvalid[x]: data2[x]=False;
elif (dtype in ['uint8','uint16','uint32','uint64','double']):
data=bytearray(data)
if width<=1:
......@@ -188,9 +197,10 @@ class yamlreader(yamlconfig):
logging.warn("OPCset"+v['name']+" unsupported width!"+str(width))
return;
elif dtype=="string":
cnt=int(len(data)/width)
# data2=[(bytearray(data[i*width:(i+1)*width]).decode("utf-8")) for i in range(cnt)]
data2=[bytearray(data)[i*width:(i+1)*width].decode("utf-8",errors='ignore') for i in range(cnt)]
for x in range(cnt):
if notvalid[x]: data2[x]="";
else:
logging.warn("OPCset unsupported type");
return;
......@@ -203,7 +213,8 @@ class yamlreader(yamlconfig):
data2=[(d*scale) for d in data2]
convert=v.get("convert_unit")
if convert: data2=[eval("convert_unit."+convert)(d) for d in data2]
for x in range(cnt):
if notvalid[x]: data2[x]=float('nan')
var1=v.get('OPCR')
if not(var1): var1=v.get('OPCW')
if not(var1):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment