diff --git a/i2cserv/i2c_array.py b/i2cserv/i2c_array.py index 89ef667741f0333a90ad404d4cf6d3ab7a042ca3..51381eea5a05a6f097810c7831789011e7810691 100644 --- a/i2cserv/i2c_array.py +++ b/i2cserv/i2c_array.py @@ -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; diff --git a/i2cserv/i2c_dev.py b/i2cserv/i2c_dev.py index 2d59a6cea8f5b5571d102f44c040ea160efa9a5e..c1a8abcb109f03fb1605900eccc945677d3b8d93 100644 --- a/i2cserv/i2c_dev.py +++ b/i2cserv/i2c_dev.py @@ -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()) diff --git a/i2cserv/i2cbitbang1.py b/i2cserv/i2cbitbang1.py index 47c9a945330863c784b500ac97900e49e58b2810..df5884caa6de99f91dbda4ee394ddf1f85d4ff84 100644 --- a/i2cserv/i2cbitbang1.py +++ b/i2cserv/i2cbitbang1.py @@ -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]) diff --git a/i2cserv/spibitbang1.py b/i2cserv/spibitbang1.py index 4bbfb01c0c31fc3cc548979dc9bac574c85e5ac6..b41e5fecb62f0ce0772c1b315092f8d491df357c 100644 --- a/i2cserv/spibitbang1.py +++ b/i2cserv/spibitbang1.py @@ -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 diff --git a/i2cserv/spibitbang2.py b/i2cserv/spibitbang2.py index 0dedef82fcb86ed04e8e82420143ab22411878e3..e2de015473a7eca942d5045b95f788705b238504 100644 --- a/i2cserv/spibitbang2.py +++ b/i2cserv/spibitbang2.py @@ -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; diff --git a/opcuaserv/yamlreader.py b/opcuaserv/yamlreader.py index c5c8953c0905aa1b4f4aa341f5c11675f69f9f1b..c53c54612189e78ca0505516df16535ec02b81dc 100644 --- a/opcuaserv/yamlreader.py +++ b/opcuaserv/yamlreader.py @@ -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]; + 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):