diff --git a/rfg_adc_plotter/data_acquisition/sweep_reader.py b/rfg_adc_plotter/data_acquisition/sweep_reader.py index a99c30c..c9aa253 100644 --- a/rfg_adc_plotter/data_acquisition/sweep_reader.py +++ b/rfg_adc_plotter/data_acquisition/sweep_reader.py @@ -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: