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