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._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 # Режим калибровки (0–7), -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,18 +211,33 @@ 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 — цифра режима калибровки 0–7 (слитно с '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":
|
||||||
|
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
|
||||||
|
if len(data_parts) >= 2:
|
||||||
try:
|
try:
|
||||||
x = int(parts[1], 10)
|
x = int(data_parts[0], 10)
|
||||||
y = int(parts[2], 10) # поддержка знака: "+…" и "-…"
|
y = int(data_parts[1], 10)
|
||||||
except Exception:
|
except Exception:
|
||||||
self._total_parse_errors += 1
|
self._total_parse_errors += 1
|
||||||
continue
|
continue
|
||||||
@ -227,7 +245,9 @@ class SweepReader(threading.Thread):
|
|||||||
ys.append(y)
|
ys.append(y)
|
||||||
self._total_lines_received += 1
|
self._total_lines_received += 1
|
||||||
else:
|
else:
|
||||||
# Строка не в формате "s X Y"
|
self._total_parse_errors += 1
|
||||||
|
else:
|
||||||
|
# Строка не начинается с '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:
|
||||||
|
|||||||
Reference in New Issue
Block a user