Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2edb6cb8a9 | |||
| 32bf5d3b11 | |||
| 66c7744d7e | |||
| 585e50bf5b | |||
| f643b6f194 | |||
| d4cec103ab | |||
| 23e66b265c | |||
| 741d6bcb9f | |||
| f53f9acccb |
@@ -0,0 +1,75 @@
|
||||
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, duplicate=False):
|
||||
with Session() as session:
|
||||
name = cls.check_name_duplicate(collection_name, parent, 0, duplicate=duplicate)
|
||||
if name == None:
|
||||
return session.query(Collection).filter(Collection.name == collection_name, Collection.parent == parent).first()
|
||||
else:
|
||||
collection = Collection(
|
||||
name = name,
|
||||
parent = parent,
|
||||
type= "folder",
|
||||
)
|
||||
session.add(collection)
|
||||
session.commit()
|
||||
session.refresh(collection)
|
||||
return collection
|
||||
|
||||
@classmethod
|
||||
def check_name_duplicate(cls, collection_name, parent, n, _session = None, duplicate=False):
|
||||
if _session == None:
|
||||
with Session() as session:
|
||||
result = session.query(Collection).filter(Collection.name == cls.generate_name(collection_name, n), Collection.parent == parent).first()
|
||||
if result is None:
|
||||
return cls.generate_name(collection_name, n)
|
||||
else:
|
||||
if duplicate == True:
|
||||
return None
|
||||
else:
|
||||
new_num = n + 1
|
||||
# new_name = f"{collection_name}({new_num})"
|
||||
return cls.check_name_duplicate(collection_name, parent, new_num, session)
|
||||
else:
|
||||
result = _session.query(Collection).filter(Collection.name == cls.generate_name(collection_name, n), Collection.parent == parent).first()
|
||||
if result is None:
|
||||
return cls.generate_name(collection_name, n)
|
||||
else:
|
||||
new_num = n + 1
|
||||
# new_name = f"{collection_name}({new_num})"
|
||||
return cls.check_name_duplicate(collection_name, parent, new_num, _session)
|
||||
|
||||
@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
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
from sqlalchemy import Table, Column, String, MetaData, ForeignKey, JSON
|
||||
from sqlalchemy.sql import select, func
|
||||
from sqlalchemy.types import Integer, BigInteger, String, Boolean, TIMESTAMP, Numeric
|
||||
from sqlalchemy.dialects.postgresql import JSONB
|
||||
|
||||
from .base import Base, Session
|
||||
|
||||
class RecordingDataMeta(Base):
|
||||
__tablename__ = "recording_data_metas"
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
path = Column(String(255))
|
||||
name = Column(String(255))
|
||||
parent = Column(JSONB)
|
||||
size = Column(String(255))
|
||||
time_duration = (String(255))
|
||||
raw_data = Column(JSONB)
|
||||
project = Column(Integer)
|
||||
deleted = Column(Boolean, default = False)
|
||||
created_at = Column(TIMESTAMP(timezone=True), server_default=func.now())
|
||||
updated_at = Column(TIMESTAMP(timezone=True), onupdate=func.now())
|
||||
|
||||
# def __repr__(self):
|
||||
# return f"User(id={self.id!r}, name={self.name!r}, fullname={self.task!r})"
|
||||
@@ -0,0 +1,24 @@
|
||||
from sqlalchemy import Table, Column, String, MetaData, ForeignKey, JSON
|
||||
from sqlalchemy.sql import select, func
|
||||
from sqlalchemy.types import Integer, BigInteger, String, Boolean, TIMESTAMP, Numeric
|
||||
from sqlalchemy.dialects.postgresql import JSONB
|
||||
|
||||
from .base import Base
|
||||
|
||||
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})"
|
||||
@@ -3,7 +3,7 @@ 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
|
||||
from .base import Base, Session
|
||||
|
||||
class MetaProjectInfo(Base):
|
||||
__tablename__ = "project_metas"
|
||||
@@ -17,5 +17,13 @@ class MetaProjectInfo(Base):
|
||||
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})"
|
||||
@@ -0,0 +1,88 @@
|
||||
from sqlalchemy import Table, Column, String, MetaData, ForeignKey, JSON
|
||||
from sqlalchemy.sql import select, func
|
||||
from sqlalchemy.types import Integer, BigInteger, String, Boolean, TIMESTAMP, Numeric, Text
|
||||
from sqlalchemy.dialects.postgresql import JSONB
|
||||
from biopro.db.base import Session
|
||||
|
||||
from .base import Base
|
||||
|
||||
# build a model class with a specific table name
|
||||
def get_raw_model(channel):
|
||||
tablename = str(channel) + '_recording_data_raws' # dynamic table name
|
||||
class_name = 'RECORDING_DATA_RAWS' # dynamic class name
|
||||
print('get_raw_model', tablename)
|
||||
|
||||
for mapper in Base.registry.mappers:
|
||||
cls = mapper.class_
|
||||
classname = cls.__name__
|
||||
tblname = cls.__tablename__
|
||||
print(cls, classname, tblname)
|
||||
if (classname == class_name):
|
||||
if tblname == tablename:
|
||||
return cls
|
||||
|
||||
Model = type(class_name, (RECORDING_DATA_RAWS,), {
|
||||
'__tablename__': tablename
|
||||
})
|
||||
return Model
|
||||
|
||||
|
||||
class RECORDING_DATA_RAWS(Base):
|
||||
__abstract__ = True
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
name = Column(String(255))
|
||||
parent = Column(Integer)
|
||||
size = Column(String(255))
|
||||
path = Column(JSONB)
|
||||
uuid = Column(String(255))
|
||||
serial_number = Column(String(255))
|
||||
data_format = Column(String(255))
|
||||
channel = Column(Integer)
|
||||
start_time = Column(String(255))
|
||||
end_time = Column(String(255))
|
||||
data = Column(Text)
|
||||
compressed = Column(Boolean)
|
||||
deleted = Column(Boolean)
|
||||
created_at = Column(TIMESTAMP(timezone=True), server_default=func.now())
|
||||
updated_at = Column(TIMESTAMP(timezone=True), onupdate=func.now())
|
||||
|
||||
# @classmethod
|
||||
# def create_subject_data(cls, subject_id, project, meta, data):
|
||||
# with Session() as session:
|
||||
# subject = Subject(
|
||||
# subject_id = subject_id,
|
||||
# project = project,
|
||||
# meta= meta,
|
||||
# data = data
|
||||
# )
|
||||
# session.add(subject)
|
||||
# session.commit()
|
||||
# return subject
|
||||
|
||||
# @classmethod
|
||||
# def check_name_duplicate(cls, collection_name, parent, n):
|
||||
# with Session() as session:
|
||||
# result = session.query(Collection).filter(Collection.name == cls.generate_name(collection_name, n), Collection.parent == parent).first()
|
||||
# if result is None:
|
||||
# return cls.generate_name(collection_name, n)
|
||||
# else:
|
||||
# new_num = n + 1
|
||||
# # new_name = f"{collection_name}({new_num})"
|
||||
# return cls.check_name_duplicate(collection_name, parent, new_num)
|
||||
|
||||
# @classmethod
|
||||
# def generate_name(cls, collection_name, n):
|
||||
# if n==0:
|
||||
# return collection_name
|
||||
# else:
|
||||
# return f"{collection_name}({n})"
|
||||
|
||||
# @classmethod
|
||||
# def find_data(cls, id):
|
||||
# with Session() as session:
|
||||
|
||||
# result = session.query(RECORDING_DATA_RAWS).first()
|
||||
# return result
|
||||
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
from sqlalchemy import Table, Column, String, MetaData, ForeignKey, JSON
|
||||
from sqlalchemy.sql import select, func
|
||||
from sqlalchemy.types import Integer, BigInteger, String, Boolean, TIMESTAMP, Numeric
|
||||
from sqlalchemy.dialects.postgresql import JSONB
|
||||
from biopro.db.base import Session
|
||||
|
||||
from .base import Base
|
||||
|
||||
class SubjectData(Base):
|
||||
__tablename__ = "subject_datas"
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
subject_id = Column(Integer)
|
||||
mode = Column(JSONB)
|
||||
data = Column(JSONB)
|
||||
user_auth = Column(JSONB)
|
||||
meta = Column(String(255))
|
||||
project = Column(String(255))
|
||||
deleted = Column(Boolean)
|
||||
created_at = Column(TIMESTAMP(timezone=True), server_default=func.now())
|
||||
updated_at = Column(TIMESTAMP(timezone=True), onupdate=func.now())
|
||||
|
||||
@classmethod
|
||||
def create_subject_data(cls, subject_id, project, meta, data):
|
||||
with Session() as session:
|
||||
subject = SubjectData(
|
||||
subject_id = subject_id,
|
||||
project = project,
|
||||
meta= meta,
|
||||
data = data
|
||||
)
|
||||
session.add(subject)
|
||||
session.commit()
|
||||
return subject
|
||||
|
||||
# @classmethod
|
||||
# def check_name_duplicate(cls, collection_name, parent, n):
|
||||
# with Session() as session:
|
||||
# result = session.query(Collection).filter(Collection.name == cls.generate_name(collection_name, n), Collection.parent == parent).first()
|
||||
# if result is None:
|
||||
# return cls.generate_name(collection_name, n)
|
||||
# else:
|
||||
# new_num = n + 1
|
||||
# # new_name = f"{collection_name}({new_num})"
|
||||
# return cls.check_name_duplicate(collection_name, parent, new_num)
|
||||
|
||||
# @classmethod
|
||||
# def generate_name(cls, collection_name, n):
|
||||
# if n==0:
|
||||
# return collection_name
|
||||
# else:
|
||||
# return f"{collection_name}({n})"
|
||||
|
||||
# @classmethod
|
||||
# def find_collection(cls, collection_name, parent):
|
||||
# with Session() as session:
|
||||
# result = session.query(Collection).filter(Collection.name == collection_name, Collection.parent == parent).first()
|
||||
# return result
|
||||
|
||||
|
||||
@@ -660,9 +660,9 @@ class CC2650Device(Device):
|
||||
break
|
||||
|
||||
elif device_type == 'EISZeroOne':
|
||||
i = 1
|
||||
i = 0
|
||||
request_times = 0
|
||||
while i <= 24:
|
||||
while i < 13:
|
||||
try:
|
||||
# send
|
||||
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, i)
|
||||
@@ -2177,12 +2177,23 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
|
||||
else:
|
||||
for dev in self._found:
|
||||
if dev.mac_address == address:
|
||||
|
||||
# send device mac and addrType
|
||||
try:
|
||||
# print('send_connect',bytes(connect_ins))
|
||||
self._cc2650.send("bytes", bytes(connect_ins))
|
||||
|
||||
except SerialTimeoutException as e:
|
||||
raise RecvTimeout('device CC2650 connect fail') from e
|
||||
|
||||
else:
|
||||
sleep(2)
|
||||
|
||||
# connection establish done?
|
||||
for retry_recv_ack in range(5):
|
||||
self._cc2650.send("bytes", bytes((0, 0, 0, 0)))
|
||||
|
||||
try:
|
||||
# send device mac and addrType
|
||||
self._cc2650.send("bytes", bytes(connect_ins))
|
||||
sleep(1.5)
|
||||
con_done = self._cc2650.recv_uart(timeout = 0.1)
|
||||
|
||||
except RecvTimeout:
|
||||
@@ -2191,7 +2202,6 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
|
||||
|
||||
# is the ack valid?
|
||||
if con_done is None:
|
||||
self.log_info("recv connection timeout, retry... ")
|
||||
continue
|
||||
|
||||
elif con_done[0] is 46 and \
|
||||
|
||||
+214
-299
@@ -884,54 +884,20 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
|
||||
def decode(self, data: bytes) -> Optional[RecordingData]:
|
||||
if len(data) < 18:
|
||||
return None
|
||||
|
||||
#/* Elite Notify data:
|
||||
# * +--------+----------+---------+---------+---------+-----------+-----------------+
|
||||
# * | id(1B) | time(4B) | ch1(4B) | ch2(4B) | ch3(4B) | cycle(2B) | finish_flag(1B) |
|
||||
# * | bat(4B) | notify#(1B) | ch4(4B) | ch5(4B) | ch6(4B) | __(3B) |
|
||||
# * +---------+-------------+---------+---------+---------+--------+
|
||||
# */
|
||||
#/*
|
||||
# * EliteADCControl(): use ADC plot, and send what data to controller
|
||||
# * +---------------------------+-----------+-----------+-----------+-----------+-----------+
|
||||
# * | MODE | ch1 | ch2 | ch3 | cycle | ch4 |
|
||||
# * +---------------------------+-----------+-----------+-----------+-----------+-----------+
|
||||
# * | CURVE_IV | Iin | Vout | Vin | | Vmon |
|
||||
# * | CURVE_IV_CY | Iin | Vout | Vin | v | Vmon |
|
||||
# * | CURVE_VO | Iin | Vout | Vin | | Vmon |
|
||||
# * | CURVE_RT | Iin | Vout | R | | Vmon |
|
||||
# * | CURVE_VT | Iin | Vin | | | |
|
||||
# * | CURVE_IT | Iin | Vin | Vout | | Vmon |
|
||||
# * | CURVE_CC | Iin | Vin | Vout | | Vmon |
|
||||
# * | CURVE_CP | Iin | Vout-Vin | Vout | | Vmon |
|
||||
# * | CURVE_CV | Iin | Vout-Vin | Vout | v | Vmon |
|
||||
# * | CURVE_LSV | Iin | Vout-Vin | Vout | | Vmon |
|
||||
# * | CURVE_CA | Iin | Vout-Vin | Vout | | Vmon |
|
||||
# * | CURVE_OCP | Iin | Vmon-Vin | Vin | | Vmon |
|
||||
# * | CURVE_UNI_PULSE | pul1_Iin | pul2_Iin | | | |
|
||||
# * | CURVE_DPV | c1&c2_avg | Vout-Vin | Vout | | Vmon |
|
||||
# * | CURVE_DPV_SMPRATE | Iin | Vout-Vin | Vout | | Vmon |
|
||||
# * | CURVE_DPV_ADVANCE | c1&c2_avg | Vout-Vin | Vout | | Vmon |
|
||||
# * | CURVE_DPV_ADVANCE_SMPRATE | Iin | Vout-Vin | Vout | | Vmon |
|
||||
# * +---------------------------+-----------+-----------+-----------+-----------+-----------+
|
||||
# *
|
||||
# * ps. c1_avg = pul1_Iin
|
||||
# * ps. c2_avg = pul2_Iin
|
||||
# */
|
||||
|
||||
voltage = 0
|
||||
mem_cnt = data[1]
|
||||
time_stamp: float = struct.unpack('<I', data[1+3:5+3])[0]
|
||||
ch1 = struct.unpack('<i', data[5+3:9+3])[0] # unit: nA
|
||||
ch2 = struct.unpack('<i', data[9+3:13+3])[0] # unit: uV
|
||||
ch3 = struct.unpack('<i', data[13+3:17+3])[0] # unit: mOm
|
||||
time_stamp: float = struct.unpack('<I', data[4:8])[0] # unit: ms 0x18030000
|
||||
current = struct.unpack('<i', data[8:12])[0] # unit: nA
|
||||
voltage = struct.unpack('<i', data[12:16])[0] # unit: uV
|
||||
impedance = struct.unpack('<i', data[16:20])[0] # unit: mOm
|
||||
|
||||
cycle_number = struct.unpack('<H', data[17+3:19+3])[0]
|
||||
finish_mode_falg = data[19+3]
|
||||
battery = struct.unpack('<i', data[20+3:24+3])[0]
|
||||
elite_notify_times = data[24+3]
|
||||
ch4 = struct.unpack('<i', data[25+3:29+3])[0]
|
||||
ch5 = struct.unpack('<i', data[29+3:33+3])[0]
|
||||
ch6 = struct.unpack('<i', data[33+3:37+3])[0]
|
||||
cycle_number = struct.unpack('<H', data[20:22])[0]
|
||||
finish_mode_falg = data[22]
|
||||
battery = struct.unpack('<i', data[23:27])[0]
|
||||
elite_notify_times = data[27]
|
||||
notify_one = struct.unpack('<i', data[28:32])[0]
|
||||
notify_two = struct.unpack('<i', data[32:36])[0]
|
||||
notify_three = struct.unpack('<i', data[36:40])[0]
|
||||
# self._show_data = True
|
||||
|
||||
mem_wrong_information = struct.unpack('<i', data[43:47])[0] # mem_wrong_information = green retry, green wrong, red retry, red wrong
|
||||
@@ -958,29 +924,25 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
|
||||
else:
|
||||
if self._show_data:
|
||||
print('|', time_stamp, '|', delta, '|', int(time_stamp * 1000 / 2),
|
||||
'|', ch1, '|', ch2, '|', ch3, '|', cycle_number,
|
||||
'|', ch4, '|', ch5, '|', ch6,
|
||||
'|', finishMode, '@', str(self.device), flush = True)
|
||||
'|', current, '|', voltage, '|', impedance, '|', cycle_number,
|
||||
'|', notify_one, '|', notify_two, '|', notify_three,
|
||||
'|', finishMode, '@', str(self.device))
|
||||
|
||||
# print('|', '{:10}'.format(time_stamp),
|
||||
# '|', '{:4}'.format(delta),
|
||||
# '|', '{:10}'.format(int(time_stamp * 1000 / 2)), #[usec]
|
||||
# '|', '{:10}'.format(ch1), #[nA]
|
||||
# '|', '{:10}'.format(ch2), #[uV]
|
||||
# '|', '{:10}'.format(ch3),
|
||||
# '|', '{:5}'.format(cycle_number),
|
||||
# '|', '{:10}'.format(ch4), #Voutin[uV]
|
||||
# '|', '{:10}'.format(ch5),
|
||||
# '|', '{:10}'.format(ch6),
|
||||
# '|', '{:5}'.format(battery), #[mV]
|
||||
# '|', '{:4}'.format(elite_notify_times),
|
||||
# '|', '{:1}'.format(finishMode),
|
||||
# '@', str(self.device), '|', flush = True)
|
||||
# print('|', '{:10}'.format(time_stamp),
|
||||
# '|', '{:4}'.format(delta),
|
||||
# '|', '{:10}'.format(int(time_stamp * 1000 / 2)),
|
||||
# '|', '{:10}'.format(current),
|
||||
# '|', '{:10}'.format(voltage),
|
||||
# '|', '{:10}'.format(impedance),
|
||||
# '|', '{:5}'.format(cycle_number),
|
||||
# '|', '{:1}'.format(finishMode),
|
||||
# '@', str(self.device), '|')
|
||||
|
||||
# print('|', '{:5}'.format(mem_wrong_information),
|
||||
# '|', '{:2}'.format(ram_num),
|
||||
# '|', '{:2}'.format(broken_flag),
|
||||
# '@', str(self.device), '|')
|
||||
# print('|', '{:5}'.format(mem_wrong_information),
|
||||
# '|', '{:2}'.format(ram_num),
|
||||
# '|', '{:2}'.format(broken_flag),
|
||||
# '@', str(self.device), '|')
|
||||
pass
|
||||
|
||||
if finishMode == True:
|
||||
print("finishMode full data:", list(data), datetime.now())
|
||||
@@ -989,13 +951,13 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
|
||||
self._mode_stop = 0
|
||||
|
||||
ret = RecordingData(self.device, int(time_stamp * 1000 / 2), 0)
|
||||
ret.append_data(0, ch1)
|
||||
ret.append_data(1, ch2)
|
||||
ret.append_data(2, ch3)
|
||||
ret.append_data(0, current)
|
||||
ret.append_data(1, voltage)
|
||||
ret.append_data(2, impedance)
|
||||
ret.append_data(3, cycle_number)
|
||||
ret.append_data(4, ch4)
|
||||
ret.append_data(5, ch5)
|
||||
ret.append_data(6, ch6)
|
||||
ret.append_data(4, notify_one)
|
||||
ret.append_data(5, notify_two)
|
||||
ret.append_data(6, notify_three)
|
||||
# ret.append_data(4, battery)
|
||||
# ret.append_data(5, elite_notify_times)
|
||||
# ret.append_data(6, mem_cnt)
|
||||
@@ -1413,204 +1375,128 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
|
||||
@staticmethod
|
||||
def _decode_cali_coeff(cali_coeff: bytes) -> Optional[List[Tuple[int, int]]]:
|
||||
#####################################################
|
||||
# phase_coeff/phase_offset/hsrtia_a/hsrtia_b/rolloff
|
||||
if cali_coeff != b'':
|
||||
cali_table = []
|
||||
hsrtia_a = []
|
||||
hsrtia_b = []
|
||||
hsrtia_c = []
|
||||
hsrtia_d = []
|
||||
phase_coeff = []
|
||||
phase_offset = []
|
||||
|
||||
# phase_coeff = [[0]*4 for i in range(4)]
|
||||
# phase_offset = [[0]*4 for i in range(4)]
|
||||
|
||||
phase_coeff = numpy.zeros([4, 4], dtype = int)
|
||||
phase_offset = numpy.zeros([4, 4], dtype = int)
|
||||
|
||||
########################################
|
||||
# phase_coeff
|
||||
# [[gain0, g1, g2, g3] ----->最高頻
|
||||
# [gain0, g1, g2, g3] ----->中頻
|
||||
# [gain0, g1, g2, g3] ----->低頻
|
||||
# [gain0, g1, g2, g3] ----->最低頻
|
||||
# ]
|
||||
#####################################################
|
||||
print('cali_coeff=', cali_coeff)
|
||||
if cali_coeff != b'':
|
||||
cali_table = []
|
||||
hsrtia_a = numpy.zeros([4, 8], dtype = int) #hsrtia_a[freq][gain]
|
||||
hsrtia_b = numpy.zeros([4, 8], dtype = numpy.int64) #hsrtia_b[freq][gain]
|
||||
rolloff = numpy.zeros([4, 8], dtype = int) #rolloff[freq][gain]
|
||||
phase_coeff = numpy.zeros([4, 8], dtype = int) #phase_coeff[freq][gain]
|
||||
phase_offset = numpy.zeros([4, 8], dtype = int) #phase_offset[freq][gain]
|
||||
cis_data_len = 20
|
||||
#######################################
|
||||
|
||||
#gain=0
|
||||
cis_cali_packet = 1
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
hsrtia_a[0][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
hsrtia_b[0][0] = struct.unpack('>q', cali_coeff[index+5:index+13])[0]
|
||||
rolloff[0][0] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
# print('cali_coeff', cali_coeff)
|
||||
cutoff_freq = struct.unpack('>I', cali_coeff[1:5])[0] * 100 #4
|
||||
# temp = struct.unpack('>B', cali_coeff[5:6])[0] #1
|
||||
# hsrtia_200r = struct.unpack('>B', cali_coeff[6:7])[0] #1
|
||||
# hsrtia_5k = struct.unpack('>H', cali_coeff[7:9])[0] #2
|
||||
# hsrtia_20k = struct.unpack('>H', cali_coeff[6:8])[0] #2
|
||||
# hsrtia_160k = struct.unpack('>I', cali_coeff[8:12])[0] #4
|
||||
|
||||
cis_cali_packet = 2
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[0][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[0][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[1][0] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[1][0] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
index = 20
|
||||
g = 0
|
||||
phase_coeff[0][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[0][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[1][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[1][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
index = 40
|
||||
g = 0
|
||||
phase_coeff[2][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[2][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[3][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[3][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#Lv[0] 160k
|
||||
index = 60
|
||||
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]/1e8)
|
||||
hsrtia_b.append(struct.unpack('>i', cali_coeff[index+5:index+9])[0]/1e8)
|
||||
hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0])
|
||||
|
||||
cis_cali_packet = 3
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[2][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[2][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[3][0] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[3][0] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
#Lv[1] 20k
|
||||
index = 80
|
||||
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]/1e8)
|
||||
hsrtia_b.append(struct.unpack('>i', cali_coeff[index+5:index+9])[0]/1e8)
|
||||
hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0])
|
||||
|
||||
#gain=1
|
||||
cis_cali_packet = 4
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
hsrtia_a[0][1] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
hsrtia_b[0][1] = struct.unpack('>q', cali_coeff[index+5:index+13])[0]
|
||||
rolloff[0][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
#Lv[2] 5k
|
||||
index = 100
|
||||
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]/1e8)
|
||||
hsrtia_b.append(struct.unpack('>i', cali_coeff[index+5:index+9])[0]/1e8)
|
||||
hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0])
|
||||
|
||||
cis_cali_packet = 5
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[0][1] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[0][1] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[1][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[1][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
#Lv[3] 200R
|
||||
index = 120
|
||||
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]/1e8)
|
||||
hsrtia_b.append(struct.unpack('>i', cali_coeff[index+5:index+9])[0]/1e8)
|
||||
hsrtia_c.append(struct.unpack('>i', cali_coeff[index+9:index+13])[0])
|
||||
|
||||
cis_cali_packet = 6
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[2][1] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[2][1] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[3][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[3][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
index = 140
|
||||
g = 1
|
||||
phase_coeff[0][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[0][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[1][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[1][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
index = 160
|
||||
g = 1
|
||||
phase_coeff[2][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[2][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[3][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[3][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
index = 180
|
||||
g = 2
|
||||
phase_coeff[0][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[0][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[1][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[1][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
index = 200
|
||||
g = 2
|
||||
phase_coeff[2][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[2][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[3][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[3][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
index = 220
|
||||
g = 3
|
||||
phase_coeff[0][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[0][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[1][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[1][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
index = 240
|
||||
g = 3
|
||||
phase_coeff[2][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[2][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[3][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[3][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#gain=2
|
||||
cis_cali_packet = 7
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
hsrtia_a[0][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
hsrtia_b[0][2] = struct.unpack('>q', cali_coeff[index+5:index+13])[0]
|
||||
rolloff[0][2] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 8
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[0][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[0][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[1][2] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[1][2] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 9
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[2][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[2][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[3][2] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[3][2] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#gain=3
|
||||
cis_cali_packet = 10
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
hsrtia_a[0][3] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
hsrtia_b[0][3] = struct.unpack('>q', cali_coeff[index+5:index+13])[0]
|
||||
rolloff[0][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 11
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[0][3] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[0][3] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[1][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[1][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 12
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[2][3] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[2][3] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[3][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[3][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#gain=4
|
||||
cis_cali_packet = 13
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
hsrtia_a[0][4] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
hsrtia_b[0][4] = struct.unpack('>q', cali_coeff[index+5:index+13])[0]
|
||||
rolloff[0][4] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 14
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[0][4] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[0][4] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[1][4] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[1][4] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 15
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[2][4] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[2][4] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[3][4] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[3][4] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#gain=5
|
||||
cis_cali_packet = 16
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
hsrtia_a[0][5] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
hsrtia_b[0][5] = struct.unpack('>q', cali_coeff[index+5:index+13])[0]
|
||||
rolloff[0][5] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 17
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[0][5] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[0][5] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[1][5] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[1][5] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 18
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[2][5] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[2][5] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[3][5] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[3][5] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#gain=6
|
||||
cis_cali_packet = 19
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
hsrtia_a[0][6] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
hsrtia_b[0][6] = struct.unpack('>q', cali_coeff[index+5:index+13])[0]
|
||||
rolloff[0][6] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 20
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[0][6] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[0][6] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[1][6] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[1][6] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 21
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[2][6] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[2][6] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[3][6] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[3][6] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#gain=7
|
||||
cis_cali_packet = 22
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
hsrtia_a[0][7] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
hsrtia_b[0][7] = struct.unpack('>q', cali_coeff[index+5:index+13])[0]
|
||||
rolloff[0][7] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 23
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[0][7] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[0][7] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[1][7] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[1][7] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 24
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
phase_coeff[2][7] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[2][7] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[3][7] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[3][7] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
print('hsrtia_a')
|
||||
print(hsrtia_a)
|
||||
print('hsrtia_b')
|
||||
print(hsrtia_b)
|
||||
print('rolloff')
|
||||
print(rolloff)
|
||||
print('cutoff_freq', cutoff_freq)
|
||||
print('hsrtia_a', hsrtia_a)
|
||||
print('hsrtia_b', hsrtia_b)
|
||||
print('hsrtia_c', hsrtia_c)
|
||||
print('phase_coeff')
|
||||
print(phase_coeff)
|
||||
print('phase_offset')
|
||||
print(phase_offset)
|
||||
|
||||
cali_table.append((phase_coeff, phase_offset, hsrtia_a, hsrtia_b, rolloff))
|
||||
cali_table.append((cutoff_freq, phase_coeff, phase_offset, hsrtia_a, hsrtia_b, hsrtia_c, hsrtia_d))
|
||||
|
||||
return cali_table
|
||||
else:
|
||||
@@ -1634,16 +1520,16 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
if len(data) < 18:
|
||||
return None
|
||||
|
||||
ch1 = struct.unpack('>i', data[1+3:5+3])[0]
|
||||
ch2 = struct.unpack('>i', data[5+3:9+3])[0]
|
||||
ch3 = struct.unpack('>i', data[9+3:13+3])[0]
|
||||
ch1 = struct.unpack('>i', data[1+3:5+3])[0] # unit: 1/1000 nA
|
||||
ch2 = struct.unpack('>i', data[5+3:9+3])[0] # unit: mV
|
||||
ch3 = struct.unpack('>i', data[9+3:13+3])[0] # unit: kOm
|
||||
time_stamp: float = struct.unpack('<I', data[13+3:17+3])[0] # unit: ms
|
||||
cycle_number = struct.unpack('>H', data[17+3:19+3])[0]
|
||||
d19 = data[19+3]
|
||||
gain = data[20+3]
|
||||
finishMode = (d19 & 0x80) >> 7
|
||||
ch4 = struct.unpack('<i', data[21+3:25+3])[0]
|
||||
|
||||
finishMode = (d19 & 0x80) >> 7
|
||||
ch4 = struct.unpack('<i', data[21+3:25+3])[0] # Amp[uV]
|
||||
|
||||
notify_one = struct.unpack('<i', data[25+3:29+3])[0]
|
||||
notify_two = struct.unpack('<i', data[29+3:33+3])[0]
|
||||
notify_three = struct.unpack('<i', data[33+3:37+3])[0]
|
||||
@@ -1665,41 +1551,64 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
return None
|
||||
else:
|
||||
if self.cali_coeff is not None and (self._mode == 0 or self._mode == 5):
|
||||
phase_coeff, phase_offset, hsrtia_a, hsrtia_b, rolloff = self.cali_coeff[0]
|
||||
hsrtia_a = []
|
||||
hsrtia_b = []
|
||||
hsrtia_c = []
|
||||
hsrtia_d = []
|
||||
cutoff_freq, phase_coeff, phase_offset, hsrtia_a, hsrtia_b, hsrtia_c, hsrtia_d = self.cali_coeff[0]
|
||||
|
||||
if (self._mode == 0 or self._mode == 5):
|
||||
|
||||
img = ch1 #img[ohm]
|
||||
real = ch2 #real[ohm]
|
||||
freq = ch3 #freq[10mHz]
|
||||
img = ch1
|
||||
real = ch2
|
||||
freq = ch3
|
||||
fre_idx = 0
|
||||
voltage_amp = round(ch4 / 1000) #ch4=Amp[uV] #voltage_amp[mV]
|
||||
rolloff_cali = rolloff[0][gain]
|
||||
voltage_amp = round(ch4 / 1000) # Amp[mV]
|
||||
|
||||
# rolloff_cali = cutoff_freq/1e5
|
||||
rolloff_cali = hsrtia_c[gain]
|
||||
voltage_mag = math.sqrt(img ** 2 + real ** 2) * (1 + freq ** 2 / rolloff_cali ** 2 / 1e4)
|
||||
current = (voltage_mag ** 2 * hsrtia_a[0][gain] + voltage_mag * hsrtia_b[0][gain]) / 1e8 #current[nA]
|
||||
|
||||
# if (gain == 3):
|
||||
# current = hsrtia_a[gain] * math.exp(hsrtia_b[gain] * voltage_mag) + hsrtia_c[gain] * math.exp(hsrtia_d[gain] * voltage_mag)
|
||||
# else:
|
||||
|
||||
current = voltage_mag ** 2 * hsrtia_a[gain] + voltage_mag * hsrtia_b[gain]
|
||||
# current = voltage_mag ** 2 * hsrtia_a[gain] + voltage_mag * hsrtia_b[gain] + hsrtia_c[gain]
|
||||
|
||||
|
||||
if (current != 0):
|
||||
# impedance[mOhm] = voltage_amp[mV] * 1000000 / 1.414213 / current[nA] #RMS=amp*SQRT(2), SQRT(2)=1.414213
|
||||
# impedance[mOhm] = voltage_amp[mv] * 1000000 / 1.414213 / current[nA] #RMS=amp*SQRT(2), SQRT(2)=1.414213
|
||||
impedance = voltage_amp * 707106.78 / current
|
||||
else:
|
||||
impedance = 0
|
||||
|
||||
raw_phase = math.atan2(img , real) * 180 / math.pi
|
||||
|
||||
if (freq >= 1000000): #10000Hz
|
||||
if (freq >= 1000000): # 10000 Hz
|
||||
fre_idx = 0
|
||||
elif (freq >= 10000): #100Hz
|
||||
elif (freq >= 10000): # 100 Hz
|
||||
fre_idx = 1
|
||||
elif (freq >= 1000): #10Hz
|
||||
elif (freq >= 1000): # 10 Hz
|
||||
fre_idx = 2
|
||||
elif (freq >= 1): #0.01Hz
|
||||
elif (freq >= 1): # 0.01 Hz
|
||||
fre_idx = 3
|
||||
|
||||
ideal_raw_phase = phase_coeff[gain][fre_idx] /1e10 * freq + phase_offset[gain][fre_idx] / 1e6
|
||||
phase = raw_phase - ideal_raw_phase
|
||||
phase = phase % 180 if phase % 180<=90 else phase % 180-180
|
||||
|
||||
# last_phase_to90 = self._last_phase % 180 if self._last_phase % 180<=90 else self._last_phase % 180-180
|
||||
# diff = phase - last_phase_to90
|
||||
|
||||
# if (self._first_phase_flag):
|
||||
# # self._last_phase = phase
|
||||
# self._first_phase_flag = 0
|
||||
# elif (abs(diff) >= 90):
|
||||
# phase = self._last_phase + diff + (180 if diff<0 else-180)
|
||||
# else:
|
||||
# phase = self._last_phase + diff
|
||||
# self._last_phase = phase
|
||||
|
||||
imag_after_cal = impedance * math.sin(phase * math.pi / 180)
|
||||
real_after_cal = impedance * math.cos(phase * math.pi / 180)
|
||||
|
||||
@@ -1707,17 +1616,17 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
if (self._mode == 0 or self._mode == 5):
|
||||
print('|', '{:10}'.format(time_stamp),
|
||||
'|', '{:5}'.format(delta),
|
||||
'|', '{:5}'.format(img),
|
||||
'|', '{:5}'.format(real),
|
||||
'|', '{:9}'.format(freq*10), '[mHz]',
|
||||
'|', '{:5}'.format(cycle_number),
|
||||
'|', '{:5}'.format(round(imag_after_cal)), '[Ohm]', #Z_imag[Ohm]
|
||||
'|', '{:5}'.format(round(real_after_cal)), '[Ohm]', #Z_real[Ohm]
|
||||
'|', '{:5}'.format(round(impedance)), '[mOhm]',
|
||||
'|', '{:5}'.format(round(phase*1000)), '[mdegree]',
|
||||
'|', '{:10}'.format(round(current)), '[nA]',
|
||||
'|', '{:1}'.format(gain),
|
||||
'|', '{:1}'.format(finishMode),
|
||||
'|', '{:5}'.format(ch1), #raw_img
|
||||
'|', '{:5}'.format(ch2), #raw_real
|
||||
'|', '{:8}'.format(ch3 * 10), '[mHz]', #Frequency [mHz]
|
||||
'|', '{:5}'.format(cycle_number), #cycle
|
||||
'|', '{:5}'.format(round(imag_after_cal)), '[Ohm]', #Z_imag [Ohm]
|
||||
'|', '{:5}'.format(round(real_after_cal)), '[Ohm]', #Z_real [Ohm]
|
||||
'|', '{:5}'.format(round(impedance)), '[Ohm]', #Impedance [Ohm]
|
||||
'|', '{:5}'.format(round(phase*1000)), '[mdegree]', #Phase [millidegree]
|
||||
'|', '{:5}'.format(round(current)), '[nA]', #Current [nA]
|
||||
'|', '{:1}'.format(gain), #gain
|
||||
'|', '{:1}'.format(finishMode), #finishMode
|
||||
'@', str(self.device), '|', flush = True)
|
||||
|
||||
print('|', '{:10}'.format(time_stamp),
|
||||
@@ -1725,7 +1634,7 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
'|', '{:5}'.format(notify_one),
|
||||
'|', '{:5}'.format(notify_two),
|
||||
'|', '{:5}'.format(notify_three),
|
||||
'|', '{:5}'.format(voltage_amp), '[mV]',
|
||||
'|', '{:5}'.format(voltage_amp), #amp[mV]
|
||||
'|', flush = True)
|
||||
pass
|
||||
else:
|
||||
@@ -1747,30 +1656,36 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
self._mode_stop = 0
|
||||
|
||||
ret = RecordingData(self.device, int(time_stamp * 1000 / 2), 0)
|
||||
if self._mode == 0 or self._mode == 5: #EIS/CF Mode
|
||||
ret.append_data(0, img)
|
||||
ret.append_data(1, real)
|
||||
ret.append_data(2, freq * 10) #[mHz]
|
||||
ret.append_data(3, cycle_number)
|
||||
if self._mode == 0 or self._mode == 5: #EIS Mode
|
||||
ret.append_data(0, ch1) #raw_img
|
||||
ret.append_data(1, ch2) #raw_real
|
||||
ret.append_data(2, ch3 * 10) #Frequency [mHz]
|
||||
ret.append_data(3, cycle_number) #cycle
|
||||
ret.append_data(4, round(imag_after_cal)) #Z_imag [Ohm]
|
||||
ret.append_data(5, round(real_after_cal)) #Z_real [Ohm]
|
||||
ret.append_data(6, round(impedance)) #[mOhm]
|
||||
ret.append_data(7, round(phase*1000)) #[millidegree]
|
||||
ret.append_data(8, round(current)) #[nA]
|
||||
ret.append_data(9, gain)
|
||||
ret.append_data(6, round(impedance)) #Impedance [Ohm]
|
||||
ret.append_data(7, round(phase*1000)) #Phase [millidegree]
|
||||
ret.append_data(8, round(current)) #Current [nA]
|
||||
ret.append_data(9, gain) #gain
|
||||
|
||||
#debug data
|
||||
ret.append_data(10, notify_one)
|
||||
ret.append_data(11, notify_two)
|
||||
ret.append_data(12, notify_three)
|
||||
ret.append_data(13, voltage_amp) #mV
|
||||
ret.append_data(13, voltage_amp) #amp[mV]
|
||||
|
||||
|
||||
|
||||
else: #CV Mode
|
||||
ret.append_data(0, ch1) #Iin [nA]?
|
||||
ret.append_data(1, ch2) #Vset [nV]?
|
||||
ret.append_data(2, ch3) #Vout [nV]?
|
||||
else:
|
||||
if (self._mode == 1 or self._mode == 2 or self._mode == 3):
|
||||
ch1 = ch1 * (-1)
|
||||
if (self._mode == 4):
|
||||
ch1 = ch1 * (-1)
|
||||
ch3 = ch3 * (-1)
|
||||
#CV Mode
|
||||
ret.append_data(0, ch1) #Iin [nA]
|
||||
ret.append_data(1, ch2) #Vset [nV]
|
||||
ret.append_data(2, ch3) #Vout [nV]
|
||||
ret.append_data(3, cycle_number)
|
||||
|
||||
if cycle_number != self._cycle_number:
|
||||
|
||||
@@ -1292,6 +1292,9 @@ class CompletedDevice(Device):
|
||||
|
||||
def central_version_get(self) -> Optional[list]:
|
||||
return self._device.central_version_get()
|
||||
|
||||
def save_data_to_subject(self, project, meta, device, subject_id):
|
||||
self._master._handler.save_data_to_subject(project, meta, device, subject_id)
|
||||
|
||||
# utility method
|
||||
|
||||
|
||||
@@ -15,6 +15,9 @@ 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',
|
||||
}
|
||||
@@ -46,6 +49,9 @@ class Project(threading.Thread):
|
||||
|
||||
self._count = 1 #流水號
|
||||
|
||||
self._project_meta_id = -1
|
||||
self._subject = []
|
||||
|
||||
self.log_verbose = log_verbose
|
||||
self._logger = logging.getLogger('project')
|
||||
self._logger.setLevel('DEBUG')
|
||||
@@ -60,6 +66,17 @@ class Project(threading.Thread):
|
||||
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
|
||||
folder_name_duplicate = False
|
||||
if len(self._subject) > 0:
|
||||
folder_name_duplicate = True
|
||||
collection = Collection.create_collection(self.name, parent, folder_name_duplicate)
|
||||
self.setup_collection(collection)
|
||||
|
||||
def setup_project(self, project):
|
||||
for (key, value) in project.items():
|
||||
@@ -79,6 +96,9 @@ class Project(threading.Thread):
|
||||
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:
|
||||
@@ -87,6 +107,22 @@ class Project(threading.Thread):
|
||||
@id.setter
|
||||
def id(self, new_id):
|
||||
self._id = new_id
|
||||
|
||||
@property
|
||||
def project_meta_id(self) -> int:
|
||||
return self._project_meta_id
|
||||
|
||||
@project_meta_id.setter
|
||||
def project_meta_id(self, new_project_meta_id):
|
||||
self._project_meta_id = new_project_meta_id
|
||||
|
||||
@property
|
||||
def subject(self) -> object:
|
||||
return self._subject
|
||||
|
||||
@subject.setter
|
||||
def subject(self, new_subject):
|
||||
self._subject = new_subject
|
||||
|
||||
@property
|
||||
def uuid(self) -> str:
|
||||
@@ -264,6 +300,9 @@ class Project(threading.Thread):
|
||||
args = list(map(lambda arg: task_info[arg], instruction['arguments']))
|
||||
target=getattr(device, instruction['method'])(*args)
|
||||
print('instruction 2', device, instruction, datetime.now())
|
||||
if (action.type == 'stop'):
|
||||
if (len(self._subject) > 0):
|
||||
target=getattr(device, "save_data_to_subject")(self.id, self.project_meta_id, device, self._subject[0])
|
||||
if action.type == 'start':
|
||||
self._count += 1
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ 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
|
||||
|
||||
@@ -67,6 +68,13 @@ class TaskManager():
|
||||
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]
|
||||
@@ -162,4 +170,12 @@ class TaskManager():
|
||||
|
||||
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]}, False)
|
||||
task.parent = {"folder": [collection.id]}
|
||||
else:
|
||||
task.parent = {"folder": [parent.id]}
|
||||
@@ -362,14 +362,14 @@ class DataServer(SocketServer, DataAPI):
|
||||
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 = result[1]
|
||||
# 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)
|
||||
|
||||
@@ -222,7 +222,8 @@ class DataBaseProcess(Process):
|
||||
|
||||
try:
|
||||
sql_cursor.execute(sql_str, sql_set)
|
||||
except:
|
||||
except BaseException as e:
|
||||
print('meta create error', e)
|
||||
self._psql_conn.commit()
|
||||
sql_cursor.close()
|
||||
self._queue_error.put(device_id)
|
||||
@@ -249,7 +250,8 @@ class DataBaseProcess(Process):
|
||||
|
||||
try:
|
||||
sql_cursor.execute(sql_str, sql_set)
|
||||
except:
|
||||
except BaseException as e:
|
||||
print('meta update error', e)
|
||||
self._psql_conn.commit()
|
||||
sql_cursor.close()
|
||||
self._queue_error.put(device_id)
|
||||
|
||||
@@ -35,7 +35,11 @@ from biopro.project.project_manager import ProjectManager
|
||||
from biopro.db.base import Base, Session, engine
|
||||
from biopro.db.project_report import ProjectReport
|
||||
from biopro.db.project_meta import MetaProjectInfo
|
||||
|
||||
# from biopro.db.device import Device
|
||||
from biopro.db.recording_data import get_raw_model
|
||||
from biopro.db.subject_data import SubjectData
|
||||
from biopro.db.meta import RecordingDataMeta
|
||||
import random
|
||||
|
||||
_RUNTIME_COMPILE = False
|
||||
|
||||
@@ -328,6 +332,18 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
finally:
|
||||
self.led_thread.set_state(LED.AVAILABLE)
|
||||
|
||||
# version_info = [0, 2, 1, 7, 23, 2]
|
||||
# serial_number = DeviceSerialNumber(version_info[0],
|
||||
# version_info[1],
|
||||
# version_info[2],
|
||||
# version_info[3],
|
||||
# version_info[4],
|
||||
# version_info[5])
|
||||
# response = DeviceResponseInfo('Elite-EDC', serial_number, (164, 218, 50, 212, 231, 12), addr_type=0)
|
||||
# print('setup done', response)
|
||||
# ret = self.device_manager.connect(response)
|
||||
# print('ret', ret)
|
||||
|
||||
def _setup_get_available_channel(self) -> Optional[List[int]]:
|
||||
client = self.data_server.client()
|
||||
|
||||
@@ -557,8 +573,15 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
response = content
|
||||
else:
|
||||
response = to_device_info(content)
|
||||
|
||||
try:
|
||||
# version_info = [0, 2, 1, 7, 23, 2]
|
||||
# serial_number = DeviceSerialNumber(version_info[0],
|
||||
# version_info[1],
|
||||
# version_info[2],
|
||||
# version_info[3],
|
||||
# version_info[4],
|
||||
# version_info[5])
|
||||
# response = DeviceResponseInfo('Elite-EDC', serial_number, (164, 218, 50, 212, 231, 12))
|
||||
ret = self.device_manager.connect(response)
|
||||
except DeviceInstructionError as e:
|
||||
'''when device reset fail error'''
|
||||
@@ -1102,6 +1125,7 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
|
||||
client = self.data_server.client()
|
||||
project = None
|
||||
_project_meta_id = None
|
||||
if client is not None:
|
||||
info = self.file_manager.use(device)
|
||||
|
||||
@@ -1114,10 +1138,13 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
info = self.file_manager.save(device, filename)
|
||||
|
||||
if device.occupied_by_project != None:
|
||||
project = json.dumps(self.project_manager.get(device.occupied_by_project).info_pass_data_server())
|
||||
|
||||
project = self.project_manager.get(device.occupied_by_project).info_pass_data_server()
|
||||
_project_meta_id = MetaProjectInfo.create_project_meta(project)
|
||||
new_project = self.project_manager.get(device.occupied_by_project)
|
||||
new_project.project_meta_id = _project_meta_id
|
||||
|
||||
with client:
|
||||
client.update_device_configuration(device, info.meta_file, value, project)
|
||||
client.update_device_configuration(device, info.meta_file, value, _project_meta_id)
|
||||
|
||||
def _device_set_disable_cache(self, device: CompletedDevice, disable):
|
||||
if disable:
|
||||
@@ -1347,6 +1374,57 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
} for pkg in PipPackage.list()]
|
||||
|
||||
return ret
|
||||
|
||||
def save_data_to_subject(self, project, meta, device, subject):
|
||||
mode = device.get_parameter('MODE')
|
||||
library = device.library_name
|
||||
device = {
|
||||
"library": library,
|
||||
"mode": mode
|
||||
}
|
||||
|
||||
# "pattern": {
|
||||
# "id": number,
|
||||
# "name": string,
|
||||
# "parameter": object,
|
||||
# },
|
||||
# "data": {
|
||||
# "id": list[int],
|
||||
# "channel: list[int]
|
||||
# }
|
||||
|
||||
with Session() as session:
|
||||
meta_result = session.query(RecordingDataMeta).filter(RecordingDataMeta.project == meta).first()
|
||||
self.mqtt_thread.publish('', json.dumps({
|
||||
"pattern": {
|
||||
"id": 4,
|
||||
},
|
||||
"data": {
|
||||
"id": [meta_result.id],
|
||||
"channel": ['Time', 6]
|
||||
},
|
||||
"others": {
|
||||
"subject": subject,
|
||||
"device": device,
|
||||
"project": project,
|
||||
"project_meta": meta,
|
||||
}
|
||||
}), analysis= True)
|
||||
# result = session.query(recording_raws).order_by(recording_raws.id.desc()).first()
|
||||
# value = result.data.split(' ')[1:-1:2]
|
||||
# _value = list(map(int, value))
|
||||
# sum_value = sum(_value)
|
||||
# average_value = sum_value / len(_value)
|
||||
# subject_data = SubjectData(
|
||||
# subject_id= subject['id'],
|
||||
# project = project,
|
||||
# meta = meta,
|
||||
# mode= device,
|
||||
# data= average_value
|
||||
# )
|
||||
# # Execute the update query
|
||||
# session.add(subject_data)
|
||||
# session.commit()
|
||||
|
||||
def _hardware_send_test_hardware(self, section: Optional[str] = None) -> Dict[str, Any]:
|
||||
if section is not None:
|
||||
@@ -1391,7 +1469,6 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
if client is not None:
|
||||
with client:
|
||||
client.show_data(device)
|
||||
|
||||
class _RandomCrashThread(ServerThread):
|
||||
def __init__(self):
|
||||
super().__init__('Crash')
|
||||
|
||||
@@ -170,9 +170,11 @@ class MqttThread(threading.Thread):
|
||||
self.sleep(3)
|
||||
self._mqtt_client_local.reconnect()
|
||||
|
||||
def publish(self, topic: str, payload: str, inter = False, qos = 2):
|
||||
def publish(self, topic: str, payload: str, inter = False, analysis=False, qos = 2):
|
||||
if inter:
|
||||
_topic = self.__controller_ID + '_user'
|
||||
elif analysis:
|
||||
_topic = self.__controller_ID + '_data_analysis/get_analysis_data'
|
||||
else:
|
||||
_topic = self.__controller_ID + '/' + topic
|
||||
if self._mqtt_client_local is not None:
|
||||
|
||||
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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "Elite_EDC_1.5re",
|
||||
"name": "Elite_EDC_1.5r2",
|
||||
"version": "1.2.30",
|
||||
"match_rule": {
|
||||
"local_name_pattern": "Elite.*",
|
||||
"major_product_number": 0,
|
||||
"minor_product_number": 2,
|
||||
"major_version_number": 1,
|
||||
"minor_version_number": 7
|
||||
"minor_version_number": 8
|
||||
},
|
||||
"constant": {
|
||||
"TIME_MAX": 100000,
|
||||
@@ -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",
|
||||
|
||||
@@ -820,7 +820,7 @@
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"CA_VOLT": {
|
||||
"VOLT_VSCAN": {
|
||||
"description": "Voltage of VScan",
|
||||
"record_meta": true,
|
||||
"initial": 25000,
|
||||
@@ -1029,7 +1029,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 +1366,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",
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1
|
||||
],
|
||||
"domain": {
|
||||
@@ -99,8 +98,7 @@
|
||||
"V-T Graph",
|
||||
"R-T Graph",
|
||||
"EIS constant frequency",
|
||||
"Dev Mode",
|
||||
"Idle"
|
||||
"Dev Mode"
|
||||
]
|
||||
},
|
||||
"GENERAL_HS_RTIA": {
|
||||
@@ -143,7 +141,7 @@
|
||||
"EIS_AC_AMP": {
|
||||
"description": "AC Amplitude",
|
||||
"record_meta": true,
|
||||
"initial": 26,
|
||||
"initial": 25,
|
||||
"domain": [
|
||||
2048
|
||||
]
|
||||
@@ -215,7 +213,7 @@
|
||||
"CF_AC_AMP": {
|
||||
"description": "AC Amplitude",
|
||||
"record_meta": true,
|
||||
"initial": 26,
|
||||
"initial": 25,
|
||||
"domain": [
|
||||
2048
|
||||
]
|
||||
@@ -372,14 +370,10 @@
|
||||
{
|
||||
"expression": "MODE",
|
||||
"when": {
|
||||
"7": "idle",
|
||||
"*": "start_data"
|
||||
}
|
||||
}
|
||||
],
|
||||
"idle": [
|
||||
"_idle()"
|
||||
],
|
||||
"start_data": [
|
||||
"data_format_cali",
|
||||
"_notify(True)",
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
"EIS_AC_AMP": {
|
||||
"description": "AC Amplitude",
|
||||
"record_meta": true,
|
||||
"initial": 26,
|
||||
"initial": 25,
|
||||
"domain": [
|
||||
2048
|
||||
]
|
||||
@@ -215,7 +215,7 @@
|
||||
"CF_AC_AMP": {
|
||||
"description": "AC Amplitude",
|
||||
"record_meta": true,
|
||||
"initial": 26,
|
||||
"initial": 25,
|
||||
"domain": [
|
||||
2048
|
||||
]
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
"EIS_AC_AMP": {
|
||||
"description": "AC Amplitude",
|
||||
"record_meta": true,
|
||||
"initial": 26,
|
||||
"initial": 25,
|
||||
"domain": [
|
||||
2048
|
||||
]
|
||||
@@ -215,7 +215,7 @@
|
||||
"CF_AC_AMP": {
|
||||
"description": "AC Amplitude",
|
||||
"record_meta": true,
|
||||
"initial": 26,
|
||||
"initial": 25,
|
||||
"domain": [
|
||||
2048
|
||||
]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"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,
|
||||
@@ -153,8 +153,7 @@
|
||||
"description": "working mode",
|
||||
"record_meta": true,
|
||||
"value": [
|
||||
"Analog Current Control (ACC)",
|
||||
"Idle"
|
||||
"Analog Current Control (ACC)"
|
||||
]
|
||||
},
|
||||
|
||||
|
||||
@@ -27,3 +27,6 @@ sudo su -c "psql -d postgres -c \"ALTER TABLE IF EXISTS project_report RENAME TO
|
||||
|
||||
# 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
|
||||
|
||||
# add column subject in project
|
||||
sudo su -c "psql -d postgres -c \"ALTER TABLE projects ADD COLUMN IF NOT EXISTS subject JSONB;\"" postgres
|
||||
Reference in New Issue
Block a user