add new data format support

This commit is contained in:
awe
2026-02-10 20:02:55 +03:00
parent 2f6e5d0dda
commit f89dedf4ab

View File

@ -45,8 +45,9 @@ class SweepReader(threading.Thread):
self._max_buf_size: int = 0 # Максимальный размер буфера парсинга self._max_buf_size: int = 0 # Максимальный размер буфера парсинга
self._read_errors: int = 0 # Ошибок чтения из порта self._read_errors: int = 0 # Ошибок чтения из порта
self._last_diag_time: float = 0.0 # Время последнего вывода диагностики self._last_diag_time: float = 0.0 # Время последнего вывода диагностики
self._cal_mode: int = -1 # Режим калибровки (07), -1 = неизвестен
def _finalize_current(self, xs, ys): def _finalize_current(self, xs, ys, cal_mode: int = -1):
if not xs: if not xs:
return return
max_x = max(xs) max_x = max(xs)
@ -133,6 +134,7 @@ class SweepReader(threading.Thread):
"parse_err": self._total_parse_errors, "parse_err": self._total_parse_errors,
"read_err": self._read_errors, "read_err": self._read_errors,
"max_buf": self._max_buf_size, "max_buf": self._max_buf_size,
"cal_mode": cal_mode,
} }
# Периодический вывод детальной диагностики в stderr (каждые 10 секунд) # Периодический вывод детальной диагностики в stderr (каждые 10 секунд)
@ -166,6 +168,7 @@ class SweepReader(threading.Thread):
# Состояние текущего свипа # Состояние текущего свипа
xs: list[int] = [] xs: list[int] = []
ys: list[int] = [] ys: list[int] = []
current_cal_mode: int = -1 # Режим калибровки для текущего свипа
try: try:
self._src = SerialLineSource(self._port_path, self._baud, timeout=1.0) self._src = SerialLineSource(self._port_path, self._baud, timeout=1.0)
@ -208,26 +211,43 @@ class SweepReader(threading.Thread):
continue continue
if line.startswith(b"Sweep_start"): if line.startswith(b"Sweep_start"):
self._finalize_current(xs, ys) self._finalize_current(xs, ys, current_cal_mode)
xs.clear() xs.clear()
ys.clear() ys.clear()
current_cal_mode = -1
continue continue
# s X Y (оба целые со знаком). Разделяем по любым пробелам/табам. # Формат строки данных: "sN X Y" или "s X Y"
# где N — цифра режима калибровки 07 (слитно с 's')
# X — индекс точки, Y — значение (целое со знаком)
if len(line) >= 3: if len(line) >= 3:
parts = line.split() parts = line.split()
if len(parts) >= 3 and parts[0].lower() == b"s": if parts and len(parts[0]) >= 1 and parts[0][:1].lower() == b"s":
try: tag = parts[0].lower() # b"s" или b"s0"..b"s7"
x = int(parts[1], 10) if len(tag) == 2 and b"0" <= tag[1:2] <= b"7":
y = int(parts[2], 10) # поддержка знака: "+…" и "-…" # Новый формат: режим калибровки встроен в тег
except Exception: current_cal_mode = int(tag[1:2])
data_parts = parts[1:]
elif len(tag) == 1:
# Старый формат: "s X Y"
data_parts = parts[1:]
else:
self._total_parse_errors += 1 self._total_parse_errors += 1
continue continue
xs.append(x) if len(data_parts) >= 2:
ys.append(y) try:
self._total_lines_received += 1 x = int(data_parts[0], 10)
y = int(data_parts[1], 10)
except Exception:
self._total_parse_errors += 1
continue
xs.append(x)
ys.append(y)
self._total_lines_received += 1
else:
self._total_parse_errors += 1
else: else:
# Строка не в формате "s X Y" # Строка не начинается с 's'
self._total_parse_errors += 1 self._total_parse_errors += 1
else: else:
# Строка слишком короткая # Строка слишком короткая
@ -239,7 +259,7 @@ class SweepReader(threading.Thread):
finally: finally:
try: try:
# Завершаем оставшийся свип # Завершаем оставшийся свип
self._finalize_current(xs, ys) self._finalize_current(xs, ys, current_cal_mode)
except Exception: except Exception:
pass pass
try: try: