Compare commits

...

65 Commits

Author SHA1 Message Date
Roy bbde653a8e [update] update cali value 2022-09-28 14:50:22 +08:00
Roy 6c0cef7925 [update] test function: print mem board info 2022-09-27 14:38:00 +08:00
Roy 3bbf0c912a [update] test function: print mem board info 2022-09-27 13:41:32 +08:00
Roy 4333958ebe [update] fix eis's FREQ default value 2022-09-16 17:49:28 +08:00
Roy 3239a691e3 [update] test function: print ram info 2022-09-16 13:12:40 +08:00
Roy 30183788d8 [update] test function: print ram info 2022-09-14 18:12:53 +08:00
Roy 13df921b1c [update] test function: print ram info 2022-09-14 17:14:47 +08:00
Roy d182a04ed3 [update] add channel data 2022-09-14 15:36:01 +08:00
Roy 35a09ff9a0 [update] switch mode set default highz & time_duration in Elite_EDC 2022-09-06 18:51:32 +08:00
Roy e134b9780c [update] add new api set_project & add new condition until_button_trigger & add new action idle 2022-09-06 16:28:38 +08:00
peterlu14 df39f241b3 [update] add battery 2022-08-22 19:57:02 +08:00
peterlu14 0b72ac0c9d Merge branch 'dev/scheduler_cycle' into release/v1.6.6/merge_scheduler 2022-08-22 17:42:57 +08:00
JayC319 0afbe66229 [update] edc 1.5 library 2022-08-22 13:58:39 +08:00
108000207 9846cfd708 [update] set _time_interval as 0.1 to avoid delay 2022-08-19 15:44:51 +08:00
108000207 b4ad2a7fba [update] remove useless comments 2022-08-18 17:51:51 +08:00
108000207 675fdc2226 [update] cycle_next use uuid version 2022-08-18 17:39:59 +08:00
108000207 a847b1222d [debug] fix the bug of first task can't idle 2022-08-17 15:51:29 +08:00
108000207 bd0c36923a [update] scheduler cycle version 1 2022-08-17 11:50:22 +08:00
peterlu14 612785f51a [update] EIS show data 2022-08-16 19:40:27 +08:00
peterlu14 7dbf09e9a5 [update] EIS show data 2022-08-16 19:39:06 +08:00
peterlu14 ee64d43de1 [update] ca instruction b0 -> D3 2022-08-16 19:31:33 +08:00
peterlu14 60b91f0c1e [update] EIS add show data 2022-08-16 19:15:04 +08:00
Roy 8ac01bdf54 [update] update eis library 2022-08-16 19:10:18 +08:00
JayC319 0f90b16b6e [update] library product number 2022-08-16 17:35:06 +08:00
peterlu14 cd98a14e84 [debug] fix idle send instruction & remove deepcopy & close task by device 2022-08-16 14:25:37 +08:00
peterlu14 2e97ad23eb [debug] fix parameter empty 2022-08-16 12:11:35 +08:00
108000207 e0dd5a6972 [update] add schdeuler cycle attribute 2022-08-16 11:34:47 +08:00
Roy 76e0a150d1 Merge remote-tracking branch 'origin/dev/Cali_mode' into dev/cc_cp_separate 2022-08-15 18:11:20 +08:00
JayC319 ecd4b9325d [update] 2022-08-15 18:09:40 +08:00
peterlu14 978b1254f0 Merge branch 'dev/debug' into dev/cc_cp_separate 2022-08-11 13:53:13 +08:00
peterlu14 26e02f2d40 [update] add data_show function print device data 2022-08-11 00:58:30 +08:00
peterlu14 ead98fe8da [debug] fix running_task is None bug 2022-08-10 14:03:04 +08:00
Roy 257958768f [update] new ca mode instruvtion 2022-08-05 18:34:33 +08:00
peterlu14 dc4e1bd233 Merge branch 'dev/fix_final_data_loss' into dev/cc_cp_separate 2022-08-05 10:27:33 +08:00
peterlu14 42025d2243 [update] fix cp mode voltage problem 2022-08-05 10:26:13 +08:00
Roy b341dbf073 [update] update instruction of cp mode 2022-08-04 18:12:23 +08:00
Roy 20f6f126b0 [update] fix STEP_TIME para 2022-08-04 16:48:51 +08:00
Roy bf4a00db1a [update] remove CC_ZERO instruction 2022-07-29 11:24:29 +08:00
peterlu14 0b7a650b95 [debug] fix final data loss & flag stop after writer write 2022-07-29 11:11:46 +08:00
Roy 062613c681 [update] fix step time on IV & Cycle-IV mode 2022-07-28 16:36:34 +08:00
Roy bffaff310b [update] update file name of elite library 2022-07-26 13:14:37 +08:00
Roy 06bf262d59 [update] new device library for elite eis1.1 mini 2022-07-13 10:03:40 +08:00
Roy b2f9d98336 [update] update elite device library 2022-07-06 16:23:12 +08:00
Roy a6b523404b [update] update elite device library 2022-07-05 18:20:32 +08:00
peterlu14 6c232b3b07 [update] fix struct.pack type error support signed int & max number type 2022-06-22 15:23:44 +08:00
peterlu14 cfc2bf1d83 Merge remote-tracking branch 'origin/rel/v.1.6.4/read_ram_debug' into rel/v.1.6.5/restruct_data_format 2022-06-22 13:18:03 +08:00
Roy 2b60e68197 [update] update eis decoder code 2022-06-22 13:11:57 +08:00
peterlu14 efb5e9aeb6 [update] add list struct update in new way & fix list parameter not valid & collection nested error & fixed encoder struct bytes wrong (singed, unsigned) 2022-06-17 19:54:42 +08:00
peterlu14 b4d88a0e67 [update] change elite pulse sensing paramter in array 2022-06-17 19:51:05 +08:00
peterlu14 6029ff6fe1 [update] FREQ & DPV_curr_rec max_min to array and add update array format 2022-06-15 16:48:23 +08:00
Roy 6efc5e1097 [update] hide log message 2022-06-10 17:36:13 +08:00
Roy a23394d3d1 Merge branch 'dev/eis_parameter_bug' into rel/v.1.6.4/read_ram_debug 2022-06-10 17:31:45 +08:00
Roy c96f76f438 [update] read RAM data bug 2022-06-10 17:22:10 +08:00
Roy f0f1c9fc49 [update] update eis json 2022-06-10 17:20:58 +08:00
peterlu14 512c80af40 [update] add new info id,name,status,mac_address,memory_board 2022-06-06 18:52:12 +08:00
Roy 499964b287 [update] fix TIME_DURATION in eis devlib 2022-05-23 17:42:12 +08:00
Roy 16f12d40bf [update] improve cp and cc mode - speed and resistance value 2022-05-20 12:11:56 +08:00
peterlu14 63c1ba8efb [update] update decorder mode in I4V4Z4T4 2022-05-18 16:16:17 +08:00
Roy 4a28348db4 [update] fix cp mode instruction and decoder 2022-05-18 11:06:23 +08:00
peterlu14 64dfe87d05 [update] remove decorder rebuild problem & add new parameter to control time duration 2022-05-18 10:19:08 +08:00
peterlu14 f7a5a867a4 [update] fix memory counter 2022-05-06 13:50:09 +08:00
peterlu14 1accaa9b9f [update] delete logger 2022-05-06 11:25:30 +08:00
peterlu14 b810e35fb2 Merge branch 'feature/get-running-project-flow' into rel/v1.6.1/cp_mode 2022-05-06 10:39:51 +08:00
peterlu14 82c9d2b0e3 [update] add clean logger script 2022-05-06 10:39:47 +08:00
peterlu14 e5a3f33b9f [update] add cp mode 2022-05-06 10:36:17 +08:00
38 changed files with 7031 additions and 1773 deletions
+2
View File
@@ -1,5 +1,7 @@
.DS_Store .DS_Store
*.cpython-37.opt-2.pyc *.cpython-37.opt-2.pyc
*.cpython-39-arm-linux-gnueabihf.so
*.
*.pyc *.pyc
*/__pycache__ */__pycache__
/.vscode /.vscode
+6
View File
@@ -1585,6 +1585,12 @@ class ControlAPI(metaclass=Router):
def stop_project(self, project) -> bool: def stop_project(self, project) -> bool:
raise NotImplementedError() raise NotImplementedError()
def set_project(self, project, content) -> bool:
raise NotImplementedError()
def show_device_data(self, device) -> bool:
raise NotImplementedError()
# noinspection PyAbstractClass # noinspection PyAbstractClass
class ControlClient(SocketClient, ControlAPI, metaclass=SocketClientMacro(ControlAPI)): class ControlClient(SocketClient, ControlAPI, metaclass=SocketClientMacro(ControlAPI)):
+11
View File
@@ -130,6 +130,14 @@ class DataAPI(metaclass=abc.ABCMeta):
def hardware_test(self) -> JSON_OBJECT: def hardware_test(self) -> JSON_OBJECT:
"""""" """"""
pass pass
@abc.abstractmethod
def show_data(self, device: Union[int, Device]):
"""show device data
:param device: device ID
"""
pass
# noinspection PyAbstractClass # noinspection PyAbstractClass
@@ -191,6 +199,9 @@ class DataClient(SocketClient, DataAPI, metaclass=SocketClientMacro(DataAPI)):
def stop_sync(self, *device: Union[int, Device]): def stop_sync(self, *device: Union[int, Device]):
self.send_command('stop_sync', *self._to_device_id(*device)) self.send_command('stop_sync', *self._to_device_id(*device))
def show_data(self, device: int):
self.send_command('show_data', device)
@staticmethod @staticmethod
def _to_device_id(*device: Union[int, Device]) -> Tuple[int, ...]: def _to_device_id(*device: Union[int, Device]) -> Tuple[int, ...]:
+1 -1
View File
@@ -662,7 +662,7 @@ class CC2650Device(Device):
elif device_type == 'EISZeroOne': elif device_type == 'EISZeroOne':
i = 0 i = 0
request_times = 0 request_times = 0
while i < 7: while i < 13:
try: try:
# send # send
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, i) code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, i)
+146 -78
View File
@@ -1,6 +1,7 @@
import abc import abc
import struct import struct
import math import math
import numpy
from typing import Optional, TypeVar, Generic, Tuple, Dict, List, AnyStr from typing import Optional, TypeVar, Generic, Tuple, Dict, List, AnyStr
from datetime import datetime from datetime import datetime
@@ -853,7 +854,7 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
__slots__ = ('_message', '_cycle_number', '_start_return_data', '_time_stamp', __slots__ = ('_message', '_cycle_number', '_start_return_data', '_time_stamp',
'_total_time_stamp', '_mode', '_cycle_start_time', '_total_time_stamp', '_mode', '_cycle_start_time',
'_mode_stop') '_mode_stop', '_show_data')
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@@ -868,6 +869,8 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
self._mode = 0 self._mode = 0
self._cycle_start_time = [] self._cycle_start_time = []
self._show_data = False
@property @property
def name(self) -> str: def name(self) -> str:
return self.NAME return self.NAME
@@ -881,16 +884,21 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
def decode(self, data: bytes) -> Optional[RecordingData]: def decode(self, data: bytes) -> Optional[RecordingData]:
if len(data) < 18: if len(data) < 18:
return None return None
voltage = 0
mem_cnt = data[1] mem_cnt = data[1]
time_stamp: float = struct.unpack('<I', data[4:8])[0] # unit: ms 0x18030000 time_stamp: float = struct.unpack('<I', data[4:8])[0] # unit: ms 0x18030000
current = struct.unpack('<i', data[8:12])[0] # unit: nA current = struct.unpack('<i', data[8:12])[0] # unit: nA
voltage = struct.unpack('<i', data[12:16])[0] # unit: uV voltage = struct.unpack('<i', data[12:16])[0] # unit: uV
impedance = struct.unpack('<i', data[16:20])[0] # unit: mOm impedance = struct.unpack('<i', data[16:20])[0] # unit: mOm
cycle_number = struct.unpack('<H', data[20:22])[0] cycle_number = struct.unpack('<H', data[20:22])[0]
finish_mode_falg = data[22] finish_mode_falg = data[22]
battery = struct.unpack('<i', data[23:27])[0] battery = struct.unpack('<i', data[23:27])[0]
elite_notify_times = data[27] elite_notify_times = data[27]
notify_one = struct.unpack('<i', data[28:32])[0]
notify_two = struct.unpack('<i', data[32:36])[0]
notify_three = struct.unpack('<i', data[36:40])[0]
# self._show_data = True
mem_wrong_information = struct.unpack('<i', data[43:47])[0] # mem_wrong_information = green retry, green wrong, red retry, red wrong mem_wrong_information = struct.unpack('<i', data[43:47])[0] # mem_wrong_information = green retry, green wrong, red retry, red wrong
ram_num = data[47] ram_num = data[47]
@@ -914,9 +922,11 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
print("error timeStamp full data:", list(data), datetime.now(), '\n') print("error timeStamp full data:", list(data), datetime.now(), '\n')
return None return None
else: else:
# print('|', time_stamp, '|', delta, '|', int(time_stamp * 1000 / 2), if self._show_data:
# '|', current, '|', voltage, '|', impedance, print('|', time_stamp, '|', delta, '|', int(time_stamp * 1000 / 2),
# '|', cycle_number, '|', finishMode, '@', str(self.device)) '|', current, '|', voltage, '|', impedance, '|', cycle_number,
'|', notify_one, '|', notify_two, '|', notify_three,
'|', finishMode, '@', str(self.device))
# print('|', '{:10}'.format(time_stamp), # print('|', '{:10}'.format(time_stamp),
# '|', '{:4}'.format(delta), # '|', '{:4}'.format(delta),
@@ -945,18 +955,21 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
ret.append_data(1, voltage) ret.append_data(1, voltage)
ret.append_data(2, impedance) ret.append_data(2, impedance)
ret.append_data(3, cycle_number) ret.append_data(3, cycle_number)
ret.append_data(4, battery) ret.append_data(4, notify_one)
ret.append_data(5, elite_notify_times) ret.append_data(5, notify_two)
ret.append_data(6, mem_cnt) ret.append_data(6, notify_three)
# ret.append_data(4, battery)
# ret.append_data(5, elite_notify_times)
# ret.append_data(6, mem_cnt)
# memoryboard information # # memoryboard information
ret.append_data(7, ram_num) # ret.append_data(7, ram_num)
ret.append_data(8, broken_flag) # ret.append_data(8, broken_flag)
try: # try:
ret.append_data(9, mem_wrong_information) # ret.append_data(9, mem_wrong_information)
# print('append_data success, mem_wrong_information:', mem_wrong_information, hex(mem_wrong_information)) # # print('append_data success, mem_wrong_information:', mem_wrong_information, hex(mem_wrong_information))
except: # except:
print('append_data fail, mem_wrong_information:', mem_wrong_information, hex(mem_wrong_information)) # print('append_data fail, mem_wrong_information:', mem_wrong_information, hex(mem_wrong_information))
@@ -1334,7 +1347,7 @@ class EISZeroOneDataDecoder(RecDataDecoder):
'_total_time_stamp', '_mode', '_cycle_start_time', '_total_time_stamp', '_mode', '_cycle_start_time',
'_mode_stop', '_last_time_stamp', '_last_delta', '_cali_coeff', '_mode_stop', '_last_time_stamp', '_last_delta', '_cali_coeff',
'cali_coeff', '_ac_amp', '_mode', '_freq_start', '_freq_stop', 'cali_coeff', '_ac_amp', '_mode', '_freq_start', '_freq_stop',
'_freq_direction', '_last_phase', '_first_phase_flag') '_freq_direction', '_last_phase', '_first_phase_flag', '_show_data')
def __init__(self, cali_coeff: bytes = None): def __init__(self, cali_coeff: bytes = None):
super().__init__() super().__init__()
@@ -1358,6 +1371,8 @@ class EISZeroOneDataDecoder(RecDataDecoder):
self._cali_coeff: Optional[bytes] = None self._cali_coeff: Optional[bytes] = None
self.cali_coeff: Optional[List[Tuple[int, int]]] = None self.cali_coeff: Optional[List[Tuple[int, int]]] = None
self._show_data = False
if cali_coeff is not None: if cali_coeff is not None:
self._cali_coeff = cali_coeff self._cali_coeff = cali_coeff
self.cali_coeff = self._decode_cali_coeff(cali_coeff) self.cali_coeff = self._decode_cali_coeff(cali_coeff)
@@ -1366,12 +1381,27 @@ class EISZeroOneDataDecoder(RecDataDecoder):
def _decode_cali_coeff(cali_coeff: bytes) -> Optional[List[Tuple[int, int]]]: def _decode_cali_coeff(cali_coeff: bytes) -> Optional[List[Tuple[int, int]]]:
if cali_coeff != b'': if cali_coeff != b'':
cali_table = [] cali_table = []
phase_para_a = []
phase_para_b = []
hsrtia_a = [] hsrtia_a = []
hsrtia_b = [] hsrtia_b = []
hsrtia_c = [] hsrtia_c = []
hsrtia_d = [] hsrtia_d = []
phase_coeff = []
phase_offset = []
# phase_coeff = [[0]*4 for i in range(4)]
# phase_offset = [[0]*4 for i in range(4)]
phase_coeff = numpy.zeros([4, 4], dtype = int)
phase_offset = numpy.zeros([4, 4], dtype = int)
########################################
# phase_coeff
# [[gain0, g1, g2, g3] ----->最高頻
# [gain0, g1, g2, g3] ----->中頻
# [gain0, g1, g2, g3] ----->低頻
# [gain0, g1, g2, g3] ----->最低頻
# ]
#######################################
# print('cali_coeff', cali_coeff) # print('cali_coeff', cali_coeff)
cutoff_freq = struct.unpack('>I', cali_coeff[1:5])[0] * 100 #4 cutoff_freq = struct.unpack('>I', cali_coeff[1:5])[0] * 100 #4
@@ -1382,57 +1412,95 @@ class EISZeroOneDataDecoder(RecDataDecoder):
# hsrtia_160k = struct.unpack('>I', cali_coeff[8:12])[0] #4 # hsrtia_160k = struct.unpack('>I', cali_coeff[8:12])[0] #4
index = 20 index = 20
for i in range(index, index+16, 8): g = 0
phase_para_a.append(struct.unpack('>i', cali_coeff[i+1:i+5])[0]) phase_coeff[0][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
phase_para_b.append(struct.unpack('>i', cali_coeff[i+5:i+9])[0]) phase_offset[0][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
phase_coeff[1][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
phase_offset[1][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
index = 40 index = 40
for i in range(index, index+16, 8): g = 0
phase_para_a.append(struct.unpack('>i', cali_coeff[i+1:i+5])[0]) phase_coeff[2][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
phase_para_b.append(struct.unpack('>i', cali_coeff[i+5:i+9])[0]) phase_offset[2][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
phase_coeff[3][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
phase_offset[3][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
#Lv[0] 160k #Lv[0] 160k
index = 60 index = 60
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]/1e8) hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]/1e8)
hsrtia_b.append(struct.unpack('>i', cali_coeff[index+5:index+9])[0]/1e8) hsrtia_b.append(struct.unpack('>i', cali_coeff[index+5:index+9])[0]/1e8)
hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0]/1e4) hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0]/1e4)
hsrtia_d.append(struct.unpack('>B', cali_coeff[index+13:index+14])[0])
#Lv[1] 20k #Lv[1] 20k
index = 80 index = 80
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]/1e8) hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]/1e8)
hsrtia_b.append(struct.unpack('>i', cali_coeff[index+5:index+9])[0]/1e8) hsrtia_b.append(struct.unpack('>i', cali_coeff[index+5:index+9])[0]/1e8)
hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0]/1e4) hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0]/1e4)
hsrtia_d.append(struct.unpack('>B', cali_coeff[index+13:index+14])[0])
#Lv[2] 5k #Lv[2] 5k
index = 100 index = 100
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]/1e8) hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]/1e8)
hsrtia_b.append(struct.unpack('>i', cali_coeff[index+5:index+9])[0]/1e8) hsrtia_b.append(struct.unpack('>i', cali_coeff[index+5:index+9])[0]/1e8)
hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0]/1e4) hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0]/1e4)
hsrtia_d.append(struct.unpack('>B', cali_coeff[index+13:index+14])[0])
#Lv[3] 200R #Lv[3] 200R
index = 120 index = 120
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]/1e8) hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]/1e8)
hsrtia_b.append(struct.unpack('>i', cali_coeff[index+5:index+9])[0]/1e8) hsrtia_b.append(struct.unpack('>i', cali_coeff[index+5:index+9])[0]/1e8)
hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0]/1e4) hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0]/1e4)
hsrtia_d.append(struct.unpack('>B', cali_coeff[index+13:index+14])[0])
# hsrtia_a.append(struct.unpack('>I', cali_coeff[index+1:index+5])[0]) index = 140
# hsrtia_b.append(struct.unpack('>I', cali_coeff[index+5:index+9])[0]/1e6) g = 1
# hsrtia_c.append(struct.unpack('>I', cali_coeff[index+9:index+13])[0]/1e5) phase_coeff[0][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
# hsrtia_d.append(struct.unpack('>I', cali_coeff[index+13:index+17])[0]/1e6) phase_offset[0][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
phase_coeff[1][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
phase_offset[1][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
index = 160
g = 1
phase_coeff[2][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
phase_offset[2][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
phase_coeff[3][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
phase_offset[3][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
index = 180
g = 2
phase_coeff[0][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
phase_offset[0][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
phase_coeff[1][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
phase_offset[1][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
index = 200
g = 2
phase_coeff[2][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
phase_offset[2][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
phase_coeff[3][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
phase_offset[3][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
index = 220
g = 3
phase_coeff[0][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
phase_offset[0][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
phase_coeff[1][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
phase_offset[1][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
index = 240
g = 3
phase_coeff[2][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
phase_offset[2][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
phase_coeff[3][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
phase_offset[3][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
# print('cutoff_freq', cutoff_freq) # print('cutoff_freq', cutoff_freq)
# print('hsrtia_a', hsrtia_a) # print('hsrtia_a', hsrtia_a)
# print('hsrtia_b', hsrtia_b) # print('hsrtia_b', hsrtia_b)
# print('hsrtia_c', hsrtia_c) # print('hsrtia_c', hsrtia_c)
# print('hsrtia_d', hsrtia_d) # print('phase_coeff')
# print('phase_para_a', phase_para_a) # print(phase_coeff)
# print('phase_para_b', phase_para_b) # print('phase_offset')
# print(phase_offset)
cali_table.append((cutoff_freq, phase_para_a, phase_para_b, hsrtia_a, hsrtia_b, hsrtia_c, hsrtia_d)) cali_table.append((cutoff_freq, phase_coeff, phase_offset, hsrtia_a, hsrtia_b, hsrtia_c, hsrtia_d))
return cali_table return cali_table
else: else:
@@ -1482,13 +1550,12 @@ class EISZeroOneDataDecoder(RecDataDecoder):
return None return None
else: else:
if self.cali_coeff is not None and self._mode == 0: if self.cali_coeff is not None and self._mode == 0:
phase_para_a = []
phase_para_b = []
hsrtia_a = [] hsrtia_a = []
hsrtia_b = [] hsrtia_b = []
hsrtia_c = [] hsrtia_c = []
hsrtia_d = [] hsrtia_d = []
cutoff_freq, phase_para_a, phase_para_b, hsrtia_a, hsrtia_b, hsrtia_c, hsrtia_d = self.cali_coeff[0] cutoff_freq, phase_coeff, phase_offset, hsrtia_a, hsrtia_b, hsrtia_c, hsrtia_d = self.cali_coeff[0]
voltage_amp = round(self._ac_amp * 800 / 2047) # use UI value voltage_amp = round(self._ac_amp * 800 / 2047) # use UI value
if (self._freq_start > self._freq_stop): if (self._freq_start > self._freq_stop):
self._freq_direction = 0 self._freq_direction = 0
@@ -1499,6 +1566,7 @@ class EISZeroOneDataDecoder(RecDataDecoder):
img = ch1 img = ch1
real = ch2 real = ch2
freq = ch3 freq = ch3
fre_idx = 0
voltage_mag = math.sqrt(img ** 2 + real ** 2) * (1 + freq ** 2 / cutoff_freq ** 2) voltage_mag = math.sqrt(img ** 2 + real ** 2) * (1 + freq ** 2 / cutoff_freq ** 2)
@@ -1526,56 +1594,56 @@ class EISZeroOneDataDecoder(RecDataDecoder):
raw_phase = math.atan(img / real) * 180 / math.pi + 180 raw_phase = math.atan(img / real) * 180 / math.pi + 180
if (freq >= 1000000): # 10000 Hz if (freq >= 1000000): # 10000 Hz
i = 0 fre_idx = 0
elif (freq >= 10000): # 100 Hz elif (freq >= 10000): # 100 Hz
i = 1 fre_idx = 1
elif (freq >= 1000): # 10 Hz elif (freq >= 1000): # 10 Hz
i = 2 fre_idx = 2
elif (freq >= 1): # 0.01 Hz elif (freq >= 1): # 0.01 Hz
i = 3 fre_idx = 3
ideal_raw_phase = phase_para_a[i] /1e10 * freq + phase_para_b[i] / 1e6 ideal_raw_phase = phase_coeff[fre_idx][gain] /1e10 * freq + phase_offset[fre_idx][gain] / 1e6
phase = raw_phase - ideal_raw_phase phase = raw_phase - ideal_raw_phase
if (self._first_phase_flag): if (self._first_phase_flag):
self._last_phase = phase self._last_phase = phase
self._first_phase_flag = 0 self._first_phase_flag = 0
elif (abs(phase - self._last_phase) >= 200): elif (abs(phase - self._last_phase) >= 90):
phase -= 360 phase -= 360
self._last_phase = phase self._last_phase = phase
imag_after_cal = impedance * math.sin(round(phase) * math.pi / 180) imag_after_cal = impedance * math.sin(round(phase) * math.pi / 180)
real_after_cal = impedance * math.cos(round(phase) * math.pi / 180) real_after_cal = impedance * math.cos(round(phase) * math.pi / 180)
if self._show_data:
if (self._mode == 0): if (self._mode == 0):
# print('|', '{:10}'.format(time_stamp), print('|', '{:10}'.format(time_stamp),
# '|', '{:5}'.format(delta), '|', '{:5}'.format(delta),
# '|', '{:6}'.format(ch1), '|', '{:6}'.format(ch1),
# '|', '{:6}'.format(ch2), '|', '{:6}'.format(ch2),
# '|', '{:8}'.format(ch3 / 100), '|', '{:8}'.format(ch3 / 100),
# '|', '{:6}'.format(round(voltage_mag)), '|', '{:6}'.format(round(voltage_mag)),
# '|', '{:5}'.format(int(imag_after_cal)), '|', '{:5}'.format(int(imag_after_cal)),
# '|', '{:5}'.format(int(real_after_cal)), '|', '{:5}'.format(int(real_after_cal)),
# '|', '{:5}'.format(round(impedance)), '|', '{:5}'.format(round(impedance)),
# '|', '{:5}'.format(round(phase, 1)), '|', '{:5}'.format(round(phase, 1)),
# '|', '{:5}'.format(round(current, 3)), '|', '{:5}'.format(round(current, 3)),
# '|', '{:1}'.format(gain), '|', '{:1}'.format(gain),
# '|', '{:1}'.format(finishMode), '|', '{:1}'.format(finishMode),
# '@', str(self.device), '|') '@', str(self.device), '|')
pass pass
else: else:
# print('|', '{:10}'.format(time_stamp), print('|', '{:10}'.format(time_stamp),
# '|', '{:5}'.format(delta), '|', '{:5}'.format(delta),
# '|', '{:5}'.format(ch1), '|', '{:5}'.format(ch1),
# '|', '{:5}'.format(ch2), '|', '{:5}'.format(ch2),
# '|', '{:5}'.format(ch3), '|', '{:5}'.format(ch3),
# '|', '{:5}'.format(cycle_number), '|', '{:5}'.format(cycle_number),
# '|', '{:1}'.format(gain), '|', '{:1}'.format(gain),
# '|', '{:1}'.format(finishMode), '|', '{:1}'.format(finishMode),
# '@', str(self.device), '|') '@', str(self.device), '|')
pass pass
if finishMode == True: if finishMode == True:
print("finishMode full data:", list(data), datetime.now()) print("finishMode full data:", list(data), datetime.now())
@@ -1585,10 +1653,10 @@ class EISZeroOneDataDecoder(RecDataDecoder):
ret = RecordingData(self.device, int(time_stamp * 1000 / 2), 0) ret = RecordingData(self.device, int(time_stamp * 1000 / 2), 0)
if (self._mode == 0): #EIS Mode if (self._mode == 0): #EIS Mode
ret.append_data(3, cycle_number)
ret.append_data(0, ch1) #Raw Imag ret.append_data(0, ch1) #Raw Imag
ret.append_data(1, ch2) #Raw Real ret.append_data(1, ch2) #Raw Real
ret.append_data(2, ch3 * 10) #Frequency [mHz] ret.append_data(2, ch3 * 10) #Frequency [mHz]
ret.append_data(3, cycle_number)
ret.append_data(4, round(imag_after_cal)) #Z_imag [Ohm] ret.append_data(4, round(imag_after_cal)) #Z_imag [Ohm]
ret.append_data(5, round(real_after_cal)) #Z_real [Ohm] ret.append_data(5, round(real_after_cal)) #Z_real [Ohm]
ret.append_data(6, round(impedance)) #Impedance [Ohm] ret.append_data(6, round(impedance)) #Impedance [Ohm]
@@ -1597,10 +1665,10 @@ class EISZeroOneDataDecoder(RecDataDecoder):
ret.append_data(9, gain) #Gain Level ret.append_data(9, gain) #Gain Level
else: #CV Mode else: #CV Mode
ret.append_data(3, cycle_number)
ret.append_data(0, ch1) #Iin [nA] ret.append_data(0, ch1) #Iin [nA]
ret.append_data(1, ch2) #Vset [nV] ret.append_data(1, ch2) #Vset [nV]
ret.append_data(2, ch3) #Vout [nV] ret.append_data(2, ch3) #Vout [nV]
ret.append_data(3, cycle_number)
if cycle_number != self._cycle_number: if cycle_number != self._cycle_number:
# notify cycle_number change # notify cycle_number change
-13
View File
@@ -651,17 +651,9 @@ class DeviceInstruction:
VIS_DEVICE_DONE = 0x20 VIS_DEVICE_DONE = 0x20
"""identify device done""" """identify device done"""
VIS_CC_ZERO = 0x40
VIS_ASK = 0x30
"""ask in virtual instruction"""
VIS_STI = 0xC0 VIS_STI = 0xC0
"""stimulation on virtual instruction""" """stimulation on virtual instruction"""
VIS_FUH = 0x90
"""flush virtual instruction"""
VIS_INT = 0x60 VIS_INT = 0x60
"""interrupt virtual instruction""" """interrupt virtual instruction"""
@@ -732,7 +724,6 @@ class DeviceCommonInstruction:
STOP_STIMULATE = "stop_stimulate" STOP_STIMULATE = "stop_stimulate"
VIS_DEVICE_DETECT = 'VIS_DEVICE_DETECT' VIS_DEVICE_DETECT = 'VIS_DEVICE_DETECT'
VIS_DEVICE_DONE = 'VIS_DEVICE_DONE' VIS_DEVICE_DONE = 'VIS_DEVICE_DONE'
VIS_CC_ZERO = 'VIS_CC_ZERO'
CIS_VOLT = 'CIS_VOLT' CIS_VOLT = 'CIS_VOLT'
CIS_VERSION = 'CIS_VERSION' CIS_VERSION = 'CIS_VERSION'
@@ -750,16 +741,12 @@ class DeviceCommonInstruction:
return '_sync(False)', '_notify(False)', 'VIS_INT' return '_sync(False)', '_notify(False)', 'VIS_INT'
elif instruction == cls.CLOSE: elif instruction == cls.CLOSE:
return '_sync(False)', '_notify(False)', 'VIS_INT' return '_sync(False)', '_notify(False)', 'VIS_INT'
elif instruction == cls.FLUSH:
return 'VIS_FUH',
elif instruction == cls.CALL: elif instruction == cls.CALL:
return 'VIS_CAL', return 'VIS_CAL',
elif instruction == cls.VIS_DEVICE_DETECT: elif instruction == cls.VIS_DEVICE_DETECT:
return 'VIS_DEVICE_DETECT', return 'VIS_DEVICE_DETECT',
elif instruction == cls.VIS_DEVICE_DONE: elif instruction == cls.VIS_DEVICE_DONE:
return 'VIS_DEVICE_DONE', return 'VIS_DEVICE_DONE',
elif instruction == cls.VIS_CC_ZERO:
return 'VIS_CC_ZERO',
elif instruction == cls.RECORD: elif instruction == cls.RECORD:
return 'VIS_STARTR', return 'VIS_STARTR',
elif instruction == cls.RECORD_ALL: elif instruction == cls.RECORD_ALL:
+15 -2
View File
@@ -4,6 +4,7 @@ from biopro.util.text import part_suffix
from . import * from . import *
from .expression import * from .expression import *
import json
class DeviceParameterError(RuntimeError): class DeviceParameterError(RuntimeError):
__slots__ = () __slots__ = ()
@@ -309,6 +310,8 @@ class ParameterValueDomain(ParameterDomain, metaclass=abc.ABCMeta):
return f return f
def valid_para(self, value: Any) -> bool: def valid_para(self, value: Any) -> bool:
if isinstance(value, list):
return True
f, t = self.range f, t = self.range
return f <= float(value) < t return f <= float(value) < t
@@ -489,8 +492,12 @@ class ParameterCollectionValueOperator(metaclass=abc.ABCMeta):
@classmethod @classmethod
def parse(cls, expr: Union[int, str]) -> 'ParameterCollectionValueOperator': def parse(cls, expr: Union[int, str]) -> 'ParameterCollectionValueOperator':
# parse epression then create value_operator
if isinstance(expr, int): if isinstance(expr, int):
return SingleValueOperator(None, expr) return SingleValueOperator(None, expr)
elif isinstance(expr, list):
return CollectValueOperator((0, len(expr)), expr)
elif expr == '*': elif expr == '*':
return AddAllValueOperator return AddAllValueOperator
@@ -498,6 +505,10 @@ class ParameterCollectionValueOperator(metaclass=abc.ABCMeta):
elif expr == ':=': elif expr == ':=':
return CollectValueOperator((None, None), []) return CollectValueOperator((None, None), [])
elif '[' in expr and ']' in expr:
v = json.loads(expr)
return CollectValueOperator((0, len(v)), v)
elif '=' in expr: elif '=' in expr:
a, v = part_suffix(expr, '=') a, v = part_suffix(expr, '=')
@@ -508,6 +519,7 @@ class ParameterCollectionValueOperator(metaclass=abc.ABCMeta):
return CollectValueOperator((None, None), v) return CollectValueOperator((None, None), v)
else: else:
# get list length (old way)
a, b = part_suffix(a, ':') a, b = part_suffix(a, ':')
a = int(a) if len(a) else None a = int(a) if len(a) else None
b = int(b) if len(b) 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): def __init__(self, domain: ParameterDomain):
super().__init__() super().__init__()
if isinstance(domain, ParameterCollectionDomain): # if isinstance(domain, ParameterCollectionDomain):
raise RuntimeError('cannot compose with parameter collection domain') # raise RuntimeError('cannot compose with parameter collection domain')
self._domain = domain self._domain = domain
@@ -725,6 +737,7 @@ class ParameterListDomain(ParameterCollectionDomain):
if oper == AddAllValueOperator: if oper == AddAllValueOperator:
raise ValueError("list parameter cannot accept '*' (all) value") raise ValueError("list parameter cannot accept '*' (all) value")
# d: domain, sz: lsit length, i: slice(a, b), v: list value
d = self.element_domain d = self.element_domain
sz = len(target) sz = len(target)
i = oper.index(sz) i = oper.index(sz)
+7 -3
View File
@@ -119,7 +119,10 @@ class DeviceConfigurationEncoder:
e.write(b'L\0') e.write(b'L\0')
else: 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(b'L')
e.write(parameter_type.encode()) e.write(parameter_type.encode())
e.u8(sz) e.u8(sz)
@@ -153,7 +156,8 @@ class DeviceConfigurationEncoder:
if isinstance(value, bool): if isinstance(value, bool):
e.u8(1 if value else 0) 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) e.encode_string(value)
elif isinstance(value, int): elif isinstance(value, int):
@@ -170,7 +174,7 @@ class DeviceConfigurationEncoder:
if isinstance(value, bool): if isinstance(value, bool):
return '?' return '?'
elif isinstance(value, str): elif isinstance(value, str) or isinstance(value, list):
return 'p' return 'p'
elif isinstance(value, int): elif isinstance(value, int):
+21 -3
View File
@@ -510,9 +510,10 @@ class DeviceParameter(JsonSerialize):
:param para: parameter name :param para: parameter name
:param oper: operator expression :param oper: operator expression
""" """
# parse operator return CollectValueOperator instance
if not isinstance(oper, ParameterCollectionValueOperator): if not isinstance(oper, ParameterCollectionValueOperator):
oper = ParameterCollectionValueOperator.parse(oper) oper = ParameterCollectionValueOperator.parse(oper)
table = self._library.parameter_table table = self._library.parameter_table
info = table[para] info = table[para]
domain = info.domain domain = info.domain
@@ -528,6 +529,7 @@ class DeviceParameter(JsonSerialize):
old = list(target) old = list(target)
try: try:
# replace target with new oper
domain.oper_para(target, oper, self._context) domain.oper_para(target, oper, self._context)
except RuntimeError as e: except RuntimeError as e:
raise IllegalParameterValueError(para, str(oper)) from e raise IllegalParameterValueError(para, str(oper)) from e
@@ -1012,6 +1014,10 @@ class CompletedDevice(Device):
def device_id(self) -> int: def device_id(self) -> int:
return self._device_id return self._device_id
@property
def memory_board(self) -> int:
return self._device_id
@property @property
def device_name(self) -> str: def device_name(self) -> str:
return self._device.device_name return self._device.device_name
@@ -1099,6 +1105,8 @@ class CompletedDevice(Device):
return self._configuration.get_parameter(name, False) return self._configuration.get_parameter(name, False)
def set_multi_parameters(self, parameter): def set_multi_parameters(self, parameter):
if len(parameter) == 0:
return
for (name, value) in parameter[0].items(): for (name, value) in parameter[0].items():
if name != 'target': if name != 'target':
self.set_parameter(name, value) self.set_parameter(name, value)
@@ -1122,6 +1130,11 @@ class CompletedDevice(Device):
self._parameter.set_parameter(name, value) self._parameter.set_parameter(name, value)
# raise RuntimeError('illegal parameter value : ' + value) from e # raise RuntimeError('illegal parameter value : ' + value) from e
else: else:
if name == 'MODE':
if self.library_name.startswith('Elite_EDC'):
self.set_parameter('CTRL_HIGH_Z_15', self.get_parameter('HIGHZ_TABLE')[value])
self.set_parameter('TIME_DURATION', 0)
self._parameter.set_parameter(name, value) self._parameter.set_parameter(name, value)
on_change = info.on_change on_change = info.on_change
@@ -1274,15 +1287,20 @@ class CompletedDevice(Device):
def as_json(self) -> JSON_OBJECT: def as_json(self) -> JSON_OBJECT:
return { return {
'id': self.device_id,
'name': self.device_name,
'status': self._status,
'device_id': self.device_id, 'device_id': self.device_id,
'device_name': self.device_name, 'device_name': self.device_name,
'device_address': list(self.mac_address), 'device_address': list(self.mac_address),
'device_status': self._status, 'device_status': self._status,
'mac_address': self.mac_address_in_str,
'memory_board': self.memory_board,
'serial_number': self.serial_number.as_json(),
'version': self.device_version,
'battery': self.battery, 'battery': self.battery,
'parent': self.parent, 'parent': self.parent,
'recording_file_name': self.recording_file_name, 'recording_file_name': self.recording_file_name,
'device_version': self.device_version,
'serial_number': self.serial_number.as_json(),
'library_name': self._library.name, 'library_name': self._library.name,
'library_version': str(self._library.version), 'library_version': str(self._library.version),
'configuration': self.configuration.as_json(list_hide=True), 'configuration': self.configuration.as_json(list_hide=True),
+23 -7
View File
@@ -35,7 +35,7 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
'_pin_ram_sel_value', '_pin_mem_sel_value', '_pin_mem_req_value', '_pin_ram_sel_value', '_pin_mem_sel_value', '_pin_mem_req_value',
'_read_green_times','_read_red_times', '_read_green_times','_read_red_times',
'_elite_data_len', '_mem_header_len', '_mem_tailer_len', '_single_data_len', '_elite_data_len', '_mem_header_len', '_mem_tailer_len', '_single_data_len',
'_head_wrong_cnt') '_head_wrong_cnt', '_pin_busy_value')
def __init__(self, def __init__(self,
select: Selector, select: Selector,
@@ -50,11 +50,11 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
self._single_data_len = self._elite_data_len + self._mem_header_len + self._mem_tailer_len self._single_data_len = self._elite_data_len + self._mem_header_len + self._mem_tailer_len
# buffer # buffer
self._tx_buffer_header = [0] * 19 self._tx_buffer_header = [0] * 64
self._tx_buffer_data = [0] * (self._single_data_len * 10 + 3) self._tx_buffer_data = [0] * (self._single_data_len * 10 + 3)
# memory control pin # memory control pin
self.pin_busy = OutputPin.get_used(P3Pin.MEM_BZY, True) self.pin_busy: Optional[InputPin] = InputPin.get_used(P3Pin.MEM_BZY)
self.pin_mem_req = OutputPin.get_used(P3Pin.MEM_REQ, False) self.pin_mem_req = OutputPin.get_used(P3Pin.MEM_REQ, False)
self.pin_mem_sel = OutputPin.get_used(P3Pin.MEM_RST, True) # MEM_RST -> actually which memory board is assign self.pin_mem_sel = OutputPin.get_used(P3Pin.MEM_RST, True) # MEM_RST -> actually which memory board is assign
self.pin_ram_sel: Optional[InputPin] = InputPin.get_used(P3Pin.MEM_SEL) # MEM_SEL -> actually is RAM_SEL, which RAM is assign self.pin_ram_sel: Optional[InputPin] = InputPin.get_used(P3Pin.MEM_SEL) # MEM_SEL -> actually is RAM_SEL, which RAM is assign
@@ -62,6 +62,7 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
self._pin_ram_sel_value = [bool(self.pin_ram_sel) for _ in range(Selector.SIZE)] self._pin_ram_sel_value = [bool(self.pin_ram_sel) for _ in range(Selector.SIZE)]
self._pin_mem_sel_value = [bool(self.pin_mem_sel) for _ in range(Selector.SIZE)] self._pin_mem_sel_value = [bool(self.pin_mem_sel) for _ in range(Selector.SIZE)]
self._pin_mem_req_value = [bool(self.pin_mem_req) for _ in range(Selector.SIZE)] self._pin_mem_req_value = [bool(self.pin_mem_req) for _ in range(Selector.SIZE)]
self._pin_busy_value = [bool(self.pin_busy) for _ in range(Selector.SIZE)]
self._read_green_times = 0 self._read_green_times = 0
self._read_red_times = 0 self._read_red_times = 0
@@ -76,6 +77,8 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
def set_pin_mem_req(self, value: bool): def set_pin_mem_req(self, value: bool):
channel = self.select channel = self.select
# if self._pin_mem_req_value[channel] == value:
# print('last_req_sig[channel] == value', channel, self._pin_mem_req_value[channel], value, datetime.now())
self.pin_mem_req.output(value) self.pin_mem_req.output(value)
self._pin_mem_req_value[channel] = value self._pin_mem_req_value[channel] = value
@@ -96,6 +99,14 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
self._pin_ram_sel_value[channel] = True self._pin_ram_sel_value[channel] = True
return self._pin_ram_sel_value[channel] return self._pin_ram_sel_value[channel]
def get_pin_busy(self):
channel = self.select
if self.pin_busy.input() == 0:
self._pin_busy_value[channel] = False
else:
self._pin_busy_value[channel] = True
return self._pin_busy_value[channel]
@property @property
def select(self) -> int: def select(self) -> int:
return self._selector.channel return self._selector.channel
@@ -214,7 +225,9 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
return return
def recv_memory(self, device: int) -> Optional[bytes]: def recv_memory(self, device: int) -> Optional[bytes]:
self.pin_busy.output(False) # self.pin_busy.output(False)
print('mem_req==ram_sel,[', self._pin_mem_req_value[device], ',', self._pin_ram_sel_value[device], ']')
rx = [] rx = []
@@ -298,6 +311,9 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
print("green data print:", data, device, datetime.now()) print("green data print:", data, device, datetime.now())
return None return None
# print('data=', list(data))
print('Ram:', data[62])
if (length >= 4000): if (length >= 4000):
flag_print = True flag_print = True
print("green data: big length:", length) print("green data: big length:", length)
@@ -413,9 +429,9 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
except BaseException as e: except BaseException as e:
print(e) print(e)
finally: # finally:
# print("\n") # # print("\n")
self.pin_busy.output(True) # self.pin_busy.output(True)
return bytes(rx) return bytes(rx)
+4 -4
View File
@@ -118,13 +118,13 @@ class Selector:
self._p2.output(p[2]) self._p2.output(p[2])
# if (value == 4 and self._last_sel != 6): # if (value == 4 and self._last_sel != 6):
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel) # print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel, datetime.now())
# elif (value == 5 and self._last_sel != 4): # elif (value == 5 and self._last_sel != 4):
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel) # print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel, datetime.now())
# elif (value == 7 and self._last_sel != 5): # elif (value == 7 and self._last_sel != 5):
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel) # print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel, datetime.now())
# elif (value == 6 and self._last_sel != 7): # elif (value == 6 and self._last_sel != 7):
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel) # print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel, datetime.now())
self._last_sel = value self._last_sel = value
+8
View File
@@ -24,3 +24,11 @@ class Action():
@property @property
def condition(self): def condition(self):
return self._condition return self._condition
def as_json(self):
return {
'id': self._id,
'type': self._type,
'target': self._target,
'condition': self._condition
}
+48 -8
View File
@@ -56,7 +56,8 @@ class Condition():
return getattr(self, self.type)(**kwargs) return getattr(self, self.type)(**kwargs)
def absolute_time(self, **kwargs): def absolute_time(self, **kwargs):
now = int(time()) # now = int(time())
now = round(time(), 1)
time_condition = round(self.datetime_to_timestamp(self.str_to_datetime(self._value))) time_condition = round(self.datetime_to_timestamp(self.str_to_datetime(self._value)))
return self.compareWith(self.comparsion, now, time_condition) return self.compareWith(self.comparsion, now, time_condition)
@@ -65,8 +66,9 @@ class Condition():
project_start_time = kwargs['project_start_time'] project_start_time = kwargs['project_start_time']
delay_time = kwargs['delay_time'] delay_time = kwargs['delay_time']
time_diff = int(time() - project_start_time - delay_time) # time_diff = int(time() - project_start_time - delay_time)
return self.compareWith(self.comparsion, time_diff, int(self._value)) time_diff = round(time() - project_start_time - delay_time, 1)
return self.compareWith(self.comparsion, time_diff, round(int(self._value), 1))
def after_task_run(self, **kwargs): def after_task_run(self, **kwargs):
# print('relative_time_from_task', kwargs,kwargs['task_start_time'],kwargs['delay_time']) # print('relative_time_from_task', kwargs,kwargs['task_start_time'],kwargs['delay_time'])
@@ -75,22 +77,60 @@ class Condition():
task_start_time = kwargs['task_start_time'][-1] task_start_time = kwargs['task_start_time'][-1]
delay_time = kwargs['delay_time'] delay_time = kwargs['delay_time']
time_diff = int(time() - task_start_time - delay_time) time_diff = round(time() - task_start_time - delay_time, 1)
# print('time_diff', time_diff) return self.compareWith(self.comparsion, time_diff, round(int(self._value), 1))
return self.compareWith(self.comparsion, time_diff, int(self._value))
def device(self, **kwargs): def device(self, **kwargs):
print('device') print('device')
def previous_task_done(self, **kwargs): """ def previous_task_done(self, **kwargs):
running_task = kwargs['running_task'] running_task = kwargs['running_task']
if running_task.status == 2 and self._active == False: if running_task.status == 2 and self._active == False:
self._active = True self._active = True
return True return True
return False """
def previous_task_done(self, **kwargs):
running_task = kwargs['running_task']
self_task = kwargs['self_task']
# if running_task != None and self_task != None:
# print('\nprevious_task_done: ', running_task.status, ' ', self._active)
if running_task != self_task:
if running_task == None:
return True
if running_task.status == 2 and self._active == False:
# self._active = True
return True
return False return False
def until_button_trigger(self, **kwargs):
running_task = kwargs['running_task']
if running_task != None:
if running_task.button_trigger == True:
running_task.button_trigger = False
return True
return False
""" def cycle(self, **kwargs):
running_task = kwargs['running_task']
self_task = kwargs['self_task']
if running_task != self_task:
if running_task.status == 2 and self._active == False:
# self._active = True
return True
return False """
def str_to_datetime(self, time_str): def str_to_datetime(self, time_str):
return datetime.strptime(time_str,'%Y-%m-%dT%H:%M') return datetime.strptime(time_str,'%Y-%m-%dT%H:%M')
def datetime_to_timestamp(self, date): def datetime_to_timestamp(self, date):
return datetime.timestamp(date) return datetime.timestamp(date)
def as_json(self):
return {
'id': self._id,
'type': self._type,
'comparsion': self._comparsion,
'value': self._value,
'active': self._active
}
+6 -1
View File
@@ -22,6 +22,7 @@ class Instruction():
self._start_instruction = list(map(lambda ins: self._instruction_set[ins] ,['set_file_name', 'set_parent', 'set_parameter', 'call_instruction'])) self._start_instruction = list(map(lambda ins: self._instruction_set[ins] ,['set_file_name', 'set_parent', 'set_parameter', 'call_instruction']))
self._stop_instruction = list(map(lambda ins: self._instruction_set[ins] ,['call_instruction'])) self._stop_instruction = list(map(lambda ins: self._instruction_set[ins] ,['call_instruction']))
self._idle_instruction = []
@property @property
def start(self) -> list: def start(self) -> list:
@@ -29,4 +30,8 @@ class Instruction():
@property @property
def stop(self) -> list: def stop(self) -> list:
return self._stop_instruction return self._stop_instruction
@property
def idle(self) -> list:
return self.idle_instruction
+47 -9
View File
@@ -24,7 +24,7 @@ class Project(threading.Thread):
self._project = project self._project = project
self._device_manager = device_manager self._device_manager = device_manager
self._mqtt_thread = mqttThread self._mqtt_thread = mqttThread
self._time_interval = 1 self._time_interval = 0.1
self._start_time = None self._start_time = None
self._end_time = None self._end_time = None
@@ -117,6 +117,10 @@ class Project(threading.Thread):
def mqtt_thread(self): def mqtt_thread(self):
return self._mqtt_thread return self._mqtt_thread
@property
def running_task(self):
return self._task_manager.running_task
def run(self): def run(self):
self._status = 1 self._status = 1
self._start_time = time() self._start_time = time()
@@ -139,23 +143,42 @@ class Project(threading.Thread):
project_start_time = self._start_time, project_start_time = self._start_time,
delay_time = delay_time, delay_time = delay_time,
running_task= self._task_manager.running_task, running_task= self._task_manager.running_task,
previous_task = self._task_manager.prev_task previous_task = self._task_manager.prev_task,
self_task = task
) )
# print('match_condition_list', match_condition_list) # print('match_condition_list', match_condition_list)
for condition in match_condition_list: for condition in match_condition_list:
# print('\ncondition.type: ', condition.type)
match_action_list = task.get_match_action(condition.id) match_action_list = task.get_match_action(condition.id)
# print('match_action_list', match_action_list)
for action in match_action_list: for action in match_action_list:
# print('match_action', action.type, action.target) # print('action type', action.type)
# print('match_action_list len: ', len(match_action_list))
if action.type == 'start' and task.status != 1: if action.type == 'start' and task.status != 1:
self._task_manager.set_running_task(task) self._task_manager.set_running_task(task)
# Trace
self.mqtt_thread.broadcast_command('project:task ' + task.name + ' start at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]) self.mqtt_thread.broadcast_command('project:task ' + task.name + ' start at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
elif action.type == 'cycle' and task.status != 1:
# TODO: directly goto next without swich cycle as running task
""" if task._cycle_count < task._cycle - 1:
task._cycle_count += 1
cycle_target = self._task_manager.task_list[task._cycle_next - 1] # TODO: not sure deep or shallow
cycle_target.reset()
task = cycle_target """
self._task_manager.set_running_task(task)
elif action.type == 'stop' and len(self._task_manager.running_task.parameter_set) == 0:
self.mqtt_thread.broadcast_command('project:task ' + str(self._task_manager.running_task.name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
self._task_manager.running_task.stop()
elif action.type == 'idle':
self._task_manager.running_task.stop()
device = self._complete_device[action.target] device = self._complete_device[action.target]
task_info = task.get_task_info(action) task_info = task.get_task_info(action)
instruction_set = getattr(self._instruction_set, action.type, None) instruction_set = getattr(self._instruction_set, action.type, None)
# print('instruction_set',instruction_set) # print('instruction_set', instruction_set, '\n', action.type)
# if instruction_set != None and task.cycle == -1:
if instruction_set != None: if instruction_set != None and len(task.parameter_set) > 0:
for instruction in instruction_set: for instruction in instruction_set:
args = list(map(lambda arg: task_info[arg], instruction['arguments'])) args = list(map(lambda arg: task_info[arg], instruction['arguments']))
threading.Thread(target=getattr(device, instruction['method'])(*args)) threading.Thread(target=getattr(device, instruction['method'])(*args))
@@ -164,8 +187,10 @@ class Project(threading.Thread):
# check task not running then stop # check task not running then stop
if self.check_running_task_not_run() == True: if self.check_running_task_not_run() == True:
self.mqtt_thread.broadcast_command('project:task ' + str(self._task_manager.running_task.name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]) if self._task_manager.running_task.cycle == -1:
self.mqtt_thread.broadcast_command('project:task ' + str(self._task_manager.running_task.name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
self._task_manager.running_task.stop() self._task_manager.running_task.stop()
# self._task_manager.set_running_task(task)
# check project done then close project # check project done then close project
if self.check_project_done() == True: if self.check_project_done() == True:
@@ -200,17 +225,30 @@ class Project(threading.Thread):
return False return False
return True return True
def set_content(self, content):
self.running_task.button_trigger = True
def check_running_task_not_run(self): def check_running_task_not_run(self):
# if no running task # if no running task
if self._task_manager.running_task == None: if self._task_manager.running_task == None:
return False return False
for key in self._task_manager.running_task.action:
# print('action key', key, self._task_manager.running_task, self._task_manager.running_task.action[key])
if len(self._task_manager.running_task.parameter_set) == 0 and self._task_manager.running_task.action[key]['type'] == 'stop':
return False
if len(self._task_manager.running_task.parameter_set) == 0 and self._task_manager.running_task.action[key]['type'] == 'idle':
return False
for device in self._task_manager.running_task.device: for device in self._task_manager.running_task.device:
if self._complete_device[device].status == 1: if self._complete_device[device].status == 1:
return False return False
return True return True
def as_json(self): def as_json(self):
running_task = None
if self._task_manager.running_task is not None:
running_task = self._task_manager.running_task.as_json()
data = { data = {
'id': self._id, 'id': self._id,
'name': self._name, 'name': self._name,
@@ -219,6 +257,6 @@ class Project(threading.Thread):
'status': self._status, 'status': self._status,
'device': self._device, 'device': self._device,
'task': self.task_list, 'task': self.task_list,
'running_task': self._task_manager.running_task.as_json() 'running_task': running_task
} }
return data return data
+4
View File
@@ -37,3 +37,7 @@ class ProjectManager():
def stop_project(self, project): def stop_project(self, project):
_project = self.get(project) _project = self.get(project)
_project.stop() _project.stop()
def set_project(self, project_uuid, content):
_project = self.get(project_uuid)
_project.set_content(content)
+49 -1
View File
@@ -15,26 +15,34 @@ class Task:
self._name = None self._name = None
self._parent = None self._parent = None
self._cycle = None self._cycle = None
self._cycle_count = 0
self._cycle_next = None
self._cycle_next_uuid = None
self._device = None self._device = None
self._event = None self._event = None
self._trigger = None self._trigger = None
self._parameter_set = None self._parameter_set = None
self._condition = None self._condition = None
self._action = None self._action = None
# -1: initial 0: start(idle), 1: running, 2: close(idle) # -1: init 0: start(idle), 1: run, 2: close(idle)
self._status = 0 self._status = 0
self._next = None self._next = None
# action & condition info
self._condition_list: List[Condition] = [] self._condition_list: List[Condition] = []
self._action_list: List[Action] = [] self._action_list: List[Action] = []
self._instruction_list = [] self._instruction_list = []
self._record_list = [] self._record_list = []
# time info
self._start_time = [] self._start_time = []
self._idle_time = [] self._idle_time = []
self._end_time = [] self._end_time = []
self._period = None self._period = None
# trigger info
self._button_trigger = False
self.load_task(task) self.load_task(task)
def load_task(self, task) -> None: def load_task(self, task) -> None:
@@ -100,6 +108,31 @@ class Task:
@cycle.setter @cycle.setter
def cycle(self, new_cycle): def cycle(self, new_cycle):
self._cycle = new_cycle self._cycle = new_cycle
# TODO: not sure needed?
@property
def cycle_count(self) -> int:
return self._cycle_count
@cycle_count.setter
def cycle_count(self, new_cycle_count):
self._cycle_count = new_cycle_count
@property
def cycle_next(self) -> str:
return self._cycle_next
@cycle_next.setter
def cycle_next(self, new_cycle_next):
self._cycle_next = new_cycle_next
@property
def cycle_next_uuid(self) -> str:
return self._cycle_next_uuid
@cycle_next_uuid.setter
def cycle_next_uuid(self, new_cycle_next_uuid):
self._cycle_next_uuid = new_cycle_next_uuid
@property @property
def device(self) -> dict: def device(self) -> dict:
@@ -177,6 +210,14 @@ class Task:
def end_time(self) -> List: def end_time(self) -> List:
return self._end_time return self._end_time
@property
def button_trigger(self) -> List:
return self._button_trigger
@button_trigger.setter
def button_trigger(self, button_trigger):
self._button_trigger = button_trigger
def new_start_time(self): def new_start_time(self):
self._start_time.append(time()) self._start_time.append(time())
@@ -207,6 +248,10 @@ class Task:
def stop(self): def stop(self):
self.status = 2 self.status = 2
def reset(self):
self.status = -1
# self.status = 0
def get_match_action_list(self, match_condition_list): def get_match_action_list(self, match_condition_list):
return map(lambda condition: [x for x in self._action_list if condition.id in x.get_condition_list()], match_condition_list) return map(lambda condition: [x for x in self._action_list if condition.id in x.get_condition_list()], match_condition_list)
@@ -241,6 +286,9 @@ class Task:
'name': self.name, 'name': self.name,
'parent': self.parent, 'parent': self.parent,
'cycle': self.cycle, 'cycle': self.cycle,
'cycle_count': self.cycle_count,
'cycle_next': self.cycle_next,
'cycle_next_uuid': self.cycle_next_uuid,
'device': self.device, 'device': self.device,
'event': self.event, 'event': self.event,
'trigger': self.trigger, 'trigger': self.trigger,
+40 -1
View File
@@ -57,7 +57,8 @@ class TaskManager():
task = Task(task) task = Task(task)
self._task_list.append(task) self._task_list.append(task)
def set_running_task(self, task): # original version
""" def set_running_task(self, task):
try: try:
# if there is task running & same task active ,then reject # if there is task running & same task active ,then reject
if self._running_task != None and self._running_task.uuid == task.uuid: if self._running_task != None and self._running_task.uuid == task.uuid:
@@ -80,6 +81,44 @@ class TaskManager():
_task = next((task for task in self._task_list if task.uuid == task_uuid), None) _task = next((task for task in self._task_list if task.uuid == task_uuid), None)
if _task != None: if _task != None:
self._next_task.append(_task) self._next_task.append(_task)
except RuntimeError as e:
print(e) """
def set_running_task(self, task):
try:
# if there is task running & same task active ,then reject
if self._running_task != None and self._running_task.uuid == task.uuid:
# print('set_running_task return false: ', self._running_task.name)
return False
# save running task
self._prev_task = self._running_task
# clear next task list
self._next_task.clear()
self._running_task = task
self._running_task.run()
if self._prev_task != None:
# if previous task is still running, then need to close
if self._prev_task.status == 1:
self._prev_task.stop()
print('prev', 'run', self._prev_task.name, self._running_task.name)
# print(f'!!@#!set_running_task\n\n\n{task._cycle_count}\n{task._cycle}\n\n\n')
if task._cycle_count < task._cycle - 1:
task._cycle_count += 1
# use uuid to get the cycle next task
cycle_target = [_task_next for _task_next in self._task_list if _task_next.uuid == task._cycle_next_uuid]
# cycle_target = self._task_list[task._cycle_next - 1] # original use index version
cycle_target[0].reset()
self._next_task.append(cycle_target[0])
else:
task._cycle_count = 0
for task_uuid in self._running_task.next:
_task = next((task for task in self._task_list if task.uuid == task_uuid), None)
if _task != None:
_task.reset()
self._next_task.append(_task)
except RuntimeError as e: except RuntimeError as e:
print(e) print(e)
+8 -5
View File
@@ -1131,14 +1131,17 @@ class RecordingFileWriter:
self._splitting_size = 0 self._splitting_size = 0
return None return None
def close(self): def close(self, mqtt_thread):
# if self._recording_file is not None:
# self._recording_file.close()
# self._recording_file = None
print('close1')
self._close = True self._close = True
if len(self._recording_file_dict) > 0: if len(self._recording_file_dict) > 0:
for ch in self._data_db.keys(): for ch in self._data_db.keys():
if len(self._data_rl[ch]) > 0:
self._data_rl[ch].append(str(int(self._time_now)))
mes = ' '.join(self._data_rl[ch])
mqtt_thread[ch].on_message(mes)
self._data_rl[ch].clear()
self._send_data[ch] = False
if self._recording_file_dict[ch]._status: if self._recording_file_dict[ch]._status:
_data = ' '.join(self._data_db[ch]) _data = ' '.join(self._data_db[ch])
self._raw_save['data'][ch] = _data self._raw_save['data'][ch] = _data
+21
View File
@@ -117,6 +117,9 @@ class DataServer(SocketServer, DataAPI):
self.database_process = DataBaseProcess('data_server', self.log_verbose, self._queue_db, self._queue_ds_dict, self._queue_msg) self.database_process = DataBaseProcess('data_server', self.log_verbose, self._queue_db, self._queue_ds_dict, self._queue_msg)
self.database_process.start() self.database_process.start()
# self._no_data_total_duration = 0
# self._recv_memory_cost_time = 0
@logging_info @logging_info
def setup(self): def setup(self):
self._available_channel.clear() self._available_channel.clear()
@@ -643,6 +646,7 @@ class DataServer(SocketServer, DataAPI):
def whether_to_record(self, device): def whether_to_record(self, device):
# if user click "start", return True; if user click "stop", return False; # if user click "start", return True; if user click "stop", return False;
if device in self._configurations.keys() and self._configurations[device] is not None: if device in self._configurations.keys() and self._configurations[device] is not None:
# print(self._configurations.keys(), ',', device, datetime.now())
return True return True
else: else:
return False return False
@@ -651,6 +655,9 @@ class DataServer(SocketServer, DataAPI):
ret = False ret = False
sync = self.get_spi_obj() sync = self.get_spi_obj()
busy = sync.get_pin_busy()
print('pin_busy=', busy, device, datetime.now())
if sync.get_pin_mem_req() == sync.get_pin_ram_sel(): if sync.get_pin_mem_req() == sync.get_pin_ram_sel():
spi_data = sync.recv_memory(device) spi_data = sync.recv_memory(device)
signal = sync.get_pin_mem_req() signal = sync.get_pin_mem_req()
@@ -659,6 +666,7 @@ class DataServer(SocketServer, DataAPI):
else: else:
data = None data = None
print('data=None, mem_req!=ram_sel, [', sync.get_pin_mem_req(), ', ', sync.get_pin_ram_sel(), ']', device, datetime.now())
if data is not None: if data is not None:
if self._configurations[device].queue_flag: if self._configurations[device].queue_flag:
@@ -666,7 +674,17 @@ class DataServer(SocketServer, DataAPI):
print("q size= ", self._configurations[device]._queue_rec.qsize()) print("q size= ", self._configurations[device]._queue_rec.qsize())
self._configurations[device].put_rec_queue(data) self._configurations[device].put_rec_queue(data)
# self._no_data_total_duration = 0
ret = True ret = True
# else:
# time_diff = time() - self._recv_memory_cost_time
# self._no_data_total_duration += time_diff
# if self._no_data_total_duration > 1:
# print('data is None', device, datetime.now(), self._no_data_total_duration)
# print("sync.get_pin_mem_req() != sync.get_pin_ram_sel()")
# print("no~", sync.select, sync.get_pin_mem_req(), sync.get_pin_ram_sel(), datetime.now())
# print()
# self._recv_memory_cost_time = time()
return ret return ret
@@ -686,6 +704,9 @@ class DataServer(SocketServer, DataAPI):
self.mqtt_thread.publish('device_instruction', json_stringify(content), inter = True) self.mqtt_thread.publish('device_instruction', json_stringify(content), inter = True)
return True return True
def show_data(self, device):
self._configurations[device].put_rec_queue('show_data')
class DataRuntime(metaclass=abc.ABCMeta): class DataRuntime(metaclass=abc.ABCMeta):
__slots__ = ('_server', '_device', '_meta_file', '_data_format', __slots__ = ('_server', '_device', '_meta_file', '_data_format',
+26 -6
View File
@@ -819,12 +819,18 @@ class ControlServer(SocketServer, ControlServerAPI):
return True return True
@logging_info @logging_info
def device_battery(self) -> List[int]: def device_battery(self, device:int) -> List[int]:
device_list = self.device_manager.list_device() battery = {}
if len(device_list) > 0: if device == 'all':
battery_list = list(map(lambda x: self.device_manager.get_device(x).battery, device_list)) device_list = self.device_manager.list_device()
if len(device_list) > 0:
return battery_list battery = list(map(lambda x: {"device": x.memory_board, "battery":self.device_manager.get_device(x).battery}, device_list))
else:
battery = {
"device": device,
"battery": self.device_manager.get_device(device).battery
}
return battery
@logging_info @logging_info
def device_parent(self, device: int, content: Optional[str] = None) -> List[int]: def device_parent(self, device: int, content: Optional[str] = None) -> List[int]:
@@ -1015,6 +1021,7 @@ class ControlServer(SocketServer, ControlServerAPI):
@logging_info @logging_info
def run_project(self, project) -> bool: def run_project(self, project) -> bool:
if project is not None: if project is not None:
# print(project)
project = self._project_manager.create(project) project = self._project_manager.create(project)
self._project_manager.run_project(project) self._project_manager.run_project(project)
return project.as_json() return project.as_json()
@@ -1024,6 +1031,12 @@ class ControlServer(SocketServer, ControlServerAPI):
if project is not None: if project is not None:
self._project_manager.stop_project(project) self._project_manager.stop_project(project)
return True return True
@logging_info
def set_project(self, project, content) -> bool:
if project is not None:
self._project_manager.set_project(project, content)
return True
@logging_info @logging_info
def get_running_project(self) -> bool: def get_running_project(self) -> bool:
@@ -1339,6 +1352,13 @@ class ControlServer(SocketServer, ControlServerAPI):
def _hardware_send_test_set(self, options: Dict[str, str]) -> bool: def _hardware_send_test_set(self, options: Dict[str, str]) -> bool:
# TODO write options files # TODO write options files
return False return False
@logging_info
def show_device_data(self, device: int):
client = self.data_server.client()
if client is not None:
with client:
client.show_data(device)
class _RandomCrashThread(ServerThread): class _RandomCrashThread(ServerThread):
def __init__(self): def __init__(self):
+37 -28
View File
@@ -105,6 +105,9 @@ class RecordingProcess(Process):
self._mem_tailer_len = 6 self._mem_tailer_len = 6
self._single_data_len = self._elite_data_len + self._mem_header_len + self._mem_tailer_len self._single_data_len = self._elite_data_len + self._mem_header_len + self._mem_tailer_len
self._decoder = self.data_format()
self._start_time = time()
def ensure_data_format(self) -> DataDecodeFormat: def ensure_data_format(self) -> DataDecodeFormat:
if isinstance(self._data_format, (str, bytes)): if isinstance(self._data_format, (str, bytes)):
self._data_format = DataDecodeFormat.parse(self._data_format) self._data_format = DataDecodeFormat.parse(self._data_format)
@@ -133,9 +136,9 @@ class RecordingProcess(Process):
decoder._prev_data = self._prev_data decoder._prev_data = self._prev_data
decoder._prev_delta_time = self._prev_delta_time decoder._prev_delta_time = self._prev_delta_time
decoder._prev_time_stamp = self._prev_time_stamp decoder._prev_time_stamp = self._prev_time_stamp
# elif isinstance(decoder, I4V4Z4T4DataDecoder): elif isinstance(decoder, I4V4Z4T4DataDecoder):
# get cycle_time from meta file # get cycle_time from meta file
# decoder._mode = self._meta_file.configuration.MODE decoder._mode = self._meta_file.configuration.get_parameter('MODE')
# decoder._cycle_start_time = self._cycle_start_time # decoder._cycle_start_time = self._cycle_start_time
elif isinstance(decoder, NeuliveThreeOneDataDecoder): elif isinstance(decoder, NeuliveThreeOneDataDecoder):
# get amp_gain from meta file # get amp_gain from meta file
@@ -151,9 +154,8 @@ class RecordingProcess(Process):
decoder._prev_time_stamp = self._prev_time_stamp decoder._prev_time_stamp = self._prev_time_stamp
elif isinstance(decoder, EISZeroOneDataDecoder): elif isinstance(decoder, EISZeroOneDataDecoder):
# get amp_gain from meta file # get amp_gain from meta file
decoder._ac_amp = self._meta_file.configuration.get_parameter('AC_AMP')
decoder._mode = self._meta_file.configuration.get_parameter('MODE') decoder._mode = self._meta_file.configuration.get_parameter('MODE')
decoder._ac_amp = self._meta_file.configuration.get_parameter('AC_AMP')
decoder._freq_start = self._meta_file.configuration.get_parameter('FREQ_START') decoder._freq_start = self._meta_file.configuration.get_parameter('FREQ_START')
decoder._freq_stop = self._meta_file.configuration.get_parameter('FREQ_STOP') decoder._freq_stop = self._meta_file.configuration.get_parameter('FREQ_STOP')
@@ -183,6 +185,8 @@ class RecordingProcess(Process):
self.final_write() self.final_write()
self.is_closed = True self.is_closed = True
return False return False
elif q == 'show_data':
self._decoder._show_data = not self._decoder._show_data
else: else:
self.rec_update() self.rec_update()
self.sync_data(q) self.sync_data(q)
@@ -200,14 +204,13 @@ class RecordingProcess(Process):
self._isTimeOut = True self._isTimeOut = True
self._timer = current_time self._timer = current_time
decoder = self.data_format()
# print('sync_data') # print('sync_data')
# print('data',data) # print('data',data)
# print('server/data', self._prev_delta_time,self._prev_time_stamp, self._prev_data) # print('server/data', self._prev_delta_time,self._prev_time_stamp, self._prev_data)
if data is None or len(data) == 0: if data is None or len(data) == 0:
result = decoder.decode(b'') result = self._decoder.decode(b'')
if result is not None: if result is not None:
ret = result ret = result
@@ -221,26 +224,13 @@ class RecordingProcess(Process):
for offset, section in self._foreach_data_section(data): for offset, section in self._foreach_data_section(data):
# for section in self._neu_foreach_data_section(data): # for section in self._neu_foreach_data_section(data):
result = decoder.decode(section) result = self._decoder.decode(section)
# if self._isTimeOut: # if self._isTimeOut:
# try: # try:
# print('result: ', result.data_size) # print('result: ', result.data_size)
# except: # except:
# pass # pass
try:
if isinstance(decoder, I4V4Z4T4DataDecoder) or isinstance(decoder, EISZeroOneDataDecoder):
if decoder.isFinishMode is not None and decoder.isFinishMode() == 1:
self._queue_msg.put(['ds', self._device, 'interrupt'])
# content = {}
# content['header'] = 'device_instruction/0'
# content['device'] = result.device
# content['instruction'] = 'interrupt'
# self._mqtt_thread.publish('device_instruction',json_stringify(content), True)
# self.server.stop_sync(self.device)
except RuntimeError as e:
print(e)
if result is not None: if result is not None:
## ##
if len(self._mqtt_send_data_ch_level) == 0: if len(self._mqtt_send_data_ch_level) == 0:
@@ -257,9 +247,27 @@ class RecordingProcess(Process):
self._writer.channels_update(ret[0].channels()) self._writer.channels_update(ret[0].channels())
self._writer.write(ret, self._mqtt_send_data_ch_level) self._writer.write(ret, self._mqtt_send_data_ch_level)
# print('write time: ', time() - ctime1) # print('write time: ', time() - ctime1)
# print(ret) # print(ret)
try:
time_duration = self._meta_file.configuration.get_parameter('TIME_DURATION')
if time_duration and time_duration is not 0 and time() - self._start_time >= time_duration:
self._queue_msg.put(['ds', self._device, 'interrupt'])
return None
if isinstance(self._decoder, I4V4Z4T4DataDecoder) or isinstance(self._decoder, EISZeroOneDataDecoder):
if self._decoder.isFinishMode is not None and self._decoder.isFinishMode() == 1:
self._queue_msg.put(['ds', self._device, 'interrupt'])
return None
# content = {}
# content['header'] = 'device_instruction/0'
# content['device'] = result.device
# content['instruction'] = 'interrupt'
# self._mqtt_thread.publish('device_instruction',json_stringify(content), True)
# self.server.stop_sync(self.device)
except RuntimeError as e:
print(e)
del ret del ret
del data del data
return return
@@ -297,8 +305,8 @@ class RecordingProcess(Process):
self._last_cnt[7] = head_counter - 1 self._last_cnt[7] = head_counter - 1
last_data_cnt = self._last_cnt[7] last_data_cnt = self._last_cnt[7]
# dont save to section when head or id is wrong # dont save to section when head or id is wrong
if (head != 255 or device_id != device): if (head != 255 or device_id != device or head_counter > 255 or head_counter < 0):
save = False save = False
last_data_cnt = last_data_cnt + 1 last_data_cnt = last_data_cnt + 1
@@ -349,13 +357,14 @@ class RecordingProcess(Process):
if colum_total == 1: if colum_total == 1:
print('this ram data < 3 records, colum_total = ', colum_total) print('this ram data < 3 records, colum_total = ', colum_total)
print('raw_data[0]', raw_data[0]) print('raw_data[0]', list(raw_data[0]))
return save save = True
# return save
elif colum_total == 2: elif colum_total == 2:
print('this ram data < 3 records, colum_total = ', colum_total) print('this ram data < 3 records, colum_total = ', colum_total)
print('raw_data[0]', raw_data[0]) print('raw_data[0]', list(raw_data[0]))
print('raw_data[1]', raw_data[1]) print('raw_data[1]', list(raw_data[1]))
if (raw_data[col + 1][1] - raw_data[col][1] == 1) or (raw_data[col][1] == 255 and raw_data[col + 1][1] == 0): if (raw_data[col + 1][1] - raw_data[col][1] == 1) or (raw_data[col][1] == 255 and raw_data[col + 1][1] == 0):
save = True save = True
@@ -599,7 +608,7 @@ class RecordingProcess(Process):
def final_write(self): def final_write(self):
if self._writer is not None: if self._writer is not None:
return self._writer.close() return self._writer.close(self._mqtt_send_data_ch_level)
else: else:
return False return False
@@ -1,14 +1,15 @@
{ {
"name": "EliteZM15", "name": "Elite_BAT_1.0",
"version": "1.2.30", "version": "1.2.30",
"match_rule": { "match_rule": {
"local_name_pattern": "Elite.*", "local_name_pattern": "Elite.*",
"major_product_number": 0, "major_product_number": 0,
"minor_product_number": 2, "minor_product_number": 3,
"major_version_number": 1, "major_version_number": 1,
"minor_version_number": 6 "minor_version_number": 0
}, },
"constant": { "constant": {
"TIME_MAX": 100000,
"VOLT_MAX": 65536, "VOLT_MAX": 65536,
"Const_Current_Range": 1500001, "Const_Current_Range": 1500001,
"BLE_WRITE_MAX": 255 "BLE_WRITE_MAX": 255
@@ -17,7 +18,7 @@
"DPV_e_init": { "DPV_e_init": {
"description": "DPV initial voltage ", "description": "DPV initial voltage ",
"record_meta": true, "record_meta": true,
"initial":20000, "initial": 20000,
"domain": [ "domain": [
50001 50001
], ],
@@ -28,7 +29,7 @@
"DPV_e_final": { "DPV_e_final": {
"description": "DPV final voltage", "description": "DPV final voltage",
"record_meta": true, "record_meta": true,
"initial":30000, "initial": 30000,
"domain": [ "domain": [
50001 50001
], ],
@@ -39,7 +40,7 @@
"DPV_e_1": { "DPV_e_1": {
"description": "DPV voltage return 1", "description": "DPV voltage return 1",
"record_meta": true, "record_meta": true,
"initial":35000, "initial": 35000,
"domain": [ "domain": [
50001 50001
], ],
@@ -50,7 +51,7 @@
"DPV_e_2": { "DPV_e_2": {
"description": "DPV voltage return 2", "description": "DPV voltage return 2",
"record_meta": true, "record_meta": true,
"initial":15000, "initial": 15000,
"domain": [ "domain": [
50001 50001
], ],
@@ -61,7 +62,7 @@
"DPV_amp": { "DPV_amp": {
"description": "DPV pulse amplitude", "description": "DPV pulse amplitude",
"record_meta": true, "record_meta": true,
"initial":25125, "initial": 25125,
"domain": [ "domain": [
50001 50001
], ],
@@ -72,7 +73,7 @@
"DPV_pul_width": { "DPV_pul_width": {
"description": "DPV pulse width", "description": "DPV pulse width",
"record_meta": true, "record_meta": true,
"initial":50, "initial": 50,
"domain": [ "domain": [
1000001 1000001
], ],
@@ -83,7 +84,7 @@
"DPV_increment": { "DPV_increment": {
"description": "DPV increment", "description": "DPV increment",
"record_meta": true, "record_meta": true,
"initial":25025, "initial": 25025,
"domain": [ "domain": [
50001 50001
], ],
@@ -94,7 +95,7 @@
"DPV_step_time": { "DPV_step_time": {
"description": "DPV step time = time of one period", "description": "DPV step time = time of one period",
"record_meta": true, "record_meta": true,
"initial":500, "initial": 500,
"domain": [ "domain": [
1000001 1000001
], ],
@@ -105,7 +106,7 @@
"DPV_notify_rate": { "DPV_notify_rate": {
"description": "DPV sample rate", "description": "DPV sample rate",
"record_meta": true, "record_meta": true,
"initial":1000, "initial": 1000,
"domain": [ "domain": [
1001 1001
], ],
@@ -113,10 +114,24 @@
"expression": "VALUE" "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": { "DPV_curr_rec_min": {
"description": "DPV current recording period start", "description": "DPV current recording period start",
"record_meta": true, "record_meta": true,
"initial":25, "initial": 25,
"domain": [ "domain": [
101 101
], ],
@@ -127,7 +142,7 @@
"DPV_curr_rec_max": { "DPV_curr_rec_max": {
"description": "DPV current recording period end", "description": "DPV current recording period end",
"record_meta": true, "record_meta": true,
"initial":100, "initial": 100,
"domain": [ "domain": [
101 101
], ],
@@ -138,11 +153,8 @@
"DPV_pulse_option": { "DPV_pulse_option": {
"description": "Invert of pulse option", "description": "Invert of pulse option",
"record_meta": true, "record_meta": true,
"initial": 0, "domain": "bool",
"value": [ "initial": false
0,
1
]
}, },
"DPV_mode": { "DPV_mode": {
"description": "AUTO: 0 / ADVANCED: 1/ ENGINEERING: 2", "description": "AUTO: 0 / ADVANCED: 1/ ENGINEERING: 2",
@@ -157,16 +169,29 @@
"DPV_engineering_enable": { "DPV_engineering_enable": {
"description": "Engineering mode switch", "description": "Engineering mode switch",
"record_meta": true, "record_meta": true,
"initial": 0, "domain": "bool",
"value": [ "initial": false
0, },
1 "V_initial": {
] "description": "Pulse Mode Segment Voltage",
"record_meta": true,
"initial": [
50000,
25000,
25000,
25000
],
"domain": {
"list": [
50001
]
},
"value": "VALUE"
}, },
"V_initial_0": { "V_initial_0": {
"description": "Pulse Mode Segment Voltage 0", "description": "Pulse Mode Segment Voltage 0",
"record_meta": true, "record_meta": true,
"initial":50000, "initial": 50000,
"domain": [ "domain": [
50001 50001
], ],
@@ -177,7 +202,7 @@
"V_initial_1": { "V_initial_1": {
"description": "Pulse Mode Segment Voltage 1", "description": "Pulse Mode Segment Voltage 1",
"record_meta": true, "record_meta": true,
"initial":25000, "initial": 25000,
"domain": [ "domain": [
50001 50001
], ],
@@ -188,7 +213,7 @@
"V_initial_2": { "V_initial_2": {
"description": "Pulse Mode Segment Voltage 2", "description": "Pulse Mode Segment Voltage 2",
"record_meta": true, "record_meta": true,
"initial":25000, "initial": 25000,
"domain": [ "domain": [
50001 50001
], ],
@@ -199,7 +224,7 @@
"V_initial_3": { "V_initial_3": {
"description": "Pulse Mode Segment Voltage 3", "description": "Pulse Mode Segment Voltage 3",
"record_meta": true, "record_meta": true,
"initial":25000, "initial": 25000,
"domain": [ "domain": [
50001 50001
], ],
@@ -207,10 +232,26 @@
"expression": "VALUE" "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": { "t_pulse_0": {
"description": "Pulse Mode Segment Duration 0", "description": "Pulse Mode Segment Duration 0",
"record_meta": true, "record_meta": true,
"initial":750, "initial": 750,
"domain": [ "domain": [
1000001 1000001
], ],
@@ -221,7 +262,7 @@
"t_pulse_1": { "t_pulse_1": {
"description": "Pulse Mode Segment Duration 1", "description": "Pulse Mode Segment Duration 1",
"record_meta": true, "record_meta": true,
"initial":9250, "initial": 9250,
"domain": [ "domain": [
1000001 1000001
], ],
@@ -232,7 +273,7 @@
"t_pulse_2": { "t_pulse_2": {
"description": "Pulse Mode Segment Duration 2", "description": "Pulse Mode Segment Duration 2",
"record_meta": true, "record_meta": true,
"initial":1000, "initial": 1000,
"domain": [ "domain": [
1000001 1000001
], ],
@@ -243,7 +284,7 @@
"t_pulse_3": { "t_pulse_3": {
"description": "Pulse Mode Segment Duration 3", "description": "Pulse Mode Segment Duration 3",
"record_meta": true, "record_meta": true,
"initial":1000, "initial": 1000,
"domain": [ "domain": [
1000001 1000001
], ],
@@ -251,10 +292,40 @@
"expression": "VALUE" "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": { "CURR_REC_START_0": {
"description": "Pulse Mode Current Recording Period Start", "description": "Pulse Mode Current Recording Period Start",
"record_meta": true, "record_meta": true,
"initial":35, "initial": 35,
"domain": [ "domain": [
100 100
], ],
@@ -265,7 +336,7 @@
"CURR_REC_START_1": { "CURR_REC_START_1": {
"description": "Pulse Mode Current Recording Period Start", "description": "Pulse Mode Current Recording Period Start",
"record_meta": true, "record_meta": true,
"initial":35, "initial": 35,
"domain": [ "domain": [
100 100
], ],
@@ -276,7 +347,7 @@
"CURR_REC_START_2": { "CURR_REC_START_2": {
"description": "Pulse Mode Current Recording Period Start", "description": "Pulse Mode Current Recording Period Start",
"record_meta": true, "record_meta": true,
"initial":35, "initial": 35,
"domain": [ "domain": [
100 100
], ],
@@ -287,7 +358,7 @@
"CURR_REC_START_3": { "CURR_REC_START_3": {
"description": "Pulse Mode Current Recording Period Start", "description": "Pulse Mode Current Recording Period Start",
"record_meta": true, "record_meta": true,
"initial":35, "initial": 35,
"domain": [ "domain": [
100 100
], ],
@@ -298,7 +369,7 @@
"CURR_REC_END_0": { "CURR_REC_END_0": {
"description": "Pulse Mode Current Recording Period End", "description": "Pulse Mode Current Recording Period End",
"record_meta": true, "record_meta": true,
"initial":90, "initial": 90,
"domain": [ "domain": [
100 100
], ],
@@ -309,7 +380,7 @@
"CURR_REC_END_1": { "CURR_REC_END_1": {
"description": "Pulse Mode Current Recording Period End", "description": "Pulse Mode Current Recording Period End",
"record_meta": true, "record_meta": true,
"initial":99, "initial": 99,
"domain": [ "domain": [
100 100
], ],
@@ -320,7 +391,7 @@
"CURR_REC_END_2": { "CURR_REC_END_2": {
"description": "Pulse Mode Current Recording Period End", "description": "Pulse Mode Current Recording Period End",
"record_meta": true, "record_meta": true,
"initial":95, "initial": 95,
"domain": [ "domain": [
100 100
], ],
@@ -331,7 +402,7 @@
"CURR_REC_END_3": { "CURR_REC_END_3": {
"description": "Pulse Mode Current Recording Period End", "description": "Pulse Mode Current Recording Period End",
"record_meta": true, "record_meta": true,
"initial":95, "initial": 95,
"domain": [ "domain": [
100 100
], ],
@@ -339,6 +410,40 @@
"expression": "VALUE" "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": { "segment_ui_order_0": {
"description": "Pulse Mode Segment UI Order 0, value: segment ID + 1", "description": "Pulse Mode Segment UI Order 0, value: segment ID + 1",
"record_meta": true, "record_meta": true,
@@ -478,13 +583,14 @@
"Constant Current", "Constant Current",
"Cyclic Voltammetry", "Cyclic Voltammetry",
"Linear Sweep Voltammetry", "Linear Sweep Voltammetry",
"Chronoamperometric Graph", "Chronoamperometric",
"Cali DAC - test", "Cali DAC - test",
"Cali ADC - test", "Cali ADC - test",
"Dev Mode", "Dev Mode",
"Open Circuit Potential", "Open Circuit Potential",
"Pulse Sensing", "Pulse Sensing",
"Differential Pulse Voltammetry (DPV)" "Differential Pulse Voltammetry (DPV)",
"Chronopotentiometry"
] ]
}, },
"VOLT_ORIGIN": { "VOLT_ORIGIN": {
@@ -644,7 +750,7 @@
}, },
"CURRNET_LIMIT_VALUE": { "CURRNET_LIMIT_VALUE": {
"description": "Current value Setting", "description": "Current value Setting",
"initial":1500000, "initial": 1500000,
"domain": [ "domain": [
"Const_Current_Range" "Const_Current_Range"
], ],
@@ -685,6 +791,15 @@
"expression": "VALUE" "expression": "VALUE"
} }
}, },
"CC_CP_SPEED": {
"description": "charge speed for CC and CP mode",
"initial": 1,
"value": [
"low",
"normal",
"high"
]
},
"ADC_LEVEL_I_15": { "ADC_LEVEL_I_15": {
"description": "ADC level", "description": "ADC level",
"record_meta": true, "record_meta": true,
@@ -762,6 +877,17 @@
"s", "s",
"ms" "ms"
] ]
},
"TIME_DURATION": {
"description": "Run duration",
"record_meta": true,
"initial": 0,
"domain": [
"TIME_MAX"
],
"value": {
"expression": "VALUE"
}
} }
}, },
"instruction": { "instruction": {
@@ -812,7 +938,8 @@
"7": "set_adc_gain_I", "7": "set_adc_gain_I",
"8": "set_adc_gain_I", "8": "set_adc_gain_I",
"9": "set_adc_gain_I", "9": "set_adc_gain_I",
"13": "set_adc_gain_I" "13": "set_adc_gain_I",
"16": "set_adc_gain_I"
} }
}, },
{ {
@@ -827,7 +954,8 @@
"7": "set_adc_gain_Vin", "7": "set_adc_gain_Vin",
"8": "set_adc_gain_Vin", "8": "set_adc_gain_Vin",
"9": "set_adc_gain_Vin", "9": "set_adc_gain_Vin",
"13": "set_adc_gain_Vin" "13": "set_adc_gain_Vin",
"16": "set_adc_gain_Vin"
} }
}, },
{ {
@@ -845,7 +973,8 @@
"9": "curve_const_vscan", "9": "curve_const_vscan",
"13": "curve_ocp", "13": "curve_ocp",
"14": "curve_pulse_sensing", "14": "curve_pulse_sensing",
"15": "curve_dpv" "15": "curve_dpv",
"16": "curve_cp"
} }
}, },
{ {
@@ -1043,6 +1172,7 @@
"vb": "Const_Current_value", "vb": "Const_Current_value",
"vc": "VOLTSTOP_MAX", "vc": "VOLTSTOP_MAX",
"vd": "VOLTSTOP_MIN", "vd": "VOLTSTOP_MIN",
"ve": "CC_CP_SPEED",
"pa": "ADC_LEVEL_I_15", "pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15", "pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15", "pc": "DAC_LEVEL_V_OUT_15",
@@ -1054,7 +1184,31 @@
"B>va;4B>vb;2B>vc;2B>vd;", "B>va;4B>vb;2B>vc;2B>vd;",
"4b>pa;4b>pb;", "4b>pa;4b>pb;",
"4b>pc;4b>pd;", "4b>pc;4b>pd;",
"2B>pe" "2B>pe;",
"4b>0b0001;4b>ve"
]
},
"curve_cp": {
"type": "RIS",
"parameter": {
"va": "Charge",
"vb": "Const_Current_value",
"vc": "VOLTSTOP_MAX",
"vd": "VOLTSTOP_MIN",
"ve": "CC_CP_SPEED",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE"
},
"data": [
"X0C;",
"B>va;4B>vb;2B>vc;2B>vd;",
"4b>pa;4b>pb;",
"4b>pc;4b>pd;",
"2B>pe;",
"4b>0b0000;4b>ve"
] ]
}, },
"curve_cv3": { "curve_cv3": {
@@ -1180,39 +1334,39 @@
}, },
"curve_pulse_sensing": [ "curve_pulse_sensing": [
{ {
"expression": "segment_ui_order_0", "expression": "segment_ui_order[0]",
"when": { "when": {
"1": "pul_sen_segment_0", "0": "pul_sen_segment_0",
"2": "pul_sen_segment_1", "1": "pul_sen_segment_1",
"3": "pul_sen_segment_2", "2": "pul_sen_segment_2",
"4": "pul_sen_segment_3" "3": "pul_sen_segment_3"
} }
}, },
{ {
"expression": "segment_ui_order_1", "expression": "segment_ui_order[1]",
"when": { "when": {
"1": "pul_sen_segment_0", "0": "pul_sen_segment_0",
"2": "pul_sen_segment_1", "1": "pul_sen_segment_1",
"3": "pul_sen_segment_2", "2": "pul_sen_segment_2",
"4": "pul_sen_segment_3" "3": "pul_sen_segment_3"
} }
}, },
{ {
"expression": "segment_ui_order_2", "expression": "segment_ui_order[2]",
"when": { "when": {
"1": "pul_sen_segment_0", "0": "pul_sen_segment_0",
"2": "pul_sen_segment_1", "1": "pul_sen_segment_1",
"3": "pul_sen_segment_2", "2": "pul_sen_segment_2",
"4": "pul_sen_segment_3" "3": "pul_sen_segment_3"
} }
}, },
{ {
"expression": "segment_ui_order_3", "expression": "segment_ui_order[3]",
"when": { "when": {
"1": "pul_sen_segment_0", "0": "pul_sen_segment_0",
"2": "pul_sen_segment_1", "1": "pul_sen_segment_1",
"3": "pul_sen_segment_2", "2": "pul_sen_segment_2",
"4": "pul_sen_segment_3" "3": "pul_sen_segment_3"
} }
}, },
"pul_sen_start" "pul_sen_start"
@@ -1236,11 +1390,11 @@
"pul_sen_segment_0": { "pul_sen_segment_0": {
"type": "RIS", "type": "RIS",
"parameter": { "parameter": {
"va": "V_initial_0", "va": "V_initial[0]",
"vb": "t_pulse_0", "vb": "t_pulse[0]",
"vc": "CURR_REC_START_0", "vc": "CURR_REC[0][0]",
"vd": "CURR_REC_END_0", "vd": "CURR_REC[0][1]",
"ve": "segment_order_0 - 1", "ve": "segment_order.index(segment_order[0])",
"pa": "ADC_LEVEL_I_15", "pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15", "pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15", "pc": "DAC_LEVEL_V_OUT_15",
@@ -1256,11 +1410,11 @@
"pul_sen_segment_1": { "pul_sen_segment_1": {
"type": "RIS", "type": "RIS",
"parameter": { "parameter": {
"va": "V_initial_1", "va": "V_initial[1]",
"vb": "t_pulse_1", "vb": "t_pulse[1]",
"vc": "CURR_REC_START_1", "vc": "CURR_REC[1][0]",
"vd": "CURR_REC_END_1", "vd": "CURR_REC[1][1]",
"ve": "segment_order_1 - 1", "ve": "segment_order.index(segment_order[1])",
"pa": "ADC_LEVEL_I_15", "pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15", "pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15", "pc": "DAC_LEVEL_V_OUT_15",
@@ -1276,11 +1430,11 @@
"pul_sen_segment_2": { "pul_sen_segment_2": {
"type": "RIS", "type": "RIS",
"parameter": { "parameter": {
"va": "V_initial_2", "va": "V_initial[2]",
"vb": "t_pulse_2", "vb": "t_pulse[2]",
"vc": "CURR_REC_START_2", "vc": "CURR_REC[2][0]",
"vd": "CURR_REC_END_2", "vd": "CURR_REC[2][1]",
"ve": "segment_order_2 - 1", "ve": "segment_order.index(segment_order[2])",
"pa": "ADC_LEVEL_I_15", "pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15", "pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15", "pc": "DAC_LEVEL_V_OUT_15",
@@ -1296,11 +1450,11 @@
"pul_sen_segment_3": { "pul_sen_segment_3": {
"type": "RIS", "type": "RIS",
"parameter": { "parameter": {
"va": "V_initial_3", "va": "V_initial[3]",
"vb": "t_pulse_3", "vb": "t_pulse[3]",
"vc": "CURR_REC_START_3", "vc": "CURR_REC[3][0]",
"vd": "CURR_REC_END_3", "vd": "CURR_REC[3][1]",
"ve": "segment_order_3 - 1", "ve": "segment_order.index(segment_order[3])",
"pa": "ADC_LEVEL_I_15", "pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15", "pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15", "pc": "DAC_LEVEL_V_OUT_15",
@@ -1313,9 +1467,7 @@
"2B>va;4B>vb;1B>vc;1B>vd;1B>ve" "2B>va;4B>vb;1B>vc;1B>vd;1B>ve"
] ]
}, },
"curve_dpv": [
"curve_dpv":[
{ {
"expression": "DPV_mode", "expression": "DPV_mode",
"when": { "when": {
@@ -1363,8 +1515,8 @@
"parameter": { "parameter": {
"va": "DPV_step_time", "va": "DPV_step_time",
"vb": "DPV_notify_rate", "vb": "DPV_notify_rate",
"vc": "DPV_curr_rec_min", "vc": "DPV_curr_rec[0]",
"vd": "DPV_curr_rec_max" "vd": "DPV_curr_rec[1]"
}, },
"data": [ "data": [
"1X0E;", "1X0E;",
@@ -1388,9 +1540,6 @@
"4b>pc;4b>pd" "4b>pc;4b>pd"
] ]
}, },
"dpv_advanced_mode": [ "dpv_advanced_mode": [
"dpv_advanced_mode_ins_1", "dpv_advanced_mode_ins_1",
"dpv_advanced_mode_ins_2", "dpv_advanced_mode_ins_2",
@@ -1430,8 +1579,8 @@
"parameter": { "parameter": {
"va": "DPV_step_time", "va": "DPV_step_time",
"vb": "DPV_notify_rate", "vb": "DPV_notify_rate",
"vc": "DPV_curr_rec_min", "vc": "DPV_curr_rec[0]",
"vd": "DPV_curr_rec_max" "vd": "DPV_curr_rec[1]"
}, },
"data": [ "data": [
"1X10;", "1X10;",
@@ -1484,18 +1633,6 @@
"dpv_engineering_mode_advanced": [ "dpv_engineering_mode_advanced": [
"dpv_advanced_mode" "dpv_advanced_mode"
], ],
"VIS_CC_ZERO": [
"_data_format('I4V4Z4T4')",
"_disable_cache(False)",
"_notify(True)",
"set_adc_gain_I",
"set_adc_gain_Vin",
"VIS_CC_ZERO",
"_sync(True)",
"VIS_STI"
],
"ble_instru_send": [ "ble_instru_send": [
"ble_write", "ble_write",
"_cdr('20X>ADC_VALUE_I')" "_cdr('20X>ADC_VALUE_I')"
@@ -1526,6 +1663,4 @@
] ]
} }
} }
} }
@@ -1,5 +1,5 @@
{ {
"name": "EliteZM02", "name": "Elite_EDC_1.4",
"version": "1.2.30", "version": "1.2.30",
"match_rule": { "match_rule": {
"local_name_pattern": "Elite.*", "local_name_pattern": "Elite.*",
@@ -492,14 +492,6 @@
"1XC0;1X02;4B>ve;2B>vf;4B>vg;B>cn" "1XC0;1X02;4B>ve;2B>vf;4B>vg;B>cn"
] ]
}, },
"VIS_CC_ZERO": [
"_data_format('I4V4Z4T4')",
"_disable_cache(False)",
"_notify(True)",
"VIS_CC_ZERO",
"_sync(True)",
"VIS_STI"
],
"curve_cv3_high_cycle": { "curve_cv3_high_cycle": {
"type": "RIS", "type": "RIS",
"parameter": { "parameter": {
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,5 +1,5 @@
{ {
"name": "EliteEIS", "name": "Elite_EIS_1.0",
"version": "1.2.30", "version": "1.2.30",
"match_rule": { "match_rule": {
"local_name_pattern": "Elite.*", "local_name_pattern": "Elite.*",
@@ -11,9 +11,21 @@
"constant": { "constant": {
"FREQ_MAX": 4294967296, "FREQ_MAX": 4294967296,
"VOLT_MAX": 65536, "VOLT_MAX": 65536,
"BLE_WRITE_MAX": 255 "BLE_WRITE_MAX": 255,
"TIME_MAX": 100000
}, },
"parameters": { "parameters": {
"TIME_DURATION": {
"description": "Run duration",
"record_meta": true,
"initial": 0,
"domain": [
"TIME_MAX"
],
"value": {
"expression": "VALUE"
}
},
"CHANNEL": { "CHANNEL": {
"derzteription": "record channels", "derzteription": "record channels",
"record_meta": true, "record_meta": true,
@@ -48,20 +60,35 @@
"description": "working mode", "description": "working mode",
"record_meta": true, "record_meta": true,
"value": [ "value": [
"EIS CURVE", "EIS CURVE",
"Cyclic Voltammetry", "Cyclic Voltammetry",
"Dev Mode" "Chronoamperometric",
"Dev Mode"
] ]
}, },
"FREQ": {
"description": "DPV current recording period start",
"record_meta": true,
"initial": [
13422819,
7
],
"domain": {
"list": [
"FREQ_MAX"
]
},
"value": "VALUE"
},
"FREQ_START": { "FREQ_START": {
"description": "Start of Freq Scan", "description": "Start of Freq Scan",
"record_meta": true, "record_meta": true,
"initial": 13422819, "initial": 13422819,
"domain": [ "domain": [
"FREQ_MAX" "FREQ_MAX"
], ],
"value": { "value": {
"expression": "VALUE" "expression": "VALUE"
} }
}, },
"FREQ_STOP": { "FREQ_STOP": {
@@ -69,10 +96,10 @@
"record_meta": true, "record_meta": true,
"initial": 7, "initial": 7,
"domain": [ "domain": [
"FREQ_MAX" "FREQ_MAX"
], ],
"value": { "value": {
"expression": "VALUE" "expression": "VALUE"
} }
}, },
"DELAY": { "DELAY": {
@@ -91,21 +118,21 @@
"record_meta": true, "record_meta": true,
"initial": 8, "initial": 8,
"value": [ "value": [
2, 2,
4, 4,
8, 8,
16 16
] ]
}, },
"DC_BIAS": { "DC_BIAS": {
"description": "DC voltage bias in mV", "description": "DC voltage bias in mV",
"record_meta": true, "record_meta": true,
"initial": 15000, "initial": 25000,
"domain": [ "domain": [
35001 "VOLT_MAX"
], ],
"value": { "value": {
"expression": "VALUE" "expression": "VALUE"
} }
}, },
"AC_AMP": { "AC_AMP": {
@@ -113,7 +140,7 @@
"record_meta": true, "record_meta": true,
"initial": 25, "initial": 25,
"domain": [ "domain": [
2048 2048
] ]
}, },
"SCALE": { "SCALE": {
@@ -121,8 +148,8 @@
"record_meta": true, "record_meta": true,
"initial": 0, "initial": 0,
"value": [ "value": [
0, 0,
1 1
] ]
}, },
"PPD": { "PPD": {
@@ -130,7 +157,7 @@
"record_meta": true, "record_meta": true,
"initial": 10, "initial": 10,
"domain": [ "domain": [
11 11
] ]
}, },
"RTIA": { "RTIA": {
@@ -138,11 +165,11 @@
"record_meta": true, "record_meta": true,
"initial": 4, "initial": 4,
"value": [ "value": [
0, 0,
1, 1,
2, 2,
3, 3,
4 4
] ]
}, },
"ADC_VALUE_I": { "ADC_VALUE_I": {
@@ -154,10 +181,10 @@
"record_meta": true, "record_meta": true,
"initial": 10000, "initial": 10000,
"domain": [ "domain": [
100001 100001
], ],
"value": { "value": {
"expression": "VALUE" "expression": "VALUE"
} }
}, },
"CTRL_HIGH_Z_15": { "CTRL_HIGH_Z_15": {
@@ -239,12 +266,23 @@
"expression": "VALUE" "expression": "VALUE"
} }
}, },
"VOLT_VSCAN": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"BLE_WRITE": { "BLE_WRITE": {
"description": "send msg to elite", "description": "send msg to elite",
"domain": { "domain": {
"list": [ "list": [
"BLE_WRITE_MAX" "BLE_WRITE_MAX"
] ]
}, },
"initial": "[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]", "initial": "[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]",
"value": "VALUE" "value": "VALUE"
@@ -259,7 +297,7 @@
{ {
"expression": "MODE", "expression": "MODE",
"when": { "when": {
"*": "start_data" "*": "start_data"
} }
} }
], ],
@@ -269,20 +307,23 @@
{ {
"expression": "MODE", "expression": "MODE",
"when": { "when": {
"1": "set_adc_gain_I" "1": "set_adc_gain_I",
"2": "set_adc_gain_I"
} }
}, },
{ {
"expression": "MODE", "expression": "MODE",
"when": { "when": {
"1": "set_adc_gain_Vin" "1": "set_adc_gain_Vin",
"2": "set_adc_gain_Vin"
} }
}, },
{ {
"expression": "MODE", "expression": "MODE",
"when": { "when": {
"0": "curve_eis", "0": "curve_eis",
"1": "curve_cv3" "1": "curve_cv3",
"2": "curve_const_vscan"
} }
}, },
{ {
@@ -339,8 +380,8 @@
"curve_eis": { "curve_eis": {
"type": "RIS", "type": "RIS",
"parameter": { "parameter": {
"fa": "FREQ_START", "fa": "FREQ[0]",
"fb": "FREQ_STOP", "fb": "FREQ[1]",
"dp": "DELAY", "dp": "DELAY",
"dc": "DC_BIAS", "dc": "DC_BIAS",
"am": "AC_AMP", "am": "AC_AMP",
@@ -356,8 +397,8 @@
"curve_eis_para2": { "curve_eis_para2": {
"type": "RIS", "type": "RIS",
"parameter": { "parameter": {
"fa": "FREQ_START", "fa": "FREQ[0]",
"fb": "FREQ_STOP", "fb": "FREQ[1]",
"dp": "DELAY", "dp": "DELAY",
"dc": "DC_BIAS", "dc": "DC_BIAS",
"am": "AC_AMP", "am": "AC_AMP",
@@ -398,14 +439,23 @@
"1XD2;1X02;4B>ve;2B>vf;2B>cn" "1XD2;1X02;4B>ve;2B>vf;2B>cn"
] ]
}, },
"VIS_CC_ZERO": [ "curve_const_vscan": {
"_data_format('EISZeroOne')", "type": "RIS",
"_disable_cache(False)", "parameter": {
"_notify(True)", "va": "VOLT_VSCAN",
"VIS_CC_ZERO", "pa": "ADC_LEVEL_I_15",
"_sync(True)", "pb": "ADC_LEVEL_V_IN_15",
"VIS_STI" "pd": "CTRL_HIGH_Z_15",
], "pe": "SAMPLE_RATE"
},
"data": [
"1XD3;",
"2B>va;",
"4b>pa;4b>pb;",
"4b>0;4b>pd;",
"2B>pe"
]
},
"ble_instru_send": [ "ble_instru_send": [
"ble_write", "ble_write",
"_cdr('20X>ADC_VALUE_I')" "_cdr('20X>ADC_VALUE_I')"
@@ -430,4 +480,4 @@
"_cdr('20X>ADC_VALUE_I')" "_cdr('20X>ADC_VALUE_I')"
] ]
} }
} }
@@ -0,0 +1,483 @@
{
"name": "Elite_EIS_1.1",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite.*",
"major_product_number": 0,
"minor_product_number": 4,
"major_version_number": 1,
"minor_version_number": 1
},
"constant": {
"FREQ_MAX": 4294967296,
"VOLT_MAX": 65536,
"BLE_WRITE_MAX": 255,
"TIME_MAX": 100000
},
"parameters": {
"TIME_DURATION": {
"description": "Run duration",
"record_meta": true,
"initial": 0,
"domain": [
"TIME_MAX"
],
"value": {
"expression": "VALUE"
}
},
"CHANNEL": {
"derzteription": "record channels",
"record_meta": true,
"domain": "property",
"value": "[0, 1, 2]"
},
"CHANNEL_LABEL": {
"description": "channel label",
"record_meta": true,
"domain": "property",
"value": "['current', 'voltage', 'impedance']"
},
"SAMPLE_RATE": {
"description": "data sampling rate",
"record_meta": true,
"initial": 1000,
"domain": [
1001
],
"value": {
"expression": "VALUE"
},
"on_change": "set_sample_rate"
},
"AMP_GAIN": {
"description": "amp gain",
"record_meta": true,
"domain": "constant",
"value": 1
},
"MODE": {
"description": "working mode",
"record_meta": true,
"value": [
"EIS CURVE",
"Cyclic Voltammetry",
"Chronoamperometric",
"Dev Mode"
]
},
"FREQ": {
"description": "DPV current recording period start",
"record_meta": true,
"initial": [
13333333,
7
],
"domain": {
"list": [
"FREQ_MAX"
]
},
"value": "VALUE"
},
"FREQ_START": {
"description": "Start of Freq Scan",
"record_meta": true,
"initial": 13422819,
"domain": [
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"FREQ_STOP": {
"description": "End of Freq Scan",
"record_meta": true,
"initial": 7,
"domain": [
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"DELAY": {
"description": "Wait x peroid before start taking measurements",
"record_meta": true,
"initial": 0,
"domain": [
101
],
"value": {
"expression": "VALUE"
}
},
"AVERAGE_NUM": {
"description": "Number of sample used for average funciton",
"record_meta": true,
"initial": 8,
"value": [
2,
4,
8,
16
]
},
"DC_BIAS": {
"description": "DC voltage bias in mV",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"AC_AMP": {
"description": "AC Amplitude in mV",
"record_meta": true,
"initial": 25,
"domain": [
2048
]
},
"SCALE": {
"description": "Point spacing pattern",
"record_meta": true,
"initial": 0,
"value": [
0,
1
]
},
"PPD": {
"description": "Point per decades",
"record_meta": true,
"initial": 10,
"domain": [
11
]
},
"RTIA": {
"description": "High speed tia gain",
"record_meta": true,
"initial": 4,
"value": [
0,
1,
2,
3,
4
]
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"Scan_Rate": {
"description": "Voltage Scan Rate",
"record_meta": true,
"initial": 10000,
"domain": [
100001
],
"value": {
"expression": "VALUE"
}
},
"CTRL_HIGH_Z_15": {
"description": "ctrl highZ level",
"record_meta": true,
"initial": 1,
"value": [
"On",
"Off"
],
"on_change": "set_ctrl_highZ"
},
"ADC_LEVEL_I_15": {
"description": "ADC level",
"record_meta": true,
"initial": 4,
"value": [
"0",
"1",
"2",
"3",
"auto"
],
"on_change": "set_adc_gain_I"
},
"ADC_LEVEL_V_IN_15": {
"description": "ADC level",
"record_meta": true,
"initial": 3,
"value": [
"0",
"1",
"2",
"auto"
],
"on_change": "set_adc_gain_Vin"
},
"VOLT_INITIAL": {
"description": "Initial Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"VOLT_MAX": {
"description": "Max Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"VOLT_MIN": {
"description": "Min Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"CYCLE_NUMBER": {
"description": "CV cycle number",
"record_meta": true,
"initial": 1,
"domain": [
65536
],
"value": {
"expression": "VALUE"
}
},
"VOLT_VSCAN": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"BLE_WRITE": {
"description": "send msg to elite",
"domain": {
"list": [
"BLE_WRITE_MAX"
]
},
"initial": "[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]",
"value": "VALUE"
},
"BLE_READ": {
"description": "receive msg from elite",
"domain": "int"
}
},
"instruction": {
"start": [
{
"expression": "MODE",
"when": {
"*": "start_data"
}
}
],
"start_data": [
"data_format_cali",
"_notify(True)",
{
"expression": "MODE",
"when": {
"1": "set_adc_gain_I",
"2": "set_adc_gain_I"
}
},
{
"expression": "MODE",
"when": {
"1": "set_adc_gain_Vin",
"2": "set_adc_gain_Vin"
}
},
{
"expression": "MODE",
"when": {
"0": "curve_eis",
"1": "curve_cv3",
"2": "curve_const_vscan"
}
},
{
"expression": "MODE",
"when": {
"0": "curve_eis_para2",
"1": "curve_cv3_para2"
}
},
"_sync(True)",
"VIS_STI"
],
"data_format": [
"_data_format('EISZeroOne')",
{
"expression": "MODE",
"when": {
"0": "_disable_cache(True)",
"1": "_disable_cache(True)",
"*": "_disable_cache(False)"
}
}
],
"data_format_cali": [
"_data_format_cali('EISZeroOne')"
],
"set_sample_rate": {
"type": "RIS",
"parameter": {
"va": "SAMPLE_RATE"
},
"data": [
"XE0;2B>va"
]
},
"set_adc_gain_I": {
"type": "RIS",
"data": [
"XE1;X05;B>ADC_LEVEL_I_15"
]
},
"set_adc_gain_Vin": {
"type": "RIS",
"data": [
"XE1;X06;B>ADC_LEVEL_V_IN_15"
]
},
"set_ctrl_highZ": {
"type": "RIS",
"data": [
"XE1;X03;B>CTRL_HIGH_Z_15"
]
},
"curve_eis": {
"type": "RIS",
"parameter": {
"fa": "FREQ[0]",
"fb": "FREQ[1]",
"dp": "DELAY",
"dc": "DC_BIAS",
"am": "AC_AMP",
"an": "AVERAGE_NUM",
"rt": "RTIA",
"pp": "PPD",
"sp": "SCALE"
},
"data": [
"1XD1;1X01;4B>fa;4B>fb;2B>dp"
]
},
"curve_eis_para2": {
"type": "RIS",
"parameter": {
"fa": "FREQ[0]",
"fb": "FREQ[1]",
"dp": "DELAY",
"dc": "DC_BIAS",
"am": "AC_AMP",
"an": "AVERAGE_NUM",
"rt": "RTIA",
"pp": "PPD",
"sp": "SCALE"
},
"data": [
"1XD1;1X02;2B>dc;2B>am;B>an;B>rt;2B>pp;B>sp"
]
},
"curve_cv3": {
"type": "RIS",
"parameter": {
"va": "VOLT_INITIAL",
"vb": "VOLT_MAX",
"vc": "VOLT_MIN",
"ve": "Scan_Rate",
"vf": "SAMPLE_RATE",
"cn": "CYCLE_NUMBER"
},
"data": [
"1XD2;1X01;2B>va;2B>vb;2B>vc;"
]
},
"curve_cv3_para2": {
"type": "RIS",
"parameter": {
"va": "VOLT_INITIAL",
"vb": "VOLT_MAX",
"vc": "VOLT_MIN",
"ve": "Scan_Rate",
"vf": "SAMPLE_RATE",
"cn": "CYCLE_NUMBER"
},
"data": [
"1XD2;1X02;4B>ve;2B>vf;2B>cn"
]
},
"curve_const_vscan": {
"type": "RIS",
"parameter": {
"va": "VOLT_VSCAN",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE"
},
"data": [
"1XD3;",
"2B>va;",
"4b>pa;4b>pb;",
"4b>0;4b>pd;",
"2B>pe"
]
},
"ble_instru_send": [
"ble_write",
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "RIS",
"data": [
"XFF;",
"1B>BLE_WRITE[0];1B>BLE_WRITE[1];1B>BLE_WRITE[2];1B>BLE_WRITE[3];",
"1B>BLE_WRITE[4];1B>BLE_WRITE[5];1B>BLE_WRITE[6];1B>BLE_WRITE[7];",
"1B>BLE_WRITE[8];1B>BLE_WRITE[9];1B>BLE_WRITE[10];1B>BLE_WRITE[11];",
"1B>BLE_WRITE[12];1B>BLE_WRITE[13];1B>BLE_WRITE[14];1B>BLE_WRITE[15];",
"1B>BLE_WRITE[16];"
]
},
"dev_version": [
"CIS_VERSION",
"_cdr('20X>ADC_VALUE_I')"
],
"dev_battery": [
"CIS_VOLT",
"_cdr('20X>ADC_VALUE_I')"
]
}
}
@@ -0,0 +1,483 @@
{
"name": "Elite_EIS_MINI_1.0",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite.*",
"major_product_number": 0,
"minor_product_number": 4,
"major_version_number": 1,
"minor_version_number": 2
},
"constant": {
"FREQ_MAX": 4294967296,
"VOLT_MAX": 65536,
"BLE_WRITE_MAX": 255,
"TIME_MAX": 100000
},
"parameters": {
"TIME_DURATION": {
"description": "Run duration",
"record_meta": true,
"initial": 0,
"domain": [
"TIME_MAX"
],
"value": {
"expression": "VALUE"
}
},
"CHANNEL": {
"derzteription": "record channels",
"record_meta": true,
"domain": "property",
"value": "[0, 1, 2]"
},
"CHANNEL_LABEL": {
"description": "channel label",
"record_meta": true,
"domain": "property",
"value": "['current', 'voltage', 'impedance']"
},
"SAMPLE_RATE": {
"description": "data sampling rate",
"record_meta": true,
"initial": 1000,
"domain": [
1001
],
"value": {
"expression": "VALUE"
},
"on_change": "set_sample_rate"
},
"AMP_GAIN": {
"description": "amp gain",
"record_meta": true,
"domain": "constant",
"value": 1
},
"MODE": {
"description": "working mode",
"record_meta": true,
"value": [
"EIS CURVE",
"Cyclic Voltammetry",
"Chronoamperometric",
"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,
"initial": 13422819,
"domain": [
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"FREQ_STOP": {
"description": "End of Freq Scan",
"record_meta": true,
"initial": 7,
"domain": [
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"DELAY": {
"description": "Wait x peroid before start taking measurements",
"record_meta": true,
"initial": 0,
"domain": [
101
],
"value": {
"expression": "VALUE"
}
},
"AVERAGE_NUM": {
"description": "Number of sample used for average funciton",
"record_meta": true,
"initial": 8,
"value": [
2,
4,
8,
16
]
},
"DC_BIAS": {
"description": "DC voltage bias in mV",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"AC_AMP": {
"description": "AC Amplitude in mV",
"record_meta": true,
"initial": 25,
"domain": [
2048
]
},
"SCALE": {
"description": "Point spacing pattern",
"record_meta": true,
"initial": 0,
"value": [
0,
1
]
},
"PPD": {
"description": "Point per decades",
"record_meta": true,
"initial": 10,
"domain": [
11
]
},
"RTIA": {
"description": "High speed tia gain",
"record_meta": true,
"initial": 4,
"value": [
0,
1,
2,
3,
4
]
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"Scan_Rate": {
"description": "Voltage Scan Rate",
"record_meta": true,
"initial": 10000,
"domain": [
100001
],
"value": {
"expression": "VALUE"
}
},
"CTRL_HIGH_Z_15": {
"description": "ctrl highZ level",
"record_meta": true,
"initial": 1,
"value": [
"On",
"Off"
],
"on_change": "set_ctrl_highZ"
},
"ADC_LEVEL_I_15": {
"description": "ADC level",
"record_meta": true,
"initial": 4,
"value": [
"0",
"1",
"2",
"3",
"auto"
],
"on_change": "set_adc_gain_I"
},
"ADC_LEVEL_V_IN_15": {
"description": "ADC level",
"record_meta": true,
"initial": 3,
"value": [
"0",
"1",
"2",
"auto"
],
"on_change": "set_adc_gain_Vin"
},
"VOLT_INITIAL": {
"description": "Initial Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"VOLT_MAX": {
"description": "Max Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"VOLT_MIN": {
"description": "Min Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"CYCLE_NUMBER": {
"description": "CV cycle number",
"record_meta": true,
"initial": 1,
"domain": [
65536
],
"value": {
"expression": "VALUE"
}
},
"VOLT_VSCAN": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"BLE_WRITE": {
"description": "send msg to elite",
"domain": {
"list": [
"BLE_WRITE_MAX"
]
},
"initial": "[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]",
"value": "VALUE"
},
"BLE_READ": {
"description": "receive msg from elite",
"domain": "int"
}
},
"instruction": {
"start": [
{
"expression": "MODE",
"when": {
"*": "start_data"
}
}
],
"start_data": [
"data_format_cali",
"_notify(True)",
{
"expression": "MODE",
"when": {
"1": "set_adc_gain_I",
"2": "set_adc_gain_I"
}
},
{
"expression": "MODE",
"when": {
"1": "set_adc_gain_Vin",
"2": "set_adc_gain_Vin"
}
},
{
"expression": "MODE",
"when": {
"0": "curve_eis",
"1": "curve_cv3",
"2": "curve_const_vscan"
}
},
{
"expression": "MODE",
"when": {
"0": "curve_eis_para2",
"1": "curve_cv3_para2"
}
},
"_sync(True)",
"VIS_STI"
],
"data_format": [
"_data_format('EISZeroOne')",
{
"expression": "MODE",
"when": {
"0": "_disable_cache(True)",
"1": "_disable_cache(True)",
"*": "_disable_cache(False)"
}
}
],
"data_format_cali": [
"_data_format_cali('EISZeroOne')"
],
"set_sample_rate": {
"type": "RIS",
"parameter": {
"va": "SAMPLE_RATE"
},
"data": [
"XE0;2B>va"
]
},
"set_adc_gain_I": {
"type": "RIS",
"data": [
"XE1;X05;B>ADC_LEVEL_I_15"
]
},
"set_adc_gain_Vin": {
"type": "RIS",
"data": [
"XE1;X06;B>ADC_LEVEL_V_IN_15"
]
},
"set_ctrl_highZ": {
"type": "RIS",
"data": [
"XE1;X03;B>CTRL_HIGH_Z_15"
]
},
"curve_eis": {
"type": "RIS",
"parameter": {
"fa": "FREQ[0]",
"fb": "FREQ[1]",
"dp": "DELAY",
"dc": "DC_BIAS",
"am": "AC_AMP",
"an": "AVERAGE_NUM",
"rt": "RTIA",
"pp": "PPD",
"sp": "SCALE"
},
"data": [
"1XD1;1X01;4B>fa;4B>fb;2B>dp"
]
},
"curve_eis_para2": {
"type": "RIS",
"parameter": {
"fa": "FREQ[0]",
"fb": "FREQ[1]",
"dp": "DELAY",
"dc": "DC_BIAS",
"am": "AC_AMP",
"an": "AVERAGE_NUM",
"rt": "RTIA",
"pp": "PPD",
"sp": "SCALE"
},
"data": [
"1XD1;1X02;2B>dc;2B>am;B>an;B>rt;2B>pp;B>sp"
]
},
"curve_cv3": {
"type": "RIS",
"parameter": {
"va": "VOLT_INITIAL",
"vb": "VOLT_MAX",
"vc": "VOLT_MIN",
"ve": "Scan_Rate",
"vf": "SAMPLE_RATE",
"cn": "CYCLE_NUMBER"
},
"data": [
"1XD2;1X01;2B>va;2B>vb;2B>vc;"
]
},
"curve_cv3_para2": {
"type": "RIS",
"parameter": {
"va": "VOLT_INITIAL",
"vb": "VOLT_MAX",
"vc": "VOLT_MIN",
"ve": "Scan_Rate",
"vf": "SAMPLE_RATE",
"cn": "CYCLE_NUMBER"
},
"data": [
"1XD2;1X02;4B>ve;2B>vf;2B>cn"
]
},
"curve_const_vscan": {
"type": "RIS",
"parameter": {
"va": "VOLT_VSCAN",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE"
},
"data": [
"1XD3;",
"2B>va;",
"4b>pa;4b>pb;",
"4b>0;4b>pd;",
"2B>pe"
]
},
"ble_instru_send": [
"ble_write",
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "RIS",
"data": [
"XFF;",
"1B>BLE_WRITE[0];1B>BLE_WRITE[1];1B>BLE_WRITE[2];1B>BLE_WRITE[3];",
"1B>BLE_WRITE[4];1B>BLE_WRITE[5];1B>BLE_WRITE[6];1B>BLE_WRITE[7];",
"1B>BLE_WRITE[8];1B>BLE_WRITE[9];1B>BLE_WRITE[10];1B>BLE_WRITE[11];",
"1B>BLE_WRITE[12];1B>BLE_WRITE[13];1B>BLE_WRITE[14];1B>BLE_WRITE[15];",
"1B>BLE_WRITE[16];"
]
},
"dev_version": [
"CIS_VERSION",
"_cdr('20X>ADC_VALUE_I')"
],
"dev_battery": [
"CIS_VOLT",
"_cdr('20X>ADC_VALUE_I')"
]
}
}
@@ -1,12 +1,12 @@
{ {
"name": "EliteZM_pulsefly", "name": "Elite_MEGAFLY_0.1",
"version": "1.2.30", "version": "1.2.30",
"match_rule": { "match_rule": {
"local_name_pattern": "Elite.*", "local_name_pattern": "Elite.*",
"major_product_number": 0, "major_product_number": 0,
"minor_product_number": 2, "minor_product_number": 6,
"major_version_number": 1, "major_version_number": 1,
"minor_version_number": 7 "minor_version_number": 0
}, },
"constant": { "constant": {
"ADC_CHANNEL_NUMBER": [ "ADC_CHANNEL_NUMBER": [
@@ -1426,14 +1426,6 @@
"X80;X03;B>CTRL_HIGH_Z_15" "X80;X03;B>CTRL_HIGH_Z_15"
] ]
}, },
"VIS_CC_ZERO": [
"_data_format('I4V4Z4T4')",
"_disable_cache(False)",
"_notify(True)",
"VIS_CC_ZERO",
"_sync(True)",
"VIS_STI"
],
"pulse_fly": [ "pulse_fly": [
"sti_mode", "sti_mode",
"gas1_mode", "gas1_mode",
@@ -1,5 +1,5 @@
{ {
"name": "Elite_TRI", "name": "Elite_TRIG_0.1",
"version": "1.2.30", "version": "1.2.30",
"match_rule": { "match_rule": {
"local_name_pattern": "Trigger.*", "local_name_pattern": "Trigger.*",
-221
View File
@@ -1,221 +0,0 @@
{
"name": "Elite",
"version": "0.1",
"match_rule": {
"local_name_pattern": "Elite.*",
"major_product_number": 0,
"minor_product_number": 1,
"major_version_number": 0,
"minor_version_number": 1
},
"constant": {
"REC_CHANNEL_COUNT": 16,
"STI_CHANNEL_COUNT": 15,
"ADC_SAMPLE_RATE_LIST": [
15,
25,
40,
50,
100,
250,
500,
1000,
2500,
4000,
5000
],
"STI_FREQ_LIST": [
15,
25,
40,
50,
100,
250,
500,
1000,
2500,
4000,
5000
]
},
"parameters": {
"MODE": {
"description": "working mode",
"value": [
"Recording Mode",
"Stimulation Mode",
"Artifact Mode"
]
},
"CHANNEL": {
"description": "record channels",
"record_meta": true,
"domain": {
"set": [
"REC_CHANNEL_COUNT"
]
}
},
"SAMPLE_RATE": {
"alias": "ADC_RATE",
"description": "sampling rate",
"record_meta": true,
"domain": [
"len(ADC_SAMPLE_RATE_LIST)"
],
"value": "ADC_SAMPLE_RATE_LIST[VALUE]"
},
"AMP_GAIN": {
"description": "",
"record_meta": true,
"value": [
400,
1000,
2000
]
},
"LOW_FREQ_BAND": {
"description": "",
"record_meta": true,
"domain": [
7
]
},
"STI_MODE": {
"description": "stimulation mode",
"value": [
"Positive Pulse",
"Negative Pulse",
"Pos to Neg Pulse",
"Neg to Pos Pulse",
"Arbitrary Waveform"
]
},
"STI_VOLT": {
"description": "stimulation voltage",
"domain": [
32
],
"value": "2 + 3 * VALUE / 31"
},
"STI_FREQ": {
"description": "stimulation frequency",
"domain": [
"len(STI_FREQ_LIST)"
],
"value": "STI_FREQ_LIST[VALUE]"
},
"STI_PMOS": {
"description": "stimulation PMOS channel",
"initial": 0,
"domain": [
"STI_CHANNEL_COUNT"
],
"guard": "STI_PMOS != STI_NMOS"
},
"STI_NMOS": {
"description": "stimulation NMOS channel",
"initial": "STI_CHANNEL_COUNT - 1",
"domain": [
"STI_CHANNEL_COUNT"
],
"guard": "STI_PMOS != STI_NMOS"
},
"CHOPPER": {
"description": "",
"domain": "bool"
},
"FAST_SETTLE": {
"description": "",
"domain": "bool"
}
},
"instruction": {
"start": [
{
"expression": "MODE",
"when": {
"0": "start_recording",
"1": "start_stimulation",
"2": "start_artifact"
}
},
"VIS_STI"
],
"start_recording": [
{
"expression": "len(CHANNEL) > 0",
"raise": "no recording channel"
},
"data_format",
"_notify(True)",
"start_recording0",
"_sync(True)"
],
"start_artifact": [
{
"expression": "len(CHANNEL) > 0",
"raise": "no recording channel"
},
"data_format",
"_notify(True)",
"start_artifact0",
"_sync(True)"
],
"data_format": [
"_data_format('TDC4VAF2')"
],
"start_recording0": {
"type": "RIS",
"foreach-parameter": {
"parameter": "CHANNEL",
"variable": [
"a",
"b",
"c",
"d"
]
},
"data": [
"3b110#recording header;2b<AMP_GAIN;3b<LOW_FREQ_BAND",
"4b>SAMPLE_RATE;1ba?;1bb?;1bc?;1bd?",
"4b<a?:0;4b<b?:0",
"4b<c?:0;4b<d?:0"
]
},
"start_artifact0": {
"type": "RIS",
"foreach-parameter": {
"parameter": "CHANNEL",
"variable": [
"a",
"b",
"c",
"d"
]
},
"data": [
"3b100#artifact mode header;2b0;3b001",
"4b>SAMPLE_RATE;1ba?;1bb?;1bc?;1bd?",
"4b<a?:0;4b<b?:0",
"4b<c?:0;4b<d?:0"
]
},
"start_stimulation": [
"start_stimulation0"
],
"start_stimulation0": {
"type": "RIS",
"guard": {
"expression": "STI_PMOS != STI_NMOS",
"raise": "same N/PMos channel"
},
"data": [
"3b111#stimulation header;2b0;3bSTI_MODE",
"4b>STI_FREQ;1bCHOPPER;1bFAST_SETTLE;2b0",
"4b<STI_PMOS;4b<STI_NMOS",
"5b<STI_VOLT;3b0"
]
}
}
}
@@ -1,220 +0,0 @@
{
"name": "Elite_Legacy",
"version": "0.0.0",
"match_rule": {
"major_product_number": 0,
"minor_product_number": 0,
"major_version_number": 0,
"minor_version_number": 0
},
"constant": {
"REC_CHANNEL_COUNT": 16,
"STI_CHANNEL_COUNT": 15,
"ADC_SAMPLE_RATE_LIST": [
15,
25,
40,
50,
100,
250,
500,
1000,
2500,
4000,
5000
],
"STI_FREQ_LIST": [
15,
25,
40,
50,
100,
250,
500,
1000,
2500,
4000,
5000
]
},
"parameters": {
"MODE": {
"description": "working mode",
"value": [
"Recording Mode",
"Stimulation Mode",
"Artifact Mode"
]
},
"CHANNEL": {
"description": "record channels",
"record_meta": true,
"domain": {
"set": [
"REC_CHANNEL_COUNT"
]
}
},
"SAMPLE_RATE": {
"alias": "ADC_RATE",
"description": "sampling rate",
"record_meta": true,
"domain": [
"len(ADC_SAMPLE_RATE_LIST)"
],
"value": "ADC_SAMPLE_RATE_LIST[VALUE]"
},
"AMP_GAIN": {
"description": "",
"record_meta": true,
"value": [
400,
1000,
2000
]
},
"LOW_FREQ_BAND": {
"description": "",
"record_meta": true,
"domain": [
7
]
},
"STI_MODE": {
"description": "stimulation mode",
"value": [
"Positive Pulse",
"Negative Pulse",
"Pos to Neg Pulse",
"Neg to Pos Pulse",
"Arbitrary Waveform"
]
},
"STI_VOLT": {
"description": "stimulation voltage",
"domain": [
32
],
"value": "2 + 3 * VALUE / 31"
},
"STI_FREQ": {
"description": "stimulation frequency",
"domain": [
"len(STI_FREQ_LIST)"
],
"value": "STI_FREQ_LIST[VALUE]"
},
"STI_PMOS": {
"description": "stimulation PMOS channel",
"initial": 0,
"domain": [
"STI_CHANNEL_COUNT"
],
"guard": "STI_PMOS != STI_NMOS"
},
"STI_NMOS": {
"description": "stimulation NMOS channel",
"initial": "STI_CHANNEL_COUNT - 1",
"domain": [
"STI_CHANNEL_COUNT"
],
"guard": "STI_PMOS != STI_NMOS"
},
"CHOPPER": {
"description": "",
"domain": "bool"
},
"FAST_SETTLE": {
"description": "",
"domain": "bool"
}
},
"instruction": {
"start": [
{
"expression": "MODE",
"when": {
"0": "start_recording",
"1": "start_stimulation",
"2": "start_artifact"
}
},
"VIS_STI"
],
"start_recording": [
{
"expression": "len(CHANNEL) > 0",
"raise": "no recording channel"
},
"data_format",
"_notify(True)",
"start_recording0",
"_sync(True)"
],
"start_artifact": [
{
"expression": "len(CHANNEL) > 0",
"raise": "no recording channel"
},
"data_format",
"_notify(True)",
"start_artifact0",
"_sync(True)"
],
"data_format": [
"_data_format('TC4VAF2')"
],
"start_recording0": {
"type": "RIS",
"foreach-parameter": {
"parameter": "CHANNEL",
"variable": [
"a",
"b",
"c",
"d"
]
},
"data": [
"3b110#recording header;2b<AMP_GAIN;3b<LOW_FREQ_BAND",
"4b>SAMPLE_RATE;1ba?;1bb?;1bc?;1bd?",
"4b<a?:0;4b<b?:0",
"4b<c?:0;4b<d?:0"
]
},
"start_artifact0": {
"type": "RIS",
"foreach-parameter": {
"parameter": "CHANNEL",
"variable": [
"a",
"b",
"c",
"d"
]
},
"data": [
"3b100#artifact mode header;2b0;3b001",
"4b>SAMPLE_RATE;1ba?;1bb?;1bc?;1bd?",
"4b<a?:0;4b<b?:0",
"4b<c?:0;4b<d?:0"
]
},
"start_stimulation": [
"start_stimulation0"
],
"start_stimulation0": {
"type": "RIS",
"guard": {
"expression": "STI_PMOS != STI_NMOS",
"raise": "same N/PMos channel"
},
"data": [
"3b111#stimulation header;2b0;3bSTI_MODE",
"4b>STI_FREQ;1bCHOPPER;1bFAST_SETTLE;2b0",
"4b<STI_PMOS;4b<STI_NMOS",
"5b<STI_VOLT;3b0"
]
}
}
}
-343
View File
@@ -1,343 +0,0 @@
{
"name": "EliteZM",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite-ZM.+",
"major_product_number": 0,
"minor_product_number": 2,
"major_version_number": 1,
"minor_version_number": 2
},
"constant": {
"ADC_CHANNEL_NUMBER": [
12,
13,
14,
15
],
"VOLT_MAX": 65536,
"STEP_MAX": 100,
"Const_Current_Range": 1500001
},
"parameters": {
"CHANNEL": {
"description": "record channels",
"record_meta": true,
"domain": "property",
"value": "[0, 1, 2]"
},
"CHANNEL_LABEL": {
"description": "channel label",
"record_meta": true,
"domain": "property",
"value": "['current', 'voltage', 'impedance']"
},
"SAMPLE_RATE": {
"description": "data sampling rate",
"record_meta": true,
"value": [
100,
10,
5,
1,
0.1,
0.01
],
"on_change": "set_sample_rate"
},
"AMP_GAIN": {
"description": "amp gain",
"record_meta": true,
"domain": "constant",
"value": 1
},
"MODE": {
"description": "working mode",
"record_meta": true,
"value": [
"I-V Curve",
"Cyclic Voltammetry",
"Function Generator",
"R-T Curve",
"V-T Curve",
"I-T Curve",
"ADC test",
"Constant Current"
]
},
"VOLT_ORIGIN": {
"description": "Origin Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "(VALUE) * 0x0001"
}
},
"VOLT_FINAL": {
"description": "The last Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": " (VALUE) * 0x0001"
}
},
"VOLT_STEP": {
"description": "Voltage Step",
"record_meta": true,
"initial": 0,
"domain": [
"STEP_MAX"
],
"value": {
"expression": "(VALUE + 1) * 0x0001"
}
},
"STEP_TIME": {
"description": "How much time between two step",
"record_meta": true,
"initial": 1,
"value": [
0.5,
1.0,
2.0
]
},
"CYCLE_NUMBER": {
"description": "CV cycle number",
"record_meta": true,
"initial": 0,
"domain": [
200
],
"value": {
"expression": "VALUE + 1"
}
},
"DAC_VOLT": {
"description": "DAC output Voltage",
"record_meta": true,
"initial": 25000,
"domain": [
65536
]
},
"ADC_CHANNEL": {
"description": "read ADC data",
"record_meta": true,
"value": [
"ANA0",
"ANA1",
"ANA2",
"ANA3"
]
},
"ADC_LEVEL": {
"description": "ADC level",
"record_meta": true,
"initial": 3,
"value": [
"200k",
"10k",
"200R",
"auto"
],
"on_change": "set_adc_gain"
},
"Resister_LEVEL": {
"description": "Resister_LEVEL",
"record_meta": true,
"initial": 3,
"value": [
"Small",
"Middle",
"Large",
"Auto"
],
"on_change": "set_Resister_level"
},
"ADC_VALUE_V": {
"description": "ADC value voltage value",
"domain": "int"
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"Const_Current_unit": {
"description": "Constant Current unit Setting",
"initial": 1,
"value": [
"uA",
"mA"
]
},
"Const_Current_value": {
"description": "Constant Current value Setting",
"initial": 0,
"domain": [
"Const_Current_Range"
],
"value": {
"expression": "(VALUE) * 0x00000001"
}
},
"Charge": {
"description": "Charge battery or not",
"initial": 0,
"value": [
"Charge",
"Discharge"
]
},
"Const_Current_VStop": {
"description": "Constant Current Stopping Voltage",
"initial": 0,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "(VALUE) * 0x0001"
}
}
},
"instruction": {
"start": [
{
"expression": "MODE",
"when": {
"2": "start_fun_gen",
"6": "adc_test",
"*": "start_data"
}
}
],
"start_fun_gen": [
"data_format",
"func_gen",
"VIS_STI"
],
"adc_test": [
"adc_test0",
"_cdr('1X;4X>ADC_VALUE_I;4X>ADC_VALUE_V')"
],
"start_data": [
"data_format",
"_notify(True)",
"set_sample_rate",
{
"expression": "MODE",
"when": {
"0": "curve_iv",
"1": "curve_cv",
"3": "curve_zt",
"4": "curve_vt",
"5": "curve_it",
"7": "const_current"
}
},
"_sync(True)",
"VIS_STI"
],
"data_format": [
"_data_format('I4V4Z4T4')",
{
"expression": "MODE",
"when": {
"0": "_disable_cache(True)",
"1": "_disable_cache(True)",
"*": "_disable_cache(False)"
}
}
],
"curve_iv": {
"type": "RIS",
"parameter": {
"va": "(VOLT_ORIGIN) * 0x0001",
"vb": "(VOLT_FINAL) * 0x0001",
"dv": "(VOLT_STEP + 1) * 0x0001",
"dt": "STEP_TIME * 0x12"
},
"data": [
"1X10;2B>va;2B>vb;2B>dv;B>dt"
]
},
"curve_cv": {
"type": "RIS",
"parameter": {
"va": "(VOLT_ORIGIN) * 0x0001",
"vb": "(VOLT_FINAL) * 0x0001",
"dv": "(VOLT_STEP + 1) * 0x0001",
"dt": "STEP_TIME * 0x12",
"cn": "CYCLE_NUMBER+1"
},
"data": [
"1X20;2B>va;2B>vb;2B>dv;B>dt;B>cn"
]
},
"func_gen": {
"type": "RIS",
"parameter": {
"v": "(DAC_VOLT) * 0x0001"
},
"data": [
"X30;2B>v"
]
},
"curve_zt": {
"type": "RIS",
"data": [
"X40"
]
},
"curve_vt": {
"type": "RIS",
"data": [
"X50"
]
},
"curve_it": {
"type": "RIS",
"data": [
"X60"
]
},
"adc_test0": {
"type": "RIS",
"data": [
"X90;B>ADC_LEVEL;B>ADC_CHANNEL"
]
},
"set_sample_rate": {
"type": "RIS",
"data": [
"X70;B>SAMPLE_RATE"
]
},
"set_adc_gain": {
"type": "RIS",
"data": [
"X80;B>ADC_LEVEL"
]
},
"set_Resister_level": {
"type": "RIS",
"data": [
"XE0;B>Resister_LEVEL"
]
},
"const_current": {
"type": "RIS",
"data": [
"XD0;B>Charge;2X>Const_Current_VStop;4X>Const_Current_value"
]
}
}
}
@@ -1,320 +0,0 @@
{
"name": "EliteZML",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite-ZM.+",
"major_product_number": 0,
"minor_product_number": 2,
"major_version_number": 1,
"minor_version_number": 4
},
"constant": {
"ADC_CHANNEL_NUMBER": [
12,
13,
14,
15
],
"VOLT_MAX": 65536,
"STEP_MAX": 100,
"Const_Current_Range": 3000001
},
"parameters": {
"CHANNEL": {
"description": "record channels",
"record_meta": true,
"domain": "property",
"value": "[0, 1, 2]"
},
"CHANNEL_LABEL": {
"description": "channel label",
"record_meta": true,
"domain": "property",
"value": "['current', 'voltage', 'impedance']"
},
"SAMPLE_RATE": {
"description": "data sampling rate",
"record_meta": true,
"value": [
100,
10,
5,
1,
0.1,
0.01
],
"on_change": "set_sample_rate"
},
"AMP_GAIN": {
"description": "amp gain",
"record_meta": true,
"domain": "constant",
"value": 1
},
"MODE": {
"description": "working mode",
"record_meta": true,
"value": [
"I-V Curve",
"Cyclic Voltammetry",
"Function Generator",
"R-T Curve",
"V-T Curve",
"I-T Curve",
"ADC test",
"Constant Current"
]
},
"VOLT_ORIGIN": {
"description": "Origin Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "(VALUE + 1) * 0x0001"
}
},
"VOLT_FINAL": {
"description": "The last Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": " (VALUE + 1) * 0x0001"
}
},
"VOLT_STEP": {
"description": "Voltage Step",
"record_meta": true,
"initial": 0,
"domain": [
"STEP_MAX"
],
"value": {
"expression": "(VALUE + 1) * 0x0001"
}
},
"STEP_TIME": {
"description": "How much time between two step",
"record_meta": true,
"initial": 1,
"value": [
0.5,
1.0,
2.0
]
},
"CYCLE_NUMBER": {
"description": "CV cycle number",
"record_meta": true,
"domain": [
200
],
"value": {
"expression": "VALUE + 1"
}
},
"DAC_VOLT": {
"description": "DAC output Voltage",
"record_meta": true,
"domain": [
65536
]
},
"ADC_CHANNEL": {
"description": "read ADC data",
"record_meta": true,
"value": [
"ANA0",
"ANA1",
"ANA2",
"ANA3"
]
},
"ADC_LEVEL": {
"description": "ADC level",
"record_meta": true,
"value": [
"200k",
"10k",
"200R",
"auto"
],
"on_change": "set_adc_gain"
},
"Resister_LEVEL": {
"description": "Resister_LEVEL",
"record_meta": true,
"value": [
"Small",
"Middle",
"Large",
"Auto"
],
"on_change": "set_Resister_level"
},
"ADC_VALUE_V": {
"description": "ADC value voltage value",
"domain": "int"
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"Const_Current_unit": {
"description": "Constant Current unit Setting",
"value": [
"uA",
"mA"
]
},
"Const_Current_value": {
"description": "Constant Current value Setting",
"initial": 1500000,
"domain": [
"Const_Current_Range"
],
"value": {
"expression": "(VALUE) * 0x00000001"
}
}
},
"instruction": {
"start": [
{
"expression": "MODE",
"when": {
"2": "start_fun_gen",
"6": "adc_test",
"*": "start_data"
}
}
],
"start_fun_gen": [
"data_format",
"func_gen",
"VIS_STI"
],
"adc_test": [
"adc_test0",
"_cdr('1X;4X>ADC_VALUE_I;4X>ADC_VALUE_V')"
],
"start_data": [
"data_format",
"_notify(True)",
"set_sample_rate",
{
"expression": "MODE",
"when": {
"0": "curve_iv",
"1": "curve_cv",
"3": "curve_zt",
"4": "curve_vt",
"5": "curve_it",
"7": "const_current"
}
},
"_sync(True)",
"VIS_STI"
],
"data_format": [
"_data_format('I4V4Z4T4')",
{
"expression": "MODE",
"when": {
"0": "_disable_cache(True)",
"1": "_disable_cache(True)",
"*": "_disable_cache(False)"
}
}
],
"curve_iv": {
"type": "RIS",
"parameter": {
"va": "(VOLT_ORIGIN + 1) * 0x0001",
"vb": "(VOLT_FINAL + 1) * 0x0001",
"dv": "(VOLT_STEP + 1) * 0x0001",
"dt": "STEP_TIME * 0x12"
},
"data": [
"1X10;2B>va;2B>vb;2B>dv;B>dt"
]
},
"curve_cv": {
"type": "RIS",
"parameter": {
"va": "(VOLT_ORIGIN + 1) * 0x0001",
"vb": "(VOLT_FINAL + 1) * 0x0001",
"dv": "(VOLT_STEP + 1) * 0x0001",
"dt": "STEP_TIME * 0x12",
"cn": "CYCLE_NUMBER+1"
},
"data": [
"1X20;2B>va;2B>vb;2B>dv;B>dt;B>CYCLE_NUMBER"
]
},
"func_gen": {
"type": "RIS",
"parameter": {
"v": "(DAC_VOLT) * 0x0001"
},
"data": [
"X30;2B>v"
]
},
"curve_zt": {
"type": "RIS",
"data": [
"X40"
]
},
"curve_vt": {
"type": "RIS",
"data": [
"X50"
]
},
"curve_it": {
"type": "RIS",
"data": [
"X60"
]
},
"adc_test0": {
"type": "RIS",
"data": [
"X90;B>ADC_LEVEL;B>ADC_CHANNEL"
]
},
"set_sample_rate": {
"type": "RIS",
"data": [
"X70;B>SAMPLE_RATE"
]
},
"set_adc_gain": {
"type": "RIS",
"data": [
"X80;B>ADC_LEVEL"
]
},
"set_Resister_level": {
"type": "RIS",
"data": [
"XE0;B>Resister_LEVEL"
]
},
"const_current": {
"type": "RIS",
"data": [
"XD0;4X>Const_Current_value"
]
}
}
}
@@ -1,320 +0,0 @@
{
"name": "EliteZMS",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite-ZM.+",
"major_product_number": 0,
"minor_product_number": 2,
"major_version_number": 1,
"minor_version_number": 3
},
"constant": {
"ADC_CHANNEL_NUMBER": [
12,
13,
14,
15
],
"VOLT_MAX": 65536,
"STEP_MAX": 100,
"Const_Current_Range": 3000001
},
"parameters": {
"CHANNEL": {
"description": "record channels",
"record_meta": true,
"domain": "property",
"value": "[0, 1, 2]"
},
"CHANNEL_LABEL": {
"description": "channel label",
"record_meta": true,
"domain": "property",
"value": "['current', 'voltage', 'impedance']"
},
"SAMPLE_RATE": {
"description": "data sampling rate",
"record_meta": true,
"value": [
100,
10,
5,
1,
0.1,
0.01
],
"on_change": "set_sample_rate"
},
"AMP_GAIN": {
"description": "amp gain",
"record_meta": true,
"domain": "constant",
"value": 1
},
"MODE": {
"description": "working mode",
"record_meta": true,
"value": [
"I-V Curve",
"Cyclic Voltammetry",
"Function Generator",
"R-T Curve",
"V-T Curve",
"I-T Curve",
"ADC test",
"Constant Current"
]
},
"VOLT_ORIGIN": {
"description": "Origin Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "(VALUE + 1) * 0x0001"
}
},
"VOLT_FINAL": {
"description": "The last Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": " (VALUE + 1) * 0x0001"
}
},
"VOLT_STEP": {
"description": "Voltage Step",
"record_meta": true,
"initial": 0,
"domain": [
"STEP_MAX"
],
"value": {
"expression": "(VALUE + 1) * 0x0001"
}
},
"STEP_TIME": {
"description": "How much time between two step",
"record_meta": true,
"initial": 1,
"value": [
0.5,
1.0,
2.0
]
},
"CYCLE_NUMBER": {
"description": "CV cycle number",
"record_meta": true,
"domain": [
200
],
"value": {
"expression": "VALUE + 1"
}
},
"DAC_VOLT": {
"description": "DAC output Voltage",
"record_meta": true,
"domain": [
65536
]
},
"ADC_CHANNEL": {
"description": "read ADC data",
"record_meta": true,
"value": [
"ANA0",
"ANA1",
"ANA2",
"ANA3"
]
},
"ADC_LEVEL": {
"description": "ADC level",
"record_meta": true,
"value": [
"200k",
"10k",
"200R",
"auto"
],
"on_change": "set_adc_gain"
},
"Resister_LEVEL": {
"description": "Resister_LEVEL",
"record_meta": true,
"value": [
"Small",
"Middle",
"Large",
"Auto"
],
"on_change": "set_Resister_level"
},
"ADC_VALUE_V": {
"description": "ADC value voltage value",
"domain": "int"
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"Const_Current_unit": {
"description": "Constant Current unit Setting",
"value": [
"uA",
"mA"
]
},
"Const_Current_value": {
"description": "Constant Current value Setting",
"initial": 1500000,
"domain": [
"Const_Current_Range"
],
"value": {
"expression": "(VALUE) * 0x00000001"
}
}
},
"instruction": {
"start": [
{
"expression": "MODE",
"when": {
"2": "start_fun_gen",
"6": "adc_test",
"*": "start_data"
}
}
],
"start_fun_gen": [
"data_format",
"func_gen",
"VIS_STI"
],
"adc_test": [
"adc_test0",
"_cdr('1X;4X>ADC_VALUE_I;4X>ADC_VALUE_V')"
],
"start_data": [
"data_format",
"_notify(True)",
"set_sample_rate",
{
"expression": "MODE",
"when": {
"0": "curve_iv",
"1": "curve_cv",
"3": "curve_zt",
"4": "curve_vt",
"5": "curve_it",
"7": "const_current"
}
},
"_sync(True)",
"VIS_STI"
],
"data_format": [
"_data_format('I4V4Z4T4')",
{
"expression": "MODE",
"when": {
"0": "_disable_cache(True)",
"1": "_disable_cache(True)",
"*": "_disable_cache(False)"
}
}
],
"curve_iv": {
"type": "RIS",
"parameter": {
"va": "(VOLT_ORIGIN + 1) * 0x0001",
"vb": "(VOLT_FINAL + 1) * 0x0001",
"dv": "(VOLT_STEP + 1) * 0x0001",
"dt": "STEP_TIME * 0x12"
},
"data": [
"1X10;2B>va;2B>vb;2B>dv;B>dt"
]
},
"curve_cv": {
"type": "RIS",
"parameter": {
"va": "(VOLT_ORIGIN + 1) * 0x0001",
"vb": "(VOLT_FINAL + 1) * 0x0001",
"dv": "(VOLT_STEP + 1) * 0x0001",
"dt": "STEP_TIME * 0x12",
"cn": "CYCLE_NUMBER+1"
},
"data": [
"1X20;2B>va;2B>vb;2B>dv;B>dt;B>CYCLE_NUMBER"
]
},
"func_gen": {
"type": "RIS",
"parameter": {
"v": "(DAC_VOLT) * 0x0001"
},
"data": [
"X30;2B>v"
]
},
"curve_zt": {
"type": "RIS",
"data": [
"X40"
]
},
"curve_vt": {
"type": "RIS",
"data": [
"X50"
]
},
"curve_it": {
"type": "RIS",
"data": [
"X60"
]
},
"adc_test0": {
"type": "RIS",
"data": [
"X90;B>ADC_LEVEL;B>ADC_CHANNEL"
]
},
"set_sample_rate": {
"type": "RIS",
"data": [
"X70;B>SAMPLE_RATE"
]
},
"set_adc_gain": {
"type": "RIS",
"data": [
"X80;B>ADC_LEVEL"
]
},
"set_Resister_level": {
"type": "RIS",
"data": [
"XE0;B>Resister_LEVEL"
]
},
"const_current": {
"type": "RIS",
"data": [
"XD0;4X>Const_Current_value"
]
}
}
}
+3
View File
@@ -0,0 +1,3 @@
#!/bin/bash
find /home/pi -maxdepth 1 -type f -iname '*.out' -mtime +30 -delete