Compare commits

..

5 Commits

Author SHA1 Message Date
peterlu14 aa9d270039 -fix DetachedInstanceError 2023-06-08 10:17:06 +08:00
peterlu14 32bc481a91 -update add subject write in same folder 2023-06-08 10:17:04 +08:00
peterlu14 0e30bd1263 -update db_update_script 2023-06-08 10:16:50 +08:00
peterlu14 dda51889dc -fix import error 2023-06-08 10:15:46 +08:00
peterlu14 0c811f529b -update subject 2023-06-05 11:55:36 +08:00
43 changed files with 1894 additions and 6703 deletions
-12
View File
@@ -122,14 +122,6 @@ class DataAPI(metaclass=abc.ABCMeta):
"""
pass
@abc.abstractmethod
def tag(self, device: Union[int, Device], data_points: int):
"""tag data
:param device: device IDs, empty for all
"""
pass
@abc.abstractmethod
def sync_file(self):
"""sync file, write-back dirty file. """
@@ -210,10 +202,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 tag(self, device: Union[int, Device], data_points: int):
device = device.device_id
self.send_command('tag', device, data_points)
def show_data(self, device: int):
self.send_command('show_data', device)
+30 -15
View File
@@ -20,29 +20,44 @@ class Collection(Base):
updated_at = Column(TIMESTAMP(timezone=True), onupdate=func.now())
@classmethod
def create_collection(cls, collection_name, parent):
def create_collection(cls, collection_name, parent, duplicate=False):
with Session() as session:
name = cls.check_name_duplicate(collection_name, parent, 0)
collection = Collection(
name = name,
parent = parent,
type= "folder",
)
session.add(collection)
session.commit()
print('a', collection.id)
return collection
name = cls.check_name_duplicate(collection_name, parent, 0, duplicate=duplicate)
if name == None:
return session.query(Collection).filter(Collection.name == collection_name, Collection.parent == parent).first()
else:
collection = Collection(
name = name,
parent = parent,
type= "folder",
)
session.add(collection)
session.commit()
session.refresh(collection)
return collection
@classmethod
def check_name_duplicate(cls, collection_name, parent, n):
with Session() as session:
result = session.query(Collection).filter(Collection.name == cls.generate_name(collection_name, n), Collection.parent == parent).first()
def check_name_duplicate(cls, collection_name, parent, n, _session = None, duplicate=False):
if _session == None:
with Session() as session:
result = session.query(Collection).filter(Collection.name == cls.generate_name(collection_name, n), Collection.parent == parent).first()
if result is None:
return cls.generate_name(collection_name, n)
else:
if duplicate == True:
return None
else:
new_num = n + 1
# new_name = f"{collection_name}({new_num})"
return cls.check_name_duplicate(collection_name, parent, new_num, session)
else:
result = _session.query(Collection).filter(Collection.name == cls.generate_name(collection_name, n), Collection.parent == parent).first()
if result is None:
return cls.generate_name(collection_name, n)
else:
new_num = n + 1
# new_name = f"{collection_name}({new_num})"
return cls.check_name_duplicate(collection_name, parent, new_num)
return cls.check_name_duplicate(collection_name, parent, new_num, _session)
@classmethod
def generate_name(cls, collection_name, n):
+24
View File
@@ -0,0 +1,24 @@
from sqlalchemy import Table, Column, String, MetaData, ForeignKey, JSON
from sqlalchemy.sql import select, func
from sqlalchemy.types import Integer, BigInteger, String, Boolean, TIMESTAMP, Numeric
from sqlalchemy.dialects.postgresql import JSONB
from .base import Base, Session
class RecordingDataMeta(Base):
__tablename__ = "recording_data_metas"
id = Column(Integer, primary_key=True)
path = Column(String(255))
name = Column(String(255))
parent = Column(JSONB)
size = Column(String(255))
time_duration = (String(255))
raw_data = Column(JSONB)
project = Column(Integer)
deleted = Column(Boolean, default = False)
created_at = Column(TIMESTAMP(timezone=True), server_default=func.now())
updated_at = Column(TIMESTAMP(timezone=True), onupdate=func.now())
# def __repr__(self):
# return f"User(id={self.id!r}, name={self.name!r}, fullname={self.task!r})"
+88
View File
@@ -0,0 +1,88 @@
from sqlalchemy import Table, Column, String, MetaData, ForeignKey, JSON
from sqlalchemy.sql import select, func
from sqlalchemy.types import Integer, BigInteger, String, Boolean, TIMESTAMP, Numeric, Text
from sqlalchemy.dialects.postgresql import JSONB
from biopro.db.base import Session
from .base import Base
# build a model class with a specific table name
def get_raw_model(channel):
tablename = str(channel) + '_recording_data_raws' # dynamic table name
class_name = 'RECORDING_DATA_RAWS' # dynamic class name
print('get_raw_model', tablename)
for mapper in Base.registry.mappers:
cls = mapper.class_
classname = cls.__name__
tblname = cls.__tablename__
print(cls, classname, tblname)
if (classname == class_name):
if tblname == tablename:
return cls
Model = type(class_name, (RECORDING_DATA_RAWS,), {
'__tablename__': tablename
})
return Model
class RECORDING_DATA_RAWS(Base):
__abstract__ = True
id = Column(Integer, primary_key=True)
name = Column(String(255))
parent = Column(Integer)
size = Column(String(255))
path = Column(JSONB)
uuid = Column(String(255))
serial_number = Column(String(255))
data_format = Column(String(255))
channel = Column(Integer)
start_time = Column(String(255))
end_time = Column(String(255))
data = Column(Text)
compressed = Column(Boolean)
deleted = Column(Boolean)
created_at = Column(TIMESTAMP(timezone=True), server_default=func.now())
updated_at = Column(TIMESTAMP(timezone=True), onupdate=func.now())
# @classmethod
# def create_subject_data(cls, subject_id, project, meta, data):
# with Session() as session:
# subject = Subject(
# subject_id = subject_id,
# project = project,
# meta= meta,
# data = data
# )
# session.add(subject)
# session.commit()
# return subject
# @classmethod
# def check_name_duplicate(cls, collection_name, parent, n):
# with Session() as session:
# result = session.query(Collection).filter(Collection.name == cls.generate_name(collection_name, n), Collection.parent == parent).first()
# if result is None:
# return cls.generate_name(collection_name, n)
# else:
# new_num = n + 1
# # new_name = f"{collection_name}({new_num})"
# return cls.check_name_duplicate(collection_name, parent, new_num)
# @classmethod
# def generate_name(cls, collection_name, n):
# if n==0:
# return collection_name
# else:
# return f"{collection_name}({n})"
# @classmethod
# def find_data(cls, id):
# with Session() as session:
# result = session.query(RECORDING_DATA_RAWS).first()
# return result
+60
View File
@@ -0,0 +1,60 @@
from sqlalchemy import Table, Column, String, MetaData, ForeignKey, JSON
from sqlalchemy.sql import select, func
from sqlalchemy.types import Integer, BigInteger, String, Boolean, TIMESTAMP, Numeric
from sqlalchemy.dialects.postgresql import JSONB
from biopro.db.base import Session
from .base import Base
class SubjectData(Base):
__tablename__ = "subject_datas"
id = Column(Integer, primary_key=True)
subject_id = Column(Integer)
mode = Column(JSONB)
data = Column(JSONB)
user_auth = Column(JSONB)
meta = Column(String(255))
project = Column(String(255))
deleted = Column(Boolean)
created_at = Column(TIMESTAMP(timezone=True), server_default=func.now())
updated_at = Column(TIMESTAMP(timezone=True), onupdate=func.now())
@classmethod
def create_subject_data(cls, subject_id, project, meta, data):
with Session() as session:
subject = SubjectData(
subject_id = subject_id,
project = project,
meta= meta,
data = data
)
session.add(subject)
session.commit()
return subject
# @classmethod
# def check_name_duplicate(cls, collection_name, parent, n):
# with Session() as session:
# result = session.query(Collection).filter(Collection.name == cls.generate_name(collection_name, n), Collection.parent == parent).first()
# if result is None:
# return cls.generate_name(collection_name, n)
# else:
# new_num = n + 1
# # new_name = f"{collection_name}({new_num})"
# return cls.check_name_duplicate(collection_name, parent, new_num)
# @classmethod
# def generate_name(cls, collection_name, n):
# if n==0:
# return collection_name
# else:
# return f"{collection_name}({n})"
# @classmethod
# def find_collection(cls, collection_name, parent):
# with Session() as session:
# result = session.query(Collection).filter(Collection.name == collection_name, Collection.parent == parent).first()
# return result
+110 -63
View File
@@ -429,20 +429,17 @@ class CC2650Device(Device):
self._start_flag = False
def _encode_instruction(self, ins_type: int, ins_oper: int, *instruction: int) -> bytes:
# print('_encode_instruction', ins_type, ins_oper, instruction)
length = len(instruction)
if length == 1 and instruction[0] < 0:
return struct.pack('2B1b',
(ins_type & 0xF0) | (self.device_id & 0x0F),
(ins_oper & 0xFF),
*instruction)
if ins_type == None:
return struct.pack('%dB' % length, *instruction)
else:
return struct.pack('%dB' % (length + 2),
(ins_type & 0xF0) | (self.device_id & 0x0F),
(ins_oper & 0xFF),
*instruction)
return struct.pack('%dB' % (length + 2),
(ins_type & 0xF0) | (self.device_id & 0x0F),
(ins_oper & 0xFF),
*instruction)
def _decode_data(self, ins_oper: int, data: bytes) -> bytes:
"""CIS data decoder.
@@ -486,19 +483,17 @@ class CC2650Device(Device):
day = struct.unpack('<B', data[4:5])[0]
hour = struct.unpack('<B', data[5:6])[0]
minute = struct.unpack('<B', data[6:7])[0]
# mac1 = struct.unpack('<B', data[7:8])[0]
# mac2 = struct.unpack('<B', data[8:9])[0]
# mac1 = "%02X" % mac1
# mac2 = "%02X" % mac2
mac1 = struct.unpack('<B', data[7:8])[0]
mac2 = struct.unpack('<B', data[8:9])[0]
mac1 = "%02X" % mac1
mac2 = "%02X" % mac2
self._device_version = str(year) + '/' + str(month) + '/' + str(day) + " " + str(hour) + ":" + str(
minute)
# + " | " + str(mac1) + ":" + str(mac2)
minute) + " | " + str(mac1) + ":" + str(mac2)
@property
def battery(self) -> int:
if self._start_flag == False:
self.update_battery_info()
self.update_battery_info()
return self._battery
@property
@@ -595,8 +590,96 @@ class CC2650Device(Device):
# self.ensure_feature_support(DeviceFeature.CALIBRATION)
coeff = []
if device_type == 'EISZeroOne':
if device_type == 'TDC4VAF2':
# neulive 1.3, 1.6
for i in range(24):
# send
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, i)
self._master.write_characteristic(self.device_id, CC2650MasterDevice.COMMAND_HANDLE, code)
# receive
data = self._master.read_characteristic(self.device_id, CC2650MasterDevice.RETURN_HANDLE)
coeff.append(self._decode_data(DeviceInstruction.CIS_CALI, data))
elif device_type == 'TDC4VC':
i = 0
request_times = 0
while i < 4:
try:
# print('i', i)
# send
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, i)
self._master.write_characteristic(self.device_id, CC2650MasterDevice.COMMAND_HANDLE, code)
# receive
data = self._master.read_characteristic(self.device_id,
CC2650MasterDevice.RETURN_HANDLE)
# print('code3', code)
# print('data3', data)
coeff.append(self._decode_data(DeviceInstruction.CIS_CALI, data))
except SendInstructionTimeoutError as e:
print(e)
self._master.log_warn('device', self.device_id, 'update_calibration_info no response', i)
raise BaseException
except RuntimeError as e:
print(e)
self._master.log_warn('device', self.device_id, 'update_calibration_info no response - 2', i)
request_times += 1
if request_times > 3:
self._master.reset(self.device_id)
break
else:
# print('data success')
if len(data) > 0:
i += 1
else:
request_times += 1
if request_times > 3:
self._master.reset(self.device_id)
break
elif device_type == 'NeuliveThreeOne':
i = 0
request_times = 0
while i < 8:
try:
# print('i', i)
# send
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, i)
self._master.write_characteristic(self.device_id, CC2650MasterDevice.COMMAND_HANDLE, code)
# receive
data = self._master.read_characteristic(self.device_id,
CC2650MasterDevice.RETURN_HANDLE)
coeff.append(self._decode_data(DeviceInstruction.CIS_CALI, data))
except SendInstructionTimeoutError as e:
print(e)
self._master.log_warn('device', self.device_id, 'update_calibration_info no response', i)
raise BaseException
except RuntimeError as e:
print(e)
self._master.log_warn('device', self.device_id, 'update_calibration_info no response - 2', i)
request_times += 1
if request_times > 3:
self._master.reset(self.device_id)
break
else:
# print('data success')
if len(data) > 0:
i += 1
else:
request_times += 1
if request_times > 3:
self._master.reset(self.device_id)
break
elif device_type == 'EISZeroOne':
i = 1
while i <= 24:
for _ in range(5):
@@ -2090,7 +2173,7 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
try:
connect_response = self._cc2650.recv_uart(2)
except RecvTimeout:
# self.log_verbose('[CC2650]', 'connect response timeout')
self.log_verbose('[CC2650]', 'connect response timeout')
if retry < 5:
self.log_verbose('[CC2650]', 'connect retry')
continue
@@ -2098,23 +2181,16 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
break
if connect_response is None:
self.log_verbose('[CC2650]', 'connect response timeout')
return False
pack_len = connect_response[0]
connect_ack = connect_response[1:pack_len+1]
if pack_len == 1:
if connect_ack[0] == 3:
connected = True
connect_response_hex = ''.join(format(i, '02X') for i in connect_response)
self.log_verbose('[CC2650]', 'connect success', '0x'+connect_response_hex)
elif pack_len == 4:
if connect_ack[0] == 46 and connect_ack[1] == 80 and \
connect_ack[2] == 48 and connect_ack[3] == 4:
connected = True
connect_response_hex = ''.join(format(i, '02X') for i in connect_response)
self.log_verbose('[CC2650]', 'connect success', '0x'+connect_response_hex)
if connect_ack[0] == 46 and connect_ack[1] == 80 and \
connect_ack[2] == 48 and connect_ack[3] == 4:
connected = True
connect_response_hex = ''.join(format(i, '02X') for i in connect_response)
self.log_verbose('[CC2650]', 'connect success', '0x'+connect_response_hex)
if connected == True:
# CC2650Device(device_id, master, scan_response) is a slave device
@@ -2124,8 +2200,7 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
self.log_verbose('[CC2650]', DEVICE_CONNECTED, address_s)
return ret
connect_response_hex = ''.join(format(i, '02X') for i in connect_response)
self.log_verbose('[CC2650]', 'connect fail', '0x'+connect_response_hex)
self.log_verbose('[CC2650]', 'connect fail')
return False
@synchronized
@@ -2137,7 +2212,7 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
ins.append(0xF1)
self._interface.flush_input()
for retry in range(5):
for _ in range(5):
try:
self.log_verbose('[CC2650]', 'disconnect att_write','0x'+str.upper(ins.hex()))
self._cc2650.send("bytes", bytes(ins))
@@ -2151,30 +2226,6 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
self.reset_hardware()
self.log_verbose('[CC2650]', 'disconnect success')
return True
# try:
# disconnect_response = self._cc2650.recv_uart(0.01)
# print(disconnect_response)
# except RecvTimeout:
# self.log_verbose('[CC2650]', 'disconnect response timeout')
# if retry < 5:
# self.log_verbose('[CC2650]', 'connect retry')
# continue
# else:
# break
# if disconnect_response is None:
# return False
# pack_len = disconnect_response[0]
# disconnect_ack = disconnect_response[1:pack_len+1]
# if disconnect_ack == [3]:
# disconnect_response_hex = ''.join(format(i, '02X') for i in disconnect_response)
# self.log_verbose('[CC2650]', 'disconnect success', '0x'+disconnect_response_hex)
# self.reset_internal()
# self.reset_hardware()
# return True
self.log_verbose('[CC2650]', 'disconnect fail')
return False
@@ -2185,10 +2236,7 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
ins = bytearray()
ins.append(0x06)
if len(data) + 2 > 255:
ins.append(255)
else:
ins.append(len(data)+2) #length = handle + C0C0XXXX(data len) + F1
ins.append(len(data)+2) #length = handle + C0C0XXXX(data len) + F1
ins.append(handle)
ins.extend(data)
ins.append(0xF1)
@@ -2210,7 +2258,6 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
self.log_verbose('[CC2650]', 'write_characteristic response timeout')
if write_response is None:
self.log_verbose('[CC2650]', 'write_characteristic fail')
return False
pack_len = write_response[0]
-16
View File
@@ -836,12 +836,6 @@ class DeviceManager(MasterDevice, Synchronized):
elif func == InternalInstruction.PREDEFINED_IDLE:
self._idle(device, *para)
elif func == InternalInstruction.PREDEFINED_COUNTDOWN:
self._countdown(device, *para)
elif func == InternalInstruction.PREDEFINED_TAG:
self._tag(device, *para)
elif isinstance(device, DebugDevice):
if func == InternalInstruction.PREDEFINED_NOTIFY:
return True
@@ -864,16 +858,6 @@ class DeviceManager(MasterDevice, Synchronized):
self._handler.device_internal_command(device.device_id,
InternalInstruction.PREDEFINED_IDLE,
None)
def _countdown(self, device: Device, expr: AnyStr):
self._handler.device_internal_command(device.device_id,
InternalInstruction.PREDEFINED_COUNTDOWN,
expr)
def _tag(self, device: Device, expr: AnyStr):
self._handler.device_internal_command(device.device_id,
InternalInstruction.PREDEFINED_TAG,
expr)
def _device_data_format_cali(self, device: Device, expr: str, cali: bytes = None):
if cali is None:
File diff suppressed because it is too large Load Diff
+2 -6
View File
@@ -689,13 +689,11 @@ class DeviceInstruction:
TYP_IIS = -1
"""internal instruction"""
TYP_ALL = None
__slots__ = ()
@classmethod
def valid_ins_type(cls, ins_type: int):
if ins_type not in (cls.TYP_RIS, cls.TYP_VIS, cls.TYP_CIS, cls.TYP_IIS, cls.TYP_ALL):
if ins_type not in (cls.TYP_RIS, cls.TYP_VIS, cls.TYP_CIS, cls.TYP_IIS):
raise ValueError('unknown instruction type : ' + str(ins_type))
@classmethod
@@ -706,8 +704,6 @@ class DeviceInstruction:
return cls.TYP_VIS
elif ins_type == 'CIS':
return cls.TYP_CIS
elif ins_type == 'ALL':
return cls.TYP_ALL
else:
raise RuntimeError('unknown instruction type : ' + ins_type)
@@ -740,7 +736,7 @@ class DeviceCommonInstruction:
if instruction == cls.RESET:
return '_sync(False)', '_notify(False)', 'VIS_RST'
elif instruction == cls.START:
return '_notify(True)', 'VIS_STI', '_sync(True)'
return '_data_format("TDC4VAF2")', '_notify(True)', 'VIS_STI', '_sync(True)'
elif instruction == cls.INTERRUPT:
return '_notify(False)', 'VIS_INT', '_sync(False)'
elif instruction == cls.CLOSE:
+3 -29
View File
@@ -120,9 +120,6 @@ class ParameterDomain(JsonSerialize, metaclass=abc.ABCMeta):
elif json == 'int':
return ParameterIntDomain
elif json == 'float':
return ParameterFloatDomain
elif json == 'property':
return ParameterPropertyDomain
@@ -294,25 +291,6 @@ class ParameterIntDomainType(ParameterTypeDomain):
ParameterIntDomain = ParameterIntDomainType()
class ParameterFloatDomainType(ParameterTypeDomain):
__slots__ = ()
def init_para(self, initial: Optional[Any] = None) -> float:
print('ParameterFloatDomainType')
if initial is None:
return 0
else:
return float(initial)
def valid_para(self, value: int) -> bool:
return True
def __str__(self):
return "float"
ParameterFloatDomain = ParameterFloatDomainType()
class ParameterValueDomain(ParameterDomain, metaclass=abc.ABCMeta):
"""limited/ranged P value domain """
@@ -323,7 +301,7 @@ class ParameterValueDomain(ParameterDomain, metaclass=abc.ABCMeta):
if initial is None:
return self.range[0]
else:
initial = initial
initial = int(initial)
f, t = self.range
if f <= initial < t:
@@ -764,7 +742,6 @@ class ParameterListDomain(ParameterCollectionDomain):
sz = len(target)
i = oper.index(sz)
v = oper.value(d)
# print('ParameterListDomain', d, sz, i, v, str(d) == 'float', type(d))
if i is None and v is None:
pass
@@ -803,11 +780,8 @@ class ParameterListDomain(ParameterCollectionDomain):
if isinstance(v, int):
v = [v]
target[len(v):] = []
if isinstance(d, ParameterFloatDomainType):
target[i] = [float(i) for i in v]
else:
target[i] = v
target[i] = v
def _valid_list_limit(self, target: List[Any], inc: int) -> bool:
if self._limit is not None:
+2 -1
View File
@@ -880,7 +880,8 @@ class WhenExpression(ComplexExpression[T]):
def value(self, context: Scope) -> Union[str, T]:
value = super().value(context)
key = str(int(value))
key = str(value)
if key in self._when:
return self._when[key].value(context.child(VALUE=value))
+84
View File
@@ -0,0 +1,84 @@
from .library import *
DEVLIB_GENERATOR_NAME = 'GENERATOR'
REC_CHANNEL_COUNT = 16
MODE_LIST = [
"zero",
"sin",
"ramp"
]
ADC_SAMPLE_RATE_LIST = [
100,
500,
1000,
2500,
4000,
5000
]
AMP_GAIN_LIST = [
0.5,
1,
10,
100,
1000
]
NOISE_LIST = [
0,
0.1,
0.5,
1.0
]
DEVLIB_GENERATOR = DeviceLibrary(DEVLIB_GENERATOR_NAME, DeviceLibraryVersion(0, 6))
DEVLIB_GENERATOR._file = ''
_constant = ConstantScope({
'REC_CHANNEL_COUNT': REC_CHANNEL_COUNT,
'ADC_SAMPLE_RATE_LIST': ADC_SAMPLE_RATE_LIST
})
DEVLIB_GENERATOR._constant = _constant
DEVLIB_GENERATOR._para = ParameterTable({
'MODE': ParameterInfo('MODE',
ParameterConstantRangeDomain(0, 3),
initial=1,
value=ArrayExpression(MODE_LIST),
description='working mode',
record_meta=True),
'CHANNEL': ParameterInfo('CHANNEL',
ParameterSetDomain(ParameterConstantRangeDomain(0, REC_CHANNEL_COUNT)),
initial=[0],
description='record channels',
record_meta=True),
'SAMPLE_RATE': ParameterInfo('SAMPLE_RATE',
ParameterConstantRangeDomain(0, len(ADC_SAMPLE_RATE_LIST)),
value=Expression.parse('ADC_SAMPLE_RATE_LIST[VALUE]'),
description='sampling rate',
alias=['ADC_RATE'],
record_meta=True),
'AMP_GAIN': ParameterInfo('AMP_GAIN',
ParameterConstantRangeDomain(0, len(AMP_GAIN_LIST)),
initial=1,
value=ArrayExpression(AMP_GAIN_LIST),
description='amp gain',
record_meta=True),
'NOISE': ParameterInfo('NOISE',
ParameterConstantRangeDomain(0, len(NOISE_LIST)),
description='signal noise factor',
record_meta=True),
})
DEVLIB_GENERATOR._inst = InstructionTable({
'start': ListInstruction('start', [
GuardExpression('len(CHANNEL) > 0', 'no recording channel'),
"_data_format('TDC4VAF2')",
"_sync(True)"
])
})
-13
View File
@@ -5,13 +5,6 @@ from .device import *
from .instruction import *
from .parameter import *
def convert_to_float(lst):
# Check if the element is a list (for handling nested lists)
if isinstance(lst, list):
return [convert_to_float(x) for x in lst]
else:
# If it's not a list, convert it to float
return float(lst)
class MatchRule(JsonSerialize, metaclass=abc.ABCMeta):
"""Device matching rule. Program use this table to find correct library according to the response information from
@@ -451,12 +444,6 @@ class DefaultLibraryLoader:
elif guard is not None:
guard = ListGuardExpression([GuardExpression.parse(guard)])
if "float" in str(domain):
initial = convert_to_float(initial)
# print('!@#$%^&')
# print(name, domain, initial, value, value_set)
return ParameterInfo(name, domain,
initial=initial,
+14 -30
View File
@@ -1,5 +1,4 @@
import re
import struct
from random import randint
from time import sleep
from typing import Sequence, Tuple
@@ -285,8 +284,6 @@ class InternalInstruction(SingleInstruction):
PREDEFINED_CDR = '_cdr'
PREDEFINED_DISABLE_CACHE = '_disable_cache'
PREDEFINED_IDLE = '_idle'
PREDEFINED_COUNTDOWN = '_countdown'
PREDEFINED_TAG = '_tag'
PREDEFINED = (
PREDEFINED_SLEEP,
@@ -299,8 +296,6 @@ class InternalInstruction(SingleInstruction):
PREDEFINED_CDR,
PREDEFINED_DISABLE_CACHE,
PREDEFINED_IDLE,
PREDEFINED_COUNTDOWN,
PREDEFINED_TAG
)
__slots__ = ('_expr', '_para')
@@ -380,7 +375,7 @@ class InternalInstruction(SingleInstruction):
parser.parse_instruction(context, data)
# tag2
class ListInstruction(Instruction, ImmutableListNode[Union[Instruction, Expression[str]]]):
"""Instruction group, allow the name of the instruction or a expression it.
If instruction name is ``None``, ignore it.
@@ -593,7 +588,7 @@ class InstructionContentWidth:
return InstructionContentWidth(z, t, signed_value=s is not None, little_endian=e == '<'), x
# The start from the json file parse
class InstructionContent(JsonSerialize):
"""
**json format**
@@ -687,7 +682,7 @@ class InstructionContent(JsonSerialize):
return ins_type(width, expr, **ins_argv, comment=comment)
# tag1
class InstructionDataContent(InstructionContent):
"""
**json format**
@@ -748,7 +743,6 @@ class InstructionDataContent(InstructionContent):
return ret[index]
def build_instruction(self, context: Scope, buffer: List[int], shift: int = 0) -> int:
# print('build_instruction', context, buffer, shift, self.value(context))
if self._width.is_array:
raise NotImplementedError()
@@ -756,33 +750,24 @@ class InstructionDataContent(InstructionContent):
value = 1
elif self.value(context) == 'false':
value = 0
elif isinstance(self.value(context), list):
value = self.value(context)
else:
value = self.value(context)
# print('value', value, type(value))
# print('self._width.bytes_unit', self._width.bytes_unit)
# print('self._width.size', self._width.size)
value = int(self.value(context))
if self._width.bytes_unit:
if self._width.size == 1:
buffer.append(value)
else:
if isinstance(self.value(context), list):
buffer.extend(value)
elif isinstance(value, int):
tmp = []
for _ in range(self._width.size):
tmp.append(value & 0xFF)
value >>= 8
tmp = []
for _ in range(self._width.size):
tmp.append(value & 0xFF)
value >>= 8
if self._width.little_endian:
buffer.extend(tmp)
else:
buffer.extend(tmp[::-1])
if self._width.little_endian:
buffer.extend(tmp)
else:
buffer.extend(tmp[::-1])
elif isinstance(value, float):
buffer.extend(struct.pack('>f', value))
return 8
else:
@@ -809,7 +794,6 @@ class InstructionDataContent(InstructionContent):
offset += 1
else:
buffer.extend([0]*(self._width.size-len(buffer)))
for i in range(self._width.size):
if self._width.little_endian:
value |= (buffer[offset] << (1 * i))
@@ -1127,7 +1111,7 @@ class SendInstruction(SingleInstruction):
else:
for scope in self._foreach_parameter.for_scope(context):
yield ResolvedSendInstruction(self, self._build_instruction(scope))
# tag3
def _build_instruction(self, context: Scope) -> List[int]:
buffer = []
shift = 0
+4 -11
View File
@@ -359,7 +359,6 @@ class DeviceParameter(JsonSerialize):
# initial parameter table
for para_info in library.parameter_table.values():
# print('DeviceParameter', para_info)
try:
para_value = para_info.init_para()
@@ -523,7 +522,6 @@ class DeviceParameter(JsonSerialize):
raise RuntimeError('not a collection parameter ' + para)
target = self._parameter[para]
# print(table, info, domain, target, str(domain) == '[float]', oper)
if isinstance(target, set):
old = set(target)
@@ -1130,21 +1128,13 @@ class CompletedDevice(Device):
:param value: new parameter P value
"""
info = self._library.parameter_table[name]
# print('info', info.domain, info.domain == 'float', info.domain == '[float]')
if isinstance(info.domain, ParameterCollectionDomain):
self._parameter.oper_parameter(name, value)
elif isinstance(info.domain, ParameterFloatDomainType):
self._parameter.set_parameter(name, float(value))
else:
try:
value = value
# value int
if isinstance(value, str):
if "." in value:
value = float(value)
else:
value = int(value)
value = int(value)
except ValueError as e:
# value float
self._parameter.set_parameter(name, value)
@@ -1302,6 +1292,9 @@ class CompletedDevice(Device):
def central_version_get(self) -> Optional[list]:
return self._device.central_version_get()
def save_data_to_subject(self, project, meta, device, subject_id):
self._master._handler.save_data_to_subject(project, meta, device, subject_id)
# utility method
-2
View File
@@ -433,7 +433,6 @@ class ParameterInfo(JsonSerialize):
return self._on_change
def init_para(self) -> Any:
# print('initial', self._name, self._initial)
"""
:return: initial P value
:raises value: illegal initial value
@@ -618,7 +617,6 @@ class ParameterInfo(JsonSerialize):
return []
elif isinstance(self._value, ComplexExpression):
print('cast_value_dependency', self._value.dependency)
return self._value.dependency
else:
+9 -6
View File
@@ -26,10 +26,10 @@ cli options
sin : sine save (default)
ramp : ramp
(Elite, Neulive serial)
Elite_Legacy
Elite Neulive
TC4VAF2 Elite_Legacy
TDC4VAF2 Elite Neulive
(NeuliveSTI serial)
NeuliveSTI NeuliveSTI1.0
NeuliveSTI NeuliveSTI1.0 TDBC4VCTH
(EliteZM serial)
EliteZM I4V4Z4T4
(mode :IV, :FG, :CV, :ZT, :VT, :IT)
@@ -317,7 +317,9 @@ class RampGenerator(Generator):
class DeviceGenerator(Generator):
SUPPORT = {
'TC4VAF2': ('Elite_Legacy', '0.0.0'),
'Elite_Legacy': ('Elite_Legacy', '0.0.0'),
'TDC4VAF2': ('Elite', '0.1.0'),
'Elite': ('Elite', '0.1.0'),
'Neulive': ('Neulive', '1.2.0'),
}
@@ -372,6 +374,7 @@ class NeuliveSTIGenerator(Generator):
SUPPORT = {
'NeuliveSTI': ('NeuliveSTI1.0', '1.0.0'),
'NeuliveSTI1.0': ('NeuliveSTI1.0', '1.0.0'),
'TDBC4VCTH': ('NeuliveSTI1.0', '1.0.0'),
}
__slots__ = ('voltage_drop_rate', '_voltage')
@@ -643,10 +646,10 @@ class GeneratorOptions(CliOptions):
sin : sine save (default)
ramp : ramp
(Elite, Neulive serial)
Elite_Legacy
Elite Neulive
TC4VAF2 Elite_Legacy
TDC4VAF2 Elite Neulive
(NeuliveSTI serial)
NeuliveSTI NeuliveSTI1.0
NeuliveSTI NeuliveSTI1.0 TDBC4VCTH
(EliteZM serial)
EliteZM I4V4Z4T4
(mode :IV, :FG, :CV, :ZT, :VT, :IT)
+140 -35
View File
@@ -13,7 +13,7 @@ MSM_REG_WRITE = 0x01
MEM_INS_WRITE = 0x02
MEM_INS_READ = 0x03
MEM_REG_READ = 0x05
DEFAULT_REGISTER_VALUE = 0b0100_0001 # 0x41
DEFAULT_REGISTER_VALUE = 0b0100_0011 # 67
MEM_SIZE = 0x1000
_SLEEP_TIME_ = 0.001
@@ -44,7 +44,7 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
self._spi = HardwareImplSpiInterface(device,
spi_speed=12_000_000)
self._elite_data_len = 120
self._elite_data_len = 40
self._mem_header_len = 3
self._mem_tailer_len = 6
self._single_data_len = self._elite_data_len + self._mem_header_len + self._mem_tailer_len
@@ -201,7 +201,34 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
return green_data_section
def _print_ram_all_data(self):
addr = 0
red_length = int(7000 / 2)
tx_temp = [0] * (red_length + 3)
while True:
tx_temp[0] = MEM_INS_READ
tx_temp[1] = ((addr >> 8) & 0xFF)
tx_temp[2] = (addr & 0xFF)
ram_data = []
ram_data = self._spi.send_byte(tx_temp)
ram_data[0:3] = [255, 255, 255]
print(list(ram_data), len(ram_data), addr)
addr += len(ram_data) - 3
if (7000 < addr + len(ram_data)):
del ram_data
break
print()
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], ']')
rx = []
try:
@@ -214,11 +241,53 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
tx_h[1] = 0
tx_h[2] = 0
# -------------------------------------read one times-------------------------------------------
data = []
flag_print = False
data = self._spi.send_byte(tx_h)
if (data[0] != 255 or data[1] != 255 or data[2] != 255):
self._head_wrong_cnt[device] = self._head_wrong_cnt[device] + 1
if (self._head_wrong_cnt[device] <= 5): # print 5 times
print('data_first[0:3] != [255, 255, 255], device:', device, ',', self._head_wrong_cnt[device], 'times')
print(list(data))
data[0:3] = [255, 255, 255]
# ----------------------------------------------------------------------------------------------
# -------------------------------------read two times-------------------------------------------
# data = []
# data_first = []
# data_second = []
# flag_print = False
# data_first = self._spi.send_byte(tx_h)
# data_second = self._spi.send_byte(tx_h)
# if (data_first[0] != 255 or data_first[1] != 255 or data_first[2] != 255):
# self._head_wrong_cnt[device] = self._head_wrong_cnt[device] + 1
# if (self._head_wrong_cnt[device] < 10):
# print('data_first[0:3] != [255, 255, 255], device:', device, ',', self._head_wrong_cnt[device], 'times')
# print(list(data_first))
# if (data_second[0] != 255 or data_second[1] != 255 or data_second[2] != 255):
# self._head_wrong_cnt[device] = self._head_wrong_cnt[device] + 1
# if (self._head_wrong_cnt[device] < 10):
# print('data_second[0:3] != [255, 255, 255], device:', device, ',', self._head_wrong_cnt[device], 'times')
# print(list(data_second))
# if (data_first[3:] == data_second[3:]):
# data = data_first
# data[0:3] = [255, 255, 255]
# else:
# data_third = self._spi.send_byte(tx_h)
# print("read data_third", data_third)
# data = self.compare_green_data(data_first, data_second, data_third, len(tx_h))
# ----------------------------------------------------------------------------------------------
green_data_section = self._compare_green_data_addr_and_flag(data, device)
@@ -230,6 +299,10 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
if length < 12:
print("length < 12")
print("green data print:", data, device, datetime.now())
# if length == 0:
# self._print_ram_all_data()
return None
if green_data_section[2] != 0xA5 or green_data_section[3] != 0x5A:
@@ -238,6 +311,9 @@ 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)
@@ -245,6 +321,7 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
if (header != 255):
flag_print = True
print("green data: header is not 255: ", header)
# self._print_ram_all_data()
if (elite_data_len != self._elite_data_len):
flag_print = True
@@ -261,10 +338,28 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
tx_d[0] = MEM_INS_READ
tx_d[1] = ((address >> 8) & 0xFF)
tx_d[2] = (address & 0xFF)
# -------------------------------------read one times-------------------------------------------
data = []
data = self._spi.send_byte(tx_d)
data[0:3] = [255, 255, 255]
# ----------------------------------------------------------------------------------------------
# -------------------------------------read two times-------------------------------------------
# data = []
# data_first = []
# data_second = []
# data_first = self._spi.send_byte(tx_d)
# data_second = self._spi.send_byte(tx_d)
# if (data_first[3:] == data_second[3:]):
# data = data_first
# data[0:3] = [255, 255, 255]
# else:
# data_third = self._spi.send_byte(tx_d)
# print("read red data_third", data_third)
# data = self.compare_red_data(data_first, data_second, data_third, len(tx_d))
# ----------------------------------------------------------------------------------------------
if length + 3 <= address + len(data):
rx.extend(data[3:3 + length - address])
del data
@@ -276,6 +371,27 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
address += len(data) - 3
del data
# last_index = 0
# print("_[Debug] @ spi recv data rx, ram_select:", self._pin_ram_sel_value[device], ",", datetime.now())
# for i in range(0, len(rx), self._single_data_len):
# last_index = i
# # print(rx[i:i+self._single_data_len])
# if i == 0:
# print(rx[0:8], 'ram:', rx[47])
# if last_index != 0:
# print(rx[last_index:last_index+8], 'ram:', rx[last_index+47])
# print()
# /*
# * red data formate:
# * ramHdr, ramHdr, ramHdr, (3B)
# * 255, #, data_length, (3B)
# * data, (40B)
# * red_wrong, red_retry_cnt, green_wrong, green_retry_cnt, (4B)
# * check_num, (1B)
# * */
# read again if check num is wrong
index = 0
check_number_print = False
@@ -313,6 +429,10 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
except BaseException as e:
print(e)
# finally:
# # print("\n")
# self.pin_busy.output(True)
return bytes(rx)
def read_register(self) -> int:
@@ -337,16 +457,6 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
self._spi.send_byte(tx)
def test_ram(self, channel: int):
spi_MOSI = [MEM_INS_WRITE, 0, 0, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
self._spi.send_byte(spi_MOSI)
print('device:', channel, 'spi_MOSI:',spi_MOSI)
spi_MISO = [0] * len(spi_MOSI)
spi_MISO[0:3] = [MEM_INS_READ, 0, 0]
spi_MISO = self._spi.send_byte(spi_MISO)
print('device:', channel, 'spi_MISO:', spi_MISO)
class ExtMemManager:
def __init__(self, ext_mem: MultiExtMemSpiInterface):
self._ext_mem = ext_mem
@@ -383,31 +493,28 @@ class ExtMemManager:
ret[channel] = tuple(r)
print('ret=', ret)
return ret
@staticmethod
def is_memory_test_fail(result: Tuple[Optional[int], Optional[int]], channel: int) -> int:
def is_no_device(result: Tuple[Optional[int], Optional[int]]) -> bool:
r1, r2 = result
r1_check = False
r2_check = False
return (r1 is None or r2 is None) and (r1 is None or r1 == 0) and (r2 is None or r2 == 0)
if r1 is not None and r1 != 0:
if (r1 & 0b11000001 == DEFAULT_REGISTER_VALUE & 0b11000001):
r1_check = True
print('device:', channel, 'ram0 ready')
if r2 is not None and r2 != 0:
if (r2 & 0b11000001 == DEFAULT_REGISTER_VALUE & 0b11000001):
r2_check = True
print('device:', channel, 'ram1 ready')
print('--------------------')
@staticmethod
def is_memory_test_fail(result: Tuple[Optional[int], Optional[int]]) -> int:
r1, r2 = result
if r1_check and r2_check:
return 0
else:
if r1 is None or r2 is None:
return 1
if r1 is not None and r1 > 0 and r1 != DEFAULT_REGISTER_VALUE:
return 2
if r2 is not None and r2 > 0 and r2 != DEFAULT_REGISTER_VALUE:
return 3
return 0
def get_available_channel(self, result: List[Tuple[Optional[int], Optional[int]]] = None) -> List[int]:
if result is None:
result = self.get_ext_mem_register()
@@ -415,14 +522,12 @@ class ExtMemManager:
ret = []
for channel, result in enumerate(result):
if self.is_memory_test_fail(result, channel) != 0:
if self.is_no_device(result):
continue
if self.is_memory_test_fail(result) != 0:
continue
ret.append(channel)
# test ram
# for channel in self._ext_mem.foreach():
# if channel == 4 or channel == 5:
# self._ext_mem.test_ram(channel)
return ret
+26 -1
View File
@@ -49,6 +49,9 @@ class Project(threading.Thread):
self._count = 1 #流水號
self._project_meta_id = -1
self._subject = []
self.log_verbose = log_verbose
self._logger = logging.getLogger('project')
self._logger.setLevel('DEBUG')
@@ -69,7 +72,10 @@ class Project(threading.Thread):
collection = Collection.find_collection(default_name, default_parent)
parent = {"folder": [collection.id]}
# create project folder
collection = Collection.create_collection(self.name, parent)
folder_name_duplicate = False
if len(self._subject) > 0:
folder_name_duplicate = True
collection = Collection.create_collection(self.name, parent, folder_name_duplicate)
self.setup_collection(collection)
def setup_project(self, project):
@@ -101,6 +107,22 @@ class Project(threading.Thread):
@id.setter
def id(self, new_id):
self._id = new_id
@property
def project_meta_id(self) -> int:
return self._project_meta_id
@project_meta_id.setter
def project_meta_id(self, new_project_meta_id):
self._project_meta_id = new_project_meta_id
@property
def subject(self) -> object:
return self._subject
@subject.setter
def subject(self, new_subject):
self._subject = new_subject
@property
def uuid(self) -> str:
@@ -278,6 +300,9 @@ class Project(threading.Thread):
args = list(map(lambda arg: task_info[arg], instruction['arguments']))
target=getattr(device, instruction['method'])(*args)
print('instruction 2', device, instruction, datetime.now())
if (action.type == 'stop'):
if (len(self._subject) > 0):
target=getattr(device, "save_data_to_subject")(self.id, self.project_meta_id, device, self._subject[0])
if action.type == 'start':
self._count += 1
+1 -1
View File
@@ -175,7 +175,7 @@ class TaskManager():
for index, task in enumerate(self._task_list):
if self.check_task_in_cycle(index) == True:
if task.type == '':
collection = Collection.create_collection(task.name, {"folder": [parent.id]})
collection = Collection.create_collection(task.name, {"folder": [parent.id]}, False)
task.parent = {"folder": [collection.id]}
else:
task.parent = {"folder": [parent.id]}
+7 -11
View File
@@ -1237,10 +1237,7 @@ class RecordingFileWriter:
def get_data_iter(self, d, mqtt_thread):
# print('****d size', d.data_size)
for c in d['channels']:
t = d['time']
v = d['data'][c]
for t, c, v in d.entry_iter():
if c in self._data_db:
### send real-time
if len(self._data_rl[c]) > 0 and self._send_data[c]:
@@ -1255,11 +1252,11 @@ class RecordingFileWriter:
sample_rate_rl = 1
# rec data
# if c < 256:
# sample_rate_rl = int(d.sample_rate / ( 500 * len(self.channel_list) )) #* len(self.channel_list)
# # others
# else:
# sample_rate_rl = int(d.sample_rate_channel_upper_256 / ( 1000 * len(self.channel_list)))
if c < 256:
sample_rate_rl = int(d.sample_rate / ( 500 * len(self.channel_list) )) #* len(self.channel_list)
# others
else:
sample_rate_rl = int(d.sample_rate_channel_upper_256 / ( 1000 * len(self.channel_list)))
if self._close is False:
self._data_value_ch[c].append(int(v))
self._data_value_ch_for_rl[c].append(int(v))
@@ -1418,7 +1415,7 @@ class RecordingFileWriter:
mini_save = False
if len(self._recording_file_dict) > 0:
for ch in self._data_db.keys():
if self._time_now - self._time[ch] > 5000:
if self._time_now - self._time[ch] > 5000000:
if self._recording_file_dict[ch]._status:
_data = ' '.join(self._data_db[ch])
write_sz = self._recording_file_dict[ch].write(_data, self._channel_list)
@@ -1426,7 +1423,6 @@ class RecordingFileWriter:
self._raw_save['id'][ch] = self._recording_file_dict[ch]._id_db
self._raw_save['end_time'][ch] = self._time_now
self._raw_save['size'][ch] = self._recording_file_dict[ch]._size
self._meta._size += write_sz
self._data_db[ch].clear()
self._time[ch] = self._time_now
self._meta._last_time = self._time_now
+3 -1
View File
@@ -673,7 +673,9 @@ class ControlServerAPI(ControlAPI,
return None
def device_update_calibration(self) -> None:
return None
device_list = self.device_manager.list_device()
for x in device_list:
x.update_calibration_info('TDC4VC')
def device_update_radio_frequency(self, device: int, radio_frequency:int) -> bool:
d = self.device_manager.get_device(device)
+33 -6
View File
@@ -718,10 +718,6 @@ class DataServer(SocketServer, DataAPI):
def show_data(self, device):
self._configurations[device].put_rec_queue('show_data')
@logging_info
def tag(self, device: int, data_points: int):
self._configurations[device].put_rec_queue('tag_data')
class DataRuntime(metaclass=abc.ABCMeta):
__slots__ = ('_server', '_device', '_meta_file', '_data_format',
'_sync_started', 'sync_file_request', '_writer')
@@ -868,7 +864,7 @@ class GeneratorDataRuntime(DataRuntime):
__slots__ = ('_generator', '_library', '_start_time')
def __init__(self, server: DataServer, device: int, meta_file: RecordingMetaFile):
super().__init__(server, device, meta_file, I4V4Z4T4DataDecoder.NAME)
super().__init__(server, device, meta_file, NulDataDecoder.NAME)
configuration = meta_file.configuration
self._library = library = configuration.library
@@ -975,7 +971,38 @@ class DeviceDataRuntime(DataRuntime):
@property
def data_format(self) -> DataDecodeFormat:
decoder = super().data_format
return None
# transmit calibration gain level to decoder
if isinstance(decoder, TDC4VAF2DataDecoder):
# get amp_gain from meta file
decoder.amp_gain = self.meta_file.configuration.amp_gain
elif isinstance(decoder, TDC4VCDataDecoder):
# get amp_gain from meta file
decoder.amp_gain = self.meta_file.configuration.amp_gain
decoder._channel = self.meta_file.configuration.channel
decoder._adc_clock = self.meta_file.configuration.get_parameter('ADC_CLOCK')
# decoder._time_stamp_list = self._time_stamp_list
decoder._axis_ch = self.meta_file.configuration.get_parameter('AXIS_CH')
decoder._prev_data = self._prev_data
decoder._prev_delta_time = self._prev_delta_time
decoder._prev_time_stamp = self._prev_time_stamp
# elif isinstance(decoder, I4V4Z4T4DataDecoder):
# get cycle_time from meta file
# decoder._mode = self.meta_file.configuration.MODE
# decoder._cycle_start_time = self._cycle_start_time
elif isinstance(decoder, NeuliveThreeOneDataDecoder):
# get amp_gain from meta file
decoder.amp_gain = self.meta_file.configuration.amp_gain
decoder._channel = self.meta_file.configuration.channel
decoder._adc_clock = self.meta_file.configuration.get_parameter('ADC_CLOCK')
# decoder._time_stamp_list = self._time_stamp_list
decoder._axis_ch = self.meta_file.configuration.get_parameter('AXIS_CH')
decoder._prev_data = self._prev_data
decoder._prev_delta_time = self._prev_delta_time
decoder._prev_time_stamp = self._prev_time_stamp
return decoder
def sync_data(self, data = None) -> Optional[List[bytes]]:
if self._timer_of_not_send is None:
+120 -46
View File
@@ -2,8 +2,6 @@ from time import sleep
from typing import Iterable
from datetime import datetime
import json
import threading
from time import time
import biopro.impl.vcgencmd as vcg
from biopro.data import DataServerOptions, DataAPI
@@ -37,8 +35,11 @@ from biopro.project.project_manager import ProjectManager
from biopro.db.base import Base, Session, engine
from biopro.db.project_report import ProjectReport
from biopro.db.project_meta import MetaProjectInfo
from biopro.db.device import Device
# from biopro.db.device import Device
from biopro.db.recording_data import get_raw_model
from biopro.db.subject_data import SubjectData
from biopro.db.meta import RecordingDataMeta
import random
_RUNTIME_COMPILE = False
@@ -331,6 +332,18 @@ class ControlServer(SocketServer, ControlServerAPI):
finally:
self.led_thread.set_state(LED.AVAILABLE)
# version_info = [0, 2, 1, 7, 23, 2]
# serial_number = DeviceSerialNumber(version_info[0],
# version_info[1],
# version_info[2],
# version_info[3],
# version_info[4],
# version_info[5])
# response = DeviceResponseInfo('Elite-EDC', serial_number, (164, 218, 50, 212, 231, 12), addr_type=0)
# print('setup done', response)
# ret = self.device_manager.connect(response)
# print('ret', ret)
def _setup_get_available_channel(self) -> Optional[List[int]]:
client = self.data_server.client()
@@ -560,8 +573,15 @@ class ControlServer(SocketServer, ControlServerAPI):
response = content
else:
response = to_device_info(content)
try:
# version_info = [0, 2, 1, 7, 23, 2]
# serial_number = DeviceSerialNumber(version_info[0],
# version_info[1],
# version_info[2],
# version_info[3],
# version_info[4],
# version_info[5])
# response = DeviceResponseInfo('Elite-EDC', serial_number, (164, 218, 50, 212, 231, 12))
ret = self.device_manager.connect(response)
except DeviceInstructionError as e:
'''when device reset fail error'''
@@ -864,7 +884,45 @@ class ControlServer(SocketServer, ControlServerAPI):
@logging_info
def device_update_calibration(self, device: int) -> Union[bool, str]:
return None
connect_device = self.device_manager.get_device(device)
if connect_device == None:
return
mac_address = address_str(connect_device.mac_address)
device = Device.get_device({"mac_address": mac_address})
try:
if connect_device.library.name.startswith('Elite_EIS_1.1'):
# update calibration version
connect_device._device.update_cali_version()
# check if is first time or calibration version is different
if connect_device._device._cali_version == -1 or (device.calibration_version != connect_device._device._cali_version):
# get calibration info from device
connect_device.calibration_info('EISZeroOne')
# update_calibration_info
Device.update_device(
{ "mac_address": mac_address },
{
'calibration': connect_device.calibration ,
'calibration_version': connect_device._device._cali_version
}
)
else:
connect_device._device._coeff = device.calibration
except BaseException as e:
# reset device info in db
DeviceAPI.updateByMac(
mac_address,
{
'connect_id': -1,
'connect_status': 'idle',
'auto_connect': False,
}
)
# disconnect device
self.hardware_device_disconnect(device, True)
print(e)
return False
else:
return True
@logging_info
def device_update_radio_frequency(self, device: int, content:int) -> bool:
@@ -1057,36 +1115,6 @@ class ControlServer(SocketServer, ControlServerAPI):
device.status = 1
return True
elif oper == InternalInstruction.PREDEFINED_COUNTDOWN:
if value == 'PULSE_OUTPUT':
continue_mode = device.get_parameter('CONTINUE_MODE')
if continue_mode == 0:
stop_time = device.get_parameter('STOP_TIME')
# Function to send the instruction
def send_instruction():
device.call_instruction('deactive_electrode')
# Function to wait for 30 seconds and then execute the instruction
def delayed_execution(stop_time):
sleep(stop_time)
send_instruction()
device.set_parameter('ACTIVATE_ELECTRODE', 0)
self.mqtt_thread.broadcast_command('device_refresh')
# Create a thread for the delayed execution
thread = threading.Thread(target=delayed_execution, args=(stop_time,))
# Start the thread
thread.start()
# Main program continues without waiting for the thread
# print("Main program continues...")
# print('COUNTDOWN!!!', device, oper, value)
# print(device.get_parameter(value), device.get_parameter_value(value))
return True
elif oper == InternalInstruction.PREDEFINED_TAG:
self._device_set_tag(device, bool(value), 5)
else:
return False
@@ -1101,7 +1129,7 @@ class ControlServer(SocketServer, ControlServerAPI):
client = self.data_server.client()
project = None
project_meta_id = None
_project_meta_id = None
if client is not None:
info = self.file_manager.use(device)
@@ -1115,10 +1143,12 @@ class ControlServer(SocketServer, ControlServerAPI):
if device.occupied_by_project != None:
project = self.project_manager.get(device.occupied_by_project).info_pass_data_server()
project_meta_id = MetaProjectInfo.create_project_meta(project)
_project_meta_id = MetaProjectInfo.create_project_meta(project)
new_project = self.project_manager.get(device.occupied_by_project)
new_project.project_meta_id = _project_meta_id
with client:
client.update_device_configuration(device, info.meta_file, value, project_meta_id)
client.update_device_configuration(device, info.meta_file, value, _project_meta_id)
def _device_set_disable_cache(self, device: CompletedDevice, disable):
if disable:
@@ -1172,12 +1202,6 @@ class ControlServer(SocketServer, ControlServerAPI):
# unset file info, but keep file path cache
self.file_manager.unset(device.device_id)
device.status = 0
def _device_set_tag(self, device: CompletedDevice, sync: bool, n: int):
client = self.data_server.client()
if client is not None:
with client:
client.tag(device, n)
# server provide method implement : websocket broadcast functions
@@ -1354,6 +1378,57 @@ class ControlServer(SocketServer, ControlServerAPI):
} for pkg in PipPackage.list()]
return ret
def save_data_to_subject(self, project, meta, device, subject):
mode = device.get_parameter('MODE')
library = device.library_name
device = {
"library": library,
"mode": mode
}
# "pattern": {
# "id": number,
# "name": string,
# "parameter": object,
# },
# "data": {
# "id": list[int],
# "channel: list[int]
# }
with Session() as session:
meta_result = session.query(RecordingDataMeta).filter(RecordingDataMeta.project == meta).first()
self.mqtt_thread.publish('', json.dumps({
"pattern": {
"id": 4,
},
"data": {
"id": [meta_result.id],
"channel": ['Time', 6]
},
"others": {
"subject": subject,
"device": device,
"project": project,
"project_meta": meta,
}
}), analysis= True)
# result = session.query(recording_raws).order_by(recording_raws.id.desc()).first()
# value = result.data.split(' ')[1:-1:2]
# _value = list(map(int, value))
# sum_value = sum(_value)
# average_value = sum_value / len(_value)
# subject_data = SubjectData(
# subject_id= subject['id'],
# project = project,
# meta = meta,
# mode= device,
# data= average_value
# )
# # Execute the update query
# session.add(subject_data)
# session.commit()
def _hardware_send_test_hardware(self, section: Optional[str] = None) -> Dict[str, Any]:
if section is not None:
@@ -1398,7 +1473,6 @@ class ControlServer(SocketServer, ControlServerAPI):
if client is not None:
with client:
client.show_data(device)
class _RandomCrashThread(ServerThread):
def __init__(self):
super().__init__('Crash')
+3 -1
View File
@@ -170,9 +170,11 @@ class MqttThread(threading.Thread):
self.sleep(3)
self._mqtt_client_local.reconnect()
def publish(self, topic: str, payload: str, inter = False, qos = 2):
def publish(self, topic: str, payload: str, inter = False, analysis=False, qos = 2):
if inter:
_topic = self.__controller_ID + '_user'
elif analysis:
_topic = self.__controller_ID + '_data_analysis/get_analysis_data'
else:
_topic = self.__controller_ID + '/' + topic
if self._mqtt_client_local is not None:
+65 -47
View File
@@ -95,6 +95,7 @@ class RecordingProcess(Process):
self._prev_time_stamp = []
self._isTimeOut = False
# section use
self._skip_ram_cnt = 0
self._get_first_last_cnt = [True, True, True, True, True, True, True, True]
@@ -102,7 +103,7 @@ class RecordingProcess(Process):
self._wrong_cnt = 0
# elite data length
self._elite_data_len = 120
self._elite_data_len = 40
self._mem_header_len = 3
self._mem_tailer_len = 6
self._single_data_len = self._elite_data_len + self._mem_header_len + self._mem_tailer_len
@@ -124,14 +125,40 @@ class RecordingProcess(Process):
decoder = self.ensure_data_format()
# transmit calibration gain level to decoder
if isinstance(decoder, I4V4Z4T4DataDecoder):
decoder._mode = self._meta_file.configuration.get_parameter('MODE')
elif isinstance(decoder, PEL_FMT1_DataDecoder):
decoder._mode = self._meta_file.configuration.get_parameter('MODE')
elif isinstance(decoder, PEL_FMT2_DataDecoder):
if isinstance(decoder, TDC4VAF2DataDecoder):
# get amp_gain from meta file
decoder.amp_gain = self._meta_file.configuration.amp_gain
elif isinstance(decoder, TDC4VCDataDecoder):
# get amp_gain from meta file
decoder.amp_gain = self._meta_file.configuration.amp_gain
decoder._channel = self._meta_file.configuration.channel
decoder._adc_clock = self._meta_file.configuration.get_parameter('ADC_CLOCK')
# decoder._time_stamp_list = self._time_stamp_list
decoder._axis_ch = self._meta_file.configuration.get_parameter('AXIS_CH')
decoder._prev_data = self._prev_data
decoder._prev_delta_time = self._prev_delta_time
decoder._prev_time_stamp = self._prev_time_stamp
elif isinstance(decoder, I4V4Z4T4DataDecoder):
# get cycle_time from meta file
decoder._mode = self._meta_file.configuration.get_parameter('MODE')
# decoder._cycle_start_time = self._cycle_start_time
elif isinstance(decoder, NeuliveThreeOneDataDecoder):
# get amp_gain from meta file
decoder.amp_gain = self._meta_file.configuration.amp_gain
decoder._channel = self._meta_file.configuration.channel
decoder._adc_clock = self._meta_file.configuration.get_parameter('ADC_CLOCK')
# decoder._time_stamp_list = self._time_stamp_list
decoder._axis_ch = self._meta_file.configuration.get_parameter('AXIS_CH')
decoder._accelerator_sensitivity = self._meta_file.configuration.get_parameter('ACCELERATOR_S')
decoder._prev_data = self._prev_data
decoder._prev_delta_time = self._prev_delta_time
decoder._prev_time_stamp = self._prev_time_stamp
elif isinstance(decoder, EISZeroOneDataDecoder):
# get amp_gain from meta file
decoder._mode = self._meta_file.configuration.get_parameter('MODE')
return decoder
def recv_data_foreach_runtime(self) -> bool:
@@ -160,13 +187,6 @@ class RecordingProcess(Process):
return False
elif q == 'show_data':
self._decoder._show_data = not self._decoder._show_data
elif q == 'tag_data':
sleep(0.3)
self._decoder._tag_data = True
self._decoder._count = 0
# print('q_size', self._queue_rec.qsize())
while self._queue_rec.empty() != True:
self._queue_rec.get()
else:
self.rec_update()
self.sync_data(q)
@@ -187,32 +207,36 @@ class RecordingProcess(Process):
# print('sync_data')
# print('data',data)
# print('server/data', self._prev_delta_time,self._prev_time_stamp, self._prev_data)
if data is None or len(data) == 0:
result = self._decoder.decode(b'')
if result is not None:
ret = result
else:
return None
else:
ret = []
# print('decoder data')
for offset, section in self._foreach_data_section(data):
# for section in self._neu_foreach_data_section(data):
d = self._decoder.decode(section)
result = self._decoder.decode(section)
# if self._isTimeOut:
# try:
# print('result: ', result.data_size)
# except:
# pass
if d is not None:
if result is not None:
##
if len(self._mqtt_send_data_ch_level) == 0:
for ch in d["channels"]:
self._mqtt_send_data_ch_level[ch] = MqttDataMessageHandler(self._mqtt_thread, 'data_server/device_data_stream/' + str(d["device"]) + '/' + str(ch) )
ret.append(d)
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) )
ret.append(result)
else:
continue
@@ -220,7 +244,7 @@ class RecordingProcess(Process):
# ctime1 = time()
if self._writer is not None and len(ret) > 0:
if len(self._writer.channel_list) == 0:
self._writer.channels_update(ret[0]['channels'])
self._writer.channels_update(ret[0].channels())
self._writer.write(ret, self._mqtt_send_data_ch_level)
# print('write time: ', time() - ctime1)
# print(ret)
@@ -230,15 +254,8 @@ class RecordingProcess(Process):
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
except KeyError as e:
print('time duration keyerror')
pass
try:
if isinstance(self._decoder, I4V4Z4T4DataDecoder) or \
isinstance(self._decoder, EISZeroOneDataDecoder) or \
isinstance(self._decoder, PEL_FMT1_DataDecoder) or \
isinstance(self._decoder, PEL_FMT2_DataDecoder):
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
@@ -248,9 +265,8 @@ class RecordingProcess(Process):
# content['instruction'] = 'interrupt'
# self._mqtt_thread.publish('device_instruction',json_stringify(content), True)
# self.server.stop_sync(self.device)
except KeyError as e:
print('isFinishMode error')
pass
except RuntimeError as e:
print(e)
del ret
del data
@@ -261,6 +277,7 @@ class RecordingProcess(Process):
save = True
head = raw_data[0]
head_counter = raw_data[1]
device_id = raw_data[3]
try:
# assign last_data_cnt value and handle first last_data_cnt
@@ -288,10 +305,11 @@ class RecordingProcess(Process):
self._last_cnt[7] = head_counter - 1
last_data_cnt = self._last_cnt[7]
# dont save to section when head is wrong
if (head != 255):
# dont save to section when head or id is wrong
if (head != 255 or device_id != device or head_counter > 255 or head_counter < 0):
save = False
last_data_cnt = last_data_cnt + 1
return save
if (last_data_cnt == 255):
@@ -524,31 +542,31 @@ class RecordingProcess(Process):
if (save == True):
section = raw_data[i]
# check_sum = sum(section[0 : single_data_len - 1]) & 0b11111111
check_sum = sum(section[0 : single_data_len - 1]) & 0b11111111
# if (check_sum != section[single_data_len - 1]):
# print('check number not match,',
# list(section[0 : mem_header_len]), section[-1], '!=', check_sum, 'device:', device, ',', datetime.now())
# if (i-1 >= 0):
# print('check number not match', list(raw_data[i-1]), 'raw:', i-1)
if (check_sum != section[single_data_len - 1]):
print('check number not match,',
list(section[0 : mem_header_len]), section[-1], '!=', check_sum, 'device:', device, ',', datetime.now())
if (i-1 >= 0):
print('check number not match', list(raw_data[i-1]), 'raw:', i-1)
# print('check number not match', list(raw_data[i]), 'raw:', i)
print('check number not match', list(raw_data[i]), 'raw:', i)
# if (i+1 <= records):
# print('check number not match', list(raw_data[i+1]), 'raw:', i+1, '\n')
# section = section + b'\x01'
if (i+1 <= records):
print('check number not match', list(raw_data[i+1]), 'raw:', i+1, '\n')
section = section + b'\x01'
# print('delete data:', list(raw_data[i][0:3]), 'raw:', i, '\n')
# continue
# else:
# section = section + b'\x00'
print('delete data:', list(raw_data[i][0:3]), 'raw:', i, '\n')
continue
else:
section = section + b'\x00'
# section = section[3:]
yield None, section
else:
print_flag = True
print('delete data:', list(raw_data[i][0:20]), 'raw:', i, '\n')
print('delete data:', list(raw_data[i][0:3]), 'raw:', i, '\n')
# if print_flag:
# print('delete data context:')
File diff suppressed because it is too large Load Diff
-343
View File
@@ -1,343 +0,0 @@
{
"name": "CPG",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite-CPG.*",
"major_product_number": 0,
"minor_product_number": 8,
"major_version_number": 0,
"minor_version_number": 1
},
"constant": {
"TIME_MAX": 100000,
"VOLT_MAX": 65536,
"Const_Current_Range": 1500001,
"BLE_WRITE_MAX": 255
},
"parameters": {
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"FREQUENCY": {
"description": "FREQUENCY",
"record_meta": true,
"initial": [80, 0],
"domain": {
"list": [1000000]
}
},
"AMPLITUDE": {
"description": "AMPLITUDE",
"record_meta": true,
"initial": [1, 1],
"domain": {
"list": "float"
}
},
"PULSE_WIDTH": {
"description": "PULSE_WIDTH",
"record_meta": true,
"initial": [250, 250],
"domain": {
"list": [1000000]
}
},
"PATTERN_MODE": {
"description": "SELECT_ELECTRODE",
"record_meta": true,
"initial": [1, 0],
"domain": {
"list": "float"
}
},
"CONTINUE_MODE": {
"description": "CONTINUE_MODE",
"record_meta": true,
"initial": 1,
"domain": [2],
"value": {
"expression": "VALUE"
}
},
"STOP_TIME": {
"description": "STOP_TIME",
"record_meta": true,
"initial": 30,
"domain": [1000000],
"value": {
"expression": "VALUE"
}
},
"ELECTRODE_SELECTOR": {
"description": "ELECTRODE_SELECTOR",
"record_meta": true,
"initial": [true,false,true,false],
"domain": {
"list": [2]
}
},
"WORKING_ELECTRODE": {
"description": "WORKING_ELECTRODE",
"record_meta": true,
"initial": [0, 0, 0, 0],
"domain": {
"list": "float"
}
},
"PATTERN_SELECTOR": {
"description": "PATTERN_SELECTOR",
"record_meta": true,
"initial": [0, 0, 1, 1],
"domain": {
"list": "float"
}
},
"ACTIVATE_ELECTRODE": {
"description": "PATTERN_SELECTOR",
"record_meta": true,
"initial": 0,
"domain": "float"
},
"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,
"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,
"initial": 0,
"value": [
"Electrical stimulation",
"Dev Mode"
]
},
"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"
},
"TIME_UNIT": {
"description": "Duration unit",
"initial": 2,
"value": [
"h",
"m",
"s",
"ms"
]
},
"TIME_DURATION": {
"description": "Run duration",
"record_meta": true,
"initial": 0,
"domain": [
"TIME_MAX"
],
"value": {
"expression": "VALUE"
}
}
},
"instruction": {
"output": [
"active_electrode",
"_countdown('PULSE_OUTPUT')"
],
"active_electrode": {
"type": "RIS",
"parameter": {
"ch0": "ELECTRODE_SELECTOR[0]",
"ch1": "ELECTRODE_SELECTOR[1]",
"ch2": "ELECTRODE_SELECTOR[2]",
"ch3": "ELECTRODE_SELECTOR[3]",
"Amp1": {
"expression": "PATTERN_SELECTOR[0]",
"when": {
"0": "AMPLITUDE[0]",
"1": "AMPLITUDE[1]"
}
},
"Freq1": {
"expression": "PATTERN_SELECTOR[0]",
"when": {
"0": "FREQUENCY[0]",
"1": "FREQUENCY[1]"
}
},
"Pulse1": {
"expression": "PATTERN_SELECTOR[0]",
"when": {
"0": "PULSE_WIDTH[0]",
"1": "PULSE_WIDTH[1]"
}
},
"Amp2": {
"expression": "PATTERN_SELECTOR[2]",
"when": {
"0": "AMPLITUDE[0]",
"1": "AMPLITUDE[1]"
}
},
"Freq2": {
"expression": "PATTERN_SELECTOR[2]",
"when": {
"0": "FREQUENCY[0]",
"1": "FREQUENCY[1]"
}
},
"Pulse2": {
"expression": "PATTERN_SELECTOR[2]",
"when": {
"0": "PULSE_WIDTH[0]",
"1": "PULSE_WIDTH[1]"
}
}
},
"data": [
"1XFF;1X02;1XA0;",
"1bch0;1bch1;6b000000;",
"4BAmp1;4BPulse1;4BFreq1;",
"2b00;1bch2;1bch3;4b0000;",
"4BAmp2;4BPulse2;4BFreq2;",
"4BSTOP_TIME;",
"1bch0;1bch1;1bch2;1bch3;4b0000;"
]
},
"deactive_electrode": {
"type": "RIS",
"parameter": {
"ch0": "ELECTRODE_SELECTOR[0]",
"ch1": "ELECTRODE_SELECTOR[1]",
"ch2": "ELECTRODE_SELECTOR[2]",
"ch3": "ELECTRODE_SELECTOR[3]"
},
"data": [
"1XFF;1X02;1XA1;",
"1bch0;1bch1;1bch2;1bch3;4b0000;"
]
},
"resume_electrode_0": {
"type": "RIS",
"data": [
"1XFF;1X02;1X06;4b1000;4b0000;"
]
},
"resume_electrode_1": {
"type": "RIS",
"data": [
"1XFF;1X02;1X06;4b0100;4b0000;"
]
},
"resume_electrode_2": {
"type": "RIS",
"data": [
"1XFF;1X02;1X06;4b0010;4b0000;"
]
},
"resume_electrode_3": {
"type": "RIS",
"data": [
"1XFF;1X02;1X06;4b0001;4b0000;"
]
},
"suspend_electrode_0": {
"type": "RIS",
"data": [
"1XFF;1X02;1X05;4b1000;4b0000;"
]
},
"suspend_electrode_1": {
"type": "RIS",
"data": [
"1XFF;1X02;1X05;4b0100;4b0000;"
]
},
"suspend_electrode_2": {
"type": "RIS",
"data": [
"1XFF;1X02;1X05;4b0010;4b0000;"
]
},
"suspend_electrode_3": {
"type": "RIS",
"data": [
"1XFF;1X02;1X05;4b0001;4b0000;"
]
},
"idle": [
"_idle()"
],
"data_format": [
"_data_format('I4V4Z4T4')",
{
"expression": "MODE",
"when": {
"0": "_disable_cache(True)",
"1": "_disable_cache(True)",
"*": "_disable_cache(False)"
}
}
],
"ble_instru_send": [
"ble_write",
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"data": [
"255X>BLE_WRITE;"
]
},
"dev_version": [
"CIS_VERSION",
"_cdr('20X>ADC_VALUE_I')"
],
"dev_battery": [
"CIS_VOLT",
"_cdr('20X>ADC_VALUE_I')"
],
"set_para_DAC_VOLT": {
"type": "RIS",
"data": [
"XE2;X01;2B>DAC_VOLT"
]
}
}
}
@@ -1638,9 +1638,14 @@
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"type": "RIS",
"data": [
"255X>BLE_WRITE;"
"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": [
@@ -1638,9 +1638,14 @@
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"type": "RIS",
"data": [
"255X>BLE_WRITE;"
"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": [
@@ -1706,9 +1706,14 @@
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"type": "RIS",
"data": [
"255X>BLE_WRITE;"
"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": [
@@ -1,12 +1,12 @@
{
"name": "Elite_EDC_1.5r2",
"name": "Elite_EDC_1.5re",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite.*",
"major_product_number": 0,
"minor_product_number": 2,
"major_version_number": 1,
"minor_version_number": 8
"minor_version_number": 7
},
"constant": {
"TIME_MAX": 100000,
@@ -1706,9 +1706,14 @@
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"type": "RIS",
"data": [
"255X>BLE_WRITE;"
"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": [
@@ -1706,9 +1706,14 @@
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"type": "RIS",
"data": [
"255X>BLE_WRITE;"
"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": [
File diff suppressed because it is too large Load Diff
@@ -633,9 +633,14 @@
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"type": "RIS",
"data": [
"255X>BLE_WRITE;"
"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": [
@@ -633,9 +633,14 @@
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"type": "RIS",
"data": [
"255X>BLE_WRITE;"
"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": [
@@ -633,9 +633,14 @@
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"type": "RIS",
"data": [
"255X>BLE_WRITE;"
"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": [
+10 -840
View File
@@ -10,170 +10,9 @@
},
"constant": {
"TIME_MAX": 100000,
"BLE_WRITE_MAX": 255,
"MODE_ALL_OUTPUT": 15,
"ELITE_CH_PR0": 0,
"ELITE_CH_D0": 1,
"ELITE_CH_A0": 2,
"ELITE_CH_A2": 3,
"ELITE_CH_A3": 4,
"ELITE_CH_A1": 5,
"ELITE_CH_D1": 6,
"ELITE_CH_PR1": 7,
"PR0": 0,
"PR1": 1,
"D0": 2,
"D1": 3,
"A0": 4,
"A1": 5,
"A2": 6,
"A3": 7
"BLE_WRITE_MAX": 255
},
"parameters": {
"USED": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"T_EARLY": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 86400000
]
},
"value": "VALUE"
},
"V_EARLY": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"CYCLE": {
"initial": [1, 1, 1, 1, 1, 1, 1, 1],
"domain": {
"list": [
0, 65535
]
},
"value": "VALUE"
},
"T_MID0": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 86400000
]
},
"value": "VALUE"
},
"T_MID1": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 86400000
]
},
"value": "VALUE"
},
"T_MID2": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 86400000
]
},
"value": "VALUE"
},
"T_MID3": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 86400000
]
},
"value": "VALUE"
},
"V_MID0": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"V_MID1": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"V_MID2": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"V_MID3": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"T_LATE": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 86400000
]
},
"value": "VALUE"
},
"V_LATE": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"CURRENT": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 50000
]
},
"value": "VALUE"
},
"OUTPUT_5V": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
@@ -332,12 +171,10 @@
"MODE": {
"description": "working mode",
"record_meta": true,
"initial": 3,
"value": [
"Analog Current Control (ACC)",
"Idle",
"Dev Mode",
"Trigger"
"Dev Mode"
]
},
"CHANNEL": {
@@ -398,8 +235,7 @@
{
"expression": "MODE",
"when": {
"0": "curve_acc",
"3": "trig_timer_mode"
"0": "curve_acc"
}
},
"_sync(True)",
@@ -429,9 +265,14 @@
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"type": "RIS",
"data": [
"255X>BLE_WRITE;"
"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];"
]
},
"curve_acc": {
@@ -496,677 +337,6 @@
"data": [
"XE2;X02;X03;2B>ACC_a_out3_current;1B>ACC_a_out3"
]
},
"trig_timer_mode": [
"trig_timer_mode_set_mode",
{
"expression": "USED[PR0]",
"when": {
"True": "trig_timer_mode_set_PR0"
}
},
{
"expression": "USED[PR1]",
"when": {
"True": "trig_timer_mode_set_PR1"
}
},
{
"expression": "USED[D0]",
"when": {
"True": "trig_timer_mode_set_D0"
}
},
{
"expression": "USED[D1]",
"when": {
"True": "trig_timer_mode_set_D1"
}
},
{
"expression": "USED[A0]",
"when": {
"True": "trig_timer_mode_set_A0"
}
},
{
"expression": "USED[A1]",
"when": {
"True": "trig_timer_mode_set_A1"
}
},
{
"expression": "USED[A2]",
"when": {
"True": "trig_timer_mode_set_A2"
}
},
{
"expression": "USED[A3]",
"when": {
"True": "trig_timer_mode_set_A3"
}
}
],
"trig_timer_mode_set_mode": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT"
},
"data": [
"1B>mode;",
"1XFF;"
]
},
"trig_timer_mode_set_PR0": [
"trig_timer_mode_set_PR0_para1",
"trig_timer_mode_set_PR0_para2",
"trig_timer_mode_set_PR0_para3"
],
"trig_timer_mode_set_PR0_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_PR0",
"para_sequence": 1,
"used": "USED[PR0]",
"v_early": "V_EARLY[PR0]",
"v_late": "V_LATE[PR0]",
"v_mid0": "V_MID0[PR0]",
"v_mid1": "V_MID1[PR0]",
"v_mid2": "V_MID2[PR0]",
"v_mid3": "V_MID3[PR0]",
"cycle": "CYCLE[PR0]",
"t_early": "T_EARLY[PR0]",
"t_late": "T_LATE[PR0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_PR0_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_PR0",
"para_sequence": 2,
"t_mid0": "T_MID0[PR0]",
"t_mid1": "T_MID1[PR0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_PR0_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_PR0",
"para_sequence": 3,
"t_mid2": "T_MID2[PR0]",
"t_mid3": "T_MID3[PR0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_PR1": [
"trig_timer_mode_set_PR1_para1",
"trig_timer_mode_set_PR1_para2",
"trig_timer_mode_set_PR1_para3"
],
"trig_timer_mode_set_PR1_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_PR1",
"para_sequence": 1,
"used": "USED[PR1]",
"v_early": "V_EARLY[PR1]",
"v_late": "V_LATE[PR1]",
"v_mid0": "V_MID0[PR1]",
"v_mid1": "V_MID1[PR1]",
"v_mid2": "V_MID2[PR1]",
"v_mid3": "V_MID3[PR1]",
"cycle": "CYCLE[PR1]",
"t_early": "T_EARLY[PR1]",
"t_late": "T_LATE[PR1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_PR1_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_PR1",
"para_sequence": 2,
"t_mid0": "T_MID0[PR1]",
"t_mid1": "T_MID1[PR1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_PR1_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_PR1",
"para_sequence": 3,
"t_mid2": "T_MID2[PR1]",
"t_mid3": "T_MID3[PR1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_D0": [
"trig_timer_mode_set_D0_para1",
"trig_timer_mode_set_D0_para2",
"trig_timer_mode_set_D0_para3",
"trig_timer_mode_set_D0_para4"
],
"trig_timer_mode_set_D0_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D0",
"para_sequence": 1,
"used": "USED[D0]",
"v_early": "V_EARLY[D0]",
"v_late": "V_LATE[D0]",
"v_mid0": "V_MID0[D0]",
"v_mid1": "V_MID1[D0]",
"v_mid2": "V_MID2[D0]",
"v_mid3": "V_MID3[D0]",
"cycle": "CYCLE[D0]",
"t_early": "T_EARLY[D0]",
"t_late": "T_LATE[D0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_D0_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D0",
"para_sequence": 2,
"t_mid0": "T_MID0[D0]",
"t_mid1": "T_MID1[D0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_D0_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D0",
"para_sequence": 3,
"t_mid2": "T_MID2[D0]",
"t_mid3": "T_MID3[D0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_D0_para4": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D0",
"para_sequence": 4,
"d0_as_5v_en": "OUTPUT_5V[D0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"1B>d0_as_5v_en;"
]
},
"trig_timer_mode_set_D1": [
"trig_timer_mode_set_D1_para1",
"trig_timer_mode_set_D1_para2",
"trig_timer_mode_set_D1_para3",
"trig_timer_mode_set_D1_para4"
],
"trig_timer_mode_set_D1_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D1",
"para_sequence": 1,
"used": "USED[D1]",
"v_early": "V_EARLY[D1]",
"v_late": "V_LATE[D1]",
"v_mid0": "V_MID0[D1]",
"v_mid1": "V_MID1[D1]",
"v_mid2": "V_MID2[D1]",
"v_mid3": "V_MID3[D1]",
"cycle": "CYCLE[D1]",
"t_early": "T_EARLY[D1]",
"t_late": "T_LATE[D1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_D1_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D1",
"para_sequence": 2,
"t_mid0": "T_MID0[D1]",
"t_mid1": "T_MID1[D1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_D1_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D1",
"para_sequence": 3,
"t_mid2": "T_MID2[D1]",
"t_mid3": "T_MID3[D1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_D1_para4": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D1",
"para_sequence": 4,
"d0_as_5v_en": "OUTPUT_5V[D1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"1B>d0_as_5v_en;"
]
},
"trig_timer_mode_set_A0": [
"trig_timer_mode_set_A0_para1",
"trig_timer_mode_set_A0_para2",
"trig_timer_mode_set_A0_para3",
"trig_timer_mode_set_A0_para4"
],
"trig_timer_mode_set_A0_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A0",
"para_sequence": 1,
"used": "USED[A0]",
"v_early": "V_EARLY[A0]",
"v_late": "V_LATE[A0]",
"v_mid0": "V_MID0[A0]",
"v_mid1": "V_MID1[A0]",
"v_mid2": "V_MID2[A0]",
"v_mid3": "V_MID3[A0]",
"cycle": "CYCLE[A0]",
"t_early": "T_EARLY[A0]",
"t_late": "T_LATE[A0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_A0_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A0",
"para_sequence": 2,
"t_mid0": "T_MID0[A0]",
"t_mid1": "T_MID1[A0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_A0_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A0",
"para_sequence": 3,
"t_mid2": "T_MID2[A0]",
"t_mid3": "T_MID3[A0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_A0_para4": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A0",
"para_sequence": 4,
"current": "CURRENT[A0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"2B>current;"
]
},
"trig_timer_mode_set_A1": [
"trig_timer_mode_set_A1_para1",
"trig_timer_mode_set_A1_para2",
"trig_timer_mode_set_A1_para3",
"trig_timer_mode_set_A1_para4"
],
"trig_timer_mode_set_A1_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A1",
"para_sequence": 1,
"used": "USED[A1]",
"v_early": "V_EARLY[A1]",
"v_late": "V_LATE[A1]",
"v_mid0": "V_MID0[A1]",
"v_mid1": "V_MID1[A1]",
"v_mid2": "V_MID2[A1]",
"v_mid3": "V_MID3[A1]",
"cycle": "CYCLE[A1]",
"t_early": "T_EARLY[A1]",
"t_late": "T_LATE[A1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_A1_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A1",
"para_sequence": 2,
"t_mid0": "T_MID0[A1]",
"t_mid1": "T_MID1[A1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_A1_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A1",
"para_sequence": 3,
"t_mid2": "T_MID2[A1]",
"t_mid3": "T_MID3[A1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_A1_para4": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A1",
"para_sequence": 4,
"current": "CURRENT[A1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"2B>current;"
]
},
"trig_timer_mode_set_A2": [
"trig_timer_mode_set_A2_para1",
"trig_timer_mode_set_A2_para2",
"trig_timer_mode_set_A2_para3",
"trig_timer_mode_set_A2_para4"
],
"trig_timer_mode_set_A2_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A2",
"para_sequence": 1,
"used": "USED[A2]",
"v_early": "V_EARLY[A2]",
"v_late": "V_LATE[A2]",
"v_mid0": "V_MID0[A2]",
"v_mid1": "V_MID1[A2]",
"v_mid2": "V_MID2[A2]",
"v_mid3": "V_MID3[A2]",
"cycle": "CYCLE[A2]",
"t_early": "T_EARLY[A2]",
"t_late": "T_LATE[A2]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_A2_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A2",
"para_sequence": 2,
"t_mid0": "T_MID0[A2]",
"t_mid1": "T_MID1[A2]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_A2_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A2",
"para_sequence": 3,
"t_mid2": "T_MID2[A2]",
"t_mid3": "T_MID3[A2]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_A2_para4": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A2",
"para_sequence": 4,
"current": "CURRENT[A2]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"2B>current;"
]
},
"trig_timer_mode_set_A3": [
"trig_timer_mode_set_A3_para1",
"trig_timer_mode_set_A3_para2",
"trig_timer_mode_set_A3_para3",
"trig_timer_mode_set_A3_para4"
],
"trig_timer_mode_set_A3_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A3",
"para_sequence": 1,
"used": "USED[A3]",
"v_early": "V_EARLY[A3]",
"v_late": "V_LATE[A3]",
"v_mid0": "V_MID0[A3]",
"v_mid1": "V_MID1[A3]",
"v_mid2": "V_MID2[A3]",
"v_mid3": "V_MID3[A3]",
"cycle": "CYCLE[A3]",
"t_early": "T_EARLY[A3]",
"t_late": "T_LATE[A3]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_A3_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A3",
"para_sequence": 2,
"t_mid0": "T_MID0[A3]",
"t_mid1": "T_MID1[A3]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_A3_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A3",
"para_sequence": 3,
"t_mid2": "T_MID2[A3]",
"t_mid3": "T_MID3[A3]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_A3_para4": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A3",
"para_sequence": 4,
"current": "CURRENT[A3]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"2B>current;"
]
}
}
}
-348
View File
@@ -1,348 +0,0 @@
{
"name": "MMM_1.0",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite-MMM.*",
"major_product_number": 0,
"minor_product_number": 9,
"major_version_number": 0,
"minor_version_number": 1
},
"constant": {
"TIME_MAX": 100000,
"VOLT_MAX": 65536,
"Const_Current_Range": 1500001,
"BLE_WRITE_MAX": 255,
"DROP_10MS":5,
"NOTIFY_DATA": 10
},
"parameters": {
"BAUDRATE": {
"description": "baudrate",
"record_meta": true,
"initial": 10000,
"domain": [
1000000
],
"value": {
"expression": "VALUE"
},
"on_change": "set_sample_rate"
},
"CHANNEL": {
"description": "record channels",
"record_meta": true,
"domain": "property",
"value": "[0, 1, 2]"
},
"SAMPLE_RATE": {
"description": "data sampling rate",
"record_meta": true,
"initial": 100,
"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,
"initial": 0,
"value": [
"Dev Mode",
"Dev Mode",
"MMM"
]
},
"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"
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"PATTERN_SWITCH": {
"description": "switch of pattern",
"initial": 1,
"domain": [
2
],
"value": {
"expression": "VALUE"
}
},
"PULSE": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": [
0,
0,
0
],
"domain": {
"list": [
66536
]
},
"value": {
"expression": "VALUE"
}
},
"PATTERN": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": 1,
"domain": [
44
],
"value": {
"expression": "VALUE"
}
},
"PATTERN_MAX": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": 43,
"domain": [
100
],
"value": {
"expression": "VALUE"
}
},
"PATTERN_MIN": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": 1,
"domain": [
100
],
"value": {
"expression": "VALUE"
}
}
},
"instruction": {
"start": [
"data_format",
"_notify(True)",
{
"expression": "MODE",
"when": {
"0": "start_manual_scan_mode",
"1": "start_manual_scan_mode",
"2": "",
"3": "start_auto_scan_mode",
"4": "start_auto_scan_mode",
"5": "start_R_external_cali_mode"
}
},
"_sync(True)"
],
"get_data": [
"manual_scan_mode_set_R_pattern"
],
"stop": [
"_notify(False)",
{
"expression": "MODE",
"when": {
"0": "stop_manual_scan_mode",
"1": "stop_manual_scan_mode",
"2": "",
"3": "stop_auto_scan_mode",
"4": "stop_auto_scan_mode",
"5": "stop_R_external_cali_mode"
}
},
"_sync(False)"
],
"data_format": [
"_data_format('BMD380')",
{
"expression": "MODE",
"when": {
"0": "_disable_cache(True)",
"1": "_disable_cache(True)",
"*": "_disable_cache(False)"
}
}
],
"start_manual_scan_mode": [
{
"expression": "PATTERN_SWITCH",
"when": {
"0": "start_manual_scan_mode_use_pattern",
"1": "start_manual_scan_mode_use_bit"
}
}
],
"start_manual_scan_mode_use_pattern": {
"type": "RIS",
"parameter": {
"pa": "PATTERN",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X01;",
"X00;X01;",
"16b>pa;",
"16b>ca;",
"16b>cb;"
]
},
"start_manual_scan_mode_use_bit": {
"type": "RIS",
"parameter": {
"pa": "PULSE[0]",
"pb": "PULSE[1]",
"pc": "PULSE[2]",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X01;",
"X00;X00;",
"4b>0;4b>pa;4b>pb;4b>pc;",
"16b>ca;",
"16b>cb;"
]
},
"manual_scan_mode_set_R_pattern": [
{
"expression": "PATTERN_SWITCH",
"when": {
"0": "pattern",
"1": "bit"
}
}
],
"pattern": {
"type": "RIS",
"parameter": {
"pa": "PATTERN",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X02;",
"X00;X01;",
"16b>pa;",
"16b>ca;",
"16b>cb;"
]
},
"bit": {
"type": "RIS",
"parameter": {
"pa": "PULSE[0]",
"pb": "PULSE[1]",
"pc": "PULSE[2]",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X02;",
"X00;X00;",
"4b>0;4b>pa;4b>pb;4b>pc;",
"16b>ca;",
"16b>cb;"
]
},
"stop_manual_scan_mode": {
"type": "RIS",
"data": [
"X01;X00;"
]
},
"start_auto_scan_mode": {
"type": "RIS",
"parameter": {
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X02;X01;",
"2B>PATTERN_MAX;",
"2B>PATTERN_MIN;",
"16b>ca;",
"16b>cb;"
]
},
"stop_auto_scan_mode": {
"type": "RIS",
"data": [
"X02;X00;"
]
},
"start_R_external_cali_mode": {
"type": "RIS",
"parameter": {
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X03;X01;",
"16b>ca;",
"16b>cb;"
]
},
"stop_R_external_cali_mode": {
"type": "RIS",
"data": [
"X03;X00;"
]
},
"enable_notify": {
"type": "RIS",
"data": [
"XFF;XA3;X04;"
]
},
"disable_notify": {
"type": "RIS",
"data": [
"XFF;XA3;X05;"
]
},
"ble_instru_send": [
"ble_write",
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"data": [
"255X>BLE_WRITE;"
]
},
"dev_version": [
"CIS_VERSION",
"_cdr('20X>ADC_VALUE_I')"
],
"dev_battery": [
"CIS_VOLT",
"_cdr('20X>ADC_VALUE_I')"
]
}
}
-339
View File
@@ -1,339 +0,0 @@
{
"name": "PEL_1.0",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite-PEL.*",
"major_product_number": 0,
"minor_product_number": 7,
"major_version_number": 0,
"minor_version_number": 0
},
"constant": {
"TIME_MAX": 100000,
"VOLT_MAX": 65536,
"Const_Current_Range": 1500001,
"BLE_WRITE_MAX": 255,
"DROP_10MS":5,
"NOTIFY_DATA": 10
},
"parameters": {
"CHANNEL": {
"description": "record channels",
"record_meta": true,
"domain": "property",
"value": "[0, 1, 2]"
},
"SAMPLE_RATE": {
"description": "data sampling rate",
"record_meta": true,
"initial": 100,
"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,
"initial": 0,
"value": [
"Select Resistor Pick Mode",
"Select Resistor Full Mode",
"Dev Mode",
"IOPH",
"IOPL",
"R-external calibration"
]
},
"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"
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"PATTERN_SWITCH": {
"description": "switch of pattern",
"initial": 1,
"domain": [
2
],
"value": {
"expression": "VALUE"
}
},
"PULSE": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": [
0,
0,
0
],
"domain": {
"list": [
66536
]
},
"value": {
"expression": "VALUE"
}
},
"PATTERN": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": 1,
"domain": [
44
],
"value": {
"expression": "VALUE"
}
},
"PATTERN_MAX": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": 43,
"domain": [
100
],
"value": {
"expression": "VALUE"
}
},
"PATTERN_MIN": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": 1,
"domain": [
100
],
"value": {
"expression": "VALUE"
}
}
},
"instruction": {
"start": [
"data_format",
"_notify(True)",
{
"expression": "MODE",
"when": {
"0": "start_manual_scan_mode",
"1": "start_manual_scan_mode",
"2": "",
"3": "start_auto_scan_mode",
"4": "start_auto_scan_mode",
"5": "start_R_external_cali_mode"
}
},
"_sync(True)"
],
"get_data": [
"manual_scan_mode_set_R_pattern"
],
"stop": [
"_notify(False)",
{
"expression": "MODE",
"when": {
"0": "stop_manual_scan_mode",
"1": "stop_manual_scan_mode",
"2": "",
"3": "stop_auto_scan_mode",
"4": "stop_auto_scan_mode",
"5": "stop_R_external_cali_mode"
}
},
"_sync(False)"
],
"data_format": [
"_data_format('PEL_FMT1_')",
{
"expression": "MODE",
"when": {
"0": "_disable_cache(True)",
"1": "_disable_cache(True)",
"*": "_disable_cache(False)"
}
}
],
"start_manual_scan_mode": [
{
"expression": "PATTERN_SWITCH",
"when": {
"0": "start_manual_scan_mode_use_pattern",
"1": "start_manual_scan_mode_use_bit"
}
}
],
"start_manual_scan_mode_use_pattern": {
"type": "RIS",
"parameter": {
"pa": "PATTERN",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X01;",
"X00;X01;",
"16b>pa;",
"16b>ca;",
"16b>cb;"
]
},
"start_manual_scan_mode_use_bit": {
"type": "RIS",
"parameter": {
"pa": "PULSE[0]",
"pb": "PULSE[1]",
"pc": "PULSE[2]",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X01;",
"X00;X00;",
"4b>0;4b>pa;4b>pb;4b>pc;",
"16b>ca;",
"16b>cb;"
]
},
"manual_scan_mode_set_R_pattern": [
{
"expression": "PATTERN_SWITCH",
"when": {
"0": "pattern",
"1": "bit"
}
}
],
"pattern": {
"type": "RIS",
"parameter": {
"pa": "PATTERN",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X02;",
"X00;X01;",
"16b>pa;",
"16b>ca;",
"16b>cb;"
]
},
"bit": {
"type": "RIS",
"parameter": {
"pa": "PULSE[0]",
"pb": "PULSE[1]",
"pc": "PULSE[2]",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X02;",
"X00;X00;",
"4b>0;4b>pa;4b>pb;4b>pc;",
"16b>ca;",
"16b>cb;"
]
},
"stop_manual_scan_mode": {
"type": "RIS",
"data": [
"X01;X00;"
]
},
"start_auto_scan_mode": {
"type": "RIS",
"parameter": {
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X02;X01;",
"2B>PATTERN_MAX;",
"2B>PATTERN_MIN;",
"16b>ca;",
"16b>cb;"
]
},
"stop_auto_scan_mode": {
"type": "RIS",
"data": [
"X02;X00;"
]
},
"start_R_external_cali_mode": {
"type": "RIS",
"parameter": {
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X03;X01;",
"16b>ca;",
"16b>cb;"
]
},
"stop_R_external_cali_mode": {
"type": "RIS",
"data": [
"X03;X00;"
]
},
"enable_notify": {
"type": "RIS",
"data": [
"XFF;XA3;X04;"
]
},
"disable_notify": {
"type": "RIS",
"data": [
"XFF;XA3;X05;"
]
},
"ble_instru_send": [
"ble_write",
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"data": [
"255X>BLE_WRITE;"
]
},
"dev_version": [
"CIS_VERSION",
"_cdr('20X>ADC_VALUE_I')"
],
"dev_battery": [
"CIS_VOLT",
"_cdr('20X>ADC_VALUE_I')"
]
}
}
-339
View File
@@ -1,339 +0,0 @@
{
"name": "PEL_2.0",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite-PEL.*",
"major_product_number": 0,
"minor_product_number": 7,
"major_version_number": 0,
"minor_version_number": 1
},
"constant": {
"TIME_MAX": 100000,
"VOLT_MAX": 65536,
"Const_Current_Range": 1500001,
"BLE_WRITE_MAX": 255,
"DROP_10MS":5,
"NOTIFY_DATA": 10
},
"parameters": {
"CHANNEL": {
"description": "record channels",
"record_meta": true,
"domain": "property",
"value": "[0, 1, 2]"
},
"SAMPLE_RATE": {
"description": "data sampling rate",
"record_meta": true,
"initial": 100,
"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,
"initial": 0,
"value": [
"Select Resistor Pick Mode",
"Select Resistor Full Mode",
"Dev Mode",
"IOPH",
"IOPL",
"R-external calibration"
]
},
"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"
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"PATTERN_SWITCH": {
"description": "switch of pattern",
"initial": 1,
"domain": [
2
],
"value": {
"expression": "VALUE"
}
},
"PULSE": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": [
0,
0,
0
],
"domain": {
"list": [
66536
]
},
"value": {
"expression": "VALUE"
}
},
"PATTERN": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": 1,
"domain": [
44
],
"value": {
"expression": "VALUE"
}
},
"PATTERN_MAX": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": 43,
"domain": [
100
],
"value": {
"expression": "VALUE"
}
},
"PATTERN_MIN": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": 1,
"domain": [
100
],
"value": {
"expression": "VALUE"
}
}
},
"instruction": {
"start": [
"data_format",
"_notify(True)",
{
"expression": "MODE",
"when": {
"0": "start_manual_scan_mode",
"1": "start_manual_scan_mode",
"2": "",
"3": "start_auto_scan_mode",
"4": "start_auto_scan_mode",
"5": "start_R_external_cali_mode"
}
},
"_sync(True)"
],
"get_data": [
"manual_scan_mode_set_R_pattern"
],
"stop": [
"_notify(False)",
{
"expression": "MODE",
"when": {
"0": "stop_manual_scan_mode",
"1": "stop_manual_scan_mode",
"2": "",
"3": "stop_auto_scan_mode",
"4": "stop_auto_scan_mode",
"5": "stop_R_external_cali_mode"
}
},
"_sync(False)"
],
"data_format": [
"_data_format('PEL_FMT1_')",
{
"expression": "MODE",
"when": {
"0": "_disable_cache(True)",
"1": "_disable_cache(True)",
"*": "_disable_cache(False)"
}
}
],
"start_manual_scan_mode": [
{
"expression": "PATTERN_SWITCH",
"when": {
"0": "start_manual_scan_mode_use_pattern",
"1": "start_manual_scan_mode_use_bit"
}
}
],
"start_manual_scan_mode_use_pattern": {
"type": "RIS",
"parameter": {
"pa": "PATTERN",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X01;",
"X00;X01;",
"16b>pa;",
"16b>ca;",
"16b>cb;"
]
},
"start_manual_scan_mode_use_bit": {
"type": "RIS",
"parameter": {
"pa": "PULSE[0]",
"pb": "PULSE[1]",
"pc": "PULSE[2]",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X01;",
"X00;X00;",
"4b>0;4b>pa;4b>pb;4b>pc;",
"16b>ca;",
"16b>cb;"
]
},
"manual_scan_mode_set_R_pattern": [
{
"expression": "PATTERN_SWITCH",
"when": {
"0": "pattern",
"1": "bit"
}
}
],
"pattern": {
"type": "RIS",
"parameter": {
"pa": "PATTERN",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X02;",
"X00;X01;",
"16b>pa;",
"16b>ca;",
"16b>cb;"
]
},
"bit": {
"type": "RIS",
"parameter": {
"pa": "PULSE[0]",
"pb": "PULSE[1]",
"pc": "PULSE[2]",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X02;",
"X00;X00;",
"4b>0;4b>pa;4b>pb;4b>pc;",
"16b>ca;",
"16b>cb;"
]
},
"stop_manual_scan_mode": {
"type": "RIS",
"data": [
"X01;X00;"
]
},
"start_auto_scan_mode": {
"type": "RIS",
"parameter": {
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X02;X01;",
"2B>PATTERN_MAX;",
"2B>PATTERN_MIN;",
"16b>ca;",
"16b>cb;"
]
},
"stop_auto_scan_mode": {
"type": "RIS",
"data": [
"X02;X00;"
]
},
"start_R_external_cali_mode": {
"type": "RIS",
"parameter": {
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X03;X01;",
"16b>ca;",
"16b>cb;"
]
},
"stop_R_external_cali_mode": {
"type": "RIS",
"data": [
"X03;X00;"
]
},
"enable_notify": {
"type": "RIS",
"data": [
"XFF;XA3;X04;"
]
},
"disable_notify": {
"type": "RIS",
"data": [
"XFF;XA3;X05;"
]
},
"ble_instru_send": [
"ble_write",
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"data": [
"255X>BLE_WRITE;"
]
},
"dev_version": [
"CIS_VERSION",
"_cdr('20X>ADC_VALUE_I')"
],
"dev_battery": [
"CIS_VOLT",
"_cdr('20X>ADC_VALUE_I')"
]
}
}
-339
View File
@@ -1,339 +0,0 @@
{
"name": "PEL_3.0",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite-PEL.*",
"major_product_number": 0,
"minor_product_number": 7,
"major_version_number": 0,
"minor_version_number": 2
},
"constant": {
"TIME_MAX": 100000,
"VOLT_MAX": 65536,
"Const_Current_Range": 1500001,
"BLE_WRITE_MAX": 255,
"DROP_10MS":5,
"NOTIFY_DATA": 10
},
"parameters": {
"CHANNEL": {
"description": "record channels",
"record_meta": true,
"domain": "property",
"value": "[0, 1, 2]"
},
"SAMPLE_RATE": {
"description": "data sampling rate",
"record_meta": true,
"initial": 100,
"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,
"initial": 0,
"value": [
"Select Resistor Pick Mode",
"Select Resistor Full Mode",
"Dev Mode",
"IOPH",
"IOPL",
"R-external calibration"
]
},
"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"
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"PATTERN_SWITCH": {
"description": "switch of pattern",
"initial": 1,
"domain": [
2
],
"value": {
"expression": "VALUE"
}
},
"PULSE": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": [
0,
0,
0
],
"domain": {
"list": [
66536
]
},
"value": {
"expression": "VALUE"
}
},
"PATTERN": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": 1,
"domain": [
44
],
"value": {
"expression": "VALUE"
}
},
"PATTERN_MAX": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": 43,
"domain": [
100
],
"value": {
"expression": "VALUE"
}
},
"PATTERN_MIN": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial": 1,
"domain": [
100
],
"value": {
"expression": "VALUE"
}
}
},
"instruction": {
"start": [
"data_format",
"_notify(True)",
{
"expression": "MODE",
"when": {
"0": "start_manual_scan_mode",
"1": "start_manual_scan_mode",
"2": "",
"3": "start_auto_scan_mode",
"4": "start_auto_scan_mode",
"5": "start_R_external_cali_mode"
}
},
"_sync(True)"
],
"get_data": [
"manual_scan_mode_set_R_pattern"
],
"stop": [
"_notify(False)",
{
"expression": "MODE",
"when": {
"0": "stop_manual_scan_mode",
"1": "stop_manual_scan_mode",
"2": "",
"3": "stop_auto_scan_mode",
"4": "stop_auto_scan_mode",
"5": "stop_R_external_cali_mode"
}
},
"_sync(False)"
],
"data_format": [
"_data_format('PEL_FMT2_')",
{
"expression": "MODE",
"when": {
"0": "_disable_cache(True)",
"1": "_disable_cache(True)",
"*": "_disable_cache(False)"
}
}
],
"start_manual_scan_mode": [
{
"expression": "PATTERN_SWITCH",
"when": {
"0": "start_manual_scan_mode_use_pattern",
"1": "start_manual_scan_mode_use_bit"
}
}
],
"start_manual_scan_mode_use_pattern": {
"type": "RIS",
"parameter": {
"pa": "PATTERN",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X01;",
"X00;X01;",
"16b>pa;",
"16b>ca;",
"16b>cb;"
]
},
"start_manual_scan_mode_use_bit": {
"type": "RIS",
"parameter": {
"pa": "PULSE[0]",
"pb": "PULSE[1]",
"pc": "PULSE[2]",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X01;",
"X00;X00;",
"4b>0;4b>pa;4b>pb;4b>pc;",
"16b>ca;",
"16b>cb;"
]
},
"manual_scan_mode_set_R_pattern": [
{
"expression": "PATTERN_SWITCH",
"when": {
"0": "pattern",
"1": "bit"
}
}
],
"pattern": {
"type": "RIS",
"parameter": {
"pa": "PATTERN",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X02;",
"X00;X01;",
"16b>pa;",
"16b>ca;",
"16b>cb;"
]
},
"bit": {
"type": "RIS",
"parameter": {
"pa": "PULSE[0]",
"pb": "PULSE[1]",
"pc": "PULSE[2]",
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X01;X02;",
"X00;X00;",
"4b>0;4b>pa;4b>pb;4b>pc;",
"16b>ca;",
"16b>cb;"
]
},
"stop_manual_scan_mode": {
"type": "RIS",
"data": [
"X01;X00;"
]
},
"start_auto_scan_mode": {
"type": "RIS",
"parameter": {
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X02;X01;",
"2B>PATTERN_MAX;",
"2B>PATTERN_MIN;",
"16b>ca;",
"16b>cb;"
]
},
"stop_auto_scan_mode": {
"type": "RIS",
"data": [
"X02;X00;"
]
},
"start_R_external_cali_mode": {
"type": "RIS",
"parameter": {
"ca": "DROP_10MS",
"cb": "NOTIFY_DATA"
},
"data": [
"X03;X01;",
"16b>ca;",
"16b>cb;"
]
},
"stop_R_external_cali_mode": {
"type": "RIS",
"data": [
"X03;X00;"
]
},
"enable_notify": {
"type": "RIS",
"data": [
"XFF;XA3;X04;"
]
},
"disable_notify": {
"type": "RIS",
"data": [
"XFF;XA3;X05;"
]
},
"ble_instru_send": [
"ble_write",
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"data": [
"255X>BLE_WRITE;"
]
},
"dev_version": [
"CIS_VERSION",
"_cdr('20X>ADC_VALUE_I')"
],
"dev_battery": [
"CIS_VOLT",
"_cdr('20X>ADC_VALUE_I')"
]
}
}
+4 -1
View File
@@ -35,4 +35,7 @@ sudo su -c "psql -d postgres -c \"ALTER TABLE devices ALTER COLUMN calibration D
sudo su -c "psql -d postgres -c \"ALTER TABLE devices ALTER COLUMN calibration TYPE bytea USING calibration::bytea;\"" postgres
# add column project in recording_data_metas
sudo su -c "psql -d postgres -c \"ALTER TABLE devices ADD COLUMN IF NOT EXISTS calibration_version Int4 DEFAULT -1;\"" postgres
sudo su -c "psql -d postgres -c \"ALTER TABLE devices ADD COLUMN IF NOT EXISTS calibration_version Int4 DEFAULT -1;\"" postgres
# add column subject in project
sudo su -c "psql -d postgres -c \"ALTER TABLE projects ADD COLUMN IF NOT EXISTS subject JSONB;\"" postgres