##NB translator should be off or monitor should be 0
name='RECVTR_LB' #YAML config file with all register values etc
varID='RCU_PCB_ID'
regname="RCU_ADC_test"

logFile='ADCtest'

import logging
import argparse
from pypcc.opcuaserv import opcuaserv,i2client,yamlreader
#from opcuaserv import pypcc2
from pypcc.i2cserv import i2cthread
import threading
import time
import sys
import signal
from pypcc.yamlconfig import Find;
import pypcc.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):
 varid=conf.getvarid(name);
# print("varid",varid)
 var1=conf.getvars()[varid]
 dim=var1['dim']
 drv=var1.get('drivercls');
 mask=[True]*dim#+[True]*N+[False]*((dim-RCUNR-1)*N);
 data=drv.OPCUAReadVariable(varid,var1,mask)
 data=data[0].data
# N3=len(data[0])//dim
 return data,var1


def SetVal(name,data):
 varid=conf.getvarid(name);
# print("varid",varid)
 var1=conf.getvars()[varid]
 dim=var1['dim']
 drv=var1.get('drivercls');
 mask=[True]*dim#+[True]*N+[False]*((dim-RCUNR-1)*N);
 return drv.OPCUASetVariable(varid,var1,data,mask)

def SetReg(name,data,drvvar):
 varid=conf.getvarid(drvvar)
 var2=conf.getvars()[varid]
 drv=var2.get('drivercls');
 var1=conf.getdevreg(name);
# print("Var",var1)
# drv=var1.get('drivercls');
# print("DRV",drv)
 drv.Setdevreg(var1,data,[])



#reading the ID also set the switch
print("Get IDs")
data,var1=GetVal(varID);
print(data)
data=np.array(data)[::4]
mask=[not(d is None) for d in data]
print(mask)
#GetReg("GPIO3.
#SetReg("IO3.GPIO1",[21]*32)
#SetReg("IO3.GPIO2",[71]*32)

#exit()
data,var1=GetVal("RCU_IO1_GPIO1")
data,var1=GetVal("RCU_IO1_GPIO2")
data,var1=GetVal("RCU_IO2_GPIO1")
data,var1=GetVal("RCU_IO2_GPIO2")

if False:
  SetVal("RCU_IO3_GPIO1",[0]*32)
  SetVal("RCU_IO3_GPIO2",[0]*32)
  SetVal("RCU_PWR_DIGITAL_on",[0]*32)
  SetVal("RCU_PWR_DIGITAL_on",[1]*32)

SetVal("RCU_IO3_GPIO1",[21]*32)
SetVal("RCU_IO3_GPIO2",[71]*32)
SetReg("IO3.CONF1",[0]*32,"RCU_IO3_GPIO1")
SetReg("IO3.CONF2",[0]*32,"RCU_IO3_GPIO1")
SetReg("IO3.POL1",[0]*32,"RCU_IO3_GPIO1")
SetReg("IO3.POL2",[0]*32,"RCU_IO3_GPIO1")


data,var1=GetVal("RCU_PWR_DIGITAL_on")
print("RCU_PWR_DIGITAL_on",data)

data,var1=GetVal("RCU_IO3_GPIO1")
print("RCU_IO3_GPIO1",data)
data,var1=GetVal("RCU_IO3_GPIO2")
print("RCU_IO3_GPIO2",data)
#print("Set Reg")
#exit()
#print("Read Reg")

if False:
  SetVal("RCU_ADC_shutdown",[1]*96)
  SetVal("RCU_ADC_shutdown",[0]*96)
data,var1=GetVal("RCU_ADC_shutdown")
print("RCU_ADC_shutdown",data)

if True: #SPI bus reset
  SetVal("RCU_IO3_GPIO2",[0x40]*32) #bit0,1,2 = CS = Low
  SetVal("RCU_IO3_GPIO1",[0x17]*32) #CLK high 
  SetVal("RCU_IO3_GPIO1",[0x15]*32) #CLK low
  SetVal("RCU_IO3_GPIO1",[0x17]*32) #CLK high
  SetVal("RCU_IO3_GPIO1",[0x15]*32) #CLK low
  SetVal("RCU_IO3_GPIO2",[0x47]*32) #CS = High
#  for x in range(1):
#     SetVal("RCU_IO3_GPIO1",[0x02]*32) #CLK high
#     SetVal("RCU_IO3_GPIO1",[0x00]*32) #CLK low

#  SetVal("RCU_IO3_GPIO1",[0x15]*32) #CLK low
  time.sleep(1)

SetReg("ADC2.test",[2]*32,regname)
SetReg("ADC3.test",[3]*32,regname)
SetReg("ADC1.test",[1]*32,regname)

data,var1=GetVal(regname);
data=np.array(data).reshape([32,3])
print(data)
#exit()
for x in range(1,100):
  print("Set reg",x)
  SetReg("ADC3.test",[x+2]*32,regname)
  SetReg("ADC2.test",[x+1]*32,regname)
  SetReg("ADC1.test",[x]*32,regname)
#  data=np.array([x]*96)
#  SetVal(regname,data)

#print("Read reg")
  data,var1=GetVal(regname);
  data=np.array(data).reshape([32,3])
  print(data)


exit()
#ID=("%.2x%.2x%.2x%.2x" % (data[0],data[1],data[2],data[3]))