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;

logging.basicConfig(level="INFO",format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s')

RunTimer=True;
#def signal_handler(sig, frame):
#    logging.warn('Stop signal received!')
#    global RunTimer; 
#    RunTimer=False
#signal.signal(signal.SIGINT, signal_handler)

logging.info("Start I2C processes")   
threads=[]
I2Cclients=[]
name='RCU'
RCU_I2C=i2client.i2client(name=name)
thread1=i2cthread.start(*RCU_I2C.GetInfo())
threads.append(thread1)
I2Cclients.append(RCU_I2C)

#Load yaml so that we know the variable names
RCU_conf=yamlreader.yamlreader(RCU_I2C,yamlfile=name)
RCU_conf.CallInit()

var1=RCU_conf.getmethodid('RCU_update');
#var1=RCU_conf.getmethodid('RCU_on');
#N=32;
#mask=[i<2 for i in range(N)];
#RCU_I2C.callmethod(var1,[])

if False:
    var1=RCU_conf.getvarid('RCU_LED0');
    N=32;
    mask=[i<8 for i in range(N)];
    data=[0]*N;
elif True:
    var1=RCU_conf.getvarid('RCU_ADC_lock');
    N=32*3;
    mask=[i<5*3 for i in range(N)];
elif False:
    var1=RCU_conf.getvarid('RCU_attenuator');
    N=32*3;
    mask=[i<6 for i in range(N)];
    data=[10]*N;
    data[:6]=[0,1,2,3,4,5]
else:
    var1=RCU_conf.getvarid('HBA_element_beamformer_delays');
    N=32*3;
    mask=[i<4*3 for i in range(N)];
    data=[1]*(N*32);
#print(var1)
#print("mask=",mask);
#print("data=",data);
#RCU_I2C.setvar(var1,data,mask);
RCU_I2C.readvar(var1,mask);

var1=RCU_conf.getvarid('RCU_temperature');
N=32;
mask=[i<2 for i in range(N)];
#RCU_I2C.readvar(var1,mask);

#data=[0]*N;
#RCU_I2C.setvar(var1,data,mask);
#def setvar(self,id1,data=[],mask=[]):

#var1=RCU_conf.getmethodid('RCU_on');
var1=RCU_conf.getmethodid('RCU_HBAT_WAIT_PPS');
N=32;
mask=[i<7 for i in range(N)];
#RCU_I2C.callmethod(var1,mask)


time.sleep(5);

while RCU_I2C.data_waiting():
    varid,data,mask=RCU_I2C.readdata()
    print("Results:",RCU_conf.getvar1(varid)['name'],data[:12],mask[:12])


logging.info("Stop threads")
for i2c in I2Cclients:
    i2c.stop()
for thread1 in threads:
    thread1.join()