From 7fcfd166f0668c223c54227a77e910d4b64f61e1 Mon Sep 17 00:00:00 2001
From: su530201 <olivier.kaufmann@umons.ac.be>
Date: Tue, 2 May 2023 17:39:52 +0200
Subject: [PATCH] Refactors mux barrier to only activate muxes involved

---
 .../abstract_hardware_components.py           |  5 +----
 hardware_system.py                            | 20 ++++++++++++-------
 2 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/hardware_components/abstract_hardware_components.py b/hardware_components/abstract_hardware_components.py
index 63c39ef0..da34d4d8 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 7852284d..fe1e0170 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()
-- 
GitLab