Compare commits

..

1 Commits

Author SHA1 Message Date
peterlu14 d550536f4f Revert "Merge remote-tracking branch 'origin/dev/fix_no_data' into release/v1.6.7/scheduler_debug"
This reverts commit 4243a13536, reversing
changes made to 97188abff8.
2022-10-17 16:37:14 +08:00
50 changed files with 2694 additions and 10590 deletions
-1
View File
@@ -7,4 +7,3 @@
/.vscode
/media
python/biopro/sever/_identify.py
*.log
+27 -56
View File
@@ -78,8 +78,6 @@ add ssh.txt in boot folder
###### Install dependencies
sudo apt-get install vim git wiringpi build-essential libi2c-dev i2c-tools python-dev libffi-dev python3-pip postgresql npm
sudo apt-get install libatlas-base-dev
sudo apt-get install python3-numpy
###### wiringpi conflict
need to install wiringpi: https://github.com/WiringPi/WiringPi
@@ -96,7 +94,6 @@ git clone https://gitlab.com/wisetop/controller/wisetopdataserver.git
```
cd ~/wisetopdataserver
pip3 install -r requirements.txt
pip3 install SQLAlchemy
```
##### Packages version
```
@@ -158,8 +155,8 @@ reboot
###### Set pi password
```
cd ~
passwd
$cd ~
$passwd
Current password:raspberry
New password:5k6zj454778225
Retype new password:5k6zj454778225
@@ -198,11 +195,11 @@ exit 0
### MQTT broker install
###### 1.Install mosquitto
sudo apt-get install mosquitto mosquitto-clients
$sudo apt-get install mosquitto mosquitto-clients
###### 2.Enable Remote Access
sudo vim /etc/mosquitto/conf.d/default.conf
$sudo vim /etc/mosquitto/conf.d/default.conf
add the code following as:
```
@@ -213,13 +210,13 @@ protocol websockets
allow_anonymous true
```
###### 3.restart mqtt broker
sudo systemctl restart mosquitto
$sudo systemctl restart mosquitto
###### 4.Robust MQTT
create mosquitto_restart.sh
cd ~
sudo vim mosquitto_restart.sh
$cd ~
$sudo vim mosquitto_restart.sh
add the code following as:
@@ -236,16 +233,16 @@ echo "$SERVICE is currently running" >> /home/ubuntu/cron.log
exit 0
```
###### 5.add mosquitto_restart.sh to root routing
sudo chmod +x mosquitto_restart.sh
sudo -i
crontab -e
$sudo chmod +x mosquitto_restart.sh
$sudo -i
$crontab -e
add the code following as:
```
*/5 * * * * /home/pi/mosquitto_restart.sh
```
###### 6.Auto run MQTT broker when when pi-start
sudo vim /etc/rc.local
$sudo vim /etc/rc.local
add the code following as:
```
@@ -254,31 +251,31 @@ sudo nohup systemctl restart mosquitto
### Setting up a Routed Wireless Access Point
###### 1.Install AP and Management Software
sudo apt install hostapd
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo apt install dnsmasq
sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent iptables-persistent
$sudo apt install hostapd
$sudo systemctl unmask hostapd
$sudo systemctl enable hostapd
$sudo apt install dnsmasq
$sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent iptables-persistent
###### 2.Set up the Network Router
sudo nano /etc/dhcpcd.conf
$sudo nano /etc/dhcpcd.conf
```
interface wlan0
static ip_address=192.168.2.1/24
nohook wpa_supplicant
```
sudo nano /etc/sysctl.d/routed-ap.conf
$sudo nano /etc/sysctl.d/routed-ap.conf
```
# Enable IPv4 routing
net.ipv4.ip_forward=1
```
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo netfilter-persistent save
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
$sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$sudo netfilter-persistent save
$sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo nano /etc/dnsmasq.conf
$sudo nano /etc/dnsmasq.conf
```
interface=wlan0 # Listening interface
@@ -289,10 +286,10 @@ address=/gw.wlan/192.168.2.1
# Alias for this router
```
###### 3.Ensure Wireless Operation
sudo rfkill unblock wlan
$sudo rfkill unblock wlan
###### 4.Configure the AP Software
sudo nano /etc/hostapd/hostapd.conf
$sudo nano /etc/hostapd/hostapd.conf
```
country_code=TW
@@ -317,13 +314,11 @@ wme_enabled=1
ht_capab=[HT40+][SHORT-GI-40]
```
###### 5.Running the new Wireless AP
sudo systemctl reboot
$sudo systemctl reboot
### Install Apache2
sudo apt install apache2
### Deploy web site
sudo vim /etc/apache2/sites-available/000-default.conf
### Set web site
$sudo vim ./sites-available/000-default.conf
```
<VirtualHost *:8080> #80------>8080
# The ServerName directive sets the request scheme, hostname and port that
@@ -363,27 +358,3 @@ sudo vim /etc/apache2/sites-available/000-default.conf
##### raspberry website document:
> https://www.raspberrypi.org/documentation/configuration/wireless/access-point-routed.md
# ChangeLog
[2022.12.28]
change meta_project_info to project_metas
change project_report to project_reports
alter table project_meta column cycle type string to jsonb
[2022.11.16]
add python package SQLAlchemy
add new column project(int4) in postgresSQL table recording_meta_datas
add new postgresSQL table project_report
add new postgresSQL table meta_project_info
[2022.10.18]
socektTimeout from 1s -> 5s
socketListen from 3 -> 20
[2022.09.30]
add new column cycle(jsonb) in postgresSQL table projects
[2022.9.28]
add python package numpy
+3 -17
View File
@@ -87,8 +87,7 @@ class DataAPI(metaclass=abc.ABCMeta):
def update_device_configuration(self,
device: Union[int, Device],
meta_file: Union[str, Path, RecordingMetaFile],
data_format: Union[AnyStr, DataDecodeFormat],
project_info: str):
data_format: Union[AnyStr, DataDecodeFormat]):
"""set device configuration.
:param device: device ID
@@ -122,14 +121,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. """
@@ -163,8 +154,7 @@ class DataClient(SocketClient, DataAPI, metaclass=SocketClientMacro(DataAPI)):
def update_device_configuration(self,
device: Union[int, Device],
meta_file: Union[str, Path, RecordingMetaFile],
data_format: Union[AnyStr, DataDecodeFormat],
project_info: str):
data_format: Union[AnyStr, DataDecodeFormat]):
# meta file
if isinstance(meta_file, str):
@@ -196,7 +186,7 @@ class DataClient(SocketClient, DataAPI, metaclass=SocketClientMacro(DataAPI)):
raise TypeError('not a data decode format : ' + data_format.__class__.__name__)
# send
self.send_command('update_device_configuration', device, meta_file, data_format, project_info)
self.send_command('update_device_configuration', device, meta_file, data_format)
def is_sync(self, device: Union[None, int, Device] = None) -> bool:
if isinstance(device, Device):
@@ -210,10 +200,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)
-10
View File
@@ -1,10 +0,0 @@
from sqlalchemy import create_engine
# from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, declarative_base
SQLALCHEMY_DATABASE_URL = "postgresql://biopro:BioProControlBox@127.0.0.1:5432/postgres"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
Session = sessionmaker(bind=engine)
Base = declarative_base()
-60
View File
@@ -1,60 +0,0 @@
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 Collection(Base):
__tablename__ = "collections"
id = Column(Integer, primary_key=True)
name = Column(String(255))
parent = Column(JSONB)
controller_id = Column(Integer)
type = Column(String(255))
description = 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_collection(cls, collection_name, parent):
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
@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
-51
View File
@@ -1,51 +0,0 @@
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, Float, BINARY, LargeBinary
from sqlalchemy.dialects.postgresql import JSONB
from .base import Base, Session
class Device(Base):
__tablename__ = "devices"
id = Column(Integer, primary_key=True)
name = Column(String(255))
mac_address = Column(String(255))
serial_number = Column(String(255))
configuration = Column(JSONB)
library = Column(String(255))
library_version = Column(String(255))
device_version = Column(String(255))
type = Column(String(255))
battery = Column(Integer)
temperature = Column(Float)
auto_connect = Column(Boolean)
connect_priority = Column(Integer)
connect_time = Column(BigInteger)
parameter_set = Column(JSONB)
running = Column(Boolean)
calibration = Column(LargeBinary)
calibration_version = Column(Integer, default=-1)
user_auth = Column(JSONB)
deleted = Column(Boolean)
created_at = Column(TIMESTAMP(timezone=True), server_default=func.now())
updated_at = Column(TIMESTAMP(timezone=True), onupdate=func.now())
@classmethod
def update_device(cls, device, options):
with Session() as session:
result = session.query(Device).filter(Device.mac_address == device['mac_address']).first()
for key, value in options.items():
setattr(result, key, value)
session.commit()
@classmethod
def get_device(cls, device):
with Session() as session:
result = session.query(Device).filter(Device.mac_address == device['mac_address']).first()
return result
# def __repr__(self):
# return f"User(id={self.id!r}, name={self.name!r}, fullname={self.task!r})"
-24
View File
@@ -1,24 +0,0 @@
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
class Project(Base):
__tablename__ = "project"
id = Column(Integer, primary_key=True)
name = Column(String)
desc = Column(String)
task = Column(JSONB)
cycle = Column(JSONB)
device = Column(JSONB)
uuid = Column(String(36))
user_auth = Column(JSONB)
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})"
-29
View File
@@ -1,29 +0,0 @@
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 MetaProjectInfo(Base):
__tablename__ = "project_metas"
id = Column(Integer, primary_key=True)
project = Column(String(36))
cycle = Column(JSONB)
task = Column(JSONB)
serial_number = 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())
@classmethod
def create_project_meta(cls, project):
with Session() as session:
project_meta = MetaProjectInfo(project = project['project'], cycle= project['cycle'], task=project['task'], serial_number=int(project['serial_number']))
session.add(project_meta)
session.commit()
return project_meta.id
# def __repr__(self):
# return f"User(id={self.id!r}, name={self.name!r}, fullname={self.task!r})"
-24
View File
@@ -1,24 +0,0 @@
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
class ProjectReport(Base):
__tablename__ = "project_reports"
id = Column(Integer, primary_key=True)
name = Column(String)
desc = Column(String)
task = Column(JSONB)
cycle = Column(JSONB)
device = Column(JSONB)
uuid = Column(String(36))
user_auth = Column(JSONB)
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})"
+468 -373
View File
@@ -350,7 +350,6 @@ class CC2650Device(Device):
self._recording_file_name: str = 'recording_data'
self._coeff: bytes = b''
self._device_version = ""
self._cali_version = -1
@property
def device_id(self) -> int:
@@ -429,20 +428,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),
(ins_oper & 0xF0) | (length & 0x0F),
*instruction)
return struct.pack('%dB' % (length + 2),
(ins_type & 0xF0) | (self.device_id & 0x0F),
(ins_oper & 0xF0) | (length & 0x0F),
*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)
def _decode_data(self, ins_oper: int, data: bytes) -> bytes:
"""CIS data decoder.
@@ -481,24 +477,22 @@ class CC2650Device(Device):
else:
if data is not None and len(data) > 0:
year = struct.unpack('<B', data[2:3])[0]
month = struct.unpack('<B', data[3:4])[0]
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
year = struct.unpack('<B', data[0:1])[0]
month = struct.unpack('<B', data[1:2])[0]
day = struct.unpack('<B', data[2:3])[0]
hour = struct.unpack('<B', data[3:4])[0]
minute = struct.unpack('<B', data[4:5])[0]
mac1 = struct.unpack('<B', data[5:6])[0]
mac2 = struct.unpack('<B', data[6:7])[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
@@ -543,7 +537,7 @@ class CC2650Device(Device):
else:
if data is not None and len(data) > 2 :
battery = struct.unpack('<H', data[2:4])[0]
battery = struct.unpack('<H', data[1:3])[0]
if battery is not None:
self._battery = battery
@@ -555,39 +549,6 @@ class CC2650Device(Device):
self.update_calibration_info(device_type)
return self._coeff
def _check_crc(self, data):
data_chk_sum = data[-1]
# print('data:', list(data), 'data_chk_sum:', data_chk_sum)
# print('data[0:-1]:', list(data[0:-1]), 'check_sum:', sum(data[0:-1]) & 0b11111111)
if data_chk_sum == sum(data[0:-1]) & 0b11111111:
return True
return False
def update_cali_version(self) -> bool:
for _ in range(5):
try:
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, 0)
self._master.write_characteristic(self.device_id, CC2650MasterDevice.COMMAND_HANDLE, code)
except SendInstructionTimeoutError:
self._master.log_warn('device', self.device_id, 'update cali version error')
return False
except RuntimeError:
self._master.log_warn('device', self.device_id, 'update cali version error')
return False
else:
version = self._master.read_characteristic(self.device_id,CC2650MasterDevice.RETURN_HANDLE)
if self._check_crc(version):
self._cali_version = struct.unpack('<H', version[2:4])[0]
print('self._cali_version=', self._cali_version)
return True
self._master.log_warn('device', self.device_id, 'update cali version error')
return False
def update_calibration_info(self, device_type: str):
""" get device calibration info """
@@ -595,36 +556,147 @@ class CC2650Device(Device):
# self.ensure_feature_support(DeviceFeature.CALIBRATION)
coeff = []
if device_type == 'EISZeroOne':
i = 1
while i <= 24:
for _ in range(5):
try:
# send
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, i)
self._master.write_characteristic(self.device_id, CC2650MasterDevice.COMMAND_HANDLE, code)
except SerialTimeoutException:
self._master.log_warn('device', self.device_id, 'send update_calibration_info instruction fail')
continue
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
# neulive 2.1 (only support ch1~ch8)
# try:
# # send
# code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, 0)
# 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:
# self._master.log_warn('device', self.device_id, 'update_calibration_info no response')
# except RuntimeError:
# self._master.log_warn('device', self.device_id, 'update_calibration_info no response')
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:
try:
# receive
data = self._master.read_characteristic(self.device_id,
CC2650MasterDevice.RETURN_HANDLE)
except RecvTimeout:
self._master.log_warn('device', self.device_id, 'update_calibration_info no response')
else:
if self._check_crc(data) and data is not None:
coeff.append(self._decode_data(DeviceInstruction.CIS_CALI, data))
i += 1
else:
self._master.log_warn('device', self.device_id, 'update_calibration_info crc wrong')
continue
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 = 0
request_times = 0
while i < 7:
try:
# send
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, i)
self._master.write_characteristic(self.device_id, CC2650MasterDevice.COMMAND_HANDLE, code)
sleep(0.1)
# 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')
raise BaseException
except RuntimeError as e:
print(e)
self._master.log_warn('device', self.device_id, 'update_calibration_info no response - 2')
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
else:
# default: neulive 2.1
for i in range(1):
@@ -1878,6 +1950,120 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
"""initialize cc2650 (master)"""
pass
def scan_send_ins(self):
# send scan command
try:
print(':: scan_send_ins ::', self.CC2650_COMMAND_LEN, 3, 0, 0)
self._cc2650.send(self.CC2650_COMMAND_LEN, 3, 0, 0)
except SerialTimeoutException as e:
raise RecvTimeout('send scan fail') from e
else:
# wait scanning
# sleep(2)
clean_buf = self._cc2650.receive_timeout("20B", timeout=3)
print("clean_buf = ", clean_buf)
# def cc2650_uart_irq(self):
# uart_irq = self.get_uart_irq_pin()
# uart_irq.output(False)
# sleep(0.001)
# uart_irq.output(True)
@synchronized
def scan_callback(self, callback: Callable[[DeviceResponseInfo], None], timeout=5, all_device=False) -> bool:
self._found = found = []
self._found_with_id = []
hdr_BPHS = [66, 80, 72, 83]
scan_response: Union[Optional[tuple], Any] = None
# build scan instruction
scan_ins = bytearray()
scan_ins.append(3) #scan instruction
scan_ins.append(1) #length
scan_ins.append(0xF1)
# print('send_scan', bytes(scan_ins))
self._cc2650.send("bytes", bytes(scan_ins))
try:
scan_response = self._cc2650.recv_uart(timeout)
except RecvTimeout:
# self.reset_internal()
# self.reset_hardware()
# self._interface.flush()
return False
# instruction format:
# ins[0]: get_scan_response = 0x04
# ins[1]: number of scanned device=0; a certain device = device_id (could be 1~8)
# ins[2]: addr=MAC=1, localName=2, company_code=3, version_info=4, battery_info=5, all_info=6;
# attr_length=0, e.g. len(addr)=6, len(company_code)=4
local_mac = None
local_cc = None
local_ver = None
local_bat = None
local_name = None
local_addr_type = None
# get device attribute length
attr_length = [6, 4, 6, 5, 20]
index = 0
local_mac = get_device_mac_in_address_format(scan_response[index:index + 6])
index = index + 6
# print("local_mac = ", hex(local_mac[0]), hex(local_mac[1]),
# hex(local_mac[2]), hex(local_mac[3]),
# hex(local_mac[4]), hex(local_mac[5]))
local_cc = get_device_company_code(scan_response[index:index + 4])
index = index + 4
# print("local_cc = ", local_cc)
local_ver = scan_response[index:index + 6]
index = index + 6
# print("local_ver = ", local_ver)
local_bat = get_device_battery_info(scan_response[index:index + 5])
index = index + 5
# print("local_bat = ", local_bat)
local_name = get_device_name_in_string_format(list(scan_response[index:index + 20]))
index = index + 20
# print("local_name = ", local_name)
# addr type is don't care in BMD380
print('scan_response:', list(scan_response))
local_addr_type = int(scan_response[index:index + 1][0])
# local_addr_type = 0xFF
index = index + 1
# print("local_addr_type = ", local_addr_type)
response = is_headstage_device_central_version(local_mac,
local_addr_type,
local_name,
local_cc,
local_ver,
local_bat)
if response is not None:
self.log_info('found', address_str(response.mac_address), response.serial_number)
self._interface.flush_input()
# apppend into db
devicesList = DeviceAPI.getByMac(address_str(response.mac_address))
if devicesList is not None:
if len(devicesList) == 0:
DeviceAPI.create(response.device_name, local_ver, address_str(response.mac_address))
found.append(response)
# print('scan_done_found', found)
self._found_with_id.append((response, 0 + 1))
callback(response)
return True
def decode_uart_preamble(self, raw_uart: tuple, expect_ret_len: int = 0) -> Optional[list]:
# print("decode_uart_preamble: raw_uart = ", raw_uart)
if raw_uart is None:
@@ -1904,154 +2090,34 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
return self._found
def check_mem_survive(self) -> Optional[CC2650Device]:
chk_mem_response = None
ack = []
ins = bytearray()
ins.append(0x0A)
ins.append(0x01) #length
ins.append(10)
ins.append(1) #length
ins.append(0xF1)
self._interface.flush_input()
# print('ins', list(ins))
try:
self.log_verbose('[CC2650]', 'check_mem_survive att_write','0x'+str.upper(ins.hex()))
self._cc2650.send("bytes", bytes(ins))
except SerialTimeoutException:
self.log_verbose('[CC2650]', 'check_mem_survive send fail')
except SerialTimeoutException as e:
raise RecvTimeout('device CC2650 check_mem_survive timeout') from e
else:
try:
chk_mem_response = self._cc2650.recv_uart(0.001)
ack = self._cc2650.recv_uart(0.001)
except RecvTimeout:
self.log_verbose('[CC2650]', 'check_mem_survive response timeout, no memory board')
self.log_info("no memory board")
if chk_mem_response is None:
return False
# else:
# print('ack=', ack)
pack_len = chk_mem_response[0]
mem_ack = chk_mem_response[1:pack_len+1]
if mem_ack == [3]:
chk_mem_response_hex = ''.join(format(i, '02X') for i in chk_mem_response)
self.log_verbose('[CC2650]', 'check_mem_survive success', '0x'+chk_mem_response_hex)
if ack == [3]:
return True
return False
@synchronized
def scan_callback(self, callback: Callable[[DeviceResponseInfo], None], timeout=5, all_device=False) -> bool:
self._found = found = []
self._found_with_id = []
scan_response = None
ins = bytearray()
ins.append(0x03)
ins.append(0x01) #length
ins.append(0xF1)
self._interface.flush_input()
for _ in range(5):
try:
self.log_verbose('[CC2650]', 'scan_callback att_write','0x'+str.upper(ins.hex()))
self._cc2650.send("bytes", bytes(ins))
except SerialTimeoutException:
self.log_verbose('[CC2650]', 'scan_callback send fail, rescan')
continue
else:
try:
scan_response = self._cc2650.recv_uart(0.01)
except RecvTimeout:
self.log_verbose('[CC2650]', 'scan_callback response timeout, no device, rescan')
continue
else:
if scan_response is None:
self.log_verbose('[CC2650]', 'scan_callback response is None, rescan')
continue
else:
break
if scan_response is None:
self.log_verbose('[CC2650]', 'scan_callback response is None--2')
return False
scan_response_hex = ''.join(format(i, '02X') for i in scan_response)
self.log_verbose('[CC2650]', 'scan_callback success', '0x'+scan_response_hex)
if len(scan_response) <= 2:
print('******************************************************************')
print('******************************************************************')
print('******************************************************************')
print('******************************************************************')
print('****need to fix, len(scan) <= 2')
print()
return False
pack_len = scan_response[0]
device_info_pkg = scan_response[1:pack_len+1]
# instruction format:
# ins[0]: get_scan_response = 0x04
# ins[1]: number of scanned device=0; a certain device = device_id (could be 1~8)
# ins[2]: addr=MAC=1, localName=2, company_code=3, version_info=4, battery_info=5, all_info=6;
# attr_length=0, e.g. len(addr)=6, len(company_code)=4
local_mac = None
local_cc = None
local_ver = None
local_bat = None
local_name = None
local_addr_type = None
# get device attribute length
attr_length = [6, 4, 6, 5, 20]
index = 0
local_mac = get_device_mac_in_address_format(device_info_pkg[index:index + 6])
index = index + 6
local_cc = get_device_company_code(device_info_pkg[index:index + 4])
index = index + 4
local_ver = device_info_pkg[index:index + 6]
index = index + 6
local_bat = get_device_battery_info(device_info_pkg[index:index + 5])
index = index + 5
local_name = get_device_name_in_string_format(list(device_info_pkg[index:index + 20]))
index = index + 20
local_addr_type = int(device_info_pkg[index:index + 1][0])
index = index + 1
response = is_headstage_device_central_version(local_mac,
local_addr_type,
local_name,
local_cc,
local_ver,
local_bat)
if response is not None:
self.log_info('found', address_str(response.mac_address), response.serial_number)
self._interface.flush_input()
# apppend into db
devicesList = DeviceAPI.getByMac(address_str(response.mac_address))
if devicesList is not None:
if len(devicesList) == 0:
DeviceAPI.create(response.device_name, local_ver, address_str(response.mac_address))
found.append(response)
# print('scan_done_found', found)
self._found_with_id.append((response, 0 + 1))
callback(response)
return True
@synchronized
def connect(self, response: DeviceResponseInfo, direct_connect: bool = False) -> Optional[CC2650Device]:
if self._handle is not None:
@@ -2061,202 +2127,225 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
addr_type = response.addr_type
address_s = cc2650.address_str(address)
self.log_info(DEVICE_CONNECTING, address_s)
connect_ins = bytearray()
connect_ins.append(5)
connect_ins.append(8) #length
connect_ins.append(addr_type)
connect_ins.append(address[0])
connect_ins.append(address[1])
connect_ins.append(address[2])
connect_ins.append(address[3])
connect_ins.append(address[4])
connect_ins.append(address[5])
connect_ins.append(0xF1)
connected = False
connect_response = None
ins = bytearray()
ins.append(0x05)
ins.append(0x08) #length
ins.append(addr_type)
ins.append(address[0])
ins.append(address[1])
ins.append(address[2])
ins.append(address[3])
ins.append(address[4])
ins.append(address[5])
ins.append(0xF1)
self._interface.flush_input()
# send connect command
if direct_connect is True:
for retry in range(5):
# send device mac and addrType
try:
self.log_verbose('[CC2650]', 'connect att_write', '0x'+str.upper(ins.hex()))
self._cc2650.send("bytes", bytes(ins))
self._cc2650.send("bytes", bytes(connect_ins))
except RecvTimeout:
self.log_verbose('[CC2650]', 'connect send fail')
continue
except SerialTimeoutException as e:
raise RecvTimeout('device CC2650 connect fail') from e
return None
else:
# connection establish done?
for retry_recv_ack in range(10):
try:
connect_response = self._cc2650.recv_uart(2)
con_done = self._cc2650.recv_uart(timeout = 0.5)
# print("con_done = ", con_done)
except RecvTimeout:
# self.log_verbose('[CC2650]', 'connect response timeout')
if retry < 5:
self.log_verbose('[CC2650]', 'connect retry')
continue
else:
self.log_info("recv connection timeout, retry... ")
continue
# is the ack valid?
if con_done is None:
continue
elif con_done[0] is 46 and \
con_done[1] is 80 and \
con_done[2] is 48 and \
con_done[3] is 4:
connected = True
break
else:
for dev in self._found:
if dev.mac_address == address:
if connect_response is None:
self.log_verbose('[CC2650]', 'connect response timeout')
return False
# send device mac and addrType
try:
# print('send_connect',bytes(connect_ins))
self._cc2650.send("bytes", bytes(connect_ins))
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)
except SerialTimeoutException as e:
raise RecvTimeout('device CC2650 connect fail') from e
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)
else:
sleep(2)
if connected == True:
# CC2650Device(device_id, master, scan_response) is a slave device
# device_id is don't care, because it will be overwrite later
dont_care = 0
self._device = ret = CC2650Device(device_id=dont_care, master=self, response_info=response)
self.log_verbose('[CC2650]', DEVICE_CONNECTED, address_s)
return ret
# connection establish done?
for retry_recv_ack in range(5):
self._cc2650.send("bytes", bytes((0, 0, 0, 0)))
connect_response_hex = ''.join(format(i, '02X') for i in connect_response)
self.log_verbose('[CC2650]', 'connect fail', '0x'+connect_response_hex)
return False
try:
con_done = self._cc2650.recv_uart(timeout = 0.1)
except RecvTimeout:
self.log_info("recv connection timeout, retry... ")
continue
# is the ack valid?
if con_done is None:
continue
elif con_done[0] is 46 and \
con_done[1] is 80 and \
con_done[2] is 48 and \
con_done[3] is 4:
connected = True
# print('con_done=', con_done)
break
else:
continue
# if select device is invalid or connect failed
self._interface.flush_input()
if connected is False:
if direct_connect is True:
self.reset_internal()
self.reset_hardware()
self._interface.flush()
return None
# CC2650Device(device_id, master, scan_response) is a slave device
# device_id is don't care, because it will be overwrite later
dont_care = 0
self._device = ret = CC2650Device(device_id=dont_care, master=self, response_info=response)
self.log_info(DEVICE_CONNECTED, address_s)
sleep(0.5)
print('ret',ret)
return ret
@synchronized
def disconnect(self, device: int, force=False) -> bool:
self.log_info(DEVICE_DISCONNECTING, device)
ins = bytearray()
ins.append(0x08)
ins.append(0x01) #length
ins.append(8)
ins.append(1) #length
ins.append(0xF1)
self._interface.flush_input()
for retry in range(5):
try:
self.log_verbose('[CC2650]', 'disconnect att_write','0x'+str.upper(ins.hex()))
self._cc2650.send("bytes", bytes(ins))
except SerialTimeoutException:
self.log_verbose('[CC2650]', 'disconnect send fail')
continue
else:
self.reset_internal()
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
@synchronized
def write_characteristic(self, device: int, handle: int, data: bytes) -> bool:
write_response = None
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(handle)
ins.extend(data)
ins.append(0xF1)
self._interface.flush_input()
try:
self.log_verbose('[CC2650]', 'write_characteristic', device, str(hex(handle).upper()))
self.log_verbose('[CC2650]', 'write_characteristic att_write','0x'+str.upper(ins.hex()))
# print('send_disconnect',bytes(ins))
self._cc2650.send("bytes", bytes(ins))
except SerialTimeoutException:
self.log_verbose('[CC2650]', 'write_characteristic send fail')
except RecvTimeout:
self.log_warn('disconnect time out')
return False
except RuntimeError as e:
self.log_warn('suppressed error', str(e))
return False
else:
try:
write_response = self._cc2650.recv_uart(0.5)
except RecvTimeout:
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]
write_ack = write_response[1:pack_len+1]
if write_ack == [3]:
write_response_hex = ''.join(format(i, '02X') for i in write_response)
self.log_verbose('[CC2650]', 'write_characteristic success', '0x'+write_response_hex)
sleep(0.01)
return True
self.log_verbose('[CC2650]', 'write_characteristic fail')
return False
finally:
self.log_info(DEVICE_DISCONNECTED, device)
# reset single 2650 after disconnected
self.reset_internal()
self.reset_hardware()
self._interface.flush()
@synchronized
def read_characteristic(self, device: int, handle: int) -> Optional[bytes]:
read_response = None
ins = bytearray()
ins.append(0x07)
ins.append(0x02) #length
# print("read_characteristic, expect_data_length = ", expect_data_length)
ret = None
ins = bytearray()
ins.append(7)
ins.append(2) #length
ins.append(handle)
ins.append(0xF1)
self._interface.flush_input()
for _ in range(2):
try:
# print('send_read',bytes(ins))
self._cc2650.send("bytes", bytes(ins))
except SerialTimeoutException:
raise RecvTimeout('device CC2650 send read_characteristic fail')
try:
ret = self._cc2650.recv_uart(timeout = 2)
except Exception as e2:
raise RecvTimeout()
else:
# print("======== read ret = ", ret)
self._interface.flush_input()
# try:
# ret = self._cc2650.recv_uart(timeout = 1)
# except Exception as e2:
# raise RecvTimeout()
# else:
# # print("read_characteristic ret = ", ret)
# pass
if ret is None:
return None
return bytes(ret)
@synchronized
def write_characteristic(self, device: int, handle: int, data: bytes):
# print("device", device)
# print("handle", handle)
# print("data", data.hex())
# self.log_info('reset')
self.log_verbose('write_characteristic', device, handle)
self.log_verbose('[CC2650]', 'att_write', str.upper(data.hex()))
ack = None
ret = None
data_array = bytearray()
data_array.append(6)
data_array.append(len(data)+2) #length
data_array.append(handle)
data_array.extend(data)
data_array.append(0xF1)
try:
self.log_verbose('[CC2650]', 'read_characteristic', device, str(hex(handle).upper()))
self.log_verbose('[CC2650]', 'read_characteristic att_write','0x'+str.upper(ins.hex()))
self._cc2650.send("bytes", bytes(ins))
self._cc2650.send("bytes", bytes(data_array))
# print('send_write',bytes(data_array))
except SerialTimeoutException:
self.log_verbose('[CC2650]', 'read_characteristic send fail')
except SerialTimeoutException as e:
raise RecvTimeout('device CC2650 send instruction fail') from e
# read error code
try:
ret = self._cc2650.recv_uart()
# print("_______ write ack = ", ret)
except Exception as e2:
pass
else:
try:
read_response = self._cc2650.recv_uart(1)
pass
except RecvTimeout:
self.log_verbose('[CC2650]', 'read_characteristic response timeout')
if read_response is None:
return None
read_response_hex = ''.join(format(i, '02X') for i in read_response)
self.log_verbose('[CC2650]', 'read_characteristic success', '0x'+read_response_hex)
return bytes(read_response)
self._interface.flush_input()
self._interface.flush_output()
def set_notify(self, device: Union[int, Device], enable: bool):
if isinstance(device, CompletedDevice):
@@ -2357,6 +2446,7 @@ class CC2650MultiMasterCentralDevice(CC2650MasterDevice, Synchronized):
self._cc2650_log_level = self.log_level
def read_characteristic(self, device: int, handle: int) -> Optional[bytes]:
self.log_verbose('read_characteristic', device, '0x%02X' % handle)
master = self._cc2650[device]
@@ -2414,6 +2504,11 @@ class CC2650MultiMasterCentralDevice(CC2650MasterDevice, Synchronized):
self._interface.flush()
self._selector.select(device_id)
# self._mem_selector.select(device_id)
# print("multiMaster selector = ", device_id)
# print("\n")
# device._notify_flag = enable
try:
master.write_characteristic(device_id, self.NOTIFY_HANDLE, value)
except SendInstructionTimeoutError:
+12 -39
View File
@@ -574,23 +574,20 @@ class DeviceManager(MasterDevice, Synchronized):
:param device: device ID or response info
:return: CompletedDevice, None if not found.
"""
try:
if isinstance(device, int):
for slave in self._device:
if slave.device_id == device:
return slave
if isinstance(device, int):
for slave in self._device:
if slave.device_id == device:
return slave
elif isinstance(device, str):
for slave in self._device:
if ':'.join('{:02x}'.format(b) for b in slave.mac_address) == device.lower():
return slave
elif isinstance(device, str):
for slave in self._device:
if ':'.join('{:02x}'.format(b) for b in slave.mac_address) == device.lower():
return slave
elif isinstance(device, DeviceInfo):
for slave in self._device:
if device.match(slave):
return slave
except BaseException as e:
self.log_error('device not found', str(device))
elif isinstance(device, DeviceInfo):
for slave in self._device:
if device.match(slave):
return slave
return None
@@ -832,15 +829,6 @@ class DeviceManager(MasterDevice, Synchronized):
elif func == InternalInstruction.PREDEFINED_DISABLE_CACHE:
self._device_disable_cache(device, *para)
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:
@@ -860,21 +848,6 @@ class DeviceManager(MasterDevice, Synchronized):
InternalInstruction.PREDEFINED_DATA_FORMAT,
f)
def _idle(self, device: Device, expr: AnyStr):
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:
cali = device.calibration_info(expr)
+1100 -608
View File
File diff suppressed because it is too large Load Diff
+3 -7
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,9 +736,9 @@ 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)'
return '_sync(False)', '_notify(False)', 'VIS_INT'
elif instruction == cls.CLOSE:
return '_sync(False)', '_notify(False)', 'VIS_INT'
elif instruction == cls.CALL:
+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 -32
View File
@@ -1,5 +1,4 @@
import re
import struct
from random import randint
from time import sleep
from typing import Sequence, Tuple
@@ -284,9 +283,6 @@ class InternalInstruction(SingleInstruction):
PREDEFINED_SET = '_set'
PREDEFINED_CDR = '_cdr'
PREDEFINED_DISABLE_CACHE = '_disable_cache'
PREDEFINED_IDLE = '_idle'
PREDEFINED_COUNTDOWN = '_countdown'
PREDEFINED_TAG = '_tag'
PREDEFINED = (
PREDEFINED_SLEEP,
@@ -298,9 +294,6 @@ class InternalInstruction(SingleInstruction):
PREDEFINED_SET,
PREDEFINED_CDR,
PREDEFINED_DISABLE_CACHE,
PREDEFINED_IDLE,
PREDEFINED_COUNTDOWN,
PREDEFINED_TAG
)
__slots__ = ('_expr', '_para')
@@ -380,7 +373,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 +586,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 +680,7 @@ class InstructionContent(JsonSerialize):
return ins_type(width, expr, **ins_argv, comment=comment)
# tag1
class InstructionDataContent(InstructionContent):
"""
**json format**
@@ -748,7 +741,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 +748,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 +792,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 +1109,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
+17 -24
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)
@@ -970,7 +968,7 @@ class CompletedDevice(Device):
"""
__slots__ = ('_master', '_device_id', '_device', '_library', '_context',
'_parameter', '_configuration', '_lock', '_feature_mask',
'_cache_battery', '_cache_battery_timestamp', '_coeff', '_status', '_occupied_by_project')
'_cache_battery', '_cache_battery_timestamp', '_coeff', '_status')
def __init__(self, master: MasterDevice, library: DeviceLibrary, device_id: int, device: Device):
"""
@@ -988,8 +986,6 @@ class CompletedDevice(Device):
# device status ( 0: idle, 1: working, 2: error, 3: power off)
self._status = 0
# device be occupied by project
self._occupied_by_project = None
# context
s1 = library.constant
@@ -1086,14 +1082,6 @@ class CompletedDevice(Device):
def status(self, new_status):
self._status = new_status
@property
def occupied_by_project(self) -> str:
return self._occupied_by_project
@occupied_by_project.setter
def occupied_by_project(self, new_occupied_by_project):
self._occupied_by_project = new_occupied_by_project
# device parameter getter/setter
def parameters(self) -> List[str]:
@@ -1130,28 +1118,20 @@ 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)
# raise RuntimeError('illegal parameter value : ' + value) from e
else:
if name == 'MODE':
if self.library_name.startswith('Elite_EDC') or 'EIS' in self.library_name:
if self.library_name.startswith('Elite_EDC'):
self.set_parameter('CTRL_HIGH_Z_15', self.get_parameter('HIGHZ_TABLE')[value])
self.set_parameter('TIME_DURATION', 0)
@@ -1323,7 +1303,6 @@ class CompletedDevice(Device):
'recording_file_name': self.recording_file_name,
'library_name': self._library.name,
'library_version': str(self._library.version),
'occupied_by_project': self._occupied_by_project,
'configuration': self.configuration.as_json(list_hide=True),
}
@@ -1413,6 +1392,20 @@ class DebugDevice(CompletedDevice):
def read_command_return_data(self) -> Optional[bytes]:
return None
def send_command(self, ins_type: int, ins_oper: int, *instruction: int):
length = len(instruction)
print('instruction send :',
'%02X' % ((ins_type & 0xF0) | (self.device_id & 0x0F)),
'%02X' % ((ins_oper & 0xF0) | (length & 0x0F)),
' '.join(map(lambda v: '%02X' % v, instruction)))
def send_instruction(self, ins_type: int, ins_oper: int, *instruction: int):
length = len(instruction)
print('instruction send :',
'%02X' % ((ins_type & 0xF0) | (self.device_id & 0x0F)),
'%02X' % ((ins_oper & 0xF0) | (length & 0x0F)),
' '.join(map(lambda v: '%02X' % v, instruction)))
@property
def battery(self) -> int:
return 100
-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)
+10 -14
View File
@@ -3697,6 +3697,7 @@ class CC2650Central(LoggerFlag):
def recv(self, timeout: Optional[float] = None) -> Optional[list]:
packet = self._recv_byte()
# print("packet = ", packet)
if packet is None:
return None
@@ -3708,8 +3709,6 @@ class CC2650Central(LoggerFlag):
def _recv_byte(self) -> Optional[int]:
ret = self._recv_bytes(1)
# if ret is not None:
# print('packet = {0}'.format(hex(ret[0]).upper()))
return ret[0] if ret is not None else None
def _recv_bytes(self, size: int = 1) -> Union[None, bytes]:
@@ -3725,28 +3724,27 @@ class CC2650Central(LoggerFlag):
return None
def _recv_event(self, timeout: Optional[float] = 1) -> Optional[list]:
packet = self._recv_byte()
code = self._recv_byte()
# print("code = ", code)
if packet is None:
if code is None:
return None
length = self._recv_byte()
len_b = _struct.pack("B", length)
data = b''
# print('code::',code,'length::',length)
_start = _time()
data = b''
while len(data) < length:
packets = self._recv_bytes(length - len(data))
# hex_packets = ''.join(format(i, '02x') for i in packets)
# print("packets = ", hex_packets.upper())
ret = self._recv_bytes(length - len(data))
# print("ret = ", ret)
if packets is not None:
data += packets
if ret is not None:
data += ret
elif timeout is not None and _time() - _start > timeout:
raise RecvTimeout()
data = len_b + data
self._interface.flush()
return list(data)
@@ -3762,7 +3760,5 @@ class CC2650Central(LoggerFlag):
raise RecvTimeout()
else:
uart_data_hex = ''.join(format(i, '02X') for i in uart_data)
# print('uart_data: 0x{0}'.format(uart_data_hex.upper()))
return uart_data
+138 -47
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
@@ -35,7 +35,7 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
'_pin_ram_sel_value', '_pin_mem_sel_value', '_pin_mem_req_value',
'_read_green_times','_read_red_times',
'_elite_data_len', '_mem_header_len', '_mem_tailer_len', '_single_data_len',
'_head_wrong_cnt', '_pin_busy_value')
'_head_wrong_cnt')
def __init__(self,
select: Selector,
@@ -44,17 +44,17 @@ 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
# buffer
self._tx_buffer_header = [0] * 64
self._tx_buffer_header = [0] * 19
self._tx_buffer_data = [0] * (self._single_data_len * 10 + 3)
# memory control pin
self.pin_busy: Optional[InputPin] = InputPin.get_used(P3Pin.MEM_BZY)
self.pin_busy = OutputPin.get_used(P3Pin.MEM_BZY, True)
self.pin_mem_req = OutputPin.get_used(P3Pin.MEM_REQ, False)
self.pin_mem_sel = OutputPin.get_used(P3Pin.MEM_RST, True) # MEM_RST -> actually which memory board is assign
self.pin_ram_sel: Optional[InputPin] = InputPin.get_used(P3Pin.MEM_SEL) # MEM_SEL -> actually is RAM_SEL, which RAM is assign
@@ -62,7 +62,6 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
self._pin_ram_sel_value = [bool(self.pin_ram_sel) for _ in range(Selector.SIZE)]
self._pin_mem_sel_value = [bool(self.pin_mem_sel) for _ in range(Selector.SIZE)]
self._pin_mem_req_value = [bool(self.pin_mem_req) for _ in range(Selector.SIZE)]
self._pin_busy_value = [bool(self.pin_busy) for _ in range(Selector.SIZE)]
self._read_green_times = 0
self._read_red_times = 0
@@ -99,14 +98,6 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
self._pin_ram_sel_value[channel] = True
return self._pin_ram_sel_value[channel]
def get_pin_busy(self):
channel = self.select
if self.pin_busy.input() == 0:
self._pin_busy_value[channel] = False
else:
self._pin_busy_value[channel] = True
return self._pin_busy_value[channel]
@property
def select(self) -> int:
return self._selector.channel
@@ -201,7 +192,32 @@ 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)
rx = []
try:
@@ -214,11 +230,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 +288,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:
@@ -245,6 +307,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 +324,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 +357,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 +415,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 +443,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 +479,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 +508,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
-2
View File
@@ -53,8 +53,6 @@ class UARTInterface(LowLevelHardwareInterface):
:param data: raw byte instruction
:raises SerialTimeoutException:
"""
data_hex = ''.join(format(i, '02X') for i in data)
# print('send_byte: 0x{0}'.format(data_hex.upper()))
self._serial.write(data)
def recv_byte(self, size: int) -> Optional[bytes]:
+7 -77
View File
@@ -1,7 +1,6 @@
import sys
import json
import threading
import logging
from time import time, sleep
from datetime import datetime
@@ -15,9 +14,6 @@ from .instruction import Instruction
from biopro.device.manager import DeviceManager
from biopro.text import *
from biopro.db.base import Session
from biopro.db.collection import Collection
key_list = {
'deviceList': 'device',
}
@@ -50,28 +46,10 @@ class Project(threading.Thread):
self._count = 1 #流水號
self.log_verbose = log_verbose
self._logger = logging.getLogger('project')
self._logger.setLevel('DEBUG')
self._formatter = logging.Formatter('[%(asctime)s.%(msecs)03d] %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
self._formatter_with_nothing = logging.Formatter('%(message)s')
self.setup_project(project)
self.setup_device(self._device)
# create log file handler
fh = logging.FileHandler(f'/home/pi/logger/project/{self.uuid}.log', mode="w")
fh.setFormatter(self._formatter)
self._logger.addHandler(fh)
default_name = 'admin'
default_parent = {"folder": [1]}
collection = Collection.find_collection(default_name, default_parent)
parent = {"folder": [collection.id]}
# create project folder
collection = Collection.create_collection(self.name, parent)
self.setup_collection(collection)
def setup_project(self, project):
for (key, value) in project.items():
if key in key_list.keys():
@@ -88,11 +66,7 @@ class Project(threading.Thread):
for device in device_list:
mac_address = device_list[device]['pair']
complete_device = self._device_manager.get_device(mac_address)
complete_device.occupied_by_project = self._uuid
self._complete_device[device] = complete_device
def setup_collection(self, collection):
self._task_manager.create_collection(collection)
@property
def id(self) -> int:
@@ -162,23 +136,9 @@ class Project(threading.Thread):
def running_task(self):
return self._task_manager.running_task
def get_device_parameter_set(self, device_address):
parameter_set = self._task_manager.running_task.parameter_set
return next((x for x in parameter_set if parameter_set[x]['target'] == device_address), None)
def get_cycle(self, task):
for index, _cycle in enumerate(self.cycle):
if task.uuid in _cycle['range']:
return _cycle
def run(self):
# project status change running (1)
self._status = 1
# save start time
self._start_time = time()
# saving & broadcast message
self._logger.info('Project ' + self.name + ' start')
self.log_verbose('Project ' + self.name + ' start')
self.mqtt_thread.broadcast_command('project:' + self._name + ' start at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
@@ -201,17 +161,12 @@ class Project(threading.Thread):
for condition in match_condition_list:
match_action_list = task.get_match_action(condition.id)
print('match_action_list', match_action_list, match_action_list)
for action in match_action_list:
if action.type == 'cycle' and condition.type == 'previous_task_done':
self.mqtt_thread.broadcast_command('project:task ' + task.name + ' start at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
self._task_manager.set_running_task(task)
cycle_info = self.get_cycle(task)
if cycle_info['useID'] == False:
self._logger.info(f'---------- Cycle {task.name} Round {cycle_info["count"]} -----------')
if action.type == 'cycle' and condition.type == 'until_button_trigger':
self._task_manager.running_task.stop()
self._logger.info(f'---------- Cycle {cycle_info["id"]} Round {cycle_info["count"]} -----------')
if self._task_manager.running_task != None:
if self._task_manager.running_task.uuid == task.uuid and action.type == 'cycle' and condition.type == 'after_task_run':
@@ -220,7 +175,6 @@ class Project(threading.Thread):
if action.type == 'start':
if task.status != 1:
self._task_manager.set_running_task(task)
self._logger.info(f'Task {str(self._task_manager.running_task.name)} start')
self.mqtt_thread.broadcast_command('project:task ' + task.name + ' start at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
# elif action.type == 'stop':
# self.mqtt_thread.broadcast_command('project:task ' + str(self._task_manager.running_task.name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
@@ -230,15 +184,12 @@ class Project(threading.Thread):
elif action.type == 'idle':
self._task_manager.running_task.stop()
# elif action.type == 'stop':
# self._task_manager.running_task.stop()
instruction_set = None
if action.target is not None:
device = self._complete_device[action.target]
if ((action.type == 'start' and device.status == 0) or (action.type == 'stop' and device.status == 1)):
self._logger.info(f'Device {device.mac_address_in_str} {action.type}')
self.log_verbose('Project' + self.name + 'Task ' + task.name + ' match_condition ' + condition.type + ' trigger_action ' + action.type + ' ' + str(action.target))
task_info = task.get_task_info(action)
instruction_set = getattr(self._instruction_set, action.type, None)
@@ -272,29 +223,25 @@ class Project(threading.Thread):
task_info['file_name'] += '#' + str(cycle_info['name']) + '-' + str(cycle_info['count'])
self.log_verbose('file name ' + task_info['file_name'])
if instruction_set != None and self.get_device_parameter_set(action.target) != None:
for instruction in instruction_set:
print('instruction 1', device, instruction, datetime.now())
args = list(map(lambda arg: task_info[arg], instruction['arguments']))
target=getattr(device, instruction['method'])(*args)
print('instruction 2', device, instruction, datetime.now())
if instruction_set != None and len(task.parameter_set) > 0:
if action.type == 'start':
self._count += 1
for instruction in instruction_set:
args = list(map(lambda arg: task_info[arg], instruction['arguments']))
target=getattr(device, instruction['method'])(*args)
delay_time += (time() - now)
# check task not running then stop
if self.check_running_task_not_run() == True:
# self._logger.info(f'taskType {self._task_manager.running_task.name} {self._task_manager.running_task.type}')
if self._task_manager.running_task.type == '':
self._logger.info(f'Task {self._task_manager.running_task.name} stop')
self.mqtt_thread.broadcast_command('project:task ' + str(self._task_manager.running_task.name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
self._task_manager.running_task.stop()
# check project done then close project
if self.check_project_done() == True:
print('project stop at', datetime.now())
self.stop()
self.close()
if self._time_interval - delay_time > 0:
sleep(self._time_interval - delay_time)
@@ -304,19 +251,14 @@ class Project(threading.Thread):
pass
def stop(self):
for device in self._complete_device:
self._complete_device[device].occupied_by_project = None
self._task_manager.running_task.stop()
self.mqtt_thread.broadcast_command('project:task ' + str(self._task_manager.running_task.name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
self._status = 2
self._end_time = time()
self._stop_flag = True
self._logger.info('Project ' + self.name + ' stop')
self.mqtt_thread.broadcast_command('project:project ' + str(self._name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
def close(self):
for device in self._complete_device:
self._complete_device[device].occupied_by_project = None
self._status = 2
self._end_time = time()
self._stop_flag = True
@@ -375,18 +317,6 @@ class Project(threading.Thread):
'device': self._device,
'task': self.task_list,
'running_task': running_task,
'cycle': self._cycle,
'count': self._count,
}
return data
def info_pass_data_server(self):
if self._task_manager.running_task is not None:
running_task = self._task_manager.running_task.as_json()
data = {
'project': self._uuid,
'task': running_task,
'cycle': self._cycle,
'serial_number': self._count,
'cycle': self._cycle
}
return data
+3 -32
View File
@@ -5,7 +5,6 @@ from xml.dom.expatbuilder import parseString
import paho.mqtt.client as mqtt
from biopro.text import *
from .task import Task
from biopro.db.collection import Collection
_RUNTIME_COMPILE = False
@@ -57,24 +56,12 @@ class TaskManager():
def get_index_by_uuid(self, uuid):
return next((i for i, x in enumerate(self.task_list) if x.uuid == uuid), None)
def check_task_is_cycle_start(self, task):
for index, cycle in enumerate(self._cycle_list):
if cycle['range'][0] == task.uuid:
return index
def check_task_is_cycle_end(self, task):
for index, cycle in enumerate(self._cycle_list):
if cycle['range'][1] == task.uuid:
return index
def check_task_in_cycle(self, task_index):
for index, cycle in enumerate(self._cycle_list):
if self.get_index_by_uuid(cycle['range'][0]) <= task_index:
if self.get_index_by_uuid(cycle['range'][1]) >= task_index:
return True
return False
@property
def check_list(self):
return [self._running_task, *self._next_task]
@@ -134,7 +121,6 @@ class TaskManager():
if self._prev_task.status == 1:
self._prev_task.stop()
# if reach cycle end, count < max, then go to cycle start
cycle_start_index = self.check_task_is_cycle_start(task)
cycle_index = self.check_task_is_cycle_end(task)
if cycle_index is None:
# print('next', self._running_task.name, self._running_task.next)
@@ -149,33 +135,18 @@ class TaskManager():
cycle = self._cycle_list[cycle_index]
if int(cycle['count']) < int(cycle['max']):
self._next_task.append(self.get_task_by_uuid(cycle['range'][0]))
# cycle['count'] += 1
cycle['count'] += 1
else:
for task_uuid in self._running_task.next:
_task = next((task for task in self._task_list if task.uuid == task_uuid), None)
if _task != None:
_task.reset()
self._next_task.append(_task)
# cycle['count'] = 1
if cycle_start_index != None:
cycle = self._cycle_list[cycle_start_index]
if int(cycle['count']) < int(cycle['max']):
cycle['count'] += 1
else:
cycle['count'] = 1
cycle['count'] = 1
except RuntimeError as e:
print(e)
def get_task(self, task_id):
return self._task_list[task_id]
def create_collection(self, parent):
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]})
task.parent = {"folder": [collection.id]}
else:
task.parent = {"folder": [parent.id]}
+11 -26
View File
@@ -118,7 +118,7 @@ class RecordingMetaFile(JsonSerialize):
'_dirty', '_last_modify_time', '_file_size_cache',
'_recording_file_ch', '_recording_sub_file', '_size',
'_parameter', '_parent', '_recording_file_name', '_recording_sub_mini', '_recording_mini_ch',
'_raw_serial_number', '_mini_serial_number', '_device_id', '_project_id')
'_raw_serial_number', '_mini_serial_number', '_device_id')
def __init__(self, filepath: Union[str, Path], data_format: bytes = None, id_db = 0, database = None):
if isinstance(filepath, str):
@@ -153,7 +153,6 @@ class RecordingMetaFile(JsonSerialize):
self._parent = ''
self._recording_file_name = ''
self._device_id = -1
self._project_id = None
# recording parameter
self._configuration = None
@@ -298,7 +297,6 @@ class RecordingMetaFile(JsonSerialize):
'uuid': str(self._file_uuid),
'data_format': 'rec',
'device': self._device,
'project': self._project_id,
}
if len(self._parent) > 0:
@@ -464,7 +462,7 @@ class RecordingMetaFile(JsonSerialize):
def parameter(self) -> str:
return self._parameter
@parameter.setter
@device.setter
def parameter(self, parameter):
self._parameter = parameter
return None
@@ -473,7 +471,7 @@ class RecordingMetaFile(JsonSerialize):
def parent(self) -> str:
return self._parent
@parent.setter
@device.setter
def parent(self, parent):
self._parent = parent
@@ -481,7 +479,7 @@ class RecordingMetaFile(JsonSerialize):
def recording_file_name(self) -> str:
return self._recording_file_name
@recording_file_name.setter
@device.setter
def recording_file_name(self, recording_file_name):
self._recording_file_name = recording_file_name
@@ -494,15 +492,6 @@ class RecordingMetaFile(JsonSerialize):
self._configuration = conf
self._dirty = True
return None
@property
def project_id(self) -> int:
return self._project_id
@project_id.setter
def project_id(self, project: int):
self._project_id = project
return None
@property
def channels(self) -> List[int]:
@@ -1237,10 +1226,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 +1241,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 +1404,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 +1412,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)
+43 -29
View File
@@ -4,6 +4,7 @@ from time import time, sleep
from typing import Iterable
from datetime import datetime
import gc
import base64
from biopro.data import *
@@ -26,6 +27,7 @@ from .mqtt import MqttDataMessageHandler, MqttThread
from .database import DataBaseProcess
from .recording import RecordingProcess
from multiprocessing import Queue
import queue
from json import loads as json_parse, dumps as _json_stringify
import json
@@ -315,8 +317,7 @@ class DataServer(SocketServer, DataAPI):
def update_device_configuration(self,
device: str,
meta_file: Union[str, Path, RecordingMetaFile],
data_format: Union[AnyStr, DataDecodeFormat],
project_info: str):
data_format: Union[AnyStr, DataDecodeFormat]):
# meta file
device_id = -1
@@ -344,8 +345,6 @@ class DataServer(SocketServer, DataAPI):
_parent = json_stringify(_device['parent'])
_recording_file_name = _device['recording_file_name']
mac_address = json.loads(device)['device_address']
device_id = _device['device_id']
del _device['configuration']
del _device['parent']
del _device['recording_file_name']
@@ -355,22 +354,13 @@ class DataServer(SocketServer, DataAPI):
# meta_file.parameter = _parameter
# meta_file.parent = _parent
# meta_file.recording_file_name = _recording_file_name
device_id = int(json.loads(device)['device_id'])
if device_id < 0:
raise ValueError('illegal device ID : ' + str(device_id))
self.log_verbose('device ID', device_id)
# project binding meta file
# project_id = None
# _project = None
# if project_info != None:
# _project = json.loads(project_info)
# self.database_process.put_queue(['project_insert', device_id, _project])
# result = self._queue_ds_dict[int(device_id)].get()
# if result[0] == 'project_id':
project_id = project_info
# while len(self._configurations) <= device_id:
# self._configurationsappend(None)
@@ -390,6 +380,8 @@ class DataServer(SocketServer, DataAPI):
else:
data_format = data_format.name
# self.log_verbose('device data format', data_format)
self.log_verbose('device meta file', meta_file)
# data runtime
@@ -414,15 +406,15 @@ class DataServer(SocketServer, DataAPI):
c.shutdown()
c.join()
self._spi.set_wait_flag(c._device, True)
data_runtime_process = RecordingProcess('data_server', self.log_verbose, device_id,
Queue(), self._queue_ds_dict[int(device_id)], self._queue_msg, meta_file,
json_stringify(_device), _parameter, _parent, _recording_file_name,
data_format, self.socket_mqtt_ip, self.socket_mqtt_port,
project_id = project_id,
database = self.database_process)
data_format, self.socket_mqtt_ip, self.socket_mqtt_port,
database = self.database_process )
# data_runtime_process.start()
# check channel
if isinstance(data_runtime_process, RecordingProcess) and device_id not in self._available_channel:
raise RuntimeError('set device configuration on un-available channel', device_id)
@@ -654,7 +646,6 @@ class DataServer(SocketServer, DataAPI):
def whether_to_record(self, device):
# if user click "start", return True; if user click "stop", return False;
if device in self._configurations.keys() and self._configurations[device] is not None:
# print(self._configurations.keys(), ',', device, datetime.now())
return True
else:
return False
@@ -663,9 +654,6 @@ class DataServer(SocketServer, DataAPI):
ret = False
sync = self.get_spi_obj()
busy = sync.get_pin_busy()
# print('pin_busy=', busy, device, datetime.now())
if sync.get_pin_mem_req() == sync.get_pin_ram_sel():
spi_data = sync.recv_memory(device)
signal = sync.get_pin_mem_req()
@@ -674,7 +662,6 @@ class DataServer(SocketServer, DataAPI):
else:
data = None
print('data=None, mem_req!=ram_sel, [', sync.get_pin_mem_req(), ', ', sync.get_pin_ram_sel(), ']', device, datetime.now())
if data is not None:
if self._configurations.get(device, None) != None:
@@ -718,10 +705,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 +851,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 +958,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:
+3 -34
View File
@@ -222,8 +222,7 @@ class DataBaseProcess(Process):
try:
sql_cursor.execute(sql_str, sql_set)
except BaseException as e:
print('meta create error', e)
except:
self._psql_conn.commit()
sql_cursor.close()
self._queue_error.put(device_id)
@@ -250,8 +249,7 @@ class DataBaseProcess(Process):
try:
sql_cursor.execute(sql_str, sql_set)
except BaseException as e:
print('meta update error', e)
except:
self._psql_conn.commit()
sql_cursor.close()
self._queue_error.put(device_id)
@@ -552,33 +550,4 @@ class DataBaseProcess(Process):
except psycopg2.Error as e:
print('e', e)
return True
def project_insert(self, device_id, _data):
sql_str = 'INSERT INTO "public"."project_metas" ('
sql_set = []
for item in _data.keys():
sql_str = sql_str + str(item) + ', '
if isinstance(_data[item], dict) or isinstance(_data[item], list):
sql_set.append(json_stringify(_data[item]))
else:
sql_set.append(_data[item])
sql_str = sql_str[0:-2] + ') VALUES ('
for item in _data.keys():
sql_str = sql_str + '%s, '
sql_str = sql_str[0:-2] + ') RETURNING id'
sql_cursor = self._psql_conn.cursor()
try:
sql_cursor.execute(sql_str, sql_set)
except BaseException as e:
print('insert error', e)
self._psql_conn.commit()
sql_cursor.close()
self._queue_error.put()
finally:
self._queue_ds[int(device_id)].put(['project_id', int(sql_cursor.fetchone()[0])])
self._psql_conn.commit()
sql_cursor.close()
return True
+53 -86
View File
@@ -1,9 +1,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
@@ -34,11 +31,8 @@ from biopro.api.auth import AuthAPI
from biopro.api.controller import ControllerAPI
from biopro.api.device import DeviceAPI
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
### do not import Websocket mode
###from .websocket import WebsocketThread
_RUNTIME_COMPILE = False
@@ -123,8 +117,8 @@ class ControlServer(SocketServer, ControlServerAPI):
self.ups_thread = UPSDetectThread(self, c.flag_ups_wait_time)
# user session
# self._session = {}
# self._user_session_expire = c.user_session_expire_days * 24 * 60 * 60 # sec
self._session = {}
self._user_session_expire = c.user_session_expire_days * 24 * 60 * 60 # sec
# indicate those device together
self._device_instruction_group = None
@@ -135,10 +129,6 @@ class ControlServer(SocketServer, ControlServerAPI):
# _api request build
self._api = ApiRequests()
# sqlalchemy
Base.metadata.create_all(engine)
self._session = Session()
# init method
def _init_file_manager(self, option: ControlServerOptions) -> FileManager:
@@ -830,19 +820,16 @@ class ControlServer(SocketServer, ControlServerAPI):
@logging_info
def device_battery(self, device:int) -> List[int]:
try:
battery = {}
if device == 'all':
device_list = self.device_manager.list_device()
if len(device_list) > 0:
battery = list(map(lambda x: {"device": x.memory_board, "battery":self.device_manager.get_device(x).battery}, device_list))
else:
battery = {
"device": device,
"battery": self.device_manager.get_device(device).battery
}
except AttributeError as e:
print('device_battery', device, 'not found', e)
battery = {}
if device == 'all':
device_list = self.device_manager.list_device()
if len(device_list) > 0:
battery = list(map(lambda x: {"device": x.memory_board, "battery":self.device_manager.get_device(x).battery}, device_list))
else:
battery = {
"device": device,
"battery": self.device_manager.get_device(device).battery
}
return battery
@logging_info
@@ -864,7 +851,41 @@ 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)
mac_address = connect_device.mac_address
try:
if connect_device.library.name.startswith('Neulive3.'):
connect_device.calibration_info('NeuliveThreeOne')
elif connect_device.library.name.startswith('Neulive'):
connect_device.calibration_info('TDC4VC')
elif connect_device.library.name.startswith('EliteEIS'):
connect_device.calibration_info('EISZeroOne')
except BaseException as e:
# reset device info in db
DeviceAPI.updateByMac(
address_str(mac_address),
{
'connect_id': -1,
'connect_status': 'idle',
'auto_connect': False,
}
)
# disconnect device
self.hardware_device_disconnect(device, True)
print(e)
return False
else:
# update_calibration_info
DeviceAPI.updateByMac(
address_str(mac_address),
{
'calibration': str(connect_device.calibration)
}
)
# DeviceAPI.updateByAttrs('connect_status', 'update', {"connect_status": 'connect'})
return True
@logging_info
def device_update_radio_frequency(self, device: int, content:int) -> bool:
@@ -1000,17 +1021,8 @@ class ControlServer(SocketServer, ControlServerAPI):
@logging_info
def run_project(self, project) -> bool:
if project is not None:
# print(project)
project = self._project_manager.create(project)
with self._session as session:
project_report = ProjectReport(
name = project.name,
uuid = project.uuid,
cycle = project.cycle,
task = project.task_list,
device = project.device
)
session.add(project_report)
session.commit()
self._project_manager.run_project(project)
return project.as_json()
@@ -1052,40 +1064,6 @@ class ControlServer(SocketServer, ControlServerAPI):
elif oper == InternalInstruction.PREDEFINED_DISABLE_CACHE:
return True
elif oper == InternalInstruction.PREDEFINED_IDLE:
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
@@ -1100,8 +1078,6 @@ class ControlServer(SocketServer, ControlServerAPI):
self.log_verbose('update data format', value)
client = self.data_server.client()
project = None
project_meta_id = None
if client is not None:
info = self.file_manager.use(device)
@@ -1112,13 +1088,9 @@ class ControlServer(SocketServer, ControlServerAPI):
filename = self._file_save_cache.get(device.device_id, self.TEMP_FILENAME_EXPR)
filename = format_filename(filename, device)
info = self.file_manager.save(device, filename)
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)
with client:
client.update_device_configuration(device, info.meta_file, value, project_meta_id)
client.update_device_configuration(device, info.meta_file, value)
def _device_set_disable_cache(self, device: CompletedDevice, disable):
if disable:
@@ -1152,6 +1124,7 @@ class ControlServer(SocketServer, ControlServerAPI):
filename = format_filename(self.TEMP_FILENAME_EXPR, device)
info = self.file_manager.save(device, filename)
client.update_device_configuration(device, info.meta_file, RawDataDecoder())
if self._device_instruction_group is None:
client.start_sync(device)
@@ -1172,12 +1145,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
+69 -51
View File
@@ -44,9 +44,7 @@ class RecordingProcess(Process):
def __init__(self, client_id: str, log_verbose, device_id, queue_rec, queue_ds, queue_msg, meta_path,
device_info, parameter, parent, recording_file_name, data_format,
mqtt_ip, mqtt_port,
name = 'Recording-Process',
project_id = None,
database = None):
name = 'Recording-Process', database = None):
super(RecordingProcess, self).__init__(name = name)
self._database = database
@@ -59,7 +57,6 @@ class RecordingProcess(Process):
self._meta_file._parent = parent
self._meta_file._recording_file_name = recording_file_name
self._meta_file._device_id = device_id
self._meta_file._project_id = project_id
print(self._meta_file._device, self._meta_file._parameter, self._meta_file._parent, self._meta_file._filepath)
self._meta_file.write(self._database)
@@ -95,6 +92,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 +100,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 +122,43 @@ 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')
decoder._ac_amp = self._meta_file.configuration.get_parameter('AC_AMP')
decoder._freq_start = self._meta_file.configuration.get_parameter('FREQ_START')
decoder._freq_stop = self._meta_file.configuration.get_parameter('FREQ_STOP')
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:')
+1 -1
View File
@@ -93,7 +93,7 @@ class SocketClient(metaclass=abc.ABCMeta):
if self._socket is None:
try:
self._socket = Socket(AF_UNIX, SOCK_STREAM)
self._socket.settimeout(5)
self._socket.settimeout(3)
self._socket.connect(self._socket_file)
except Exception as e:
print('open_socket error:', e)
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"
]
}
}
}
File diff suppressed because it is too large Load Diff
@@ -6,7 +6,7 @@
"major_product_number": 0,
"minor_product_number": 3,
"major_version_number": 1,
"minor_version_number": 1
"minor_version_number": 0
},
"constant": {
"TIME_MAX": 100000,
@@ -780,7 +780,7 @@
"expression": "VALUE"
}
},
"CA_VOLT": {
"VOLT_VSCAN": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
@@ -1301,7 +1301,7 @@
"curve_const_vscan": {
"type": "RIS",
"parameter": {
"va": "CA_VOLT",
"va": "VOLT_VSCAN",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15",
@@ -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": [
@@ -33,7 +33,6 @@
0,
1,
1,
1,
1
],
"domain": {
@@ -618,8 +617,7 @@
"Open Circuit Potential",
"Pulse Sensing",
"Differential Pulse Voltammetry (DPV)",
"Chronopotentiometry",
"Idle"
"Chronopotentiometry"
]
},
"VOLT_ORIGIN": {
@@ -820,7 +818,7 @@
"expression": "VALUE"
}
},
"CA_VOLT": {
"VOLT_VSCAN": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
@@ -951,7 +949,6 @@
"10": "cali_dac_test",
"11": "cali_adc_test",
"12": "",
"17": "idle",
"*": "start_data"
}
}
@@ -979,9 +976,6 @@
"VIS_STI",
"_cdr('1X;4X>ADC_VALUE_I')"
],
"idle": [
"_idle()"
],
"start_data": [
"data_format",
"_notify(True)",
@@ -1029,7 +1023,7 @@
"6": "const_current",
"7": "curve_cv3",
"8": "curve_lsv",
"9": "curve_ca",
"9": "curve_const_vscan",
"13": "curve_ocp",
"14": "curve_pulse_sensing",
"15": "curve_dpv",
@@ -1366,10 +1360,10 @@
"2B>pe"
]
},
"curve_ca": {
"curve_const_vscan": {
"type": "RIS",
"parameter": {
"va": "CA_VOLT",
"va": "VOLT_VSCAN",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15",
@@ -1706,9 +1700,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": [
@@ -33,7 +33,6 @@
0,
1,
1,
1,
1
],
"domain": {
@@ -618,8 +617,7 @@
"Open Circuit Potential",
"Pulse Sensing",
"Differential Pulse Voltammetry (DPV)",
"Chronopotentiometry",
"Idle"
"Chronopotentiometry"
]
},
"VOLT_ORIGIN": {
@@ -820,7 +818,7 @@
"expression": "VALUE"
}
},
"CA_VOLT": {
"VOLT_VSCAN": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
@@ -951,7 +949,6 @@
"10": "cali_dac_test",
"11": "cali_adc_test",
"12": "",
"17": "idle",
"*": "start_data"
}
}
@@ -979,9 +976,6 @@
"VIS_STI",
"_cdr('1X;4X>ADC_VALUE_I')"
],
"idle": [
"_idle()"
],
"start_data": [
"data_format",
"_notify(True)",
@@ -1029,7 +1023,7 @@
"6": "const_current",
"7": "curve_cv3",
"8": "curve_lsv",
"9": "curve_ca",
"9": "curve_const_vscan",
"13": "curve_ocp",
"14": "curve_pulse_sensing",
"15": "curve_dpv",
@@ -1366,10 +1360,10 @@
"2B>pe"
]
},
"curve_ca": {
"curve_const_vscan": {
"type": "RIS",
"parameter": {
"va": "CA_VOLT",
"va": "VOLT_VSCAN",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15",
@@ -1706,9 +1700,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": [
@@ -33,7 +33,6 @@
0,
1,
1,
1,
1
],
"domain": {
@@ -618,8 +617,7 @@
"Open Circuit Potential",
"Pulse Sensing",
"Differential Pulse Voltammetry (DPV)",
"Chronopotentiometry",
"Idle"
"Chronopotentiometry"
]
},
"VOLT_ORIGIN": {
@@ -820,7 +818,7 @@
"expression": "VALUE"
}
},
"CA_VOLT": {
"VOLT_VSCAN": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
@@ -951,7 +949,6 @@
"10": "cali_dac_test",
"11": "cali_adc_test",
"12": "",
"17": "idle",
"*": "start_data"
}
}
@@ -979,9 +976,6 @@
"VIS_STI",
"_cdr('1X;4X>ADC_VALUE_I')"
],
"idle": [
"_idle()"
],
"start_data": [
"data_format",
"_notify(True)",
@@ -1029,7 +1023,7 @@
"6": "const_current",
"7": "curve_cv3",
"8": "curve_lsv",
"9": "curve_ca",
"9": "curve_const_vscan",
"13": "curve_ocp",
"14": "curve_pulse_sensing",
"15": "curve_dpv",
@@ -1366,10 +1360,10 @@
"2B>pe"
]
},
"curve_ca": {
"curve_const_vscan": {
"type": "RIS",
"parameter": {
"va": "CA_VOLT",
"va": "VOLT_VSCAN",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15",
@@ -1706,9 +1700,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
+185 -352
View File
@@ -9,7 +9,7 @@
"minor_version_number": 0
},
"constant": {
"FREQ_MAX": 13333334,
"FREQ_MAX": 4294967296,
"VOLT_MAX": 65536,
"BLE_WRITE_MAX": 255,
"TIME_MAX": 100000
@@ -26,44 +26,17 @@
"expression": "VALUE"
}
},
"HIGHZ_TABLE": {
"initial": [
1,
1,
1,
0,
1,
1,
1,
1
],
"domain": {
"list": [
100
]
},
"value": "VALUE"
},
"CTRL_HIGH_Z_15": {
"description": "ctrl highZ level",
"CHANNEL": {
"derzteription": "record channels",
"record_meta": true,
"initial": 1,
"value": [
"On",
"Off"
],
"on_change": "set_ctrl_highZ"
"domain": "property",
"value": "[0, 1, 2]"
},
"CYCLE_NUMBER": {
"description": "CV cycle number",
"CHANNEL_LABEL": {
"description": "channel label",
"record_meta": true,
"initial": 1,
"domain": [
65536
],
"value": {
"expression": "VALUE"
}
"domain": "property",
"value": "['current', 'voltage', 'impedance']"
},
"SAMPLE_RATE": {
"description": "data sampling rate",
@@ -77,12 +50,6 @@
},
"on_change": "set_sample_rate"
},
"CHANNEL": {
"derzteription": "record channels",
"record_meta": true,
"domain": "property",
"value": "[0, 1, 2]"
},
"AMP_GAIN": {
"description": "amp gain",
"record_meta": true,
@@ -96,64 +63,11 @@
"EIS CURVE",
"Cyclic Voltammetry",
"Chronoamperometric",
"V-T Graph",
"R-T Graph",
"EIS constant frequency",
"Dev Mode",
"Idle"
"Dev Mode"
]
},
"GENERAL_HS_RTIA": {
"description": "High speed rtia gain",
"record_meta": true,
"initial": 8,
"value": [
0,
1,
2,
3,
4,
5,
6,
7,
8
],
"on_change": "set_general_hs_rtia"
},
"GENERAL_LP_RTIA": {
"description": "Low power rtia gain",
"record_meta": true,
"initial": 4,
"value": [
"0",
"1",
"2",
"3",
"auto"
],
"on_change": "set_general_lp_rtia"
},
"EIS_DC_BIAS": {
"description": "DC voltage bias",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"EIS_AC_AMP": {
"description": "AC Amplitude",
"record_meta": true,
"initial": 26,
"domain": [
2048
]
},
"EIS_FREQ": {
"description": "[start, stop] of frequency scan",
"FREQ": {
"description": "DPV current recording period start",
"record_meta": true,
"initial": [
13333333,
@@ -166,24 +80,29 @@
},
"value": "VALUE"
},
"EIS_PPD": {
"description": "Point per decades",
"FREQ_START": {
"description": "Start of Freq Scan",
"record_meta": true,
"initial": 10,
"initial": 13422819,
"domain": [
11
]
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"EIS_SCALE": {
"description": "Point spacing pattern",
"FREQ_STOP": {
"description": "End of Freq Scan",
"record_meta": true,
"initial": 0,
"value": [
0,
1
]
"initial": 7,
"domain": [
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"EIS_DELAY": {
"DELAY": {
"description": "Wait x peroid before start taking measurements",
"record_meta": true,
"initial": 0,
@@ -194,19 +113,19 @@
"expression": "VALUE"
}
},
"EIS_AVERAGE_NUM": {
"AVERAGE_NUM": {
"description": "Number of sample used for average funciton",
"record_meta": true,
"initial": 8,
"value": [
2,
4,
6,
8
8,
16
]
},
"CF_DC_BIAS": {
"description": "DC voltage bias",
"DC_BIAS": {
"description": "DC voltage bias in mV",
"record_meta": true,
"initial": 25000,
"domain": [
@@ -216,34 +135,15 @@
"expression": "VALUE"
}
},
"CF_AC_AMP": {
"description": "AC Amplitude",
"AC_AMP": {
"description": "AC Amplitude in mV",
"record_meta": true,
"initial": 26,
"initial": 25,
"domain": [
2048
]
},
"CF_FREQ": {
"description": "frequency of cf",
"record_meta": true,
"initial": 13333333,
"domain": [
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"CF_PPD": {
"description": "Point per decades",
"record_meta": true,
"initial": 10,
"domain": [
11
]
},
"CF_SCALE": {
"SCALE": {
"description": "Point spacing pattern",
"record_meta": true,
"initial": 0,
@@ -252,29 +152,77 @@
1
]
},
"CF_DELAY": {
"description": "Wait x peroid before start taking measurements",
"PPD": {
"description": "Point per decades",
"record_meta": true,
"initial": 0,
"initial": 10,
"domain": [
101
11
]
},
"RTIA": {
"description": "High speed tia gain",
"record_meta": true,
"initial": 4,
"value": [
0,
1,
2,
3,
4
]
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"Scan_Rate": {
"description": "Voltage Scan Rate",
"record_meta": true,
"initial": 10000,
"domain": [
100001
],
"value": {
"expression": "VALUE"
}
},
"CF_AVERAGE_NUM": {
"description": "Number of sample used for average funciton",
"CTRL_HIGH_Z_15": {
"description": "ctrl highZ level",
"record_meta": true,
"initial": 8,
"initial": 1,
"value": [
2,
4,
6,
8
]
"On",
"Off"
],
"on_change": "set_ctrl_highZ"
},
"CV_E_INITIAL": {
"ADC_LEVEL_I_15": {
"description": "ADC level",
"record_meta": true,
"initial": 4,
"value": [
"0",
"1",
"2",
"3",
"auto"
],
"on_change": "set_adc_gain_I"
},
"ADC_LEVEL_V_IN_15": {
"description": "ADC level",
"record_meta": true,
"initial": 3,
"value": [
"0",
"1",
"2",
"auto"
],
"on_change": "set_adc_gain_Vin"
},
"VOLT_INITIAL": {
"description": "Initial Voltage of Scan",
"record_meta": true,
"initial": 25000,
@@ -285,8 +233,8 @@
"expression": "VALUE"
}
},
"CV_E1": {
"description": "First voltage of Scan",
"VOLT_MAX": {
"description": "Max Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
@@ -296,8 +244,8 @@
"expression": "VALUE"
}
},
"CV_E2": {
"description": "Second voltage of Scan",
"VOLT_MIN": {
"description": "Min Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
@@ -307,54 +255,27 @@
"expression": "VALUE"
}
},
"CV_SCAN_RATE": {
"description": "Voltage scan rate",
"CYCLE_NUMBER": {
"description": "CV cycle number",
"record_meta": true,
"initial": 10000,
"domain": [
100001
],
"value": {
"expression": "VALUE"
}
},
"CA_VOLT": {
"description": "Voltage of ca",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"VT_MEASURE_VIN_RANGE": {
"description": "measure range of Vin",
"record_meta": true,
"initial": 0,
"value": [
"0",
"1",
"2",
"auto"
]
},
"RT_VOLT_SET": {
"description": "DAC output Voltage",
"record_meta": true,
"initial": 37500,
"initial": 1,
"domain": [
65536
],
"value": {
"expression": "VALUE"
},
"on_change": "set_para_RT_VOLT_SET"
}
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
"VOLT_VSCAN": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"BLE_WRITE": {
"description": "send msg to elite",
@@ -376,26 +297,25 @@
{
"expression": "MODE",
"when": {
"7": "idle",
"*": "start_data"
}
}
],
"idle": [
"_idle()"
],
"start_data": [
"data_format_cali",
"_notify(True)",
{
"expression": "MODE",
"when": {
"0": "set_general_hs_rtia",
"1": "set_general_lp_rtia",
"2": "set_general_lp_rtia",
"3": "set_general_lp_rtia",
"4": "set_general_lp_rtia",
"5": "set_general_hs_rtia"
"1": "set_adc_gain_I",
"2": "set_adc_gain_I"
}
},
{
"expression": "MODE",
"when": {
"1": "set_adc_gain_Vin",
"2": "set_adc_gain_Vin"
}
},
{
@@ -403,25 +323,14 @@
"when": {
"0": "curve_eis",
"1": "curve_cv3",
"2": "curve_ca",
"3": "curve_vt",
"4": "curve_rt",
"5": "curve_cf"
"2": "curve_const_vscan"
}
},
{
"expression": "MODE",
"when": {
"0": "curve_eis_para2",
"1": "curve_cv3_para2",
"5": "curve_cf_para2"
}
},
{
"expression": "MODE",
"when": {
"0": "curve_eis_mode",
"5": "curve_cf_mode"
"1": "curve_cv3_para2"
}
},
"_sync(True)",
@@ -441,18 +350,6 @@
"data_format_cali": [
"_data_format_cali('EISZeroOne')"
],
"set_general_hs_rtia": {
"type": "RIS",
"data": [
"1XFF;1X70;1B>GENERAL_HS_RTIA"
]
},
"set_general_lp_rtia": {
"type": "RIS",
"data": [
"1XFF;1X71;1B>GENERAL_LP_RTIA"
]
},
"set_sample_rate": {
"type": "RIS",
"parameter": {
@@ -462,180 +359,116 @@
"XE0;2B>va"
]
},
"set_adc_gain_I": {
"type": "RIS",
"data": [
"XE1;X05;B>ADC_LEVEL_I_15"
]
},
"set_adc_gain_Vin": {
"type": "RIS",
"data": [
"XE1;X06;B>ADC_LEVEL_V_IN_15"
]
},
"set_ctrl_highZ": {
"type": "RIS",
"data": [
"1XFF;1X72;1B>CTRL_HIGH_Z_15"
"XE1;X03;B>CTRL_HIGH_Z_15"
]
},
"curve_eis": {
"type": "RIS",
"parameter": {
"fa": "EIS_FREQ[0]",
"fb": "EIS_FREQ[1]",
"dp": "EIS_DELAY",
"dc": "EIS_DC_BIAS",
"am": "EIS_AC_AMP",
"an": "EIS_AVERAGE_NUM",
"rt": "GENERAL_HS_RTIA",
"pp": "EIS_PPD",
"sp": "EIS_SCALE"
"fa": "FREQ[0]",
"fb": "FREQ[1]",
"dp": "DELAY",
"dc": "DC_BIAS",
"am": "AC_AMP",
"an": "AVERAGE_NUM",
"rt": "RTIA",
"pp": "PPD",
"sp": "SCALE"
},
"data": [
"1X12;1X01;4B>fa;4B>fb;2B>dp"
"1XD1;1X01;4B>fa;4B>fb;2B>dp"
]
},
"curve_eis_para2": {
"type": "RIS",
"parameter": {
"fa": "EIS_FREQ[0]",
"fb": "EIS_FREQ[1]",
"dp": "EIS_DELAY",
"dc": "EIS_DC_BIAS",
"am": "EIS_AC_AMP",
"an": "EIS_AVERAGE_NUM",
"rt": "GENERAL_HS_RTIA",
"pp": "EIS_PPD",
"sp": "EIS_SCALE"
"fa": "FREQ[0]",
"fb": "FREQ[1]",
"dp": "DELAY",
"dc": "DC_BIAS",
"am": "AC_AMP",
"an": "AVERAGE_NUM",
"rt": "RTIA",
"pp": "PPD",
"sp": "SCALE"
},
"data": [
"1X12;1X02;2B>dc;2B>am;B>an;B>rt;2B>pp;B>sp"
]
},
"curve_eis_mode": {
"type": "RIS",
"data": [
"1X12;1XFF"
]
},
"curve_cf": {
"type": "RIS",
"parameter": {
"fa": "CF_FREQ",
"dp": "CF_DELAY",
"dc": "CF_DC_BIAS",
"am": "CF_AC_AMP",
"an": "CF_AVERAGE_NUM",
"rt": "GENERAL_HS_RTIA",
"pp": "CF_PPD",
"sp": "CF_SCALE"
},
"data": [
"1X13;1X01;4B>fa;4B>0;2B>dp"
]
},
"curve_cf_para2": {
"type": "RIS",
"parameter": {
"fa": "CF_FREQ",
"dp": "CF_DELAY",
"dc": "CF_DC_BIAS",
"am": "CF_AC_AMP",
"an": "CF_AVERAGE_NUM",
"rt": "GENERAL_HS_RTIA",
"pp": "CF_PPD",
"sp": "CF_SCALE"
},
"data": [
"1X13;1X02;2B>dc;2B>am;B>an;B>rt;2B>pp;B>sp"
]
},
"curve_cf_mode": {
"type": "RIS",
"data": [
"1X13;1XFF"
"1XD1;1X02;2B>dc;2B>am;B>an;B>rt;2B>pp;B>sp"
]
},
"curve_cv3": {
"type": "RIS",
"parameter": {
"va": "CV_E_INITIAL",
"vb": "CV_E1",
"vc": "CV_E2",
"ve": "CV_SCAN_RATE",
"va": "VOLT_INITIAL",
"vb": "VOLT_MAX",
"vc": "VOLT_MIN",
"ve": "Scan_Rate",
"vf": "SAMPLE_RATE",
"cn": "CYCLE_NUMBER"
},
"data": [
"1X09;1X01;2B>va;2B>vb;2B>vc;"
"1XD2;1X01;2B>va;2B>vb;2B>vc;"
]
},
"curve_cv3_para2": {
"type": "RIS",
"parameter": {
"va": "CV_E_INITIAL",
"vb": "CV_E1",
"vc": "CV_E2",
"ve": "CV_SCAN_RATE",
"va": "VOLT_INITIAL",
"vb": "VOLT_MAX",
"vc": "VOLT_MIN",
"ve": "Scan_Rate",
"vf": "SAMPLE_RATE",
"cn": "CYCLE_NUMBER"
},
"data": [
"1X09;1X02;4B>ve;2B>vf;2B>cn"
"1XD2;1X02;4B>ve;2B>vf;2B>cn"
]
},
"curve_ca": {
"curve_const_vscan": {
"type": "RIS",
"parameter": {
"va": "CA_VOLT",
"pa": "GENERAL_LP_RTIA",
"va": "VOLT_VSCAN",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE"
},
"data": [
"1X0B;",
"1XD3;",
"2B>va;",
"4b>pa;4b>0;",
"4b>pa;4b>pb;",
"4b>0;4b>pd;",
"2B>pe"
]
},
"curve_rt": {
"type": "RIS",
"parameter": {
"va": "RT_VOLT_SET",
"pa": "GENERAL_LP_RTIA",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE"
},
"data": [
"X04;",
"2B>va;",
"4b>pa;4b>0;",
"4b>0;4b>pd;",
"2B>pe"
]
},
"curve_vt": {
"type": "RIS",
"parameter": {
"pa": "GENERAL_LP_RTIA",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE",
"va": "VT_MEASURE_VIN_RANGE"
},
"data": [
"X05;",
"4b>pa;4b>0;",
"4b>0;4b>pd;",
"2B>pe;",
"1B>va"
]
},
"set_para_RT_VOLT_SET": {
"type": "RIS",
"data": [
"XE2;X01;2B>RT_VOLT_SET"
]
},
"ble_instru_send": [
"ble_write",
"_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": [
+186 -321
View File
@@ -9,7 +9,7 @@
"minor_version_number": 1
},
"constant": {
"FREQ_MAX": 13333334,
"FREQ_MAX": 4294967296,
"VOLT_MAX": 65536,
"BLE_WRITE_MAX": 255,
"TIME_MAX": 100000
@@ -26,44 +26,17 @@
"expression": "VALUE"
}
},
"HIGHZ_TABLE": {
"initial": [
1,
1,
1,
0,
1,
1,
1,
1
],
"domain": {
"list": [
100
]
},
"value": "VALUE"
},
"CTRL_HIGH_Z_15": {
"description": "ctrl highZ level",
"CHANNEL": {
"derzteription": "record channels",
"record_meta": true,
"initial": 1,
"value": [
"On",
"Off"
],
"on_change": "set_ctrl_highZ"
"domain": "property",
"value": "[0, 1, 2]"
},
"CYCLE_NUMBER": {
"description": "CV cycle number",
"CHANNEL_LABEL": {
"description": "channel label",
"record_meta": true,
"initial": 1,
"domain": [
65536
],
"value": {
"expression": "VALUE"
}
"domain": "property",
"value": "['current', 'voltage', 'impedance']"
},
"SAMPLE_RATE": {
"description": "data sampling rate",
@@ -77,12 +50,6 @@
},
"on_change": "set_sample_rate"
},
"CHANNEL": {
"derzteription": "record channels",
"record_meta": true,
"domain": "property",
"value": "[0, 1, 2]"
},
"AMP_GAIN": {
"description": "amp gain",
"record_meta": true,
@@ -97,66 +64,14 @@
"Cyclic Voltammetry",
"Chronoamperometric",
"V-T Graph",
"R-T Graph",
"EIS constant frequency",
"Dev Mode",
"Idle"
"Dev Mode"
]
},
"GENERAL_HS_RTIA": {
"description": "High speed rtia gain",
"record_meta": true,
"initial": 8,
"value": [
0,
1,
2,
3,
4,
5,
6,
7,
8
],
"on_change": "set_general_hs_rtia"
},
"GENERAL_LP_RTIA": {
"description": "Low power rtia gain",
"record_meta": true,
"initial": 4,
"value": [
"0",
"1",
"2",
"3",
"auto"
],
"on_change": "set_general_lp_rtia"
},
"EIS_DC_BIAS": {
"description": "DC voltage bias",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"EIS_AC_AMP": {
"description": "AC Amplitude",
"record_meta": true,
"initial": 26,
"domain": [
2048
]
},
"EIS_FREQ": {
"description": "[start, stop] of frequency scan",
"FREQ": {
"description": "DPV current recording period start",
"record_meta": true,
"initial": [
13333333,
13422819,
7
],
"domain": {
@@ -166,24 +81,29 @@
},
"value": "VALUE"
},
"EIS_PPD": {
"description": "Point per decades",
"FREQ_START": {
"description": "Start of Freq Scan",
"record_meta": true,
"initial": 10,
"initial": 13422819,
"domain": [
11
]
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"EIS_SCALE": {
"description": "Point spacing pattern",
"FREQ_STOP": {
"description": "End of Freq Scan",
"record_meta": true,
"initial": 0,
"value": [
0,
1
]
"initial": 7,
"domain": [
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"EIS_DELAY": {
"DELAY": {
"description": "Wait x peroid before start taking measurements",
"record_meta": true,
"initial": 0,
@@ -194,19 +114,19 @@
"expression": "VALUE"
}
},
"EIS_AVERAGE_NUM": {
"AVERAGE_NUM": {
"description": "Number of sample used for average funciton",
"record_meta": true,
"initial": 8,
"value": [
2,
4,
6,
8
8,
16
]
},
"CF_DC_BIAS": {
"description": "DC voltage bias",
"DC_BIAS": {
"description": "DC voltage bias in mV",
"record_meta": true,
"initial": 25000,
"domain": [
@@ -216,34 +136,15 @@
"expression": "VALUE"
}
},
"CF_AC_AMP": {
"description": "AC Amplitude",
"AC_AMP": {
"description": "AC Amplitude in mV",
"record_meta": true,
"initial": 26,
"initial": 25,
"domain": [
2048
]
},
"CF_FREQ": {
"description": "frequency of cf",
"record_meta": true,
"initial": 13333333,
"domain": [
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"CF_PPD": {
"description": "Point per decades",
"record_meta": true,
"initial": 10,
"domain": [
11
]
},
"CF_SCALE": {
"SCALE": {
"description": "Point spacing pattern",
"record_meta": true,
"initial": 0,
@@ -252,29 +153,77 @@
1
]
},
"CF_DELAY": {
"description": "Wait x peroid before start taking measurements",
"PPD": {
"description": "Point per decades",
"record_meta": true,
"initial": 0,
"initial": 10,
"domain": [
101
11
]
},
"RTIA": {
"description": "High speed tia gain",
"record_meta": true,
"initial": 4,
"value": [
0,
1,
2,
3,
4
]
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"Scan_Rate": {
"description": "Voltage Scan Rate",
"record_meta": true,
"initial": 10000,
"domain": [
100001
],
"value": {
"expression": "VALUE"
}
},
"CF_AVERAGE_NUM": {
"description": "Number of sample used for average funciton",
"CTRL_HIGH_Z_15": {
"description": "ctrl highZ level",
"record_meta": true,
"initial": 8,
"initial": 1,
"value": [
2,
4,
6,
8
]
"On",
"Off"
],
"on_change": "set_ctrl_highZ"
},
"CV_E_INITIAL": {
"ADC_LEVEL_I_15": {
"description": "ADC level",
"record_meta": true,
"initial": 4,
"value": [
"0",
"1",
"2",
"3",
"auto"
],
"on_change": "set_adc_gain_I"
},
"ADC_LEVEL_V_IN_15": {
"description": "ADC level",
"record_meta": true,
"initial": 3,
"value": [
"0",
"1",
"2",
"auto"
],
"on_change": "set_adc_gain_Vin"
},
"VOLT_INITIAL": {
"description": "Initial Voltage of Scan",
"record_meta": true,
"initial": 25000,
@@ -285,8 +234,8 @@
"expression": "VALUE"
}
},
"CV_E1": {
"description": "First voltage of Scan",
"VOLT_MAX": {
"description": "Max Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
@@ -296,8 +245,8 @@
"expression": "VALUE"
}
},
"CV_E2": {
"description": "Second voltage of Scan",
"VOLT_MIN": {
"description": "Min Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
@@ -307,19 +256,19 @@
"expression": "VALUE"
}
},
"CV_SCAN_RATE": {
"description": "Voltage scan rate",
"CYCLE_NUMBER": {
"description": "CV cycle number",
"record_meta": true,
"initial": 10000,
"initial": 1,
"domain": [
100001
65536
],
"value": {
"expression": "VALUE"
}
},
"CA_VOLT": {
"description": "Voltage of ca",
"VOLT_VSCAN": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
"domain": [
@@ -329,7 +278,7 @@
"expression": "VALUE"
}
},
"VT_MEASURE_VIN_RANGE": {
"MEASURE_VIN_RANGE": {
"description": "measure range of Vin",
"record_meta": true,
"initial": 0,
@@ -340,22 +289,6 @@
"auto"
]
},
"RT_VOLT_SET": {
"description": "DAC output Voltage",
"record_meta": true,
"initial": 37500,
"domain": [
65536
],
"value": {
"expression": "VALUE"
},
"on_change": "set_para_RT_VOLT_SET"
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"BLE_WRITE": {
"description": "send msg to elite",
"domain": {
@@ -376,26 +309,27 @@
{
"expression": "MODE",
"when": {
"7": "idle",
"*": "start_data"
}
}
],
"idle": [
"_idle()"
],
"start_data": [
"data_format_cali",
"_notify(True)",
{
"expression": "MODE",
"when": {
"0": "set_general_hs_rtia",
"1": "set_general_lp_rtia",
"2": "set_general_lp_rtia",
"3": "set_general_lp_rtia",
"4": "set_general_lp_rtia",
"5": "set_general_hs_rtia"
"1": "set_adc_gain_I",
"2": "set_adc_gain_I",
"3": "set_adc_gain_I"
}
},
{
"expression": "MODE",
"when": {
"1": "set_adc_gain_Vin",
"2": "set_adc_gain_Vin",
"3": "set_adc_gain_Vin"
}
},
{
@@ -403,25 +337,15 @@
"when": {
"0": "curve_eis",
"1": "curve_cv3",
"2": "curve_ca",
"3": "curve_vt",
"4": "curve_rt",
"5": "curve_cf"
"2": "curve_const_vscan",
"3": "curve_vt"
}
},
{
"expression": "MODE",
"when": {
"0": "curve_eis_para2",
"1": "curve_cv3_para2",
"5": "curve_cf_para2"
}
},
{
"expression": "MODE",
"when": {
"0": "curve_eis_mode",
"5": "curve_cf_mode"
"1": "curve_cv3_para2"
}
},
"_sync(True)",
@@ -441,18 +365,6 @@
"data_format_cali": [
"_data_format_cali('EISZeroOne')"
],
"set_general_hs_rtia": {
"type": "RIS",
"data": [
"1XFF;1X70;1B>GENERAL_HS_RTIA"
]
},
"set_general_lp_rtia": {
"type": "RIS",
"data": [
"1XFF;1X71;1B>GENERAL_LP_RTIA"
]
},
"set_sample_rate": {
"type": "RIS",
"parameter": {
@@ -462,146 +374,99 @@
"XE0;2B>va"
]
},
"set_adc_gain_I": {
"type": "RIS",
"data": [
"XE1;X05;B>ADC_LEVEL_I_15"
]
},
"set_adc_gain_Vin": {
"type": "RIS",
"data": [
"XE1;X06;B>ADC_LEVEL_V_IN_15"
]
},
"set_ctrl_highZ": {
"type": "RIS",
"data": [
"1XFF;1X72;1B>CTRL_HIGH_Z_15"
"XE1;X03;B>CTRL_HIGH_Z_15"
]
},
"curve_eis": {
"type": "RIS",
"parameter": {
"fa": "EIS_FREQ[0]",
"fb": "EIS_FREQ[1]",
"dp": "EIS_DELAY",
"dc": "EIS_DC_BIAS",
"am": "EIS_AC_AMP",
"an": "EIS_AVERAGE_NUM",
"rt": "GENERAL_HS_RTIA",
"pp": "EIS_PPD",
"sp": "EIS_SCALE"
"fa": "FREQ[0]",
"fb": "FREQ[1]",
"dp": "DELAY",
"dc": "DC_BIAS",
"am": "AC_AMP",
"an": "AVERAGE_NUM",
"rt": "RTIA",
"pp": "PPD",
"sp": "SCALE"
},
"data": [
"1X12;1X01;4B>fa;4B>fb;2B>dp"
"1XD1;1X01;4B>fa;4B>fb;2B>dp"
]
},
"curve_eis_para2": {
"type": "RIS",
"parameter": {
"fa": "EIS_FREQ[0]",
"fb": "EIS_FREQ[1]",
"dp": "EIS_DELAY",
"dc": "EIS_DC_BIAS",
"am": "EIS_AC_AMP",
"an": "EIS_AVERAGE_NUM",
"rt": "GENERAL_HS_RTIA",
"pp": "EIS_PPD",
"sp": "EIS_SCALE"
"fa": "FREQ[0]",
"fb": "FREQ[1]",
"dp": "DELAY",
"dc": "DC_BIAS",
"am": "AC_AMP",
"an": "AVERAGE_NUM",
"rt": "RTIA",
"pp": "PPD",
"sp": "SCALE"
},
"data": [
"1X12;1X02;2B>dc;2B>am;B>an;B>rt;2B>pp;B>sp"
]
},
"curve_eis_mode": {
"type": "RIS",
"data": [
"1X12;1XFF"
]
},
"curve_cf": {
"type": "RIS",
"parameter": {
"fa": "CF_FREQ",
"dp": "CF_DELAY",
"dc": "CF_DC_BIAS",
"am": "CF_AC_AMP",
"an": "CF_AVERAGE_NUM",
"rt": "GENERAL_HS_RTIA",
"pp": "CF_PPD",
"sp": "CF_SCALE"
},
"data": [
"1X13;1X01;4B>fa;4B>0;2B>dp"
]
},
"curve_cf_para2": {
"type": "RIS",
"parameter": {
"fa": "CF_FREQ",
"dp": "CF_DELAY",
"dc": "CF_DC_BIAS",
"am": "CF_AC_AMP",
"an": "CF_AVERAGE_NUM",
"rt": "GENERAL_HS_RTIA",
"pp": "CF_PPD",
"sp": "CF_SCALE"
},
"data": [
"1X13;1X02;2B>dc;2B>am;B>an;B>rt;2B>pp;B>sp"
]
},
"curve_cf_mode": {
"type": "RIS",
"data": [
"1X13;1XFF"
"1XD1;1X02;2B>dc;2B>am;B>an;B>rt;2B>pp;B>sp"
]
},
"curve_cv3": {
"type": "RIS",
"parameter": {
"va": "CV_E_INITIAL",
"vb": "CV_E1",
"vc": "CV_E2",
"ve": "CV_SCAN_RATE",
"va": "VOLT_INITIAL",
"vb": "VOLT_MAX",
"vc": "VOLT_MIN",
"ve": "Scan_Rate",
"vf": "SAMPLE_RATE",
"cn": "CYCLE_NUMBER"
},
"data": [
"1X09;1X01;2B>va;2B>vb;2B>vc;"
"1XD2;1X01;2B>va;2B>vb;2B>vc;"
]
},
"curve_cv3_para2": {
"type": "RIS",
"parameter": {
"va": "CV_E_INITIAL",
"vb": "CV_E1",
"vc": "CV_E2",
"ve": "CV_SCAN_RATE",
"va": "VOLT_INITIAL",
"vb": "VOLT_MAX",
"vc": "VOLT_MIN",
"ve": "Scan_Rate",
"vf": "SAMPLE_RATE",
"cn": "CYCLE_NUMBER"
},
"data": [
"1X09;1X02;4B>ve;2B>vf;2B>cn"
"1XD2;1X02;4B>ve;2B>vf;2B>cn"
]
},
"curve_ca": {
"curve_const_vscan": {
"type": "RIS",
"parameter": {
"va": "CA_VOLT",
"pa": "GENERAL_LP_RTIA",
"va": "VOLT_VSCAN",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE"
},
"data": [
"1X0B;",
"1XD3;",
"2B>va;",
"4b>pa;4b>0;",
"4b>0;4b>pd;",
"2B>pe"
]
},
"curve_rt": {
"type": "RIS",
"parameter": {
"va": "RT_VOLT_SET",
"pa": "GENERAL_LP_RTIA",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE"
},
"data": [
"X04;",
"2B>va;",
"4b>pa;4b>0;",
"4b>pa;4b>pb;",
"4b>0;4b>pd;",
"2B>pe"
]
@@ -609,33 +474,33 @@
"curve_vt": {
"type": "RIS",
"parameter": {
"pa": "GENERAL_LP_RTIA",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE",
"va": "VT_MEASURE_VIN_RANGE"
"va": "MEASURE_VIN_RANGE"
},
"data": [
"X05;",
"4b>pa;4b>0;",
"4b>pa;4b>pb;",
"4b>0;4b>pd;",
"2B>pe;",
"1B>va"
]
},
"set_para_RT_VOLT_SET": {
"type": "RIS",
"data": [
"XE2;X01;2B>RT_VOLT_SET"
]
},
"ble_instru_send": [
"ble_write",
"_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": [
@@ -9,7 +9,7 @@
"minor_version_number": 2
},
"constant": {
"FREQ_MAX": 13333334,
"FREQ_MAX": 4294967296,
"VOLT_MAX": 65536,
"BLE_WRITE_MAX": 255,
"TIME_MAX": 100000
@@ -26,44 +26,17 @@
"expression": "VALUE"
}
},
"HIGHZ_TABLE": {
"initial": [
1,
1,
1,
0,
1,
1,
1,
1
],
"domain": {
"list": [
100
]
},
"value": "VALUE"
},
"CTRL_HIGH_Z_15": {
"description": "ctrl highZ level",
"CHANNEL": {
"derzteription": "record channels",
"record_meta": true,
"initial": 1,
"value": [
"On",
"Off"
],
"on_change": "set_ctrl_highZ"
"domain": "property",
"value": "[0, 1, 2]"
},
"CYCLE_NUMBER": {
"description": "CV cycle number",
"CHANNEL_LABEL": {
"description": "channel label",
"record_meta": true,
"initial": 1,
"domain": [
65536
],
"value": {
"expression": "VALUE"
}
"domain": "property",
"value": "['current', 'voltage', 'impedance']"
},
"SAMPLE_RATE": {
"description": "data sampling rate",
@@ -77,12 +50,6 @@
},
"on_change": "set_sample_rate"
},
"CHANNEL": {
"derzteription": "record channels",
"record_meta": true,
"domain": "property",
"value": "[0, 1, 2]"
},
"AMP_GAIN": {
"description": "amp gain",
"record_meta": true,
@@ -97,63 +64,11 @@
"Cyclic Voltammetry",
"Chronoamperometric",
"V-T Graph",
"R-T Graph",
"EIS constant frequency",
"Dev Mode",
"Idle"
"Dev Mode"
]
},
"GENERAL_HS_RTIA": {
"description": "High speed rtia gain",
"record_meta": true,
"initial": 8,
"value": [
0,
1,
2,
3,
4,
5,
6,
7,
8
],
"on_change": "set_general_hs_rtia"
},
"GENERAL_LP_RTIA": {
"description": "Low power rtia gain",
"record_meta": true,
"initial": 4,
"value": [
"0",
"1",
"2",
"3",
"auto"
],
"on_change": "set_general_lp_rtia"
},
"EIS_DC_BIAS": {
"description": "DC voltage bias",
"record_meta": true,
"initial": 25000,
"domain": [
"VOLT_MAX"
],
"value": {
"expression": "VALUE"
}
},
"EIS_AC_AMP": {
"description": "AC Amplitude",
"record_meta": true,
"initial": 26,
"domain": [
2048
]
},
"EIS_FREQ": {
"description": "[start, stop] of frequency scan",
"FREQ": {
"description": "DPV current recording period start",
"record_meta": true,
"initial": [
13333333,
@@ -166,24 +81,29 @@
},
"value": "VALUE"
},
"EIS_PPD": {
"description": "Point per decades",
"FREQ_START": {
"description": "Start of Freq Scan",
"record_meta": true,
"initial": 10,
"initial": 13422819,
"domain": [
11
]
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"EIS_SCALE": {
"description": "Point spacing pattern",
"FREQ_STOP": {
"description": "End of Freq Scan",
"record_meta": true,
"initial": 0,
"value": [
0,
1
]
"initial": 7,
"domain": [
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"EIS_DELAY": {
"DELAY": {
"description": "Wait x peroid before start taking measurements",
"record_meta": true,
"initial": 0,
@@ -194,19 +114,19 @@
"expression": "VALUE"
}
},
"EIS_AVERAGE_NUM": {
"AVERAGE_NUM": {
"description": "Number of sample used for average funciton",
"record_meta": true,
"initial": 8,
"value": [
2,
4,
6,
8
8,
16
]
},
"CF_DC_BIAS": {
"description": "DC voltage bias",
"DC_BIAS": {
"description": "DC voltage bias in mV",
"record_meta": true,
"initial": 25000,
"domain": [
@@ -216,34 +136,15 @@
"expression": "VALUE"
}
},
"CF_AC_AMP": {
"description": "AC Amplitude",
"AC_AMP": {
"description": "AC Amplitude in mV",
"record_meta": true,
"initial": 26,
"initial": 25,
"domain": [
2048
]
},
"CF_FREQ": {
"description": "frequency of cf",
"record_meta": true,
"initial": 13333333,
"domain": [
"FREQ_MAX"
],
"value": {
"expression": "VALUE"
}
},
"CF_PPD": {
"description": "Point per decades",
"record_meta": true,
"initial": 10,
"domain": [
11
]
},
"CF_SCALE": {
"SCALE": {
"description": "Point spacing pattern",
"record_meta": true,
"initial": 0,
@@ -252,29 +153,77 @@
1
]
},
"CF_DELAY": {
"description": "Wait x peroid before start taking measurements",
"PPD": {
"description": "Point per decades",
"record_meta": true,
"initial": 0,
"initial": 10,
"domain": [
101
11
]
},
"RTIA": {
"description": "High speed tia gain",
"record_meta": true,
"initial": 4,
"value": [
0,
1,
2,
3,
4
]
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"Scan_Rate": {
"description": "Voltage Scan Rate",
"record_meta": true,
"initial": 10000,
"domain": [
100001
],
"value": {
"expression": "VALUE"
}
},
"CF_AVERAGE_NUM": {
"description": "Number of sample used for average funciton",
"CTRL_HIGH_Z_15": {
"description": "ctrl highZ level",
"record_meta": true,
"initial": 8,
"initial": 1,
"value": [
2,
4,
6,
8
]
"On",
"Off"
],
"on_change": "set_ctrl_highZ"
},
"CV_E_INITIAL": {
"ADC_LEVEL_I_15": {
"description": "ADC level",
"record_meta": true,
"initial": 4,
"value": [
"0",
"1",
"2",
"3",
"auto"
],
"on_change": "set_adc_gain_I"
},
"ADC_LEVEL_V_IN_15": {
"description": "ADC level",
"record_meta": true,
"initial": 3,
"value": [
"0",
"1",
"2",
"auto"
],
"on_change": "set_adc_gain_Vin"
},
"VOLT_INITIAL": {
"description": "Initial Voltage of Scan",
"record_meta": true,
"initial": 25000,
@@ -285,8 +234,8 @@
"expression": "VALUE"
}
},
"CV_E1": {
"description": "First voltage of Scan",
"VOLT_MAX": {
"description": "Max Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
@@ -296,8 +245,8 @@
"expression": "VALUE"
}
},
"CV_E2": {
"description": "Second voltage of Scan",
"VOLT_MIN": {
"description": "Min Voltage of Scan",
"record_meta": true,
"initial": 25000,
"domain": [
@@ -307,19 +256,19 @@
"expression": "VALUE"
}
},
"CV_SCAN_RATE": {
"description": "Voltage scan rate",
"CYCLE_NUMBER": {
"description": "CV cycle number",
"record_meta": true,
"initial": 10000,
"initial": 1,
"domain": [
100001
65536
],
"value": {
"expression": "VALUE"
}
},
"CA_VOLT": {
"description": "Voltage of ca",
"VOLT_VSCAN": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
"domain": [
@@ -329,7 +278,7 @@
"expression": "VALUE"
}
},
"VT_MEASURE_VIN_RANGE": {
"MEASURE_VIN_RANGE": {
"description": "measure range of Vin",
"record_meta": true,
"initial": 0,
@@ -340,22 +289,6 @@
"auto"
]
},
"RT_VOLT_SET": {
"description": "DAC output Voltage",
"record_meta": true,
"initial": 37500,
"domain": [
65536
],
"value": {
"expression": "VALUE"
},
"on_change": "set_para_RT_VOLT_SET"
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"BLE_WRITE": {
"description": "send msg to elite",
"domain": {
@@ -376,26 +309,27 @@
{
"expression": "MODE",
"when": {
"7": "idle",
"*": "start_data"
}
}
],
"idle": [
"_idle()"
],
"start_data": [
"data_format_cali",
"_notify(True)",
{
"expression": "MODE",
"when": {
"0": "set_general_hs_rtia",
"1": "set_general_lp_rtia",
"2": "set_general_lp_rtia",
"3": "set_general_lp_rtia",
"4": "set_general_lp_rtia",
"5": "set_general_hs_rtia"
"1": "set_adc_gain_I",
"2": "set_adc_gain_I",
"3": "set_adc_gain_I"
}
},
{
"expression": "MODE",
"when": {
"1": "set_adc_gain_Vin",
"2": "set_adc_gain_Vin",
"3": "set_adc_gain_Vin"
}
},
{
@@ -403,25 +337,15 @@
"when": {
"0": "curve_eis",
"1": "curve_cv3",
"2": "curve_ca",
"3": "curve_vt",
"4": "curve_rt",
"5": "curve_cf"
"2": "curve_const_vscan",
"3": "curve_vt"
}
},
{
"expression": "MODE",
"when": {
"0": "curve_eis_para2",
"1": "curve_cv3_para2",
"5": "curve_cf_para2"
}
},
{
"expression": "MODE",
"when": {
"0": "curve_eis_mode",
"5": "curve_cf_mode"
"1": "curve_cv3_para2"
}
},
"_sync(True)",
@@ -441,18 +365,6 @@
"data_format_cali": [
"_data_format_cali('EISZeroOne')"
],
"set_general_hs_rtia": {
"type": "RIS",
"data": [
"1XFF;1X70;1B>GENERAL_HS_RTIA"
]
},
"set_general_lp_rtia": {
"type": "RIS",
"data": [
"1XFF;1X71;1B>GENERAL_LP_RTIA"
]
},
"set_sample_rate": {
"type": "RIS",
"parameter": {
@@ -462,146 +374,99 @@
"XE0;2B>va"
]
},
"set_adc_gain_I": {
"type": "RIS",
"data": [
"XE1;X05;B>ADC_LEVEL_I_15"
]
},
"set_adc_gain_Vin": {
"type": "RIS",
"data": [
"XE1;X06;B>ADC_LEVEL_V_IN_15"
]
},
"set_ctrl_highZ": {
"type": "RIS",
"data": [
"1XFF;1X72;1B>CTRL_HIGH_Z_15"
"XE1;X03;B>CTRL_HIGH_Z_15"
]
},
"curve_eis": {
"type": "RIS",
"parameter": {
"fa": "EIS_FREQ[0]",
"fb": "EIS_FREQ[1]",
"dp": "EIS_DELAY",
"dc": "EIS_DC_BIAS",
"am": "EIS_AC_AMP",
"an": "EIS_AVERAGE_NUM",
"rt": "GENERAL_HS_RTIA",
"pp": "EIS_PPD",
"sp": "EIS_SCALE"
"fa": "FREQ[0]",
"fb": "FREQ[1]",
"dp": "DELAY",
"dc": "DC_BIAS",
"am": "AC_AMP",
"an": "AVERAGE_NUM",
"rt": "RTIA",
"pp": "PPD",
"sp": "SCALE"
},
"data": [
"1X12;1X01;4B>fa;4B>fb;2B>dp"
"1XD1;1X01;4B>fa;4B>fb;2B>dp"
]
},
"curve_eis_para2": {
"type": "RIS",
"parameter": {
"fa": "EIS_FREQ[0]",
"fb": "EIS_FREQ[1]",
"dp": "EIS_DELAY",
"dc": "EIS_DC_BIAS",
"am": "EIS_AC_AMP",
"an": "EIS_AVERAGE_NUM",
"rt": "GENERAL_HS_RTIA",
"pp": "EIS_PPD",
"sp": "EIS_SCALE"
"fa": "FREQ[0]",
"fb": "FREQ[1]",
"dp": "DELAY",
"dc": "DC_BIAS",
"am": "AC_AMP",
"an": "AVERAGE_NUM",
"rt": "RTIA",
"pp": "PPD",
"sp": "SCALE"
},
"data": [
"1X12;1X02;2B>dc;2B>am;B>an;B>rt;2B>pp;B>sp"
]
},
"curve_eis_mode": {
"type": "RIS",
"data": [
"1X12;1XFF"
]
},
"curve_cf": {
"type": "RIS",
"parameter": {
"fa": "CF_FREQ",
"dp": "CF_DELAY",
"dc": "CF_DC_BIAS",
"am": "CF_AC_AMP",
"an": "CF_AVERAGE_NUM",
"rt": "GENERAL_HS_RTIA",
"pp": "CF_PPD",
"sp": "CF_SCALE"
},
"data": [
"1X13;1X01;4B>fa;4B>0;2B>dp"
]
},
"curve_cf_para2": {
"type": "RIS",
"parameter": {
"fa": "CF_FREQ",
"dp": "CF_DELAY",
"dc": "CF_DC_BIAS",
"am": "CF_AC_AMP",
"an": "CF_AVERAGE_NUM",
"rt": "GENERAL_HS_RTIA",
"pp": "CF_PPD",
"sp": "CF_SCALE"
},
"data": [
"1X13;1X02;2B>dc;2B>am;B>an;B>rt;2B>pp;B>sp"
]
},
"curve_cf_mode": {
"type": "RIS",
"data": [
"1X13;1XFF"
"1XD1;1X02;2B>dc;2B>am;B>an;B>rt;2B>pp;B>sp"
]
},
"curve_cv3": {
"type": "RIS",
"parameter": {
"va": "CV_E_INITIAL",
"vb": "CV_E1",
"vc": "CV_E2",
"ve": "CV_SCAN_RATE",
"va": "VOLT_INITIAL",
"vb": "VOLT_MAX",
"vc": "VOLT_MIN",
"ve": "Scan_Rate",
"vf": "SAMPLE_RATE",
"cn": "CYCLE_NUMBER"
},
"data": [
"1X09;1X01;2B>va;2B>vb;2B>vc;"
"1XD2;1X01;2B>va;2B>vb;2B>vc;"
]
},
"curve_cv3_para2": {
"type": "RIS",
"parameter": {
"va": "CV_E_INITIAL",
"vb": "CV_E1",
"vc": "CV_E2",
"ve": "CV_SCAN_RATE",
"va": "VOLT_INITIAL",
"vb": "VOLT_MAX",
"vc": "VOLT_MIN",
"ve": "Scan_Rate",
"vf": "SAMPLE_RATE",
"cn": "CYCLE_NUMBER"
},
"data": [
"1X09;1X02;4B>ve;2B>vf;2B>cn"
"1XD2;1X02;4B>ve;2B>vf;2B>cn"
]
},
"curve_ca": {
"curve_const_vscan": {
"type": "RIS",
"parameter": {
"va": "CA_VOLT",
"pa": "GENERAL_LP_RTIA",
"va": "VOLT_VSCAN",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE"
},
"data": [
"1X0B;",
"1XD3;",
"2B>va;",
"4b>pa;4b>0;",
"4b>0;4b>pd;",
"2B>pe"
]
},
"curve_rt": {
"type": "RIS",
"parameter": {
"va": "RT_VOLT_SET",
"pa": "GENERAL_LP_RTIA",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE"
},
"data": [
"X04;",
"2B>va;",
"4b>pa;4b>0;",
"4b>pa;4b>pb;",
"4b>0;4b>pd;",
"2B>pe"
]
@@ -609,33 +474,33 @@
"curve_vt": {
"type": "RIS",
"parameter": {
"pa": "GENERAL_LP_RTIA",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE",
"va": "VT_MEASURE_VIN_RANGE"
"va": "MEASURE_VIN_RANGE"
},
"data": [
"X05;",
"4b>pa;4b>0;",
"4b>pa;4b>pb;",
"4b>0;4b>pd;",
"2B>pe;",
"1B>va"
]
},
"set_para_RT_VOLT_SET": {
"type": "RIS",
"data": [
"XE2;X01;2B>RT_VOLT_SET"
]
},
"ble_instru_send": [
"ble_write",
"_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": [
@@ -2,207 +2,16 @@
"name": "Elite_TRIG_0.1",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite.*",
"local_name_pattern": "Trigger.*",
"major_product_number": 0,
"minor_product_number": 5,
"major_version_number": 1,
"minor_version_number": 0
},
"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
},
"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"
},
"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_DURATION": {
"description": "timer",
"record_meta": true,
"initial": 0,
"domain": [
"TIME_MAX"
],
"value": {
"expression": "VALUE"
}
},
"ACC_a_out0": {
"description": "Switch of analog current channel 1",
"record_meta": true,
@@ -332,14 +141,15 @@
"MODE": {
"description": "working mode",
"record_meta": true,
"initial": 3,
"value": [
"Analog Current Control (ACC)",
"Idle",
"Dev Mode",
"Trigger"
"Analog Current Control (ACC)"
]
},
"CHANNEL": {
"description": "delete it",
"record_meta": true,
@@ -398,8 +208,7 @@
{
"expression": "MODE",
"when": {
"0": "curve_acc",
"3": "trig_timer_mode"
"0": "curve_acc"
}
},
"_sync(True)",
@@ -424,16 +233,6 @@
"CIS_VOLT",
"_cdr('20X>ADC_VALUE_I')"
],
"ble_instru_send": [
"ble_write",
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "ALL",
"data": [
"255X>BLE_WRITE;"
]
},
"curve_acc": {
"type": "RIS",
"parameter": {
@@ -496,677 +295,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')"
]
}
}
-38
View File
@@ -1,38 +0,0 @@
#!/bin/bash
# install python module numpy
sudo apt-get install libatlas-base-dev
sudo apt-get install python3-numpy
# install python module SQLAlchemy
pip3 install SQLAlchemy
# create folder to save project logger
mkdir -p /home/pi/logger/project
# add column cycle in projects
sudo su -c "psql -d postgres -c \"ALTER TABLE projects ADD COLUMN IF NOT EXISTS cycle JSONB;\"" postgres
# add column project in recording_data_metas
sudo su -c "psql -d postgres -c \"ALTER TABLE recording_data_metas ADD COLUMN IF NOT EXISTS project Int4;\"" postgres
# remove default controller info
sudo su -c "psql -d postgres -c \"DELETE FROM controllers WHERE name='WTP_NONE';\"" postgres
# change table name from meta_project_info to project_metas
sudo su -c "psql -d postgres -c \"ALTER TABLE IF EXISTS meta_project_info RENAME TO project_metas;\"" postgres
# change table name from project_report to project_reports
sudo su -c "psql -d postgres -c \"ALTER TABLE IF EXISTS project_report RENAME TO project_reports;\"" postgres
# change table project_meta column cycle to type jsonb
sudo su -c "psql -d postgres -c \"ALTER TABLE project_metas ALTER COLUMN cycle type jsonb USING (cycle::jsonb);\"" postgres
# drop column calibration default
sudo su -c "psql -d postgres -c \"ALTER TABLE devices ALTER COLUMN calibration DROP DEFAULT;\"" postgres
# drop column calibration default
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