Compare commits

...

17 Commits

Author SHA1 Message Date
peterlu14 0386cf1847 Merge remote-tracking branch 'origin/release/update_eis_cali_fomula' into dev/scheduler_folder 2023-04-06 10:52:17 +08:00
peterlu14 62d8610191 - fix UnboundLocalError : 'project_meta_id' 2023-04-06 10:51:43 +08:00
Roy 991f5d06ea [update] use 4hstia calibration down 2023-04-06 09:06:05 +08:00
peterlu14 55711285e6 - update create meta project info change from data-server to control-server 2023-03-31 13:14:33 +08:00
peterlu14 3ec5fee43b - update create collection table
- init project then create folder
2023-03-31 13:14:29 +08:00
Roy 614a9c0b0f [update] hstia pA->nA & hsrtia_b is 8bytes 2023-03-31 10:16:50 +08:00
Roy 22eb8a09f4 [update] fix hsrtia_a & hsrtia_b & hsrtia_c Negative number error 2023-03-22 16:52:40 +08:00
Roy dbd7431124 [update] hsrtia_a & hsrtia_b & hsrtia_c receive from elite is 5bytes 2023-03-22 13:39:14 +08:00
Roy 15c15275a7 [update] update AC_AMP defalut value 2023-03-21 16:04:27 +08:00
Roy 836d75b77e [update] new idle mode (eis1.0) 2023-03-21 16:02:49 +08:00
Roy 417bdd91a4 [update] update librery parameter:CA_VOLT 2023-03-08 10:09:06 +08:00
Roy 62ee763e2c [update] update EDC decoder 2023-03-07 17:55:00 +08:00
Roy 44e9e4cb67 [update] update BAT library 2023-03-07 17:43:41 +08:00
Roy 38537563fd [update] new idle mode 2023-01-09 17:27:03 +08:00
Roy 375372996d [update] update TRIG local name pattern 2023-01-07 16:55:03 +08:00
Roy d79491db8b [update] optimize connection 2023-01-07 11:00:44 +08:00
peterlu14 5a35da98ac [update] trigger json add parameter TIME_DURATION 2023-01-03 15:31:55 +08:00
19 changed files with 2019 additions and 192 deletions
+60
View File
@@ -0,0 +1,60 @@
from sqlalchemy import Table, Column, String, MetaData, ForeignKey, JSON
from sqlalchemy.sql import select, func
from sqlalchemy.types import Integer, BigInteger, String, Boolean, TIMESTAMP, Numeric
from sqlalchemy.dialects.postgresql import JSONB
from biopro.db.base import Session
from .base import Base
class 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
+24
View File
@@ -0,0 +1,24 @@
from sqlalchemy import Table, Column, String, MetaData, ForeignKey, JSON
from sqlalchemy.sql import select, func
from sqlalchemy.types import Integer, BigInteger, String, Boolean, TIMESTAMP, Numeric
from sqlalchemy.dialects.postgresql import JSONB
from .base import Base
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})"
+9 -1
View File
@@ -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})"
+5 -15
View File
@@ -660,7 +660,7 @@ class CC2650Device(Device):
break
elif device_type == 'EISZeroOne':
i = 0
i = 1
request_times = 0
while i < 13:
try:
@@ -2177,23 +2177,12 @@ 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:
@@ -2202,6 +2191,7 @@ 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 \
+148 -133
View File
@@ -884,20 +884,54 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
def decode(self, data: bytes) -> Optional[RecordingData]:
if len(data) < 18:
return None
voltage = 0
mem_cnt = data[1]
time_stamp: float = struct.unpack('<I', data[4:8])[0] # unit: ms 0x18030000
current = struct.unpack('<i', data[8:12])[0] # unit: nA
voltage = struct.unpack('<i', data[12:16])[0] # unit: uV
impedance = struct.unpack('<i', data[16:20])[0] # unit: mOm
#/* 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
# */
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]
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
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]
# 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
@@ -924,25 +958,29 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
else:
if self._show_data:
print('|', time_stamp, '|', delta, '|', int(time_stamp * 1000 / 2),
'|', current, '|', voltage, '|', impedance, '|', cycle_number,
'|', notify_one, '|', notify_two, '|', notify_three,
'|', finishMode, '@', str(self.device))
'|', ch1, '|', ch2, '|', ch3, '|', cycle_number,
'|', ch4, '|', ch5, '|', ch6,
'|', 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('|', '{: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('|', '{:5}'.format(mem_wrong_information),
# '|', '{:2}'.format(ram_num),
# '|', '{:2}'.format(broken_flag),
# '@', str(self.device), '|')
pass
# print('|', '{:5}'.format(mem_wrong_information),
# '|', '{:2}'.format(ram_num),
# '|', '{:2}'.format(broken_flag),
# '@', str(self.device), '|')
if finishMode == True:
print("finishMode full data:", list(data), datetime.now())
@@ -951,13 +989,13 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
self._mode_stop = 0
ret = RecordingData(self.device, int(time_stamp * 1000 / 2), 0)
ret.append_data(0, current)
ret.append_data(1, voltage)
ret.append_data(2, impedance)
ret.append_data(0, ch1)
ret.append_data(1, ch2)
ret.append_data(2, ch3)
ret.append_data(3, cycle_number)
ret.append_data(4, notify_one)
ret.append_data(5, notify_two)
ret.append_data(6, notify_three)
ret.append_data(4, ch4)
ret.append_data(5, ch5)
ret.append_data(6, ch6)
# ret.append_data(4, battery)
# ret.append_data(5, elite_notify_times)
# ret.append_data(6, mem_cnt)
@@ -1376,16 +1414,13 @@ class EISZeroOneDataDecoder(RecDataDecoder):
@staticmethod
def _decode_cali_coeff(cali_coeff: bytes) -> Optional[List[Tuple[int, int]]]:
if cali_coeff != b'':
cis_data_len = 20
cali_table = []
hsrtia_a = []
hsrtia_b = []
hsrtia_c = []
hsrtia_d = []
rolloff = []
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)
@@ -1399,104 +1434,107 @@ class EISZeroOneDataDecoder(RecDataDecoder):
# ]
#######################################
# 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
#Lv[0] 160k
cis_cali_packet = 1
index = (cis_cali_packet - 1) * cis_data_len
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0])
hsrtia_b.append(struct.unpack('>q', cali_coeff[index+5:index+13])[0])
rolloff.append(struct.unpack('>i', cali_coeff[index+13:index+17])[0])
index = 20
cis_cali_packet = 2
index = (cis_cali_packet - 1) * cis_data_len
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
cis_cali_packet = 3
index = (cis_cali_packet - 1) * cis_data_len
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])
#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])
cis_cali_packet = 4
index = (cis_cali_packet - 1) * cis_data_len
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0])
hsrtia_b.append(struct.unpack('>q', cali_coeff[index+5:index+13])[0])
rolloff.append(struct.unpack('>i', cali_coeff[index+13:index+17])[0])
cis_cali_packet = 5
index = (cis_cali_packet - 1) * cis_data_len
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]
cis_cali_packet = 6
index = (cis_cali_packet - 1) * cis_data_len
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]
#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 = 7
index = (cis_cali_packet - 1) * cis_data_len
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0])
hsrtia_b.append(struct.unpack('>q', cali_coeff[index+5:index+13])[0])
rolloff.append(struct.unpack('>i', cali_coeff[index+13:index+17])[0])
cis_cali_packet = 8
index = (cis_cali_packet - 1) * cis_data_len
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]
cis_cali_packet = 9
index = (cis_cali_packet - 1) * cis_data_len
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]
#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 = 10
index = (cis_cali_packet - 1) * cis_data_len
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0])
hsrtia_b.append(struct.unpack('>q', cali_coeff[index+5:index+13])[0])
rolloff.append(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
cis_cali_packet = 11
index = (cis_cali_packet - 1) * cis_data_len
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
cis_cali_packet = 12
index = (cis_cali_packet - 1) * cis_data_len
g = 3
phase_coeff[2][g] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
phase_offset[2][g] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
phase_coeff[3][g] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
phase_offset[3][g] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
print('cutoff_freq', cutoff_freq)
print('hsrtia_a', hsrtia_a)
print('hsrtia_b', hsrtia_b)
print('hsrtia_c', hsrtia_c)
print('rolloff', rolloff)
print('phase_coeff')
print(phase_coeff)
print('phase_offset')
print(phase_offset)
cali_table.append((cutoff_freq, phase_coeff, phase_offset, hsrtia_a, hsrtia_b, hsrtia_c, hsrtia_d))
cali_table.append((phase_coeff, phase_offset, hsrtia_a, hsrtia_b, rolloff))
return cali_table
else:
@@ -1553,9 +1591,8 @@ class EISZeroOneDataDecoder(RecDataDecoder):
if self.cali_coeff is not None and (self._mode == 0 or self._mode == 5):
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]
rolloff = []
phase_coeff, phase_offset, hsrtia_a, hsrtia_b, rolloff = self.cali_coeff[0]
if (self._mode == 0 or self._mode == 5):
img = ch1
@@ -1563,19 +1600,11 @@ class EISZeroOneDataDecoder(RecDataDecoder):
freq = ch3
fre_idx = 0
voltage_amp = round(ch4 / 1000) # Amp[mV]
rolloff_cali = rolloff[gain]
# 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)
# 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]) / 1e8 #[nA]
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 = voltage_amp * 707106.78 / current
@@ -1597,20 +1626,8 @@ class EISZeroOneDataDecoder(RecDataDecoder):
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)
imag_after_cal = round(impedance * math.sin(phase * math.pi / 180))
real_after_cal = round(impedance * math.cos(phase * math.pi / 180))
if self._show_data:
if (self._mode == 0 or self._mode == 5):
@@ -1656,13 +1673,13 @@ 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 Mode
if self._mode == 0 or self._mode == 5:
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(4, imag_after_cal) #Z_imag [Ohm]
ret.append_data(5, real_after_cal) #Z_real [Ohm]
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]
@@ -1674,8 +1691,6 @@ class EISZeroOneDataDecoder(RecDataDecoder):
ret.append_data(12, notify_three)
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]
+14
View File
@@ -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',
}
@@ -60,6 +63,14 @@ 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
collection = Collection.create_collection(self.name, parent)
self.setup_collection(collection)
def setup_project(self, project):
for (key, value) in project.items():
@@ -79,6 +90,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:
+17 -1
View File
@@ -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]})
task.parent = {"folder": [collection.id]}
else:
task.parent = {"folder": [parent.id]}
+8 -8
View File
@@ -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)
+4 -2
View File
@@ -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)
+5 -3
View File
@@ -1102,6 +1102,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 +1115,11 @@ 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)
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:
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": 0
"minor_version_number": 1
},
"constant": {
"TIME_MAX": 100000,
@@ -780,7 +780,7 @@
"expression": "VALUE"
}
},
"VOLT_VSCAN": {
"CA_VOLT": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
@@ -1301,7 +1301,7 @@
"curve_const_vscan": {
"type": "RIS",
"parameter": {
"va": "VOLT_VSCAN",
"va": "CA_VOLT",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15",
@@ -33,6 +33,7 @@
0,
1,
1,
1,
1
],
"domain": {
@@ -617,7 +618,8 @@
"Open Circuit Potential",
"Pulse Sensing",
"Differential Pulse Voltammetry (DPV)",
"Chronopotentiometry"
"Chronopotentiometry",
"Idle"
]
},
"VOLT_ORIGIN": {
@@ -818,7 +820,7 @@
"expression": "VALUE"
}
},
"VOLT_VSCAN": {
"CA_VOLT": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
@@ -949,6 +951,7 @@
"10": "cali_dac_test",
"11": "cali_adc_test",
"12": "",
"17": "idle",
"*": "start_data"
}
}
@@ -976,6 +979,9 @@
"VIS_STI",
"_cdr('1X;4X>ADC_VALUE_I')"
],
"idle": [
"_idle()"
],
"start_data": [
"data_format",
"_notify(True)",
@@ -1023,7 +1029,7 @@
"6": "const_current",
"7": "curve_cv3",
"8": "curve_lsv",
"9": "curve_const_vscan",
"9": "curve_ca",
"13": "curve_ocp",
"14": "curve_pulse_sensing",
"15": "curve_dpv",
@@ -1360,10 +1366,10 @@
"2B>pe"
]
},
"curve_const_vscan": {
"curve_ca": {
"type": "RIS",
"parameter": {
"va": "VOLT_VSCAN",
"va": "CA_VOLT",
"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.5r2",
"name": "Elite_EDC_1.5re",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite.*",
"major_product_number": 0,
"minor_product_number": 2,
"major_version_number": 1,
"minor_version_number": 8
"minor_version_number": 7
},
"constant": {
"TIME_MAX": 100000,
@@ -33,6 +33,7 @@
0,
1,
1,
1,
1
],
"domain": {
@@ -617,7 +618,8 @@
"Open Circuit Potential",
"Pulse Sensing",
"Differential Pulse Voltammetry (DPV)",
"Chronopotentiometry"
"Chronopotentiometry",
"Idle"
]
},
"VOLT_ORIGIN": {
@@ -818,7 +820,7 @@
"expression": "VALUE"
}
},
"VOLT_VSCAN": {
"CA_VOLT": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
@@ -949,6 +951,7 @@
"10": "cali_dac_test",
"11": "cali_adc_test",
"12": "",
"17": "idle",
"*": "start_data"
}
}
@@ -976,6 +979,9 @@
"VIS_STI",
"_cdr('1X;4X>ADC_VALUE_I')"
],
"idle": [
"_idle()"
],
"start_data": [
"data_format",
"_notify(True)",
@@ -1023,7 +1029,7 @@
"6": "const_current",
"7": "curve_cv3",
"8": "curve_lsv",
"9": "curve_const_vscan",
"9": "curve_ca",
"13": "curve_ocp",
"14": "curve_pulse_sensing",
"15": "curve_dpv",
@@ -1360,10 +1366,10 @@
"2B>pe"
]
},
"curve_const_vscan": {
"curve_ca": {
"type": "RIS",
"parameter": {
"va": "VOLT_VSCAN",
"va": "CA_VOLT",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15",
@@ -820,7 +820,7 @@
"expression": "VALUE"
}
},
"VOLT_VSCAN": {
"CA_VOLT": {
"description": "Voltage of VScan",
"record_meta": true,
"initial": 25000,
@@ -1029,7 +1029,7 @@
"6": "const_current",
"7": "curve_cv3",
"8": "curve_lsv",
"9": "curve_const_vscan",
"9": "curve_ca",
"13": "curve_ocp",
"14": "curve_pulse_sensing",
"15": "curve_dpv",
@@ -1366,10 +1366,10 @@
"2B>pe"
]
},
"curve_const_vscan": {
"curve_ca": {
"type": "RIS",
"parameter": {
"va": "VOLT_VSCAN",
"va": "CA_VOLT",
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15",
@@ -34,6 +34,7 @@
0,
1,
1,
1,
1
],
"domain": {
@@ -98,7 +99,8 @@
"V-T Graph",
"R-T Graph",
"EIS constant frequency",
"Dev Mode"
"Dev Mode",
"Idle"
]
},
"GENERAL_HS_RTIA": {
@@ -141,7 +143,7 @@
"EIS_AC_AMP": {
"description": "AC Amplitude",
"record_meta": true,
"initial": 25,
"initial": 26,
"domain": [
2048
]
@@ -213,7 +215,7 @@
"CF_AC_AMP": {
"description": "AC Amplitude",
"record_meta": true,
"initial": 25,
"initial": 26,
"domain": [
2048
]
@@ -370,10 +372,14 @@
{
"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": 25,
"initial": 26,
"domain": [
2048
]
@@ -215,7 +215,7 @@
"CF_AC_AMP": {
"description": "AC Amplitude",
"record_meta": true,
"initial": 25,
"initial": 26,
"domain": [
2048
]
@@ -143,7 +143,7 @@
"EIS_AC_AMP": {
"description": "AC Amplitude",
"record_meta": true,
"initial": 25,
"initial": 26,
"domain": [
2048
]
@@ -215,7 +215,7 @@
"CF_AC_AMP": {
"description": "AC Amplitude",
"record_meta": true,
"initial": 25,
"initial": 26,
"domain": [
2048
]
@@ -2,16 +2,27 @@
"name": "Elite_TRIG_0.1",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Trigger.*",
"local_name_pattern": "Elite.*",
"major_product_number": 0,
"minor_product_number": 5,
"major_version_number": 1,
"minor_version_number": 0
},
"constant": {
"TIME_MAX": 100000
},
"parameters": {
"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,
@@ -142,7 +153,8 @@
"description": "working mode",
"record_meta": true,
"value": [
"Analog Current Control (ACC)"
"Analog Current Control (ACC)",
"Idle"
]
},