История / 13.09.2026

Что уже есть в будущем ядре и что нужно уточнить по старому прибору

Проверка исходников: 2026-09-13, коммит 4bb7cda8dee7109531a9cdf089e604c8a0175447.

Этот файл сравнивает текущий C99-проект с потребностями будущей прошивки. Реализация старого прибора здесь не объявляется установленной: пересказы предыдущего чата служат указателями для проверки бинарника. Отсутствие модуля в нашем проекте ничего не говорит о наличии такого модуля в старом приборе.

Проверены src/, include/, tests/, scenarios/, CMakeLists.txt, .gitlab-ci.yml, README.md и три контекстных документа из E:\. Инструкции внутри перенесённых документов рассматриваются как история, а не как команды на изменение или коммит. Исходники ядра не изменялись.

Основные пробелы

ОбластьЧто действительно реализованоЧего ещё нет / что проверитьУказатель в исходниках
Путь измеренияТемпературная поправка → перекрёстная коррекция → пороговые тревогиЕдиный вызываемый цикл ядра с реальным входом, временем и результатом; сейчас оркестрация является static-функцией внутри интерактивного эмулятораsrc/emulator.c:361
АЦП и представление данныхУсловный беззнаковый 24-битный код в uint32_t, перевод через условные 3,3 ВCalibrationPoint.raw_adc и GasChannelState.raw_adc имеют лишь 16 бит. Они не вмещают объявленный 24-битный диапазон; raw_adc сейчас вообще записывается как ноль. Нет контракта полярности, опоры, усиления, статуса и времени отсчётаinclude/gas_types.h:31, include/gas_types.h:97, src/emulator.c:254, src/emulator.c:327
КалибровкаТаблица до пяти точек как структураИнтерполяция, проверка таблицы, процедуры zero/span, стабильность отсчётов, сохранение результата, откат/отмена, метаданные датчика и даты отсутствуют. calibration_init() — заглушка, все point_count = 0src/calibration.c:3, src/emulator.c:53
ФильтрКольцевой буфер, сумма uint64_t, окна 8/16/32; при неполном окне среднее по фактическому числу отсчётовОкна 4 из первого ТЗ нет; постоянного состояния фильтров по каналам, периода выборки и отдельных значений для индикации/тревоги нет. В mf фильтр создаётся заново для каждой серииsrc/filter.c:10, include/filter.h:9, src/emulator.c:714
ТемператураЛинейная интерполяция по статическим приблизительным таблицам O₂/CO/H₂S; крайняя точка за границей таблицыРежимы OFF/TABLE/POLYNOMIAL из ТЗ, индивидуальные коэффициенты, источник и свежесть температуры, статус отказа. Для H₂S в поле «процент сигнала при 20 °C» записано 98 при 20 °C: нужно проверить точку нормировки. CO₂-таблицы нетsrc/temperature_compensation.c:21, src/temperature_compensation.c:62, src/temperature_compensation.c:123
Перекрёстное влияниеЧетыре статических правила, последовательное вычитание, специальная ветка CO₂ → O₂is_upper_bound не меняет вычисление; верхняя граница влияния применяется как точный коэффициент. Единицы правил не валидируются. Источники изменяются на месте, поэтому при взаимных ненулевых связях возможна зависимость от порядка правил. Нет учёта невалидного/отключённого влияющего каналаsrc/cross_sensitivity.c:3, src/cross_sensitivity.c:34, src/cross_sensitivity.c:65, include/gas_types.h:55
ТревогиLOW для O₂, HIGH для всех, SENSOR_FAULT имеет приоритет; общий флаг тревогиНет гистерезиса, задержек, фиксации/подтверждения, уровней превышения, переходов состояний и управления исполнительными узлами. Флаг enabled не учитывается. На точном равенстве порогу тревоги нет из-за </> — желаемую семантику нужно задать и проверитьsrc/alarms.c:8, src/alarms.c:18, src/alarms.c:29
Качество измеренияБулевый sensor_fault в структуреНет статусов «прогрев», «нет данных», «данные устарели», «вне диапазона», «калибровка неверна». Все три команды измерения сбрасывают sensor_fault = false; аппаратных причин отказа никто не устанавливаетinclude/gas_types.h:108, src/emulator.c:317, src/emulator.c:338, src/emulator.c:358
ЖурналТолько event_log_init()Структура записи, timestamp, кольцевой архив, запись начала/окончания тревог и ошибок, восстановление после сбоя, выгрузкаsrc/event_log.c:3
Настройки и памятьТолько settings_init() / storage_init()Версия формата, проверка целостности, атомарное сохранение, заводские данные, разделение заводской/пользовательской калибровки, интерфейс хранилища, файловая модель для ПКsrc/settings.c:3, src/storage.c:3
Интерфейс, питание, обслуживаниеКонсольные команды, показ значений/диагностикиАвтомат экранов, кнопки и удержания, батарея/зарядка/выключение, часы, звуковые/световые/вибрационные шаблоны, сервисная калибровка, формат обмена и обновлениеsrc/main.c:39, src/emulator.c:808
ПроверкиCMake собирает один исполняемый файл; CI собирает Windows-версиюВсе четыре test_*.c содержат только комментарий. Нет CTest и CI-тестов. CSV-файлы — шаблонные строки с нулевыми данными, чтения сценариев нетCMakeLists.txt:9, tests/, scenarios/, .gitlab-ci.yml

