diff --git a/config.py b/config.py index ad391ca92cd33b96ee0938f5f85cabad45e41f8c..10e75f243bdfc744abc0813c1d467b39d220f531 100644 --- a/config.py +++ b/config.py @@ -22,7 +22,8 @@ OHMPI_CONFIG = { 'max_elec': 64, 'board_addresses': {'A': 0x73, 'B': 0x72, 'M': 0x71, 'N': 0x70}, # CHECK IF YOUR BOARDS HAVE THESE ADDRESSES 'settings': 'ohmpi_settings.json', # INSERT YOUR FAVORITE SETTINGS FILE HERE - 'board_version': '22.10' + 'board_version': '22.10', + 'mux_board_version': '2023.0.0' } # TODO: add a dictionary with INA models and associated gain values # SET THE LOGGING LEVELS, MQTT BROKERS AND MQTT OPTIONS ACCORDING TO YOUR NEEDS diff --git a/ohmpi.py b/ohmpi.py index 6c008c9eb4f9d87a704e7600120ce19fc2000176..4cb7f48d0d983633a8123b08f93ef89ec48b455e 100644 --- a/ohmpi.py +++ b/ohmpi.py @@ -635,6 +635,7 @@ class OhmPi(object): self.max_elec = OHMPI_CONFIG['max_elec'] # maximum number of electrodes self.board_addresses = OHMPI_CONFIG['board_addresses'] self.board_version = OHMPI_CONFIG['board_version'] + self.mux_board_version = OHMPI_CONFIG['mux_board_version'] self.exec_logger.debug(f'OHMPI_CONFIG = {str(OHMPI_CONFIG)}') def read_quad(self, **kwargs): @@ -1208,7 +1209,7 @@ class OhmPi(object): ' Set use_mux to True to use the multiplexer...') elif self.sequence is None: self.exec_logger.warning('Unable to switch MUX without a sequence') - else: + elif self.mux_board_version == '2023.0.0': # choose with MUX board tca = adafruit_tca9548a.TCA9548A(self.i2c, self.board_addresses[role]) @@ -1232,6 +1233,34 @@ class OhmPi(object): else: self.exec_logger.warning(f'Unable to address electrode nr {electrode_nr}') + elif self.mux_board_version == '2024.0.0': + with open(self.mux_addressing_table, 'r') as myfile: + header = myfile.readlines()[0].strip('\n').split(',') + mux_addressing_table = np.genfromtxt(self.mux_addressing_table, dtype=str, + delimiter=',', skip_header=1, ) + mux_addressing_table = {header[k]: mux_addressing_table.T[k] for k in range(len(header))} + + 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 + + idx = np.where((mux_addressing_table['Electrode_id'] == electrode_nr) & (mux_addressing_table['Role'] == role))[0] + tca_addr = mux_addressing_table['TCA_address'][idx][0] + tca_channel = mux_addressing_table['TCA_channel'][idx][0] + if tca_addr is None: + tca = self.i2c + else: + tca = adafruit_tca9548a.TCA9548A(self.i2c, self.board_addresses[role]) + tca = adafruit_tca9548a.TCA9548A(self.i2c, hex(int(tca_addr,16)))[tca_channel] + mcp_addr = hex(int(mux_addressing_table['MCP_address'][idx][0], 16)) + MCP23017(tca, address=mcp_addr) + if state == 'on' + set_relay_state(mcp_addr, , True) + + else: + self.exec_logger.warning('MUX board version not recognized') + def switch_mux_on(self, quadrupole, cmd_id=None): """Switches on multiplexer relays for given quadrupole.