================================================================================ RGBW_WS2812 — карта Modbus (текстовая сводка) Продукт: RGBW PWM (TIM3) + адресная лента WS2812 (SPI1), STM32F030CC. Два порта RS-485, одна карта и один адрес (как CE-02m-3). Контракты: docs/contracts/modbus-rgbw.md, docs/contracts/dual-port-modbus.md Источник истины кодов: Core/Inc/svc_mb_mr02_rgbw.h, svc_rgbw_di_ctrl.h, svc_mb_mb2ws.h ================================================================================ Поддерживаемые функции (типично, на каждом порту): 0x01 Read Coils 0x05 Write Single Coil 0x0F Write Multiple Coils 0x02 Read Discrete Inputs 0x03 Read Holding Registers 0x06 Write Single Register 0x10 Write Multiple Registers 0x04 Read Input Registers Адресация: нулевая база (регистр N в документе = адрес N в запросе). Единицы по умолчанию: Яркость PWM (holding 1–4 / 33–36): permille 0..1000 (1000 = 100 %). Шкала MB2WS (reg 460): 0..1000 (1000 = 100 % диапазона индикатора). Температура платы / МК: x0.1 °C (253 = 25.3 °C). -------------------------------------------------------------------------------- ДВА ПОРТА RS-485 — ОБЩАЯ КАРТА (CE-02m-3) -------------------------------------------------------------------------------- | Порт | UART | TX/RX | DE | Роль | Карта Modbus | |------|--------|--------------|------|-------------------|---------------------------------------| | A | USART2 | PA2 / PA15 | PA12 | Основной разъём | Одна общая карта (ниже) | | B | USART1 | PA9 / PA10 | PA11 | Вспомогательный | Та же карта, тот же unit id (рег. 128)| • Оба `nmbs` / `nmbs_aux`: `get_modbusaddress()` + общие callbacks / один map. • Holding **128** — общий адрес; last-writer-wins на baud/config. • Holding **122** — режим шины (семейные/CE правила). • Пины/таймеры RGBW не копировать с CE: TIM3=PWM; Port A DE=PA12, RX=PA15; Port B DE=PA11 (не автонаправление CE). Источник: Core/Inc/main_board.h. t3.5 Port B = TIM16/TIM17. • Aux выкл. при `COM_PORT_DEBUG` (как CE). ВАЖНО: контракт НЕ включает регистры Wiren Board WB-LED (диапазон 2000+). Product-блоки — в свободных низких диапазонах по порядку (не 1400+/1500+). Индекс product / семейство (holding / input): 1–4 / 33–36 AO-mirror / яркость silk R/G/B/W 49 strip mode 0…11 50–101 логический диммер (svc_rgbw_dimmer) 110–134 семейные (baud, 122, 128, 134, …) 135–186 DI local control (svc_rgbw_di_ctrl) 200–219 model ASCII 220–237 счётчики нажатий / энкодера 503–506 / 600–603 safe AO / safe coil 400–493 MB2WS control (settings/cmd/status/identity) 1100+ MB2WS pixel pool 4000+ EXFX upload ================================================================================ ОБЩАЯ КАРТА — MR-02m-like + RGBW PWM (оба порта) ================================================================================ Источник: shared/modbus + svc_mb_mr02_rgbw / svc_rgbw_dimmer / svc_wb_inputs / svc_rgbw_di_ctrl / svc_rgbw_protect. Input/Holding 0 = тип 120. -------------------------------------------------------------------------------- INPUT REGISTERS (FC04; зеркало FC03 где указано) -------------------------------------------------------------------------------- Addr Hex Тип R/W Описание -------- -------- ------ --- ------------------------------------------------ 0 0x0000 uint16 RO Тип модуля = 120 (RGBW_WS2812). 18–21 0x0012–15 uint16 RO DI IN1..IN4 (0/1), зеркало discrete 18–21. 37–40 0x0025–28 uint16 RO OCP-флаг канала R/G/B/W: 0=норма, 1=превышение ≈5 А (LM2903, шунт 10 мОм, Vref≈49.5 мВ; R/G ← PA1, B/W ← PA4, active-low). Аналоговые мА — FUTURE (rgbw_isense). 105–106 0x0069–6A uint16 RO Uptime u32 сек (мл. / ст.). 114 0x0072 uint16 RO Наработка, сутки. 123 0x007B uint16 RO VDDA, 0.01 В (328 = 3.28 В). 124 0x007C int16 RO Температура МК, 0.1 °C. 131 0x0083 int16 RO Температура платы OTP/NTC (у силовых), 0.1 °C. PA3 / ADC_IN3; 0 если неизвестен. 132 0x0084 uint16 RO Напряжение шины VLED 12–48 В, 0.01 В (PA0 / ADC_IN0 + делитель; напр. 2400 = 24.00 В). 200–219 0x00C8–DB — RO Модель ASCII «RGBW_WS2812». 220–223 0x00DC–DF uint16 RO Счётчик короткого нажатия IN1..IN4. 224–227 0x00E0–E3 uint16 RO Счётчик длинного нажатия IN1..IN4. 228–231 0x00E4–E7 uint16 RO Счётчик двойного нажатия IN1..IN4. 232–235 0x00E8–EB uint16 RO Счётчик короткое+длинное IN1..IN4. 236–237 0x00EC–ED uint16 RO Счётчик шагов энкодера 1 / 2. (ранее 364–365 / 464–515 — сняты). 270–271 0x010E–0F uint16 RO Fast Modbus serial address u32. Умолчание прошивки 235606384 = 0x0E0B1170 (с 1.0.2.2; ранее 0x0E0AC350). Окно валидности серийника расширено до 0x0E0A..0x0E0B (приложение + BL, 1.0.2.2). 290–301 0x0122–2D — RO Сигнатура 12 байт: «LED» (с 1.0.2.2; ранее «RGBW_WS2812»). Модель 200–219 — по-прежнему «RGBW_WS2812». 320–325 0x0140–45 — RO Версия прошивки + packed u32. 330–337 0x014A–51 — RO Версия загрузчика ASCII. 340–343 — RW* Пороги событий Fast Modbus (семейные; *holding). 65468–65519 Input RO Семейная диагностика (см. «Состояние МК»). 64256+ Input RO Flash-метрики (семейные). Прочие адреса Port A вне таблиц: чтение 0 (сквозная адресация). -------------------------------------------------------------------------------- HOLDING REGISTERS — RGBW PWM / safe / DI-ctrl / семейство -------------------------------------------------------------------------------- Addr Hex Тип R/W Описание -------- -------- ------ --- ------------------------------------------------ 0 0x0000 uint16 RO Тип модуля = 120 (зеркало input 0). 1–4 0x0001–04 uint16 RW AO-mirror R/G/B/W: запись 0 = выкл. канала; >0 = enable + яркость permille (clamp 1000). Чтение: 0 если выкл., иначе target permille. 17 0x0011 uint16 RO Упакованные coils DO 1..4 (биты 0..3). Запись — illegal. 18–21 0x0012–15 uint16 RO DI IN1..IN4 (0/1), зеркало discrete/input. 33–36 0x0021–24 uint16 RW Яркость R/G/B/W, permille 0..1000 (EEPROM via capture). >1000 → clamp. Protect может снижать фактический PWM (overlay), не меняя регистр. Роли каналов зависят от holding 49. 37–40 0x0025–28 uint16 RO OCP-флаг R/G/B/W 0/1 (зеркало input 37–40). 49 0x0031 uint16 RW Режим силовых выходов (последовательные 0…11): 0=RGB+W, 1=W+W+W+W, 2=CCT+CCT, 3=CCT+W+W, 4=2×W+2×W, 5=4×W, 6=2×W+W+W, 7=2×W+CCT, 8=CCT+2×W, 9=W+W+CCT, 10=W+W+2×W, 11=2×CCT. Шёлк: R,G,B,W. EEPROM magic A2B2 (migrate A2B0/A2B1). См. svc_rgbw_pwm.h / svc_rgbw_dimmer.h. --- Логический диммер (svc_rgbw_dimmer; 50–101; НЕ WB 2000+) --- 50 0x0032 uint16 RW Fade, мс (также sync fade_up/dn). 51 0x0033 uint16 RW Частота ШИМ, Гц (100…24000, def 3000). 52 0x0034 uint16 RW Нормализация мощности CCT (0/1). 53 0x0035 uint16 RW DI в safe: 0=разрешить, 1=блок в safe, 2=только в safe. 54 0x0036 uint16 RW Энкодер ниже min: 0=выкл канал, 1=держать min. 55–58 0x0037–3A uint16 RW Power-on ch R..W: 0=off, 1=last, 2=on, 3=on+level. 59–62 0x003B–3E uint16 RW Power-on level, permille. 63–66 0x003F–42 uint16 RW Min яркость канала, permille (def 10). 67–70 0x0043–46 uint16 RW Max яркость канала, permille (def 1000). 71 0x0047 uint16 RW HSV Hue 0…359 (режим RGB+W). 72 0x0048 uint16 RW HSV Sat 0…1000. 73 0x0049 uint16 RW HSV Val 0…1000. 74–75 0x004A–4B uint16 RW CCT1 temp / brightness 0…1000. 76–77 0x004C–4D uint16 RW CCT2 temp / brightness (2×CCT → = CCT1). 78–79 0x004E–4F uint16 RW Fade up / down, мс. 80–101 0x0050–65 uint16 RW Auto-Change: пары action/period для Hue,Sat,Val,CCT1t,CCT1b,CCT2t,CCT2b,R,G,B,W. action: 0=stop,1=dec,2=inc,3=ping-pong; period: мс/шаг. В safe все серии стоп. Persist extras: sensor_calibration[0..7], magic 0xD102. --- Семейные holding (shared/modbus) --- 110 0x006E uint16 RW Baud (код; 1152 = 115200). Общий для обоих портов. 111 0x006F uint16 RW Чётность: 0=нет, 1=нечёт, 2=чёт. 112 0x0070 uint16 RW Стоп-биты: 1 или 2. 120 0x0078 uint16 WO Перезагрузка МК (≠0). 122 0x007A uint16 RW Режим шины: 0=Modbus, 1=Fast Modbus. Значение 2 (BACnet MS/TP) существовало в 1.0.1.52..1.0.2.4 и УДАЛЕНО вместе со стеком BACnet в 1.0.3.0 — запись 2 даёт exception 3. docs/contracts/bus-protocol.md 125 0x007D uint16 RW Маска системных групп Fast Modbus. 126 0x007E uint16 WO Команда «все системные группы» on/off. 128 0x0080 uint16 RW Modbus slave address, 1..246 (оба порта). Заводское значение 13 (с 1.0.2.2; ранее 15). 129 0x0081 uint16 WO ≠0 → reboot в загрузчик. 131 0x0083 int16 RO Температура платы NTC (зеркало input 131). 132 0x0084 uint16 RO VLED шина 0.01 В (зеркало input 132). 133 0x0085 uint16 RW Время «бегущей строки» (×10 мс в read path). 134 0x0086 uint16 RW Таймаут неактивности Modbus, сек (0=выкл.). --- Локальное управление со входов (svc_rgbw_di_ctrl; 135–186) --- 135–138 0x0087–8A uint16 RW Режим входа IN1..IN4: 0 = кнопка (short/long/double/short+long); 1 = выключатель с фиксацией. 139–142 0x008B–8E uint16 RW Действие: короткое / положение «Вкл» (switch). 143–146 0x008F–92 uint16 RW Действие: длинное / положение «Выкл» (switch). 147–150 0x0093–96 uint16 RW Действие: двойное нажатие. 151–154 0x0097–9A uint16 RW Действие: короткое + длинное. 155–158 0x009B–9E uint16 RW Порог длинного нажатия, мс (500…5000, def 1000). 159–162 0x009F–A2 uint16 RW Окно второго нажатия, мс (0…2000, def 300; 0 = double/shortlong выкл.). 163–166 0x00A3–A6 uint16 RW Debounce, мс (10…2000, def 50; энкодер → 10). 167–170 0x00A7–AA uint16 RW Скорость dim при удержании, мс/шаг (5…500, def 20). 171–174 0x00AB–AE uint16 RW Шаг short/inc-dec, permille 1…1000 (def 10). 175–178 0x00AF–B2 uint16 RW Шаг double, permille 1…1000 (def 10). 179–180 0x00B3–B4 uint16 RW Энкодер 1/2 тип: 0=выкл, 1=AB (пары IN1/IN2 и IN3/IN4). 181–182 0x00B5–B6 uint16 RW Цель энкодера: 0..3 = R/G/B/W, 4 = RGB, 5 = все, 6=Hue, 7=Sat, 8=Val, 9..12=CCT1/2 T/bri. 183–184 0x00B7–B8 uint16 RW Шаг энкодера, permille (def 10). 185–186 0x00B9–BA uint16 RW Импульсов AB на логический шаг (def 4). Упаковка действия (как WB-LED): value = (action << 12) | target action: 0=none, 1=coil off, 2=coil on, 3=toggle, 4=all-off, 9=inc, 10=dec, 11=up/down (удержание). target: coil 1..6 для coil-действий; канал 0..3 (R/G/B/W) или 4=RGB / 5=все / 6..12 логические (Hue/Sat/Val/CCT) для dim. Заводские: INn short = toggle coil n; long = up/down dim ch (n−1). Персист EEPROM: ПОЛНЫЙ набор настроек DI переживает перезагрузку — mode + short/long + тип/цель энкодера 1 в rgbw_cfg_reserved (magic 0xD101); double + short+long + тайминги (155–178) + шаг/импульсы/цель энкодера 2 (181–186) в расширенном блоке (хвост ai_settings, magic 0xD1E2, с 1.0.2.2). Старые образы: short/long сохраняются, новые поля берут заводские значения. Тайминги/шаги квантуются при хранении (шаг permille — кратно 10, тайминги — кратно 5..50 мс); заводские значения кратны — переживают без искажения. --- Safe-state / factory --- 503–506 0x01F7–FA uint16 RW Safe-state PWM R/G/B/W, permille 0..1000. С 1.0.2.2 ПРИМЕНЯЕТСЯ на выходы PWM при таймауте связи (holding 134): каналы устанавливаются на эти уровни по схеме рег 49 (параллельные пары / 4×W следуют топологии). Гейт reg 600–603. С 1.0.2.2 СОХРАНЯЕТСЯ в EEPROM (запись взводит coalesce; svc_rgbw_config голова au8_safe_ao) — после перезагрузки уровни восстанавливаются. 600–603 0x0258–5B uint16 RW Safe-state coil R/G/B/W (0/1). С 1.0.2.2 задаёт, какие каналы включаются в safe-режиме: 0 = канал гасится независимо от 503–506. Не «липкий»: следующая команда/уровень (после возобновления обмена) возвращает нормальную работу. С 1.0.2.2 СОХРАНЯЕТСЯ в EEPROM (4 бита в svc_rgbw_config голова u8_safe_do_mask) — после перезагрузки флаги восстанавливаются. 1001 0x03E9 uint16 WO Factory reset EEPROM (отложенно, main loop). RGBW: оба RS-485 — слейвы, 115200 8N1, адрес 13 (holding 128 / 110–112); WorkPort Spy 640 = 0. 1005–1006 0x03ED–EE uint16 WO Серийный номер FC16 (lo/hi). -------------------------------------------------------------------------------- EXFX UPLOAD (оба порта, app-only) — W25Q128 slot program -------------------------------------------------------------------------------- Источник: svc_exfx_flash_prog.h / Core/Inc/exfx_flash_prog_core.h. Не пересекается с BL-окнами 0x1000/0x2000. Только режим приложения. Лимиты v1: 32 слота, max 64 KiB на образ (multi-sector), led_count ≤ pool. База decimal 4000 (раньше 0x3000=12288); смещения +0x80 / +0x100 сохранены. Addr Hex Тип R/W Описание -------- -------- ------ --- ------------------------------------------------ 4000– 0x0FA0–AF uint16 RW* EXFX info (16 regs / 32 B LE): 4015 [0..1] magic u32 = 0x45584658 («EXFX»); [2] slot 0..31; [3] reserved; [4..5] total_bytes u32; [6..7] crc32 u32 (zlib CRC всего образа слота); [8] sector_count (0 = вычислить); [9..15] reserved. FC16 qty=16 @ 4000 запускает erase. 4016 0x0FA8 uint16 RO Status: 0 IDLE, 1 ERASING, 2 PROGRAMMING, 3 VERIFY, 4 DONE, 5 ERROR. (на READ перекрывает info[8]; WRITE info — OK) 4017 0x0FA9 uint16 RO Progress bytes lo. 4018 0x0FAA uint16 RO Progress bytes hi. 4019 0x0FAB uint16 RO Last error (0=none; см. EXFX_ERR_*). 4128 0x1020 uint16 WO Commit: 1=verify CRC→DONE/ERROR; 2=abort. 4256– 0x10A0– uint16 WO Data window (sequential stream): FC16 до 123 4378 0x111A regs (246 B). Каждый word (в т.ч. развёртка FC16 в per-reg) дописывает 2 LE-байта в образ. Адрес внутри окна — не абсолютный offset. *После полного info начинается ERASING (main-loop, non-blocking sector erase). Play слота — MB2WS (RenderSource=FLASH @402, FlashSlot @415, LOAD_FLASH / PlayCtrl @416 / cmd 430). Доступно с любого порта. -------------------------------------------------------------------------------- COILS и DISCRETE INPUTS (оба порта) -------------------------------------------------------------------------------- Coils 1–4 (RW): enable каналов R / G / B / W (TIM3 PWM). 1 = включён, 0 = выключен. Биты зеркалятся в holding 17. CH bar LED на MCU нет (`RGBW_HAS_CH_BAR_LEDS=0`); статус — PB6/PB2. Coils 5–6 (RW): группы: 5 — RGB (R+G+B; W выкл. при включении группы); 6 — все каналы R+G+B+W. Coils 7–17: не используются (чтение 0; запись — illegal или no-op). max_set_coil_address = 6. Discrete inputs 18–21 (RO, FC02): сухие входы IN1..IN4 (active low, debounce). 1 = замкнут на GND, 0 = разомкнут. Управляют LED локально через svc_rgbw_di_ctrl (holding 135–186). ================================================================================ MB2WS — адресная лента (holding 400+/1100+, оба порта) ================================================================================ Источник: svc_mb_mb2ws.h (общая карта; не «лента только на одном порту»). Карта версии: MB2WS_MAP_VERSION = 0x0400 (control @400+, pool @1100+; без коллизии с type 120 / safe AO 503 / factory 1001). Ограничение RAM (один общий pixel pool в svc_mb_mb2ws, без malloc): • до 1024 RGB-пикселей (3072 байта буфера); • до 400 RGBW-пикселей (1600 байт из тех же 3072). drv_ws28xx / FX только bind (set_logical_buffer / set_buffer) — без копий pool→ws28. Продуктовый потолок по времени live-pool: ~500 RGB / ~400 RGBW комфортно; ~1024 RGB — напряжённый refresh; выше — сцены W25Q, не полный live-pool. Фактический предел задаётся reg 400 (LedCount) и reg 403 (формат RGB/RGBW) — константы MB2WS_MAX_* / MB2WS_PIXEL_BUFFER_BYTES в Core/Inc/svc_mb_mb2ws.h. Пул регистров: base 1100, 2 регистра на пиксель → max reg 3147 (1024 RGB). Workflow типичный: 1) Unlock: write reg 410 = 0x10C8 (MB2WS_UNLOCK_KEY). 2) Записать settings 400–409 (LedCount, LedType, format, FX, …). 3) Заполнить pixel pool 1100+ (или RenderSource=1 FX / 2 flash). 4) Записать cmd 430 = REFRESH (1); дождаться cmd status 431 = DONE (3). -------------------------------------------------------------------------------- SETTINGS 400–419 — как MB2WS_SET_* в svc_mb_mb2ws.c -------------------------------------------------------------------------------- Addr Имя R/W Описание ---- --------------- ---- -------------------------------------------------- 400 LedCount / LedCount0 RW* Пиксели strip0: 1..1024 (RGB) или 1..400 (RGBW). 401 LedType RW* Тип светодиода / протокол (см. таблицу LedType). 402 RenderSource RW* 0 = pixel pool (reg 1100+); 1 = FX engine (params в reg 405–407); 2 = сценарий из Flash (W25Q). 403 PixelFormat RW* 0 = RGB (3 байта/px), 1 = RGBW (4 байта/px). 404 AutoRefresh RW* 0 = только по cmd REFRESH; 1 = auto после pool write. 405 FxId RW* Встроенный FX mode id (RenderSource=1). Каталог ПЕРЕГРУППИРОВАН и ПЕРЕНУМЕРОВАН 2026-08-21 (пре-релиз): непрерывные id 0..81 по категориям (база, цветные, вода, огонь, небо, физика, природа, текст, знаки, спец.). Этим же раундом УДАЛЕНЫ Fade и RandomColor и ОБЪЕДИНЁН дублирующий режим колец на воде (тело старого «Кругов на воде» удалено, выжил более богатый рендер «Дождь по воде» на id 16). Общий темп: кадр 20..250 мс от reg 406; бегущие и кольцевые режимы тикают >= 20 fps и рисуют ПРОМЕТЁННЫЙ за кадр сегмент (движение плавное на любой длине цепи, без перескока пикселей); смена режима всегда очищает полотно. База/заливка 0..2: 0 Static, 1 Blink, 2 Breath Цветные и радуга 3..12: 3 Rainbow (плавно бегущий градиент радуги вдоль ленты, движение по времени) 4 RainbowCycle (2D радиальная радуга из центра полотна; 1D: классический цикл оттенков) 5 Радуга-2D (диагональная, движется по времени) 6 Игра цветов (классический 12-секторный художественный цветовой круг вокруг центра полотна, вращается по часовой от reg 406; к центру светлее; 1D: вся лента плавно проходит цветовой круг) 7 Праздник (PARTY-волны + глиттер) 8 Аврора (живые занавесы AURORA, больше движения и переливов) 9 Цветовые волны (плывущие полосы + вертикальные переливы) 10 Спиннер (вертушка: цвет = угол вокруг центра, секторы перетекают друг в друга; reg 406 = скорость вращения; вращение по времени) 11 Confetti 12 MatrixPlasma — плавная 2D HSV-плазма Вода 13..25 (палитры встроены — цветовые регистры не нужны, яркость reg 407 как обычно; матричные — на ленте короче тайла показывают фрагмент): 13 MatrixRain — падающие капли, по умолчанию сине-голубые (FxAux меняет цвет), яркая голова + затухающий след 14 Ливень (дождь ×3, штрихи 2-3 px, вспышки) 15 Капля (несколько капель РАЗНОЙ длины и скорости, плавное полупиксельное движение, затухающие следы) 16 Дождь по воде (спокойная вода; ПИКСЕЛЬ УДАРА («плинк»), затем расходящиеся кольца на океанском фоне; <= 2-3 кольца и ~1 капля/с, concurrency от FxDensity 1..3; кольцо расширяется субпиксельно и плавно, спокойный характер; ОБЪЕДИНЯЕТ прежние «Круги на воде» и «Дождь по воде») 17 Мыльные пузыри (круги разных диаметров с ярким центром и гаснущим краем возникают, растут и лопаются в случайных местах) 18 Круги-всплески (НЕСКОЛЬКО точек удара одновременно; из каждой расходятся затухающие кольца своего диаметра 4..11 px на тёмном фоне; субпиксельное плавное расширение с мягкими кромками; цвет сине-белый, высокий байт FxAux переопределяет; бывший «Пульс цвета») 19 Океан (слоистые волны OCEAN, движение по времени) 20 Морская волна (бегущие гребни + белые барашки) 21 Прибой (ВОЛНИСТЫЙ синусоидальный фронт; три волны накатывают всё дальше, затем одна откатывает в море и растворяется; цикл 6-12 с от reg 406) 22 Цунами (огромная БУРЛЯЩАЯ волна с пеной и турбулентностью быстро проносится через полотно, сметая всё; период 4-9 с) 23 Водопад (сплошные струи разной яркости несутся вниз, белые нити + пена внизу) 24 Брызги (шар падает по центру; при ударе брызги разлетаются по дугам в стороны и вверх; затухающие следы) 25 Шторм (хаотические волны + ПОРЫВЫ ветра + пена + молнии режима 57) Огонь 26..29: 26 Fire (языки пламени во всю высоту, оранжево- красная палитра FIRE, «танцуют») 27 Камин (heat-конвекция, палитра FIRE; 1D: зоны) 28 Свеча (локализованное пламя: яркое ядро внизу по центру, сужается кверху к колышущемуся тусклому кончику, вокруг темно; общий уровень и высота — прежнее 1/f-мерцание; 1D: мерцание) 29 Лава (пятна действительно ТЕКУТ, палитра LAVA) Небо/свет 30..36: 30 Рассвет (ОРАНЖЕВЫЙ диск солнца поднимается над линией горизонта, небо светлеет по мере подъёма; reg 406 = длительность: 0=30 мин .. 255=1 мин) 31 Закат (обратный таймлайн 30) 32 Циркадный (CCT+яркость от часов 453/454, 24-узловая кривая + медленное «дыхание» ~23 с; часы не заданы → тёплый ночник) 33 Фейерверк (ракета → разрыв 10 частиц + цветная вспышка-фигура: снежинка/одуванчик/ ромб/звезда; разлёт ~1.75x быстрее, фигура растёт 2 px/кадр и каждая яркая точка несёт мягкий ореол-размытие 1 px) 34 Салют (ОДНА ракета снизу → взрыв в центре полотна → цветные кольца расходятся и заполняют весь экран → затухание; расширение 2x быстрее, фронт кольца с мягкими кромками 1/3 яркости с обеих сторон) 35 Звёздная ночь (Ван Гог: сине-голубые вихри с золотыми акцентами, 8 тёплых мерцающих звёзд с ореолами, месяц в углу; палитра STARRY; reg 406 = скорость вихрей) 36 Метеоритный дождь (метеоры вразнобой на разных высотах и колонках, затухающие следы) Физика/геометрия 37..54: 37 Спираль (3 вращающихся рукава) 38 Warp (световая сфера растёт из центра до бледно-голубой заливки, затем белые точки-звёзды быстро разлетаются из центра; цикл повторяется) 39 Прыгающие мячи (диски ~5×5 px (радиус 2, яркое ядро + мягкая кромка 1 px) с НАСТОЯЩЕЙ физикой: гравитация, отскок от пола с реституцией ~0.78 (высоты затухают 100→61→37 %), горизонтальная скорость с лёгким затуханием, стены упругие; стая растёт 1→4 на тайле, 1→6 на широком полотне) 40 KITT (двойной сканер с эксп. хвостами; красный, FxAux меняет цвет; за кадр прорисовывается весь пройденный сегмент) 41 Сердцебиение (тёмный ровный фон, 4-камерное сердце из двух половин СЖИМАЕТСЯ в ритме «тук-тук»; reg 406 = темп 40..130 BPM) 42 Песочные часы (зёрна падают по одному и складываются снизу; 7 цветов радуги по очереди поверх предыдущей заливки, затем многоцветная фаза и цикл; зерно идёт четверть-пиксельными шагами при кадре <= 50 мс; reg 406 = скорость падения) 43 Эквалайзер (столбики как спектр-анализатор: синтез уровней случайным блужданием + общий бит ~0.5-0.8 с от reg 406; градиент снизу зелёный → жёлтый → красный, белая peak-hold точка медленно падает; 1D: вся лента — один VU-бар) 44 «Узоры» (мандала: цветок/снежинка/астериск/ вспышка-лучи/звезда, рост из центра; калейдоскопические симметричные фигуры распускаются из центральной точки, держатся, схлопываются обратно в точку, затем следующая фигура; коралловый цвет со сдвигом оттенка, FxAux старший байт фиксирует цвет; reg 406 = скорость роста; 1D — цветной «бутон» растёт из середины ленты к обоим концам) 45 Comet (хвост продлён на пройденный за кадр путь — плавный бег на любой длине) 46 Scan (зёрна летят от начала к концу и складываются в стопку; лента полна → сброс и заново; яркие головы + прометённый след) 47 Pac-Man (жёлтый колобок с открывающимся ртом гонится за червяком; червяк 12 сегментов (матрица) / 14 px (1D), изгиб ±1 ряд вокруг ряда пути, ПОЛЗЁТ перистальтикой; 1D: блок + бегущая волна яркости по телу; оба рисуют прометённые следы) 48 ColorWipe (заливка туда-обратно; граница не может «рваться» — заливка сплошная) 49 FillConverge (заполнение с двух концов к середине, остаётся гореть; яркие «головы») 50 FillRun (последовательное заполнение, остаётся гореть; яркая «голова») 51 Сопровождение (ночная подсветка дорожки: пул из N светодиодов плавно едет вдоль ленты, выходит за край и заходит снова; передний край плавно разгорается ~2 px, задний затухает шлейфом ~4 px + прометённая полоса за кадр; reg 406 = время прохода ленты 5 с (0) .. ~1.2 с (255); FxAux: низкий байт биты 0..6 = цвет 0..6 (0 = тёплый белый), бит 7 (+128) = обратное направление; высокий байт = длина пула в px, 0 = 60; матричная цепочка трактуется как линейная лента) 52 Theater 53 Змейка-ИГРА (еда-точка случайного цвета в случайной свободной клетке; змейка ползёт к ней ПЛАВНО (интерполяция головы и хвоста между клетками, клетка ~80..120 мс от reg 406), съедает и растёт; тело раскрашено цветами съеденной еды по порядку; жадный путь к еде с обходом своего тела; тупик или бюджет тела (190 клеток) → рестарт с короткой змейки; 1D: еда на случайной позиции, рестарт при теле в полленты) 54 Sparkle (точки зажигаются и ОСТАЮТСЯ до заполнения всего полотна, затем сброс) Природа/погодные сцены 55..61: 55 Снегопад (снежинки ДВУХ размеров — точка и «плюс»-хлопья, дрейф, затухающие следы, тающие сугробы) 56 Снежинки (калейдоскопические 6-лучевые снежные узоры, бодрое вращение; бывший «Диско») 57 Молния (тёмный фон, серии 1-3 вспышек, паузы 3-15 с) 58 Летний лес (переливы зелени + плывущие пятна света и тени, блики) 59 Осенний лес (то же в палитре AUTUMN + падающие листья) 60 Падающая звезда (комета с ярким ядром и затухающим хвостом; направление полёта СЛУЧАЙНОЕ, старт с верхней или боковой кромки, угол/скорость/время жизни случайные; звёздное небо остаётся) 61 Ураган (вращающийся по часовой вихрь: 2 спиральных облачных рукава, тёмный спокойный «глаз» в центре, ярче у стенки глаза, 3 обломка на внешних орбитах; палитра STORMCLOUD; reg 406 = скорость вращения; 1D: быстрые волны с концов к центру, тёмный глаз посередине) Текст и цифры 62..65 (матричные, геометрия 16×16 из reg 417/418): 62 MatrixText — текст 5×7 из окна 516–579; рендер 2x чёткий (полная яркость, без сглаживания); если 2x шире полотна, а 1x помещается — АВТОПОДБОР: одна статичная строка 1x по центру; бегущая строка только когда и 1x не влезает (субпиксельно ровный ход); зазор 3px@2x/2px@1x; низкий байт FxAux 455 = стиль анимации 0..17 (см. 455), высокий байт — цвет (список как у 63/40); цвета строк и фона переопределяют regs 463..466 (RGB565); reg 494 TextLines=2 → две строки (из стилей в двухстрочном режиме работает только 16 — см. 494) 63 Часы HH:MM (по цифре на тайл 16×16; РИСОВАННЫЕ крупные цифры 10×14 со скруглён- ными углами (штрих 2 px); двоеточие мигает 1 Гц на стыке тайлов 2/3; < 4 тайлов — правые цифры; часы не заданы — «--:--»; цвет: FxAux, по умолчанию янтарный) 64 Метеостанция (TextLines 494): 0/1 = ОДНА строка, цикл 5 с: время → дата ДД.ММ.ГГ → температура → влажность → давление (каждое отдельно, значения 14 px, размерность 7 px, пробел перед единицей); давление «748 мм.рт.». 2 = две строки 5×7, зазор 2 px (7+2+7): строка 1 — время ЧЧ:ММ слева и температура справа (значение, 2 px, «°C»); строка 2 — дата ДД.ММ.ГГ из 457/462, влажность 459 («45 %») и давление 461 («748 мм.рт.») по 5 с, если оба не влезают — влажность → давление → дата. СТАТИКА, без бегущей строки; цвета: время белое, дата/влажн./давл. голубые, температура янтарная; FxAux и 463..466; полночь двигает дату (февраль = 28, БЕЗ високосных лет), 31.12 → 01.01 наращивает год. Прослушка 696..709: если любой UID ≠ 0 — только привязанные поля (UID 0 = скрыто), 453/457–462 игнорируются; время ЧЧ:ММ как локальные часы (СС на ленту не выводится); дата ДД.ММ. Все UID 0 — локальный источник как выше. 65 Логотип ЦИНТРОН (фирменный синий ~R64 G100 B230: иконка-микросхема 13×13 (контур 9×9, ядро 3×3, выводы 2 px) + надпись «ЦИНТРОН» 5×7 справа; интро: иконка проявляется ~0.5 с, буквы Ц-И-Н-Т-Р-О-Н влетают по одной справа налево (~0.25..0.4 с/буква от reg 406), полный логотип держится ~3.5 с, цикл; узкое полотно — чередование иконка/бегущая строка; окно 516 не используется) Указатели/таблички 66..75 (направление/вариант и цвет — reg 455 FxAux): 66 Стрелка (по стрелке на тайл; низкий байт FxAux: 0=вправо,1=влево,2=вверх,3=вниз; на многотайловом полотне стрелки зажигаются КАСКАДОМ в сторону направления, все горят → все гаснут → цикл; темп ~2-4 тайла/с от reg 406; один тайл — ровное свечение) 67 Шеврон (последовательная «прометающая» подсветка: первый «>», затем оба, затем пауза — читается как движение; темп от reg 406) 68 Знак «Внимание» (жёлтый треугольник с КРАСНЫМ «!», мигает 100 %/30 % 1 Гц) 69 Знак STOP (красный круг с белой полосой, медленная пульсация) 70 Авария (жёлто-чёрные диагональные полосы, движутся; FxAux низкий байт 1 = статично) 71 «ВЫХОД» (ЗЕЛЁНЫЙ текст на тёмном, без заливки фона; встроенная строка, окно 516 не используется) 72 «ПОЖАР» (крупный красный текст чередуется ~2 с с центрированной иконкой пламени; без фоновой заливки) 73 «ТРЕВОГА» (красный текст на тёмном, мигание ярко/тускло 1 Гц; бегущая строка, если шире полотна) 74 «!» (большой жёлтый мигающий на каждый тайл) 75 Уровень (СТАТИЧНЫЙ индикатор 0..100 % без анимации — мастер пишет FxAux: низкий байт биты 0..6 = процент (>100 = 100), бит 7: 0 = вертикальная заливка снизу вверх, 1 = горизонтальная слева направо; высокий байт = цвет (0 = зелёный); граница заливки подсвечена ярче на 1 px; 1D: заливка от начала ленты, бит 7 = от конца) Специальные 76..80: 76 Флаг РФ (бело-сине-красный триколор колышется как ткань на ветру: смещение колонок двумя бегущими синусами ±1..2 ряда + свет/тень по склону волны; полосы 5+5+6 рядов; reg 406 = скорость ветра; 1D: три трети + бегущая волна яркости) 77 «РОССИЯ» (встроенная надпись 5x7 cp1251 на тёмном фоне, буквы раскрашены триколором по рядам глифа: 0-1 белый / 2-4 синий / 5-6 красный; шире полотна — бегущая строка; окно 516 НЕ используется; 1D: статичные трети триколора) 78 Снаряд (у правого края стоит СТЕНА 4 px кирпично-серой кладки; слева влетает белый снаряд с размытым оранжевым хвостом (свободный пролёт ~0.6..1 с от reg 406); при ударе — белая вспышка и стена РАССЫПАЕТСЯ: клетки кладки разлетаются обломками по физике (радиальные скорости от точки удара, гравитация, один гасящий отскок от пола), оседают/гаснут, пауза, стена отстраивается, новый случайный ряд удара; FxDensity = количество обломков; 1D: точка с хвостом бежит к 4-px стенке в конце, искры в обе стороны) 79 «Стрела Амура» (белая стрела влетает слева и пронзает бьющееся красное сердце справа: древко, наконечник «>», оперение «<»; при попадании — вспышка + розово-красные искры + большой удар сердца; пауза ~2.5 с, затем повтор; reg 406 = скорость стрелы; 1D — белая точка летит к сердцу-глифу в конце) 80 «Метеориты» (снаряды-спрайты, разная периодичность, без стены; FxDensity=количество: несколько снарядов-спрайтов (нос + металлический корпус + оранжевый шлейф, как у режима 78) летят слева направо со случайными интервалами, из случайных строк, со слегка разной скоростью; каждый улетает за правый край и переиспользуется; reg 406 = скорость, FxDensity 456 = сколько метеоров/как часто; 1D — яркие точки с оранжевыми хвостами) 81 «Индикатор линии» (Spy/Master, эталон СМИ2-М): до 4 holding/input-значений с выбранного RS-485 порта; layout как режим 64 (494=0/1 — одна строка, значение 14 px + единица 7 px, страницы 5 с; 494=2 — две строки 5×7 одновременно: два слота — по одному на строку на всю ширину; между значением и размерностью 2 px). Типы TIME ЧЧ/ММ/СС на ленте ЧЧ:ММ как режим 64 (СС биндится, но не рисуется: ЧЧ:ММ:СС сжимает 64 px до sx=1). Конфиг holding 640..695. Не влезает — бегущая строка. Пределы 688..695 (ниже синий / выше красный). Нет данных / stale → «--». 1D: фон. STRING/REAL/ASCII не в этом релизе. 128..209 = Gyver aliases → 0..81 ТЕКУЩЕЙ нумерации (регруп 2026-08-21; база алиасов перенесена 64→128 в 1.0.2.2); иное → Static. См. Core/Inc/svc_fx_engine.h (fx_mode_t). 406 FxSpeed RW* 0..255 (выше = быстрее). 407 FxParam RW* Яркость / param FX 0..255 (product → svc_fx_engine). 408 StartupMode RW* Режим при включении (product). 409 Options RW* bit0 = LOOP для Flash playback; прочие — product. 410 Lock RW Read: 0=unlocked, 1=locked. Write 0x10C8 → unlock; write 0 → lock. При lock блокируются settings 400–409, 411–419 (Ch2Mode 419 — внутри блока); pool 1100+, cmd 430, poke 450–452, 453–459, 461–466, TextLines 494 — всегда. 411 Gamma RW* Гамма / curve (product). 412 ByteOrder RW* Порядок байт на линии (product). 413 LineMode RW* 0 = SINGLE_WS (DI0=PB5 SPI DMA; PB3 Hi-Z); 1 = DUAL_WS — два выхода через ОДИН SPI-движок: кадры каналов идут последовательно, внешний ключ-демультиплексор (2×SPDT, SELECT=CH2SEL: PA5 продукт / PA0 HIL) коммутирует 2-пиновый разъём. SEL=0: пин1=MOSI, пин2=SCK; SEL=1: пин1=GND, пин2=MOSI (кадр канала 2); подтяжки к GND на плате держат неактивные линии в нуле. ВНИМАНИЕ: на плате БЕЗ ключа режим 1 включать нельзя — кадр канала 2 уходит в ту же линию, что и канал 1 (пин1 всегда MOSI), и портит картинку канала 1; это не "второй выход не подключён". Битбанг-вывод DI1 упразднён (1.0.2.2). Режим канала 2 — reg 419. 2 = SPI_CLOCKED (APA102: MOSI PB5 + SPI1_SCK AF PB3; требует CH2SEL=0 — вне кадра канала 2 он низкий всегда). DUAL_WS и SPI_CLOCKED взаимоисключающи. При Mode=2 LedType принудительно APA102; LedCount1=0. Уход с DUAL_WS сбрасывает LedCount1=0 и Ch2Mode (419)=0. 414 LedCount1 RW* Пиксели strip1 (DUAL_WS): 0..512 RGB / 0..384 RGBW (расширено с 200/150 в 1.0.2.2); иначе только 0. Pool: strip0 затем strip1; (LedCount0+LedCount1)×bpp ≤ 3072. Используется режимами 419=2/4 (INDEPENDENT / CONTINUATION); в SYNC/MIRROR игнорируется. 415 FlashSlot RW* Слот W25Q EXFX 0..31 (play / LOAD_FLASH). 416 PlayCtrl RW* 0=stop, 1=play, 2=pause (Flash playback). 417 MatrixWidth RW* Геометрия одной матрицы, УПАКОВАНО (с 1.0.2.2): младший байт = ширина плитки в пикселях 1..64, старший байт = высота плитки в пикселях: 0 => 16 по умолчанию, иначе 8..32. Примеры: 16×16 = 0x0010 (обратная совместимость, как раньше def 16); 8×8 = 0x0808; 8×32 = 0x2008 (ш8 в832); 32×8 = 0x0820. Невалидная упаковка (ширина вне 1..64 или высота вне {0}∪8..32) => exception 3. Число каскадных матриц НЕ настраивается — выводится: N = LedCount / (ширина × высота); полотно (ширина × N) × высота, x растёт вдоль каскада. До 1.0.2.2 старший байт игнорировался (высота фиксированно 16). СОХРАНЯЕТСЯ в EEPROM (с 1.0.2.2; см. примечание ниже). 418 MatrixLayout RW* Разводка матрицы (с 1.0.2.2), биты: bit0: 0 = serpentine (нечётные строки справа налево), 1 = progressive (все строки слева направо); bit1: 0 = начало сверху, 1 = снизу; bit2: 1 = зеркалить X (справа налево); bit3: 1 = column-major (проходы вдоль Y). биты 4-6 TileMode (с 1.0.2.2): КАК эффект раскладывается на каскад плиток (глобально, задаёт мастер, без правок под эффект): 0 = SPAN (по умолчанию) — один эффект растянут на всё полотно (как раньше; полная обратная совместимость); 1 = REPLICATE — эффект рендерится на ОДНОЙ плитке и КОПИРУЕТСЯ на все (4 матрицы = 4 одинаковые копии, каждая целая в своей); 2 = MIRROR — как REPLICATE, но каждая НЕЧЁТНАЯ плитка зеркалится по X (калейдоскоп). TileMode 3..7 → exception 3. bit7 зарезервирован (должен быть 0), иначе exc 3. биты 8-11 TileCount (с 1.0.2.2): ЯВНОЕ число плиток на линии — мастер задаёт размер матрицы, НЕ трогая LedCount (400): 0 = AUTO (по умолчанию) — число плиток выводится из LedCount / (ширина×высота), как раньше; 1..4 = ровно столько плиток образуют полотно: effective_led_count = TileCount×ширина× высота — применяется ко ВСЕЙ геометрии (fx_matrix_geom), длине рендера FX, проходу SPAN/REPLICATE/MIRROR и числу выводимых на ленту пикселей, независимо от LedCount. Клампится до целых плиток, влезающих в пул (≤3072 Б); канал 2 сохраняет свой LedCount1. TileCount 5..15 → exception 3. биты 12-15 зарезервированы (0), иначе exc 3. СОХРАНЯЕТСЯ в EEPROM (с 1.0.2.2; layout+TileMode+ TileCount целиком, см. примечание ниже). Упаковка: 418 = layout | (TileMode<<4) | (TileCount<<8). Примеры: 0x0000 = serpentine, SPAN, AUTO (дефолт, как раньше); 0x0410 = 4 плитки, REPLICATE, serpentine (layout 0 | TileMode 1<<4=0x10 | TileCount 4<<8=0x400) — 4 матрицы, каждая показывает эффект целиком; 0x0120 = 1 плитка, MIRROR (TileMode 2<<4=0x20 | TileCount 1<<8=0x100); 0x0400 = 4 плитки, SPAN — один эффект на все 4. СОХРАНЯЕТСЯ в EEPROM целиком (с 1.0.2.2; см. примечание ниже) — layout, TileMode и TileCount переживают перезагрузку. 419 Ch2Mode RW* Режим второго выхода (канал 2; только при LineMode 413=1 DUAL_WS), def 0 (с 1.0.2.2; перенесён с 457 до релиза — рядом с топологией 413/414). Кадр канала 2 идёт через тот же SPI-движок сразу после кадра канала 1 (внешний ключ CH2SEL, см. 413) — без запрета прерываний, оба канала на полной кадровой частоте (время линии 800 кГц: ~31 мс на 1024 px + ~15 мс на 512 px, последовательно). 0 = OFF: канал 2 выключен (default); 1 = SYNC: канал 2 повторяет логическое содержимое канала 1; LedCount1 игнорируется, длина = min(LedCount0, 512 RGB / 384 RGBW); 2 = INDEPENDENT: канал 2 показывает СВОЁ содержимое — свой срез пула после strip0 (LedCount1 пикселей) И, с 1.0.3.0, свой эффект: блок 580..587 задаёт каналу 2 отдельные FxId/скорость/параметр/вариант/ плотность, источник и геометрию матрицы. ДО 1.0.3.0 «независимый» означало только срез пула: движок эффектов рисовал лишь канал 1, и срез канала 2 оставался чёрным, если мастер сам не заполнял 1100+; 3 = MIRROR: как SYNC, но порядок пикселей на линии обратный (последний пиксель канала 1 — первый на канале 2); 4 = CONTINUATION: одно непрерывное полотно — канал 1 показывает логические пиксели 0..LedCount0-1, канал 2 — LedCount0.. LedCount0+LedCount1-1; FX/матрица/пул рендерят суммарную длину (матричный каскад линейных индексов продолжается на канал 2). Предел — пул 3072 Б: суммарно 1024 px RGB (напр. 2+2 матрицы 16×16); каскад 4+2 (1536 px) в текущий пул НЕ помещается. Иные значения → exception 3. Запись ≠0 при LineMode≠DUAL_WS → exception 3 (правило как у 414); уход с DUAL_WS сбрасывает в 0. Блокируется lock (reg 410) как топология 413/414. СОХРАНЯЕТСЯ в EEPROM (с 1.0.2.2, как 413/414; см. примечание ниже). -------------------------------------------------------------------------------- БЛОК КАНАЛА 2 — holding 580–587 (с 1.0.3.0) -------------------------------------------------------------------------------- Собственные настройки эффекта для канала 2 пары DUAL_WS. Работают ТОЛЬКО при LineMode 413=1 и Ch2Mode 419=2 (INDEPENDENT) — в остальных режимах канал 2 повторяет канал 1 или входит в общее полотно, и свой эффект ему негде показать. Класс: под lock (reg 410), как топология 413/414/419, и СОХРАНЯЕТСЯ в EEPROM вместе с ними. Запись ЛЮБОГО регистра блока вне «413=1 и 419=2» → exception 3. Чтение доступно всегда. Уход с DUAL_WS или с INDEPENDENT сбрасывает весь блок к заводским значениям — вернувшись в этот режим, вы не получите забытый эффект. Почему 580, а не 420: 420–427 занято блоком BusyA. 580–587 — свободный участок между окном текста (516–579) и семейными safe-state coil (600–603). Addr Имя R/W Описание ---- --------------- ---- -------------------------------------------------- 580 FxId2 RW* Эффект канала 2, тот же каталог 0..81, что и reg 405 (и те же Gyver-алиасы 128+). def 0. 581 FxSpeed2 RW* 0..255, как 406. def 128. 582 FxParam2 RW* 0..255 (яркость/параметр), как 407. def 128. 583 FxAux2 RW* 16-битное поле варианта/цвета, как 455. def 0. 584 FxDensity2 RW* 0..255, как 456. def 128. 585 RenderSrc2 RW* 0 = срез пула (мастер пишет пиксели сам), 1 = FX-движок канала 2. def 1. Значение 2 (Flash) НЕ поддерживается → exception 3: проигрыватель сценариев из Flash один на всё полотно, второго экземпляра нет. 586 MatrixWidth2 RW* Геометрия плитки канала 2, упаковка как у 417 (младший байт ширина 1..64, старший высота 0=>16, иначе 8..32). def 0x0010 (16x16). 587 MatrixLayout2 RW* Раскладка канала 2, упаковка как у 418 (биты 0-3 разводка, 4-6 TileMode). def 0. Что НЕ дублируется на канал: LedType (401), PixelFormat (403), Gamma (411), ByteOrder (412) — оба канала идут через ОДИН SPI-движок с одним профилем провода, различаться не могут. Своего окна текста у канала 2 нет: часы (FX 63) и метеостанция (FX 64) рисуются из регистров 453/454 и 457..462, а не из текстового буфера. Порядок настройки (порядок важен — блок откроется только после 413 и 419): 410 = 0x10C8 unlock 413 = 1 DUAL_WS 400 = 100 LedCount0 414 = 50 LedCount1 419 = 2 INDEPENDENT 405 = 63 часы на канале 1 580 = 64 метеостанция на канале 2 430 = 1 REFRESH, ждать 431 = 3 Примечание (персист, с 1.0.2.2): svc_rgbw_config сохраняет в EEPROM операционный/эффектный набор и восстанавливает его на старте (svc_rgbw_config_apply): 400 LedCount, 401 LedType, 402 RenderSource, 405 FxMode, 406 FxSpeed, 407 FxBright, 409 UpdateTime, 410 Lock, 413 LineMode, 414 LedCount1, 417 MatrixWidth, 418 MatrixLayout, 419 Ch2Mode, 455 FxAux, 456 FxDensity, 463..466 цвета текста, 494 TextLines (и зеркала 511..515 — то же состояние, что 417/418), 503..506 Safe-state PWM и 600..603 Safe-state coil (в зарезервированных полях головы au8_safe_ao[4] / u8_safe_do_mask, без роста головы и без смены magic A2B3 — старый образ имел их нулевыми, что равно «0 = выкл»). Голова config не растёт: новые поля 413/414/417/418/419/455/456/463..466/494 лежат в переиспользованном ai_settings (байты 20..99, мёртвы на RGBW), внутри CRC-головы [0..232); адаптация гейтится rgbw_cfg_magic (A2B3): образ A2B2 сохраняет прежние поля головы, а новые получают дефолты. Spy/Master 640..646, слоты 648+n×8 и пределы 688+n×2 — overlay 50 Б (magic 0x5B02) на мёртвых DTV-полях kalman_filter_enable.. (до fmb_thresh @224), без сдвига CRC/232. 0x5B01 (40 Б) ещё читается (пределы выкл). Нет magic → завод: WorkPort выкл (оба слейва), 115200 8N1, слоты пусты. Live 647/680..687 не персистятся. Poll/timeout/stale (644–646) в 5B02 нет (дыра ровно 50 Б) — после reboot дефолты 1000/1000/10000. НЕ сохраняются: погодный блок 457..462, мягкие часы 453/454, Scale 460, привязки метео-прослушки 696..709 (RAM, как 457..462), пул пикселей 1100+ (их мастер шлёт каждый цикл). Lock (410) по-прежнему гейтит запись; персист — отдельно от lock. *RW при unlocked (reg 410). -------------------------------------------------------------------------------- ИНДИКАТОР ЛИНИИ (Spy/Master) — holding 640–695 (режим FX 81) -------------------------------------------------------------------------------- Один порт всегда наш слейв (адрес holding 128, Fast MB / 122, карта PWM+MB2WS). Другой — WorkPort: Spy (подслушка чужих FC03/04/06/16) или Master (крошечный RTU-клиент). Эталон СМИ2-М. Конфигурация всегда через слейв-порт. Master на слейв-порту запрещён (два мастера на шине с PLC). Класс: конфиг 640..646, слот 648+n×8 и пределы 688..695 — под lock (reg 410), как 413/419. Status 647 и live 680..687 — RO всегда, без lock. Формат соседних сигналов не меняется. Addr Имя R/W Описание ---- --------------- ---- -------------------------------------------------- 640 WorkPort RW* 0 = выкл (оба порта слейвы, как раньше); 1 = Port A (USART2, торцевая); 2 = Port B (USART1, внешний разъём). Выбранный порт — Spy или Master; другой остаётся нашим слейвом. Свои baud/parity/stop (642/643); Fast MB на WorkPort выключен. 641 WorkMode RW* мл. байт: 0 off / 1 Spy / 2 Master. bit8 = tap-on-slave: матчер на CRC-OK кадрах слейв-порта (в т.ч. чужой UID), без swallow poll. Цель UID ≠ наш адрес 128. Master+WorkPort=0 отвергается. 642 WorkBaud RW* Код скорости WorkPort, как holding 110 (96 = 9600). Игнор, если только tap-on-slave. 643 WorkLine RW* мл. байт parity как holding 111 (0=нет, 1=нечёт, 2=чёт); ст. байт stop 1/2. 644 PollMs RW* Период опроса Master, мс. def 1000. 645 TimeoutMs RW* Таймаут ответа Master, мс. def 1000. 646 StaleMs RW* Нет свежих данных → на матрице «--». def 10000. 647 Status RO мл. байт last error (0 ok, 1 timeout, 2 cfg, 3 tx); биты 8..11 stale слотов 0..3; bit12 in-flight. 648+n×8 Slot n RW* n=0..3, 8 регистров: +0 UID (0 = слот выкл; UID==наш адрес → reject); +1 FC 3/4/6/16; +2 register (Modbus addr); +3 type 0 INT16, 1 UINT16, 2 INT32 AB, 3 UINT32 AB, 4 INT32 CDAB, 5 UINT32 CDAB, 6 FLOAT ABCD (BE), 7 FLOAT CDAB, 8 FLOAT BADC, 9 FLOAT DCBA (LE). FLOAT = IEEE754 binary32 (2 регистра). 10 TIME ЧЧ, 11 TIME ММ, 12 TIME СС: одно слово, на ленте ЧЧ:ММ как режим 64 (СС биндится, но не рисуется). FC06 только для 16-битных типов; +4 decimals 0..3: для INT/UINT — показ raw / 10^d (253 и d=1 → 25.3; 234 и d=2 → 2.34); для FLOAT — число знаков после запятой (значение уже вещественное); +5 unit01 два символа cp1251 (hi, lo); +6 unit23 ещё два символа (volatile across reboot: в EEPROM только unit01); +7 pad. 680+n×2 Live n RO int32 слота n, hi word затем lo (отладка во флешере). 688+n×2 Lo/Hi n RW* int16 нижний / верхний предел слота n. Для INT/UINT — те же сырые единицы, что live (decimals только показ). Для FLOAT — целые в физических единицах (25.3 vs 0..40). lo==hi (в т.ч. 0/0) — пределы выкл. Ниже lo — синий (0,80,255), выше hi — красный (255,0,0), в диапазоне — цвет 463/464 (задайте зелёный). 696+n×2 WxSpy n RW* n=0..6, режим 64 прослушка (не слоты FX 81): ЧЧ, ММ, СС, дата, t°, влажность, давление. +0 мл. байт UID (0 = поле скрыто; UID==наш адрес → reject); ст. байт FC 3/4/6/16 (0 → FC03); +1 register (любой, в т.ч. 0, если UID ≠ 0). Типы внутри прошивки: TIME ЧЧ/ММ/СС, UINT16 дата (день<<8)|месяц как 457, INT16 t° ×0.1, UINT16 влажн. ×0.1 %RH, UINT16 давл. ×0.1 мм рт.ст. Если все UID 0 — локальные 453/457–462. Если любой UID задан — только привязанные поля, 453/457–462 игнорируются; дата на ленте ДД.ММ (год не привязывается). Не в EEPROM (RAM, как 457..462). Нужен WorkPort 640/641. Типы 0..12. IEEE754 soft-float на M0 (без FPU). STRING / Fast Modbus как источник — не в этом релизе. Отображение: TextLines 494 и цвета 463..466 как режим 64 (0/1 — одно значение 14 px на все панели; 2 — два значения 5×7 одновременно, по строке, 2 px между числом и размерностью). Если значение+единица не помещаются статически — бегущая строка (как текстовые эффекты). TIME ЧЧ/ММ/СС — одна часовая строка ЧЧ:ММ (двоеточие как режим 64; СС не на ленте). Заводской сброс (кнопка / holding 1001): оба интерфейса слейв, 115200 8N1, адрес модуля 13. 420–427 BusyA RO Блок «занято» A (bitmask операций; 0 = idle). 428–429 Rsv RO 0. -------------------------------------------------------------------------------- USER COLORS 434–449, CMD 430–431, LED POKE 450–452 -------------------------------------------------------------------------------- 434–449 UserColorPreset RW 8 пресетов × 2 regs: [RG][BW] как pixel pool (R low/G high; B low/W high в RGBW). Не блокируются lock (reg 410): пиксельная поверхность, как pool/poke. ДОП. НАЗНАЧЕНИЕ (2026-08-13): при RenderSource=FX reg 434 читается как БАЗОВЫЙ цвет FX color1 в формате RGB565 (тот же хелпер, что 463..466); 0 → нейтральный БЕЛЫЙ (никогда красный). reg 435 → color2 в RGB565 (0 = не менять). Формат [RG][BW] выше остаётся для отрисовки pool — одно u16, две трактовки по источнику. (BusyB — внутренний трекинг изменений, на wire НЕ выведен: 440–447 целиком принадлежат UserColorPreset в обе стороны.) 430 Command WO MB2WS_CMD_*: 0 none, 1 REFRESH, 2 CLEAR_POOL, 3 SAVE_FLASH (deprecated — upload = 4000+; → status ERROR), 4 LOAD_FLASH (bind FlashSlot + header/fps; status BUSY→DONE/ERROR). 431 CommandStatus RO 0 idle, 1 accepted, 2 busy, 3 done, 4 error. BUSY также во время Flash show при ошибке слота. 450 LedIndex RW Индекс пикселя для одиночной записи (0..LedCount-1). 451 LedRG RW R (low), G (high) для LedIndex. 452 LedBW RW B (low), W (high); W игнорируется в RGB. Запись 451–452 обновляет pixel pool и при AutoRefresh=1 ставит REFRESH в очередь. 453 TimeOfDayHours RW Мягкие часы суток, часы 0..23 (с 1.0.2.2). 454 TimeOfDayMinutes RW Мягкие часы суток, минуты 0..59 (с 1.0.2.2). Контракт: мастер записывает время один раз (или периодически пересинхронизирует — запись просто пересеивает); дальше модуль ТИКАЕТ АВТОНОМНО от uptime, и ЧТЕНИЕ 453/454 возвращает ИДУЩЕЕ время (минуты сами перекатываются, 23:59 → 00:00). Потеря мастера НИКОГДА не останавливает часы и завязанные на них режимы (30/31/32/63/64). 0xFFFF в обоих регистрах = время не задано (заводское состояние и после записи 0xFFFF в любой из них — сброс обоих); часы идут только когда заданы ОБА регистра. Значения вне 0..23 / 0..59 (кроме 0xFFFF) → exception. Не блокируются lock (reg 410), как poke 450–452. НЕ сохраняются в EEPROM: после перезагрузки время не задано, мастер сеет заново. 455 FxAux RW Параметр режима FX (с 1.0.2.2), def 0. Низкий байт = вариант/направление: стрелки 66/67: 0=вправо, 1=влево, 2=вверх, 3=вниз; авария 70: 1 = остановить полосы; эквалайзер 43: высота поля столбиков 0..100 % — 0 → пики на 5 % высоты полотна (мини-эквалайзер по умолчанию), 100 → 95 %, >100 = 100. MatrixText 62: низкий байт = СТИЛЬ анимации текста (раунд 7): 0 = автоповедение (статично/бегущая), 1 = печатная машинка с мигающим курсором, 2 = пофонарное проявление (fade-in по буквам), 3 = буквы влетают справа по одной, 4 = волна (буквы качаются ±1 px), 5 = мигание 1 Гц, 6 = буквы всплывают снизу, 7 = дешифровка (случайные глифы оседают в текст слева направо), 8 = глитч (краткие сдвиги-двойники), 9 = неон (случайная буква притухает, как неисправная трубка), 10 = буквы падают сверху с затухающими отскоками, 11 = растворение по пикселям (проявление и распад), 12 = радуга (градиент оттенков бежит по буквам; подменяет цвет), 13 = проезд насквозь (въехал справа → пауза в центре → уехал влево), 14 = разлёт (текст держится и РАЗРЫВАЕТСЯ на частицы + кольца-вспышки, затем собирается), 15 = морфинг «A|B» (перетекание слова A в слово B по пикселям; без разделителя = стиль 11), 16 = титры (вертикальная прокрутка снизу вверх; единственный стиль, работающий и в двухстрочном 494=2), 17 = дрожь (постоянный нервный джиттер ±1 px). Цикл стилей: анимация → удержание ~3 с → повтор; текст шире полотна → всегда обычная бегущая строка. «Обводка» НЕ реализована сознательно: штрих 5×7 и так 1 px — у контура нет внутренности на этом разрешении. Высокий байт = переопределение цвета: 0 = цвет режима по умолчанию, 1 красный, 2 зелёный, 3 синий, 4 белый, 5 жёлтый, 6 оранжевый (одноцветные режимы: 62 текст, 63 часы, 40 KITT, 66/67 стрелки, 18 круги, 75 уровень, 64 метеостанция — обе строки). Режим 51 (Сопровождение) переупаковывает регистр: низкий байт биты 0..6 = код цвета 0..6 (0 = тёплый белый), бит 7 = обратное направление; высокий байт = длина пула в px (0 = 60, раунд 7). Режим 75 (Уровень) переупаковывает низкий байт: биты 0..6 = процент, бит 7 = ориентация (см. каталог 405). Не блокируется lock; сохраняется в EEPROM (с 1.0.2.2). 456 FxDensity RW Плотность/концентрация элементов и цветов FX 0..255, def 128 (с 1.0.2.2; сразу за FxAux — попарные FX-ручки 453/454 часы, 455 FxAux, 456 FxDensity). 128 = штатный вид, 0 ≈ четверть, 255 ≈ вдвое (с ограничением пулов/границ). Частицы и спавн: дождь 13/14, снег 55, листья 59, метеоры 36, пузыри 17, искры 54, конфетти 11, звёзды 60/35, фейерверк 33 (группы 1..3), капли 15, брызги 24, водопад 23, капли по воде 16 (в спокойном окне 1..3 кругов), точки 18, обломки стены 78, гирлянда-театр (шаг штрихов); для цветовых режимов (3/4 радуги, 8 аврора, 5, 9, 6 колесо) — разброс оттенков (мало = узкая полоса, много = весь круг); иное — плотность элементов/цветов. Режимы без счётных элементов (Static 0, знаки/текст 66..75, эквалайзер 43 — динамика эталонная) игнорируют. Значения >255 → exception 3. Не блокируется lock; сохраняется в EEPROM (с 1.0.2.2). 457 WxDate RW Дата для режима 64: (день << 8) | месяц; день 1..31, месяц 1..12; 0 = не задана («--.--»). Полночь мягких часов 453/454 двигает дату по фиксированной таблице месяцев (февраль = 28 — БЕЗ учёта високосных лет, осознанное ограничение). Класс FxAux: RW, не блокируется lock, НЕ сохраняется в EEPROM; вне диапазона → exception 3. В режиме прослушки 696..709 (любой UID ≠ 0) регистр 457 на ленту не идёт. 458 WxTemp RW Температура int16, 0.1 °C со знаком, -999..999; 0x8000 = не задана (не рисуется). Класс FxAux (см. 457). 459 WxHum RW Влажность 0.1 %RH, 0..1000; 0xFFFF = не задана. Режим 64: целое % с пробелом («45 %»). Однострочный цикл (494=0/1) — отдельная страница; двухстрочный (494=2) — см. 64. 0 не рисуется. Класс FxAux (см. 457). 460 Scale RW Глобальная шкала 0..1000 (MB2WS_SCALE_MAX; 1000=100%). 461 WxPress RW Давление 0.1 мм рт. ст., 4000..8500; 0 = не задано. Режим 64: целое + пробел + «мм.рт.» («748 мм.рт.»), 5 с на страницу. Класс FxAux (см. 457). 462 WxYear RW Год 2000..2199; 0 = не задан. На ленте режима 64 — две цифры («31.08.26»); незаданный год → «--». 31.12 → 01.01 наращивает год. Класс FxAux (см. 457). 463 TextColor1 RW Цвет глифов строки 1 (RGB565 RRRRRGGGGGGBBBBB); 0 = поведение по умолчанию (канал переопределения FxAux / цвет режима). Режимы 62 и 64. Класс FxAux; любое u16 законно. 464 TextColor2 RW Цвет глифов строки 2 (RGB565); 0 = как строка 1. Двухстрочный текст 494=2 и режим 64. Класс FxAux. 465 TextBgColor1 RW Фон полосы строки 1 (RGB565); 0 = чёрный. Однострочный режим красит ВСЁ полотно этим фоном (464/466 игнорируются); двухстрочный — ряды 0..7. Класс FxAux. 466 TextBgColor2 RW Фон полосы строки 2 (ряды 8..15, RGB565); 0 = чёрный. Класс FxAux. Примечание 463–466: не блокируются lock, но СОХРАНЯЮТСЯ в EEPROM (с 1.0.2.2) — в отличие от погодного блока 457..462 класса FxAux, который остаётся волатильным. 467 WxTempColor RW Цвет температуры в режиме 64 (RGB565); 0 = янтарный по умолчанию (класс часов режима 63). Приоритет как у 463/464: сильнее FxAux. ВОЛАТИЛЬНЫЙ (класс погодного блока 457..462 — мастер, сеющий часы/температуру, задаёт и цвет; сознательно НЕ в rgbw_persist_ext_t: добавление поля сдвинуло бы DI-ext блок и потребовало bump магии конфига). Пример: красный = 0xF800. -------------------------------------------------------------------------------- STATUS 470–478, IDENTITY 480–493 — как mb2ws_read_status/identity -------------------------------------------------------------------------------- 470 StatusWord RO b0 refresh_pending, b1 locked, b2 pool_dirty, b3 refresh_active. 471 LastError RO Последний код ошибки (0=OK). 472 RenderSourceAct RO Фактический RenderSource (0/1/2). 473 ActiveLedCount RO Эффективное LedCount. 474 LedTypeAct RO Фактический LedType. 475 PixelFormatAct RO Фактический PixelFormat. 476 ScaleAct RO Фактический Scale. 477 LastCmd RO Последняя выполненная cmd 430. 478 Tick RO Счётчик тиков MB2WS (диагностика). 480–485 IdentityModel RO ASCII «MB2WS» (по символу в регистре). 486–487 SerialNumber RO SN lo/hi (семейный get_fastmb_serialaddress). 488 FwMajorMinor RO (MAJOR<<8)|MINOR приложения. 489 FwPatchSuffix RO (PATCH<<8)|SUFFIX. 490 MapVersion RO 0x0400 (MB2WS_MAP_VERSION). 491 HwRevision RO stub (1). 492 MaxRgbPixels RO 1024. 493 MaxRgbwPixels RO 400. -------------------------------------------------------------------------------- MATRIX TEXT 494 + 516–579 (holding, RW, оба порта; с 1.0.2.2) -------------------------------------------------------------------------------- 494 TextLines RW Число строк текста режима 62, def 0 (перенесён с 456 до релиза). Его текстовое окно — 516–579 (перенесено с 495–510 до релиза: старое окно пересекалось с семейными safe-AO 503–506, из-за чего длинный текст обрезался; см. 516–579). 0 или 1 = одна строка (режим 62: глифы 10×14; режим 64: цикл время/дата/t°+влажн./давление, значения 14 px, размерность 7 px); 2 = ДВЕ строки шрифтом 5×7 1× (режим 62 и 64): строка 1 в рядах 0..6, ряды 7..8 — зазор, строка 2 в рядах 9..15 (7+2+7 = 16). Текст — то же окно 516–579: символ «|» делит строку 1 и строку 2 (сам не рисуется); без «|» текст делится пополам (нечётная длина — лишний символ в строке 1). Из стилей анимации 455 в двухстрочном режиме пока работает только 16 (титры); остальные — только в однострочном. Цвета/фон строк — regs 463..466. Каждая строка шире полотна бежит справа налево независимо (своя длина цикла), та же временная прокрутка, что и одна строка. Иные значения → exception 3. Не блокируется lock; сохраняется в EEPROM (с 1.0.2.2). 511 MatrixTileWidth RW* = поле рег 417 (младший байт), ДВУНАПРАВЛЕННО (с 1.0.2.2). Ширина плитки 1..64; вне → exc 3. То же состояние, что 417: запись сюда меняет 417, и наоборот. Lock (410); СОХРАНЯЕТСЯ (как 417). 512 MatrixTileHeight RW* = поле рег 417 (старший байт), ДВУНАПРАВЛЕННО (с 1.0.2.2). Высота плитки: 0 => 16 по умолчанию, иначе 8..32; вне → exc 3. Lock (410); сохр (как 417). 513 MatrixTileCount RW* = поле рег 418 биты 8-11, ДВУНАПРАВЛЕННО (с 1.0.2.2). Явное число плиток: 0 = AUTO (из LedCount), 1..4; вне → exc 3. Lock; сохр (как 418). 514 MatrixTileMode RW* = поле рег 418 биты 4-6, ДВУНАПРАВЛЕННО (с 1.0.2.2). Раскладка эффекта: 0 = SPAN, 1 = REPLICATE, 2 = MIRROR; вне → exc 3. Lock; сохр (как 418). 515 MatrixLayoutBits RW* = поле рег 418 биты 0-3, ДВУНАПРАВЛЕННО (с 1.0.2.2). Разводка (serpentine/progressive, origin, mirror-X, swap-XY) 0..15; вне → exc 3. Lock (410); СОХРАНЯЕТСЯ (как 418). Примечание 511-515: то же состояние, что 417/418, по одному параметру на регистр — мастер управляет геометрией ЛИБО упакованными 417/418, ЛИБО этими отдельными холдингами, взаимозаменяемо; персист общий с 417/418. 516–579 MatrixText RW ASCII-окно бегущей строки для FX 18 (MatrixText): 64 регистра × 2 символа = до 128 символов. Перенесено с 495–510 до релиза (2026-08-20): старое окно пересекалось с семейными safe-AO 503–506, поэтому текст длиннее 8 символов терял символы 16.. (их перехватывал обработчик safe-AO). 516–579 — свободный смежный блок между зеркалами матрицы 511–515 и семейными safe-DO 600–603. При TextLines (reg 494) = 2 символ «|» делит окно на две строки (см. reg 494). High byte = первый (левый) символ пары, low byte = второй; заполнение нулями = конец строки. Можно писать любую часть окна (FC06 / FC16); вступает в силу со следующего кадра FX 18. Шрифт 5×7: цифры, латиница A–Z, ПОЛНАЯ прописная кириллица cp1251 А–Я (Ё → Е; строчные латиница и а–я приводятся к прописным), «-», «.», «:», «!», пробел, 0xB0 = «°»; прочие символы → пробел. Пиксельная поверхность: НЕ блокируется lock (reg 410), как pool/poke. Чтение возвращает текущее содержимое буфера. -------------------------------------------------------------------------------- PIXEL POOL 1100+ (holding, RW, оба порта) -------------------------------------------------------------------------------- Для пикселя i (0-based): reg (1100 + 2*i) — RG: R = low byte, G = high byte (0..255). reg (1100 + 2*i+1) — BW: B = low byte; high byte = W (RGBW) или 0 (RGB). Пример: пиксель 0 → regs 1100, 1101; пиксель 149 RGBW → regs 1398, 1399. Запись за пределы LedCount × 2 regs → exception / reject. Pool (1100+) и cmd 430 всегда принимаются даже при lock. FX: параметры режима — settings 405–407. -------------------------------------------------------------------------------- Таблица LedType (reg 401) -------------------------------------------------------------------------------- Код Константа Чип / протокол ---- --------------------- ------------------------------------------ 0 MB2WS_LED_TYPE_WS2812_0 WS2812 GRB 1 MB2WS_LED_TYPE_WS2812_1 WS2812 variant timing 1 2 MB2WS_LED_TYPE_SM16703 SM16703 3 MB2WS_LED_TYPE_WS2811 WS2811 5 MB2WS_LED_TYPE_WS2815 WS2815 (+12V) 6 MB2WS_LED_TYPE_SK6812 SK6812 RGBW 7 MB2WS_LED_TYPE_APA102 APA102 / SK9822 (только LineMode=SPI_CLOCKED) Смена LedType / LineMode после UnlockKey; неверный код → exception 3. APA102 только в SPI_CLOCKED (SCK=PB3 AF; DUAL_WS тоже на PB3 — взаимоисключение). ================================================================================ СЕМЕЙНЫЕ РЕГИСТРЫ (оба порта, unless noted) ================================================================================ Состояние МК (65504..65519 + 65468..65487): идентично семейству DTV/MR-02m. • 65504 stack HWM, 65505 free RAM, 65506 used RAM, 65507 stack size • 65508 reset reason, 65509/65510 FW update count • 65511 EEPROM runtime (RTU/RGBW product hook) • 65512 POST bitmask, 65513 stack watermark • 65514 Fast MB rate-drop count, 65515 read_inputs violations • 65518 WS28xx debug word (RO; b15 busy, b14..12 HAL SPI state, b11 blocking-send fail, b10..8 async-start fails (sat), b7..0 chunks started (wrap); раскладка — Core/Inc/drv_ws28xx.h; ≥ 1.0.2.2) • 65517 код ошибки модуля (mp02_error latch, RO; 0 = OK, 1 = ERROR/ADC, 2 = UNKNOWN_SERIAL, 3 = INIT_EEPROM, 4 = Write_EEPROM; set-only латч — сбрасывается только перезагрузкой; ≥ 1.0.2.2) 65520–65525 Ch2AllowedModes (input, RO, с 1.0.3.0) Маска доступных каналу 2 режимов: бит i слова w = режим (w*16 + i) из каталога reg 405 можно выбрать в reg 580. Интерфейс читает её и гасит недоступные пункты, вместо того чтобы зашивать текущий ответ прошивки. СЕЙЧАС разрешено ВСЁ: канал 2 владеет полным собственным блоком состояния движка, поэтому выбор канала 1 ничего у него не отнимает — слова 0..4 читаются 0xFFFF, слово 5 = 0x0003 (каталог кончается на id 81). Биты выше последнего id — нули. Регистр существует, чтобы будущий режим, чьё состояние не влезет в блок, стал изменением ПРОШИВКИ, а не изменением клиента. • 65519 EEPROM health (общесемейная раскладка битов) • 65468..65487 RX/TX trace (сброс holding 65487) • 65488..65503 UART/poll telemetry Подробные битовые таблицы — без изменений относительно прежнего семейного текста; product-specific: 65516 (sensor presence) на RGBW = 0 или stub. -------------------------------------------------------------------------------- СЛУЖЕБНАЯ ЗАПИСЬ СЕРИЙНОГО НОМЕРА (рег. 1005, Port A, FC16) -------------------------------------------------------------------------------- 1005 0x03ED uint16×2 WO Серийный номер (2 regs): 1005=lo, 1006=hi. Политика — docs/contracts/bootloader-modbus.md, docs/contracts/eeprom-v2-layout.md. Broadcast игнорируется. -------------------------------------------------------------------------------- Fast Modbus / события (Port A только, FC 0x46) -------------------------------------------------------------------------------- Регистр 122 = 0 отключает полинг событий 0x10, не UART. Пороги 340..343 — EEPROM, семейная семантика. Для RGBW публикуются события (Input type) на: • 18–21 — DI IN1..IN4 (по фронту после debounce); • 37–40 — OCP-флаги R/G/B/W (0/1, край смены); • 131 — температура платы NTC (°C×10, порог 3.0 °C); • 105/123/124 — sys monitors (по маске holding 125, как в семействе). Широковещательная запись 0x46/0x60 allowlist: {110, 111, 112, 133} (+179 на MR-02m; на RGBW 179 no-op). См. shared/modbus broadcast policy. Регистры WB-LED 2000+ в контракт v1 не входят (см. holding 50–101 / 135–186). -------------------------------------------------------------------------------- Загрузчик (Port A, адрес 247) -------------------------------------------------------------------------------- Общий семейный STM32 Modbus bootloader (shared/bootloader). Параметры линии, версия BL 330–337, прошивка 0x1000/0x2000 — без изменений. Контракт: docs/contracts/bootloader-modbus.md. ================================================================================ Конец файла ================================================================================