From 02b36d98551ce6c96bf0a3bf552a70e677226609 Mon Sep 17 00:00:00 2001 From: jross Date: Wed, 21 Aug 2024 11:02:27 -0600 Subject: [PATCH 01/17] catch lock release errors --- pychron/spectrometer/isotopx/spectrometer/ngx.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index 1cdfaa053..d033a7ff0 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -292,9 +292,16 @@ def read_intensities( self.debug("keys: {}".format(keys)) self.debug("signals: {}".format(signals)) - self.microcontroller.lock.release() - if trigger_release: + try: self.microcontroller.lock.release() + except RuntimeError as e: + self.debug(f'Cannot release lock. "RuntimeError" {e}') + + if trigger_release: + try: + self.microcontroller.lock.release() + except RuntimeError as e: + self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') return keys, signals, collection_time, inc From 64c3f45ca31f914804baf906ccc20b30bddbbe88 Mon Sep 17 00:00:00 2001 From: jross Date: Wed, 21 Aug 2024 11:08:32 -0600 Subject: [PATCH 02/17] catch lock release errors --- pychron/spectrometer/isotopx/spectrometer/ngx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index d033a7ff0..1b1474b5e 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -206,7 +206,7 @@ def read_intensities( trigger_release = False if trigger or not self.microcontroller.triggered: resp = self.trigger_acq() - trigger_release = True + trigger_release = self.microcontroller.triggered # self.microcontroller.lock.release() if resp is not None: # if verbose: From ac96eca7dad1e364f4066f0d9a80eebcfde0767f Mon Sep 17 00:00:00 2001 From: jross Date: Wed, 21 Aug 2024 11:13:41 -0600 Subject: [PATCH 03/17] catch lock release errors --- pychron/spectrometer/isotopx/spectrometer/ngx.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index 1b1474b5e..2738823b7 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -56,6 +56,7 @@ class NGXSpectrometer(BaseSpectrometer, IsotopxMixin): acq_count = 0 total_acq_count = 10 has_atonas = True + triggered_lock_release_required = False def _microcontroller_default(self): service = "pychron.hardware.isotopx_spectrometer_controller.NGXController" @@ -129,6 +130,7 @@ def trigger_acq(self, verbose=True): if not self.microcontroller.triggered: self.microcontroller.lock.acquire() + self.triggered_lock_release_required = True # self.ask("StopAcq", verbose=verbose) self.microcontroller.stop_acquisition() self.microcontroller.triggered = True @@ -297,11 +299,13 @@ def read_intensities( except RuntimeError as e: self.debug(f'Cannot release lock. "RuntimeError" {e}') - if trigger_release: - try: - self.microcontroller.lock.release() - except RuntimeError as e: - self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') + if self.triggered_lock_release_required: + self.triggered_lock_release_required = False + if trigger_release: + try: + self.microcontroller.lock.release() + except RuntimeError as e: + self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') return keys, signals, collection_time, inc From e89d8566d93ac481dc360a96aa7b330b1ae922a9 Mon Sep 17 00:00:00 2001 From: jross Date: Fri, 23 Aug 2024 20:27:30 -0600 Subject: [PATCH 04/17] catch lock release errors --- pychron/hardware/actuators/ngx_gp_actuator.py | 3 ++- pychron/spectrometer/isotopx/magnet/ngx.py | 2 +- pychron/spectrometer/isotopx/spectrometer/ngx.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pychron/hardware/actuators/ngx_gp_actuator.py b/pychron/hardware/actuators/ngx_gp_actuator.py index d15d5349f..faeaee0f8 100644 --- a/pychron/hardware/actuators/ngx_gp_actuator.py +++ b/pychron/hardware/actuators/ngx_gp_actuator.py @@ -40,12 +40,13 @@ def initialize(self, *args, **kw): s = self.application.get_service(service) if s is not None: self.controller = s + self._lock = self.controller.lock return True def actuate(self, *args, **kw): # self.ask("StopAcq") self.controller.stop_acquisition() - self.controller.canceled = True + # self.controller.canceled = True # time.sleep(1) return super(NGXGPActuator, self).actuate(*args, **kw) diff --git a/pychron/spectrometer/isotopx/magnet/ngx.py b/pychron/spectrometer/isotopx/magnet/ngx.py index a1a32e22f..f668650fd 100644 --- a/pychron/spectrometer/isotopx/magnet/ngx.py +++ b/pychron/spectrometer/isotopx/magnet/ngx.py @@ -32,7 +32,7 @@ def set_dac(self, v, *args, **kw): def read_mass(self): # self.ask("StopAcq") self.microcontroller.stop_acquisition() - self.microcontroller.triggered = False + # self.microcontroller.triggered = False return self.ask("GETMASS") def set_mass(self, v, delay=None, deflect=False): diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index 2738823b7..958a2f5b6 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -326,7 +326,7 @@ def set_integration_time(self, it, force=False): self.microcontroller.stop_acquisition() self.ask("SetAcqPeriod 1000") self._read_enabled = False - self.microcontroller.triggered = False + # self.microcontroller.triggered = False self.integration_time = it # if self.integration_time != it or force: From 951e9ee623cdbdb421347e72362baf7b4b5aeb33 Mon Sep 17 00:00:00 2001 From: jross Date: Mon, 26 Aug 2024 14:58:43 -0600 Subject: [PATCH 05/17] no lock --- pychron/hardware/actuators/ngx_gp_actuator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pychron/hardware/actuators/ngx_gp_actuator.py b/pychron/hardware/actuators/ngx_gp_actuator.py index faeaee0f8..8dc9a57ef 100644 --- a/pychron/hardware/actuators/ngx_gp_actuator.py +++ b/pychron/hardware/actuators/ngx_gp_actuator.py @@ -40,7 +40,7 @@ def initialize(self, *args, **kw): s = self.application.get_service(service) if s is not None: self.controller = s - self._lock = self.controller.lock + # self._lock = self.controller.lock return True def actuate(self, *args, **kw): From c8f2e53eaba4babc2733bd85d5dee8983979f4a5 Mon Sep 17 00:00:00 2001 From: jross Date: Mon, 26 Aug 2024 15:09:29 -0600 Subject: [PATCH 06/17] lock --- pychron/hardware/actuators/gp_actuator.py | 2 ++ pychron/hardware/actuators/ngx_gp_actuator.py | 2 +- pychron/spectrometer/isotopx/spectrometer/ngx.py | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pychron/hardware/actuators/gp_actuator.py b/pychron/hardware/actuators/gp_actuator.py index d81bd7a98..484b55d95 100644 --- a/pychron/hardware/actuators/gp_actuator.py +++ b/pychron/hardware/actuators/gp_actuator.py @@ -66,7 +66,9 @@ def open_channel(self, obj): def actuate(self, obj, action): if self._lock: + self.debug(f'{self._lock} lock acquire') self._lock.acquire() + self.debug('lock acquired') if self._actuate(obj, action): ret = self._check_actuate(obj, action) diff --git a/pychron/hardware/actuators/ngx_gp_actuator.py b/pychron/hardware/actuators/ngx_gp_actuator.py index 8dc9a57ef..faeaee0f8 100644 --- a/pychron/hardware/actuators/ngx_gp_actuator.py +++ b/pychron/hardware/actuators/ngx_gp_actuator.py @@ -40,7 +40,7 @@ def initialize(self, *args, **kw): s = self.application.get_service(service) if s is not None: self.controller = s - # self._lock = self.controller.lock + self._lock = self.controller.lock return True def actuate(self, *args, **kw): diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index 958a2f5b6..dc02cbaa2 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -194,7 +194,7 @@ def read_intensities( # verbose=True self._read_enabled = True - verbose = True + # verbose = True if verbose: self.debug( @@ -296,6 +296,8 @@ def read_intensities( try: self.microcontroller.lock.release() + self.debug(f'Released lock. {self.microcontroller.lock}') + time.sleep(0.25) except RuntimeError as e: self.debug(f'Cannot release lock. "RuntimeError" {e}') From bc0231854cfe6d572ff5a652a7cd3840355dbd5e Mon Sep 17 00:00:00 2001 From: jross Date: Mon, 26 Aug 2024 15:17:41 -0600 Subject: [PATCH 07/17] lock release --- .../spectrometer/isotopx/spectrometer/ngx.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index dc02cbaa2..29844a87d 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -301,13 +301,17 @@ def read_intensities( except RuntimeError as e: self.debug(f'Cannot release lock. "RuntimeError" {e}') - if self.triggered_lock_release_required: - self.triggered_lock_release_required = False - if trigger_release: - try: - self.microcontroller.lock.release() - except RuntimeError as e: - self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') + # if self.triggered_lock_release_required: + # self.triggered_lock_release_required = False + # if trigger_release: + if self.microcontroller.lock.count > 0: + self.debug(f"trigger release. lock count={self.microcontroller.lock.count}") + self.microcontroller.lock.release() + + # try: + # self.microcontroller.lock.release() + # except RuntimeError as e: + # self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') return keys, signals, collection_time, inc From 05bdc7f91f4df2db55a0d14099bf1f202de4c208 Mon Sep 17 00:00:00 2001 From: jross Date: Mon, 26 Aug 2024 15:21:47 -0600 Subject: [PATCH 08/17] lock release --- pychron/spectrometer/isotopx/spectrometer/ngx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index 29844a87d..e6a1caab6 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -304,7 +304,7 @@ def read_intensities( # if self.triggered_lock_release_required: # self.triggered_lock_release_required = False # if trigger_release: - if self.microcontroller.lock.count > 0: + if self.microcontroller.lock.active_count() > 0: self.debug(f"trigger release. lock count={self.microcontroller.lock.count}") self.microcontroller.lock.release() From 1593cae2d3548bdecd4dd1a7b95833d98de1bf47 Mon Sep 17 00:00:00 2001 From: jross Date: Mon, 26 Aug 2024 15:24:37 -0600 Subject: [PATCH 09/17] lock release --- pychron/spectrometer/isotopx/spectrometer/ngx.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index e6a1caab6..b49c02f66 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -297,21 +297,20 @@ def read_intensities( try: self.microcontroller.lock.release() self.debug(f'Released lock. {self.microcontroller.lock}') - time.sleep(0.25) except RuntimeError as e: self.debug(f'Cannot release lock. "RuntimeError" {e}') # if self.triggered_lock_release_required: # self.triggered_lock_release_required = False # if trigger_release: - if self.microcontroller.lock.active_count() > 0: - self.debug(f"trigger release. lock count={self.microcontroller.lock.count}") - self.microcontroller.lock.release() - - # try: + # if self.microcontroller.lock.active_count() > 0: + # self.debug(f"trigger release. lock count={self.microcontroller.lock.count}") # self.microcontroller.lock.release() - # except RuntimeError as e: - # self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') + if trigger_release: + try: + self.microcontroller.lock.release() + except RuntimeError as e: + self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') return keys, signals, collection_time, inc From 2cfd57b924f9b3a8d3cbfc109583779acc39c97d Mon Sep 17 00:00:00 2001 From: jross Date: Mon, 26 Aug 2024 15:29:42 -0600 Subject: [PATCH 10/17] lock release --- pychron/spectrometer/isotopx/spectrometer/ngx.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index b49c02f66..9092691c4 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -306,11 +306,11 @@ def read_intensities( # if self.microcontroller.lock.active_count() > 0: # self.debug(f"trigger release. lock count={self.microcontroller.lock.count}") # self.microcontroller.lock.release() - if trigger_release: - try: - self.microcontroller.lock.release() - except RuntimeError as e: - self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') + # if trigger_release: + try: + self.microcontroller.lock.release() + except RuntimeError as e: + self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') return keys, signals, collection_time, inc From f816b31e23aa155f112ff3d97bb1eeaf8eaa1a63 Mon Sep 17 00:00:00 2001 From: jross Date: Mon, 26 Aug 2024 15:32:36 -0600 Subject: [PATCH 11/17] lock release --- pychron/spectrometer/isotopx/spectrometer/ngx.py | 10 +++++----- pychron/spectrometer/spectrometer_device.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index 9092691c4..b49c02f66 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -306,11 +306,11 @@ def read_intensities( # if self.microcontroller.lock.active_count() > 0: # self.debug(f"trigger release. lock count={self.microcontroller.lock.count}") # self.microcontroller.lock.release() - # if trigger_release: - try: - self.microcontroller.lock.release() - except RuntimeError as e: - self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') + if trigger_release: + try: + self.microcontroller.lock.release() + except RuntimeError as e: + self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') return keys, signals, collection_time, inc diff --git a/pychron/spectrometer/spectrometer_device.py b/pychron/spectrometer/spectrometer_device.py index 758e1d5b2..3523e90eb 100644 --- a/pychron/spectrometer/spectrometer_device.py +++ b/pychron/spectrometer/spectrometer_device.py @@ -51,8 +51,8 @@ def func(): return r if hasattr(self.microcontroller, "lock"): - with self.microcontroller.lock: - resp = func() + # with self.microcontroller.lock: + resp = func() else: resp = func() From ade172b86d803835d6a1e018424df920df1adca7 Mon Sep 17 00:00:00 2001 From: jross Date: Mon, 26 Aug 2024 15:37:12 -0600 Subject: [PATCH 12/17] lock release --- pychron/spectrometer/isotopx/spectrometer/ngx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index b49c02f66..44672bdc2 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -306,6 +306,7 @@ def read_intensities( # if self.microcontroller.lock.active_count() > 0: # self.debug(f"trigger release. lock count={self.microcontroller.lock.count}") # self.microcontroller.lock.release() + self.debug(f'trigger release. {trigger_release}') if trigger_release: try: self.microcontroller.lock.release() From 8dea0d5e720f07d99c7f64a5a5a8b52107a26737 Mon Sep 17 00:00:00 2001 From: jross Date: Mon, 26 Aug 2024 15:41:07 -0600 Subject: [PATCH 13/17] lock release --- pychron/spectrometer/isotopx/spectrometer/ngx.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index 44672bdc2..65537865b 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -206,9 +206,11 @@ def read_intensities( self.microcontroller.lock.acquire() resp = True trigger_release = False + self.debug(f'trigger={trigger} triggered={self.microcontroller.triggered}') if trigger or not self.microcontroller.triggered: resp = self.trigger_acq() trigger_release = self.microcontroller.triggered + self.debug(f'trigger_relase={trigger_release}') # self.microcontroller.lock.release() if resp is not None: # if verbose: From 4da7f3da15b0367fcd7cd37f92e01defff1cd88c Mon Sep 17 00:00:00 2001 From: jross Date: Mon, 26 Aug 2024 15:44:37 -0600 Subject: [PATCH 14/17] lock release --- pychron/spectrometer/isotopx/spectrometer/ngx.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index 65537865b..448b53fc7 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -205,7 +205,7 @@ def read_intensities( self.microcontroller.lock.acquire() resp = True - trigger_release = False + trigger_release = self.triggered_lock_release_required self.debug(f'trigger={trigger} triggered={self.microcontroller.triggered}') if trigger or not self.microcontroller.triggered: resp = self.trigger_acq() @@ -310,6 +310,7 @@ def read_intensities( # self.microcontroller.lock.release() self.debug(f'trigger release. {trigger_release}') if trigger_release: + self.triggered_lock_release_required = False try: self.microcontroller.lock.release() except RuntimeError as e: From 75880c584119f5fb64b16db5a39e5d1515811136 Mon Sep 17 00:00:00 2001 From: jross Date: Mon, 26 Aug 2024 15:55:22 -0600 Subject: [PATCH 15/17] lock release --- pychron/spectrometer/isotopx/spectrometer/ngx.py | 3 ++- pychron/spectrometer/spectrometer_device.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index 448b53fc7..27a9b8326 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -206,7 +206,8 @@ def read_intensities( self.microcontroller.lock.acquire() resp = True trigger_release = self.triggered_lock_release_required - self.debug(f'trigger={trigger} triggered={self.microcontroller.triggered}') + self.debug(f'trigger={trigger} triggered={self.microcontroller.triggered} ' + f'triggered_lock_release_required={self.triggered_lock_release_required}') if trigger or not self.microcontroller.triggered: resp = self.trigger_acq() trigger_release = self.microcontroller.triggered diff --git a/pychron/spectrometer/spectrometer_device.py b/pychron/spectrometer/spectrometer_device.py index 3523e90eb..758e1d5b2 100644 --- a/pychron/spectrometer/spectrometer_device.py +++ b/pychron/spectrometer/spectrometer_device.py @@ -51,8 +51,8 @@ def func(): return r if hasattr(self.microcontroller, "lock"): - # with self.microcontroller.lock: - resp = func() + with self.microcontroller.lock: + resp = func() else: resp = func() From bf1e4de5b67ebb02c1aa4edc12345634a52be6d8 Mon Sep 17 00:00:00 2001 From: jross Date: Mon, 26 Aug 2024 16:06:17 -0600 Subject: [PATCH 16/17] lock release --- .../spectrometer/isotopx/spectrometer/ngx.py | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index 27a9b8326..c1844f8e2 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -205,13 +205,13 @@ def read_intensities( self.microcontroller.lock.acquire() resp = True - trigger_release = self.triggered_lock_release_required - self.debug(f'trigger={trigger} triggered={self.microcontroller.triggered} ' - f'triggered_lock_release_required={self.triggered_lock_release_required}') + # trigger_release = self.triggered_lock_release_required + # self.debug(f'trigger={trigger} triggered={self.microcontroller.triggered} ' + # f'triggered_locrelease_required={self.triggered_lock_release_required}') if trigger or not self.microcontroller.triggered: resp = self.trigger_acq() - trigger_release = self.microcontroller.triggered - self.debug(f'trigger_relase={trigger_release}') + # trigger_release = self.microcontroller.triggered + # self.debug(f'trigger_relase={trigger_release}') # self.microcontroller.lock.release() if resp is not None: # if verbose: @@ -309,13 +309,13 @@ def read_intensities( # if self.microcontroller.lock.active_count() > 0: # self.debug(f"trigger release. lock count={self.microcontroller.lock.count}") # self.microcontroller.lock.release() - self.debug(f'trigger release. {trigger_release}') - if trigger_release: - self.triggered_lock_release_required = False - try: - self.microcontroller.lock.release() - except RuntimeError as e: - self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') + # self.debug(f'trigger release. {trigger_release}') + # if trigger_release: + # self.triggered_lock_release_required = False + try: + self.microcontroller.lock.release() + except RuntimeError as e: + self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') return keys, signals, collection_time, inc @@ -375,6 +375,4 @@ def _get_simulation_data(self): def _integration_time_default(self): self.default_integration_time = ISOTOPX_DEFAULT_INTEGRATION_TIME return ISOTOPX_DEFAULT_INTEGRATION_TIME - - # ============= EOF ============================================= From 964ad147ff6e6910d3b13fca95631ba94dfc3d2b Mon Sep 17 00:00:00 2001 From: jross Date: Sat, 14 Sep 2024 17:11:13 -0600 Subject: [PATCH 17/17] use SAB instead of buffer --- .../extraction_line_manager.py | 7 +++- pychron/hardware/actuators/ngx_gp_actuator.py | 9 ++-- .../communicators/ethernet_communicator.py | 24 +++++------ .../isotopx_spectrometer_controller.py | 23 +++++++++-- .../spectrometer/isotopx/spectrometer/ngx.py | 41 +++++++++++-------- pychron/spectrometer/jobs/dac_scanner.py | 8 ++-- 6 files changed, 72 insertions(+), 40 deletions(-) diff --git a/pychron/extraction_line/extraction_line_manager.py b/pychron/extraction_line/extraction_line_manager.py index 08586ec35..9f32a38c5 100644 --- a/pychron/extraction_line/extraction_line_manager.py +++ b/pychron/extraction_line/extraction_line_manager.py @@ -17,7 +17,7 @@ import logging import os import time -from socket import gethostbyname, gethostname +from socket import gethostbyname, gethostname, gaierror from threading import Thread # =============enthought library imports======================= @@ -871,8 +871,11 @@ def _check_ownership(self, name, requestor, force=False): ret = True if force or self.check_master_owner: - if requestor is None: + try: requestor = gethostbyname(gethostname()) + except gaierror: + self.debug("failed to get host name. defaulting to 'localhost'") + requestor = "localhost" self.debug("checking ownership. requestor={}".format(requestor)) try: diff --git a/pychron/hardware/actuators/ngx_gp_actuator.py b/pychron/hardware/actuators/ngx_gp_actuator.py index faeaee0f8..17dca8cb7 100644 --- a/pychron/hardware/actuators/ngx_gp_actuator.py +++ b/pychron/hardware/actuators/ngx_gp_actuator.py @@ -40,15 +40,18 @@ def initialize(self, *args, **kw): s = self.application.get_service(service) if s is not None: self.controller = s - self._lock = self.controller.lock + # self._lock = self.controller.lock return True def actuate(self, *args, **kw): # self.ask("StopAcq") - self.controller.stop_acquisition() + # self.controller.stop_acquisition() + self.controller.set_acquisition_buffer(1) # self.controller.canceled = True # time.sleep(1) - return super(NGXGPActuator, self).actuate(*args, **kw) + ret = super(NGXGPActuator, self).actuate(*args, **kw) + self.controller.set_acquisition_buffer(0) + return ret def get_channel_state(self, obj, delay=False, verbose=False, **kw): """ """ diff --git a/pychron/hardware/core/communicators/ethernet_communicator.py b/pychron/hardware/core/communicators/ethernet_communicator.py index 74dbee1b7..20a33dc5b 100644 --- a/pychron/hardware/core/communicators/ethernet_communicator.py +++ b/pychron/hardware/core/communicators/ethernet_communicator.py @@ -252,7 +252,7 @@ class EthernetCommunicator(Communicator): message_frame = "" timeout = Float(1.0) strip = True - default_timeout = 3 + # default_timeout = 3 default_datasize = 2**12 _comms_report_attrs = ( @@ -319,14 +319,14 @@ def load(self, config, path): self.message_frame = self.config_get( config, "Communications", "message_frame", optional=True, default="" ) - self.default_timeout = self.config_get( - config, - "Communications", - "default_timeout", - cast="int", - optional=True, - default=3, - ) + # self.default_timeout = self.config_get( + # config, + # "Communications", + # "default_timeout", + # cast="int", + # optional=True, + # default=3, + # ) self.default_datasize = self.config_get( config, "Communications", @@ -461,7 +461,7 @@ def ask( retries = 2 if timeout is None: - timeout = self.default_timeout + timeout = self.timeout re = "ERROR: Connection refused: {}, timeout={}".format( self.address, timeout @@ -506,7 +506,7 @@ def reset(self): self._reset_connection() def select_read(self, *args, **kw): - timeout = self.default_timeout + timeout = self.timeout handler = self.get_handler(timeout=timeout) if handler: handler = self.get_read_handler(handler, timeout=timeout) @@ -583,7 +583,7 @@ def _reset_error_mode(self, timeout=None, use_error_mode=True): timeout = 0.5 if timeout is None: - timeout = self.default_timeout + timeout = self.timeout self.error_mode = False return timeout diff --git a/pychron/hardware/isotopx_spectrometer_controller.py b/pychron/hardware/isotopx_spectrometer_controller.py index bd0581d6f..331e9e643 100644 --- a/pychron/hardware/isotopx_spectrometer_controller.py +++ b/pychron/hardware/isotopx_spectrometer_controller.py @@ -28,6 +28,16 @@ from pychron.hardware.core.core_device import CoreDevice +# import ctypes, _thread +# class mRLock(_thread.RLock): +# +# offsetof_rlock_count = 32 # on 64-bit system +# +# @property +# def count(self): +# rlock_count_b = ctypes.string_at(id(self)+self.offsetof_rlock_count, 8) +# return int.from_bytes(rlock_count_b, 'little', signed=False) +# class NGXController(CoreDevice): username = Str("") @@ -46,10 +56,14 @@ def ask(self, cmd, *args, **kw): (cmd.startswith(t) for t in ("GetValveStatus", "OpenValve", "CloseValve")) ): if resp and resp.strip() not in ("E00", "OPEN", "CLOSED"): + # if resp.strip()=='E04': + # time.sleep(3) + # return "OPEN\r\n" # self.event_buf.push(resp) self.debug("retrying") time.sleep(0.5) return self.ask(cmd, *args, **kw) + return resp # def read(self, *args, **kw): @@ -58,6 +72,9 @@ def ask(self, cmd, *args, **kw): # else: # resp = self.event_buffer.get() # return resp + def set_acquisition_buffer(self, v): + self.debug("set acquisition buffer {}".format(v)) + self.ask("SAB {}".format(v)) def stop_acquisition(self): self.triggered = False @@ -75,7 +92,9 @@ def initialize(self, *args, **kw): self.communicator.strip = False # trying a new locking mechanism see ngx.trigger for more details - self.lock = RLock() + + self.lock = Lock() + # self.lock = mRLock() # self.event_buffer = Queue() if ret: @@ -87,8 +106,6 @@ def initialize(self, *args, **kw): if resp: self.info("NGX-{}".format(resp)) self.ask("Login {},{}".format(self.username, self.password)) - return True - # ============= EOF ============================================= diff --git a/pychron/spectrometer/isotopx/spectrometer/ngx.py b/pychron/spectrometer/isotopx/spectrometer/ngx.py index c1844f8e2..c2a70a5e0 100644 --- a/pychron/spectrometer/isotopx/spectrometer/ngx.py +++ b/pychron/spectrometer/isotopx/spectrometer/ngx.py @@ -56,7 +56,7 @@ class NGXSpectrometer(BaseSpectrometer, IsotopxMixin): acq_count = 0 total_acq_count = 10 has_atonas = True - triggered_lock_release_required = False + # triggered_lock_release_required = False def _microcontroller_default(self): service = "pychron.hardware.isotopx_spectrometer_controller.NGXController" @@ -129,8 +129,8 @@ def trigger_acq(self, verbose=True): # time.sleep(0.25) if not self.microcontroller.triggered: - self.microcontroller.lock.acquire() - self.triggered_lock_release_required = True + # self.microcontroller.lock.acquire() + # self.triggered_lock_release_required = True # self.ask("StopAcq", verbose=verbose) self.microcontroller.stop_acquisition() self.microcontroller.triggered = True @@ -188,13 +188,13 @@ def set_source_parameter(self, name, value): self.ask(f"SetSourceOutput {name},{value}") def read_intensities( - self, timeout=60, trigger=False, target="ACQ.B", verbose=False + self, timeout=60, trigger=False, target="ACQ.B", verbose=True ): # self.microcontroller.lock.acquire() # verbose=True self._read_enabled = True - # verbose = True + verbose = True if verbose: self.debug( @@ -203,11 +203,12 @@ def read_intensities( ) ) - self.microcontroller.lock.acquire() + # self.microcontroller.lock.acquire() resp = True # trigger_release = self.triggered_lock_release_required # self.debug(f'trigger={trigger} triggered={self.microcontroller.triggered} ' # f'triggered_locrelease_required={self.triggered_lock_release_required}') + # print('treigger', trigger, self.microcontroller.triggered) if trigger or not self.microcontroller.triggered: resp = self.trigger_acq() # trigger_release = self.microcontroller.triggered @@ -220,6 +221,9 @@ def read_intensities( time.sleep(0.95) # if verbose: # self.debug('trigger wait finished') + # else: + # self.microcontroller.lock.acquire() + # self.triggered_lock_release_required = True keys = [] signals = [] @@ -232,7 +236,7 @@ def read_intensities( keys = self.detector_names[::-1] while self._read_enabled: # with self.microcontroller.lock: - line = self.readline(verbose=True) + line = self.readline(verbose=verbose) if verbose: self.debug("raw: {}".format(line)) @@ -297,11 +301,13 @@ def read_intensities( self.debug("keys: {}".format(keys)) self.debug("signals: {}".format(signals)) - try: - self.microcontroller.lock.release() - self.debug(f'Released lock. {self.microcontroller.lock}') - except RuntimeError as e: - self.debug(f'Cannot release lock. "RuntimeError" {e}') + # try: + # # the integration cycle is complete. release the lock + # if inc: + # self.microcontroller.lock.release() + # self.debug(f'Released lock. {self.microcontroller.lock}') + # except RuntimeError as e: + # self.debug(f'Cannot release lock. "RuntimeError" {e}') # if self.triggered_lock_release_required: # self.triggered_lock_release_required = False @@ -312,10 +318,13 @@ def read_intensities( # self.debug(f'trigger release. {trigger_release}') # if trigger_release: # self.triggered_lock_release_required = False - try: - self.microcontroller.lock.release() - except RuntimeError as e: - self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') + + # if self.microcontroller.lock.count>0: + # try: + # self.microcontroller.lock.release() + # except RuntimeError as e: + # if verbose: + # self.debug(f'Trigger Release. Cannot release lock. "RuntimeError" {e}') return keys, signals, collection_time, inc diff --git a/pychron/spectrometer/jobs/dac_scanner.py b/pychron/spectrometer/jobs/dac_scanner.py index 84407e2e2..4d535804d 100644 --- a/pychron/spectrometer/jobs/dac_scanner.py +++ b/pychron/spectrometer/jobs/dac_scanner.py @@ -183,7 +183,6 @@ def __init__(self, *args, **kw): # graph.set_x_title('Magnet DAC (Voltage)') # graph.set_y_title('Intensity') - self._use_mftable_limits_fired() # private def _reset_hook(self): @@ -197,8 +196,9 @@ def _setup_graph(self, graph, plot): graph.new_series() graph.set_x_title("Magnet DAC (Voltage)") graph.set_y_title("Intensity") + # self._use_mftable_limits_fired() - # scan methods +# scan methods def _do_step(self, magnet, step): magnet.set_dac(step, verbose=False) @@ -316,14 +316,14 @@ def _scan_min_dac_changed(self): self.tool.low = self.scan_min_dac self.tool.overlay.low = self.scan_min_dac self._scan_time_length_changed() - self.graph.redraw() + # self.graph.redraw() def _scan_max_dac_changed(self): if self.tool: self.tool.high = self.scan_max_dac self.tool.overlay.high = self.scan_max_dac self._scan_time_length_changed() - self.graph.redraw() + # self.graph.redraw() def _min_dac_changed(self): if self.min_dac < self.max_dac: