From 008302ff8f7411d7b0b07607166d654cf29bd0c5 Mon Sep 17 00:00:00 2001 From: kruger <kruger@astron.nl> Date: Tue, 12 Jan 2021 16:55:25 +0100 Subject: [PATCH] clk added --- clk/CLK.py | 303 ++++++++++++++++++++++++++++++++++++++++++++++++++ clk/HWconf.py | 13 +++ clk/Vars.py | 24 ++++ pcctypes.py | 39 +++++++ pypcc2.py | 14 ++- rcu/HWconf.py | 30 ++--- rcu/RCU.py | 12 +- rcu/Vars.py | 100 ++++++++--------- 8 files changed, 457 insertions(+), 78 deletions(-) create mode 100644 clk/CLK.py create mode 100644 clk/HWconf.py create mode 100644 clk/Vars.py create mode 100644 pcctypes.py diff --git a/clk/CLK.py b/clk/CLK.py new file mode 100644 index 0000000..a7dee31 --- /dev/null +++ b/clk/CLK.py @@ -0,0 +1,303 @@ +from . import Vars +import numpy as np +import logging +#from .spibitbang1 import * +import threading + + +def ApplyMask(value,width=8,bitoffset=0,previous=0): + mask=(1<<width)-1 + if bitoffset>0: + value<<=bitoffset; + mask<<=bitoffset; + return (value & mask) + (previous - (previous & mask)); +def UnMask(value,width=8,bitoffset=0): + mask=(1<<width)-1 + if bitoffset>0: + value>>=bitoffset; + value=value&mask; + return value; + +def bytes2int(bts): + x=0; + for b in bts: + x=x*256+b; + return x; +def int2bytes(i): + b=[]; + while i>255: + b=[i%256]+b; + i>>=8; + return [i]+b; + +class RCU1(): + def __init__(self,number,I2Ccallback,Switchcallback): + self.N=number; + self.I2Ccallback=I2Ccallback + self.SWcallback=Switchcallback + self.previous=np.zeros([number,Vars.RCU_storeReg],dtype='int') + + def load(self): + Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_init,0,[]) #Read the current status of GPIO IOs + self.SetVar(Inst1) + +#Vars.RCU_mask.OPCW.get_data_value().Value.Value=[1,1,0,0] +#Vars.Ant_mask.OPCW.get_data_value().Value.Value=[1,1,0,0,0,0,0,0,0,0,1,0] + +#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_init,0,[]) #Read the current status of GPIO IOs +#RCU.SetVar(Inst1) + +#Inst1=Vars.Instr(Vars.DevType.Var,Vars.RCU_att,12,[0,1,2,3,4,5,6,7,8,9,11]) +#RCU.SetVar(Inst1) + +#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_off,0,[]) +#RCU.SetVar(Inst1) + +#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_on,0,[]) +#RCU.SetVar(Inst1) + +#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.ADC1_on,0,[]) +#RCU.SetVar(Inst1) + +#print(Vars.RCU) + + def SetVar(self,Instr): + if Instr.type==Vars.DevType.Instr: + #Execute instructions + Iset=Instr.dev; + for i in Iset.instr: + logging.debug(str(("Inst",i))) + self.SetVar(i) + return; + if Instr.type in [Vars.DevType.I2C,Vars.DevType.SPIbb,Vars.DevType.I2Cbb]: + RCU0=-1; + mask=0 + for RCUi in range(self.N): + mask|=1<<Vars.RCU_MPaddr.Switch[RCUi] + if RCU0<0: RCU0=RCUi; + if RCU0<0: return; #Mask all zero + self.SWcallback(mask) + if Instr.type==Vars.DevType.I2C: + logging.info(str(('** Set I2C:',Instr.dev,Instr.value))) + self.SetI2C(RCU0,Instr.dev,8,0,Instr.value) + return; + elif Instr.type==Vars.DevType.SPIbb: + logging.debug(str(('** Set SPIbb:',Instr.dev,Instr.value))) + SetSPIbb(self.SetI2C,RCU0,Instr.dev,Instr.value) + return; + elif Instr.type==Vars.DevType.I2Cbb: + logging.info(str(('** Set I2Cbb:',Instr.dev,Instr.value))) +# self.SetI2C(RCUi,Instr.dev,8,0,Instr.value) + return; + V1=Instr.dev + if not((Instr.nvalue==V1.nVars) and (Instr.type==Vars.DevType.VarUpdate)) and not(Instr.nvalue==V1.nVars*self.N): + logging.error("Wrong size of value") + return False + if V1.Vars[0].type==Vars.DevType.Internal: + Instr.dev.OPCW.get_data_value().Value.Value=Instr.value + logging.debug("Update internal variable") + return +# if V1.Vars[0].type==Vars.DevType.Internal: return; + Step=V1.nVars + value1=Instr.value if V1.OPCR is None else V1.OPCR.get_data_value().Value.Value + if (len(value1)==V1.nVars) and (self.N>1): value1=(value1*self.N); + if Instr.type==Vars.DevType.Var: + logging.info(str(('** Set Var:',V1.name,value1))) + for RCUi in range(self.N): + for Vari in range(Step): + self.SetVarValue(RCUi,V1.Vars[Vari],Instr.value[RCUi*Step+Vari:RCUi*Step+Vari+1]) + value2=value1[RCUi*Step+Vari:RCUi*Step+Vari+1] + self.GetVarValue(RCUi,V1.Vars[Vari],value2) + value1[RCUi*Step+Vari:RCUi*Step+Vari+1]=value2 + if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=value1 + + elif Instr.type==Vars.DevType.VarUpdate: + self.GetVarValueAll(V1,value1) + if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=value1 +# V1.OPCR.get_data_value().Value.Value=value1 + + logging.info(str(('** Readback:',V1.name,value1))) + + def GetVarValue(self,RCUi,var,value): + logging.info(str(("RCU1 Get ",RCUi,var,value))) + if var.type==Vars.DevType.I2C: + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) + self.GetI2C(RCUi,var.devreg,var.width,var.bitoffset,value) + elif var.type==Vars.DevType.I2Cbb: + logging.error("I2Cbb Implemented") + elif var.type==Vars.DevType.SPIbb: + logging.error("SPIbb Implemented") + else: + logging.error("Not Implemented") + + def GetVarValueAll(self,V1,value1): + mask=0; + for RCUi in range(self.N): + mask|=1<<Vars.RCU_MPaddr.Switch[RCUi] + Step=V1.nVars + if V1.Vars[0].type==Vars.DevType.I2C: + for Vari in range(Step): + DevReg=V1.Vars[Vari].devreg + self.SWcallback(mask) + self.SetI2CAddr(self,DevReg) + if DevReg.Register_R>255: self.I2Ccallback(DevReg.Addr,[250],read=3) #Wait for ADC + for RCUi in range(self.N): + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) + value2=value1[RCUi*Step+Vari:RCUi*Step+Vari+1] + var=V1.Vars[Vari] + self.GetI2Cnoreg(RCUi,var.devreg,var.width,var.bitoffset,value2) + if (var.Scale!=0): value2[0]*=var.Scale; + value1[RCUi*Step+Vari:RCUi*Step+Vari+1]=value2 + elif V1.Vars[0].type==Vars.DevType.SPIbb: + self.GetBBValueAll(V1,value1,mask) +# logging.info("SPIbb all not implemented yet") + else: + logging.error("Type not implemented") + def GetBBValueAll(self,V1,value1,mask): + def SetBit(RCUi,dev,width,bitoffset,value,buffer=False): + if not(buffer): self.SWcallback(mask) + self.SetI2C(RCUi,dev,width,bitoffset,value,buffer=buffer) + def GetBit(RCUixx,dev,width,bitoffset,buffer=False): + value=[0 for RCUi in range(self.N)] + value2=[0] + if buffer: + for RCUi in range(self.N): + self.GetI2Cbuffer(RCUi,dev,width,bitoffset,value2) + value[RCUi]=value2[0] + return value + self.SWcallback(mask) + self.SetI2CAddr(self,dev) + for RCUi in range(self.N): + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) + self.GetI2Cnoreg(RCUi,dev,width,bitoffset,value2) + value[RCUi]=value2[0] + return value; + devs=[V1.Vars[Vari].devreg for Vari in range(V1.nVars)] + GetSPIbb2(SetBit,GetBit,0,devs,value1) + + + def SetVarValue(self,RCUi,var,value): + if var.devreg.Register_W==-1: return True; #We can not set it, only read it e.g. temperature + logging.debug(str(("RCU1 Set ",RCUi,var,value))) + if var.type==Vars.DevType.I2C: + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) + self.SetI2C(RCUi,var.devreg,var.width,var.bitoffset,value) + elif var.type==Vars.DevType.I2Cbb: + logging.error("I2Cbb Implemented") + elif var.type==Vars.DevType.SPIbb: + logging.error("SPIbb Implemented") + else: + logging.error("Not Implemented") + + def SetI2C(self,RCUi,dev,width,bitoffset,value,buffer=False): + if dev.store>0: + previous=self.previous[RCUi,dev.store-1]; + value[0]=ApplyMask(value[0],width,bitoffset,previous); + self.previous[RCUi,dev.store-1]=value[0] +# logging.debug(str(('masked to',value))) +# logging.debug(str(("Store buffer",RCUi,dev.store,value[0]))) + if buffer: return True; + return self.I2Ccallback(dev.Addr,value,reg=dev.Register_W) + + def GetI2Cbuffer(self,RCUi,dev,width,bitoffset,value): + if not(dev.store>0): return False; + value[0]=self.previous[RCUi,dev.store-1]; +# logging.debug(str(("GetI2Cbuffer",RCUi,dev.store,value))) + l1=int(np.floor((width+bitoffset+7)/8)) + if (width!=l1*8) or (bitoffset>0): + value[0]=UnMask(value[0],width,bitoffset) + return True + + def GetI2C(self,RCUi,dev,width,bitoffset,value): +# if dev.store>0: +# value[0]=self.previous[RCUi,dev.store-1] +# return True + l1=int(np.floor((width+bitoffset+7)/8)) +# print(width,bitoffset,l1) + makesinglevalue=((len(value)==1) and (l1>1)); + if makesinglevalue: value2=[0 for x in range(l1)] + else: value2=value + reg=dev.Register_R + if reg>255: #This is for the monitor ADC + if not(self.I2Ccallback(dev.Addr,int2bytes(reg),read=2)): return False; + I2Ccallback(Addr,[250],read=3) + if not(self.I2Ccallback(dev.Addr,value2,read=1)): return False; + else: + if not(self.I2Ccallback(dev.Addr,value2,reg=reg,read=1)): return False; + if value2[0] is None: return False + if makesinglevalue: value[0]=bytes2int(value2) + else: value[:]=value2[:]; + if dev.store>0: + self.previous[RCUi,dev.store-1]=value[0] +# logging.debug(str(("Store buffer",RCUi,dev.store,value[0]))) + if (width!=l1*8) or (bitoffset>0): + value[0]=UnMask(value[0],width,bitoffset) + else: value[0]=value2[0] + return True; + def GetI2Cbit(self,RCUi,dev,pin): + value2=[value] + self.I2CGet(RCUi,dev,1,1<<pin,value2) + return value2[0] + + + def SetI2CAddr(self,RCUi,dev): + return self.I2Ccallback(dev.Addr,int2bytes(dev.Register_R),read=2) + + + + def GetI2Cnoreg(self,RCUi,dev,width,bitoffset,value): + l1=int(np.floor((width+bitoffset+7)/8)) + makesinglevalue=((len(value)==1) and (l1>1)); + if makesinglevalue: value2=[0 for x in range(l1)] + else: value2=value + reg=dev.Register_R + if not(self.I2Ccallback(dev.Addr,value2,read=1)): return False; + if value2[0] is None: return False + if makesinglevalue: value[0]=bytes2int(value2) + else: value[:]=value2[:]; + if dev.store>0: + self.previous[RCUi,dev.store-1]=value[0] +# logging.debug(str(("Store buffer",RCUi,dev.store,value[0]))) + if (width!=l1*8) or (bitoffset>0): + value[0]=UnMask(value[0],width,bitoffset) + #else: value[0]=value2[0] + return True; + + def start(self,Q1): + def RCUthread(Q1): + while True: + item = Q1.get() + if item is None: break; + self.SetVar(item) + logging.info("End RCU thread") + + RCUthread1 = threading.Thread(target=RCUthread, args=(Q1,)) + RCUthread1.start() + + return RCUthread1 + +# def Queue_Monitor(self,Q1): +# Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_temp,32,[0]*32) +# Q1.put(Inst1) +# Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_ADC_lock,96,[0]*96) +# Q1.put(Inst1) + + + def AddVars(self,Q1,AddVarR,AddVarW): + for v in Vars.OPC_devvars: + dim=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.nVars + varvalue2=(dim*[0.0] if v.type==Vars.datatype.dfloat else dim*[0]) + if v.RW in [Vars.RW.ReadOnly,Vars.RW.ReadWrite]: + var1=AddVarR(v.name+"_R",varvalue2,v) + v.OPCR=var1 + Inst=Vars.Instr(Vars.DevType.VarUpdate,v,dim,varvalue2) + Q1.put(Inst) + + if v.RW in [Vars.RW.WriteOnly,Vars.RW.ReadWrite]: + var1=AddVarW(v.name+"_RW",varvalue2,v,Q1) + v.OPCW=var1 + + def AddMethod(self,Q1,Addmethod): + for v in Vars.OPC_methods: + Inst1=Vars.Instr(Vars.DevType.Instr,v,0,[]) + Addmethod(v.name,Inst1,Q1) diff --git a/clk/HWconf.py b/clk/HWconf.py new file mode 100644 index 0000000..95060df --- /dev/null +++ b/clk/HWconf.py @@ -0,0 +1,13 @@ +#from collections import namedtuple +#from enum import Enum +from pcctypes import * + +#Mid plane address +RCU_MPaddr=MPaddr(1,[1],1,[7]) + +CLK_IO3_OUT1=DevReg(0x20,0,2,1) +CLK_IO3_OUT2=DevReg(0x20,1,3,2) +CLK_IO3_CONF1=DevReg(0x20,6,6,3) +CLK_IO3_CONF2=DevReg(0x20,7,7,4) + +RCU_storeReg=4; #Number of stored registers diff --git a/clk/Vars.py b/clk/Vars.py new file mode 100644 index 0000000..35d7660 --- /dev/null +++ b/clk/Vars.py @@ -0,0 +1,24 @@ +from .HWconf import * + +CLK_IGNORE_PPS= VarArray("CLK_Ignore_PPS",1,[Var2dev("",I2Cmodules.CLK,DevType.I2C,CLK_IO3_OUT1,1 ,6,1)],RW.ReadOnly,datatype.dInt,None,None) +CLK_Enable_PWR= VarArray("CLK_Enable_PWR",1,[Var2dev("",I2Cmodules.CLK,DevType.I2C,CLK_IO3_OUT1,1 ,7,1)],RW.ReadOnly,datatype.dInt,None,None) +CLK_Stat1 = VarArray("CLK_Stat" ,1,[Var2dev("",I2Cmodules.CLK,DevType.I2C,CLK_IO3_OUT1,1 ,4,1)],RW.ReadOnly,datatype.dInt,None,None) + +OPC_devvars=[CLK_IGNORE_PPS,CLK_Enable_PWR,CLK_Stat1] + +RCU_init=Instrs("ReadRegisters",2,[ + Instr(DevType.VarUpdate,CLK_IGNORE_PPS,1,[0]), + Instr(DevType.VarUpdate,CLK_Enable_PWR,1,[0]) +]) + +CLK_on=Instrs("CLK_on",2,[ + Instr(DevType.I2C,CLK_IO3_CONF1,1,[0x2C]), + Instr(DevType.I2C,CLK_IO3_OUT1 ,1,[0x42]), +]) + +CLK_off=Instrs("CLK_off",2,[ + Instr(DevType.I2C,CLK_IO3_CONF1,1,[0x2C]), + Instr(DevType.I2C,CLK_IO3_OUT1 ,1,[0x40]), +]) + +OPC_methods=[CLK_on] diff --git a/pcctypes.py b/pcctypes.py new file mode 100644 index 0000000..8669628 --- /dev/null +++ b/pcctypes.py @@ -0,0 +1,39 @@ +#For capnproto +from collections import namedtuple +from enum import Enum +from recordclass import recordclass + +MPaddr=namedtuple("MPaddr","nI2C I2C nSwitch Switch"); +DevReg=namedtuple("DevReg","Addr Register_R Register_W store"); +BBdev=namedtuple("BBdev","nPins devs pins addr") + +class I2Cmodules(Enum): + Switch = 0 + RCU = 1 + CLK = 2 + UNB2 = 3 + +class DevType(Enum): + Var = 0 + I2C = 1 + SPIbb= 2 + I2Cbb= 3 + Instr =4 + VarUpdate = 5 + Internal = 6 + +class RW(Enum): + Hidden = 0 #Not an OPC_UA variable + ReadOnly = 1 #OPC_variable name_R + WriteOnly = 2 #OPC_variable name_RW + ReadWrite = 3 #both of above + +class datatype(Enum): + dInt = 0 + dfloat = 1 + +Var2dev=namedtuple("Var2dev","name module type devreg width bitoffset Scale") +VarArray=recordclass("VarArray","name nVars Vars RW type OPCR OPCW") #OPCR and OPCW linked at runtime + +Instr=namedtuple("DevInstr","type dev nvalue value") +Instrs=namedtuple("Instr","name ninstr instr") diff --git a/pypcc2.py b/pypcc2.py index de1112f..ab54a2a 100644 --- a/pypcc2.py +++ b/pypcc2.py @@ -4,6 +4,7 @@ try: except ImportError: import Queue as queue; from rcu import RCU +from clk import CLK from i2c import I2Cswitch1 import threading import signal @@ -32,7 +33,8 @@ else: from i2c import I2C #Queue used to pass instructions from opc-ua server to RCU -Q1=queue.Queue() +Q1=queue.Queue() #RCUs +Q2=queue.Queue() #CLK #Setup OPCUA server (running in its own thread) opcuaserv.InitServer(port=args.port) @@ -41,12 +43,15 @@ logging.info("OPC-UA Server started") SW1=I2Cswitch1.I2Cswitch1(I2C.I2C1server) RCU=RCU.RCU1(32,I2C.I2C1server,SW1.SetChannel) - RCU.AddVars(Q1,opcuaserv.AddVarR,opcuaserv.AddVarW) RCU.AddMethod(Q1,opcuaserv.Addmethod) - RCU.load() #Load current register values from HW +#CLK=CLK.RCU1(1,I2C.I2C1server,SW1.SetChannel) +#CLK.AddVars(Q2,opcuaserv.AddVarR,opcuaserv.AddVarW) +#CLK.AddMethod(Q2,opcuaserv.Addmethod) +#CLK.load() #Load current register values from HW + #logging.debug(str(("I2C bytes=",I2C.I2Ccounter))) if False: @@ -54,6 +59,7 @@ if False: exit() RCUthread1=RCU.start(Q1) +#CLKthread1=CLK.start(Q2) RunTimer=True; def TimerThread(Q1,RCU): @@ -80,6 +86,7 @@ Timerthread1.start() def signal_handler(sig, frame): logging.info('Stop RCU thread') Q1.put(None) + Q2.put(None) logging.info('Stop timer thread') global RunTimer; RunTimer=False @@ -96,4 +103,5 @@ finally: logging.info("Stop OPC-UA server") opcuaserv.server.stop() RCUthread1.join() +# CLKthread1.join() Timerthread1.join() diff --git a/rcu/HWconf.py b/rcu/HWconf.py index 25c10af..0b00a7f 100644 --- a/rcu/HWconf.py +++ b/rcu/HWconf.py @@ -1,12 +1,12 @@ -from collections import namedtuple -from enum import Enum - +#from collections import namedtuple +#from enum import Enum +from pcctypes import * #Mid plane address -MPaddr=namedtuple("MPaddr","nI2C I2C nSwitch Switch"); +#MPaddr=namedtuple("MPaddr","nI2C I2C nSwitch Switch"); RCU_MPaddr=MPaddr(1,[1],32,[1,2,3,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]) -CLK_MPaddr=MPaddr(1,[1],1,[7]) +#CLK_MPaddr=MPaddr(1,[1],1,[7]) -DevReg=namedtuple("DevReg","Addr Register_R Register_W store"); +#DevReg=namedtuple("DevReg","Addr Register_R Register_W store"); #I2C:Addr=I2C addr (int) #BBdev: Addr=BBdev (pointer) @@ -40,7 +40,7 @@ RCU_AN_Ch2=DevReg(0x14,0xB180,-1,0) RCU_AN_Temp=DevReg(0x14,0xA0C0,-1,0) #Bitbang devices -BBdev=namedtuple("BBdev","nPins devs pins addr") +#BBdev=namedtuple("BBdev","nPins devs pins addr") I2CBB_dth3=BBdev(3,[RCU_IO1_OUT1,RCU_IO2_OUT2,RCU_IO2_CONF2],[6,3,3],0x70); #SCL,SDIO,SDIOdir I2CBB_dth2=BBdev(3,[RCU_IO1_OUT2,RCU_IO2_OUT1,RCU_IO1_CONF1],[7,7,7],0x70); I2CBB_dth1=BBdev(3,[RCU_IO1_OUT2,RCU_IO2_OUT1,RCU_IO1_CONF1],[7,7,7],0x70); @@ -83,11 +83,11 @@ RCU_Dth3_Prop =DevReg(I2CBB_dth3,0x11 ,0x11,0) RCU_Dth3_Start=DevReg(I2CBB_dth3,0x62 ,0x62,0) RCU_Dth3_Stop =DevReg(I2CBB_dth3,0x67 ,0x67,0) -class DevType(Enum): - Var = 0 - I2C = 1 - SPIbb= 2 - I2Cbb= 3 - Instr =4 - VarUpdate = 5 - Internal = 6 +#class DevType(Enum): +# Var = 0 +# I2C = 1 +# SPIbb= 2 +# I2Cbb= 3 +# Instr =4 +# VarUpdate = 5 +# Internal = 6 diff --git a/rcu/RCU.py b/rcu/RCU.py index 130db87..93b325d 100644 --- a/rcu/RCU.py +++ b/rcu/RCU.py @@ -126,7 +126,7 @@ class RCU1(): def GetVarValue(self,RCUi,var,value): logging.info(str(("RCU1 Get ",RCUi,var,value))) if var.type==Vars.DevType.I2C: - self.SWcallback(1<<var.MPaddr.Switch[RCUi]) + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) self.GetI2C(RCUi,var.devreg,var.width,var.bitoffset,value) elif var.type==Vars.DevType.I2Cbb: logging.error("I2Cbb Implemented") @@ -138,7 +138,7 @@ class RCU1(): def GetVarValueAll(self,V1,value1): mask=0; for RCUi in range(self.N): - mask|=1<<V1.Vars[0].MPaddr.Switch[RCUi] + mask|=1<<Vars.RCU_MPaddr.Switch[RCUi] Step=V1.nVars if V1.Vars[0].type==Vars.DevType.I2C: for Vari in range(Step): @@ -147,7 +147,7 @@ class RCU1(): self.SetI2CAddr(self,DevReg) if DevReg.Register_R>255: self.I2Ccallback(DevReg.Addr,[250],read=3) #Wait for ADC for RCUi in range(self.N): - self.SWcallback(1<<V1.Vars[0].MPaddr.Switch[RCUi]) + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) value2=value1[RCUi*Step+Vari:RCUi*Step+Vari+1] var=V1.Vars[Vari] self.GetI2Cnoreg(RCUi,var.devreg,var.width,var.bitoffset,value2) @@ -173,7 +173,7 @@ class RCU1(): self.SWcallback(mask) self.SetI2CAddr(self,dev) for RCUi in range(self.N): - self.SWcallback(1<<V1.Vars[0].MPaddr.Switch[RCUi]) + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) self.GetI2Cnoreg(RCUi,dev,width,bitoffset,value2) value[RCUi]=value2[0] return value; @@ -185,7 +185,7 @@ class RCU1(): if var.devreg.Register_W==-1: return True; #We can not set it, only read it e.g. temperature logging.debug(str(("RCU1 Set ",RCUi,var,value))) if var.type==Vars.DevType.I2C: - self.SWcallback(1<<var.MPaddr.Switch[RCUi]) + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) self.SetI2C(RCUi,var.devreg,var.width,var.bitoffset,value) elif var.type==Vars.DevType.I2Cbb: logging.error("I2Cbb Implemented") @@ -290,7 +290,7 @@ class RCU1(): def AddVars(self,Q1,AddVarR,AddVarW): for v in Vars.OPC_devvars: - dim=v.Vars[0].MPaddr.nI2C*v.Vars[0].MPaddr.nSwitch*v.nVars + dim=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.nVars #print(v.name,dim) varvalue2=(dim*[0.0] if v.type==Vars.datatype.dfloat else dim*[0]) if v.RW in [Vars.RW.ReadOnly,Vars.RW.ReadWrite]: diff --git a/rcu/Vars.py b/rcu/Vars.py index 966a5de..f3b5de3 100644 --- a/rcu/Vars.py +++ b/rcu/Vars.py @@ -1,32 +1,24 @@ -from collections import namedtuple +#from collections import namedtuple from recordclass import recordclass -from enum import Enum +#from enum import Enum from .HWconf import * #OPCUA variables -class RW(Enum): - Hidden = 0 #Not an OPC_UA variable - ReadOnly = 1 #OPC_variable name_R - WriteOnly = 2 #OPC_variable name_RW - ReadWrite = 3 #both of above - -class datatype(Enum): - dInt = 0 - dfloat = 1 - -Var2dev=namedtuple("Var2dev","name MPaddr type devreg width bitoffset Scale") -VarArray=recordclass("VarArray","name nVars Vars RW type OPCR OPCW") #OPCR and OPCW linked at runtime -RCU_att1= Var2dev("RCU_att1" ,RCU_MPaddr,DevType.I2C,RCU_IO1_OUT1,5 ,0,1) -RCU_att2= Var2dev("RCU_att2" ,RCU_MPaddr,DevType.I2C,RCU_IO1_OUT2,5 ,0,1) -RCU_att3= Var2dev("RCU_att3" ,RCU_MPaddr,DevType.I2C,RCU_IO2_OUT1,5 ,0,1) -RCU_band1=Var2dev("RCU_band1",RCU_MPaddr,DevType.I2C,RCU_IO2_OUT2,2 ,0,1) -RCU_band2=Var2dev("RCU_band2",RCU_MPaddr,DevType.I2C,RCU_IO2_OUT2,2 ,2,1) -RCU_band3=Var2dev("RCU_band3",RCU_MPaddr,DevType.I2C,RCU_IO2_OUT2,2 ,4,1) -RCU_led0= Var2dev("RCU_led0" ,RCU_MPaddr,DevType.I2C,RCU_IO2_OUT2,2 ,6,1) -RCU_pwrd1=Var2dev("RCU_pwrd1",RCU_MPaddr,DevType.I2C,RCU_IO2_OUT1,1 ,6,1) -RCU_temp1=Var2dev("RCU_temp1",RCU_MPaddr,DevType.I2C,RCU_AN_Temp ,23,0,4.21e-3) - -dummy=Var2dev("Dummy",RCU_MPaddr,DevType.Internal,None,8,0,1) +RCUmod=I2Cmodules.RCU + +#Var2dev=namedtuple("Var2dev","name MPaddr type devreg width bitoffset Scale") +#VarArray=recordclass("VarArray","name nVars Vars RW type OPCR OPCW") #OPCR and OPCW linked at runtime +RCU_att1= Var2dev("RCU_att1" ,RCUmod,DevType.I2C,RCU_IO1_OUT1,5 ,0,1) +RCU_att2= Var2dev("RCU_att2" ,RCUmod,DevType.I2C,RCU_IO1_OUT2,5 ,0,1) +RCU_att3= Var2dev("RCU_att3" ,RCUmod,DevType.I2C,RCU_IO2_OUT1,5 ,0,1) +RCU_band1=Var2dev("RCU_band1",RCUmod,DevType.I2C,RCU_IO2_OUT2,2 ,0,1) +RCU_band2=Var2dev("RCU_band2",RCUmod,DevType.I2C,RCU_IO2_OUT2,2 ,2,1) +RCU_band3=Var2dev("RCU_band3",RCUmod,DevType.I2C,RCU_IO2_OUT2,2 ,4,1) +RCU_led0= Var2dev("RCU_led0" ,RCUmod,DevType.I2C,RCU_IO2_OUT2,2 ,6,1) +RCU_pwrd1=Var2dev("RCU_pwrd1",RCUmod,DevType.I2C,RCU_IO2_OUT1,1 ,6,1) +RCU_temp1=Var2dev("RCU_temp1",RCUmod,DevType.I2C,RCU_AN_Temp ,23,0,4.21e-3) + +dummy=Var2dev("Dummy",RCUmod,DevType.Internal,None,8,0,1) Ant_mask=VarArray("Ant_mask" ,3,[dummy,dummy,dummy] ,RW.WriteOnly,datatype.dInt,None,None) @@ -38,46 +30,46 @@ RCU_temp=VarArray("RCU_temperature",1,[RCU_temp1],RW.ReadOnly ,datatype.dfloat,N RCU_pwrd=VarArray("RCU_Pwr_dig" ,1,[RCU_pwrd1],RW.ReadOnly ,datatype.dInt ,None,None) RCU_LED =VarArray("RCU_LED0" ,1,[RCU_led0] ,RW.ReadWrite,datatype.dInt ,None,None) -RCU_Dth3_freq=Var2dev("RCU_dth1_freq",RCU_MPaddr,DevType.I2Cbb,RCU_Dth3_Freq,32,0,1e-6) -RCU_Dth2_freq=Var2dev("RCU_dth1_freq",RCU_MPaddr,DevType.I2Cbb,RCU_Dth2_Freq,32,0,1e-6) -RCU_Dth1_freq=Var2dev("RCU_dth1_freq",RCU_MPaddr,DevType.I2Cbb,RCU_Dth1_Freq,32,0,1e-6) +RCU_Dth3_freq=Var2dev("RCU_dth1_freq",RCUmod,DevType.I2Cbb,RCU_Dth3_Freq,32,0,1e-6) +RCU_Dth2_freq=Var2dev("RCU_dth1_freq",RCUmod,DevType.I2Cbb,RCU_Dth2_Freq,32,0,1e-6) +RCU_Dth1_freq=Var2dev("RCU_dth1_freq",RCUmod,DevType.I2Cbb,RCU_Dth1_Freq,32,0,1e-6) RCU_dth_freq=VarArray("RCU_dither_freq",3,[RCU_Dth1_freq,RCU_Dth2_freq,RCU_Dth3_freq],RW.ReadWrite,datatype.dfloat,None,None) -RCU_ADC1_lock=Var2dev("RCU_ADC1_lock",RCU_MPaddr,DevType.SPIbb,RCU_ADC1_PLL_stat,8,0,1) -RCU_ADC2_lock=Var2dev("RCU_ADC2_lock",RCU_MPaddr,DevType.SPIbb,RCU_ADC2_PLL_stat,8,0,1) -RCU_ADC3_lock=Var2dev("RCU_ADC3_lock",RCU_MPaddr,DevType.SPIbb,RCU_ADC3_PLL_stat,8,0,1) +RCU_ADC1_lock=Var2dev("RCU_ADC1_lock",RCUmod,DevType.SPIbb,RCU_ADC1_PLL_stat,8,0,1) +RCU_ADC2_lock=Var2dev("RCU_ADC2_lock",RCUmod,DevType.SPIbb,RCU_ADC2_PLL_stat,8,0,1) +RCU_ADC3_lock=Var2dev("RCU_ADC3_lock",RCUmod,DevType.SPIbb,RCU_ADC3_PLL_stat,8,0,1) RCU_ADC_lock=VarArray("RCU_ADC_lock",3,[RCU_ADC1_lock,RCU_ADC2_lock,RCU_ADC3_lock],RW.ReadOnly,datatype.dInt,None,None) -RCU_ADC1_SYNC=Var2dev("RCU_ADC1_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC1_SYNC_ctr,8,0,1) -RCU_ADC2_SYNC=Var2dev("RCU_ADC2_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC2_SYNC_ctr,8,0,1) -RCU_ADC3_SYNC=Var2dev("RCU_ADC3_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC3_SYNC_ctr,8,0,1) +RCU_ADC1_SYNC=Var2dev("RCU_ADC1_SYNC",RCUmod,DevType.SPIbb,RCU_ADC1_SYNC_ctr,8,0,1) +RCU_ADC2_SYNC=Var2dev("RCU_ADC2_SYNC",RCUmod,DevType.SPIbb,RCU_ADC2_SYNC_ctr,8,0,1) +RCU_ADC3_SYNC=Var2dev("RCU_ADC3_SYNC",RCUmod,DevType.SPIbb,RCU_ADC3_SYNC_ctr,8,0,1) RCU_ADC_SYNC=VarArray("RCU_ADC_SYNC",3,[RCU_ADC1_SYNC,RCU_ADC2_SYNC,RCU_ADC3_SYNC],RW.ReadOnly,datatype.dInt,None,None) -RCU_ADC1_JESD=Var2dev("RCU_ADC1_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC1_JESD_ctr,8,0,1) -RCU_ADC2_JESD=Var2dev("RCU_ADC2_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC2_JESD_ctr,8,0,1) -RCU_ADC3_JESD=Var2dev("RCU_ADC3_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC3_JESD_ctr,8,0,1) +RCU_ADC1_JESD=Var2dev("RCU_ADC1_SYNC",RCUmod,DevType.SPIbb,RCU_ADC1_JESD_ctr,8,0,1) +RCU_ADC2_JESD=Var2dev("RCU_ADC2_SYNC",RCUmod,DevType.SPIbb,RCU_ADC2_JESD_ctr,8,0,1) +RCU_ADC3_JESD=Var2dev("RCU_ADC3_SYNC",RCUmod,DevType.SPIbb,RCU_ADC3_JESD_ctr,8,0,1) RCU_ADC_JESD=VarArray("RCU_ADC_JESD",3,[RCU_ADC1_JESD,RCU_ADC2_JESD,RCU_ADC3_JESD],RW.ReadOnly,datatype.dInt,None,None) -RCU_ADC1_CML=Var2dev("RCU_ADC1_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC1_CML_level,8,0,1) -RCU_ADC2_CML=Var2dev("RCU_ADC2_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC2_CML_level,8,0,1) -RCU_ADC3_CML=Var2dev("RCU_ADC3_SYNC",RCU_MPaddr,DevType.SPIbb,RCU_ADC3_CML_level,8,0,1) +RCU_ADC1_CML=Var2dev("RCU_ADC1_SYNC",RCUmod,DevType.SPIbb,RCU_ADC1_CML_level,8,0,1) +RCU_ADC2_CML=Var2dev("RCU_ADC2_SYNC",RCUmod,DevType.SPIbb,RCU_ADC2_CML_level,8,0,1) +RCU_ADC3_CML=Var2dev("RCU_ADC3_SYNC",RCUmod,DevType.SPIbb,RCU_ADC3_CML_level,8,0,1) RCU_ADC_CML=VarArray("RCU_ADC_CML",3,[RCU_ADC1_CML,RCU_ADC2_CML,RCU_ADC3_CML],RW.ReadOnly,datatype.dInt,None,None) -RCU_IO1_1= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO1_OUT1,8,0,1) -RCU_IO1_2= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO1_OUT2,8,0,1) -#RCU_IO1_3= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO1_CONF1,8,0,1) -#RCU_IO1_4= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO1_CONF2,8,0,1) +RCU_IO1_1= Var2dev("" ,RCUmod,DevType.I2C,RCU_IO1_OUT1,8,0,1) +RCU_IO1_2= Var2dev("" ,RCUmod,DevType.I2C,RCU_IO1_OUT2,8,0,1) +#RCU_IO1_3= Var2dev("" ,RCUmod,DevType.I2C,RCU_IO1_CONF1,8,0,1) +#RCU_IO1_4= Var2dev("" ,RCUmod,DevType.I2C,RCU_IO1_CONF2,8,0,1) #RCU_IO1=VarArray("RCU_IO1",3,[RCU_IO1_1,RCU_IO1_2,RCU_IO1_3],RW.ReadOnly,datatype.dInt,None,None) -RCU_IO2_1= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO2_OUT1,8,0,1) -RCU_IO2_2= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO2_OUT2,8,0,1) -#RCU_IO2_3= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO2_CONF1,8,0,1) -#RCU_IO2_4= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO2_CONF2,8,0,1) +RCU_IO2_1= Var2dev("" ,RCUmod,DevType.I2C,RCU_IO2_OUT1,8,0,1) +RCU_IO2_2= Var2dev("" ,RCUmod,DevType.I2C,RCU_IO2_OUT2,8,0,1) +#RCU_IO2_3= Var2dev("" ,RCUmod,DevType.I2C,RCU_IO2_CONF1,8,0,1) +#RCU_IO2_4= Var2dev("" ,RCUmod,DevType.I2C,RCU_IO2_CONF2,8,0,1) #RCU_IO2=VarArray("RCU_IO2",3,[RCU_IO2_1,RCU_IO2_2,RCU_IO2_3],RW.ReadOnly,datatype.dInt,None,None) -RCU_IO3_1= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO3_OUT1,8,0,1) -RCU_IO3_2= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO3_OUT2,8,0,1) -#RCU_IO3_3= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO3_CONF1,8,0,1) -#RCU_IO3_4= Var2dev("" ,RCU_MPaddr,DevType.I2C,RCU_IO3_CONF2,8,0,1) +RCU_IO3_1= Var2dev("" ,RCUmod,DevType.I2C,RCU_IO3_OUT1,8,0,1) +RCU_IO3_2= Var2dev("" ,RCUmod,DevType.I2C,RCU_IO3_OUT2,8,0,1) +#RCU_IO3_3= Var2dev("" ,RCUmod,DevType.I2C,RCU_IO3_CONF1,8,0,1) +#RCU_IO3_4= Var2dev("" ,RCUmod,DevType.I2C,RCU_IO3_CONF2,8,0,1) #RCU_IO3=VarArray("RCU_IO3",3,[RCU_IO3_1,RCU_IO3_2,RCU_IO3_3],RW.ReadOnly,datatype.dInt,None,None) RCU_OUT1=VarArray("RCU_OUT1",3,[RCU_IO1_1,RCU_IO2_1,RCU_IO3_1],RW.ReadOnly,datatype.dInt,None,None) @@ -94,10 +86,10 @@ OPC_devvars=[RCU_mask,Ant_mask,RCU_att,RCU_band,RCU_temp,RCU_pwrd,RCU_LED,RCU_AD -Instr=namedtuple("DevInstr","type dev nvalue value") +#Instr=namedtuple("DevInstr","type dev nvalue value") +#Instrs=namedtuple("Instr","name ninstr instr") #OPCUA methods -Instrs=namedtuple("Instr","name ninstr instr") RCU_init=Instrs("ReadRegisters",2,[ Instr(DevType.VarUpdate,RCU_OUT1,3,[0,0,0]), -- GitLab