From c70e2db1627c0b4089ff0e34115ca2b64f816014 Mon Sep 17 00:00:00 2001
From: su530201 <olivier.kaufmann@umons.ac.be>
Date: Wed, 26 Apr 2023 14:13:34 +0200
Subject: [PATCH] Fixes bug with _addresses and super()

---
 config_ohmpi_card_3_15.py                     |  4 ++--
 .../abstract_hardware_components.py           | 19 +++++++++++++++----
 hardware_components/mux_2024_rev_0_0.py       |  6 +++---
 hardware_components/test_mux_2024.py          |  7 +++++++
 test_measure_with_ohmpi_card_3_15.py          |  1 +
 5 files changed, 28 insertions(+), 9 deletions(-)
 create mode 100644 hardware_components/test_mux_2024.py

diff --git a/config_ohmpi_card_3_15.py b/config_ohmpi_card_3_15.py
index 9e787e98..fd79afde 100644
--- a/config_ohmpi_card_3_15.py
+++ b/config_ohmpi_card_3_15.py
@@ -30,9 +30,9 @@ HARDWARE_CONFIG = {
              'sampling_rate': 10., # ms
              'nb_samples': 20,  # Max value 10 # was named integer before...
             },
-    'mux': {'model' : 'dummy_mux', # 'ohmpi_i2c_mux64_v1.01',
+    'mux': {'model' : 'mux_2024_rev_0_0', # 'ohmpi_i2c_mux64_v1.01',
              'max_elec': 64,
-             'board_addresses': {'A': 0x73, 'B': 0x72, 'M': 0x71, 'N': 0x70},  # CHECK IF YOUR BOARDS HAVE THESE ADDRESSES
+             'addresses': './hardware_components/mux_2024_22_23_4_roles_addressing_table.json',
              'voltage_max': 100,
              'current_max': 3
             }
diff --git a/hardware_components/abstract_hardware_components.py b/hardware_components/abstract_hardware_components.py
index a1845bc4..10b817af 100644
--- a/hardware_components/abstract_hardware_components.py
+++ b/hardware_components/abstract_hardware_components.py
@@ -1,14 +1,14 @@
 from abc import ABC, abstractmethod
 
 import numpy as np
-
+import json
 from OhmPi.logging_setup import create_stdout_logger
 import time
 
 class ControllerAbstract(ABC):
     def __init__(self, **kwargs):
         self.board_name = kwargs.pop('board_name', 'unknown Controller hardware')
-        self.bus = None
+        self.bus = None # TODO: allow for several buses
         self.exec_logger = kwargs.pop('exec_logger', None)
         if self.exec_logger is None:
             self.exec_logger = create_stdout_logger('exec_ctl')
@@ -35,7 +35,7 @@ class ControllerAbstract(ABC):
 
 class MuxAbstract(ABC):
     def __init__(self, **kwargs):
-        self.board_name = kwargs.pop('board_name', 'unknown MUX hardware')  # TODO: introduce MUX boards that take part to a MUX system (could be the same for RX boards that take part to an RX system (e.g. different channels)
+        self.board_name = kwargs.pop('board_name', 'unknown MUX hardware')  # TODO: introduce MUX boards that are part of a MUX system (could be the same for RX boards that take part to an RX system (e.g. different channels)
         self.exec_logger = kwargs.pop('exec_logger', None)
         if self.exec_logger is None:
             self.exec_logger = create_stdout_logger('exec_mux')
@@ -44,6 +44,17 @@ class MuxAbstract(ABC):
             self.soh_logger = create_stdout_logger('soh_mux')
         self.exec_logger.debug(f'{self.board_name} MUX initialization')
         self.controller = kwargs.pop('controller', None)
+        self.addresses = kwargs.pop('addresses', None)
+
+    def _get_addresses(self, addresses_file):
+        with open(addresses_file, 'r') as f:
+            x = json.load(f)
+
+        self.addresses = {}
+        for k in x.keys():
+            y = k.strip('(').strip(')').split(', ')
+            x[k]['TCA']
+            self.addresses.update({(int(y[0]), y[1]): x[k]})
 
     @abstractmethod
     def reset(self):
@@ -91,7 +102,7 @@ class MuxAbstract(ABC):
             self.exec_logger.warning(f'Missing argument for {self.board_name}.switch: elec_dict is None.')
 
     @abstractmethod
-    def switch_one(self, elec, role, state):
+    def switch_one(self, elec=None, role=None, state=None):
         pass
 
     def test(self, elec_dict, activation_time=1.):
diff --git a/hardware_components/mux_2024_rev_0_0.py b/hardware_components/mux_2024_rev_0_0.py
index 817410d0..313b7f1e 100644
--- a/hardware_components/mux_2024_rev_0_0.py
+++ b/hardware_components/mux_2024_rev_0_0.py
@@ -11,9 +11,9 @@ class Mux(MuxAbstract):
     def __init__(self, **kwargs):
         kwargs.update({'board_name': os.path.basename(__file__).rstrip('.py')})
         super().__init__(**kwargs)
+        print(f'addresses: {self.addresses}')
         self.max_elec = MUX_CONFIG['max_elec']
-        print(os.path.curdir)
-        if self._addresses is None and 'addresses' in MUX_CONFIG.keys():
+        if self.addresses is None and 'addresses' in MUX_CONFIG.keys():
             self._get_addresses(MUX_CONFIG['addresses'])
 
     def reset(self):
@@ -27,7 +27,7 @@ class Mux(MuxAbstract):
             pin_enable.direction = Direction.OUTPUT
             pin_enable.value = state
 
-        d = self._addresses[elec, role]
+        d = self.addresses[elec, role]
         if d['TCA_address'] is None:
             tca = self.controller.bus
         else:
diff --git a/hardware_components/test_mux_2024.py b/hardware_components/test_mux_2024.py
new file mode 100644
index 00000000..86d3bee0
--- /dev/null
+++ b/hardware_components/test_mux_2024.py
@@ -0,0 +1,7 @@
+from OhmPi.hardware_components.mux_2024_rev_0_0 import Mux, MUX_CONFIG
+import time
+
+mux = Mux()
+mux.switch_one(elec=1, role='M', state='on')
+time.sleep(2)
+mux.switch_one(elec=1, role='M', state='off')
diff --git a/test_measure_with_ohmpi_card_3_15.py b/test_measure_with_ohmpi_card_3_15.py
index 3c863dac..cfb073ad 100644
--- a/test_measure_with_ohmpi_card_3_15.py
+++ b/test_measure_with_ohmpi_card_3_15.py
@@ -48,3 +48,4 @@ r = [np.abs((k.pulses[i]['polarity']*k.pulses[i]['vmn']-k.sp)/k.pulses[i]['iab']
 for i in range(len(r)):
     print(f'Mean resistance with sp correction for pulse{i}: {np.mean(r[i]):.3f} Ohms, Dev. {100*np.std(r[i])/np.mean(r[i]):.1f} %')
 change_config('config_default.py', verbose=False)
+
-- 
GitLab