Commit a512be70 authored by Alejandro Homs Puron's avatar Alejandro Homs Puron
Browse files

Merge branch 'fix-154-backport' into 'bliss-0.1'

Fix 154 backport

See merge request !493
parents 4239db77 29a6f8ae
This diff is collapsed.
...@@ -181,6 +181,9 @@ class BaseCT2Device(object): ...@@ -181,6 +181,9 @@ class BaseCT2Device(object):
def trigger_point(self): def trigger_point(self):
self._device.trigger_point() self._device.trigger_point()
def dump_memory(self):
return self._device.dump_memory()
@property @property
def counters(self): def counters(self):
return self._device.counters return self._device.counters
...@@ -232,16 +235,10 @@ class CT2Device(BaseCT2Device): ...@@ -232,16 +235,10 @@ class CT2Device(BaseCT2Device):
AcqMode.ExtTrigMulti, AcqMode.ExtTrigMulti,
] ]
ExtStartModes = [
AcqMode.ExtTrigSingle,
AcqMode.ExtTrigMulti,
AcqMode.ExtGate,
AcqMode.ExtTrigReadout,
]
ExtTrigModes = [ ExtTrigModes = [
AcqMode.ExtTrigMulti, AcqMode.ExtTrigMulti,
AcqMode.ExtGate, AcqMode.ExtGate,
AcqMode.ExtTrigReadout,
] ]
ExtExpModes = [ ExtExpModes = [
...@@ -640,7 +637,7 @@ class CT2Device(BaseCT2Device): ...@@ -640,7 +637,7 @@ class CT2Device(BaseCT2Device):
return self.acq_mode in self.IntExpModes return self.acq_mode in self.IntExpModes
def __has_ext_start(self): def __has_ext_start(self):
return self.acq_mode in self.ExtStartModes return not self.__has_soft_start()
def __has_ext_trig(self): def __has_ext_trig(self):
return self.acq_mode in self.ExtTrigModes return self.acq_mode in self.ExtTrigModes
...@@ -648,6 +645,10 @@ class CT2Device(BaseCT2Device): ...@@ -648,6 +645,10 @@ class CT2Device(BaseCT2Device):
def __has_ext_exp(self): def __has_ext_exp(self):
return self.acq_mode in self.ExtExpModes return self.acq_mode in self.ExtExpModes
def __has_ext_sync(self):
return (self.__has_ext_start() or self.__has_ext_trig() or
self.__has_ext_exp())
def __in_ext_trig_readout(self): def __in_ext_trig_readout(self):
return self.acq_mode == AcqMode.ExtTrigReadout return self.acq_mode == AcqMode.ExtTrigReadout
...@@ -666,7 +667,7 @@ class CT2Device(BaseCT2Device): ...@@ -666,7 +667,7 @@ class CT2Device(BaseCT2Device):
raise ValueError('Acq. point period must be greater than expo.') raise ValueError('Acq. point period must be greater than expo.')
elif has_period: elif has_period:
raise ValueError('Acq. point period only allowed in %s' % mode_str) raise ValueError('Acq. point period only allowed in %s' % mode_str)
if self.__has_ext_trig() and not self.in_channel: if self.__has_ext_sync() and not self.in_channel:
raise ValueError('Must provide in_config in ext-trig modes') raise ValueError('Must provide in_config in ext-trig modes')
self.stop_acq() self.stop_acq()
...@@ -729,7 +730,7 @@ class CT2Device(BaseCT2Device): ...@@ -729,7 +730,7 @@ class CT2Device(BaseCT2Device):
if self.acq_status != AcqStatus.Running: if self.acq_status != AcqStatus.Running:
raise ValueError('No acquisition is running') raise ValueError('No acquisition is running')
elif self.__has_soft_start() and not self.__soft_started: elif self.__has_soft_start() and not self.__soft_started:
self.__soft_started = True pass
elif self.__has_int_trig(): elif self.__has_int_trig():
raise ValueError('Cannot trigger point in int-trig modes') raise ValueError('Cannot trigger point in int-trig modes')
...@@ -739,15 +740,22 @@ class CT2Device(BaseCT2Device): ...@@ -739,15 +740,22 @@ class CT2Device(BaseCT2Device):
point_nb_ct = self.internal_point_nb_counter point_nb_ct = self.internal_point_nb_counter
point_nb = self.card.get_counter_value(point_nb_ct) point_nb = self.card.get_counter_value(point_nb_ct)
self.card.stop_counters_software(counters) self.card.stop_counters_software(counters)
restart = (point_nb < self.acq_nb_points - 1) start = not self.__soft_started
restart = start or (point_nb < self.acq_nb_points - 1)
elif self.acq_mode == AcqMode.IntTrigMulti: elif self.acq_mode == AcqMode.IntTrigMulti:
counters_status = self.card.get_counters_status() counters_status = self.card.get_counters_status()
if counters_status[counters[0]]['run']: if counters_status[counters[0]]['run']:
raise RuntimeError('Counter still running') raise RuntimeError('Counter still running')
if self.__has_soft_start():
self.__soft_started = True
if restart: if restart:
self.card.start_counters_software(counters) self.card.start_counters_software(counters)
def dump_memory(self):
return self.card.dump_memory()
@property @property
def acq_mode(self): def acq_mode(self):
return self.__acq_mode return self.__acq_mode
......
...@@ -20,20 +20,19 @@ class CT2Device(BaseCT2Device): ...@@ -20,20 +20,19 @@ class CT2Device(BaseCT2Device):
Helper for a remote TANGO device CT2 card (P201/C208). Helper for a remote TANGO device CT2 card (P201/C208).
""" """
def __init__(self): def __init__(self, device_name):
BaseCT2Device.__init__(self) BaseCT2Device.__init__(self)
device_name = self.card_config['tango name']
self.__tango_device = PyTango.gevent.DeviceProxy(device_name) self.__tango_device = PyTango.gevent.DeviceProxy(device_name)
self.__tango_device.subscribe_event("acq_status", # self.__tango_device.subscribe_event("acq_status",
PyTango.EventType.CHANGE_EVENT, # PyTango.EventType.CHANGE_EVENT,
self.__on_status) # self.__on_status)
self.__tango_device.subscribe_event("last_point_nb", # self.__tango_device.subscribe_event("last_point_nb",
PyTango.EventType.CHANGE_EVENT, # PyTango.EventType.CHANGE_EVENT,
self.__on_point_nb) # self.__on_point_nb)
self.__tango_device.subscribe_event("last_error", # self.__tango_device.subscribe_event("last_error",
PyTango.EventType.CHANGE_EVENT, # PyTango.EventType.CHANGE_EVENT,
self.__on_error) # self.__on_error)
def __on_status(self, event): def __on_status(self, event):
self._send_status(AcqStatus[event.attr_value.value]) self._send_status(AcqStatus[event.attr_value.value])
...@@ -57,3 +56,6 @@ class CT2Device(BaseCT2Device): ...@@ -57,3 +56,6 @@ class CT2Device(BaseCT2Device):
if data is None: if data is None:
data = numpy.array([[]], dtype=numpy.uint32) data = numpy.array([[]], dtype=numpy.uint32)
return data return data
def dump_memory(self):
return bytes(super(CT2Device, self).dump_memory().data)
...@@ -14,6 +14,7 @@ __all__ = ["CT2", "main"] ...@@ -14,6 +14,7 @@ __all__ = ["CT2", "main"]
import time import time
import numpy
import gevent import gevent
from gevent import select from gevent import select
...@@ -192,6 +193,13 @@ class CT2(Device): ...@@ -192,6 +193,13 @@ class CT2(Device):
def data(self): def data(self):
return self.device.read_data() return self.device.read_data()
@attribute(dtype=(int,), max_dim_x=12)
def counters_status(self):
status = self.device.card.get_counters_status()
return [int(status[i].enable) | (int(status[i].run) << 1)
for i in self.device.card.COUNTERS]
@command @command
def apply_config(self): def apply_config(self):
# first, empty FIFO # first, empty FIFO
...@@ -226,6 +234,11 @@ class CT2(Device): ...@@ -226,6 +234,11 @@ class CT2(Device):
def trigger_point(self): def trigger_point(self):
self.device.trigger_point() self.device.trigger_point()
@command(dtype_out='DevVarCharArray')
def dump_memory(self):
data = self.device.dump_memory()
return numpy.ndarray(shape=(len(data),), dtype=numpy.uint8, buffer=data)
@property @property
def card(self): def card(self):
return self.device.card return self.device.card
......
...@@ -82,6 +82,23 @@ def ct2_cmd(cnum, key, p1, p2) '{ ...@@ -82,6 +82,23 @@ def ct2_cmd(cnum, key, p1, p2) '{
} }
}' }'
def ct2_par(cnum, key, action, p1) '{
local ctrl_dev chan val[] int_cnt
ctrl_dev = ct2_ADDR
if (cnum != "..")
chan = counter_par(cnum, "channel")
if (key == "status") {
tango_get(ctrl_dev, "counters_status", val)
int_cnt = CT2_MAC_HDW[ctrl_dev]["int_cnt"]
cnt_idx = (chan ? chan : int_cnt) - 1
return val[cnt_idx]
}
}'
def ct2_get(cnum, key, val_arr) '{ def ct2_get(cnum, key, val_arr) '{
local ctrl_dev arr_keys local ctrl_dev arr_keys
...@@ -94,7 +111,7 @@ def ct2_get(cnum, key, val_arr) '{ ...@@ -94,7 +111,7 @@ def ct2_get(cnum, key, val_arr) '{
return return
} }
arr_keys = " acq_channels counters latches data " arr_keys = " acq_channels counters latches data counters_status "
if (index(arr_keys, sprintf(" %s ", key)) > 0) { if (index(arr_keys, sprintf(" %s ", key)) > 0) {
return tango_get(ctrl_dev, key, val_arr) return tango_get(ctrl_dev, key, val_arr)
} else { } else {
......
...@@ -260,7 +260,8 @@ def main(): ...@@ -260,7 +260,8 @@ def main():
parser.add_argument('--acq_timeout', default='', type=str, parser.add_argument('--acq_timeout', default='', type=str,
help='Timeout aborting acquisition sequence') help='Timeout aborting acquisition sequence')
parser.add_argument('--all_tests', default=1, type=int, parser.add_argument('--all_tests', default=1, type=int,
help='Execute all tests: 1=Int+Soft, 2=Int+Soft+Ext') help='Execute all tests: 1=Int+Soft, 2=Ext, '
'3=Int+Soft+Ext')
parser.add_argument('--sleep_time', default=2, type=float, parser.add_argument('--sleep_time', default=2, type=float,
help='Sleep time between test') help='Sleep time between test')
...@@ -296,14 +297,17 @@ def main(): ...@@ -296,14 +297,17 @@ def main():
if args.all_tests & 1: if args.all_tests & 1:
mode_lists = ((False, ['IntTrigReadout', 'SoftTrigReadout']), mode_lists = ((False, ['IntTrigReadout', 'SoftTrigReadout']),
(True, ['IntTrigSingle', 'IntTrigMulti'])) (True, ['IntTrigSingle', 'IntTrigMulti']))
strict_multi_point_modes = ['IntTrigMulti']
for has_point_period, mode_list in mode_lists: for has_point_period, mode_list in mode_lists:
point_period = args.point_period if has_point_period else 0 point_period = args.point_period if has_point_period else 0
for acq_mode in mode_list: for acq_mode in mode_list:
# multi-point acquisitions
test(dev, acq_mode, args.expo_time, point_period, test(dev, acq_mode, args.expo_time, point_period,
args.acq_nb_points, args.nb_acqs, args.sleep_time) args.acq_nb_points, args.nb_acqs, args.sleep_time)
acq_mode = mode_list[0] # multiple single-point acquisitions
test(dev, acq_mode, args.expo_time, point_period, 1, if acq_mode not in strict_multi_point_modes:
args.acq_nb_points * args.nb_acqs, args.sleep_time) test(dev, acq_mode, args.expo_time, point_period, 1,
args.acq_nb_points * args.nb_acqs, args.sleep_time)
if args.all_tests & 2: if args.all_tests & 2:
for acq_mode in ExtTrigModes: for acq_mode in ExtTrigModes:
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment