Commit 86c4badb authored by Arnaud WATLET's avatar Arnaud WATLET
Browse files

Merge branch '132-improve-handling-of-mux-cabling-in-config' into v2024_rc

Showing with 80 additions and 59 deletions
+80 -59
......@@ -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.}
}
}
......
......@@ -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.}
}
}
......
......@@ -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]
......
......@@ -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
......
......@@ -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
......
......@@ -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']
......
......@@ -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
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment