Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6c232b3b07 | |||
| cfc2bf1d83 | |||
| efb5e9aeb6 | |||
| b4d88a0e67 | |||
| 6029ff6fe1 |
@@ -4,6 +4,7 @@ from biopro.util.text import part_suffix
|
||||
from . import *
|
||||
from .expression import *
|
||||
|
||||
import json
|
||||
|
||||
class DeviceParameterError(RuntimeError):
|
||||
__slots__ = ()
|
||||
@@ -309,6 +310,8 @@ class ParameterValueDomain(ParameterDomain, metaclass=abc.ABCMeta):
|
||||
return f
|
||||
|
||||
def valid_para(self, value: Any) -> bool:
|
||||
if isinstance(value, list):
|
||||
return True
|
||||
f, t = self.range
|
||||
return f <= float(value) < t
|
||||
|
||||
@@ -489,8 +492,12 @@ class ParameterCollectionValueOperator(metaclass=abc.ABCMeta):
|
||||
|
||||
@classmethod
|
||||
def parse(cls, expr: Union[int, str]) -> 'ParameterCollectionValueOperator':
|
||||
# parse epression then create value_operator
|
||||
if isinstance(expr, int):
|
||||
return SingleValueOperator(None, expr)
|
||||
|
||||
elif isinstance(expr, list):
|
||||
return CollectValueOperator((0, len(expr)), expr)
|
||||
|
||||
elif expr == '*':
|
||||
return AddAllValueOperator
|
||||
@@ -498,6 +505,10 @@ class ParameterCollectionValueOperator(metaclass=abc.ABCMeta):
|
||||
elif expr == ':=':
|
||||
return CollectValueOperator((None, None), [])
|
||||
|
||||
elif '[' in expr and ']' in expr:
|
||||
v = json.loads(expr)
|
||||
return CollectValueOperator((0, len(v)), v)
|
||||
|
||||
elif '=' in expr:
|
||||
a, v = part_suffix(expr, '=')
|
||||
|
||||
@@ -508,6 +519,7 @@ class ParameterCollectionValueOperator(metaclass=abc.ABCMeta):
|
||||
return CollectValueOperator((None, None), v)
|
||||
|
||||
else:
|
||||
# get list length (old way)
|
||||
a, b = part_suffix(a, ':')
|
||||
a = int(a) if len(a) else None
|
||||
b = int(b) if len(b) else None
|
||||
@@ -602,8 +614,8 @@ class ParameterCollectionDomain(ParameterDomain, metaclass=abc.ABCMeta):
|
||||
def __init__(self, domain: ParameterDomain):
|
||||
super().__init__()
|
||||
|
||||
if isinstance(domain, ParameterCollectionDomain):
|
||||
raise RuntimeError('cannot compose with parameter collection domain')
|
||||
# if isinstance(domain, ParameterCollectionDomain):
|
||||
# raise RuntimeError('cannot compose with parameter collection domain')
|
||||
|
||||
self._domain = domain
|
||||
|
||||
@@ -725,6 +737,7 @@ class ParameterListDomain(ParameterCollectionDomain):
|
||||
if oper == AddAllValueOperator:
|
||||
raise ValueError("list parameter cannot accept '*' (all) value")
|
||||
|
||||
# d: domain, sz: lsit length, i: slice(a, b), v: list value
|
||||
d = self.element_domain
|
||||
sz = len(target)
|
||||
i = oper.index(sz)
|
||||
|
||||
@@ -119,7 +119,10 @@ class DeviceConfigurationEncoder:
|
||||
e.write(b'L\0')
|
||||
|
||||
else:
|
||||
parameter_type = cls._value_type(value[0])
|
||||
parameter_type = cls._value_type(max(value))
|
||||
for v in value:
|
||||
if isinstance(v, int) and v < 0:
|
||||
parameter_type = parameter_type.lower()
|
||||
e.write(b'L')
|
||||
e.write(parameter_type.encode())
|
||||
e.u8(sz)
|
||||
@@ -153,7 +156,8 @@ class DeviceConfigurationEncoder:
|
||||
if isinstance(value, bool):
|
||||
e.u8(1 if value else 0)
|
||||
|
||||
elif isinstance(value, str):
|
||||
elif isinstance(value, str) or isinstance(value, list):
|
||||
value = str(value)
|
||||
e.encode_string(value)
|
||||
|
||||
elif isinstance(value, int):
|
||||
@@ -170,7 +174,7 @@ class DeviceConfigurationEncoder:
|
||||
if isinstance(value, bool):
|
||||
return '?'
|
||||
|
||||
elif isinstance(value, str):
|
||||
elif isinstance(value, str) or isinstance(value, list):
|
||||
return 'p'
|
||||
|
||||
elif isinstance(value, int):
|
||||
|
||||
@@ -510,9 +510,10 @@ class DeviceParameter(JsonSerialize):
|
||||
:param para: parameter name
|
||||
:param oper: operator expression
|
||||
"""
|
||||
# parse operator return CollectValueOperator instance
|
||||
if not isinstance(oper, ParameterCollectionValueOperator):
|
||||
oper = ParameterCollectionValueOperator.parse(oper)
|
||||
|
||||
|
||||
table = self._library.parameter_table
|
||||
info = table[para]
|
||||
domain = info.domain
|
||||
@@ -528,6 +529,7 @@ class DeviceParameter(JsonSerialize):
|
||||
old = list(target)
|
||||
|
||||
try:
|
||||
# replace target with new oper
|
||||
domain.oper_para(target, oper, self._context)
|
||||
except RuntimeError as e:
|
||||
raise IllegalParameterValueError(para, str(oper)) from e
|
||||
|
||||
@@ -65,6 +65,20 @@
|
||||
"Dev Mode"
|
||||
]
|
||||
},
|
||||
"FREQ": {
|
||||
"description": "DPV current recording period start",
|
||||
"record_meta": true,
|
||||
"initial": [
|
||||
13422819,
|
||||
7
|
||||
],
|
||||
"domain": {
|
||||
"list": [
|
||||
"FREQ_MAX"
|
||||
]
|
||||
},
|
||||
"value": "VALUE"
|
||||
},
|
||||
"FREQ_START": {
|
||||
"description": "Start of Freq Scan",
|
||||
"record_meta": true,
|
||||
@@ -266,7 +280,6 @@
|
||||
"domain": "int"
|
||||
}
|
||||
},
|
||||
|
||||
"instruction": {
|
||||
"start": [
|
||||
{
|
||||
@@ -352,8 +365,8 @@
|
||||
"curve_eis": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"fa": "FREQ_START",
|
||||
"fb": "FREQ_STOP",
|
||||
"fa": "FREQ[0]",
|
||||
"fb": "FREQ[1]",
|
||||
"dp": "DELAY",
|
||||
"dc": "DC_BIAS",
|
||||
"am": "AC_AMP",
|
||||
@@ -369,8 +382,8 @@
|
||||
"curve_eis_para2": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"fa": "FREQ_START",
|
||||
"fb": "FREQ_STOP",
|
||||
"fa": "FREQ[0]",
|
||||
"fb": "FREQ[1]",
|
||||
"dp": "DELAY",
|
||||
"dc": "DC_BIAS",
|
||||
"am": "AC_AMP",
|
||||
|
||||
@@ -114,6 +114,20 @@
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"DPV_curr_rec": {
|
||||
"description": "DPV current recording period start",
|
||||
"record_meta": true,
|
||||
"initial": [
|
||||
25,
|
||||
100
|
||||
],
|
||||
"domain": {
|
||||
"list": [
|
||||
101
|
||||
]
|
||||
},
|
||||
"value": "VALUE"
|
||||
},
|
||||
"DPV_curr_rec_min": {
|
||||
"description": "DPV current recording period start",
|
||||
"record_meta": true,
|
||||
@@ -139,11 +153,8 @@
|
||||
"DPV_pulse_option": {
|
||||
"description": "Invert of pulse option",
|
||||
"record_meta": true,
|
||||
"initial": 0,
|
||||
"value": [
|
||||
0,
|
||||
1
|
||||
]
|
||||
"domain": "bool",
|
||||
"initial": false
|
||||
},
|
||||
"DPV_mode": {
|
||||
"description": "AUTO: 0 / ADVANCED: 1/ ENGINEERING: 2",
|
||||
@@ -158,11 +169,24 @@
|
||||
"DPV_engineering_enable": {
|
||||
"description": "Engineering mode switch",
|
||||
"record_meta": true,
|
||||
"initial": 0,
|
||||
"value": [
|
||||
0,
|
||||
1
|
||||
]
|
||||
"domain": "bool",
|
||||
"initial": false
|
||||
},
|
||||
"V_initial": {
|
||||
"description": "Pulse Mode Segment Voltage",
|
||||
"record_meta": true,
|
||||
"initial": [
|
||||
50000,
|
||||
25000,
|
||||
25000,
|
||||
25000
|
||||
],
|
||||
"domain": {
|
||||
"list": [
|
||||
50001
|
||||
]
|
||||
},
|
||||
"value": "VALUE"
|
||||
},
|
||||
"V_initial_0": {
|
||||
"description": "Pulse Mode Segment Voltage 0",
|
||||
@@ -208,6 +232,22 @@
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"t_pulse": {
|
||||
"description": "Pulse Mode Segment Duration",
|
||||
"record_meta": true,
|
||||
"initial": [
|
||||
750,
|
||||
9250,
|
||||
1000,
|
||||
1000
|
||||
],
|
||||
"domain": {
|
||||
"list": [
|
||||
1000001
|
||||
]
|
||||
},
|
||||
"value": "VALUE"
|
||||
},
|
||||
"t_pulse_0": {
|
||||
"description": "Pulse Mode Segment Duration 0",
|
||||
"record_meta": true,
|
||||
@@ -252,6 +292,36 @@
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"CURR_REC": {
|
||||
"description": "Pulse Mode Current Recording Period",
|
||||
"record_meta": true,
|
||||
"initial": [
|
||||
[
|
||||
35,
|
||||
90
|
||||
],
|
||||
[
|
||||
35,
|
||||
99
|
||||
],
|
||||
[
|
||||
35,
|
||||
95
|
||||
],
|
||||
[
|
||||
35,
|
||||
95
|
||||
]
|
||||
],
|
||||
"domain": {
|
||||
"list": {
|
||||
"list": [
|
||||
100
|
||||
]
|
||||
}
|
||||
},
|
||||
"value": "VALUE"
|
||||
},
|
||||
"CURR_REC_START_0": {
|
||||
"description": "Pulse Mode Current Recording Period Start",
|
||||
"record_meta": true,
|
||||
@@ -340,6 +410,40 @@
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"segment_ui_order": {
|
||||
"description": "Pulse Mode Segment Order",
|
||||
"record_meta": true,
|
||||
"initial": [
|
||||
0,
|
||||
1,
|
||||
-1,
|
||||
-1
|
||||
],
|
||||
"domain": {
|
||||
"list": [
|
||||
-1,
|
||||
6
|
||||
]
|
||||
},
|
||||
"value": "VALUE"
|
||||
},
|
||||
"segment_order": {
|
||||
"description": "Pulse Mode Segment Order",
|
||||
"record_meta": true,
|
||||
"initial": [
|
||||
0,
|
||||
1,
|
||||
-1,
|
||||
-1
|
||||
],
|
||||
"domain": {
|
||||
"list": [
|
||||
-1,
|
||||
6
|
||||
]
|
||||
},
|
||||
"value": "VALUE"
|
||||
},
|
||||
"segment_ui_order_0": {
|
||||
"description": "Pulse Mode Segment UI Order 0, value: segment ID + 1",
|
||||
"record_meta": true,
|
||||
@@ -1230,39 +1334,39 @@
|
||||
},
|
||||
"curve_pulse_sensing": [
|
||||
{
|
||||
"expression": "segment_ui_order_0",
|
||||
"expression": "segment_ui_order[0]",
|
||||
"when": {
|
||||
"1": "pul_sen_segment_0",
|
||||
"2": "pul_sen_segment_1",
|
||||
"3": "pul_sen_segment_2",
|
||||
"4": "pul_sen_segment_3"
|
||||
"0": "pul_sen_segment_0",
|
||||
"1": "pul_sen_segment_1",
|
||||
"2": "pul_sen_segment_2",
|
||||
"3": "pul_sen_segment_3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"expression": "segment_ui_order_1",
|
||||
"expression": "segment_ui_order[1]",
|
||||
"when": {
|
||||
"1": "pul_sen_segment_0",
|
||||
"2": "pul_sen_segment_1",
|
||||
"3": "pul_sen_segment_2",
|
||||
"4": "pul_sen_segment_3"
|
||||
"0": "pul_sen_segment_0",
|
||||
"1": "pul_sen_segment_1",
|
||||
"2": "pul_sen_segment_2",
|
||||
"3": "pul_sen_segment_3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"expression": "segment_ui_order_2",
|
||||
"expression": "segment_ui_order[2]",
|
||||
"when": {
|
||||
"1": "pul_sen_segment_0",
|
||||
"2": "pul_sen_segment_1",
|
||||
"3": "pul_sen_segment_2",
|
||||
"4": "pul_sen_segment_3"
|
||||
"0": "pul_sen_segment_0",
|
||||
"1": "pul_sen_segment_1",
|
||||
"2": "pul_sen_segment_2",
|
||||
"3": "pul_sen_segment_3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"expression": "segment_ui_order_3",
|
||||
"expression": "segment_ui_order[3]",
|
||||
"when": {
|
||||
"1": "pul_sen_segment_0",
|
||||
"2": "pul_sen_segment_1",
|
||||
"3": "pul_sen_segment_2",
|
||||
"4": "pul_sen_segment_3"
|
||||
"0": "pul_sen_segment_0",
|
||||
"1": "pul_sen_segment_1",
|
||||
"2": "pul_sen_segment_2",
|
||||
"3": "pul_sen_segment_3"
|
||||
}
|
||||
},
|
||||
"pul_sen_start"
|
||||
@@ -1286,11 +1390,11 @@
|
||||
"pul_sen_segment_0": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"va": "V_initial_0",
|
||||
"vb": "t_pulse_0",
|
||||
"vc": "CURR_REC_START_0",
|
||||
"vd": "CURR_REC_END_0",
|
||||
"ve": "segment_order_0 - 1",
|
||||
"va": "V_initial[0]",
|
||||
"vb": "t_pulse[0]",
|
||||
"vc": "CURR_REC[0][0]",
|
||||
"vd": "CURR_REC[0][1]",
|
||||
"ve": "segment_order.index(segment_order[0])",
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
"pc": "DAC_LEVEL_V_OUT_15",
|
||||
@@ -1306,11 +1410,11 @@
|
||||
"pul_sen_segment_1": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"va": "V_initial_1",
|
||||
"vb": "t_pulse_1",
|
||||
"vc": "CURR_REC_START_1",
|
||||
"vd": "CURR_REC_END_1",
|
||||
"ve": "segment_order_1 - 1",
|
||||
"va": "V_initial[1]",
|
||||
"vb": "t_pulse[1]",
|
||||
"vc": "CURR_REC[1][0]",
|
||||
"vd": "CURR_REC[1][1]",
|
||||
"ve": "segment_order.index(segment_order[1])",
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
"pc": "DAC_LEVEL_V_OUT_15",
|
||||
@@ -1326,11 +1430,11 @@
|
||||
"pul_sen_segment_2": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"va": "V_initial_2",
|
||||
"vb": "t_pulse_2",
|
||||
"vc": "CURR_REC_START_2",
|
||||
"vd": "CURR_REC_END_2",
|
||||
"ve": "segment_order_2 - 1",
|
||||
"va": "V_initial[2]",
|
||||
"vb": "t_pulse[2]",
|
||||
"vc": "CURR_REC[2][0]",
|
||||
"vd": "CURR_REC[2][1]",
|
||||
"ve": "segment_order.index(segment_order[2])",
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
"pc": "DAC_LEVEL_V_OUT_15",
|
||||
@@ -1346,11 +1450,11 @@
|
||||
"pul_sen_segment_3": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"va": "V_initial_3",
|
||||
"vb": "t_pulse_3",
|
||||
"vc": "CURR_REC_START_3",
|
||||
"vd": "CURR_REC_END_3",
|
||||
"ve": "segment_order_3 - 1",
|
||||
"va": "V_initial[3]",
|
||||
"vb": "t_pulse[3]",
|
||||
"vc": "CURR_REC[3][0]",
|
||||
"vd": "CURR_REC[3][1]",
|
||||
"ve": "segment_order.index(segment_order[3])",
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
"pc": "DAC_LEVEL_V_OUT_15",
|
||||
@@ -1411,8 +1515,8 @@
|
||||
"parameter": {
|
||||
"va": "DPV_step_time",
|
||||
"vb": "DPV_notify_rate",
|
||||
"vc": "DPV_curr_rec_min",
|
||||
"vd": "DPV_curr_rec_max"
|
||||
"vc": "DPV_curr_rec[0]",
|
||||
"vd": "DPV_curr_rec[1]"
|
||||
},
|
||||
"data": [
|
||||
"1X0E;",
|
||||
@@ -1475,8 +1579,8 @@
|
||||
"parameter": {
|
||||
"va": "DPV_step_time",
|
||||
"vb": "DPV_notify_rate",
|
||||
"vc": "DPV_curr_rec_min",
|
||||
"vd": "DPV_curr_rec_max"
|
||||
"vc": "DPV_curr_rec[0]",
|
||||
"vd": "DPV_curr_rec[1]"
|
||||
},
|
||||
"data": [
|
||||
"1X10;",
|
||||
|
||||
Reference in New Issue
Block a user