Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dev/dc #2234

Merged
merged 18 commits into from
Dec 2, 2024
2 changes: 2 additions & 0 deletions pychron/hardware/actuators/gp_actuator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
7 changes: 1 addition & 6 deletions pychron/hardware/actuators/ngx_gp_actuator.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +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
return True

def actuate(self, *args, **kw):
Expand All @@ -48,12 +49,6 @@ def actuate(self, *args, **kw):
self.controller.set_acquisition_buffer(False)
return ret

# self.ask("StopAcq")
# self.controller.stop_acquisition()
# self.controller.canceled = True
# time.sleep(1)
# return super(NGXGPActuator, self).actuate(*args, **kw)

def get_channel_state(self, obj, delay=False, verbose=False, **kw):
""" """
if delay:
Expand Down
18 changes: 16 additions & 2 deletions pychron/hardware/isotopx_spectrometer_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -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("")
Expand All @@ -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):
Expand All @@ -58,6 +72,7 @@ def ask(self, cmd, *args, **kw):
# else:
# resp = self.event_buffer.get()
# return resp

def set_acquisition_buffer(self, flag):
flag = "1" if flag else "0"
self.debug(f"set acquisition buffer {flag}")
Expand All @@ -81,6 +96,7 @@ def initialize(self, *args, **kw):
# trying a new locking mechanism see ngx.trigger for more details

self.lock = Lock()
# self.lock = mRLock()
# self.event_buffer = Queue()

if ret:
Expand All @@ -92,8 +108,6 @@ def initialize(self, *args, **kw):
if resp:
self.info("NGX-{}".format(resp))
self.ask("Login {},{}".format(self.username, self.password))

return True


# ============= EOF =============================================
2 changes: 1 addition & 1 deletion pychron/spectrometer/isotopx/magnet/ngx.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,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, **kw):
Expand Down
44 changes: 38 additions & 6 deletions pychron/spectrometer/isotopx/spectrometer/ngx.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -129,6 +130,8 @@ 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
Expand Down Expand Up @@ -186,7 +189,7 @@ 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
Expand All @@ -203,10 +206,15 @@ def read_intensities(

# self.microcontroller.lock.acquire()
resp = True
# trigger_release = self.microcontroller.triggered
# 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 = True
# trigger_release = self.microcontroller.triggered
# self.debug(f'trigger_relase={trigger_release}')

# self.microcontroller.lock.release()
if resp is not None:
# if verbose:
Expand All @@ -215,6 +223,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 = []
Expand Down Expand Up @@ -293,6 +304,29 @@ def read_intensities(
self.debug("signals: {}".format(signals))

# 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
# 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()
# self.debug(f'trigger release. {trigger_release}')
# if trigger_release:
# self.triggered_lock_release_required = False

# 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}')
# self.microcontroller.lock.release()
# except RuntimeError as e:
# self.debug(f'Cannot release lock. "RuntimeError" {e}')
Expand Down Expand Up @@ -322,7 +356,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:
Expand Down Expand Up @@ -361,6 +395,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 =============================================
4 changes: 2 additions & 2 deletions pychron/spectrometer/jobs/dac_scanner.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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)

Expand Down
Loading