diff --git a/configs/config_mb_2024_0_2__2_mux_2024_dps5005.py b/configs/config_mb_2024_0_2__2_mux_2024_dps5005.py index 222888d78791de2d191eb30d14ef50d383be2010..5ed78807197a7a77ba134e9f4a46aa679724dd5c 100644 --- a/configs/config_mb_2024_0_2__2_mux_2024_dps5005.py +++ b/configs/config_mb_2024_0_2__2_mux_2024_dps5005.py @@ -34,25 +34,23 @@ HARDWARE_CONFIG = { 'mux': {'boards': {'mux_02': {'model': 'mux_2024_0_X', + 'roles': ['A', 'B', 'M', 'N'], + 'electrodes': range(1, 9), 'tca_address': None, 'tca_channel': 0, 'addr2': 'up', - 'addr1': 'up', - 'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'}, - 'cabling': {(i+0, j): ('mux_02', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)}, - 'voltage_max': 12.}, + 'addr1': 'up'}, 'mux_05': {'model': 'mux_2024_0_X', + 'roles': ['A', 'B', 'M', 'N'], + 'electrodes': range(9, 17), 'tca_address': None, 'tca_channel': 0, - 'addr2': 'up', - 'addr1': 'down', - 'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'}, - 'cabling': {(i+8, j): ('mux_05', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)}, - 'voltage_max': 12.} + 'addr2': 'down', + 'addr1': 'down'} }, 'default': {'interface_name': 'i2c_ext', - 'voltage_max': 100., + 'voltage_max': 50., 'current_max': 3.} } } diff --git a/configs/config_mb_2024_0_2__8_mux_2023_dps5005.py b/configs/config_mb_2024_0_2__8_mux_2023_dps5005.py index 7e05a44ba03e804486adf12d5b16b23dfd9df134..eef3c3daa16f33434f33836d6c244b949d2037b4 100644 --- a/configs/config_mb_2024_0_2__8_mux_2023_dps5005.py +++ b/configs/config_mb_2024_0_2__8_mux_2023_dps5005.py @@ -35,54 +35,50 @@ HARDWARE_CONFIG = { {'mux_A': {'model': 'mux_2023_0_X', 'mux_tca_address': 0x70, - 'roles': {'A': 'X'}, - 'cabling': {(i, j): ('mux_A', i) for j in ['A'] for i in range(1, 65)}, - 'voltage_max': 12.}, + 'roles': 'A', + 'electrodes': range(1, 65)}, 'mux_B': {'model': 'mux_2023_0_X', 'mux_tca_address': 0x71, - 'roles': {'B': 'X'}, - 'cabling': {(i, j): ('mux_B', i) for j in ['B'] for i in range(1, 65)}, - 'voltage_max': 12.}, + 'roles': 'B', + 'electrodes': range(1,65)}, 'mux_M': {'model': 'mux_2023_0_X', 'mux_tca_address': 0x72, - 'roles': {'M': 'X'}, - 'cabling': {(i, j): ('mux_M', i) for j in ['M'] for i in range(1, 65)}, - 'voltage_max': 12.}, + 'roles': 'M', + 'electrodes': range(1, 65)}, 'mux_N': {'model': 'mux_2023_0_X', 'mux_tca_address': 0x73, - 'roles': {'N': 'X'}, - 'cabling': {(i, j): ('mux_N', i) for j in ['N'] for i in range(1, 65)}, - 'voltage_max': 12.}, + 'roles': 'N', + 'electrodes': range(1,65), + # 'cabling': {(i, j): ('mux_N', i) for j in ['N'] for i in range(1, 65)}, + }, 'mux_A2': {'model': 'mux_2023_0_X', 'mux_tca_address': 0x74, - 'roles': {'A': 'X'}, - 'cabling': {(i+64, j): ('mux_A2', i) for j in ['A'] for i in range(1, 65)}, - 'voltage_max': 12.}, + 'roles': 'A', + 'electrodes': range(65, 129)}, 'mux_B2': {'model': 'mux_2023_0_X', 'mux_tca_address': 0x75, - 'roles': {'B': 'X'}, - 'cabling': {(i+64, j): ('mux_B2', i) for j in ['B'] for i in range(1, 65)}, - 'voltage_max': 12.}, + 'roles': 'B', + 'electrodes': range(65,129)}, 'mux_M2': {'model': 'mux_2023_0_X', 'mux_tca_address': 0x76, - 'roles': {'M': 'X'}, - 'cabling': {(i+64, j): ('mux_M2', i) for j in ['M'] for i in range(1, 65)}, - 'voltage_max': 12.}, + 'roles': 'M', + 'electrodes': range(65,129)}, 'mux_N2': {'model': 'mux_2023_0_X', 'mux_tca_address': 0x77, - 'roles': {'N': 'X'}, - 'cabling': {(i+64, j): ('mux_N2', i) for j in ['N'] for i in range(1, 65)}, - 'voltage_max': 12.}, + 'roles': 'N', + 'electrodes': range(65,129), + #'cabling': {(i+64, j): ('mux_N2', i) for j in ['N'] for i in range(1, 65)}, + }, }, 'default': {'interface_name': 'i2c_ext', - 'voltage_max': 100., + 'voltage_max': 50., 'current_max': 3.} } } diff --git a/ohmpi/hardware_components/mux_2023_0_X.py b/ohmpi/hardware_components/mux_2023_0_X.py index 1e88aef3f757bf1dafd718243fa602694bc72e6f..df4bd14d4770ef98f85c8406ef917a297dbb3a45 100644 --- a/ohmpi/hardware_components/mux_2023_0_X.py +++ b/ohmpi/hardware_components/mux_2023_0_X.py @@ -73,14 +73,27 @@ class Mux(MuxAbstract): self.exec_logger.event(f'{self.model}: {self.board_id}\tmux_init\tbegin\t{datetime.datetime.utcnow()}') assert isinstance(self.connection, I2C) self.exec_logger.debug(f'configuration: {kwargs}') - self._roles = kwargs.pop('roles', None) - if self._roles is None: - self._roles = {'A': 'X'} # NOTE: defaults to 1-role + roles = kwargs.pop('roles', None) + if isinstance(roles, str): + roles = [roles] + if roles is None: + roles = ['A'] # NOTE: defaults to 1-role + else: + self._roles = {roles[0]:'X'} if np.alltrue([j in self._roles.values() for j in set([i[1] for i in list(inner_cabling['1_role'].keys())])]): self._mode = '1_role' else: self.exec_logger.error(f'Invalid role assignment for {self.model}: {self._roles} !') self._mode = '' + cabling = kwargs.pop('cabling', None) + electrodes = kwargs.pop('electrodes', None) + self.cabling = {} + if cabling is None: + self.cabling = {(e, r): (i + 1, r) for r in roles for i, e in enumerate(electrodes)} + else: + for k, v in cabling.items(): + if v[0] == self.board_id: + self.cabling.update({k: (v[1], k[1])}) self._tca = [adafruit_tca9548a.TCA9548A(self.connection, kwargs['mux_tca_address'])[i] for i in np.arange(7, 3, -1)] # self._mcp_addresses = (kwargs.pop('mcp', '0x20')) # TODO: add assert on valid addresses.. self._mcp = [None, None, None, None] diff --git a/ohmpi/hardware_components/mux_2024_0_X.py b/ohmpi/hardware_components/mux_2024_0_X.py index 9334bb032b00518b450fb29598773437feeeb992..1da3a6cf8caedb5730d2421817163d2a56ed3bb6 100644 --- a/ohmpi/hardware_components/mux_2024_0_X.py +++ b/ohmpi/hardware_components/mux_2024_0_X.py @@ -69,9 +69,12 @@ class Mux(MuxAbstract): self.exec_logger.event(f'{self.model}: {self.board_id}\tmux_init\tbegin\t{datetime.datetime.utcnow()}') assert isinstance(self.connection, I2C) self.exec_logger.debug(f'configuration: {kwargs}') - self._roles = kwargs.pop('roles', None) - if self._roles is None: - self._roles = {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'} # NOTE: defaults to 4-roles + roles = kwargs.pop('roles', None) + if roles is None: + roles = ['A', 'B', 'M', 'N'] # NOTE: defaults to 4-roles + else: + roles_board = ['X', 'Y', 'XX', 'YY'] + self._roles = {roles[i]: roles_board[i] for i in range(len(roles))} if np.all([j in self._roles.values() for j in set([i[1] for i in list(inner_cabling['4_roles'].keys())])]): self._mode = '4_roles' elif np.all([j in self._roles.values() for j in set([i[1] for i in list(inner_cabling['2_roles'].keys())])]): @@ -79,7 +82,15 @@ class Mux(MuxAbstract): else: self.exec_logger.error(f'Invalid role assignment for {self.model}: {self._roles} !') self._mode = '' - + cabling = kwargs.pop('cabling', None) + electrodes = kwargs.pop('electrodes', None) + self.cabling = {} + if cabling is None: + self.cabling = {(e, r): (i + 1, r) for r in roles for i, e in enumerate(electrodes)} + else: + for k, v in cabling.items(): + if v[0] == self.board_id: + self.cabling.update({k: (v[1], k[1])}) # Setup TCA tca_address = kwargs.pop('tca_address', None) tca_channel = kwargs.pop('tca_channel', 0) @@ -126,7 +137,6 @@ class Mux(MuxAbstract): def switch_one(self, elec=None, role=None, state=None): MuxAbstract.switch_one(self, elec=elec, role=role, state=state) - def activate_relay(mcp, mcp_pin, value=True): pin_enable = mcp.get_pin(mcp_pin) pin_enable.direction = Direction.OUTPUT diff --git a/ohmpi/hardware_system.py b/ohmpi/hardware_system.py index 5a9437372aa1e54e3974931fd54ce1acff97a09b..080fbd4c2a5e2fea8db01ca1d0ddf43eed691a8e 100644 --- a/ohmpi/hardware_system.py +++ b/ohmpi/hardware_system.py @@ -163,8 +163,7 @@ class OhmPiHardware: for mux_id, mux in self.mux_boards.items(): mux.barrier = self.mux_barrier for k, v in mux.cabling.items(): - update_dict(self._cabling, {k: (mux_id, k[0])}) - + update_dict(self._cabling, {k: (mux_id, k[0])}) #TODO: in theory k[0] is not needed in values # Complete OhmPiHardware initialization self.readings = np.array([]) # time series of acquired data self._start_time = None # time of the beginning of a readings acquisition diff --git a/ohmpi/ohmpi.py b/ohmpi/ohmpi.py index 5f3b6d5d136cf7e06f4ebeef014c0ddabcd87239..d15fa18950c3fef354f534a300eac6b594b5dcda 100644 --- a/ohmpi/ohmpi.py +++ b/ohmpi/ohmpi.py @@ -196,7 +196,7 @@ class OhmPi(object): mm = np.repeat(last_measurement['M'], dd.shape[0]) nn = np.repeat(last_measurement['N'], dd.shape[0]) fwdata = np.c_[aa, bb, mm, nn, dd] - np.savetxt(f, fwdata, fmt=['%d', '%d', '%d', '%d', '%d', '%d', '%d', '%.3f', '%.3f']) + np.savetxt(f, fwdata, fmt=['%d', '%d', '%d', '%d', '%.3f', '%.3f', '%.3f']) if fw_in_csv: d = last_measurement['full_waveform'] diff --git a/ohmpi/utils.py b/ohmpi/utils.py index 653d112d510474107f63d31a83f3be7946e2861c..c1c45595b5bb6556da8e2f2a79780350d4a07706 100644 --- a/ohmpi/utils.py +++ b/ohmpi/utils.py @@ -115,27 +115,32 @@ def parse_log(log): return time, process_id, tag, msg, session -def mux_2024_to_mux_2023_takeouts(mux_boards): - +def mux_2024_to_mux_2023_takeouts(elec_list): """ Updates cabling for mux v2024 so that takeouts are similar to takeouts from mux v2023. This is only useful when replacing mux v2023 installations or re-using old test circuits. Parameters ---------- - mux_boards: list of class MUX objects. + elec_list: list of electrodes or sequence - Example - ------- - k = OhmPi() - mux_2024_to_mux_2023_takeouts(k._hw.mux_boards) """ mapper = {1: 16, 2: 1, 3: 15, 4: 2, 5: 14, 6: 3, 7: 13, 8: 4, 9: 12, 10: 5, 11: 11, 12: 6, 13: 10, 14: 7, 15: 9, 16: 8} - for mux in mux_boards: - new_cabling = mux.cabling.copy() - for k, v in mux.cabling.items(): - print(k, v) - new_cabling[k] = (mapper[v[0]], v[1]) - mux.cabling = new_cabling + return np.vectorize(mapper.get)(elec_list) + +def mux_2023_to_mux_2024_takeouts(elec_list): + """ Updates cabling for mux v2023 so that takeouts are similar to takeouts from mux v2024. + This is only useful when replacing mux v2023 installations or re-using old test circuits. + + Parameters + ---------- + elec_list: list of electrodes or sequence + + """ + + mapper = { 1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, + 9: 15, 10: 13, 11: 11, 12: 9, 13: 7, 14: 5, 15: 3, 16: 1,} + + return np.vectorize(mapper.get)(elec_list) \ No newline at end of file