diff --git a/pypcc/HBATtest.py b/pypcc/HBATtest.py new file mode 100644 index 0000000000000000000000000000000000000000..c597ed0f5d7ff929e90c5b801bc646986af95b39 --- /dev/null +++ b/pypcc/HBATtest.py @@ -0,0 +1,187 @@ +##NB translator should be off or monitor should be 0 +name='RECVTR_HB' #YAML config file with all register values etc +varID='RCU_PCB_ID' + +logFile='SetVersion' + +import logging +import argparse +from opcuaserv import opcuaserv +from opcuaserv import i2client +from opcuaserv import yamlreader +#from opcuaserv import pypcc2 +from i2cserv import i2cthread +import threading +import time +import sys +import signal +from yamlconfig import Find; +import yamlconfig as yc +from datetime import datetime +import numpy as np + +testtime=datetime.now().strftime("%y-%m-%d %H:%M") +if len(sys.argv)<3: + print("setVersion RCUnr RCUsi HBAnr"); + print("e.g. SetVersion 8 1 1") +# exit(); + +RCUNR=int(sys.argv[1]); +SINR=int(sys.argv[2]); +HBANR=int(sys.argv[3]); +print(RCUNR,SINR,HBANR) +logging.basicConfig(level="WARNING",format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s') +#logging.basicConfig(level="DEBUG",format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s') + +RunTimer=True; +conf=yc.yamlconfig(name) +conf.linkdevices() +conf.loaddrivers() +conf.linkdrivers() + +def GetVal(name,N=1): + varid=conf.getvarid(name); +# print("varid",varid) + var1=conf.getvars()[varid] + dim=var1['dim'] + drv=var1.get('drivercls'); + mask=[False]*RCUNR*N+[True]*N+[False]*((dim-RCUNR-1)*N); + data=drv.OPCUAReadVariable(varid,var1,mask) + data=data[0].data + N3=len(data)//dim + return data[N3*RCUNR:N3*(RCUNR+1)],var1 + +#reading the ID also set the switch +data,var1=GetVal(varID); +ID=("%.2x%.2x%.2x%.2x" % (data[0],data[1],data[2],data[3])) + +rootLogger = logging.getLogger() +rootLogger = logging.getLogger() +fileHandler = logging.FileHandler("{0}.log".format(logFile)) +#fileHandler.setFormatter(logFormatter) +rootLogger.addHandler(fileHandler) + +logging.warning("ID=%s" % ID) +if int(ID,16)==0: + logging.error("Error: No ID"); + exit() + +uCaddr=0x40 +HBAaddr=0x41+SINR +i2c=conf.conf['drivers'][0]['obj'] #assume I2C is first device +v=[0] + + +if True: +# print("Set Vref=0x0c"); + i2c.i2csetget(uCaddr,[0x08],reg=13,read=0) +# print("Set mode=0"); + i2c.i2csetget(uCaddr,[0],reg=2,read=0) +# print("Set Auto readback=0"); + i2c.i2csetget(uCaddr,[0],reg=5,read=0) +# print("TX start high=0"); + i2c.i2csetget(uCaddr,[4],reg=14,read=0) + +i2c.i2csetget(uCaddr,v,reg=2,read=1) #get mode +print("Current mode=",v[0]) + +i2c.i2csetget(uCaddr,v,reg=12,read=1) #get mode +print("Wait PPS=",v[0]) + +i2c.i2csetget(uCaddr,v,reg=13,read=1) #get mode +print("Vref=",v[0]) + +i2c.i2csetget(uCaddr,v,reg=5,read=1) #get mode +print("Auto readback=",v[0]) + +i2c.i2csetget(uCaddr,v,reg=14,read=1) #get mode +print("TX start high=",v[0]) + +#exit() +CRCtab=np.load("CRC_HBAT1.npy") +CRCtabl=[d%256 for d in CRCtab] +CRCtabh=[d//256 for d in CRCtab] +def CRCcheck(S1): + crcl=0;crch=0; + for b in S1: + i=crcl ^ b + crcl=crch ^ CRCtabl[i] + crch=CRCtabh[i] +# print(i,CRCtabh[i]) +# crch=crcl ^ CRCtabh[i] +# crcl= CRCtabl[i] + return crch*256+crcl + + +def MakeRequest(serv,data=[],func=5,reg=0): + data2=[func,reg]+data + l=len(data2)+1 + data2=[serv,l]+data2 +# CRC=CRCcheck(data2) +# data2=data2+[CRC%256,CRC//256] +# assert(CRCcheck(data2)==0) + return data2 + +def RequestRegisters(HBANR,reg,length): + func=length*2+1; + TX1=MakeRequest(HBANR,[],func,reg); + i2c.i2csetget(HBAaddr,TX1,read=0) +# print("Packet to TX",[hex(d) for d in TX1]) +# TX2=hb.ManchesterEncode(TX1)\n", +# ser.write(bytearray(TX2))\n", +# return GetPackets();" +HBANRs=range(1,17) if HBANR==0 else [HBANR] +for HBANR in HBANRs: + RequestRegisters(HBANR,0,1) + time.sleep(0.1) + D=[0]*7 + i2c.i2csetget(HBAaddr,D,read=1) + D=D[2:] + CRC=CRCcheck(D[:-2]) + CRCerror=((CRC & 0xff)!=D[-2]) or (CRC//256!=D[-1]) + print(HBANR,"RX:",[hex(d) for d in D],',CRC error' if CRCerror else '',',wrong addr' if (HBANR+0x80!=D[0]) else '') +# if CRCerror: print(' CRC=',hex(CRC & 0xff),hex(CRC//256)) +# if (HBANR+0x80!=D[0]): print(' wrong address',D[0],HBANR+0x80) +# time.sleep(0.1) +#print(MakeRequest(HBANR,data + +#data,var1=GetVal(varSet); +#version=bytearray(data).decode("utf-8",errors='ignore') +#logging.warning("Old "+varSet+":"+version) +#if Ver is None: exit() +#print(var1) +#ROMaddr=var1['devreg'][0]['addr'] +#ROMreg=var1['devreg'][0]['register_W'] +#varlen=var1['width']//8 +#print(varlen) +#exit() + +#i2c=conf.conf['drivers'][0]['obj'] #assume I2C is first device + +#exit() + +#R1=0 +#ROM=0x50 + +#Upload version +#Ver2=[(c.encode('utf-8')[0]) for c in Ver] +#Ver2=Ver2[:varlen] +#print(len(Ver),Ver,Ver2) +#V2=[0] +#for i,v in enumerate(Ver2): +# time.sleep(0.1) +# i2c.i2csetget(ROMaddr,[v],reg=ROMreg+i,read=0) +# time.sleep(0.1) +# i2c.i2csetget(ROMaddr,V2,reg=ROMreg+i,read=1) +# print(i,v,V2) +#for i in range(len(Ver2),varlen): +# time.sleep(0.1) +# i2c.i2csetget(ROMaddr,[255],reg=ROMreg+i,read=0) +# time.sleep(0.1) +# i2c.i2csetget(ROMaddr,V2,reg=ROMreg+i,read=1) + +#time.sleep(0.1) +#data,var1=GetVal(varSet); +#version=bytearray(data).decode("utf-8",errors='ignore') +#print("Version",version) +#logging.warning("New "+varSet+":"+version)