Требования / 13.09.2026

Предлагаемые требования к будущей прошивке

Это проект требований по результатам реверса и проверки текущего C99-ядра. Он не изменяет утверждённое ТЗ и не является метрологическим/нормативным заключением. Код старого изделия — источник наблюдений, а коэффициенты и пороги нового должны соответствовать выбранным сенсорам и плате.

Минимальное работоспособное ядро

IDТребованиеПроверка готовностиОснование
M01Единый шаг ядра принимает значение, единицы/масштаб, тип источника, время и качество; каждый слот имеет отдельное состояниеПодать отсчёты двух каналов с разной частотой, убедиться в независимости состояния и свежестиСтарое 0xAEC4, нынешняя оркестрация в эмуляторе
M02Разрядность реального ADC не теряется между входом, калибровкой и журналомКоды 65535, 65536, середина и верх выбранного 24-битного диапазона; signed/unipolar по контрактуВ проекте u16-поля при 24-битном эмуляторе
M03Нет данных, прогрев, устаревшие данные, насыщение, отказ и невалидная калибровка — отдельные состояния, не обычный нольПустая серия, обрыв потока, полная шкала, NaN/Inf на float-входе; отсутствие ложной «нормы»Нынешний mf; старое ограничение диапазона
M04Фильтр работает непрерывно и видит только отсчёты/разрешённые аппаратные статусы, не истину генератораСтупенька, одиночный выброс, серия выбросов, старт, пропуск, разные интервалы времениСтарые 4 слоя; метка generated_outlier в эмуляторе
M05Задано время реакции всего тракта и обнаружения опасного измененияИзмерить от подачи ступеньки до тревоги; проверять худший фазовый сдвиг сканированияКоличество фильтров без временной базы недостаточно
M06Экран предупреждения не останавливает обработку измерений и опасных тревогНизкий заряд одновременно с газовым превышением; длинное меню/запись; контролируемая загрузка CPUВ старом режиме батареи 7 пропускается 0xAEC4
C01Калибровка — реальное преобразование ADC/сигнала, с направлением и проверенной таблицейУзлы, промежутки, границы, 0/1/MAX точек, дубли x, неверный порядок, переполнение0x9A7C, 0xA9A4; calibration.c пока пуст
C02Поведение вне таблицы явно выбрано: ошибка/ограничение/экстраполяция с признакомНиже нуля, выше span, отрицательный или невозможный результатСтарый код экстраполирует и затем ограничивает
C03Zero/span workflow использует устойчивый сигнал и откат до подтверждённого сохраненияНестабильный газ, отмена, отключение датчика, плохой эталон, перезапуск до/во время записиСтарые меню и текущие/заводские поля
C04Калибровка имеет температуру, дату, идентификатор профиля сенсора и версию моделиНесовместимый профиль/версия не применяются молчаСтарое поле температуры +0x30; выбранная новая плата
T01Температурная модель профиля имеет допустимый диапазон и политику отказаГраницы диапазона, отсутствие температуры, скачок и устаревание; непрерывность результатаУсловия T/Tcal и полиномы старого прибора
T02Межгазовая коррекция не зависит от порядка обхода и не принимает верхнюю оценку влияния за точный коэффициент без решенияПерестановка каналов/правил; неизвестный или отключённый влияющий канал; отрицательный результатПроверка cross_sensitivity.c; старая реализация пока не установлена
A01Пороговая схема — параметр типа канала: две верхние ступени либо допустимый интервалL-1, L, L+1, H-1, H, H+1; все предшествующие состоянияИсходные ARM-тесты 0xC1F6
A02Гистерезис/задержка/фиксация тревог заданы явно, со временемКолебание вокруг порога, короткий всплеск, устойчивое превышение, снятие и новая высокая тревогаВ старом фрагменте нет отдельного гистерезиса
A03Для тревог выбран документированный сигнал; оформление экрана не меняет его скрытоДва разных входа в зоне «прилипания» экрана: проверить сохранение правильной тревожной семантикиСтарое 203<x<=216→209 влияет на общий итог
A04Оповещение имеет приоритеты и правила подтверждения/отключения звукаДва одновременно активных канала, переход L→H и H→L, отказ, батарея, новое событие при mute0x1534, общие flags и несколько видов выходов
S01Формат настроек/калибровок сериализован отдельно от C-структур32/64-битный хост, другой padding, повреждённые длина/версия/CRC; указатели не сохраняютсяВ текущих структурах есть pointers и size_t
S02Заводская и рабочая копии раздельны; сохранение атомарно и проверяет ошибкиОбрыв после каждого шага записи; отказ NVM; загрузка предыдущей валидной копииСтарые backup-поля, игнорируемые статусы
L01Журнал имеет sequence/head/count и определённую политику заполненияЁмкость−1/ёмкость/ёмкость+1; многократное кольцо; перезапуск и повреждённая записьСтарый счётчик обнуляется на 2000
L02Все байты записи инициализированы; значение и качество однозначныH после L другого канала, снятие тревоги, ошибочная запись и невозможное времяСтарые поля H/L и неинициализированный +1
U01Состояния прибора отделены от экранов: запуск, прогрев, работа, калибровка, заряд, выключение, отказПереходы и отмены, таймаут, перезапуск; доступность тревог в каждом режимеСтарое gating по состоянию >=10
U02Самотест различает команду выходу и подтверждение исправностиОтключённый свет/звук/вибрация; если обратной связи нет, не сообщать доказанную исправностьStartup реально включает выходы, но feedback не подтверждён
U03Опасные сервисные операции явно подтверждаются и журналируютсяОтмена не меняет память; восстановление отличается от перезаписи заводской копииМеню B5/B6 старого бинарника

Порядок реализации

Не требуется воспроизводить внутренний 57-байтный формат, расположение EEPROM, номера GPIO, пороги или эмпирические «подгонки» старого прибора. Требуется понимать их назначение и иметь проверяемую собственную реализацию.