Калибровка: реализованный этап
Добавлено аппаратно-независимое преобразование 24-битного кода АЦП в концентрацию
по 2–5 опорным точкам. Две точки описывают zero/span; дополнительные точки задают
кусочно-линейную характеристику. В пределах каждого участка используется линейная
интерполяция с промежуточной арифметикой double. Коэффициенты старого прибора не копировались.
Правила
- Коды АЦП: целые 0..16777215. Концентрации: конечные, неотрицательные.
- Обе координаты строго монотонны, направление каждой может быть любым.
- Повторы, смена направления, NaN/Infinity, неверное количество точек запрещены.
- За пределами опорных точек преобразование возвращает ошибку; выходной параметр
функции не изменяется. Конвейер при этом выставляет качество ошибки и NaN
вместо текущей концентрации. Предыдущий числовой результат не выдаётся за свежий.
- Проверяется также исходный код до усреднения: фильтр не прячет выход за диапазон.
- Валидная замена таблицы через
measurement_pipeline_set_calibrationсбрасывает
фильтр и текущую концентрацию. Невалидная замена ничего не меняет.
- Ошибка входа и устаревание сбрасывают окно. Новые данные проходят новый набор окна.
Во время WARMUP концентрация предварительная: превышение порога уже сигнализируется,
иначе тревога NOT_READY, а не NORMAL.
- Временные метки модульные uint32 в миллисекундах. Последовательные наблюдения
должны различаться менее чем на 2^31 мс. Обратные метки отклоняются.
Эмулятор
mv: один отсчёт на канал. mf: серия с выбранным окном, шумом и выбросами.
Обе команды используют общий модуль фильтрации/калибровки. Выбросы не отбрасываются:
генератор больше не сообщает фильтру, какой отсчёт он специально испортил.
cal: ручной ввод 2–5 точек для канала 1..4, изменение в ОЗУ; save сохраняет на ПК.
m: отдельный демонстрационный ввод готовой концентрации, обходит калибровку;
поля тока и АЦП в этом режиме — синтетические, не измеренные.
Время эмулятора виртуальное: по 100 мс на отсчёт каждого канала. Ожидание ввода
пользователем не моделирует обрыв датчика; устаревание проверяется тестами ядра.
При ошибке хотя бы одного канала демонстрационная перекрёстная коррекция пропускается
для всего набора: отсутствующий источник не подменяется нулём. Это ограничение
эмулятора, не законченная политика измерений реального прибора.
Проверки и оставшаяся работа
CTest: фильтр, калибровка, тревоги, интеграция конвейера; при наличии Python —
также автоматический ввод команд эмулятора. Проверки C остаются включены в Release.
В конфигурацию CI добавлен запуск тестов Linux перед сборкой Windows; удалённый
pipeline требуется запустить после отдельного решения о публикации изменений.
Последующие программные этапы уже добавлены: температура калибровки, обратное
преобразование, стабильный zero/span-сеанс, версии и файловое хранение.
См. текущее состояние. Подача эталонного газа и физические испытания
не выполнялись. Нет записи EEPROM/Flash, настройки АЦП или проверки метрологии;
прошивка не готова к использованию как средство защиты от опасной газовой среды.