From 5f714e71af35119bc96d9e0eea1fe2d9a9d597ed Mon Sep 17 00:00:00 2001 From: Sarah Steiger Date: Thu, 29 Aug 2024 11:04:21 -0400 Subject: [PATCH 01/13] change name from thorlabs_mcls1 to thorlabs_mcls1_sim --- catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py index a7156f63..0376959e 100644 --- a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py +++ b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py @@ -9,7 +9,7 @@ class ThorlabsMcls1Sim(Service): def __init__(self): - super().__init__('thorlabs_mcls1') + super().__init__('thorlabs_mcls1_sim') self.threads = {} self.communication_queue = queue.Queue() From 914b17cc55b4ec12a6d1334f0ce9083dc9720920 Mon Sep 17 00:00:00 2001 From: Sarah Steiger Date: Thu, 29 Aug 2024 11:05:14 -0400 Subject: [PATCH 02/13] add light_source_data property to Simulator --- catkit2/simulator/simulator.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/catkit2/simulator/simulator.py b/catkit2/simulator/simulator.py index ca8835b5..a4132a66 100644 --- a/catkit2/simulator/simulator.py +++ b/catkit2/simulator/simulator.py @@ -85,6 +85,8 @@ def __init__(self, service_type, max_time_factor=1): self.make_command('switch_power', self.switch_power) self.make_command('set_source_power', self.set_source_power) + self.make_property('light_source_data', lambda: self.light_source_data) + self.integrating_cameras = {} self.camera_integrated_power = {} self.camera_callbacks = {} From 11ca2e1eac9169d222cf3cb85cd6f1552a5dea98 Mon Sep 17 00:00:00 2001 From: Sarah Steiger Date: Thu, 29 Aug 2024 11:06:10 -0400 Subject: [PATCH 03/13] create get_temperature function instead of a lambda function for consistency with other getters --- catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py index 0376959e..3d2551d0 100644 --- a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py +++ b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py @@ -30,7 +30,7 @@ def open(self): } self.status_funcs = { - 'temperature': (self.temperature, lambda: self.config['temperature']), + 'temperature': (self.temperature, self.get_temperature), 'power': (self.power, self.get_power) } @@ -118,6 +118,8 @@ def set_target_temperature(self, value): def get_power(self): return self.testbed.simulator.light_source_data[self.id + '_power'] + def get_temperature(self): + return self.config['target_temperature'] if __name__ == '__main__': From b0094684a1da53e57e61f903d944cd1c574a86b9 Mon Sep 17 00:00:00 2001 From: Sarah Steiger Date: Thu, 29 Aug 2024 11:37:04 -0400 Subject: [PATCH 04/13] remove seemingly unnecessary passings of self (is causing TypeErrors) --- catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py index 3d2551d0..87ece90b 100644 --- a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py +++ b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py @@ -61,7 +61,7 @@ def main(self): while not self.should_shut_down: try: task, args = self.communication_queue.get(timeout=1) - task(self, *args) + task(*args) self.communication_queue.task_done() except queue.Empty: pass @@ -86,8 +86,8 @@ def func(): return func def update_status_func(self, getter, stream): - def func(self): - result = getter(self) + def func(): + result = getter() stream.submit_data(np.array([result]).astype(stream.dtype)) return func From a64fe3d226b67dee4c42d35b86061813e296c5d6 Mon Sep 17 00:00:00 2001 From: Sarah Steiger Date: Thu, 29 Aug 2024 11:37:49 -0400 Subject: [PATCH 05/13] if light source data is not populated with a power, return 0 --- catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py index 87ece90b..c9b55916 100644 --- a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py +++ b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py @@ -117,7 +117,11 @@ def set_target_temperature(self, value): pass def get_power(self): - return self.testbed.simulator.light_source_data[self.id + '_power'] + try: + return self.testbed.simulator.light_source_data[self.id + '_power'] + except KeyError: + return 0 + def get_temperature(self): return self.config['target_temperature'] From 391be0107765b12e3a02d955b309504f590088f2 Mon Sep 17 00:00:00 2001 From: Sarah Steiger Date: Thu, 29 Aug 2024 15:25:07 -0400 Subject: [PATCH 06/13] refactor simulated mcls service in line with non-simulated mcls service --- .../thorlabs_mcls1_sim/thorlabs_mcls1_sim.py | 64 ++++++++----------- 1 file changed, 25 insertions(+), 39 deletions(-) diff --git a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py index c9b55916..1af1b1d8 100644 --- a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py +++ b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py @@ -1,17 +1,28 @@ import time -import queue import numpy as np import threading from catkit2.testbed.service import Service +def make_monitor_func(stream, setter): + def func(self): + while not self.should_shut_down: + try: + frame = stream.get_next_frame(1) + except Exception: + continue + + setter(frame.data[0]) + + return func + + class ThorlabsMcls1Sim(Service): def __init__(self): super().__init__('thorlabs_mcls1_sim') self.threads = {} - self.communication_queue = queue.Queue() def open(self): # Make datastreams @@ -29,20 +40,14 @@ def open(self): 'target_temperature': self.set_target_temperature, } - self.status_funcs = { - 'temperature': (self.temperature, self.get_temperature), - 'power': (self.power, self.get_power) - } - - funcs = { - 'emission': self.monitor_func(self.emission, self.setters['emission']), - 'current_setpoint': self.monitor_func(self.current_setpoint, self.setters['current_setpoint']), - 'target_temperature': self.monitor_func(self.target_temperature, self.setters['target_temperature']), - } + self.getters = [ + self.get_temperature, + self.get_power + ] - # Start all threads. - for key, func in funcs.items(): - thread = threading.Thread(target=func) + for key, setter in self.setters.items(): + func = make_monitor_func(getattr(self, key), setter) + thread = threading.Thread(target=func, args=(self,)) thread.start() self.threads[key] = thread @@ -59,32 +64,16 @@ def open(self): def main(self): while not self.should_shut_down: - try: - task, args = self.communication_queue.get(timeout=1) - task(*args) - self.communication_queue.task_done() - except queue.Empty: - pass + self.sleep(1) def close(self): # Turn off the source - self.setters['emission'](self, 0) + self.set_emission(0) # Join all threads. for thread in self.threads.values(): thread.join() - def monitor_func(self, stream, setter): - def func(): - while not self.should_shut_down: - try: - frame = stream.get_next_frame(1) - except Exception: - continue - self.communication_queue.put((setter, [frame.data[0]])) - - return func - def update_status_func(self, getter, stream): def func(): result = getter() @@ -93,8 +82,8 @@ def func(): def update_status(self): while not self.should_shut_down: - for stream, getter in self.status_funcs.values(): - self.communication_queue.put((self.update_status_func(getter, stream), [])) + for getter in self.getters: + getter() time.sleep(1) @@ -117,10 +106,7 @@ def set_target_temperature(self, value): pass def get_power(self): - try: - return self.testbed.simulator.light_source_data[self.id + '_power'] - except KeyError: - return 0 + return self.testbed.simulator.light_source_data[self.id + '_power'] def get_temperature(self): return self.config['target_temperature'] From abd6389bffb13ac5bb5a2e37819a9b3669518540 Mon Sep 17 00:00:00 2001 From: Sarah Steiger Date: Thu, 29 Aug 2024 11:06:10 -0400 Subject: [PATCH 07/13] create get_temperature function instead of a lambda function for consistency with other getters --- .../services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py index 1af1b1d8..8a32013c 100644 --- a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py +++ b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py @@ -40,10 +40,10 @@ def open(self): 'target_temperature': self.set_target_temperature, } - self.getters = [ - self.get_temperature, - self.get_power - ] + self.status_funcs = { + 'temperature': (self.temperature, self.get_temperature), + 'power': (self.power, self.get_power) + } for key, setter in self.setters.items(): func = make_monitor_func(getattr(self, key), setter) @@ -107,6 +107,8 @@ def set_target_temperature(self, value): def get_power(self): return self.testbed.simulator.light_source_data[self.id + '_power'] + def get_temperature(self): + return self.config['target_temperature'] def get_temperature(self): return self.config['target_temperature'] From 4c22f221c1aab2262f531a4b3d88333b9cdd5cb0 Mon Sep 17 00:00:00 2001 From: Sarah Steiger Date: Thu, 29 Aug 2024 11:37:04 -0400 Subject: [PATCH 08/13] remove seemingly unnecessary passings of self (is causing TypeErrors) --- catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py index 8a32013c..fff1d88e 100644 --- a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py +++ b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py @@ -64,7 +64,12 @@ def open(self): def main(self): while not self.should_shut_down: - self.sleep(1) + try: + task, args = self.communication_queue.get(timeout=1) + task(*args) + self.communication_queue.task_done() + except queue.Empty: + pass def close(self): # Turn off the source From 039300e6db26e1eb539708a9a9f4af00bfe6f679 Mon Sep 17 00:00:00 2001 From: Sarah Steiger Date: Thu, 29 Aug 2024 11:37:49 -0400 Subject: [PATCH 09/13] if light source data is not populated with a power, return 0 --- catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py index fff1d88e..174540c7 100644 --- a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py +++ b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py @@ -111,7 +111,11 @@ def set_target_temperature(self, value): pass def get_power(self): - return self.testbed.simulator.light_source_data[self.id + '_power'] + try: + return self.testbed.simulator.light_source_data[self.id + '_power'] + except KeyError: + return 0 + def get_temperature(self): return self.config['target_temperature'] From bf4b02b2d73cbfb7b592b4dd521e5af7448d3c41 Mon Sep 17 00:00:00 2001 From: Sarah Steiger Date: Thu, 29 Aug 2024 15:25:07 -0400 Subject: [PATCH 10/13] refactor simulated mcls service in line with non-simulated mcls service --- .../thorlabs_mcls1_sim/thorlabs_mcls1_sim.py | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py index 174540c7..b73d5ebf 100644 --- a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py +++ b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py @@ -40,10 +40,10 @@ def open(self): 'target_temperature': self.set_target_temperature, } - self.status_funcs = { - 'temperature': (self.temperature, self.get_temperature), - 'power': (self.power, self.get_power) - } + self.getters = [ + self.get_temperature, + self.get_power + ] for key, setter in self.setters.items(): func = make_monitor_func(getattr(self, key), setter) @@ -64,12 +64,7 @@ def open(self): def main(self): while not self.should_shut_down: - try: - task, args = self.communication_queue.get(timeout=1) - task(*args) - self.communication_queue.task_done() - except queue.Empty: - pass + self.sleep(1) def close(self): # Turn off the source @@ -111,10 +106,7 @@ def set_target_temperature(self, value): pass def get_power(self): - try: - return self.testbed.simulator.light_source_data[self.id + '_power'] - except KeyError: - return 0 + return self.testbed.simulator.light_source_data[self.id + '_power'] def get_temperature(self): return self.config['target_temperature'] From 7e50488ea058a93adbf95d95af5d7a83d5655618 Mon Sep 17 00:00:00 2001 From: Sarah Steiger Date: Mon, 9 Sep 2024 10:21:01 -0400 Subject: [PATCH 11/13] remove unused update_status_func function --- catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py index b73d5ebf..df522885 100644 --- a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py +++ b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py @@ -74,12 +74,6 @@ def close(self): for thread in self.threads.values(): thread.join() - def update_status_func(self, getter, stream): - def func(): - result = getter() - stream.submit_data(np.array([result]).astype(stream.dtype)) - return func - def update_status(self): while not self.should_shut_down: for getter in self.getters: From 101cef17a6b1f4e1e41805319a776e5a189a5f51 Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Mon, 9 Sep 2024 16:44:58 -0400 Subject: [PATCH 12/13] Use self.sleep() rather than time.sleep(). --- catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py index df522885..6fab50ff 100644 --- a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py +++ b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py @@ -1,4 +1,3 @@ -import time import numpy as np import threading @@ -79,7 +78,7 @@ def update_status(self): for getter in self.getters: getter() - time.sleep(1) + self.sleep(1) def set_emission(self, emission): self.testbed.simulator.set_source_power( From 7c333f366323cec27614773eec56ee3e73cc56ed Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Mon, 9 Sep 2024 16:45:30 -0400 Subject: [PATCH 13/13] Remove duplicate function. --- catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py index 6fab50ff..28fe80d7 100644 --- a/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py +++ b/catkit2/services/thorlabs_mcls1_sim/thorlabs_mcls1_sim.py @@ -104,9 +104,6 @@ def get_power(self): def get_temperature(self): return self.config['target_temperature'] - def get_temperature(self): - return self.config['target_temperature'] - if __name__ == '__main__': service = ThorlabsMcls1Sim()