diff --git a/hardware_components/abstract_hardware_components.py b/hardware_components/abstract_hardware_components.py index 63c39ef0db7613b44863a9fd5ec9c639e119ee37..da34d4d824bd0b4f062b06ebe0975fedb1f60ab8 100644 --- a/hardware_components/abstract_hardware_components.py +++ b/hardware_components/abstract_hardware_components.py @@ -62,10 +62,6 @@ class MuxAbstract(ABC): def _get_addresses(self): pass - @abstractmethod - def reset(self): - pass - @property def barrier(self): return self._barrier @@ -78,6 +74,7 @@ class MuxAbstract(ABC): @abstractmethod def reset(self): pass + def switch(self, elec_dict=None, state='on'): # TODO: generalize for other roles """Switch a given list of electrodes with different roles. Electrodes with a value of 0 will be ignored. diff --git a/hardware_system.py b/hardware_system.py index 7852284d46f8b7254bb4056250013c7a3772665d..fe1e0170e898f1ed1c2d11676abf1e9e11f63c69 100644 --- a/hardware_system.py +++ b/hardware_system.py @@ -281,14 +281,20 @@ class OhmPiHardware: if len(electrodes) == len(roles): # TODO: Check that we don't set incompatible roles to the same electrode elec_dict = {i: [] for i in roles} - for i in range(len(electrodes)): - elec_dict[roles[i]].append(electrodes[i]) mux_workers = [] - for _, mux in self.mux_boards.items(): - # start a new thread to perform some work - mux_workers.append(Thread(target=mux.switch, kwargs={'elec_dict': elec_dict})) - for mux_worker in mux_workers: - mux_worker.start() + for idx, elec in enumerate(electrodes): + elec_dict[roles[idx]].append(elec) + mux = self._cabling[(elec, roles[idx])][0] + if mux not in mux_workers: + mux_workers.append(mux) + mux_workers = list(set(mux_workers)) + b = Barrier(len(mux_workers)+1) + self.mux_barrier = b + for idx, mux in enumerate(mux_workers): + # Create a new thread to perform some work + self.mux_boards[mux].barrier = b + mux_workers[idx] = Thread(target=self.mux_boards[mux].switch, kwargs={'elec_dict': elec_dict}) + mux_workers[idx].start() self.mux_barrier.wait() for mux_worker in mux_workers: mux_worker.join()