Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c894bf7c6f |
@@ -1585,15 +1585,6 @@ class ControlAPI(metaclass=Router):
|
||||
|
||||
def stop_project(self, project) -> bool:
|
||||
raise NotImplementedError()
|
||||
|
||||
def set_project(self, project, content) -> bool:
|
||||
raise NotImplementedError()
|
||||
|
||||
def set_project_cycle(self, project, index, content) -> bool:
|
||||
raise NotImplementedError()
|
||||
|
||||
def show_device_data(self, device) -> bool:
|
||||
raise NotImplementedError()
|
||||
|
||||
# noinspection PyAbstractClass
|
||||
class ControlClient(SocketClient, ControlAPI, metaclass=SocketClientMacro(ControlAPI)):
|
||||
|
||||
@@ -130,14 +130,6 @@ class DataAPI(metaclass=abc.ABCMeta):
|
||||
def hardware_test(self) -> JSON_OBJECT:
|
||||
""""""
|
||||
pass
|
||||
|
||||
@abc.abstractmethod
|
||||
def show_data(self, device: Union[int, Device]):
|
||||
"""show device data
|
||||
|
||||
:param device: device ID
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
# noinspection PyAbstractClass
|
||||
@@ -199,9 +191,6 @@ class DataClient(SocketClient, DataAPI, metaclass=SocketClientMacro(DataAPI)):
|
||||
|
||||
def stop_sync(self, *device: Union[int, Device]):
|
||||
self.send_command('stop_sync', *self._to_device_id(*device))
|
||||
|
||||
def show_data(self, device: int):
|
||||
self.send_command('show_data', device)
|
||||
|
||||
@staticmethod
|
||||
def _to_device_id(*device: Union[int, Device]) -> Tuple[int, ...]:
|
||||
|
||||
@@ -662,7 +662,7 @@ class CC2650Device(Device):
|
||||
elif device_type == 'EISZeroOne':
|
||||
i = 0
|
||||
request_times = 0
|
||||
while i < 13:
|
||||
while i < 7:
|
||||
try:
|
||||
# send
|
||||
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, i)
|
||||
|
||||
+83
-155
@@ -1,12 +1,13 @@
|
||||
import abc
|
||||
import struct
|
||||
import math
|
||||
import numpy
|
||||
from typing import Optional, TypeVar, Generic, Tuple, Dict, List, AnyStr
|
||||
from datetime import datetime
|
||||
|
||||
from biopro.recording import RecordingData, RecordingFileDataFormat
|
||||
|
||||
import numpy as np
|
||||
|
||||
# from biopro.util.console import hex_line
|
||||
|
||||
T = TypeVar('T')
|
||||
@@ -854,7 +855,7 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
|
||||
|
||||
__slots__ = ('_message', '_cycle_number', '_start_return_data', '_time_stamp',
|
||||
'_total_time_stamp', '_mode', '_cycle_start_time',
|
||||
'_mode_stop', '_show_data')
|
||||
'_mode_stop')
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
@@ -869,8 +870,6 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
|
||||
self._mode = 0
|
||||
self._cycle_start_time = []
|
||||
|
||||
self._show_data = False
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self.NAME
|
||||
@@ -888,17 +887,17 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
|
||||
mem_cnt = data[1]
|
||||
time_stamp: float = struct.unpack('<I', data[4:8])[0] # unit: ms 0x18030000
|
||||
current = struct.unpack('<i', data[8:12])[0] # unit: nA
|
||||
voltage = struct.unpack('<i', data[12:16])[0] # unit: uV
|
||||
ch2 = struct.unpack('<i', data[12:16])[0] # unit: uV
|
||||
impedance = struct.unpack('<i', data[16:20])[0] # unit: mOm
|
||||
if self._mode == 16:
|
||||
voltage = impedance - ch2
|
||||
else:
|
||||
voltage = ch2
|
||||
|
||||
cycle_number = struct.unpack('<H', data[20:22])[0]
|
||||
finish_mode_falg = data[22]
|
||||
battery = struct.unpack('<i', data[23:27])[0]
|
||||
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
|
||||
ram_num = data[47]
|
||||
@@ -922,11 +921,9 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
|
||||
print("error timeStamp full data:", list(data), datetime.now(), '\n')
|
||||
return None
|
||||
else:
|
||||
if self._show_data:
|
||||
print('|', time_stamp, '|', delta, '|', int(time_stamp * 1000 / 2),
|
||||
'|', current, '|', voltage, '|', impedance, '|', cycle_number,
|
||||
'|', notify_one, '|', notify_two, '|', notify_three,
|
||||
'|', finishMode, '@', str(self.device))
|
||||
# print('|', time_stamp, '|', delta, '|', int(time_stamp * 1000 / 2),
|
||||
# '|', current, '|', voltage, '|', impedance,
|
||||
# '|', cycle_number, '|', finishMode, '@', str(self.device))
|
||||
|
||||
# print('|', '{:10}'.format(time_stamp),
|
||||
# '|', '{:4}'.format(delta),
|
||||
@@ -955,9 +952,6 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
|
||||
ret.append_data(1, voltage)
|
||||
ret.append_data(2, impedance)
|
||||
ret.append_data(3, cycle_number)
|
||||
ret.append_data(4, notify_one)
|
||||
ret.append_data(5, notify_two)
|
||||
ret.append_data(6, notify_three)
|
||||
# ret.append_data(4, battery)
|
||||
# ret.append_data(5, elite_notify_times)
|
||||
# ret.append_data(6, mem_cnt)
|
||||
@@ -1347,7 +1341,7 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
'_total_time_stamp', '_mode', '_cycle_start_time',
|
||||
'_mode_stop', '_last_time_stamp', '_last_delta', '_cali_coeff',
|
||||
'cali_coeff', '_ac_amp', '_mode', '_freq_start', '_freq_stop',
|
||||
'_freq_direction', '_last_phase', '_first_phase_flag', '_show_data')
|
||||
'_freq_direction', '_last_phase', '_first_phase_flag')
|
||||
|
||||
def __init__(self, cali_coeff: bytes = None):
|
||||
super().__init__()
|
||||
@@ -1371,8 +1365,6 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
self._cali_coeff: Optional[bytes] = None
|
||||
self.cali_coeff: Optional[List[Tuple[int, int]]] = None
|
||||
|
||||
self._show_data = False
|
||||
|
||||
if cali_coeff is not None:
|
||||
self._cali_coeff = cali_coeff
|
||||
self.cali_coeff = self._decode_cali_coeff(cali_coeff)
|
||||
@@ -1381,27 +1373,12 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
def _decode_cali_coeff(cali_coeff: bytes) -> Optional[List[Tuple[int, int]]]:
|
||||
if cali_coeff != b'':
|
||||
cali_table = []
|
||||
phase_para_a = []
|
||||
phase_para_b = []
|
||||
hsrtia_a = []
|
||||
hsrtia_b = []
|
||||
hsrtia_c = []
|
||||
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)
|
||||
cutoff_freq = struct.unpack('>I', cali_coeff[1:5])[0] * 100 #4
|
||||
@@ -1412,95 +1389,51 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
# hsrtia_160k = struct.unpack('>I', cali_coeff[8:12])[0] #4
|
||||
|
||||
index = 20
|
||||
g = 0
|
||||
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]
|
||||
|
||||
for i in range(index, index+16, 8):
|
||||
phase_para_a.append(struct.unpack('>i', cali_coeff[i+1:i+5])[0])
|
||||
phase_para_b.append(struct.unpack('>i', cali_coeff[i+5:i+9])[0])
|
||||
|
||||
index = 40
|
||||
g = 0
|
||||
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]
|
||||
|
||||
for i in range(index, index+16, 8):
|
||||
phase_para_a.append(struct.unpack('>i', cali_coeff[i+1:i+5])[0])
|
||||
phase_para_b.append(struct.unpack('>i', cali_coeff[i+5:i+9])[0])
|
||||
|
||||
#Lv[0] 160k
|
||||
index = 60
|
||||
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_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0])
|
||||
hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0]/1e4)
|
||||
|
||||
#Lv[1] 20k
|
||||
index = 80
|
||||
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_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0])
|
||||
hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0]/1e4)
|
||||
|
||||
#Lv[2] 5k
|
||||
index = 100
|
||||
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_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0])
|
||||
hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0]/1e4)
|
||||
|
||||
#Lv[3] 200R
|
||||
index = 120
|
||||
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_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0])
|
||||
hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0]/1e4)
|
||||
|
||||
index = 140
|
||||
g = 1
|
||||
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 = 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]
|
||||
# hsrtia_a.append(struct.unpack('>I', cali_coeff[index+1:index+5])[0])
|
||||
# hsrtia_b.append(struct.unpack('>I', cali_coeff[index+5:index+9])[0]/1e6)
|
||||
# hsrtia_c.append(struct.unpack('>I', cali_coeff[index+9:index+13])[0]/1e5)
|
||||
|
||||
# print('cutoff_freq', cutoff_freq)
|
||||
# print('hsrtia_a', hsrtia_a)
|
||||
# print('hsrtia_b', hsrtia_b)
|
||||
# print('hsrtia_c', hsrtia_c)
|
||||
# print('phase_coeff')
|
||||
# print(phase_coeff)
|
||||
# print('phase_offset')
|
||||
# print(phase_offset)
|
||||
# print('phase_para_a', phase_para_a)
|
||||
# print('phase_para_b', phase_para_b)
|
||||
|
||||
cali_table.append((cutoff_freq, phase_coeff, phase_offset, hsrtia_a, hsrtia_b, hsrtia_c, hsrtia_d))
|
||||
cali_table.append((cutoff_freq, phase_para_a, phase_para_b, hsrtia_a, hsrtia_b, hsrtia_c, hsrtia_d))
|
||||
|
||||
return cali_table
|
||||
else:
|
||||
@@ -1550,12 +1483,13 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
return None
|
||||
else:
|
||||
if self.cali_coeff is not None and self._mode == 0:
|
||||
phase_para_a = []
|
||||
phase_para_b = []
|
||||
hsrtia_a = []
|
||||
hsrtia_b = []
|
||||
hsrtia_c = []
|
||||
hsrtia_d = []
|
||||
cutoff_freq, phase_coeff, phase_offset, hsrtia_a, hsrtia_b, hsrtia_c, hsrtia_d = self.cali_coeff[0]
|
||||
|
||||
cutoff_freq, phase_para_a, phase_para_b, hsrtia_a, hsrtia_b, hsrtia_c, hsrtia_d = self.cali_coeff[0]
|
||||
voltage_amp = round(self._ac_amp * 800 / 2047) # use UI value
|
||||
if (self._freq_start > self._freq_stop):
|
||||
self._freq_direction = 0
|
||||
@@ -1566,19 +1500,13 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
img = ch1
|
||||
real = ch2
|
||||
freq = ch3
|
||||
fre_idx = 0
|
||||
|
||||
rolloff_cali = cutoff_freq/1e5
|
||||
voltage_mag = math.sqrt(img ** 2 + real ** 2) * (1 + freq ** 2 / rolloff_cali ** 2 / 1e4)
|
||||
voltage_mag = math.sqrt(img ** 2 + real ** 2) * (1 + freq ** 2 / cutoff_freq ** 2)
|
||||
|
||||
# if (gain == 3):
|
||||
# current = hsrtia_a[gain] * math.exp(hsrtia_b[gain] * voltage_mag) + hsrtia_c[gain] * math.exp(hsrtia_d[gain] * voltage_mag)
|
||||
# else:
|
||||
|
||||
current = voltage_mag ** 2 * hsrtia_a[gain] + voltage_mag * hsrtia_b[gain]
|
||||
# current = voltage_mag ** 2 * hsrtia_a[gain] + voltage_mag * hsrtia_b[gain] + hsrtia_c[gain]
|
||||
|
||||
|
||||
current = voltage_mag ** 2 * hsrtia_a[gain] + voltage_mag * hsrtia_b[gain] + hsrtia_c[gain]
|
||||
# print(current)
|
||||
# print(voltage_mag)
|
||||
# print(hsrtia_a[gain])
|
||||
@@ -1591,64 +1519,64 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
else:
|
||||
impedance = 0
|
||||
|
||||
raw_phase = math.atan2(img , real) * 180 / math.pi
|
||||
if (real > 0):
|
||||
raw_phase = math.atan(img / real) * 180 / math.pi
|
||||
elif (real == 0):
|
||||
raw_phase = 90
|
||||
else:
|
||||
raw_phase = math.atan(img / real) * 180 / math.pi + 180
|
||||
|
||||
if (freq >= 1000000): # 10000 Hz
|
||||
fre_idx = 0
|
||||
i = 0
|
||||
elif (freq >= 10000): # 100 Hz
|
||||
fre_idx = 1
|
||||
i = 1
|
||||
elif (freq >= 1000): # 10 Hz
|
||||
fre_idx = 2
|
||||
i = 2
|
||||
elif (freq >= 1): # 0.01 Hz
|
||||
fre_idx = 3
|
||||
i = 3
|
||||
|
||||
ideal_raw_phase = phase_coeff[gain][fre_idx] /1e10 * freq + phase_offset[gain][fre_idx] / 1e6
|
||||
ideal_raw_phase = phase_para_a[i] /1e10 * freq + phase_para_b[i] / 1e6
|
||||
|
||||
phase = raw_phase - ideal_raw_phase
|
||||
phase = phase % 180 if phase % 180<=90 else phase % 180-180
|
||||
|
||||
# last_phase_to90 = self._last_phase % 180 if self._last_phase % 180<=90 else self._last_phase % 180-180
|
||||
# diff = phase - last_phase_to90
|
||||
|
||||
# if (self._first_phase_flag):
|
||||
# # self._last_phase = phase
|
||||
# self._first_phase_flag = 0
|
||||
# elif (abs(diff) >= 90):
|
||||
# phase = self._last_phase + diff + (180 if diff<0 else-180)
|
||||
# else:
|
||||
# phase = self._last_phase + diff
|
||||
# self._last_phase = phase
|
||||
if (self._first_phase_flag):
|
||||
self._last_phase = phase
|
||||
self._first_phase_flag = 0
|
||||
elif (abs(phase - self._last_phase) >= 200):
|
||||
phase -= 360
|
||||
self._last_phase = phase
|
||||
|
||||
imag_after_cal = impedance * math.sin(round(phase) * math.pi / 180)
|
||||
real_after_cal = impedance * math.cos(round(phase) * math.pi / 180)
|
||||
|
||||
if self._show_data:
|
||||
if (self._mode == 0):
|
||||
print('|', '{:10}'.format(time_stamp),
|
||||
'|', '{:5}'.format(delta),
|
||||
'|', '{:6}'.format(ch1),
|
||||
'|', '{:6}'.format(ch2),
|
||||
'|', '{:8}'.format(ch3 / 100),
|
||||
'|', '{:6}'.format(round(voltage_mag)),
|
||||
'|', '{:5}'.format(int(imag_after_cal)),
|
||||
'|', '{:5}'.format(int(real_after_cal)),
|
||||
'|', '{:5}'.format(round(impedance)),
|
||||
'|', '{:5}'.format(round(phase, 1)),
|
||||
'|', '{:5}'.format(round(current, 3)),
|
||||
'|', '{:1}'.format(gain),
|
||||
'|', '{:1}'.format(finishMode),
|
||||
'@', str(self.device), '|')
|
||||
pass
|
||||
else:
|
||||
print('|', '{:10}'.format(time_stamp),
|
||||
'|', '{:5}'.format(delta),
|
||||
'|', '{:5}'.format(ch1),
|
||||
'|', '{:5}'.format(ch2),
|
||||
'|', '{:5}'.format(ch3),
|
||||
'|', '{:5}'.format(cycle_number),
|
||||
'|', '{:1}'.format(gain),
|
||||
'|', '{:1}'.format(finishMode),
|
||||
'@', str(self.device), '|')
|
||||
pass
|
||||
|
||||
if (self._mode == 0):
|
||||
# print('|', '{:10}'.format(time_stamp),
|
||||
# '|', '{:5}'.format(delta),
|
||||
# '|', '{:6}'.format(ch1),
|
||||
# '|', '{:6}'.format(ch2),
|
||||
# '|', '{:8}'.format(ch3 / 100),
|
||||
# '|', '{:6}'.format(round(voltage_mag)),
|
||||
# '|', '{:5}'.format(int(imag_after_cal)),
|
||||
# '|', '{:5}'.format(int(real_after_cal)),
|
||||
# '|', '{:5}'.format(round(impedance)),
|
||||
# '|', '{:5}'.format(round(phase, 1)),
|
||||
# '|', '{:5}'.format(round(current, 3)),
|
||||
# '|', '{:1}'.format(gain),
|
||||
# '|', '{:1}'.format(finishMode),
|
||||
# '@', str(self.device), '|')
|
||||
pass
|
||||
else:
|
||||
# print('|', '{:10}'.format(time_stamp),
|
||||
# '|', '{:5}'.format(delta),
|
||||
# '|', '{:5}'.format(ch1),
|
||||
# '|', '{:5}'.format(ch2),
|
||||
# '|', '{:5}'.format(ch3),
|
||||
# '|', '{:5}'.format(cycle_number),
|
||||
# '|', '{:1}'.format(gain),
|
||||
# '|', '{:1}'.format(finishMode),
|
||||
# '@', str(self.device), '|')
|
||||
pass
|
||||
|
||||
if finishMode == True:
|
||||
print("finishMode full data:", list(data), datetime.now())
|
||||
|
||||
@@ -651,6 +651,8 @@ class DeviceInstruction:
|
||||
VIS_DEVICE_DONE = 0x20
|
||||
"""identify device done"""
|
||||
|
||||
VIS_CC_ZERO = 0x40
|
||||
|
||||
VIS_STI = 0xC0
|
||||
"""stimulation on virtual instruction"""
|
||||
|
||||
@@ -724,6 +726,7 @@ class DeviceCommonInstruction:
|
||||
STOP_STIMULATE = "stop_stimulate"
|
||||
VIS_DEVICE_DETECT = 'VIS_DEVICE_DETECT'
|
||||
VIS_DEVICE_DONE = 'VIS_DEVICE_DONE'
|
||||
VIS_CC_ZERO = 'VIS_CC_ZERO'
|
||||
CIS_VOLT = 'CIS_VOLT'
|
||||
CIS_VERSION = 'CIS_VERSION'
|
||||
|
||||
@@ -747,6 +750,8 @@ class DeviceCommonInstruction:
|
||||
return 'VIS_DEVICE_DETECT',
|
||||
elif instruction == cls.VIS_DEVICE_DONE:
|
||||
return 'VIS_DEVICE_DONE',
|
||||
elif instruction == cls.VIS_CC_ZERO:
|
||||
return 'VIS_CC_ZERO',
|
||||
elif instruction == cls.RECORD:
|
||||
return 'VIS_STARTR',
|
||||
elif instruction == cls.RECORD_ALL:
|
||||
|
||||
@@ -1032,7 +1032,7 @@ class CompletedDevice(Device):
|
||||
|
||||
@property
|
||||
def mac_address_in_str(self) -> str:
|
||||
return ':'.join('{:02x}'.format(b) for b in self._device.mac_address).upper()
|
||||
return ':'.join('{:02x}'.format(b) for b in self._device.mac_address)
|
||||
|
||||
@property
|
||||
def device(self) -> Device:
|
||||
@@ -1105,8 +1105,6 @@ class CompletedDevice(Device):
|
||||
return self._configuration.get_parameter(name, False)
|
||||
|
||||
def set_multi_parameters(self, parameter):
|
||||
if len(parameter) == 0:
|
||||
return
|
||||
for (name, value) in parameter[0].items():
|
||||
if name != 'target':
|
||||
self.set_parameter(name, value)
|
||||
@@ -1130,11 +1128,6 @@ class CompletedDevice(Device):
|
||||
self._parameter.set_parameter(name, value)
|
||||
# raise RuntimeError('illegal parameter value : ' + value) from e
|
||||
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)
|
||||
|
||||
on_change = info.on_change
|
||||
|
||||
@@ -35,7 +35,7 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
'_pin_ram_sel_value', '_pin_mem_sel_value', '_pin_mem_req_value',
|
||||
'_read_green_times','_read_red_times',
|
||||
'_elite_data_len', '_mem_header_len', '_mem_tailer_len', '_single_data_len',
|
||||
'_head_wrong_cnt', '_pin_busy_value')
|
||||
'_head_wrong_cnt')
|
||||
|
||||
def __init__(self,
|
||||
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
|
||||
|
||||
# buffer
|
||||
self._tx_buffer_header = [0] * 64
|
||||
self._tx_buffer_header = [0] * 19
|
||||
self._tx_buffer_data = [0] * (self._single_data_len * 10 + 3)
|
||||
|
||||
# memory control pin
|
||||
self.pin_busy: Optional[InputPin] = InputPin.get_used(P3Pin.MEM_BZY)
|
||||
self.pin_busy = OutputPin.get_used(P3Pin.MEM_BZY, True)
|
||||
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_ram_sel: Optional[InputPin] = InputPin.get_used(P3Pin.MEM_SEL) # MEM_SEL -> actually is RAM_SEL, which RAM is assign
|
||||
@@ -62,7 +62,6 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
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_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_red_times = 0
|
||||
@@ -99,14 +98,6 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
self._pin_ram_sel_value[channel] = True
|
||||
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
|
||||
def select(self) -> int:
|
||||
return self._selector.channel
|
||||
@@ -225,9 +216,7 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
return
|
||||
|
||||
def recv_memory(self, device: int) -> Optional[bytes]:
|
||||
# self.pin_busy.output(False)
|
||||
|
||||
# print('mem_req==ram_sel,[', self._pin_mem_req_value[device], ',', self._pin_ram_sel_value[device], ']')
|
||||
self.pin_busy.output(False)
|
||||
|
||||
rx = []
|
||||
|
||||
@@ -311,9 +300,6 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
print("green data print:", data, device, datetime.now())
|
||||
return None
|
||||
|
||||
# print('data=', list(data))
|
||||
# print('Ram:', data[62])
|
||||
|
||||
if (length >= 4000):
|
||||
flag_print = True
|
||||
print("green data: big length:", length)
|
||||
@@ -429,9 +415,9 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
except BaseException as e:
|
||||
print(e)
|
||||
|
||||
# finally:
|
||||
# # print("\n")
|
||||
# self.pin_busy.output(True)
|
||||
finally:
|
||||
# print("\n")
|
||||
self.pin_busy.output(True)
|
||||
|
||||
return bytes(rx)
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ class UARTInterface(LowLevelHardwareInterface):
|
||||
self._serial = serial.Serial(self._port,
|
||||
baudrate=self._baudrate,
|
||||
timeout=0,
|
||||
writeTimeout=1)
|
||||
writeTimeout=0.01)
|
||||
# deprecate function name which change at version 3.0
|
||||
self._serial.flushInput()
|
||||
self._serial.flushOutput()
|
||||
|
||||
@@ -24,11 +24,3 @@ class Action():
|
||||
@property
|
||||
def condition(self):
|
||||
return self._condition
|
||||
|
||||
def as_json(self):
|
||||
return {
|
||||
'id': self._id,
|
||||
'type': self._type,
|
||||
'target': self._target,
|
||||
'condition': self._condition
|
||||
}
|
||||
|
||||
@@ -45,8 +45,8 @@ class Condition():
|
||||
# print(operator, x, y)
|
||||
cases = {
|
||||
"equal": lambda a, b: a == b,
|
||||
"bigger": lambda a, b: a >= b,
|
||||
"smaller": lambda a, b: a <= b,
|
||||
"bigger": lambda a, b: a > b,
|
||||
"smaller": lambda a, b: a < b,
|
||||
}
|
||||
|
||||
return cases[operator](x, y)
|
||||
@@ -56,8 +56,7 @@ class Condition():
|
||||
return getattr(self, self.type)(**kwargs)
|
||||
|
||||
def absolute_time(self, **kwargs):
|
||||
# now = int(time())
|
||||
now = round(time(), 1)
|
||||
now = int(time())
|
||||
time_condition = round(self.datetime_to_timestamp(self.str_to_datetime(self._value)))
|
||||
|
||||
return self.compareWith(self.comparsion, now, time_condition)
|
||||
@@ -66,80 +65,32 @@ class Condition():
|
||||
project_start_time = kwargs['project_start_time']
|
||||
delay_time = kwargs['delay_time']
|
||||
|
||||
# time_diff = int(time() - project_start_time - delay_time)
|
||||
time_diff = round(time() - project_start_time - delay_time, 1)
|
||||
return self.compareWith(self.comparsion, time_diff, round(int(self._value), 1))
|
||||
time_diff = int(time() - project_start_time - delay_time)
|
||||
return self.compareWith(self.comparsion, time_diff, int(self._value))
|
||||
|
||||
def after_task_run(self, **kwargs):
|
||||
# print('relative_time_from_task', kwargs['task_start_time'],kwargs['delay_time'])
|
||||
# print('relative_time_from_task', kwargs,kwargs['task_start_time'],kwargs['delay_time'])
|
||||
if len(kwargs['task_start_time']) == 0:
|
||||
return False
|
||||
task = kwargs['self_task']
|
||||
running_task = kwargs['running_task']
|
||||
task_start_time = kwargs['task_start_time'][-1]
|
||||
delay_time = kwargs['delay_time']
|
||||
|
||||
time_diff = round(time() - task_start_time - delay_time, 1)
|
||||
# print('real_diff', time() - task_start_time - delay_time)
|
||||
# print(task.name, task.uuid, time_diff, round(int(self._value), 1), running_task.name, running_task.uuid)
|
||||
# if round(int(self._value), 1) == 0 and time_diff == 0.1:
|
||||
# return True
|
||||
if task.uuid != running_task.uuid:
|
||||
return False
|
||||
return self.compareWith('bigger', time_diff, round(int(self._value), 1))
|
||||
# return self.compareWith(self.comparsion, time_diff, round(int(self._value), 1))
|
||||
|
||||
time_diff = int(time() - task_start_time - delay_time)
|
||||
# print('time_diff', time_diff)
|
||||
return self.compareWith(self.comparsion, time_diff, int(self._value))
|
||||
|
||||
def device(self, **kwargs):
|
||||
print('device')
|
||||
|
||||
""" def previous_task_done(self, **kwargs):
|
||||
def previous_task_done(self, **kwargs):
|
||||
running_task = kwargs['running_task']
|
||||
if running_task.status == 2 and self._active == False:
|
||||
self._active = 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
|
||||
|
||||
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):
|
||||
return datetime.strptime(time_str,'%Y-%m-%dT%H:%M')
|
||||
|
||||
def datetime_to_timestamp(self, 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
|
||||
}
|
||||
return datetime.timestamp(date)
|
||||
@@ -22,7 +22,6 @@ class 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._idle_instruction = []
|
||||
|
||||
@property
|
||||
def start(self) -> list:
|
||||
@@ -30,8 +29,4 @@ class Instruction():
|
||||
|
||||
@property
|
||||
def stop(self) -> list:
|
||||
return self._stop_instruction
|
||||
|
||||
@property
|
||||
def idle(self) -> list:
|
||||
return self.idle_instruction
|
||||
return self._stop_instruction
|
||||
@@ -19,12 +19,12 @@ key_list = {
|
||||
}
|
||||
|
||||
class Project(threading.Thread):
|
||||
def __init__(self, project, device_manager: DeviceManager, mqttThread = None, log_verbose = None, name="project"):
|
||||
def __init__(self, project, device_manager: DeviceManager, mqttThread = None, name="project"):
|
||||
super(Project, self).__init__(name = name)
|
||||
self._project = project
|
||||
self._device_manager = device_manager
|
||||
self._mqtt_thread = mqttThread
|
||||
self._time_interval = 0.1
|
||||
self._time_interval = 1
|
||||
self._start_time = None
|
||||
self._end_time = None
|
||||
|
||||
@@ -33,7 +33,7 @@ class Project(threading.Thread):
|
||||
self._name = None
|
||||
self._desc = None
|
||||
self._device = None
|
||||
self._complete_device = {}
|
||||
self._complete_device = []
|
||||
self._status = 0
|
||||
|
||||
self._instruction_set = Instruction()
|
||||
@@ -41,12 +41,6 @@ class Project(threading.Thread):
|
||||
|
||||
self._task_manager = None
|
||||
|
||||
self._cycle = []
|
||||
|
||||
self._count = 1 #流水號
|
||||
|
||||
self.log_verbose = log_verbose
|
||||
|
||||
self.setup_project(project)
|
||||
self.setup_device(self._device)
|
||||
|
||||
@@ -56,7 +50,7 @@ class Project(threading.Thread):
|
||||
key = key_list[key]
|
||||
|
||||
if key == 'task':
|
||||
self._task_manager = TaskManager(project['task'], project['cycle'])
|
||||
self._task_manager = TaskManager(project['task'])
|
||||
elif key == 'uuid':
|
||||
pass
|
||||
else:
|
||||
@@ -64,9 +58,8 @@ class Project(threading.Thread):
|
||||
|
||||
def setup_device(self, device_list):
|
||||
for device in device_list:
|
||||
mac_address = device_list[device]['pair']
|
||||
complete_device = self._device_manager.get_device(mac_address)
|
||||
self._complete_device[device] = complete_device
|
||||
complete_device = self._device_manager.get_device(device['connectDevice']['device_address'])
|
||||
self._complete_device.append(complete_device)
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
@@ -91,14 +84,6 @@ class Project(threading.Thread):
|
||||
@name.setter
|
||||
def name(self, new_name):
|
||||
self._name = new_name
|
||||
|
||||
@property
|
||||
def cycle(self) -> list:
|
||||
return self._cycle
|
||||
|
||||
@cycle.setter
|
||||
def cycle(self, new_cycle):
|
||||
self._cycle = new_cycle
|
||||
|
||||
@property
|
||||
def desc(self) -> str:
|
||||
@@ -132,14 +117,9 @@ class Project(threading.Thread):
|
||||
def mqtt_thread(self):
|
||||
return self._mqtt_thread
|
||||
|
||||
@property
|
||||
def running_task(self):
|
||||
return self._task_manager.running_task
|
||||
|
||||
def run(self):
|
||||
self._status = 1
|
||||
self._start_time = time()
|
||||
self.log_verbose('Project ' + self.name + ' start')
|
||||
self.mqtt_thread.broadcast_command('project:' + self._name + ' start at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
|
||||
|
||||
while not self._stop_flag :
|
||||
@@ -150,94 +130,41 @@ class Project(threading.Thread):
|
||||
for task in check_list:
|
||||
if task != None:
|
||||
now = time()
|
||||
# print('round task', task.name)
|
||||
# print('running task', self._task_manager.running_task.name, self._task_manager.running_task.status)
|
||||
# if self._task_manager.prev_task != None:
|
||||
# print('previous_task', self._task_manager.prev_task.name, self._task_manager.prev_task.status)
|
||||
|
||||
match_condition_list = task.check_condition(
|
||||
project_start_time = self._start_time,
|
||||
delay_time = delay_time,
|
||||
running_task= self._task_manager.running_task,
|
||||
previous_task = self._task_manager.prev_task,
|
||||
self_task = task
|
||||
previous_task = self._task_manager.prev_task
|
||||
)
|
||||
|
||||
# print('match_condition_list', match_condition_list)
|
||||
for condition in match_condition_list:
|
||||
match_action_list = task.get_match_action(condition.id)
|
||||
for action in match_action_list:
|
||||
if action.type == 'cycle' and condition.type == 'previous_task_done':
|
||||
self.mqtt_thread.broadcast_command('project:task ' + task.name + ' start at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
|
||||
# print('match_action', action.type, action.target)
|
||||
if action.type == 'start' and task.status != 1:
|
||||
self._task_manager.set_running_task(task)
|
||||
if action.type == 'cycle' and condition.type == 'until_button_trigger':
|
||||
self._task_manager.running_task.stop()
|
||||
self.mqtt_thread.broadcast_command('project:task ' + task.name + ' start at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
|
||||
|
||||
if self._task_manager.running_task != None:
|
||||
if self._task_manager.running_task.uuid == task.uuid and action.type == 'cycle' and condition.type == 'after_task_run':
|
||||
self._task_manager.running_task.stop()
|
||||
|
||||
if action.type == 'start':
|
||||
if task.status != 1:
|
||||
self._task_manager.set_running_task(task)
|
||||
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 == 'stop':
|
||||
# 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._count += 1
|
||||
# if self.check_running_task_not_run() == True:
|
||||
# self._task_manager.running_task.stop()
|
||||
|
||||
elif action.type == 'idle':
|
||||
self._task_manager.running_task.stop()
|
||||
|
||||
instruction_set = None
|
||||
|
||||
if action.target is not None:
|
||||
device = self._complete_device[action.target]
|
||||
if ((action.type == 'start' and device.status == 0) or (action.type == 'stop' and device.status == 1)):
|
||||
self.log_verbose('Project' + self.name + 'Task ' + task.name + ' match_condition ' + condition.type + ' trigger_action ' + action.type + ' ' + str(action.target))
|
||||
task_info = task.get_task_info(action)
|
||||
instruction_set = getattr(self._instruction_set, action.type, None)
|
||||
|
||||
# 檔名修正
|
||||
# device
|
||||
task_info['file_name'] += '#' + device.mac_address_in_str[12:].upper()
|
||||
# 流水號
|
||||
task_info['file_name'] += '#' + str(self._count)
|
||||
|
||||
# 添加cycle資訊
|
||||
if len(self.cycle) > 0:
|
||||
index = self._task_manager.get_index_by_task(task)
|
||||
# get list of cycle determine by index of task
|
||||
filtered = list(filter(lambda info: self._task_manager.get_index_by_uuid(info['range'][0]) < index and self._task_manager.get_index_by_uuid(info['range'][1]) > index, self.cycle))
|
||||
|
||||
if len(filtered) == 0:
|
||||
pass
|
||||
elif len(filtered) == 1:
|
||||
if filtered[0]['useID'] == True:
|
||||
task_info['file_name'] += '#' + str(filtered[0]['id'])
|
||||
else:
|
||||
task_info['file_name'] += '#' + str(filtered[0]['name']) + '-' + str(filtered[0]['count'])
|
||||
else:
|
||||
# if multi cycle, then sort by range from task index to cycle start index, then loop concat filename
|
||||
filtered.sort(key=lambda info: abs(self._task_manager.get_index_by_uuid(info['range'][0]) - index))
|
||||
for cycle_info in filtered:
|
||||
if cycle_info['useID'] == True:
|
||||
task_info['file_name'] += '#' + str(cycle_info['id'])
|
||||
else:
|
||||
task_info['file_name'] += '#' + str(cycle_info['name']) + '-' + str(cycle_info['count'])
|
||||
self.log_verbose('file name ' + task_info['file_name'])
|
||||
|
||||
if instruction_set != None and len(task.parameter_set) > 0:
|
||||
if action.type == 'start':
|
||||
self._count += 1
|
||||
for instruction in instruction_set:
|
||||
print('instruction 1', device, instruction, datetime.now())
|
||||
args = list(map(lambda arg: task_info[arg], instruction['arguments']))
|
||||
target=getattr(device, instruction['method'])(*args)
|
||||
print('instruction 2', device, instruction, datetime.now())
|
||||
device = self._complete_device[action.target]
|
||||
task_info = task.get_task_info(action)
|
||||
instruction_set = getattr(self._instruction_set, action.type, None)
|
||||
# print('instruction_set',instruction_set)
|
||||
|
||||
if instruction_set != None:
|
||||
for instruction in instruction_set:
|
||||
args = list(map(lambda arg: task_info[arg], instruction['arguments']))
|
||||
threading.Thread(target=getattr(device, instruction['method'])(*args))
|
||||
|
||||
delay_time += (time() - now)
|
||||
|
||||
# check task not running then stop
|
||||
if self.check_running_task_not_run() == True:
|
||||
if self._task_manager.running_task.type == '':
|
||||
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.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()
|
||||
|
||||
# check project done then close project
|
||||
@@ -273,43 +200,17 @@ class Project(threading.Thread):
|
||||
return False
|
||||
return True
|
||||
|
||||
def set_content(self, content):
|
||||
self.running_task.button_trigger = True
|
||||
|
||||
def set_cycle(self, index, content):
|
||||
# change cycle name
|
||||
for key in content:
|
||||
self.cycle[index][key] = content[key]
|
||||
|
||||
# change task name
|
||||
# self._task_manager.get_task_by_uuid(self.cycle[index]['range'][0]).name = content['name']
|
||||
# self._task_manager.get_task_by_uuid(self.cycle[index]['range'][1]).name = content['name']
|
||||
|
||||
def check_running_task_not_run(self):
|
||||
# if no running task
|
||||
if self._task_manager.running_task == None:
|
||||
return False
|
||||
|
||||
# if running is cycle then no need to stop by device
|
||||
if self._task_manager.running_task.type == 'cycle':
|
||||
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:
|
||||
if self._complete_device[device].status == 1:
|
||||
return False
|
||||
return True
|
||||
|
||||
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 = {
|
||||
'id': self._id,
|
||||
'name': self._name,
|
||||
@@ -318,7 +219,6 @@ class Project(threading.Thread):
|
||||
'status': self._status,
|
||||
'device': self._device,
|
||||
'task': self.task_list,
|
||||
'running_task': running_task,
|
||||
'cycle': self._cycle
|
||||
'running_task': self._task_manager.running_task.as_json()
|
||||
}
|
||||
return data
|
||||
|
||||
@@ -9,14 +9,13 @@ def json_stringify(o: Any) -> str:
|
||||
return _json_stringify(o, separators=(',', ':'))
|
||||
|
||||
class ProjectManager():
|
||||
def __init__(self, device_manager: DeviceManager, mqtt_thread=None, log_verbose = None) :
|
||||
def __init__(self, device_manager: DeviceManager, mqtt_thread=None) :
|
||||
self._project_list = []
|
||||
self._mqtt_thread = mqtt_thread
|
||||
self._device_manager = device_manager
|
||||
self.log_verbose = log_verbose
|
||||
|
||||
def create(self, project):
|
||||
new_project = Project(project, self._device_manager, self._mqtt_thread, self.log_verbose)
|
||||
new_project = Project(project, self._device_manager, self._mqtt_thread)
|
||||
self._project_list.append(new_project)
|
||||
return new_project
|
||||
|
||||
@@ -38,11 +37,3 @@ class ProjectManager():
|
||||
def stop_project(self, project):
|
||||
_project = self.get(project)
|
||||
_project.stop()
|
||||
|
||||
def set_project(self, project_uuid, content):
|
||||
_project = self.get(project_uuid)
|
||||
_project.set_content(content)
|
||||
|
||||
def set_project_cycle(self, project_uuid, index, content):
|
||||
_project = self.get(project_uuid)
|
||||
_project.set_cycle(index, content)
|
||||
|
||||
@@ -12,39 +12,29 @@ key_list = {
|
||||
class Task:
|
||||
def __init__(self, task):
|
||||
self._id = None
|
||||
self._uuid = None
|
||||
self._type = None
|
||||
self._name = None
|
||||
self._parent = None
|
||||
self._cycle = None
|
||||
self._cycle_count = 0
|
||||
self._cycle_next = None
|
||||
self._cycle_next_uuid = None
|
||||
self._device = None
|
||||
self._event = None
|
||||
self._trigger = None
|
||||
self._parameter_set = None
|
||||
self._condition = None
|
||||
self._action = None
|
||||
# -1: init 0: start(idle), 1: run, 2: close(idle)
|
||||
# -1: initial 0: start(idle), 1: running, 2: close(idle)
|
||||
self._status = 0
|
||||
self._next = None
|
||||
|
||||
# action & condition info
|
||||
self._condition_list: List[Condition] = []
|
||||
self._action_list: List[Action] = []
|
||||
self._instruction_list = []
|
||||
self._record_list = []
|
||||
|
||||
# time info
|
||||
self._start_time = []
|
||||
self._idle_time = []
|
||||
self._end_time = []
|
||||
self._period = None
|
||||
|
||||
# trigger info
|
||||
self._button_trigger = False
|
||||
|
||||
self.load_task(task)
|
||||
|
||||
def load_task(self, task) -> None:
|
||||
@@ -84,14 +74,6 @@ class Task:
|
||||
@uuid.setter
|
||||
def uuid(self, new_uuid):
|
||||
self._uuid = new_uuid
|
||||
|
||||
@property
|
||||
def type(self):
|
||||
return self._type
|
||||
|
||||
@type.setter
|
||||
def type(self, new_type):
|
||||
self._type = new_type
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
@@ -118,31 +100,6 @@ class Task:
|
||||
@cycle.setter
|
||||
def cycle(self, 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
|
||||
def device(self) -> dict:
|
||||
@@ -220,14 +177,6 @@ class Task:
|
||||
def end_time(self) -> List:
|
||||
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):
|
||||
self._start_time.append(time())
|
||||
|
||||
@@ -258,10 +207,6 @@ class Task:
|
||||
|
||||
def stop(self):
|
||||
self.status = 2
|
||||
|
||||
def reset(self):
|
||||
self.status = -1
|
||||
# self.status = 0
|
||||
|
||||
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)
|
||||
@@ -285,7 +230,7 @@ class Task:
|
||||
return {
|
||||
'device': action.target,
|
||||
'parameter': self.get_parameter_set_by_device(action.target),
|
||||
'file_name': self._name,
|
||||
'file_name': self._name + '-' + str(action.target),
|
||||
'parent': self.parent,
|
||||
'instruction': _type
|
||||
}
|
||||
@@ -295,12 +240,7 @@ class Task:
|
||||
'id': self.id,
|
||||
'name': self.name,
|
||||
'parent': self.parent,
|
||||
'type': self.type,
|
||||
'uuid': self.uuid,
|
||||
'cycle': self.cycle,
|
||||
'cycle_count': self.cycle_count,
|
||||
'cycle_next': self.cycle_next,
|
||||
'cycle_next_uuid': self.cycle_next_uuid,
|
||||
'device': self.device,
|
||||
'event': self.event,
|
||||
'trigger': self.trigger,
|
||||
|
||||
@@ -12,12 +12,11 @@ def json_stringify(o: Any) -> str:
|
||||
return _json_stringify(o, separators=(',', ':'))
|
||||
|
||||
class TaskManager():
|
||||
def __init__(self, task_list, cycle_list):
|
||||
def __init__(self, task_list):
|
||||
self._task_list = []
|
||||
self._next_task = []
|
||||
self._prev_task = None
|
||||
self._running_task = None
|
||||
self._cycle_list = cycle_list
|
||||
|
||||
self.load_task_list(task_list)
|
||||
|
||||
@@ -45,23 +44,6 @@ class TaskManager():
|
||||
def next_task(self):
|
||||
return self._next_task
|
||||
|
||||
def get_task_by_index(self, index):
|
||||
return self._task_list[index]
|
||||
|
||||
def get_task_by_uuid(self, uuid):
|
||||
return next((x for x in self.task_list if x.uuid == uuid), None)
|
||||
|
||||
def get_index_by_task(self, task):
|
||||
return next((i for i, x in enumerate(self.task_list) if x.uuid == task.uuid), None)
|
||||
|
||||
def get_index_by_uuid(self, uuid):
|
||||
return next((i for i, x in enumerate(self.task_list) if x.uuid == uuid), None)
|
||||
|
||||
def check_task_is_cycle_end(self, task):
|
||||
for index, cycle in enumerate(self._cycle_list):
|
||||
if cycle['range'][1] == task.uuid:
|
||||
return index
|
||||
|
||||
@property
|
||||
def check_list(self):
|
||||
return [self._running_task, *self._next_task]
|
||||
@@ -75,8 +57,7 @@ class TaskManager():
|
||||
task = Task(task)
|
||||
self._task_list.append(task)
|
||||
|
||||
# original version
|
||||
""" def set_running_task(self, task):
|
||||
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:
|
||||
@@ -99,51 +80,6 @@ class TaskManager():
|
||||
_task = next((task for task in self._task_list if task.uuid == task_uuid), None)
|
||||
if _task != None:
|
||||
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:
|
||||
return False
|
||||
|
||||
# save task
|
||||
self._prev_task = self._running_task
|
||||
# clear next task list
|
||||
self._next_task.clear()
|
||||
# set task to running_task
|
||||
self._running_task = task
|
||||
self._running_task.run()
|
||||
|
||||
# if previous task is still running, then need to close
|
||||
if self._prev_task != None:
|
||||
if self._prev_task.status == 1:
|
||||
self._prev_task.stop()
|
||||
# if reach cycle end, count < max, then go to cycle start
|
||||
cycle_index = self.check_task_is_cycle_end(task)
|
||||
if cycle_index is None:
|
||||
# print('next', self._running_task.name, self._running_task.next)
|
||||
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)
|
||||
# print('self._next_task', self._next_task)
|
||||
else:
|
||||
# print('cycle', self._cycle_list[cycle_index])
|
||||
cycle = self._cycle_list[cycle_index]
|
||||
if int(cycle['count']) < int(cycle['max']):
|
||||
self._next_task.append(self.get_task_by_uuid(cycle['range'][0]))
|
||||
cycle['count'] += 1
|
||||
else:
|
||||
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)
|
||||
cycle['count'] = 1
|
||||
|
||||
except RuntimeError as e:
|
||||
print(e)
|
||||
|
||||
|
||||
@@ -20,6 +20,11 @@ from statistics import mean
|
||||
import random
|
||||
# from numba import jit
|
||||
|
||||
from .lttb import largest_triangle_three_buckets
|
||||
import math
|
||||
|
||||
from scipy import signal
|
||||
|
||||
from copy import copy
|
||||
|
||||
def json_stringify(o) -> str:
|
||||
@@ -1015,7 +1020,7 @@ class RecordingFileWriter:
|
||||
'_mini_scale_list', '_time_real_time', '_data_rl', '_data_db',
|
||||
'_raw_save', '_mini_save', '_data_time_ch', '_data_value_ch_for_rl',
|
||||
'_data_time_ch_for_rl', '_device_id', '_send_data', '_data_mqtt_ch', '_id_db_save', '_raw_create_not_done',
|
||||
'_mini_create_not_done')
|
||||
'_mini_create_not_done', '_data_all')
|
||||
|
||||
def __init__(self, meta: RecordingMetaFile, device_id, database = None):
|
||||
self._meta = meta
|
||||
@@ -1075,6 +1080,8 @@ class RecordingFileWriter:
|
||||
self._data_time_ch = {}
|
||||
self._id_db_save = {}
|
||||
|
||||
self._data_all = {}
|
||||
|
||||
# mini data
|
||||
self._data_mini_ch = {}
|
||||
|
||||
@@ -1227,17 +1234,17 @@ class RecordingFileWriter:
|
||||
def get_data_iter(self, d, mqtt_thread):
|
||||
# print('****d size', d.data_size)
|
||||
for t, c, v in d.entry_iter():
|
||||
# print(t,c,v)
|
||||
if c in self._data_db:
|
||||
self._data_all[c].append([int(t), v])
|
||||
### send real-time
|
||||
if len(self._data_rl[c]) > 0 and self._send_data[c]:
|
||||
self._data_rl[c].append(str(int(t)))
|
||||
mes = ' '.join(self._data_rl[c])
|
||||
# self._data_mqtt_ch[c] = self._data_rl[c].copy()
|
||||
# self._data_mqtt_ch[c].append(str(int(t)))
|
||||
# print('message1', mes)
|
||||
mqtt_thread[c].on_message(mes)
|
||||
self._data_rl[c].clear()
|
||||
self._send_data[c] = False
|
||||
### send real-time
|
||||
|
||||
sample_rate_rl = 1
|
||||
# rec data
|
||||
@@ -1250,40 +1257,35 @@ class RecordingFileWriter:
|
||||
self._data_value_ch[c].append(int(v))
|
||||
self._data_value_ch_for_rl[c].append(int(v))
|
||||
self._data_time_ch_for_rl[c].append(int(t))
|
||||
# self._data_time_ch[c].append(int(t))
|
||||
# print('self._data_value_ch[c]', self._data_value_ch[c])
|
||||
# print('self._data_value_ch_for_rl[c]', self._data_value_ch_for_rl[c])
|
||||
# print('self._data_time_ch_for_rl[c]', self._data_time_ch_for_rl[c])
|
||||
for scale in self._mini_scale_list:
|
||||
if self._data_mini_ch[c][str(scale)]['start_time'] is None:
|
||||
self._data_mini_ch[c][str(scale)]['start_time'] = str(int(t))
|
||||
|
||||
# print('len(self._data_value_ch_for_rl[c])', len(self._data_value_ch_for_rl[c]))
|
||||
# print('sample_rate_rl:', sample_rate_rl)
|
||||
if len(self._data_value_ch_for_rl[c]) >= sample_rate_rl:
|
||||
if len(self._data_value_ch_for_rl[c]) == 1:
|
||||
if len(self._data_rl[c]) == 0:
|
||||
self._data_rl[c].append(str(int(t)))
|
||||
# self._data_rl[c].append(str(self._data_time_ch_for_rl[c][0]))
|
||||
self._data_rl[c].append(str(self._data_value_ch_for_rl[c][0]))
|
||||
else:
|
||||
if len(self._data_rl[c]) == 0:
|
||||
self._data_rl[c].append(str(int(t)))
|
||||
# self._data_rl[c].append(str(self._data_time_ch_for_rl[c][0]))
|
||||
# self._data_rl[c].append(str(self._data_value_ch_for_rl[c][0]))
|
||||
_max = max(self._data_value_ch_for_rl[c])
|
||||
_max_index = self._data_value_ch_for_rl[c].index(_max)
|
||||
_min = min(self._data_value_ch_for_rl[c])
|
||||
_min_index = self._data_value_ch_for_rl[c].index(_min)
|
||||
# _mean = mean(self._data_value_ch_for_rl[c])
|
||||
|
||||
# _first_time = self._data_time_ch_for_rl[c][0]
|
||||
# _last_time = self._data_time_ch_for_rl[c][-1]
|
||||
# print('_max, _max_index, _min, _min_index', _max, _max_index, _min, _min_index)
|
||||
|
||||
if _max_index < _min_index:
|
||||
# self._data_rl[c].append(str(_first_time))
|
||||
self._data_rl[c].append(str(_max))
|
||||
# self._data_rl[c].append(str(_last_time))
|
||||
self._data_rl[c].append(str(_min))
|
||||
else:
|
||||
# self._data_rl[c].append(str(_first_time))
|
||||
self._data_rl[c].append(str(_min))
|
||||
# self._data_rl[c].append(str(_last_time))
|
||||
self._data_rl[c].append(str(_max))
|
||||
|
||||
self._data_value_ch_for_rl[c].clear()
|
||||
@@ -1292,9 +1294,6 @@ class RecordingFileWriter:
|
||||
# mini picture
|
||||
if len(self._data_value_ch[c]) >= 10:
|
||||
self._data_mini_ch[c]['10']['mean'].append( int(mean(self._data_value_ch[c][0:9])) )
|
||||
# self._data_mini_ch[c]['10']['random'].append( str(self._data_value_ch[c][random.randint(0,9)]) )
|
||||
# _bar = self.get_bar(self._data_value_ch[c], None)
|
||||
# self._data_mini_ch[c]['10']['bar'].extend(_bar)
|
||||
self._data_value_ch[c].clear()
|
||||
if int(len(self._data_mini_ch[c]['10']['mean']) / 10) - self._data_mini_ch[c]['10']['dec'] > 0:
|
||||
self._data_mini_ch[c]['100']['mean'].append( int(mean(self._data_mini_ch[c]['10']['mean'][-10:])) )
|
||||
@@ -1316,6 +1315,13 @@ class RecordingFileWriter:
|
||||
self._data_db[c].append(str(int(t)))
|
||||
self._data_db[c].append(str(v))
|
||||
self._time_now = int(t)
|
||||
# print('self._data_rl',self._data_rl)
|
||||
# print('self._data_db', self._data_db)
|
||||
# print('self._data_value_ch', self._data_value_ch)
|
||||
# print('self._data_value_ch_for_rl', self._data_value_ch_for_rl)
|
||||
# print('self._data_time_ch_for_rl', self._data_time_ch_for_rl)
|
||||
# print('self._data_time_ch', self._data_time_ch)
|
||||
# print('self._id_db_save', self._id_db_save)
|
||||
return
|
||||
|
||||
# @calculate_time(1)
|
||||
@@ -1363,6 +1369,7 @@ class RecordingFileWriter:
|
||||
self._data_db[ch] = []
|
||||
self._time[ch] = 0
|
||||
self._time_real_time[ch] = 0
|
||||
self._data_all[ch] = []
|
||||
if len(self._data_mini_ch) == 0:
|
||||
for ch in self._channel_list:
|
||||
self._data_mini_ch[ch] = {}
|
||||
@@ -1376,6 +1383,37 @@ class RecordingFileWriter:
|
||||
}
|
||||
|
||||
self.get_data_iter(d, mqtt_thread)
|
||||
|
||||
print('data', len(self._data_all[0]))
|
||||
|
||||
test = []
|
||||
|
||||
# for ch in self._data_all:
|
||||
# if len(self._data_all[ch]) <= 1000:
|
||||
# print('math.ceil(len(self._data_all[ch]) / 10) + 1', math.ceil(len(self._data_all[ch]) / 10) + 1)
|
||||
# test = largest_triangle_three_buckets(self._data_all[ch], math.ceil(len(self._data_all[ch]) / 10) + 1)
|
||||
# else:
|
||||
# self._data_all[ch] = largest_triangle_three_buckets(self._data_all[ch], 1000)
|
||||
# test = self._data_all[ch]
|
||||
|
||||
# print('test', test)
|
||||
# a = [' '.join(list(map(str, b))) for b in test]
|
||||
# print('a', a)
|
||||
# mes = ' '.join(a)
|
||||
# mqtt_thread[50+ch].on_message(mes)
|
||||
|
||||
for ch in self._data_all:
|
||||
if len(self._data_all[ch]) <= 1000:
|
||||
self._data_all[ch] = signal.savgol_filter(self._data_all[ch], 32, 3)
|
||||
else:
|
||||
self._data_all[ch] = signal.savgol_filter(self._data_all[ch], 32, 3)
|
||||
|
||||
print('test', test)
|
||||
a = [' '.join(list(map(str, b))) for b in self._data_all[ch]]
|
||||
print('a', a)
|
||||
mes = ' '.join(a)
|
||||
mqtt_thread[50+ch].on_message(mes)
|
||||
|
||||
|
||||
if len(self._recording_file_dict) > 0:
|
||||
for ch in self._data_db.keys():
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
"""
|
||||
The MIT License (MIT)
|
||||
Copyright (c) 2015 Olivier Devoisin
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"""
|
||||
|
||||
import math
|
||||
|
||||
class LttbException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
def largest_triangle_three_buckets(data, threshold):
|
||||
"""
|
||||
Return a downsampled version of data.
|
||||
Parameters
|
||||
----------
|
||||
data: list of lists/tuples
|
||||
data must be formated this way: [[x,y], [x,y], [x,y], ...]
|
||||
or: [(x,y), (x,y), (x,y), ...]
|
||||
threshold: int
|
||||
threshold must be >= 2 and <= to the len of data
|
||||
Returns
|
||||
-------
|
||||
data, but downsampled using threshold
|
||||
"""
|
||||
|
||||
# Check if data and threshold are valid
|
||||
if not isinstance(data, list):
|
||||
raise LttbException("data is not a list")
|
||||
if not isinstance(threshold, int) or threshold <= 2 or threshold >= len(data):
|
||||
raise LttbException("threshold not well defined")
|
||||
for i in data:
|
||||
if not isinstance(i, (list, tuple)) or len(i) != 2:
|
||||
raise LttbException("datapoints are not lists or tuples")
|
||||
|
||||
# Bucket size. Leave room for start and end data points
|
||||
every = (len(data) - 2) / (threshold - 2)
|
||||
|
||||
a = 0 # Initially a is the first point in the triangle
|
||||
next_a = 0
|
||||
max_area_point = (0, 0)
|
||||
|
||||
sampled = [data[0]] # Always add the first point
|
||||
|
||||
for i in range(0, threshold - 2):
|
||||
# Calculate point average for next bucket (containing c)
|
||||
avg_x = 0
|
||||
avg_y = 0
|
||||
avg_range_start = int(math.floor((i + 1) * every) + 1)
|
||||
avg_range_end = int(math.floor((i + 2) * every) + 1)
|
||||
avg_rang_end = avg_range_end if avg_range_end < len(data) else len(data)
|
||||
|
||||
avg_range_length = avg_rang_end - avg_range_start
|
||||
|
||||
while avg_range_start < avg_rang_end:
|
||||
avg_x += data[avg_range_start][0]
|
||||
avg_y += data[avg_range_start][1]
|
||||
avg_range_start += 1
|
||||
|
||||
avg_x /= avg_range_length
|
||||
avg_y /= avg_range_length
|
||||
|
||||
# Get the range for this bucket
|
||||
range_offs = int(math.floor((i + 0) * every) + 1)
|
||||
range_to = int(math.floor((i + 1) * every) + 1)
|
||||
|
||||
# Point a
|
||||
point_ax = data[a][0]
|
||||
point_ay = data[a][1]
|
||||
|
||||
max_area = -1
|
||||
|
||||
while range_offs < range_to:
|
||||
# Calculate triangle area over three buckets
|
||||
area = math.fabs(
|
||||
(point_ax - avg_x)
|
||||
* (data[range_offs][1] - point_ay)
|
||||
- (point_ax - data[range_offs][0])
|
||||
* (avg_y - point_ay)
|
||||
) * 0.5
|
||||
|
||||
if area > max_area:
|
||||
max_area = area
|
||||
max_area_point = data[range_offs]
|
||||
next_a = range_offs # Next a is this b
|
||||
range_offs += 1
|
||||
|
||||
sampled.append(max_area_point) # Pick this point from the bucket
|
||||
a = next_a # This a is the next a (chosen b)
|
||||
|
||||
sampled.append(data[len(data) - 1]) # Always add last
|
||||
|
||||
return sampled
|
||||
@@ -65,7 +65,7 @@ class DataServer(SocketServer, DataAPI):
|
||||
"""
|
||||
global _FLAG_DATA_LOST_STATS_
|
||||
|
||||
super().__init__(DataAPI, 'DataServer', self.ADDR, socket_listen=20)
|
||||
super().__init__(DataAPI, 'DataServer', self.ADDR, socket_listen=3)
|
||||
|
||||
data_options = DataServerOptions.get_options(*options)
|
||||
|
||||
@@ -646,7 +646,6 @@ class DataServer(SocketServer, DataAPI):
|
||||
def whether_to_record(self, device):
|
||||
# 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:
|
||||
# print(self._configurations.keys(), ',', device, datetime.now())
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
@@ -655,9 +654,6 @@ class DataServer(SocketServer, DataAPI):
|
||||
ret = False
|
||||
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():
|
||||
spi_data = sync.recv_memory(device)
|
||||
signal = sync.get_pin_mem_req()
|
||||
@@ -666,18 +662,15 @@ class DataServer(SocketServer, DataAPI):
|
||||
|
||||
else:
|
||||
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 self._configurations.get(device, None) != None:
|
||||
if self._configurations[device].queue_flag:
|
||||
self._configurations[device].queue_flag = False
|
||||
print("q size= ", self._configurations[device]._queue_rec.qsize())
|
||||
|
||||
if self._configurations.get(device, None) != None:
|
||||
self._configurations[device].put_rec_queue(data)
|
||||
# self._no_data_total_duration = 0
|
||||
ret = True
|
||||
if self._configurations[device].queue_flag:
|
||||
self._configurations[device].queue_flag = False
|
||||
print("q size= ", self._configurations[device]._queue_rec.qsize())
|
||||
|
||||
self._configurations[device].put_rec_queue(data)
|
||||
# self._no_data_total_duration = 0
|
||||
ret = True
|
||||
# else:
|
||||
# time_diff = time() - self._recv_memory_cost_time
|
||||
# self._no_data_total_duration += time_diff
|
||||
@@ -706,9 +699,6 @@ class DataServer(SocketServer, DataAPI):
|
||||
self.mqtt_thread.publish('device_instruction', json_stringify(content), inter = True)
|
||||
|
||||
return True
|
||||
|
||||
def show_data(self, device):
|
||||
self._configurations[device].put_rec_queue('show_data')
|
||||
|
||||
class DataRuntime(metaclass=abc.ABCMeta):
|
||||
__slots__ = ('_server', '_device', '_meta_file', '_data_format',
|
||||
|
||||
@@ -105,7 +105,7 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
# device detect
|
||||
self._detect_device_thread = RoutineConnectDeviceThread(self._device_manager, self.mqtt_thread, self.led_thread, 3)
|
||||
|
||||
self._project_manager = ProjectManager(self.device_manager, self.mqtt_thread, self.log_verbose)
|
||||
self._project_manager = ProjectManager(self.device_manager, self.mqtt_thread)
|
||||
|
||||
if not c.flag_disable_led_control:
|
||||
self.led_thread.set_state(LED.COLOR_RED)
|
||||
@@ -819,18 +819,12 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
return True
|
||||
|
||||
@logging_info
|
||||
def device_battery(self, device:int) -> List[int]:
|
||||
battery = {}
|
||||
if device == 'all':
|
||||
device_list = self.device_manager.list_device()
|
||||
if len(device_list) > 0:
|
||||
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
|
||||
def device_battery(self) -> List[int]:
|
||||
device_list = self.device_manager.list_device()
|
||||
if len(device_list) > 0:
|
||||
battery_list = list(map(lambda x: self.device_manager.get_device(x).battery, device_list))
|
||||
|
||||
return battery_list
|
||||
|
||||
@logging_info
|
||||
def device_parent(self, device: int, content: Optional[str] = None) -> List[int]:
|
||||
@@ -1021,7 +1015,6 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
@logging_info
|
||||
def run_project(self, project) -> bool:
|
||||
if project is not None:
|
||||
# print(project)
|
||||
project = self._project_manager.create(project)
|
||||
self._project_manager.run_project(project)
|
||||
return project.as_json()
|
||||
@@ -1031,18 +1024,6 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
if project is not None:
|
||||
self._project_manager.stop_project(project)
|
||||
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
|
||||
def set_project_cycle(self, project, index, content) -> bool:
|
||||
if project is not None:
|
||||
self._project_manager.set_project_cycle(project, index, content)
|
||||
return True
|
||||
|
||||
@logging_info
|
||||
def get_running_project(self) -> bool:
|
||||
@@ -1358,13 +1339,6 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
def _hardware_send_test_set(self, options: Dict[str, str]) -> bool:
|
||||
# TODO write options files
|
||||
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):
|
||||
def __init__(self):
|
||||
|
||||
@@ -185,8 +185,6 @@ class RecordingProcess(Process):
|
||||
self.final_write()
|
||||
self.is_closed = True
|
||||
return False
|
||||
elif q == 'show_data':
|
||||
self._decoder._show_data = not self._decoder._show_data
|
||||
else:
|
||||
self.rec_update()
|
||||
self.sync_data(q)
|
||||
@@ -236,6 +234,7 @@ class RecordingProcess(Process):
|
||||
if len(self._mqtt_send_data_ch_level) == 0:
|
||||
for ch in result.channels():
|
||||
self._mqtt_send_data_ch_level[ch] = MqttDataMessageHandler(self._mqtt_thread, 'data_server/device_data_stream/' + str(result.device) + '/' + str(ch) )
|
||||
self._mqtt_send_data_ch_level[50+ch] = MqttDataMessageHandler(self._mqtt_thread, 'data_server/device_data_stream/' + str(result.device) + '/' + str(ch+50) )
|
||||
ret.append(result)
|
||||
else:
|
||||
continue
|
||||
|
||||
@@ -93,15 +93,13 @@ class SocketClient(metaclass=abc.ABCMeta):
|
||||
if self._socket is None:
|
||||
try:
|
||||
self._socket = Socket(AF_UNIX, SOCK_STREAM)
|
||||
self._socket.settimeout(5)
|
||||
self._socket.settimeout(1)
|
||||
self._socket.connect(self._socket_file)
|
||||
except Exception as e:
|
||||
print('open_socket error:', e)
|
||||
# except FileNotFoundError as e:
|
||||
# raise RuntimeError('server not available') from e
|
||||
except FileNotFoundError as e:
|
||||
raise RuntimeError('server not available') from e
|
||||
|
||||
# except ConnectionRefusedError as e:
|
||||
# raise RuntimeError('server crash') from e
|
||||
except ConnectionRefusedError as e:
|
||||
raise RuntimeError('server crash') from e
|
||||
|
||||
def close_socket(self):
|
||||
if self._socket is not None:
|
||||
|
||||
@@ -1203,7 +1203,7 @@
|
||||
"pe": "SAMPLE_RATE"
|
||||
},
|
||||
"data": [
|
||||
"X0C;",
|
||||
"X07;",
|
||||
"B>va;4B>vb;2B>vc;2B>vd;",
|
||||
"4b>pa;4b>pb;",
|
||||
"4b>pc;4b>pd;",
|
||||
@@ -1633,6 +1633,16 @@
|
||||
"dpv_engineering_mode_advanced": [
|
||||
"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_write",
|
||||
"_cdr('20X>ADC_VALUE_I')"
|
||||
|
||||
@@ -492,6 +492,14 @@
|
||||
"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": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
|
||||
@@ -15,33 +15,6 @@
|
||||
"BLE_WRITE_MAX": 255
|
||||
},
|
||||
"parameters": {
|
||||
"HIGHZ_TABLE": {
|
||||
"initial": [
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1
|
||||
],
|
||||
"domain": {
|
||||
"list": [
|
||||
100
|
||||
]
|
||||
},
|
||||
"value": "VALUE"
|
||||
},
|
||||
"DPV_e_init": {
|
||||
"description": "DPV initial voltage ",
|
||||
"record_meta": true,
|
||||
@@ -698,17 +671,6 @@
|
||||
},
|
||||
"on_change": "set_para_DAC_VOLT"
|
||||
},
|
||||
"DAC_VOLT_SCROLL": {
|
||||
"description": "DAC scroll output Voltage",
|
||||
"record_meta": true,
|
||||
"initial": 25000,
|
||||
"domain": [
|
||||
65536
|
||||
],
|
||||
"value": {
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"ADC_VALUE_I": {
|
||||
"description": "ADC value current value",
|
||||
"domain": "int"
|
||||
@@ -874,18 +836,6 @@
|
||||
],
|
||||
"on_change": "set_dac_gain_Vout"
|
||||
},
|
||||
"DAC_VOLT_BUTTON": {
|
||||
"description": "DAC volt",
|
||||
"record_meta": true,
|
||||
"initial": 1,
|
||||
"value": [
|
||||
"10000",
|
||||
"25000",
|
||||
"50000",
|
||||
"60000"
|
||||
],
|
||||
"on_change": "cali_Vout"
|
||||
},
|
||||
"CTRL_HIGH_Z_15": {
|
||||
"description": "ctrl highZ level",
|
||||
"record_meta": true,
|
||||
@@ -901,8 +851,7 @@
|
||||
"initial": 0,
|
||||
"value": [
|
||||
"Iin",
|
||||
"Vin",
|
||||
"Vout"
|
||||
"Vin"
|
||||
]
|
||||
},
|
||||
"BLE_WRITE": {
|
||||
@@ -963,13 +912,11 @@
|
||||
"_notify(True)",
|
||||
"set_adc_gain_I",
|
||||
"set_adc_gain_Vin",
|
||||
"set_dac_gain_Vout",
|
||||
{
|
||||
"expression": "ADC_DAC_CHANNEL_15",
|
||||
"when": {
|
||||
"0": "cali_Iin",
|
||||
"1": "cali_Vin",
|
||||
"2": "cali_Vout"
|
||||
"1": "cali_Vin"
|
||||
}
|
||||
},
|
||||
"_sync(True)",
|
||||
@@ -1060,6 +1007,12 @@
|
||||
"XE0;2B>va"
|
||||
]
|
||||
},
|
||||
"set_dac_gain_Vout": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
"XE1;X02;B>DAC_LEVEL_V_OUT_15"
|
||||
]
|
||||
},
|
||||
"set_adc_gain_I": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
@@ -1072,12 +1025,6 @@
|
||||
"XE1;X01;B>ADC_LEVEL_V_IN_15"
|
||||
]
|
||||
},
|
||||
"set_dac_gain_Vout": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
"XE1;X02;B>DAC_LEVEL_V_OUT_15"
|
||||
]
|
||||
},
|
||||
"set_ctrl_highZ": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
@@ -1105,22 +1052,13 @@
|
||||
"XF1;B>ADC_DAC_CHANNEL_15;B>ADC_LEVEL_V_IN_15"
|
||||
]
|
||||
},
|
||||
"cali_Vout": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"v": "DAC_VOLT_BUTTON"
|
||||
},
|
||||
"data": [
|
||||
"XF1;B>ADC_DAC_CHANNEL_15;B>v"
|
||||
]
|
||||
},
|
||||
"curve_iv": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"va": "VOLT_ORIGIN",
|
||||
"vb": "VOLT_FINAL",
|
||||
"vc": "VOLT_STEP",
|
||||
"vd": "STEP_TIME",
|
||||
"vd": "STEP_TIME * 0x12",
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
"pc": "DAC_LEVEL_V_OUT_15",
|
||||
@@ -1141,7 +1079,7 @@
|
||||
"va": "VOLT_ORIGIN",
|
||||
"vb": "VOLT_FINAL",
|
||||
"vc": "VOLT_STEP",
|
||||
"vd": "STEP_TIME",
|
||||
"vd": "STEP_TIME * 0x12",
|
||||
"ve": "CYCLE_NUMBER",
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
@@ -1265,7 +1203,7 @@
|
||||
"pe": "SAMPLE_RATE"
|
||||
},
|
||||
"data": [
|
||||
"X0C;",
|
||||
"X07;",
|
||||
"B>va;4B>vb;2B>vc;2B>vd;",
|
||||
"4b>pa;4b>pb;",
|
||||
"4b>pc;4b>pd;",
|
||||
@@ -1695,6 +1633,16 @@
|
||||
"dpv_engineering_mode_advanced": [
|
||||
"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_write",
|
||||
"_cdr('20X>ADC_VALUE_I')"
|
||||
|
||||
@@ -15,33 +15,6 @@
|
||||
"BLE_WRITE_MAX": 255
|
||||
},
|
||||
"parameters": {
|
||||
"HIGHZ_TABLE": {
|
||||
"initial": [
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1
|
||||
],
|
||||
"domain": {
|
||||
"list": [
|
||||
100
|
||||
]
|
||||
},
|
||||
"value": "VALUE"
|
||||
},
|
||||
"DPV_e_init": {
|
||||
"description": "DPV initial voltage ",
|
||||
"record_meta": true,
|
||||
@@ -698,17 +671,6 @@
|
||||
},
|
||||
"on_change": "set_para_DAC_VOLT"
|
||||
},
|
||||
"DAC_VOLT_SCROLL": {
|
||||
"description": "DAC scroll output Voltage",
|
||||
"record_meta": true,
|
||||
"initial": 25000,
|
||||
"domain": [
|
||||
65536
|
||||
],
|
||||
"value": {
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"ADC_VALUE_I": {
|
||||
"description": "ADC value current value",
|
||||
"domain": "int"
|
||||
@@ -874,18 +836,6 @@
|
||||
],
|
||||
"on_change": "set_dac_gain_Vout"
|
||||
},
|
||||
"DAC_VOLT_BUTTON": {
|
||||
"description": "DAC volt",
|
||||
"record_meta": true,
|
||||
"initial": 1,
|
||||
"value": [
|
||||
"10000",
|
||||
"25000",
|
||||
"50000",
|
||||
"60000"
|
||||
],
|
||||
"on_change": "cali_Vout"
|
||||
},
|
||||
"CTRL_HIGH_Z_15": {
|
||||
"description": "ctrl highZ level",
|
||||
"record_meta": true,
|
||||
@@ -901,8 +851,7 @@
|
||||
"initial": 0,
|
||||
"value": [
|
||||
"Iin",
|
||||
"Vin",
|
||||
"Vout"
|
||||
"Vin"
|
||||
]
|
||||
},
|
||||
"BLE_WRITE": {
|
||||
@@ -963,13 +912,11 @@
|
||||
"_notify(True)",
|
||||
"set_adc_gain_I",
|
||||
"set_adc_gain_Vin",
|
||||
"set_dac_gain_Vout",
|
||||
{
|
||||
"expression": "ADC_DAC_CHANNEL_15",
|
||||
"when": {
|
||||
"0": "cali_Iin",
|
||||
"1": "cali_Vin",
|
||||
"2": "cali_Vout"
|
||||
"1": "cali_Vin"
|
||||
}
|
||||
},
|
||||
"_sync(True)",
|
||||
@@ -1060,6 +1007,12 @@
|
||||
"XE0;2B>va"
|
||||
]
|
||||
},
|
||||
"set_dac_gain_Vout": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
"XE1;X02;B>DAC_LEVEL_V_OUT_15"
|
||||
]
|
||||
},
|
||||
"set_adc_gain_I": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
@@ -1072,12 +1025,6 @@
|
||||
"XE1;X01;B>ADC_LEVEL_V_IN_15"
|
||||
]
|
||||
},
|
||||
"set_dac_gain_Vout": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
"XE1;X02;B>DAC_LEVEL_V_OUT_15"
|
||||
]
|
||||
},
|
||||
"set_ctrl_highZ": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
@@ -1105,22 +1052,13 @@
|
||||
"XF1;B>ADC_DAC_CHANNEL_15;B>ADC_LEVEL_V_IN_15"
|
||||
]
|
||||
},
|
||||
"cali_Vout": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"v": "DAC_VOLT_BUTTON"
|
||||
},
|
||||
"data": [
|
||||
"XF1;B>ADC_DAC_CHANNEL_15;B>v"
|
||||
]
|
||||
},
|
||||
"curve_iv": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"va": "VOLT_ORIGIN",
|
||||
"vb": "VOLT_FINAL",
|
||||
"vc": "VOLT_STEP",
|
||||
"vd": "STEP_TIME",
|
||||
"vd": "STEP_TIME * 0x12",
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
"pc": "DAC_LEVEL_V_OUT_15",
|
||||
@@ -1141,7 +1079,7 @@
|
||||
"va": "VOLT_ORIGIN",
|
||||
"vb": "VOLT_FINAL",
|
||||
"vc": "VOLT_STEP",
|
||||
"vd": "STEP_TIME",
|
||||
"vd": "STEP_TIME * 0x12",
|
||||
"ve": "CYCLE_NUMBER",
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
@@ -1265,7 +1203,7 @@
|
||||
"pe": "SAMPLE_RATE"
|
||||
},
|
||||
"data": [
|
||||
"X0C;",
|
||||
"X07;",
|
||||
"B>va;4B>vb;2B>vc;2B>vd;",
|
||||
"4b>pa;4b>pb;",
|
||||
"4b>pc;4b>pd;",
|
||||
@@ -1695,6 +1633,16 @@
|
||||
"dpv_engineering_mode_advanced": [
|
||||
"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_write",
|
||||
"_cdr('20X>ADC_VALUE_I')"
|
||||
|
||||
@@ -15,33 +15,6 @@
|
||||
"BLE_WRITE_MAX": 255
|
||||
},
|
||||
"parameters": {
|
||||
"HIGHZ_TABLE": {
|
||||
"initial": [
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1
|
||||
],
|
||||
"domain": {
|
||||
"list": [
|
||||
100
|
||||
]
|
||||
},
|
||||
"value": "VALUE"
|
||||
},
|
||||
"DPV_e_init": {
|
||||
"description": "DPV initial voltage ",
|
||||
"record_meta": true,
|
||||
@@ -698,17 +671,6 @@
|
||||
},
|
||||
"on_change": "set_para_DAC_VOLT"
|
||||
},
|
||||
"DAC_VOLT_SCROLL": {
|
||||
"description": "DAC scroll output Voltage",
|
||||
"record_meta": true,
|
||||
"initial": 25000,
|
||||
"domain": [
|
||||
65536
|
||||
],
|
||||
"value": {
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"ADC_VALUE_I": {
|
||||
"description": "ADC value current value",
|
||||
"domain": "int"
|
||||
@@ -874,18 +836,6 @@
|
||||
],
|
||||
"on_change": "set_dac_gain_Vout"
|
||||
},
|
||||
"DAC_VOLT_BUTTON": {
|
||||
"description": "DAC volt",
|
||||
"record_meta": true,
|
||||
"initial": 1,
|
||||
"value": [
|
||||
"10000",
|
||||
"25000",
|
||||
"50000",
|
||||
"60000"
|
||||
],
|
||||
"on_change": "cali_Vout"
|
||||
},
|
||||
"CTRL_HIGH_Z_15": {
|
||||
"description": "ctrl highZ level",
|
||||
"record_meta": true,
|
||||
@@ -901,8 +851,7 @@
|
||||
"initial": 0,
|
||||
"value": [
|
||||
"Iin",
|
||||
"Vin",
|
||||
"Vout"
|
||||
"Vin"
|
||||
]
|
||||
},
|
||||
"BLE_WRITE": {
|
||||
@@ -963,13 +912,11 @@
|
||||
"_notify(True)",
|
||||
"set_adc_gain_I",
|
||||
"set_adc_gain_Vin",
|
||||
"set_dac_gain_Vout",
|
||||
{
|
||||
"expression": "ADC_DAC_CHANNEL_15",
|
||||
"when": {
|
||||
"0": "cali_Iin",
|
||||
"1": "cali_Vin",
|
||||
"2": "cali_Vout"
|
||||
"1": "cali_Vin"
|
||||
}
|
||||
},
|
||||
"_sync(True)",
|
||||
@@ -1060,6 +1007,12 @@
|
||||
"XE0;2B>va"
|
||||
]
|
||||
},
|
||||
"set_dac_gain_Vout": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
"XE1;X02;B>DAC_LEVEL_V_OUT_15"
|
||||
]
|
||||
},
|
||||
"set_adc_gain_I": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
@@ -1072,12 +1025,6 @@
|
||||
"XE1;X01;B>ADC_LEVEL_V_IN_15"
|
||||
]
|
||||
},
|
||||
"set_dac_gain_Vout": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
"XE1;X02;B>DAC_LEVEL_V_OUT_15"
|
||||
]
|
||||
},
|
||||
"set_ctrl_highZ": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
@@ -1105,22 +1052,13 @@
|
||||
"XF1;B>ADC_DAC_CHANNEL_15;B>ADC_LEVEL_V_IN_15"
|
||||
]
|
||||
},
|
||||
"cali_Vout": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"v": "DAC_VOLT_BUTTON"
|
||||
},
|
||||
"data": [
|
||||
"XF1;B>ADC_DAC_CHANNEL_15;B>v"
|
||||
]
|
||||
},
|
||||
"curve_iv": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"va": "VOLT_ORIGIN",
|
||||
"vb": "VOLT_FINAL",
|
||||
"vc": "VOLT_STEP",
|
||||
"vd": "STEP_TIME",
|
||||
"vd": "STEP_TIME * 0x12",
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
"pc": "DAC_LEVEL_V_OUT_15",
|
||||
@@ -1141,7 +1079,7 @@
|
||||
"va": "VOLT_ORIGIN",
|
||||
"vb": "VOLT_FINAL",
|
||||
"vc": "VOLT_STEP",
|
||||
"vd": "STEP_TIME",
|
||||
"vd": "STEP_TIME * 0x12",
|
||||
"ve": "CYCLE_NUMBER",
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
@@ -1265,7 +1203,7 @@
|
||||
"pe": "SAMPLE_RATE"
|
||||
},
|
||||
"data": [
|
||||
"X0C;",
|
||||
"X07;",
|
||||
"B>va;4B>vb;2B>vc;2B>vd;",
|
||||
"4b>pa;4b>pb;",
|
||||
"4b>pc;4b>pd;",
|
||||
@@ -1695,6 +1633,16 @@
|
||||
"dpv_engineering_mode_advanced": [
|
||||
"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_write",
|
||||
"_cdr('20X>ADC_VALUE_I')"
|
||||
|
||||
@@ -62,7 +62,6 @@
|
||||
"value": [
|
||||
"EIS CURVE",
|
||||
"Cyclic Voltammetry",
|
||||
"Chronoamperometric",
|
||||
"Dev Mode"
|
||||
]
|
||||
},
|
||||
@@ -70,7 +69,7 @@
|
||||
"description": "DPV current recording period start",
|
||||
"record_meta": true,
|
||||
"initial": [
|
||||
13333333,
|
||||
13422819,
|
||||
7
|
||||
],
|
||||
"domain": {
|
||||
@@ -266,17 +265,6 @@
|
||||
"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": {
|
||||
@@ -307,23 +295,20 @@
|
||||
{
|
||||
"expression": "MODE",
|
||||
"when": {
|
||||
"1": "set_adc_gain_I",
|
||||
"2": "set_adc_gain_I"
|
||||
"1": "set_adc_gain_I"
|
||||
}
|
||||
},
|
||||
{
|
||||
"expression": "MODE",
|
||||
"when": {
|
||||
"1": "set_adc_gain_Vin",
|
||||
"2": "set_adc_gain_Vin"
|
||||
"1": "set_adc_gain_Vin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"expression": "MODE",
|
||||
"when": {
|
||||
"0": "curve_eis",
|
||||
"1": "curve_cv3",
|
||||
"2": "curve_const_vscan"
|
||||
"1": "curve_cv3"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -439,23 +424,14 @@
|
||||
"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"
|
||||
]
|
||||
},
|
||||
"VIS_CC_ZERO": [
|
||||
"_data_format('EISZeroOne')",
|
||||
"_disable_cache(False)",
|
||||
"_notify(True)",
|
||||
"VIS_CC_ZERO",
|
||||
"_sync(True)",
|
||||
"VIS_STI"
|
||||
],
|
||||
"ble_instru_send": [
|
||||
"ble_write",
|
||||
"_cdr('20X>ADC_VALUE_I')"
|
||||
|
||||
@@ -62,9 +62,6 @@
|
||||
"value": [
|
||||
"EIS CURVE",
|
||||
"Cyclic Voltammetry",
|
||||
"Chronoamperometric",
|
||||
"V-T Graph",
|
||||
"R-T Graph",
|
||||
"Dev Mode"
|
||||
]
|
||||
},
|
||||
@@ -72,7 +69,7 @@
|
||||
"description": "DPV current recording period start",
|
||||
"record_meta": true,
|
||||
"initial": [
|
||||
13333333,
|
||||
13422819,
|
||||
7
|
||||
],
|
||||
"domain": {
|
||||
@@ -268,40 +265,6 @@
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"VOLT_VSCAN": {
|
||||
"description": "Voltage of VScan",
|
||||
"record_meta": true,
|
||||
"initial": 25000,
|
||||
"domain": [
|
||||
"VOLT_MAX"
|
||||
],
|
||||
"value": {
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"MEASURE_VIN_RANGE": {
|
||||
"description": "measure range of Vin",
|
||||
"record_meta": true,
|
||||
"initial": 0,
|
||||
"value": [
|
||||
"0",
|
||||
"1",
|
||||
"2",
|
||||
"auto"
|
||||
]
|
||||
},
|
||||
"RT_VOLT_SET": {
|
||||
"description": "DAC output Voltage",
|
||||
"record_meta": true,
|
||||
"initial": 37500,
|
||||
"domain": [
|
||||
65536
|
||||
],
|
||||
"value": {
|
||||
"expression": "VALUE"
|
||||
},
|
||||
"on_change": "set_para_RT_VOLT_SET"
|
||||
},
|
||||
"BLE_WRITE": {
|
||||
"description": "send msg to elite",
|
||||
"domain": {
|
||||
@@ -332,29 +295,20 @@
|
||||
{
|
||||
"expression": "MODE",
|
||||
"when": {
|
||||
"1": "set_adc_gain_I",
|
||||
"2": "set_adc_gain_I",
|
||||
"3": "set_adc_gain_I",
|
||||
"4": "set_adc_gain_I"
|
||||
"1": "set_adc_gain_I"
|
||||
}
|
||||
},
|
||||
{
|
||||
"expression": "MODE",
|
||||
"when": {
|
||||
"1": "set_adc_gain_Vin",
|
||||
"2": "set_adc_gain_Vin",
|
||||
"3": "set_adc_gain_Vin",
|
||||
"4": "set_adc_gain_Vin"
|
||||
"1": "set_adc_gain_Vin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"expression": "MODE",
|
||||
"when": {
|
||||
"0": "curve_eis",
|
||||
"1": "curve_cv3",
|
||||
"2": "curve_const_vscan",
|
||||
"3": "curve_vt",
|
||||
"4": "curve_rt"
|
||||
"1": "curve_cv3"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -470,63 +424,14 @@
|
||||
"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"
|
||||
]
|
||||
},
|
||||
"curve_rt": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"va": "RT_VOLT_SET",
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
"pd": "CTRL_HIGH_Z_15",
|
||||
"pe": "SAMPLE_RATE"
|
||||
},
|
||||
"data": [
|
||||
"X04;",
|
||||
"2B>va;",
|
||||
"4b>pa;4b>pb;",
|
||||
"4b>0;4b>pd;",
|
||||
"2B>pe"
|
||||
]
|
||||
},
|
||||
"curve_vt": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
"pd": "CTRL_HIGH_Z_15",
|
||||
"pe": "SAMPLE_RATE",
|
||||
"va": "MEASURE_VIN_RANGE"
|
||||
},
|
||||
"data": [
|
||||
"X05;",
|
||||
"4b>pa;4b>pb;",
|
||||
"4b>0;4b>pd;",
|
||||
"2B>pe;",
|
||||
"1B>va"
|
||||
]
|
||||
},
|
||||
"set_para_RT_VOLT_SET": {
|
||||
"type": "RIS",
|
||||
"data": [
|
||||
"XE2;X01;2B>RT_VOLT_SET"
|
||||
]
|
||||
},
|
||||
"VIS_CC_ZERO": [
|
||||
"_data_format('EISZeroOne')",
|
||||
"_disable_cache(False)",
|
||||
"_notify(True)",
|
||||
"VIS_CC_ZERO",
|
||||
"_sync(True)",
|
||||
"VIS_STI"
|
||||
],
|
||||
"ble_instru_send": [
|
||||
"ble_write",
|
||||
"_cdr('20X>ADC_VALUE_I')"
|
||||
|
||||
@@ -62,8 +62,6 @@
|
||||
"value": [
|
||||
"EIS CURVE",
|
||||
"Cyclic Voltammetry",
|
||||
"Chronoamperometric",
|
||||
"V-T Graph",
|
||||
"Dev Mode"
|
||||
]
|
||||
},
|
||||
@@ -71,7 +69,7 @@
|
||||
"description": "DPV current recording period start",
|
||||
"record_meta": true,
|
||||
"initial": [
|
||||
13333333,
|
||||
13422819,
|
||||
7
|
||||
],
|
||||
"domain": {
|
||||
@@ -267,28 +265,6 @@
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"VOLT_VSCAN": {
|
||||
"description": "Voltage of VScan",
|
||||
"record_meta": true,
|
||||
"initial": 25000,
|
||||
"domain": [
|
||||
"VOLT_MAX"
|
||||
],
|
||||
"value": {
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"MEASURE_VIN_RANGE": {
|
||||
"description": "measure range of Vin",
|
||||
"record_meta": true,
|
||||
"initial": 0,
|
||||
"value": [
|
||||
"0",
|
||||
"1",
|
||||
"2",
|
||||
"auto"
|
||||
]
|
||||
},
|
||||
"BLE_WRITE": {
|
||||
"description": "send msg to elite",
|
||||
"domain": {
|
||||
@@ -319,26 +295,20 @@
|
||||
{
|
||||
"expression": "MODE",
|
||||
"when": {
|
||||
"1": "set_adc_gain_I",
|
||||
"2": "set_adc_gain_I",
|
||||
"3": "set_adc_gain_I"
|
||||
"1": "set_adc_gain_I"
|
||||
}
|
||||
},
|
||||
{
|
||||
"expression": "MODE",
|
||||
"when": {
|
||||
"1": "set_adc_gain_Vin",
|
||||
"2": "set_adc_gain_Vin",
|
||||
"3": "set_adc_gain_Vin"
|
||||
"1": "set_adc_gain_Vin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"expression": "MODE",
|
||||
"when": {
|
||||
"0": "curve_eis",
|
||||
"1": "curve_cv3",
|
||||
"2": "curve_const_vscan",
|
||||
"3": "curve_vt"
|
||||
"1": "curve_cv3"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -454,40 +424,14 @@
|
||||
"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"
|
||||
]
|
||||
},
|
||||
"curve_vt": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
"pd": "CTRL_HIGH_Z_15",
|
||||
"pe": "SAMPLE_RATE",
|
||||
"va": "MEASURE_VIN_RANGE"
|
||||
},
|
||||
"data": [
|
||||
"X05;",
|
||||
"4b>pa;4b>pb;",
|
||||
"4b>0;4b>pd;",
|
||||
"2B>pe;",
|
||||
"1B>va"
|
||||
]
|
||||
},
|
||||
"VIS_CC_ZERO": [
|
||||
"_data_format('EISZeroOne')",
|
||||
"_disable_cache(False)",
|
||||
"_notify(True)",
|
||||
"VIS_CC_ZERO",
|
||||
"_sync(True)",
|
||||
"VIS_STI"
|
||||
],
|
||||
"ble_instru_send": [
|
||||
"ble_write",
|
||||
"_cdr('20X>ADC_VALUE_I')"
|
||||
|
||||
@@ -1426,6 +1426,14 @@
|
||||
"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": [
|
||||
"sti_mode",
|
||||
"gas1_mode",
|
||||
|
||||
Reference in New Issue
Block a user