Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 13825fe9ff | |||
| dd2e31d01f | |||
| 455fa1f86b | |||
| 71850b31a8 | |||
| 8d52fef4c1 | |||
| e091f220fa | |||
| 2fd05d18ed | |||
| 03011ebd5f | |||
| 4b9bc30e28 | |||
| 4966113393 | |||
| 3371c21bbd | |||
| afc87829d9 |
@@ -536,7 +536,7 @@ class CC2650Device(Device):
|
||||
self._master.log_warn('device', self.device_id, 'update_battery_info no response')
|
||||
|
||||
else:
|
||||
if data is not None and len(data) == 4 :
|
||||
if data is not None and len(data) > 2 :
|
||||
battery = struct.unpack('<H', data[1:3])[0]
|
||||
if battery is not None:
|
||||
self._battery = battery
|
||||
@@ -2035,6 +2035,7 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
|
||||
# print("local_name = ", local_name)
|
||||
|
||||
# addr type is don't care in BMD380
|
||||
print('scan_response:', list(scan_response))
|
||||
local_addr_type = int(scan_response[index:index + 1][0])
|
||||
# local_addr_type = 0xFF
|
||||
index = index + 1
|
||||
|
||||
@@ -882,15 +882,18 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
|
||||
if len(data) < 18:
|
||||
return None
|
||||
|
||||
time_stamp: float = struct.unpack('<I', data[1:5])[0] # unit: ms 0x18030000
|
||||
current = struct.unpack('<i', data[5:9])[0] # unit: nA
|
||||
voltage = struct.unpack('<i', data[9:13])[0] # unit: uV
|
||||
impedance = struct.unpack('<i', data[13:17])[0] # unit: mOm
|
||||
cycle_number = struct.unpack('<H', data[17:19])[0]
|
||||
finish_mode_falg = data[19]
|
||||
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
|
||||
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]
|
||||
|
||||
mem_wrong_information = struct.unpack('<i', data[40:40+4])[0] # mem_wrong_information = green retry, green wrong, red retry, red wrong
|
||||
ram_num = data[44]
|
||||
mem_wrong_information = struct.unpack('<i', data[43:47])[0] # mem_wrong_information = green retry, green wrong, red retry, red wrong
|
||||
ram_num = data[47]
|
||||
broken_flag = data[-1]
|
||||
|
||||
if (finish_mode_falg & 0b11110000 == 0b10100000):
|
||||
@@ -942,12 +945,15 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
|
||||
ret.append_data(1, voltage)
|
||||
ret.append_data(2, impedance)
|
||||
ret.append_data(3, cycle_number)
|
||||
ret.append_data(4, battery)
|
||||
ret.append_data(5, elite_notify_times)
|
||||
ret.append_data(6, mem_cnt)
|
||||
|
||||
# memoryboard information
|
||||
ret.append_data(4, ram_num)
|
||||
ret.append_data(5, broken_flag)
|
||||
ret.append_data(7, ram_num)
|
||||
ret.append_data(8, broken_flag)
|
||||
try:
|
||||
ret.append_data(6, mem_wrong_information)
|
||||
ret.append_data(9, mem_wrong_information)
|
||||
# print('append_data success, mem_wrong_information:', mem_wrong_information, hex(mem_wrong_information))
|
||||
except:
|
||||
print('append_data fail, mem_wrong_information:', mem_wrong_information, hex(mem_wrong_information))
|
||||
@@ -1450,12 +1456,12 @@ class EISZeroOneDataDecoder(RecDataDecoder):
|
||||
if len(data) < 18:
|
||||
return None
|
||||
|
||||
ch1 = struct.unpack('>i', data[1:5])[0] # unit: 1/1000 nA
|
||||
ch2 = struct.unpack('>i', data[5:9])[0] # unit: mV
|
||||
ch3 = struct.unpack('>i', data[9:13])[0] # unit: kOm
|
||||
time_stamp: float = struct.unpack('<I', data[13:17])[0] # unit: ms
|
||||
cycle_number = struct.unpack('>H', data[17:19])[0]
|
||||
d19 = data[19]
|
||||
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 = (d19 & 0x0F)
|
||||
finishMode = (d19 & 0x80) >> 7
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
|
||||
self._elite_data_len = 40
|
||||
self._mem_header_len = 3
|
||||
self._mem_tailer_len = 8
|
||||
self._mem_tailer_len = 6
|
||||
self._single_data_len = self._elite_data_len + self._mem_header_len + self._mem_tailer_len
|
||||
|
||||
# buffer
|
||||
@@ -167,10 +167,33 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
print("read red data times", self._read_red_times)
|
||||
return data
|
||||
|
||||
def _compare_green_data_addr_and_flag(self, data: Union[bytes, List[int]], device: int):
|
||||
|
||||
green_data_section1 = data[3:7]
|
||||
green_data_section2 = data[7:11]
|
||||
green_data_section3 = data[11:15]
|
||||
green_data_section = []
|
||||
|
||||
if green_data_section1 == green_data_section2:
|
||||
green_data_section = green_data_section1
|
||||
|
||||
elif(green_data_section2 == green_data_section3 or green_data_section1 == green_data_section3):
|
||||
print("green data not equal: = ", data[3:15])
|
||||
print("green data print:", data, device, datetime.now())
|
||||
green_data_section = green_data_section3
|
||||
|
||||
else:
|
||||
print("green data not equal: = ", data[3:15])
|
||||
print("green data print:", data, device, datetime.now())
|
||||
green_data_section = green_data_section3 # use last data
|
||||
|
||||
|
||||
return green_data_section
|
||||
|
||||
def _print_ram_all_data(self):
|
||||
addr = 0
|
||||
red_length = int(7000 / 2)
|
||||
tx_temp = [0] * red_length
|
||||
tx_temp = [0] * (red_length + 3)
|
||||
|
||||
while True:
|
||||
tx_temp[0] = MEM_INS_READ
|
||||
@@ -216,7 +239,7 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
self._head_wrong_cnt[device] = self._head_wrong_cnt[device] + 1
|
||||
if (self._head_wrong_cnt[device] <= 5): # print 5 times
|
||||
print('data_first[0:3] != [255, 255, 255], device:', device, ',', self._head_wrong_cnt[device], 'times')
|
||||
print(list(data[0:15]))
|
||||
print(list(data))
|
||||
|
||||
data[0:3] = [255, 255, 255]
|
||||
# ----------------------------------------------------------------------------------------------
|
||||
@@ -235,13 +258,13 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
# self._head_wrong_cnt[device] = self._head_wrong_cnt[device] + 1
|
||||
# if (self._head_wrong_cnt[device] < 10):
|
||||
# print('data_first[0:3] != [255, 255, 255], device:', device, ',', self._head_wrong_cnt[device], 'times')
|
||||
# print(list(data_first[0:7]))
|
||||
# print(list(data_first))
|
||||
|
||||
# if (data_second[0] != 255 or data_second[1] != 255 or data_second[2] != 255):
|
||||
# self._head_wrong_cnt[device] = self._head_wrong_cnt[device] + 1
|
||||
# if (self._head_wrong_cnt[device] < 10):
|
||||
# print('data_second[0:3] != [255, 255, 255], device:', device, ',', self._head_wrong_cnt[device], 'times')
|
||||
# print(list(data_second[0:7]))
|
||||
# print(list(data_second))
|
||||
|
||||
# if (data_first[3:] == data_second[3:]):
|
||||
# data = data_first
|
||||
@@ -253,27 +276,7 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
# data = self.compare_green_data(data_first, data_second, data_third, len(tx_h))
|
||||
# ----------------------------------------------------------------------------------------------
|
||||
|
||||
# debug use
|
||||
# green_data = []
|
||||
# green_data = data
|
||||
# print("_[Debug] @ spi green data = ", green_data)
|
||||
|
||||
green_data_section1 = data[3:7]
|
||||
green_data_section2 = data[7:11]
|
||||
green_data_section3 = data[11:15]
|
||||
|
||||
if green_data_section1 == green_data_section2:
|
||||
green_data_section = green_data_section1
|
||||
|
||||
elif(green_data_section2 == green_data_section3 or green_data_section1 == green_data_section3):
|
||||
print("green data not equal: = ", data[3:15])
|
||||
print("green data print:", data, device, datetime.now())
|
||||
green_data_section = green_data_section3
|
||||
|
||||
else:
|
||||
print("green data not equal: = ", data[3:15])
|
||||
print("green data print:", data, device, datetime.now())
|
||||
green_data_section = green_data_section3 # use last data
|
||||
green_data_section = self._compare_green_data_addr_and_flag(data, device)
|
||||
|
||||
length = (green_data_section[0] << 8) | green_data_section[1]
|
||||
header = data[15]
|
||||
@@ -284,8 +287,8 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
print("length < 12")
|
||||
print("green data print:", data, device, datetime.now())
|
||||
|
||||
if length == 0:
|
||||
self._print_ram_all_data()
|
||||
# if length == 0:
|
||||
# self._print_ram_all_data()
|
||||
|
||||
return None
|
||||
|
||||
@@ -302,7 +305,7 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
if (header != 255):
|
||||
flag_print = True
|
||||
print("green data: header is not 255: ", header)
|
||||
self._print_ram_all_data()
|
||||
# self._print_ram_all_data()
|
||||
|
||||
if (elite_data_len != self._elite_data_len):
|
||||
flag_print = True
|
||||
@@ -311,18 +314,9 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
if (flag_print):
|
||||
print("green data print:", data, device, datetime.now(), '\n')
|
||||
|
||||
# neulive
|
||||
# address += len(data) - 11
|
||||
# tx_d = self._tx_buffer_data
|
||||
# red_length = len(tx_d)
|
||||
|
||||
address = 12
|
||||
red_length = int(length / 2)
|
||||
tx_d = [0] * red_length
|
||||
|
||||
# elite read len(_tx_buffer_data) byte
|
||||
# address = 12
|
||||
# tx_d = self._tx_buffer_data
|
||||
tx_d = [0] * (red_length + 3)
|
||||
|
||||
while True:
|
||||
tx_d[0] = MEM_INS_READ
|
||||
@@ -377,11 +371,40 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
# * red data formate:
|
||||
# * ramHdr, ramHdr, ramHdr, (3B)
|
||||
# * 255, #, data_length, (3B)
|
||||
# * data, (20B)
|
||||
# * data, (40B)
|
||||
# * red_wrong, red_retry_cnt, green_wrong, green_retry_cnt, (4B)
|
||||
# * 255, #, data_length, (3B)
|
||||
# * check_num, (1B)
|
||||
# * */
|
||||
|
||||
# read again if check num is wrong
|
||||
index = 0
|
||||
check_number_print = False
|
||||
for i in range(0, len(rx), self._single_data_len):
|
||||
check_sum = sum(rx[i : i + self._single_data_len - 1]) & 0b11111111
|
||||
# print(check_sum, rx[i + self._single_data_len - 1])
|
||||
|
||||
if (check_sum != rx[i + self._single_data_len - 1]):
|
||||
# print('check_sum wrong, origin value:', 'check_sum =', check_sum, rx[i : i + self._single_data_len])
|
||||
tx_d = [0] * (self._single_data_len + 3)
|
||||
address = 12 + self._single_data_len * index
|
||||
tx_d[0] = MEM_INS_READ
|
||||
tx_d[1] = ((address >> 8) & 0xFF)
|
||||
tx_d[2] = (address & 0xFF)
|
||||
|
||||
data = []
|
||||
data = self._spi.send_byte(tx_d)
|
||||
data[0:3] = [255, 255, 255]
|
||||
rx[i : i + self._single_data_len] = data[3:]
|
||||
print('check_sum wrong, read again:', 'check_sum =', check_sum, rx[i : i + self._single_data_len])
|
||||
check_number_print = True
|
||||
index = index + 1
|
||||
|
||||
if check_number_print:
|
||||
print('check_sum wrong:', device, datetime.now())
|
||||
for i in range(0, len(rx), self._single_data_len):
|
||||
print(rx[i:i+self._single_data_len])
|
||||
print()
|
||||
|
||||
# mark read
|
||||
self._spi.send_byte(self.MEM_INS_MARKED1)
|
||||
self._spi.send_byte(self.MEM_INS_MARKED2)
|
||||
|
||||
@@ -9,7 +9,6 @@ class Action():
|
||||
self._duration = action.get('duration', None)
|
||||
self._goto = action.get('goto', None)
|
||||
self._cycle = action.get('cycle', None)
|
||||
|
||||
self._instruction = None
|
||||
|
||||
self.update_instruction()
|
||||
@@ -19,12 +18,16 @@ class Action():
|
||||
return self._type
|
||||
|
||||
def update_instruction(self):
|
||||
instruction_type = self._type
|
||||
if instruction_type == 'stop':
|
||||
instruction_type = 'interrupt'
|
||||
|
||||
self._instruction = {
|
||||
"device_instruction": {
|
||||
"header": "call_instruction",
|
||||
"device": self._target,
|
||||
"arguments": {
|
||||
"instruction": self._type,
|
||||
"instruction": instruction_type,
|
||||
}
|
||||
},
|
||||
"device_parameter": {
|
||||
|
||||
@@ -3,7 +3,6 @@ from time import time
|
||||
|
||||
class Condition():
|
||||
def __init__(self, id, condition):
|
||||
print('condition', id, condition)
|
||||
self._id = id
|
||||
self._type = condition['type']
|
||||
self._comparsion = condition['comparsion']
|
||||
@@ -12,12 +11,15 @@ class Condition():
|
||||
@property
|
||||
def id(self):
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def type(self):
|
||||
return self._type
|
||||
|
||||
@property
|
||||
def comparsion(self):
|
||||
return self._comparsion
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
return self._value
|
||||
@@ -38,11 +40,11 @@ class Condition():
|
||||
"smaller": lambda a, b: a < b,
|
||||
}
|
||||
|
||||
# print('x','y',x, y,type(x),type(y))
|
||||
return cases[operator](x, y)
|
||||
|
||||
def match_or_not(self, **kwargs):
|
||||
return self.method_mapping(self.type)()
|
||||
# print(self._type, self._comparsion, self._value)
|
||||
return getattr(self, self.type)(**kwargs)
|
||||
|
||||
def absolute_time(self, **kwargs):
|
||||
now = time()
|
||||
@@ -51,7 +53,13 @@ class Condition():
|
||||
return self.compareWith(self.comparsion, int(now), int(time_condition))
|
||||
|
||||
def relative_time(self, **kwargs):
|
||||
project_start_time = kwargs['project_start_time']
|
||||
task_start_time = kwargs['task_start_time']
|
||||
delay_time = kwargs['delay_time']
|
||||
now = time()
|
||||
|
||||
time_diff = int(now - project_start_time - delay_time)
|
||||
return self.compareWith(self.comparsion, time_diff, int(self._value))
|
||||
|
||||
def device(self, **kwargs):
|
||||
print('device')
|
||||
|
||||
@@ -8,6 +8,7 @@ from datetime import datetime
|
||||
from collections import deque
|
||||
from biopro.device.manager import DeviceManager
|
||||
from biopro.text import *
|
||||
from copy import copy
|
||||
|
||||
class Project(threading.Thread):
|
||||
def __init__(self, project, device_manager: DeviceManager, mqttThread = None, name="project"):
|
||||
@@ -19,9 +20,8 @@ class Project(threading.Thread):
|
||||
self._start_time = None
|
||||
|
||||
self._task_manager = TaskManager(self._project['taskList'])
|
||||
self._stop = False
|
||||
|
||||
self._start_time = None
|
||||
|
||||
@property
|
||||
def desc(self) -> str:
|
||||
return self._project['desc']
|
||||
@@ -45,34 +45,38 @@ class Project(threading.Thread):
|
||||
def run(self):
|
||||
self._start_time = time.time()
|
||||
|
||||
while True:
|
||||
while not self._stop:
|
||||
# current task
|
||||
for task in self._task_manager.get_check_task_list():
|
||||
task_check_list = copy(self._task_manager.get_check_task_list())
|
||||
delay_time = 0
|
||||
for task in task_check_list:
|
||||
# [<match_condition>, ...]
|
||||
match_condition_list = task.check_condition('time')
|
||||
match_condition_list = task.check_condition(project_start_time = self._start_time, delay_time = delay_time)
|
||||
# [[<match_action>, ...], ...]
|
||||
match_action_list = task.get_match_action_list(match_condition_list)
|
||||
|
||||
for action_list in match_action_list:
|
||||
for action in action_list:
|
||||
if action.type == 'start':
|
||||
task.reset_start_time()
|
||||
self._task_manager.set_current_task(task)
|
||||
task.do_action(action)
|
||||
|
||||
|
||||
now = time.time()
|
||||
while len(task.instruction_list) > 0:
|
||||
instruction = task.instruction_list.pop(0)
|
||||
if instruction.get('device', None) != None:
|
||||
device = self._device_manager.get_device(self.device[instruction['device']]['connectDevice']['device_address'])
|
||||
instruction = task.instruction_list.pop(0)
|
||||
if instruction.get('device', None) != None:
|
||||
device = self._device_manager.get_device(self.device[instruction['device']]['connectDevice']['device_address'])
|
||||
|
||||
if device is None:
|
||||
raise RuntimeError(DEVICE_NOT_FOUND, device)
|
||||
|
||||
# print(instruction['header'], *instruction['arguments'].values())
|
||||
getattr(device, instruction['header'])(*instruction['arguments'].values())
|
||||
if device is None:
|
||||
raise RuntimeError(DEVICE_NOT_FOUND, device)
|
||||
|
||||
getattr(device, instruction['header'])(*instruction['arguments'].values())
|
||||
delay_time += (time.time() - now)
|
||||
time.sleep(self._time_interval)
|
||||
|
||||
def stop(self):
|
||||
return
|
||||
self._stop = True
|
||||
|
||||
def close(self):
|
||||
return
|
||||
self._stop = True
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from typing import List
|
||||
from .condition import Condition
|
||||
from .action import Action
|
||||
from time import time
|
||||
@@ -6,8 +7,8 @@ class Task:
|
||||
def __init__(self, task):
|
||||
self._task = task
|
||||
|
||||
self._condition_list = []
|
||||
self._action_list = []
|
||||
self._condition_list:List[Condition] = []
|
||||
self._action_list:List[Action] = []
|
||||
|
||||
self._start_time = time()
|
||||
self._idle_time = []
|
||||
@@ -16,7 +17,6 @@ class Task:
|
||||
self._last_time = None
|
||||
|
||||
self._instruction_list = []
|
||||
|
||||
self.setup()
|
||||
|
||||
def setup(self) -> None:
|
||||
@@ -105,6 +105,9 @@ class Task:
|
||||
@property
|
||||
def next(self) -> str:
|
||||
return self._task['next']
|
||||
|
||||
def reset_start_time(self):
|
||||
self._start_time = time()
|
||||
|
||||
def get_parameter_set_by_device(self, device):
|
||||
return [parameter_set for parameter_set in self.parameter_set.values() if device == parameter_set['target']]
|
||||
@@ -151,9 +154,6 @@ class Task:
|
||||
return map(lambda condition: [x for x in self._action_list if condition.id in x.get_condition_list()], match_condition_list)
|
||||
|
||||
def do_action(self, action):
|
||||
# # match_action = [x for x in self._action_list if condition_id in x.get_condition_list()]
|
||||
|
||||
# for action in match_action:
|
||||
for instruction in action.get_instruction_list():
|
||||
self._instruction_list.append(instruction)
|
||||
|
||||
@@ -164,5 +164,6 @@ class Task:
|
||||
}
|
||||
return statuses[status]
|
||||
|
||||
def check_condition(self, type):
|
||||
return [condition for condition in self._condition_list if condition.match_or_not()]
|
||||
def check_condition(self, **kwargs):
|
||||
kwargs['task_start_time'] = self._start_time
|
||||
return [condition for condition in self._condition_list if condition.match_or_not(**kwargs)]
|
||||
@@ -1,5 +1,5 @@
|
||||
from json import loads as json_parse, dumps as _json_stringify
|
||||
from typing import Dict, Optional, Any
|
||||
from typing import Dict, List, Optional, Any
|
||||
from xml.dom.expatbuilder import parseString
|
||||
import paho.mqtt.client as mqtt
|
||||
from biopro.text import *
|
||||
@@ -29,7 +29,7 @@ class TaskManager():
|
||||
def get_task(self, task_id):
|
||||
return self._task_list[task_id]
|
||||
|
||||
def get_check_task_list(self):
|
||||
def get_check_task_list(self) -> List[Task]:
|
||||
return self._need_to_check_task_list
|
||||
|
||||
def get_current_task(self) -> Task:
|
||||
|
||||
@@ -1315,7 +1315,7 @@ class RecordingFileWriter:
|
||||
self._time_now = int(t)
|
||||
return
|
||||
|
||||
@calculate_time(1)
|
||||
# @calculate_time(1)
|
||||
def write(self, data: Union[bytes, RecordingData, List[bytes], List[RecordingData]], mqtt_thread) -> int:
|
||||
# check size
|
||||
ths = self.splitting_threshold_size
|
||||
|
||||
@@ -160,7 +160,7 @@ class DataBaseProcess(Process):
|
||||
getattr(self, do)(*args)
|
||||
return None
|
||||
|
||||
@calculate_time(1)
|
||||
# @calculate_time(1)
|
||||
def data_meta_write(self, _data: JSON_OBJECT, device_id, _uuid = None, _id = None):
|
||||
if _id > 0:
|
||||
sql_str = 'UPDATE "public"."recording_data_metas" SET '
|
||||
@@ -376,7 +376,7 @@ class DataBaseProcess(Process):
|
||||
print('recording error', e)
|
||||
return None
|
||||
|
||||
@calculate_time(1)
|
||||
# @calculate_time(1)
|
||||
def data_raw_recording_new(self, _id_dict, _channel_list, _data_dict, _end_time_dict, _size_dict):
|
||||
try:
|
||||
para_list = []
|
||||
@@ -446,7 +446,7 @@ class DataBaseProcess(Process):
|
||||
|
||||
return True
|
||||
|
||||
@calculate_time(1)
|
||||
# @calculate_time(1)
|
||||
def data_mini_recording_new(self, _id_dict, _channel_list, _data_mean_dict):
|
||||
try:
|
||||
para_list = []
|
||||
|
||||
@@ -98,6 +98,11 @@ class RecordingProcess(Process):
|
||||
self._last_cnt = [-1, -1, -1, -1, -1, -1, -1, -1]
|
||||
self._wrong_cnt = 0
|
||||
|
||||
# elite data length
|
||||
self._elite_data_len = 40
|
||||
self._mem_header_len = 3
|
||||
self._mem_tailer_len = 6
|
||||
self._single_data_len = self._elite_data_len + self._mem_header_len + self._mem_tailer_len
|
||||
|
||||
def ensure_data_format(self) -> DataDecodeFormat:
|
||||
if isinstance(self._data_format, (str, bytes)):
|
||||
@@ -160,11 +165,11 @@ class RecordingProcess(Process):
|
||||
"""
|
||||
q = None
|
||||
try:
|
||||
now = time()
|
||||
# now = time()
|
||||
q = self._queue_rec.get()
|
||||
get_queue_time_cost = time() - now
|
||||
if get_queue_time_cost > 1:
|
||||
print('get queue cost time', get_queue_time_cost)
|
||||
# get_queue_time_cost = time() - now
|
||||
# if get_queue_time_cost > 2:
|
||||
# print('get queue cost time', get_queue_time_cost)
|
||||
except:
|
||||
return False
|
||||
finally:
|
||||
@@ -190,7 +195,7 @@ class RecordingProcess(Process):
|
||||
current_time = time()
|
||||
if self._timer is not None:
|
||||
if current_time - self._timer > 1.5:
|
||||
print('time, sync_data routine_time', current_time, current_time - self._timer)
|
||||
print('time, sync_data routine_time', 'device:', self._device, datetime.now(), current_time, current_time - self._timer)
|
||||
self._isTimeOut = True
|
||||
self._timer = current_time
|
||||
|
||||
@@ -290,6 +295,7 @@ class RecordingProcess(Process):
|
||||
self._last_cnt[7] = head_counter - 1
|
||||
last_data_cnt = self._last_cnt[7]
|
||||
|
||||
# dont save to section when head or id is wrong
|
||||
if (head != 255 or device_id != device):
|
||||
save = False
|
||||
last_data_cnt = last_data_cnt + 1
|
||||
@@ -332,60 +338,57 @@ class RecordingProcess(Process):
|
||||
|
||||
return save
|
||||
|
||||
def _check_jump_ram(self, raw_data: bytes, colum_now: int, colum_total: int, save: bool, device: int):
|
||||
i = colum_now
|
||||
def _check_jump_ram(self, raw_data: bytes, colum_now: int, colum_total: int, save: bool, device: int, data_len: int):
|
||||
col = colum_now
|
||||
save = False
|
||||
|
||||
if (raw_data[i][0] == 255 and raw_data[i][3] == device):
|
||||
if colum_total < 3:
|
||||
print('this ram data < 3 records, need to fix, colum_total = ', colum_total)
|
||||
if colum_total == 1:
|
||||
print('raw_data[0]', raw_data[0])
|
||||
if raw_data[col][0] != 255 or raw_data[col][3] != device:
|
||||
return save
|
||||
|
||||
elif colum_total == 2:
|
||||
print('raw_data[0]', raw_data[0])
|
||||
print('raw_data[1]', raw_data[1])
|
||||
if colum_total == 1:
|
||||
print('this ram data < 3 records, colum_total = ', colum_total)
|
||||
print('raw_data[0]', raw_data[0])
|
||||
return save
|
||||
|
||||
else:
|
||||
elif colum_total == 2:
|
||||
print('this ram data < 3 records, colum_total = ', colum_total)
|
||||
print('raw_data[0]', raw_data[0])
|
||||
print('raw_data[1]', raw_data[1])
|
||||
if (raw_data[col + 1][1] - raw_data[col][1] == 1) or (raw_data[col][1] == 255 and raw_data[col + 1][1] == 0):
|
||||
save = True
|
||||
|
||||
if((raw_data[i + 1][1] - raw_data[i][1] == 1 and raw_data[i + 2][1] - raw_data[i + 1][1] == 1) or
|
||||
(raw_data[i][1] == 255 and raw_data[i + 1][1] == 0 and raw_data[i + 2][1] == 1) or
|
||||
(raw_data[i][1] == 254 and raw_data[i + 1][1] == 255 and raw_data[i + 2][1] == 0)):
|
||||
elif colum_total >= 3:
|
||||
if (raw_data[col + 1][1] - raw_data[col][1] == 1 and raw_data[col + 2][1] - raw_data[col + 1][1] == 1) or\
|
||||
(raw_data[col][1] == 255 and raw_data[col + 1][1] == 0 and raw_data[col + 2][1] == 1) or\
|
||||
(raw_data[col][1] == 254 and raw_data[col + 1][1] == 255 and raw_data[col + 2][1] == 0):
|
||||
save = True
|
||||
|
||||
if ((raw_data[i][1] == 255 and raw_data[i + 1][1] == 0 and raw_data[i + 2][1] == 1) or
|
||||
(raw_data[i][1] == 254 and raw_data[i + 1][1] == 255 and raw_data[i + 2][1] == 0)):
|
||||
print('cnt = [254, 255, 0] or [255, 0, 1]')
|
||||
if save == True:
|
||||
self._skip_ram_cnt += 1
|
||||
last_data_cnt = raw_data[col][1]
|
||||
if (device == 4):
|
||||
print('self._last_cnt[4]:', self._last_cnt[4], ', last_data_cnt:', last_data_cnt)
|
||||
if (device == 5):
|
||||
print('self._last_cnt[5]:', self._last_cnt[5], ', last_data_cnt:', last_data_cnt)
|
||||
if (device == 6):
|
||||
print('self._last_cnt[6]:', self._last_cnt[6], ', last_data_cnt:', last_data_cnt)
|
||||
if (device == 7):
|
||||
print('self._last_cnt[7]:', self._last_cnt[7], ', last_data_cnt:', last_data_cnt)
|
||||
|
||||
print('skip RAM, but data is right, solve data', list(raw_data[col][0:3]),'|', list(raw_data[colum_total-1][0:3]), 'skip Ram', self._skip_ram_cnt, 'times \n')
|
||||
|
||||
save = True
|
||||
self._skip_ram_cnt += 1
|
||||
last_data_cnt = raw_data[i][1]
|
||||
if (device == 4):
|
||||
print('self._last_cnt[4]:', self._last_cnt[4], ', last_data_cnt:', last_data_cnt)
|
||||
if (device == 5):
|
||||
print('self._last_cnt[5]:', self._last_cnt[5], ', last_data_cnt:', last_data_cnt)
|
||||
if (device == 6):
|
||||
print('self._last_cnt[6]:', self._last_cnt[6], ', last_data_cnt:', last_data_cnt)
|
||||
if (device == 7):
|
||||
print('self._last_cnt[7]:', self._last_cnt[7], ', last_data_cnt:', last_data_cnt)
|
||||
|
||||
print('skip RAM, but data is right, solve data', list(raw_data[i][0:3]),'|', list(raw_data[colum_total-1][0:3]), 'skip Ram', self._skip_ram_cnt, 'times \n')
|
||||
# print('data:')
|
||||
# print('|', list(raw_data[0]))
|
||||
# print('|', list(raw_data[1]))
|
||||
# print('| ... ... ...')
|
||||
# print('| ... ... ...')
|
||||
# print('|', list(raw_data[colum_total-1]))
|
||||
if (device == 4):
|
||||
self._last_cnt[4] = last_data_cnt
|
||||
|
||||
if (device == 4):
|
||||
self._last_cnt[4] = last_data_cnt
|
||||
elif (device == 5):
|
||||
self._last_cnt[5] = last_data_cnt
|
||||
|
||||
elif (device == 5):
|
||||
self._last_cnt[5] = last_data_cnt
|
||||
elif (device == 6):
|
||||
self._last_cnt[6] = last_data_cnt
|
||||
|
||||
elif (device == 6):
|
||||
self._last_cnt[6] = last_data_cnt
|
||||
elif (device == 7):
|
||||
self._last_cnt[7] = last_data_cnt
|
||||
|
||||
elif (device == 7):
|
||||
self._last_cnt[7] = last_data_cnt
|
||||
return save
|
||||
|
||||
def _neu_foreach_data_section(self, data: bytes):
|
||||
@@ -500,54 +503,59 @@ class RecordingProcess(Process):
|
||||
:return:
|
||||
"""
|
||||
raw_data = []
|
||||
index = 0
|
||||
elite_data_len = 40
|
||||
mem_header_len = 3
|
||||
mem_tailer_len = 8
|
||||
single_data_len = elite_data_len + mem_header_len + mem_tailer_len
|
||||
device = self._device
|
||||
records = 0
|
||||
print_flag = False
|
||||
device = self._device
|
||||
single_data_len = self._single_data_len
|
||||
mem_header_len = self._mem_header_len
|
||||
|
||||
# packet section data use two microarray
|
||||
for i in range(0, len(data), single_data_len):
|
||||
index = index + 1
|
||||
for j in range(index, index + 1):
|
||||
raw_data.append(data[i : i + single_data_len])
|
||||
|
||||
records = records + 1
|
||||
raw_data.append(data[i : i + single_data_len])
|
||||
if len(data[i : i + 10]) < 10:
|
||||
print('data dont be package:', raw_data[records - 1], 'index:', records - 1)
|
||||
del raw_data[records - 1]
|
||||
records = records - 1
|
||||
|
||||
# check cnt
|
||||
for i in range(index):
|
||||
for i in range(records):
|
||||
|
||||
# if jump cnt, don't save data
|
||||
save = self._check_cnt(raw_data[i], device)
|
||||
|
||||
# # if jump Ram, also can handle data
|
||||
if save == False:
|
||||
save = self._check_jump_ram(raw_data, i, index, save, device)
|
||||
save = self._check_jump_ram(raw_data, i, records, save, device, single_data_len)
|
||||
|
||||
if (save == True):
|
||||
section = raw_data[i]
|
||||
|
||||
if (section[0 : mem_header_len] == section[single_data_len - 3: single_data_len]):
|
||||
section = section + b'\x00'
|
||||
|
||||
else:
|
||||
section = section + b'\x01'
|
||||
print('header != tailer,',
|
||||
list(section[0 : mem_header_len]),
|
||||
list(section[single_data_len - 3: single_data_len]),
|
||||
'device:', device, ',', datetime.now())
|
||||
check_sum = sum(section[0 : single_data_len - 1]) & 0b11111111
|
||||
|
||||
if (check_sum != section[single_data_len - 1]):
|
||||
print('check number not match,',
|
||||
list(section[0 : mem_header_len]), section[-1], '!=', check_sum, 'device:', device, ',', datetime.now())
|
||||
if (i-1 >= 0):
|
||||
print('header != tailer', list(raw_data[i-1]), 'raw:', i-1)
|
||||
print('header != tailer', list(section), 'raw:', i)
|
||||
if (i+1 <= index):
|
||||
print('header != tailer', list(raw_data[i+1]), 'raw:', i+1, '\n')
|
||||
|
||||
section = section[3:]
|
||||
print('check number not match', list(raw_data[i-1]), 'raw:', i-1)
|
||||
|
||||
print('check number not match', list(raw_data[i]), 'raw:', i)
|
||||
|
||||
if (i+1 <= records):
|
||||
print('check number not match', list(raw_data[i+1]), 'raw:', i+1, '\n')
|
||||
section = section + b'\x01'
|
||||
|
||||
print('delete data:', list(raw_data[i][0:3]), 'raw:', i, '\n')
|
||||
continue
|
||||
else:
|
||||
section = section + b'\x00'
|
||||
|
||||
# section = section[3:]
|
||||
yield None, section
|
||||
|
||||
else:
|
||||
print_flag = True
|
||||
print('delete data:', list(raw_data[i][0:3]), 'raw:', i+1, '\n')
|
||||
print('delete data:', list(raw_data[i][0:3]), 'raw:', i, '\n')
|
||||
|
||||
# if print_flag:
|
||||
# print('delete data context:')
|
||||
|
||||
Reference in New Issue
Block a user