diff --git a/hardware_components/mux_2024_22_23_4_roles_addressing_table.json b/hardware_components/mux_2024_22_23_4_roles_addressing_table.json new file mode 100644 index 0000000000000000000000000000000000000000..5e4554fd666063f24ac3e8c78e3f748b03f47ec6 --- /dev/null +++ b/hardware_components/mux_2024_22_23_4_roles_addressing_table.json @@ -0,0 +1 @@ +{"(1, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 0}, "(2, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 1}, "(3, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 2}, "(4, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 3}, "(5, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 4}, "(6, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 5}, "(7, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 6}, "(8, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 7}, "(1, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 8}, "(2, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 9}, "(3, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 10}, "(4, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 11}, "(5, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 12}, "(6, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 13}, "(7, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 14}, "(8, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 15}, "(8, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 0}, "(7, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 1}, "(6, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 2}, "(5, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 3}, "(4, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 4}, "(3, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 5}, "(2, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 6}, "(1, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 7}, "(8, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 8}, "(7, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 9}, "(6, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 10}, "(5, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 11}, "(4, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 12}, "(3, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 13}, "(2, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 14}, "(1, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 15}} diff --git a/hardware_components/mux_2024_rev_0_0.py b/hardware_components/mux_2024_rev_0_0.py new file mode 100644 index 0000000000000000000000000000000000000000..817410d0ce25785a550f36914ffea3b9632d7dc9 --- /dev/null +++ b/hardware_components/mux_2024_rev_0_0.py @@ -0,0 +1,67 @@ +from OhmPi.config import HARDWARE_CONFIG +import os +from OhmPi.hardware_components import MuxAbstract +import adafruit_tca9548a # noqa +from adafruit_mcp230xx.mcp23017 import MCP23017 # noqa +from digitalio import Direction # noqa + +MUX_CONFIG = HARDWARE_CONFIG['mux'] + +class Mux(MuxAbstract): + def __init__(self, **kwargs): + kwargs.update({'board_name': os.path.basename(__file__).rstrip('.py')}) + super().__init__(**kwargs) + self.max_elec = MUX_CONFIG['max_elec'] + print(os.path.curdir) + if self._addresses is None and 'addresses' in MUX_CONFIG.keys(): + self._get_addresses(MUX_CONFIG['addresses']) + + def reset(self): + pass + + def switch_one(self, elec=None, role=None, state=None): + MuxAbstract.switch_one(self, elec=elec, role=role, state=state) + + def set_relay_state(mcp, mcp_pin, state=True): + pin_enable = mcp.get_pin(mcp_pin) + pin_enable.direction = Direction.OUTPUT + pin_enable.value = state + + d = self._addresses[elec, role] + if d['TCA_address'] is None: + tca = self.controller.bus + else: + tca = adafruit_tca9548a.TCA9548A(self.controller.bus, d['TCA_address'])[d['TCA_channel']] + mcp = MCP23017(tca, address=d['MCP_address']) + if state == 'on': + print('opening gpio nr', d['MCP_GPIO']) + print('opening electrode nr', elec) + print('opening role', role) + print('opening MCP', d['MCP_address']) + set_relay_state(mcp, d['MCP_GPIO'], True) + if state == 'off': + set_relay_state(mcp, d['MCP_GPIO'], False) + + # self.tca = adafruit_tca9548a.TCA9548A(i2c, self.addresses[role]) + # # find I2C address of the electrode and corresponding relay + # # considering that one MCP23017 can cover 16 electrodes + # i2c_address = 7 - (elec - 1) // 16 # quotient without rest of the division + # relay = (elec - 1) - ((elec - 1) // 16) * 16 + # + # if i2c_address is not None: + # # select the MCP23017 of the selected MUX board + # mcp = MCP23017(self.tca[i2c_address]) + # mcp.get_pin(relay - 1).direction = digitalio.Direction.OUTPUT + # if state == 'on': + # mcp.get_pin(relay - 1).value = True + # else: + # mcp.get_pin(relay - 1).value = False + # # exec_logger.debug(f'Switching relay {relay} ' + # # f'({str(hex(self.addresses[role]))}) on:{on} for electrode {elec}') + # else: + # raise ValueError('No I2C address found for the electrode' + # ' {:d} on board {:s}'.format(elec, self.addresses[role])) + # # exec_logger.warning(f'Unable to address electrode nr {elec}') + + def test(self, *args): + MuxAbstract.test(self, *args) \ No newline at end of file