From 3c501ce83461fa306593b1ce8e6673582b83dfcc Mon Sep 17 00:00:00 2001
From: kruger <kruger@astron.nl>
Date: Wed, 4 Dec 2024 07:34:08 +0000
Subject: [PATCH] I2C using SMBUS2 (solving memory leak)

---
 pypcc/config/APSCTTR.yaml   |  2 +-
 pypcc/i2cserv/i2c_smbus2.py | 53 +++++++++++++++++++++++++++++++++++++
 pypcc/i2cserv/i2c_switch.py |  3 ++-
 3 files changed, 56 insertions(+), 2 deletions(-)
 create mode 100644 pypcc/i2cserv/i2c_smbus2.py

diff --git a/pypcc/config/APSCTTR.yaml b/pypcc/config/APSCTTR.yaml
index 9c5f7c4..85a8a0d 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 0000000..962255f
--- /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 7934f2b..dadae41 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
-- 
GitLab