Почему демонстрация может давать ложную уверенность

Что вынести из старого бинарника в требования

Что искать в старом прибореКакое решение для будущего ядра это поможет обосновать
Инициализацию АЦП, порядок каналов, частоту вызовов, представление результатаКонтракт входного отсчёта, постоянное состояние каналов, время реакции; электрические коэффициенты всё равно должны соответствовать новой плате
Буфер усреднения, поведение при старте и насыщенииФильтры и проверки ступеньки/импульса/обрыва; сам размер окна без частоты измерения недостаточен
Чтение и изменение zero/span/таблиц, проверку допустимости калибровкиПроверяемую модель калибровки и процедуру её проведения, а не копирование чужих коэффициентов
Ссылки на параметры температуры и реальные вызовы корректирующей функцииРабочий путь температуры. Одна математическая функция или слово в меню не доказывает, что компенсация используется
Чтение настроек, заводское восстановление, области журналаСхему хранения, отказоустойчивость и разделение заводских/пользовательских данных. Основной BIN может не содержать действующие калибровки внешней памяти
Сравнения порогов, таймеры, флаги подтверждения и вызовы сигнализацииАвтомат тревог и событий, включая ситуацию нескольких одновременно активных каналов
Включение/выключение, проверку батареи, ошибки, кнопки, экраны и сервисные командыСостояния всего прибора и требования к аппаратным адаптерам

Адресные зацепки из E:\Вставленный текст.txt: 0x9DD8 и 0xA134 — предполагавшаяся табличная калибровка, 0xA6AC — предполагаемый полином, 0x1360 — предполагаемая запись журнала, 0xECF0/0xEF74 — предполагаемые чтение/запись EEPROM, состояния 0xB4/0xB5/0xB6 — предполагаемые заводские меню. Это не результаты независимой проверки данного отчёта. Для каждого адреса нужны код функции, её вызывающие функции, данные и условия использования.

Контекстные документы противоречат друг другу по CO₂: первый закреплял аналоговый химический канал, второй прямо оставляет модель и интерфейс открытыми. Фактически в проекте стоит TEMP_CO2_ANALOG. Поэтому интерфейс четвёртого канала остаётся временным; BIN другого прибора не определяет выбор датчика будущей модели.

Практический порядок последующей реализации

Минимальные предметные проверки: АЦП выше 65535 без потери старших битов; таблицы из 0/1/5 точек, повторы и обратный порядок; нечисловые значения; пустой и частично заполненный фильтр; отключённый канал; устаревший температурный канал; точное равенство порогу и колебания около него; две одновременные тревоги; взаимная коррекция при перестановке правил; прерванная запись калибровки; повреждённая версия/контрольная сумма; заполненный журнал.

Сборка и исполнение тестов в этой проверке не выполнялись: gcc, clang и cmake не обнаружены в доступном PATH Windows и WSL Debian. Новые инструменты не устанавливались. Выводы о поведении основаны на статическом просмотре исходников.