diff --git a/clk/CLK.py b/clk/CLK.py deleted file mode 100644 index f5a70f15e76b4c541adb251f65b0e79f1aaa94e7..0000000000000000000000000000000000000000 --- a/clk/CLK.py +++ /dev/null @@ -1,353 +0,0 @@ -from . import Vars -import numpy as np -import logging -from .spibitbang2 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; - -def strs2bytes(var): -# print("str2bytes",var) - if len(var)==0: return var; - if isinstance(var[0],str): #make string a byte array -# return [ord(c.encode('utf-8')[0]) for s in var for c in s] - return [c.encode('utf-8')[0] for s in var for c in s] - return var - -def bytes2strs(var,step,dtype): - if not(dtype==Vars.datatype.dstring): return var - cnt=int(len(var)/step) - print(var) - return [(bytearray(var[i*step:(i+1)*step]).decode("utf-8")) for i in range(cnt)] - -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,Mask=[]): -# Instr.value=strs2bytes(Instr.value) #Alwast be an array of bytes - if (self.N==1): Mask=[True] - if Instr.type==Vars.DevType.Instr: - #Execute instructions - Iset=Instr.dev; - if len(Mask)==0: Mask=Vars.RCU_mask.OPCW.get_data_value().Value.Value - for i in Iset.instr: - logging.debug(str(("Inst",i))) - self.SetVar(i,Mask=Mask) - return; - if Instr.type in [Vars.DevType.I2C,Vars.DevType.SPIbb,Vars.DevType.I2Cbb]: - if len(Mask)==0: Mask=Vars.RCU_mask.OPCW.get_data_value().Value.Value - mask=0; - RCU0=-1; - for RCUi in range(self.N): - if (Mask[RCUi]): - 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,strs2bytes(Instr.value)) - return; - elif Instr.type==Vars.DevType.SPIbb: - logging.debug(str(('** Set SPIbb:',Instr.dev,Instr.value))) - SetSPIbb(self.SetI2C,RCU0,Instr.dev,strs2bytes(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,strs2bytes(Instr.value)) - return; - V1=Instr.dev - if not((Instr.nvalue==V1.nVars) and (Instr.type==Vars.DevType.VarUpdate)) and not(Instr.nvalue==V1.size*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 - Step2=int(V1.size/V1.nVars) - if (self.N>1): - Mask=(Vars.RCU_mask if Step==1 else Vars.Ant_mask) - Mask=Mask.OPCW.get_data_value().Value.Value - value1=strs2bytes(Instr.value) if V1.OPCR is None else strs2bytes(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) or ((self.N==1) and (Instr.type==Vars.DevType.VarUpdate)): - logging.info(str(('** Set Var:',V1.name,value1))) - for RCUi in range(self.N): - for Vari in range(Step): - if not(Mask[RCUi*Step+Vari]): continue - i0=(RCUi*Step+ Vari)*Step2 - i1=(RCUi*Step+(Vari+1))*Step2 - self.SetVarValue(RCUi,V1.Vars[Vari],Instr.value[i0:i1]) - value2=value1[i0:i1] - self.GetVarValue(RCUi,V1.Vars[Vari],value2) - value1[i0:i1]=value2 - if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type) - elif Instr.type==Vars.DevType.VarUpdate: - self.GetVarValueAll(V1,value1) - if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type) -# 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: - self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) - GetSPIbb(self.SetI2C,self.GetI2C,RCUi,var.devreg,value) -# self.GetSPIBB(RCUi,var.devreg,var.width,var.bitoffset,value) -# 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 - Step2=int(V1.size/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]) - i0=(RCUi*Step+ Vari)*Step2 - i1=(RCUi*Step+(Vari+1))*Step2 - value2=value1[i0:i1] - var=V1.Vars[Vari] -# print(Step,Step2,i0,i1,value2,len(value1)) - self.GetI2Cnoreg(RCUi,var.devreg,var.width,var.bitoffset,value2) -# print(value2) - if (var.Scale!=0): value2[0]*=var.Scale; - value1[i0:i1]=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") -# print(value1) - 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]) - #for i in range(len(value2)): value2[i]*=0; - value2[0]=0 - 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): - for i in range(len(value)): - value[i]=UnMask(value[i],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): - for i in range(len(value)): - value[i]=UnMask(value[i],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): - #print(width,len(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<8: - if (width!=l1*8) or (bitoffset>0): - for i in range(len(value)): - value[i]=UnMask(value[i],width,bitoffset) -# value[0]=UnMask(value[0],width,bitoffset) - #else: value[0]=value2[0] - #if (len(value)>1) and (width<8): print value - 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) - return - - def AddVars(self,Q1,AddVarR,AddVarW): - for v in Vars.OPC_devvars: - dim1=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.nVars - dim2=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.size - dim3=int(v.size/v.nVars) - #print(v.name,dim) - varvalue2=0 - if v.type==Vars.datatype.dInt: varvalue2=dim2*[0] - elif v.type==Vars.datatype.dfloat: varvalue2=dim2*[0.0] - elif v.type==Vars.datatype.dstring: varvalue2=dim1*[" "*dim3] - print(len(varvalue2),varvalue2) - if v.RW in [Vars.RW.ReadOnly,Vars.RW.ReadWrite]: - var1=AddVarR(v.name+"_R",varvalue2,v) -# print(len(varvalue1),len(varvalue2),v.size,dim2) - v.OPCR=var1 - Inst=Vars.Instr(Vars.DevType.VarUpdate,v,dim2,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 deleted file mode 100644 index 36f14375ea723d11bb5ac124e893176503a0b13d..0000000000000000000000000000000000000000 --- a/clk/HWconf.py +++ /dev/null @@ -1,19 +0,0 @@ -#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 - - - -SPIBB_PLL=BBdev(4,[CLK_IO3_OUT1,CLK_IO3_OUT1,CLK_IO3_OUT1,CLK_IO3_OUT2],[4,7,5,6],0) #CLK,SDI,SDO,CS - -CLK_PLL_lock =DevReg(SPIBB_PLL,0X00,0X00,0) # PLL locked status diff --git a/clk/Vars.py b/clk/Vars.py deleted file mode 100644 index 20c67abf5ded629feca9327cac797dc80d689ba6..0000000000000000000000000000000000000000 --- a/clk/Vars.py +++ /dev/null @@ -1,47 +0,0 @@ -from .HWconf import * - -CLKmod=I2Cmodules.CLK - - -CLK_IGNORE_PPS= VarArray("CLK_Ignore_PPS",1,[Var2dev("",CLKmod,DevType.I2C,CLK_IO3_OUT1,1 ,6,1)],RW.ReadOnly,datatype.dInt,1,None,None) -CLK_Enable_PWR= VarArray("CLK_Enable_PWR",1,[Var2dev("",CLKmod,DevType.I2C,CLK_IO3_OUT1,1 ,7,1)],RW.ReadOnly,datatype.dInt,1,None,None) -CLK_Stat1 = VarArray("CLK_Stat" ,1,[Var2dev("",CLKmod,DevType.I2C,CLK_IO3_OUT1,1 ,4,1)],RW.ReadOnly,datatype.dInt,1,None,None) -CLK_lock1 = VarArray("CLK_Lock" ,1,[Var2dev("",CLKmod,DevType.SPIbb,CLK_PLL_lock,8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None) - - -OPC_devvars=[CLK_IGNORE_PPS,CLK_Enable_PWR,CLK_Stat1,CLK_lock1] - -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]), -]) - -def SPIinst(reg,value): - return Instr(DevType.SPIbb,DevReg(SPIBB_PLL,0,reg,0),1,[value]), -CLK_PLL_setup=Instrs("CLK_PLL_setup",2,[ - SPIinst(0x03,0x08), - SPIinst(0x05,0x97), - SPIinst(0x06,0x10), - SPIinst(0x07,0x04), - SPIinst(0x08,0x01), - SPIinst(0x07,0x00), - SPIinst(0x09,0x10), - SPIinst(0x0A,0x14), - SPIinst(0x09,0x00), - SPIinst(0x0D,0x01),#was 2 - SPIinst(0x0F,0x01), - SPIinst(0x11,0x01), - SPIinst(0x13,0x01) -]) - -OPC_methods=[CLK_on,CLK_off,CLK_PLL_setup] diff --git a/clk/__init__.py b/clk/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/clk/spibitbang2.py b/clk/spibitbang2.py deleted file mode 100644 index d7d6be041507d88a6ffd8889cbf8c11a09885c75..0000000000000000000000000000000000000000 --- a/clk/spibitbang2.py +++ /dev/null @@ -1,79 +0,0 @@ -from enum import Enum -import logging -import numpy as np - -class SPIBB_pins(Enum): - CLK = 0 - SDI = 1 - SDO = 2 - CS = 3 - -def SetSPIbb(SetI2C,RCUi,dev,value): - ADC_address=dev.Register_W - CSdev=dev.Addr.devs[SPIBB_pins.CS.value] - CSpin=dev.Addr.pins[SPIBB_pins.CS.value] - SDOdev=dev.Addr.devs[SPIBB_pins.SDO.value] - SDOpin=dev.Addr.pins[SPIBB_pins.SDO.value] - SDIdev=dev.Addr.devs[SPIBB_pins.SDI.value] - SDIpin=dev.Addr.pins[SPIBB_pins.SDI.value] - CLKdev=dev.Addr.devs[SPIBB_pins.CLK.value] - CLKpin=dev.Addr.pins[SPIBB_pins.CLK.value] - - logging.info(str(("SPIbb set",ADC_address,value))) - -# dev_rw = 0x00 # 0 for write, 1 for read -# data2 = ( reg_address << 9 ) + ( dev_rw << 8 ) + value[0] - data2 = ( ADC_address << 9 ) + value[0] - - bit_array = "{0:{fill}16b}".format(data2, fill='0') - # print(bit_array) - SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable - for bit in bit_array: - SetI2C(RCUi,SDIdev,1,SDIpin,[int(bit)]) - SetI2C(RCUi,CLKdev,1,CLKpin,[1]) - SetI2C(RCUi,CLKdev,1,CLKpin,[0]) - SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable - # SetI2C(RCUi,SDIdev,1,SDIpin,[1]) #high when finished - return True; - -def GetSPIbb(SetI2C,GetI2C,RCUi,dev,value): - ADC_reg_address=dev.Register_R - CSdev=dev.Addr.devs[SPIBB_pins.CS.value] - CSpin=dev.Addr.pins[SPIBB_pins.CS.value] - SDOdev=dev.Addr.devs[SPIBB_pins.SDO.value] - SDOpin=dev.Addr.pins[SPIBB_pins.SDO.value] - SDIdev=dev.Addr.devs[SPIBB_pins.SDI.value] - SDIpin=dev.Addr.pins[SPIBB_pins.SDI.value] - CLKdev=dev.Addr.devs[SPIBB_pins.CLK.value] - CLKpin=dev.Addr.pins[SPIBB_pins.CLK.value] - - logging.info(str(("SPIbb get",ADC_reg_address))) - ADC_bytes = 0x00 - # ADC_rw = 0x01 # 0 for write, 1 for read - data = (ADC_reg_address << 1) + 1 #was 7?? - - SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable - - - bit_array = "{0:{fill}8b}".format(data, fill='0') - for bit in bit_array: - SetI2C(RCUi,SDIdev,1,SDIpin,[int(bit)]) - SetI2C(RCUi,CLKdev,1,CLKpin,[1]) - SetI2C(RCUi,CLKdev,1,CLKpin,[0]) - - # SetI2C(RCUi,SDIdev,1,SDIpin,[1]) #high when finished - - # print("read byte") - a=[0] - N=1 #len(value) - ret_value=[0] - for i in range(N): value[i]=0 - for cnt in range(8*(ADC_bytes+1)): - GetI2C(RCUi,SDOdev,1,SDOpin,ret_value) - for i in range(N): value[i]=(value[i]<<1)+ ret_value[i] - SetI2C(RCUi,CLKdev,1,CLKpin,[1]) - SetI2C(RCUi,CLKdev,1,CLKpin,[0]) #read after falling edge - SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable - return True; - - diff --git a/i2c/I2C.py b/i2c/I2C.py deleted file mode 100644 index 108cee4b8db1c8627e8fdde009a3aa2a9da117c4..0000000000000000000000000000000000000000 --- a/i2c/I2C.py +++ /dev/null @@ -1,68 +0,0 @@ -if os.sys.platform is 'linux': - import pylibi2c; -import time -import logging -#bus = pylibi2c.I2CDevice('/dev/i2c-1' -#read=0: write to register -#read=1: read from register -#read=2: write to register (common in group) -#read=3: wait ms second -I2Ccounter=0; - -def I2C1server(addr,data,reg=None,read=0): - try: - if read==3: - time.sleep(data[0]/1000.) - return True - logging.debug(str(("I2C",addr,reg,data,read))) - -# print("I2C",addr,reg,data,read) -# return True; - bus=pylibi2c.I2CDevice('/dev/i2c-1',addr) - if read==1: - length=len(data) - bus.iaddr_bytes=0 - if not(reg is None): - bus.ioctl_write(0,str(bytearray([reg]))) - data[:]=[int(x) for x in bus.ioctl_read(0,length)] - else: - if reg is None: - bus.iaddr_bytes=0 - reg=0; - bus.ioctl_write(reg,str(bytearray(data))) - bus.close() - return True; - except: - if bus: bus.close() -# data[0]=0 - return False; - - -def I2C2server(addr,data,reg=None,read=0): - try: - if read==3: - time.sleep(data[0]/1000.) - return True - logging.debug(str(("I2C2",addr,reg,data,read))) - -# print("I2C",addr,reg,data,read) -# return True; - bus=pylibi2c.I2CDevice('/dev/i2c-2',addr) - if read==1: - length=len(data) - bus.iaddr_bytes=0 - if not(reg is None): - bus.ioctl_write(0,str(bytearray([reg]))) - data[:]=[int(x) for x in bus.ioctl_read(0,length)] - else: - if reg is None: - bus.iaddr_bytes=0 - reg=0; - bus.ioctl_write(reg,str(bytearray(data))) - bus.close() - return True; - except: - if bus: bus.close() -# data[0]=0 - return False; - diff --git a/i2c/I2C_dummy.py b/i2c/I2C_dummy.py deleted file mode 100644 index d6351b08d07e2271ddae4ff7d15c527bf8ac1649..0000000000000000000000000000000000000000 --- a/i2c/I2C_dummy.py +++ /dev/null @@ -1,34 +0,0 @@ -#import pylibi2c; -import time -import logging -#bus = pylibi2c.I2CDevice('/dev/i2c-1' -#read=0: write to register -#read=1: read from register -#read=2: write to register (common in group) -#read=3: wait ms second -I2Ccounter=0; -def I2C1server(addr,data,reg=None,read=0): - global I2Ccounter; - logging.debug(str(("I2C",addr,reg,data,read))) - if read==3: - time.sleep(data[0]/1000.) - return True - if read==1: - data[0]=0 - if reg: I2Ccounter+=1; - I2Ccounter+=len(data) -# logging.debug(str(("I2C",addr,reg,data,read))) - return True - -def I2C2server(addr,data,reg=None,read=0): - global I2Ccounter; - logging.debug(str(("I2C2",addr,reg,data,read))) - if read==3: - time.sleep(data[0]/1000.) - return True - if read==1: - data[0]=0 - if reg: I2Ccounter+=1; - I2Ccounter+=len(data) -# logging.debug(str(("I2C",addr,reg,data,read))) - return True diff --git a/i2c/I2Cswitch1.py b/i2c/I2Cswitch1.py deleted file mode 100644 index 50a72c6cdb195c9f0f2efff6848e4d36b2d52d1d..0000000000000000000000000000000000000000 --- a/i2c/I2Cswitch1.py +++ /dev/null @@ -1,29 +0,0 @@ -import numpy as np -import logging -#import HWconf -SWaddr=0x70 -class I2Cswitch1(): - def __init__(self,callback1): - self.callback1=callback1; - self.CurrentChannel=0; - - def SetChannel(self,channel): - if (channel)==self.CurrentChannel: return True; - logging.debug(str(("SetChannel",channel,self.CurrentChannel))) - self.CurrentChannel=channel - return self.callback1(SWaddr,[channel]) - - def I2Ccallback(self,RCU,addr,data,reg=None,read=0): - self.callback1(addr,data,reg,read) - - - -class I2Cswitch0(): - def __init__(self,callback1): - return - - def SetChannel(self,channel): - return True - - def I2Ccallback(self,RCU,addr,data,reg=None,read=0): - return \ No newline at end of file diff --git a/i2c/__init__.py b/i2c/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/i2c/setRCUversion.py b/i2c/setRCUversion.py deleted file mode 100644 index 4771de66e197be6a9f94861bcf39c8c4b2baa3ce..0000000000000000000000000000000000000000 --- a/i2c/setRCUversion.py +++ /dev/null @@ -1,34 +0,0 @@ -from I2C import * -import time -RCU=1 -Ver="RCU2H v0.2" -R1=0 -ROM=0x50 - -#Set switch -print("Set switch") -if not(I2C1server(0x70,[1<<RCU],reg=None,read=0)): exit() #select RCU -#exit() -#Get ID -print("Get ID") -ID=[0]*4 -if not(I2C1server(ROM,ID,reg=0xFC,read=1)): exit() #select RCU -print(ID) -exit() - -#Upload version -Ver2=[(c.encode('utf-8')[0]) for c in Ver] -print(len(Ver),Ver,Ver2) -V2=[0] -for i,v in enumerate(Ver2): - time.sleep(0.1) - I2C1server(ROM,[v],reg=R1+i,read=0) #select RCU -# I2C1server(ROM,[v],reg=None,read=0) #select RCU - time.sleep(0.1) - I2C1server(ROM,V2,reg=R1+i,read=1) #select RCU - print(i,v,V2) - -#Download version -Ver2=[0]*10 -I2C1server(ROM,Ver2,reg=R1,read=1) #select RCU -print(Ver2) diff --git a/rcu/HWconf.py b/rcu/HWconf.py deleted file mode 100644 index 8f9323da309bfa5e3fc21896738e93c3592e4240..0000000000000000000000000000000000000000 --- a/rcu/HWconf.py +++ /dev/null @@ -1,102 +0,0 @@ -#from collections import namedtuple -#from enum import Enum -from pcctypes import * -#Mid plane address -#MPaddr=namedtuple("MPaddr","nI2C I2C nSwitch Switch"); -RCU_MPaddr=MPaddr(1,[1],32,[0,1,2,3,4,5,6,7,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]) - -#DevReg=namedtuple("DevReg","Addr Register_R Register_W store"); -#I2C:Addr=I2C addr (int) -#BBdev: Addr=BBdev (pointer) - -#Control board switch -#dev: TCA9548 -SW1_ch=DevReg(0x70,0,0,0) -#I2C IO-Expanders -#Device: TCA9539 -RCU_IO1_OUT1=DevReg(0x75,0,2,1) -RCU_IO1_OUT2=DevReg(0x75,1,3,2) -RCU_IO1_CONF1=DevReg(0x75,6,6,3) -RCU_IO1_CONF2=DevReg(0x75,7,7,4) -#Device: TCA9539 -RCU_IO2_OUT1=DevReg(0x76,0,2,5) -RCU_IO2_OUT2=DevReg(0x76,1,3,6) -RCU_IO2_CONF1=DevReg(0x76,6,6,7) -RCU_IO2_CONF2=DevReg(0x76,7,7,8) -#Device: TCA6416 -RCU_IO3_OUT1=DevReg(0x20,0,2,9) -RCU_IO3_OUT2=DevReg(0x20,1,3,10) -RCU_IO3_CONF1=DevReg(0x20,6,6,11) -RCU_IO3_CONF2=DevReg(0x20,7,7,12) - -RCU_storeReg=13; #Number of stored registers - -#I2C monitor ADC -RCU_AN_Ch0=DevReg(0x14,0xB080,-1,0) -RCU_AN_Ch1=DevReg(0x14,0xB880,-1,0) -RCU_AN_Ch2=DevReg(0x14,0xB180,-1,0) -#etc -RCU_AN_Temp=DevReg(0x14,0xA0C0,-1,0) - -#HBA1 -RCU_HBA1=DevReg(0x41,0,0,1) -RCU_HBA2=DevReg(0x42,0,0,2) -RCU_HBA3=DevReg(0x43,0,0,3) - - -RCU_ROM_ID =DevReg(0x50,0xfc,0xfc,0) #32 bit ID=4 bytes -RCU_ROM_Ver=DevReg(0x50,0,0,0) #String - -#Bitbang devices -#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); -SPIBB_ADC1=BBdev(4,[RCU_IO3_OUT1,RCU_IO3_OUT1,RCU_IO3_CONF1,RCU_IO3_OUT2],[1,0,0,0],0) #CLK,SDIO,SDIOdir,CS -SPIBB_ADC2=BBdev(4,[RCU_IO3_OUT1,RCU_IO3_OUT1,RCU_IO3_CONF1,RCU_IO3_OUT2],[3,2,2,1],0) #CLK,SDIO,SDIOdir,CS -SPIBB_ADC3=BBdev(4,[RCU_IO3_OUT1,RCU_IO3_OUT1,RCU_IO3_CONF1,RCU_IO3_OUT2],[5,4,4,2],0) #CLK,SDIO,SDIOdir,CS - -#SPI ADC -#Dev: AD9683 -RCU_ADC1_PLL_stat =DevReg(SPIBB_ADC1,0X0A,0X0A,0) # PLL locked status -RCU_ADC1_JESD_ctr =DevReg(SPIBB_ADC1,0X5F,0X5F,0) #JESD link control, ILAS mode -RCU_ADC1_CML_level=DevReg(SPIBB_ADC1,0X15,0X15,0) #CML output adjust -RCU_ADC1_SYNC_ctr =DevReg(SPIBB_ADC1,0X3A,0X3A,0) #SYNC / SYSREF control -RCU_ADC1_update =DevReg(SPIBB_ADC1,0XFF,0xFF,0) # Global device update - -RCU_ADC2_PLL_stat =DevReg(SPIBB_ADC2,0X0A,0X0A,0) # PLL locked status -RCU_ADC2_JESD_ctr =DevReg(SPIBB_ADC2,0X5F,0X5F,0) #JESD link control, ILAS mode -RCU_ADC2_CML_level=DevReg(SPIBB_ADC2,0X15,0X15,0) #CML output adjust -RCU_ADC2_SYNC_ctr =DevReg(SPIBB_ADC2,0X3A,0X3A,0) #SYNC / SYSREF control -RCU_ADC2_update =DevReg(SPIBB_ADC2,0XFF,0xFF,0) # Global device update - -RCU_ADC3_PLL_stat =DevReg(SPIBB_ADC3,0X0A,0X0A,0) # PLL locked status -RCU_ADC3_JESD_ctr =DevReg(SPIBB_ADC3,0X5F,0X5F,0) #JESD link control, ILAS mode -RCU_ADC3_CML_level=DevReg(SPIBB_ADC3,0X15,0X15,0) #CML output adjust -RCU_ADC3_SYNC_ctr =DevReg(SPIBB_ADC3,0X3A,0X3A,0) #SYNC / SYSREF control -RCU_ADC3_update =DevReg(SPIBB_ADC3,0XFF,0xFF,0) # Global device update - -#I2C_dither -#Dev: SI4010 -RCU_Dth1_Freq =DevReg(I2CBB_dth1,0x1140,0x1141,0) ##TBC -RCU_Dth1_Prop =DevReg(I2CBB_dth1,0x11 ,0x11,0) -RCU_Dth1_Start=DevReg(I2CBB_dth1,0x62 ,0x62,0) -RCU_Dth1_Stop =DevReg(I2CBB_dth1,0x67 ,0x67,0) -RCU_Dth2_Freq =DevReg(I2CBB_dth2,0x1140,0x1141,0) ##TBC -RCU_Dth2_Prop =DevReg(I2CBB_dth2,0x11 ,0x11,0) -RCU_Dth2_Start=DevReg(I2CBB_dth2,0x62 ,0x62,0) -RCU_Dth2_Stop =DevReg(I2CBB_dth2,0x67 ,0x67,0) -RCU_Dth3_Freq =DevReg(I2CBB_dth3,0x1140,0x1141,0) ##TBC -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 diff --git a/rcu/RCU.py b/rcu/RCU.py deleted file mode 100644 index 2c0511a932f9d4796f9cf18ec2c8d1a41ca56d9d..0000000000000000000000000000000000000000 --- a/rcu/RCU.py +++ /dev/null @@ -1,348 +0,0 @@ -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; - -def strs2bytes(var): -# print("str2bytes",var) - if len(var)==0: return var; - if isinstance(var[0],str): #make string a byte array -# return [ord(c.encode('utf-8')[0]) for s in var for c in s] - return [c.encode('utf-8')[0] for s in var for c in s] - return var - -def bytes2strs(var,step,dtype): - if not(dtype==Vars.datatype.dstring): return var - cnt=int(len(var)/step) - print(var) - return [(bytearray(var[i*step:(i+1)*step]).decode("utf-8")) for i in range(cnt)] - -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,Mask=[]): -# Instr.value=strs2bytes(Instr.value) #Alwast be an array of bytes - if Instr.type==Vars.DevType.Instr: - #Execute instructions - Iset=Instr.dev; - if len(Mask)==0: Mask=Vars.RCU_mask.OPCW.get_data_value().Value.Value - for i in Iset.instr: - logging.debug(str(("Inst",i))) - self.SetVar(i,Mask=Mask) - return; - if Instr.type in [Vars.DevType.I2C,Vars.DevType.SPIbb,Vars.DevType.I2Cbb]: - if len(Mask)==0: Mask=Vars.RCU_mask.OPCW.get_data_value().Value.Value - mask=0; - RCU0=-1; - for RCUi in range(self.N): - if (Mask[RCUi]): - 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,strs2bytes(Instr.value)) - return; - elif Instr.type==Vars.DevType.SPIbb: - logging.debug(str(('** Set SPIbb:',Instr.dev,Instr.value))) - SetSPIbb(self.SetI2C,RCU0,Instr.dev,strs2bytes(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,strs2bytes(Instr.value)) - return; - V1=Instr.dev - if not((Instr.nvalue==V1.nVars) and (Instr.type==Vars.DevType.VarUpdate)) and not(Instr.nvalue==V1.size*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 - Step2=int(V1.size/V1.nVars) - Mask=(Vars.RCU_mask if Step==1 else Vars.Ant_mask) - Mask=Mask.OPCW.get_data_value().Value.Value - value1=strs2bytes(Instr.value) if V1.OPCR is None else strs2bytes(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): - if not(Mask[RCUi*Step+Vari]): continue - i0=(RCUi*Step+ Vari)*Step2 - i1=(RCUi*Step+(Vari+1))*Step2 - self.SetVarValue(RCUi,V1.Vars[Vari],Instr.value[i0:i1]) - value2=value1[i0:i1] - self.GetVarValue(RCUi,V1.Vars[Vari],value2) - value1[i0:i1]=value2 - if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type) - - elif Instr.type==Vars.DevType.VarUpdate: - self.GetVarValueAll(V1,value1) - if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type) -# 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 - Step2=int(V1.size/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]) - i0=(RCUi*Step+ Vari)*Step2 - i1=(RCUi*Step+(Vari+1))*Step2 - value2=value1[i0:i1] - var=V1.Vars[Vari] -# print(Step,Step2,i0,i1,value2,len(value1)) - self.GetI2Cnoreg(RCUi,var.devreg,var.width,var.bitoffset,value2) -# print(value2) - if (var.Scale!=0): value2[0]*=var.Scale; - value1[i0:i1]=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") -# print(value1) - 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]) - #for i in range(len(value2)): value2[i]*=0; - value2[0]=0 - 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): - for i in range(len(value)): - value[i]=UnMask(value[i],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): - for i in range(len(value)): - value[i]=UnMask(value[i],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): - #print(width,len(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<8: - if (width!=l1*8) or (bitoffset>0): - for i in range(len(value)): - value[i]=UnMask(value[i],width,bitoffset) -# value[0]=UnMask(value[0],width,bitoffset) - #else: value[0]=value2[0] - #if (len(value)>1) and (width<8): print value - 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: - dim1=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.nVars - dim2=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.size - dim3=int(v.size/v.nVars) - #print(v.name,dim) - varvalue2=0 - if v.type==Vars.datatype.dInt: varvalue2=dim2*[0] - elif v.type==Vars.datatype.dfloat: varvalue2=dim2*[0.0] - elif v.type==Vars.datatype.dstring: varvalue2=dim1*[" "*dim3] - print(len(varvalue2),varvalue2) - if v.RW in [Vars.RW.ReadOnly,Vars.RW.ReadWrite]: - var1=AddVarR(v.name+"_R",varvalue2,v) -# print(len(varvalue1),len(varvalue2),v.size,dim2) - v.OPCR=var1 - Inst=Vars.Instr(Vars.DevType.VarUpdate,v,dim2,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/rcu/Vars.py b/rcu/Vars.py deleted file mode 100644 index b8b389656e072d90020b18056ff66da2e280772f..0000000000000000000000000000000000000000 --- a/rcu/Vars.py +++ /dev/null @@ -1,181 +0,0 @@ -#from collections import namedtuple -from recordclass import recordclass -#from enum import Enum -from .HWconf import * - -#OPCUA variables -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,3,None,None) -RCU_att =VarArray("RCU_attenuator" ,3,[RCU_att1 ,RCU_att2 ,RCU_att3] ,RW.ReadWrite,datatype.dInt,3,None,None) -RCU_band=VarArray("RCU_band" ,3,[RCU_band1,RCU_band2,RCU_band3],RW.ReadWrite,datatype.dInt,3,None,None) - -RCU_mask=VarArray("RCU_mask" ,1,[dummy] ,RW.WriteOnly,datatype.dInt ,1,None,None) -RCU_temp=VarArray("RCU_temperature",1,[RCU_temp1],RW.ReadOnly ,datatype.dfloat,1,None,None) -RCU_pwrd=VarArray("RCU_Pwr_dig" ,1,[RCU_pwrd1],RW.ReadOnly ,datatype.dInt ,1,None,None) -RCU_LED =VarArray("RCU_LED0" ,1,[RCU_led0] ,RW.ReadWrite,datatype.dInt ,1,None,None) - -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,3,None,None) - -HBA1_Delay=Var2dev("",RCUmod,DevType.HBA1,RCU_HBA1,5,2,1) -HBA1_Pwr =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA1,1,1,1) -HBA2_Delay=Var2dev("",RCUmod,DevType.HBA1,RCU_HBA2,5,2,1) -HBA2_Pwr =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA2,1,1,1) -HBA3_Delay=Var2dev("",RCUmod,DevType.HBA1,RCU_HBA3,5,2,1) -HBA3_Pwr =Var2dev("",RCUmod,DevType.HBA1,RCU_HBA3,1,1,1) -HBA1_Delay=VarArray("HBA_element_beamformer_delays",3,[HBA1_Delay,HBA2_Delay,HBA3_Delay],RW.ReadWrite,datatype.dInt,96,None,None) -HBA1_Pwr =VarArray("HBA_element_pwr" ,3,[HBA1_Pwr ,HBA2_Pwr ,HBA3_Pwr ],RW.ReadWrite,datatype.dInt,96,None,None) - -#RCU_ID0=Var2dev("",RCUmod,DevType.I2C,RCU_ROM,8,0,1) -#RCU_ID=VarArray("RCU_ID",1,[RCU_ID0],RW.ReadOnly,datatype.dInt,4,None,None) - -RCU_ID0=Var2dev("",RCUmod,DevType.I2C,RCU_ROM_ID,32,0,1) -RCU_ID=VarArray("RCU_ID",1,[RCU_ID0],RW.ReadOnly,datatype.dInt,1,None,None) -RCU_Ver0=Var2dev("",RCUmod,DevType.I2C,RCU_ROM_Ver,7,0,1) -RCU_VER=VarArray("RCU_version",1,[RCU_Ver0],RW.ReadOnly,datatype.dstring,10,None,None) - - -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,3,None,None) - -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,3,None,None) - -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,3,None,None) - -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,3,None,None) - - -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("" ,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("" ,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,3,None,None) -RCU_OUT2=VarArray("RCU_OUT2",3,[RCU_IO1_2,RCU_IO2_2,RCU_IO3_2],RW.ReadOnly,datatype.dInt,3,None,None) -#RCU_CNF1=VarArray("RCU_CONF1",3,[RCU_IO1_3,RCU_IO2_3,RCU_IO3_3],RW.ReadOnly,datatype.dInt,None,None) -#RCU_CNF2=VarArray("RCU_CONF2",3,[RCU_IO1_4,RCU_IO2_4,RCU_IO3_4],RW.ReadOnly,datatype.dInt,None,None) - - - -OPC_devvars=[RCU_mask,Ant_mask,RCU_att,RCU_band,RCU_temp,RCU_pwrd,RCU_LED,RCU_ADC_lock,RCU_ADC_SYNC,RCU_ADC_JESD,RCU_ADC_CML,RCU_OUT1,RCU_OUT2,RCU_ID,RCU_VER,HBA1_Delay,HBA1_Pwr]#,RCU_CNF1,RCU_CNF2] - - - - - - -#Instr=namedtuple("DevInstr","type dev nvalue value") -#Instrs=namedtuple("Instr","name ninstr instr") - -#OPCUA methods - -RCU_init=Instrs("ReadRegisters",2,[ - Instr(DevType.VarUpdate,RCU_OUT1,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_OUT2,3,[0,0,0]) -]) - -ADC_on=Instrs("ADC_on",16,[ - Instr(DevType.SPIbb,RCU_ADC1_JESD_ctr,1,[0x14]), - Instr(DevType.SPIbb,RCU_ADC1_CML_level,1,[0x7]), - Instr(DevType.SPIbb,RCU_ADC1_SYNC_ctr,1,[1]), - Instr(DevType.SPIbb,RCU_ADC1_update,1,[1]), - Instr(DevType.SPIbb,RCU_ADC2_JESD_ctr,1,[0x14]), - Instr(DevType.SPIbb,RCU_ADC2_CML_level,1,[0x7]), - Instr(DevType.SPIbb,RCU_ADC2_SYNC_ctr,1,[1]), - Instr(DevType.SPIbb,RCU_ADC2_update,1,[1]), - Instr(DevType.SPIbb,RCU_ADC3_JESD_ctr,1,[0x14]), - Instr(DevType.SPIbb,RCU_ADC3_CML_level,1,[0x7]), - Instr(DevType.SPIbb,RCU_ADC3_SYNC_ctr,1,[1]), - Instr(DevType.SPIbb,RCU_ADC3_update,1,[1]), - Instr(DevType.VarUpdate,RCU_ADC_SYNC,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_ADC_JESD,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_ADC_CML,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_ADC_lock,3,[0,0,0]) -]) - -RCU_on=Instrs("RCU_on",12,[ - Instr(DevType.I2C,RCU_IO2_CONF1,1,[0]), - Instr(DevType.I2C,RCU_IO2_CONF2,1,[0]), - Instr(DevType.I2C,RCU_IO3_CONF1,1,[0]), - Instr(DevType.I2C,RCU_IO3_CONF2,1,[0]), - Instr(DevType.I2C,RCU_IO1_CONF1,1,[0]), - Instr(DevType.I2C,RCU_IO1_CONF2,1,[0]), - Instr(DevType.I2C,RCU_IO2_OUT1,1,[0x4A]), - Instr(DevType.I2C,RCU_IO2_OUT2,1,[0x55]), - Instr(DevType.I2C,RCU_IO3_OUT1,1,[0x15]), - Instr(DevType.I2C,RCU_IO3_OUT2,1,[0x47]), - Instr(DevType.I2C,RCU_IO1_OUT1,1,[0xCA]), - Instr(DevType.I2C,RCU_IO1_OUT2,1,[0xCA]), -# Instr(DevType.VarUpdate,RCU_att,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_pwrd,1,[0]), - Instr(DevType.VarUpdate,RCU_OUT1,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_OUT2,3,[0,0,0]), -# Instr(DevType.Instr,ADC1_on,0,[]), -# Instr(DevType.Instr,ADC2_on,0,[]), -# Instr(DevType.Instr,ADC3_on,0,[]) -# Instr(DevType.VarUpdate,RCU_ADC_lock,3,[0,0,0]) -]) - -RCU_off=Instrs("RCU_off",1,[ -# Instr(DevType.Var,RCU_mask,4,[1,1,1,1]), - Instr(DevType.Var,RCU_pwrd,32,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]), -# Instr(DevType.Var,RCU_mask,4,[0,0,0,0]) -]) - -RCU_update=Instrs("RCU_update",11,[ - Instr(DevType.VarUpdate,RCU_pwrd,1,[0]), - Instr(DevType.VarUpdate,RCU_OUT1,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_OUT2,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_ID,1,[0]), -# Instr(DevType.VarUpdate,RCU_VER,1,[0]*10), - Instr(DevType.VarUpdate,RCU_att,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_band,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_LED,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_ADC_SYNC,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_ADC_JESD,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_ADC_CML,3,[0,0,0]), - Instr(DevType.VarUpdate,RCU_ADC_lock,3,[0,0,0]) -]) - - -OPC_methods=[RCU_on,RCU_off,ADC_on,RCU_update] diff --git a/rcu/__init__.py b/rcu/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/rcu/spibitbang1.py b/rcu/spibitbang1.py deleted file mode 100644 index 14541d75b70c1961a206a5c39533afccccec0d6e..0000000000000000000000000000000000000000 --- a/rcu/spibitbang1.py +++ /dev/null @@ -1,138 +0,0 @@ -from enum import Enum -import logging -import numpy as np - -class SPIBB_pins(Enum): - CLK = 0 - SDIO = 1 - SDIOdir = 2 - CS = 3 - -def SetSPIbb(SetI2C,RCUi,dev,value): - ADC_address=dev.Register_W - CSdev=dev.Addr.devs[SPIBB_pins.CS.value] - CSpin=dev.Addr.pins[SPIBB_pins.CS.value] - SDOdev=dev.Addr.devs[SPIBB_pins.SDIO.value] - SDOpin=dev.Addr.pins[SPIBB_pins.SDIO.value] - CLKdev=dev.Addr.devs[SPIBB_pins.CLK.value] - CLKpin=dev.Addr.pins[SPIBB_pins.CLK.value] - - logging.info(str(("SPIbb set",ADC_address,value))) - - ADC_bytes = 0x00 - ADC_rw = 0x00 # 0 for write, 1 for read - data2 = ( ADC_rw << 23 ) + ( ADC_bytes << 21 ) + ( ADC_address << 8 ) + value[0] - - bit_array = "{0:{fill}24b}".format(data2, fill='0') - # print(bit_array) - SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable - for bit in bit_array: - SetI2C(RCUi,SDOdev,1,SDOpin,[int(bit)]) - SetI2C(RCUi,CLKdev,1,CLKpin,[1]) - SetI2C(RCUi,CLKdev,1,CLKpin,[0]) - SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable - SetI2C(RCUi,SDOdev,1,SDOpin,[1]) #high when finished - return True; - -def GetSPIbb(SetI2C,GetI2C,RCUi,dev,value): - ADC_reg_address=dev.Register_R - CSdev=dev.Addr.devs[Vars.SPIBB_pins.CS.value] - CSpin=dev.Addr.pins[Vars.SPIBB_pins.CS.value] - SDOdev=dev.Addr.devs[Vars.SPIBB_pins.SDIO.value] - SDOpin=dev.Addr.pins[Vars.SPIBB_pins.SDIO.value] - CLKdev=dev.Addr.devs[Vars.SPIBB_pins.CLK.value] - CLKpin=dev.Addr.pins[Vars.SPIBB_pins.CLK.value] - SDIOdirdev=dev.Addr.devs[Vars.SPIBB_pins.SDIOdir.value] - SDIOdirpin=dev.Addr.pins[Vars.SPIBB_pins.SDIOdir.value] - - logging.info(str(("SPIbb get",ADC_reg_address))) - - ADC_bytes = 0x00 - ADC_rw = 0x01 # 0 for write, 1 for read - - data = ( ADC_rw << 15) + ( ADC_bytes << 13 ) + ADC_reg_address - - SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable - - - bit_array = "{0:{fill}16b}".format(data, fill='0') - for bit in bit_array: - SetI2C(RCUi,SDOdev,1,SDOpin,[int(bit)]) - SetI2C(RCUi,CLKdev,1,CLKpin,[1]) - SetI2C(RCUi,CLKdev,1,CLKpin,[0]) - - SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable - - # print("read byte") - SetI2C(RCUi,SDIOdirdev,1,SDIOdirpin,[1]) #input - SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable - a=[0] - N=len(value) - for i in range(N): value[i]=0 - for cnt in range(8*(ADC_bytes+1)): - ret_value=GetI2C(RCUi,SDOdev,1,SDOpin) #enable - for i in range(N): value[i]=(value[i]<<1)+ ret_value[i] - SetI2C(RCUi,CLKdev,1,CLKpin,[1]) - SetI2C(RCUi,CLKdev,1,CLKpin,[0]) #read after falling edge - SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable - SetI2C(RCUi,SDIOdirdev,1,SDIOdirpin,[0]) #output - return True; - -def GetSPIbb2(SetI2C,GetI2C,RCUi,devs,value): - ADC_reg_address=devs[0].Register_R - def Setbit(pintype,value): - for dev in devs: - dev1=dev.Addr.devs[pintype.value] - pin1=dev.Addr.pins[pintype.value] - SetI2C(RCUi,dev1,1,pin1,[value],buffer=True) - SetI2C(RCUi,dev1,1,pin1,[value]) - def Getbit(pintype): - retvalue=np.zeros_like(value) - step=len(devs) - dev1=devs[0].Addr.devs[pintype.value] - pin1=devs[0].Addr.pins[pintype.value] - retvalue[0::step]=GetI2C(RCUi,dev1,1,pin1) - for i,dev in enumerate(devs[1:]): - dev1=dev.Addr.devs[pintype.value] - pin1=dev.Addr.pins[pintype.value] - retvalue[i+1::step]=GetI2C(RCUi,dev1,1,pin1,buffer=True) - return retvalue - - CS=SPIBB_pins.CS - SDIO=SPIBB_pins.SDIO - CLK=SPIBB_pins.CLK - SDIOdir=SPIBB_pins.SDIOdir - - logging.debug(str(("SPIbb get",ADC_reg_address))) - - ADC_bytes = 0x00 - ADC_rw = 0x01 # 0 for write, 1 for read - - data = ( ADC_rw << 15) + ( ADC_bytes << 13 ) + ADC_reg_address - - Setbit(CS,0) #enable - - bit_array = "{0:{fill}16b}".format(data, fill='0') - logging.debug(str(("SPI TX",bit_array))) - for bit in bit_array: - Setbit(SDIO,int(bit)) - Setbit(CLK,1) - Setbit(CLK,0) - - Setbit(CS,1) #disable - - # print("read byte") - Setbit(SDIOdir,1) #input - Setbit(CS,0) #enable - a=[0] - N=len(value) - for i in range(N): value[i]=0 - for cnt in range(8*(ADC_bytes+1)): - ret_value=Getbit(SDIO) - for i in range(N): value[i]=(value[i]<<1)+ ret_value[i] - Setbit(CLK,1) - Setbit(CLK,0) #read after falling edge - Setbit(CS,1) #disable - Setbit(SDIO,1)#High when finished - Setbit(SDIOdir,0) #output - return True; \ No newline at end of file diff --git a/src/drivers/i2c.cpp b/src/drivers/i2c.cpp index 741431818c4740da24cb22f84c9a41543b402b6e..1b6ea7bd3a97e6a8f1aac760c503f77a48ff80a9 100644 --- a/src/drivers/i2c.cpp +++ b/src/drivers/i2c.cpp @@ -1,54 +1,19 @@ #include "i2c.h" #include <iostream> #include <linux/i2c-dev.h> -#include <i2c/smbus.h> +#include <linux/i2c.h> #include <stdlib.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/types.h> -/* -__s32 i2c_smbus_write_block_data(int file, __u8 command, __u8 length, - const __u8 *values) -{ - union i2c_smbus_data data; - int i; - if (length > I2C_SMBUS_BLOCK_MAX) - length = I2C_SMBUS_BLOCK_MAX; - for (i = 1; i <= length; i++) - data.block[i] = values[i-1]; - data.block[0] = length; - return i2c_smbus_access(file, I2C_SMBUS_WRITE, command, I2C_SMBUS_BLOCK_DATA, &data); +//https://www.pololu.com/docs/0J73/15.8 +bool i2c_smbus_write_block_data(int file,uint8_t adress,uint8_t len,uint8_t* buff){ + struct i2c_msg message = {adress,0,len,buff}; + struct i2c_rdwr_ioctl_data ioctl_data = {&message,1}; + ioctl(file,I2C_RDWR,&ioctl_data); } -__s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, __u8 length, - const __u8 *values) -{ - union i2c_smbus_data data; - int i; - if (length > I2C_SMBUS_BLOCK_MAX) - length = I2C_SMBUS_BLOCK_MAX; - for (i = 1; i <= length; i++) - data.block[i] = values[i-1]; - data.block[0] = length; - return i2c_smbus_access(file, I2C_SMBUS_WRITE, command, - I2C_SMBUS_I2C_BLOCK_DATA, &data); -} -__s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, __u8 length, - __u8 *values) -{ - union i2c_smbus_data data; - int i, err; - - data.block[0] = length; - err = i2c_smbus_access(file, I2C_SMBUS_READ, command, I2C_SMBUS_I2C_BLOCK_DATA, &data); - if (err < 0) - return false; - for (i = 1; i <= data.block[0]; i++) - values[i-1] = data.block[i]; - return (data.block[0]==length); -} -*/ c_i2c::c_i2c(const t_driver config1) : drvbase (config1){ std::cout << config.name <<": i2c server, connecting to device " << config.parameters[0] << "\n"; char filename[20]; @@ -63,8 +28,8 @@ c_i2c::c_i2c(const t_driver config1) : drvbase (config1){ bool c_i2c::I2Csend_reg(int addr,int reg,int len,t_buffer* data){ std::cout << config.name <<": i2c send to addr="<<addr<<" reg="<<reg<<" len="<<len<<" value="<<int(data[0]) <<"\n"; if (ioctl(file, I2C_SLAVE, addr)<0) return false; - return true; -// return (i2c_smbus_write_block_data(file,reg,len,data)>=0); +// return true; + return (i2c_smbus_write_block_data(file,reg,len,data)>=0); } bool c_i2c::I2Cget_reg(int addr,int reg,int len,t_buffer* data){ diff --git a/src/interface/pypcc.capnp.h b/src/interface/pypcc.capnp.h deleted file mode 100644 index 9e968c2970b023977d2afcbe8bdb575db56635d6..0000000000000000000000000000000000000000 --- a/src/interface/pypcc.capnp.h +++ /dev/null @@ -1,259 +0,0 @@ -// Generated by Cap'n Proto compiler, DO NOT EDIT -// source: pypcc.capnp - -#ifndef CAPNP_INCLUDED_9f2c99de8c7edd7f_ -#define CAPNP_INCLUDED_9f2c99de8c7edd7f_ - -#include <capnp/generated-header-support.h> - -#if CAPNP_VERSION != 6001 -#error "Version mismatch between generated code and library headers. You must use the same version of the Cap'n Proto compiler and library." -#endif - - -namespace capnp { -namespace schemas { - -CAPNP_DECLARE_SCHEMA(b1dfe08305a4b99c); -enum class InstType_b1dfe08305a4b99c: uint16_t { - VAR_SET, - VAR_READ, - METHOD, -}; -CAPNP_DECLARE_ENUM(InstType, b1dfe08305a4b99c); -CAPNP_DECLARE_SCHEMA(aaca83afea5f387e); - -} // namespace schemas -} // namespace capnp - - -typedef ::capnp::schemas::InstType_b1dfe08305a4b99c InstType; - -struct OPCUAset { - OPCUAset() = delete; - - class Reader; - class Builder; - class Pipeline; - - struct _capnpPrivate { - CAPNP_DECLARE_STRUCT_HEADER(aaca83afea5f387e, 1, 2) - #if !CAPNP_LITE - static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; } - #endif // !CAPNP_LITE - }; -}; - -// ======================================================================================= - -class OPCUAset::Reader { -public: - typedef OPCUAset Reads; - - Reader() = default; - inline explicit Reader(::capnp::_::StructReader base): _reader(base) {} - - inline ::capnp::MessageSize totalSize() const { - return _reader.totalSize().asPublic(); - } - -#if !CAPNP_LITE - inline ::kj::StringTree toString() const { - return ::capnp::_::structString(_reader, *_capnpPrivate::brand()); - } -#endif // !CAPNP_LITE - - inline ::uint8_t getId() const; - - inline ::InstType getType() const; - - inline bool hasData() const; - inline ::capnp::List< ::uint8_t>::Reader getData() const; - - inline bool hasMask() const; - inline ::capnp::List<bool>::Reader getMask() const; - -private: - ::capnp::_::StructReader _reader; - template <typename, ::capnp::Kind> - friend struct ::capnp::ToDynamic_; - template <typename, ::capnp::Kind> - friend struct ::capnp::_::PointerHelpers; - template <typename, ::capnp::Kind> - friend struct ::capnp::List; - friend class ::capnp::MessageBuilder; - friend class ::capnp::Orphanage; -}; - -class OPCUAset::Builder { -public: - typedef OPCUAset Builds; - - Builder() = delete; // Deleted to discourage incorrect usage. - // You can explicitly initialize to nullptr instead. - inline Builder(decltype(nullptr)) {} - inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {} - inline operator Reader() const { return Reader(_builder.asReader()); } - inline Reader asReader() const { return *this; } - - inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); } -#if !CAPNP_LITE - inline ::kj::StringTree toString() const { return asReader().toString(); } -#endif // !CAPNP_LITE - - inline ::uint8_t getId(); - inline void setId( ::uint8_t value); - - inline ::InstType getType(); - inline void setType( ::InstType value); - - inline bool hasData(); - inline ::capnp::List< ::uint8_t>::Builder getData(); - inline void setData( ::capnp::List< ::uint8_t>::Reader value); - inline void setData(::kj::ArrayPtr<const ::uint8_t> value); - inline ::capnp::List< ::uint8_t>::Builder initData(unsigned int size); - inline void adoptData(::capnp::Orphan< ::capnp::List< ::uint8_t>>&& value); - inline ::capnp::Orphan< ::capnp::List< ::uint8_t>> disownData(); - - inline bool hasMask(); - inline ::capnp::List<bool>::Builder getMask(); - inline void setMask( ::capnp::List<bool>::Reader value); - inline void setMask(::kj::ArrayPtr<const bool> value); - inline ::capnp::List<bool>::Builder initMask(unsigned int size); - inline void adoptMask(::capnp::Orphan< ::capnp::List<bool>>&& value); - inline ::capnp::Orphan< ::capnp::List<bool>> disownMask(); - -private: - ::capnp::_::StructBuilder _builder; - template <typename, ::capnp::Kind> - friend struct ::capnp::ToDynamic_; - friend class ::capnp::Orphanage; - template <typename, ::capnp::Kind> - friend struct ::capnp::_::PointerHelpers; -}; - -#if !CAPNP_LITE -class OPCUAset::Pipeline { -public: - typedef OPCUAset Pipelines; - - inline Pipeline(decltype(nullptr)): _typeless(nullptr) {} - inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless) - : _typeless(kj::mv(typeless)) {} - -private: - ::capnp::AnyPointer::Pipeline _typeless; - friend class ::capnp::PipelineHook; - template <typename, ::capnp::Kind> - friend struct ::capnp::ToDynamic_; -}; -#endif // !CAPNP_LITE - -// ======================================================================================= - -inline ::uint8_t OPCUAset::Reader::getId() const { - return _reader.getDataField< ::uint8_t>( - ::capnp::bounded<0>() * ::capnp::ELEMENTS); -} - -inline ::uint8_t OPCUAset::Builder::getId() { - return _builder.getDataField< ::uint8_t>( - ::capnp::bounded<0>() * ::capnp::ELEMENTS); -} -inline void OPCUAset::Builder::setId( ::uint8_t value) { - _builder.setDataField< ::uint8_t>( - ::capnp::bounded<0>() * ::capnp::ELEMENTS, value); -} - -inline ::InstType OPCUAset::Reader::getType() const { - return _reader.getDataField< ::InstType>( - ::capnp::bounded<1>() * ::capnp::ELEMENTS); -} - -inline ::InstType OPCUAset::Builder::getType() { - return _builder.getDataField< ::InstType>( - ::capnp::bounded<1>() * ::capnp::ELEMENTS); -} -inline void OPCUAset::Builder::setType( ::InstType value) { - _builder.setDataField< ::InstType>( - ::capnp::bounded<1>() * ::capnp::ELEMENTS, value); -} - -inline bool OPCUAset::Reader::hasData() const { - return !_reader.getPointerField( - ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); -} -inline bool OPCUAset::Builder::hasData() { - return !_builder.getPointerField( - ::capnp::bounded<0>() * ::capnp::POINTERS).isNull(); -} -inline ::capnp::List< ::uint8_t>::Reader OPCUAset::Reader::getData() const { - return ::capnp::_::PointerHelpers< ::capnp::List< ::uint8_t>>::get(_reader.getPointerField( - ::capnp::bounded<0>() * ::capnp::POINTERS)); -} -inline ::capnp::List< ::uint8_t>::Builder OPCUAset::Builder::getData() { - return ::capnp::_::PointerHelpers< ::capnp::List< ::uint8_t>>::get(_builder.getPointerField( - ::capnp::bounded<0>() * ::capnp::POINTERS)); -} -inline void OPCUAset::Builder::setData( ::capnp::List< ::uint8_t>::Reader value) { - ::capnp::_::PointerHelpers< ::capnp::List< ::uint8_t>>::set(_builder.getPointerField( - ::capnp::bounded<0>() * ::capnp::POINTERS), value); -} -inline void OPCUAset::Builder::setData(::kj::ArrayPtr<const ::uint8_t> value) { - ::capnp::_::PointerHelpers< ::capnp::List< ::uint8_t>>::set(_builder.getPointerField( - ::capnp::bounded<0>() * ::capnp::POINTERS), value); -} -inline ::capnp::List< ::uint8_t>::Builder OPCUAset::Builder::initData(unsigned int size) { - return ::capnp::_::PointerHelpers< ::capnp::List< ::uint8_t>>::init(_builder.getPointerField( - ::capnp::bounded<0>() * ::capnp::POINTERS), size); -} -inline void OPCUAset::Builder::adoptData( - ::capnp::Orphan< ::capnp::List< ::uint8_t>>&& value) { - ::capnp::_::PointerHelpers< ::capnp::List< ::uint8_t>>::adopt(_builder.getPointerField( - ::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value)); -} -inline ::capnp::Orphan< ::capnp::List< ::uint8_t>> OPCUAset::Builder::disownData() { - return ::capnp::_::PointerHelpers< ::capnp::List< ::uint8_t>>::disown(_builder.getPointerField( - ::capnp::bounded<0>() * ::capnp::POINTERS)); -} - -inline bool OPCUAset::Reader::hasMask() const { - return !_reader.getPointerField( - ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); -} -inline bool OPCUAset::Builder::hasMask() { - return !_builder.getPointerField( - ::capnp::bounded<1>() * ::capnp::POINTERS).isNull(); -} -inline ::capnp::List<bool>::Reader OPCUAset::Reader::getMask() const { - return ::capnp::_::PointerHelpers< ::capnp::List<bool>>::get(_reader.getPointerField( - ::capnp::bounded<1>() * ::capnp::POINTERS)); -} -inline ::capnp::List<bool>::Builder OPCUAset::Builder::getMask() { - return ::capnp::_::PointerHelpers< ::capnp::List<bool>>::get(_builder.getPointerField( - ::capnp::bounded<1>() * ::capnp::POINTERS)); -} -inline void OPCUAset::Builder::setMask( ::capnp::List<bool>::Reader value) { - ::capnp::_::PointerHelpers< ::capnp::List<bool>>::set(_builder.getPointerField( - ::capnp::bounded<1>() * ::capnp::POINTERS), value); -} -inline void OPCUAset::Builder::setMask(::kj::ArrayPtr<const bool> value) { - ::capnp::_::PointerHelpers< ::capnp::List<bool>>::set(_builder.getPointerField( - ::capnp::bounded<1>() * ::capnp::POINTERS), value); -} -inline ::capnp::List<bool>::Builder OPCUAset::Builder::initMask(unsigned int size) { - return ::capnp::_::PointerHelpers< ::capnp::List<bool>>::init(_builder.getPointerField( - ::capnp::bounded<1>() * ::capnp::POINTERS), size); -} -inline void OPCUAset::Builder::adoptMask( - ::capnp::Orphan< ::capnp::List<bool>>&& value) { - ::capnp::_::PointerHelpers< ::capnp::List<bool>>::adopt(_builder.getPointerField( - ::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value)); -} -inline ::capnp::Orphan< ::capnp::List<bool>> OPCUAset::Builder::disownMask() { - return ::capnp::_::PointerHelpers< ::capnp::List<bool>>::disown(_builder.getPointerField( - ::capnp::bounded<1>() * ::capnp::POINTERS)); -} - - -#endif // CAPNP_INCLUDED_9f2c99de8c7edd7f_