From f3c1ecad4c5f60710be6f3a3608791faab1922a2 Mon Sep 17 00:00:00 2001
From: awatlet <arnaud.watlet@umons.ac.be>
Date: Thu, 12 Oct 2023 08:09:56 +0200
Subject: [PATCH] Adds jumper positions capability for mux_2024 config

---
 configs/config_mb_2024_0_2__1_mux_2024.py |  6 ++++--
 ohmpi/hardware_components/mux_2024_0_X.py | 20 +++++++++++++++++++-
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/configs/config_mb_2024_0_2__1_mux_2024.py b/configs/config_mb_2024_0_2__1_mux_2024.py
index 77ead14d..bc7d3a51 100644
--- a/configs/config_mb_2024_0_2__1_mux_2024.py
+++ b/configs/config_mb_2024_0_2__1_mux_2024.py
@@ -36,8 +36,10 @@ HARDWARE_CONFIG = {
                      {'model': 'mux_2024_0_X',
                       'tca_address': None,
                       'tca_channel': 0,
-                      'mcp_0': '0x26',  # TODO : Replace this with pos of jumper on MUX board (address doesn't mean anything for the average user...)
-                      'mcp_1': '0x27',  # TODO : Replace this with pos of jumper on MUX board (address doesn't mean anything for the average user...)
+                      'addr2': 'down', 
+                      'addr1': 'down',
+                      # 'mcp_0': '0x26',
+                      # 'mcp_1': '0x27',
                       'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'cabling': {(i+0, j): ('mux_03', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                       'voltage_max': 12.}
diff --git a/ohmpi/hardware_components/mux_2024_0_X.py b/ohmpi/hardware_components/mux_2024_0_X.py
index db16f57b..866a4c5a 100644
--- a/ohmpi/hardware_components/mux_2024_0_X.py
+++ b/ohmpi/hardware_components/mux_2024_0_X.py
@@ -89,9 +89,21 @@ class Mux(MuxAbstract):
             self._tca = adafruit_tca9548a.TCA9548A(self.connection, tca_address)[tca_channel]
 
         # Setup MCPs
-        self._mcp_addresses = (kwargs.pop('mcp_0', '0x22'), kwargs.pop('mcp_1', '0x23'))  # TODO: add assert on valid addresses..
+        self._mcp_jumper_pos = (kwargs.pop('addr2', None), kwargs.pop('addr1', None))
+        self._mcp_addresses = (kwargs.pop('mcp_0', None), kwargs.pop('mcp_1', None))
+        if self._mcp_addresses['mcp_0'] is None and self._mcp_addresses['mcp_1'] is None:
+            if self._mcp_jumper_pos['addr2'] is not None and self._mcp_jumper_pos['addr1'] is not None:
+                self._mcp_jumper_pos_to_addr()
+                self.exec_logger.debug(f'{self.board_id} assigned mcp_addresses {self._mcp_addresses['mcp_0']} and '
+                                       f'{self._mcp_addresses['mcp_1']} from jumper positions.')
+            else:
+                self.exec_logger.debug(f'MCP addresses nor jumper positions for {self.board_id} not in config file...')
+                # TODO: if no addresses defined, should abort or should we set default mcp addresses?
+        for addr in self._mcp_addresses:
+            assert addr in [0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27]
         self._mcp = [None, None]
         self.reset()
+
         if self.addresses is None:
             self._get_addresses()
 
@@ -127,3 +139,9 @@ class Mux(MuxAbstract):
         if state == 'off':
             activate_relay(self._mcp[d['MCP']], d['MCP_GPIO'], False)
             # time.sleep(MUX_CONFIG['release_delay'])  # NOTE: moved to MuxAbstract switch
+
+    def _mcp_jumper_pos_to_addr(self):
+        d = {'up': 0, 'down': 1}
+        mcp_0 = hex(int(f'0100{d[self._mcp_jumper_pos['addr2']]}{d[self._mcp_jumper_pos['addr1']]}0', 2))
+        mcp_1 = hex(int(f'0100{d[self._mcp_jumper_pos['addr2']]}{d[self._mcp_jumper_pos['addr1']]}1', 2))
+        self._mcp_addresses = {'mcp_0': mcp_0, 'mcp_1': mcp_1}
\ No newline at end of file
-- 
GitLab