diff --git a/pypcc/config/APSCTTR.yaml b/pypcc/config/APSCTTR.yaml index 9c5f7c42d61483d95ffd7c387fde88e478bb3660..85a8a0d8d628ac20f36c39386b90c9f03cd71351 100644 --- a/pypcc/config/APSCTTR.yaml +++ b/pypcc/config/APSCTTR.yaml @@ -3,7 +3,7 @@ description: "1234" drivers: - name: I2C - type: i2c + type: i2c_smbus2 parameters: [5] #I2C port number - name: I2C_CLK type: i2c_dev #I2C devices diff --git a/pypcc/i2cserv/i2c_smbus2.py b/pypcc/i2cserv/i2c_smbus2.py new file mode 100644 index 0000000000000000000000000000000000000000..962255fd9d49be7de313b78d64dfb06c8084892e --- /dev/null +++ b/pypcc/i2cserv/i2c_smbus2.py @@ -0,0 +1,53 @@ +import os +from smbus2 import SMBus,i2c_msg +import time +import logging +#read=0: write to register +#read=1: read from register +#read=2: write to register (common in group) +#read=3: wait ms second +from .hwdev import hwdev; + +class i2c_smbus2(hwdev): + def __init__(self,config): + hwdev.__init__(self,config); + self.bus_nr=config['parameters'][0] + logging.info("smbus2 driver on bus "+str(self.bus_nr)) + self.bus = SMBus(self.bus_nr) + self.I2Ccounter=0 + + + def i2csetget(self,addr,data,reg=None,read=0): +# logging.debug(str(("I2C",addr,reg,data,read))) + try: +# if True: + if read==3: + time.sleep(data[0]/1000.) + return True + + if read==1: + if not(reg is None): + data[:]=self.bus.read_i2c_block_data(addr, reg, len(data)) + else: + msg=i2c_msg.read(addr,len(data)) + self.bus.i2c_rdwr(msg) + if len(msg)!=len(data): + logging.debug(str(("I2C get failed",addr,reg,data,read))) + data[0]=0; + return False + + data[:]=list(msg) + logging.debug(str(("I2C get",addr,reg,data,read))) + else: + if not(reg is None): + self.bus.write_i2c_block_data(addr, reg, data) + else: + msg=i2c_msg.write(addr,data) + self.bus.i2c_rdwr(msg) + return True; + except: +# else: + logging.debug("I2C failed!") + if len(data)>0: data[0]=0 + return False; + diff --git a/pypcc/i2cserv/i2c_switch.py b/pypcc/i2cserv/i2c_switch.py index 7934f2b6652c57bb2ce8c1f03e27e9c1dd0d5e22..dadae419bd23244197575ed62e6adce87fe5727b 100644 --- a/pypcc/i2cserv/i2c_switch.py +++ b/pypcc/i2cserv/i2c_switch.py @@ -1,5 +1,6 @@ import logging -from .i2c import i2c +#from .i2c import i2c +from .i2c_smbus2 import i2c_smbus2 as i2c #import HWconf #SWaddr=0x70 diff --git a/pypcc/pypcc.py b/pypcc/pypcc.py index dcbaba6db7871284103b4499e3838e9dff50a1ba..16e7898c1dd55725b7450cdd5b582974f36bfa81 100755 --- a/pypcc/pypcc.py +++ b/pypcc/pypcc.py @@ -22,7 +22,7 @@ def main(): #Todo test logstash #from logconfig import configure_logger #log_extra = { - # "simulator": args.simulator, + # "simulator": args.simulator, # "test": args.test, # "port": args.port, # "config": args.config, @@ -42,15 +42,15 @@ def main(): RunTimer=True; def signal_handler(sig, frame): logging.warn('Stop signal received!') - global RunTimer; + global RunTimer; RunTimer=False signal.signal(signal.SIGINT, signal_handler) #Start i2c processes as soon as possible to have minimum duplication - logging.info("Start I2C processes") + logging.info("Start I2C processes") if not(args.simulator): - logging.info("Make I2C lock") + logging.info("Make I2C lock") import multiprocessing as mp # lock=mp.Lock() #else: @@ -63,18 +63,18 @@ def main(): I2C_process=[] I2Cclients=[] for name in I2Cports: - RCU_I2C=i2client.i2client(name=name) - if not(args.simulator): + RCU_I2C=i2client.i2client(name=name) + if not(args.simulator): thread1=i2cthread.start(*RCU_I2C.GetInfo(),lock=lock) #Start a new I2C process I2C_process.append(thread1) I2Cclients.append(RCU_I2C) #Initialise OPCUA server and load variables - logging.info("Initialised OPC-UA Server") + logging.info("Initialised OPC-UA Server") configs=[] I2C_threads=[] - if not(args.test): + if not(args.test): handler=opcuaserv.InitServer(port=args.port) - logging.info("Load OPCUA variables & start i2c listing thread") + logging.info("Load OPCUA variables & start i2c listing thread") opcuaserv.AddVarR("TR_software_version_R",git_hash+"_"+args.config,[],False) for i,name in enumerate(I2Cports): RCU_I2C=I2Cclients[i] @@ -104,7 +104,7 @@ def main(): thread.join(1) if thread.exitcode is None: logging.warning("Terminate thread") - thread.terminate() + thread.terminate() return thread.exitcode def restart_I2C(i): @@ -132,26 +132,26 @@ def main(): #cnt=0 try: while RunTimer: - if not(args.test): + if not(args.test): handler.check_datachange(0.1); else: time.sleep(0.1); for c in configs: if c.Monitor(): continue - if not(args.simulator) and not(args.test): - for i,c in enumerate(configs): - timeout=c.watchdog() - if timeout>10: - print(i,timeout) - if timeout>60: - logging.error("I2C timeout!") + # if not(args.simulator) and not(args.test): + # for i,c in enumerate(configs): + # timeout=c.watchdog() + # if timeout>10: + # print(i,timeout) + # if timeout>60: + # logging.error("I2C timeout!") # restart_I2C(i) - RunTimer=False + # RunTimer=False # cnt+=1; - # if cnt==60*10*2: + # if cnt==60*10*2: # print("****** restart test *****") # restart_I2C(0) - + finally: if not(args.test): logging.info("Stop OPC-UA server")