Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2fdcef998f | |||
| 2b6381fa46 | |||
| c29d9729ba | |||
| 001905ec96 | |||
| 5033381e64 | |||
| aa88201a93 | |||
| c02c59345b | |||
| 0386cf1847 | |||
| 62d8610191 | |||
| 991f5d06ea | |||
| 55711285e6 | |||
| 3ec5fee43b | |||
| 614a9c0b0f |
@@ -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
|
||||
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
from sqlalchemy import Table, Column, String, MetaData, ForeignKey, JSON
|
||||
from sqlalchemy.sql import select, func
|
||||
from sqlalchemy.types import Integer, BigInteger, String, Boolean, TIMESTAMP, Numeric, Float, BINARY, LargeBinary
|
||||
from sqlalchemy.dialects.postgresql import JSONB
|
||||
|
||||
from .base import Base, Session
|
||||
|
||||
class Device(Base):
|
||||
__tablename__ = "devices"
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
name = Column(String(255))
|
||||
mac_address = Column(String(255))
|
||||
serial_number = Column(String(255))
|
||||
configuration = Column(JSONB)
|
||||
library = Column(String(255))
|
||||
library_version = Column(String(255))
|
||||
device_version = Column(String(255))
|
||||
type = Column(String(255))
|
||||
battery = Column(Integer)
|
||||
temperature = Column(Float)
|
||||
auto_connect = Column(Boolean)
|
||||
connect_priority = Column(Integer)
|
||||
connect_time = Column(BigInteger)
|
||||
parameter_set = Column(JSONB)
|
||||
running = Column(Boolean)
|
||||
calibration = Column(LargeBinary)
|
||||
calibration_version = Column(Integer, default=-1)
|
||||
user_auth = Column(JSONB)
|
||||
deleted = Column(Boolean)
|
||||
created_at = Column(TIMESTAMP(timezone=True), server_default=func.now())
|
||||
updated_at = Column(TIMESTAMP(timezone=True), onupdate=func.now())
|
||||
|
||||
@classmethod
|
||||
def update_device(cls, device, options):
|
||||
with Session() as session:
|
||||
result = session.query(Device).filter(Device.mac_address == device['mac_address']).first()
|
||||
for key, value in options.items():
|
||||
setattr(result, key, value)
|
||||
session.commit()
|
||||
|
||||
@classmethod
|
||||
def get_device(cls, device):
|
||||
with Session() as session:
|
||||
result = session.query(Device).filter(Device.mac_address == device['mac_address']).first()
|
||||
return result
|
||||
|
||||
|
||||
|
||||
# def __repr__(self):
|
||||
# return f"User(id={self.id!r}, name={self.name!r}, fullname={self.task!r})"
|
||||
@@ -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})"
|
||||
@@ -350,6 +350,7 @@ class CC2650Device(Device):
|
||||
self._recording_file_name: str = 'recording_data'
|
||||
self._coeff: bytes = b''
|
||||
self._device_version = ""
|
||||
self._cali_version = -1
|
||||
|
||||
@property
|
||||
def device_id(self) -> int:
|
||||
@@ -549,6 +550,24 @@ class CC2650Device(Device):
|
||||
self.update_calibration_info(device_type)
|
||||
|
||||
return self._coeff
|
||||
|
||||
def update_cali_version(self) -> bool:
|
||||
try:
|
||||
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, 0)
|
||||
self._master.write_characteristic(self.device_id, CC2650MasterDevice.COMMAND_HANDLE, code)
|
||||
except SendInstructionTimeoutError:
|
||||
self._master.log_warn('device', self.device_id, 'update cali version error')
|
||||
return False
|
||||
except RuntimeError:
|
||||
self._master.log_warn('device', self.device_id, 'update cali version error')
|
||||
return False
|
||||
else:
|
||||
sleep(0.1)
|
||||
# receive
|
||||
version = self._master.read_characteristic(self.device_id,CC2650MasterDevice.RETURN_HANDLE)
|
||||
self._cali_version = struct.unpack('<H', version[2:4])[0]
|
||||
return True
|
||||
|
||||
|
||||
def update_calibration_info(self, device_type: str):
|
||||
""" get device calibration info """
|
||||
@@ -660,9 +679,9 @@ class CC2650Device(Device):
|
||||
break
|
||||
|
||||
elif device_type == 'EISZeroOne':
|
||||
i = 0
|
||||
i = 1
|
||||
request_times = 0
|
||||
while i < 13:
|
||||
while i <= 24:
|
||||
try:
|
||||
# send
|
||||
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, i)
|
||||
@@ -1995,6 +2014,9 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
|
||||
# self._interface.flush()
|
||||
return False
|
||||
|
||||
if len(scan_response) <= 1:
|
||||
print('len(scan) <= 1, scan_response:', list(scan_response))
|
||||
return False
|
||||
# instruction format:
|
||||
# ins[0]: get_scan_response = 0x04
|
||||
# ins[1]: number of scanned device=0; a certain device = device_id (could be 1~8)
|
||||
|
||||
+199
-131
@@ -1383,8 +1383,8 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
|
||||
__slots__ = ('_message', '_cycle_number', '_start_return_data', '_time_stamp',
|
||||
'_total_time_stamp', '_mode', '_cycle_start_time',
|
||||
'_mode_stop', '_last_time_stamp', '_last_delta', '_cali_coeff',
|
||||
'cali_coeff', '_ac_amp', '_mode',
|
||||
'_mode_stop', '_last_time_stamp', '_last_delta',
|
||||
'_cali_package', 'cali_coeff', '_ac_amp', '_mode',
|
||||
'_last_phase', '_first_phase_flag', '_show_data')
|
||||
|
||||
def __init__(self, cali_coeff: bytes = None):
|
||||
@@ -1402,139 +1402,230 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
self._last_phase = 0
|
||||
self._first_phase_flag = 1
|
||||
|
||||
self._cali_coeff: Optional[bytes] = None
|
||||
self._cali_package: Optional[bytes] = None
|
||||
self.cali_coeff: Optional[List[Tuple[int, int]]] = None
|
||||
|
||||
self._show_data = False
|
||||
|
||||
if cali_coeff is not None:
|
||||
self._cali_coeff = cali_coeff
|
||||
self.cali_coeff = self._decode_cali_coeff(cali_coeff)
|
||||
if self._cali_package is None:
|
||||
self._cali_package = cali_coeff
|
||||
self.cali_coeff = self._decode_cali_coeff(self._cali_package)
|
||||
|
||||
@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)
|
||||
phase_coeff = numpy.zeros([8, 4], dtype = int)
|
||||
phase_offset = numpy.zeros([8, 4], dtype = int)
|
||||
|
||||
########################################
|
||||
# phase_coeff
|
||||
# [[gain0, g1, g2, g3] ----->最高頻
|
||||
# [gain0, g1, g2, g3] ----->中頻
|
||||
# [gain0, g1, g2, g3] ----->低頻
|
||||
# [gain0, g1, g2, g3] ----->最低頻
|
||||
# [[freq0, freq1, freq2, freq3] ----->gain0
|
||||
# [freq0, freq1, freq2, freq3] ----->gain1
|
||||
# [freq0, freq1, freq2, freq3] ----->gain2
|
||||
# [freq0, freq1, freq2, freq3] ----->gain3
|
||||
# ]
|
||||
#######################################
|
||||
|
||||
# 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
|
||||
#hstia=0
|
||||
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]
|
||||
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][1] = 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]
|
||||
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#Lv[0] 160k
|
||||
index = 60
|
||||
hsrtia_a.append(int.from_bytes(cali_coeff[index+1:index+6], signed=True, byteorder='big'))
|
||||
hsrtia_b.append(int.from_bytes(cali_coeff[index+6:index+11], signed=True, byteorder='big'))
|
||||
hsrtia_c.append(int.from_bytes(cali_coeff[index+11:index+16], signed=True, byteorder='big'))
|
||||
#hstia=1
|
||||
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])
|
||||
|
||||
#Lv[1] 20k
|
||||
index = 80
|
||||
hsrtia_a.append(int.from_bytes(cali_coeff[index+1:index+6], signed=True, byteorder='big'))
|
||||
hsrtia_b.append(int.from_bytes(cali_coeff[index+6:index+11], signed=True, byteorder='big'))
|
||||
hsrtia_c.append(int.from_bytes(cali_coeff[index+11:index+16], signed=True, byteorder='big'))
|
||||
|
||||
#Lv[2] 5k
|
||||
index = 100
|
||||
hsrtia_a.append(int.from_bytes(cali_coeff[index+1:index+6], signed=True, byteorder='big'))
|
||||
hsrtia_b.append(int.from_bytes(cali_coeff[index+6:index+11], signed=True, byteorder='big'))
|
||||
hsrtia_c.append(int.from_bytes(cali_coeff[index+11:index+16], signed=True, byteorder='big'))
|
||||
|
||||
#Lv[3] 200R
|
||||
index = 120
|
||||
hsrtia_a.append(int.from_bytes(cali_coeff[index+1:index+6], signed=True, byteorder='big'))
|
||||
hsrtia_b.append(int.from_bytes(cali_coeff[index+6:index+11], signed=True, byteorder='big'))
|
||||
hsrtia_c.append(int.from_bytes(cali_coeff[index+11:index+16], signed=True, byteorder='big'))
|
||||
|
||||
index = 140
|
||||
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]
|
||||
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
index = 160
|
||||
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]
|
||||
|
||||
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]
|
||||
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
print('cutoff_freq', cutoff_freq)
|
||||
#hstia=2
|
||||
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[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][1] = 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[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#hstia=3
|
||||
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])
|
||||
|
||||
cis_cali_packet = 11
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
g = 3
|
||||
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 12
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
g = 3
|
||||
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#hstia=4
|
||||
cis_cali_packet = 13
|
||||
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 = 14
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
g = 4
|
||||
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 15
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
g = 4
|
||||
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#hstia=5
|
||||
cis_cali_packet = 16
|
||||
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 = 17
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
g = 5
|
||||
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 18
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
g = 5
|
||||
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#hstia=6
|
||||
cis_cali_packet = 19
|
||||
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 = 20
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
g = 6
|
||||
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 21
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
g = 6
|
||||
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
#hstia=7
|
||||
cis_cali_packet = 22
|
||||
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 = 23
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
g = 7
|
||||
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
|
||||
cis_cali_packet = 24
|
||||
index = (cis_cali_packet - 1) * cis_data_len
|
||||
g = 7
|
||||
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0]
|
||||
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0]
|
||||
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0]
|
||||
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0]
|
||||
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:
|
||||
@@ -1543,10 +1634,10 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
|
||||
@property
|
||||
def name(self) -> AnyStr:
|
||||
if self._cali_coeff is None:
|
||||
if self._cali_package is None:
|
||||
return self.NAME
|
||||
else:
|
||||
return self.NAME.encode() + b':' + self._cali_coeff
|
||||
return self.NAME.encode() + b':' + self._cali_package
|
||||
|
||||
def message(self) -> Optional[str]:
|
||||
ret = self._message
|
||||
@@ -1591,9 +1682,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
|
||||
@@ -1601,19 +1691,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] + 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
|
||||
@@ -1635,20 +1717,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):
|
||||
@@ -1694,13 +1764,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]
|
||||
@@ -1712,8 +1782,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]
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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]}
|
||||
@@ -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,6 +35,7 @@ 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
|
||||
|
||||
|
||||
_RUNTIME_COMPILE = False
|
||||
@@ -862,20 +863,32 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
@logging_info
|
||||
def device_update_calibration(self, device: int) -> Union[bool, str]:
|
||||
connect_device = self.device_manager.get_device(device)
|
||||
mac_address = connect_device.mac_address
|
||||
|
||||
if connect_device == None:
|
||||
return
|
||||
mac_address = address_str(connect_device.mac_address)
|
||||
device = Device.get_device({"mac_address": mac_address})
|
||||
try:
|
||||
if connect_device.library.name.startswith('Neulive3.'):
|
||||
connect_device.calibration_info('NeuliveThreeOne')
|
||||
elif connect_device.library.name.startswith('Neulive'):
|
||||
connect_device.calibration_info('TDC4VC')
|
||||
elif connect_device.library.name.startswith('EliteEIS'):
|
||||
connect_device.calibration_info('EISZeroOne')
|
||||
|
||||
if connect_device.library.name.startswith('Elite_EIS_1.1'):
|
||||
# update calibration version
|
||||
connect_device._device.update_cali_version()
|
||||
# check if is first time or calibration version is different
|
||||
if connect_device._device._cali_version == -1 or (device.calibration_version != connect_device._device._cali_version):
|
||||
# get calibration info from device
|
||||
connect_device.calibration_info('EISZeroOne')
|
||||
# update_calibration_info
|
||||
Device.update_device(
|
||||
{ "mac_address": mac_address },
|
||||
{
|
||||
'calibration': connect_device.calibration ,
|
||||
'calibration_version': connect_device._device._cali_version
|
||||
}
|
||||
)
|
||||
else:
|
||||
connect_device._device._coeff = device.calibration
|
||||
except BaseException as e:
|
||||
# reset device info in db
|
||||
DeviceAPI.updateByMac(
|
||||
address_str(mac_address),
|
||||
mac_address,
|
||||
{
|
||||
'connect_id': -1,
|
||||
'connect_status': 'idle',
|
||||
@@ -887,14 +900,6 @@ class ControlServer(SocketServer, ControlServerAPI):
|
||||
print(e)
|
||||
return False
|
||||
else:
|
||||
# update_calibration_info
|
||||
DeviceAPI.updateByMac(
|
||||
address_str(mac_address),
|
||||
{
|
||||
'calibration': str(connect_device.calibration)
|
||||
}
|
||||
)
|
||||
# DeviceAPI.updateByAttrs('connect_status', 'update', {"connect_status": 'connect'})
|
||||
return True
|
||||
|
||||
@logging_info
|
||||
@@ -1102,6 +1107,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 +1120,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:
|
||||
|
||||
@@ -106,13 +106,17 @@
|
||||
"GENERAL_HS_RTIA": {
|
||||
"description": "High speed rtia gain",
|
||||
"record_meta": true,
|
||||
"initial": 4,
|
||||
"initial": 8,
|
||||
"value": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8
|
||||
],
|
||||
"on_change": "set_general_hs_rtia"
|
||||
},
|
||||
|
||||
@@ -106,13 +106,17 @@
|
||||
"GENERAL_HS_RTIA": {
|
||||
"description": "High speed rtia gain",
|
||||
"record_meta": true,
|
||||
"initial": 4,
|
||||
"initial": 8,
|
||||
"value": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8
|
||||
],
|
||||
"on_change": "set_general_hs_rtia"
|
||||
},
|
||||
|
||||
@@ -106,13 +106,17 @@
|
||||
"GENERAL_HS_RTIA": {
|
||||
"description": "High speed rtia gain",
|
||||
"record_meta": true,
|
||||
"initial": 4,
|
||||
"initial": 8,
|
||||
"value": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8
|
||||
],
|
||||
"on_change": "set_general_hs_rtia"
|
||||
},
|
||||
|
||||
@@ -27,3 +27,12 @@ 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
|
||||
|
||||
# drop column calibration default
|
||||
sudo su -c "psql -d postgres -c \"ALTER TABLE devices ALTER COLUMN calibration DROP DEFAULT;\"" postgres
|
||||
|
||||
# drop column calibration default
|
||||
sudo su -c "psql -d postgres -c \"ALTER TABLE devices ALTER COLUMN calibration TYPE bytea USING calibration::bytea;\"" postgres
|
||||
|
||||
# add column project in recording_data_metas
|
||||
sudo su -c "psql -d postgres -c \"ALTER TABLE devices ADD COLUMN IF NOT EXISTS calibration_version Int4 DEFAULT -1;\"" postgres
|
||||
Reference in New Issue
Block a user