diff --git a/GreatGamedevVault/Библиотека скриптов/2. Периферия/Система команд платы v2.x.md b/GreatGamedevVault/Библиотека скриптов/2. Периферия/Система команд платы v2.x.md index db76655..d070679 100644 --- a/GreatGamedevVault/Библиотека скриптов/2. Периферия/Система команд платы v2.x.md +++ b/GreatGamedevVault/Библиотека скриптов/2. Периферия/Система команд платы v2.x.md @@ -52,8 +52,6 @@ by: Паша Николаевич После загрузки контроллер не принимает никаких команд, кроме запросов на авторизацию. -В текущей сборке `ver_2.3.6_no_auth_prizes` флаг авторизации по умолчанию выставлен в `true`, поэтому контроллер фактически стартует уже разрешенным. Если `auth_ok=false`, логика остается прежней: интерпретатор принимает только команды `07` и `08` до успешной авторизации. - Запрос – требование зашифровать строку шестнадцатеричных символов с помощью AES256 алгоритма, используя известный ключ. Компьютер генерирует случайную последовательность из 16 байт и отправляет ее контроллеру на шифрование. Тот ее шифрует и отвечает. Компьютер расшифровывает и проверяет на совпадение. @@ -79,6 +77,48 @@ by: Паша Николаевич # Команды +## Список команд +| Команда | Назначение, примеры, ответы | +| ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [[#Служебные команды\|00]] | Перезагрузить контроллер (RESET) | +| [[#Служебные команды\|01]] | Отладочная. включает-выключает подробные логи. В релизе будет отключена | +| [[#Служебные команды\|02]] | Подготовиться к приему файла. освободить место, отформатировать встроенную файловую, проверить хватит ли места.
_**Например**_, `02356987` - заявка на файл обновления размером 356987 байт.
Выполняется около 15 секунд, после чего весь прием  данных в порту заносится в файл "update.bin".
Ответ при приеме файла - каждый блок (4096) - размер принятого.
По окончании - переход снова в режим команд (подробнее – [Обновление](#Обновление)). | +| [[#Служебные команды\|03]] | Показать содержимое SPIFFS | +| [[#Служебные команды\|04]] | Запустить ОТА обновление с ранее записанным файлом SPIFFS: `/update.bin` | +| [[#Служебные команды\|05]] | Показать версию прошивки (указана в дефолтах) | +| [[#Служебные команды\|06]] | Показать MAC-адрес (без двоеточий, как в оригинале), уникальный, можно считать серийным номером | +| [[#Авторизация\|07]] | Безопасность (запрос авторизации от компа. На этот запрос создается рандомный запрос навстречу. См. [[#Алгоритм авторизации]]) | +| [[#Авторизация\|08]] | Безопасность (прием ответа от компьютера на запрос `07`. См. [[#Алгоритм авторизации]]) | +| [[#Служебные команды\|09]] | Сброс EEPROM (параметром - MAC без двоеточий, иначе не сбросится) | +| 10 | Подтверждение принятия сигнала COIN, иначе этот сигнал будет посылаться снова с периодичностью `200 мс` (сколько приняли койнов, столько и подтверждений быть должно) | +| 20X | Установить состояние выходов - всего выходов 8, давать их двоичное состояние.
_**Например**_, `203` - вывести 1 и 2 выходы по единичке, остальные - нолики. Соответственно, выход на разъеме будет "прижат" к земле. | +| 21XY | Установить состояние выхода номер Х в -> Y \[0,1,2(инверсия)\].
_**Примеры:**_
`2131` - Включить 3 по индексу выход
`2170` - Выключить 7 по индексу выход | +| [[#Отдельный раздел для призовой стойки\|25CCB]] | Витрина призов (см. [[#Отдельный раздел для призовой стойки]]):
`25` - запрос состояния;
`2501B` - выдать приз из ячейки `B`;
`2511B` - открыть ячейку `B`;
`25991`/`25990` - включить/выключить авторежим витрины. | +| 30X | Хоппер 1.
`301` - Включить мотор хоппера
`300` - Выключить мотор хоппера
`309` - Выдать приз (в авторежиме[^1]) | +| 40X | Хоппер 2.
Аналогично | +| [[#Дополнительные цифровые GPIO\|50CCP]] | Дополнительные цифровые GPIO25/GPIO26 (см. [[#Дополнительные цифровые GPIO]]):
`50` - запрос состояния;
`5001P` - конфигурация входа;
`5005P` - запрос уровня входа;
`5010P` - установка выходов. | +| [[#Программы адресных диодов\|8XYY[PARAMS]]] | Выбор программы адресных диодов `YY` по каналу `X`.
Для программы `08` дополнительно передается цвет `RRRGGGBBB`, для `8012..`/`8013..` - direct-группы из проекта 1 на 4-й ленте, где принимаются только `00` и `01..03` (см. [[#Программы адресных диодов]]). | +| [[#Отдельный раздел для морского боя VR\|85XX[SSS]]] | Эффекты активной VM-матрицы (выбирается командой `96`).
**Для матрицы `s_b`:**
управляющие `00`/`01`;
тесты `25`;
direct-шкалы `30..34`;
базовые `10..22`;
спец. `40..49`;
заливки `80..82`.

**Для `dan_ro`/`rz`:**
эффекты `51..56`;
группа `8550XX` принудительно задаёт `dan_ro`.
`SSS` — длительность в секундах (см. [[#Отдельный раздел для морского боя VR]]). | +| [[#Программы адресных диодов\|85]] | Без параметра отключает процесс рендеринга эффектов (чтобы освободить оперативную память) | +| [[#Отдельный раздел для Данро\|8550XX[SSS]]] | Данро (принудительная матрица `dan_ro`):
`855000` — очистить экран;
`855001` — автокарусель вкл;
эффекты `855010..855016`;
`SSS` — длительность в секундах (см. [[#Отдельный раздел для Данро]]). | +| [[#Отдельный раздел для RZ\|8560XX[SSS]]] | Резервная панель RZ (принудительная матрица `rz`):
`856000` — очистить экран;
`856001` — автокарусель вкл;
эффекты `856010..856016`;
`SSS` — длительность в секундах (см. [[#Отдельный раздел для резервной панели RZ]]). | +| [[#Отдельный раздел для RZ\|96rz + 85XX[SSS]]] | Резервная панель RZ:
сначала `96rz` — выбрать матрицу, затем `85` — стоп;
`8500`/`8501` — авто выкл/вкл;
эффекты `8551..8556`; тесты `8525TVVV` (см. [[#Отдельный раздел для резервной панели RZ]]). | +| [[#Настройки адресной подсветки\|89CKP]] | Настройки WS2812:
`C=0` - все 4 ленты,
`C=1/2/3` - 2-й/3-й/4-й физический канал;
`K=0` - порядок цветов (`0` RGB, `1` RBG, `2` BRG, `3` BGR, `4` GRB, `5` GBR),
`K=1` - яркость `0..255`,
`K=2` - гамма `0/1`.
***Примеры:***
`8901255` - яркость всех каналов 255;
`89021` - включить гамму;
`89304` - порядок GRB для 4-го физического канала. | +| 90 | Очистить очередь команд | +| 91 | Запрос состояния цифровых входов, их всего 24(+2 входа хоппера), ответ в двоичном коде.
Для уменьшения объема передаваемой информации, преобразуется в десятичное число
_**Примеры:**_
`INPUT67108863` (`11111111111111111111111111`) - все кнопки не нажаты
`INPUT67108861` (`11111111111111111111111101`) - нажата вторая кнопка | +| 91X | _Дополнительно_: задать время антидребезга платы (`10..100` для штатного использования; по умолчанию 50 мс).
_**Например**_, `9110` - установить антидребезг на 10 мс | +| 92 | Запрос значения аналоговых входов **(отключает автовывод)** - ответ в формате `ADC0,0,0,0`.
Всего 4 аналоговых входа | +| 92X | Периодический автовывод значений аналоговых входов.
_**Например**_, `92100` - каждые 100 милисекунд выдавать значения ADC (`50..5000`) | +| 93 | Запрос `global_summa` (число коинов, нестираемо) | +| [[#Карты матриц\|96]] | Без параметра — запрос текущей активной VM-матрицы (ответ: `MATRIX: ROWS: COLS:`).
С параметром — выбор и сохранение матрицы в NVS.
Список доступных карт см. [[#Карты матриц]].
***Примеры:***
`96s_b` — морской бой;
`96dan_ro` — Данро;
`96rz` — резервная панель. | +| 97 | Показать сохранённое в NVS имя активной матрицы.
***Формат вывода:*** `ROLE : <имя>` (до 20 символов). | +| 98 | Запрос загруженности ядер, оперативки, свободного места в памяти | +| 99 | Запрос статуса | + + +[^1]: Авторежим: если датчик в закрытом состоянии - на полсекунды включить мотор, ждать сработки датчика либо таймаута. Если таймаут - выдать сообщение "HOPPER1 ERROR" и наглухо повесить процесс хоппера до перезагрузки. Иначе - сообщение "HOPPER1 OK" + + ## Примечания ### Служебные команды @@ -86,50 +126,50 @@ by: Паша Николаевич `02…09` – команды относятся к служебным (обновление прошивки и двойное рукопожатие) >[!warning] Внимание! ->Обновляется только основная программа контроллера. ->Файл обновления передается как подготовленный `bin`. ->Ключи шифрования и авторизации должны соответствовать версии прошивки. +>Перешивается только основная программа, не трогается таблица разделов и буты. +>Поэтому контроллер должен шиться изначально в файловую систему «OTA0-1M+OTA1-1M+SpiFFS-1.7M». +>При прошивке зашивается ключ шифрования и AES ключ авторизации. +>Прошивка для обновления идет бин-файлом, уже криптованным. ### Программы адресных диодов -`80NNYY[PARAMS]` - выбор программы адресных диодов, где NN - номер канала в формате ДВУХ (2, two) цифр, а YY - номер параметра базового эффекта. +`8XYY[PARAMS]` - выбор программы адресных диодов, где X - номер канала в формате одной цифры, а YY - номер параметра базового эффекта. Программа зависит от автомата и не может быть унифицирована. Именно для этого требуется обновление прошивки контроллера. ***Список базовых эффектов:*** -- 00 – ничего не выводить в канал -- 01 – повторный периодический вывод последнего состояния -- 02 – погасить (выводить нолики на всю длину) -- 03 – красный -- 04 – зеленый -- 05 - синий с яркостью `B=100` -- 06 - белый (100, 100, 100) -- 07 - белый (255, 255, 255) -- 08 - пользовательский цвет `RRRGGGBBB`, где каждая компонента `000..255` -- 09 - радужный сдвиг на весь канал -- 10 - морская волна для шапки морского боя -- 11 - автоперебор медленных эффектов шапки морского боя -- 20 - idle-анимация призовой стойки -- 21 - подсветить полку призовой стойки, параметры `BCF`: ячейка `1..5`, цвет, мигание `0/1` -- 22 - красная мигающая тревога -- 23 - радужный сдвиг на весь канал -- 90 - выводить состояние, которое заполняет виртуальная панель +- `00` – ничего не выводить в канал +- `01` – повторный периодический вывод буфера +- `02` – погасить (выводить нолики на всю длину) +- `03` – красный +- `04` – зеленый +- `05` - синий +- `06` - серый (100, 100, 100) +- `07` - белый +- `08RRRGGGBBB` - пользовательский цвет, каждая компонента 3 десятичные цифры (`000..255`) +- `09` - выводить ЛГБТ переливы +- `10` - морская волна для шапки морского боя +- `11` - автоперебор медленных эффектов шапки морского боя -***Примеры:*** -- `800003` - все каналы красные -- `800103` - канал 1 красный -- `800002` - все каналы черные -- `800208255000128` - канал 2, цвет RGB `255,000,128` -- `800121311` - канал 1, полка 3, красный, мигает +Для бродяг морей 4 канал - монетник и выдача приза: +`8012хх` +`8013хх` -##### Настройки адресной подсветки +- `1200` - очистить обе direct-группы на 4-й ленте; `1201..1203` - direct-группа 1, эффекты 1..3 +- `1300` - очистить обе direct-группы на 4-й ленте; `1301..1303` - direct-группа 2, эффекты 1..3 -`89CKP`: -- `C` - канал: `0` для всех каналов подсветки, `1..4` для конкретного канала; +#### Настройки адресной подсветки + +`89CKP` меняет настройки вывода WS2812. Это не выбор эффекта, а настройка того, как уже рассчитанный цвет будет записан в буфер конкретной ленты: +- `C` - канал: `0` для всех каналов подсветки, `0..3` для конкретного канала; - `K` - настройка: `0` порядок цветов, `1` яркость, `2` гамма-коррекция; - `P` - значение настройки. Может состоять из нескольких цифр, например `255` для яркости. Если отправить только `89CK` без `P`, параметр будет принят как `0`, поэтому лучше передавать `P` явно. -`K=0` сохраняет порядок цветов, `K=1` меняет яркость до перезагрузки, `K=2` включает/выключает гамма-коррекцию до перезагрузки. +| `K` | `P` | Что меняет | Сохранение | +| :-: | :------- | :------------------------------------------- | :--------------------- | +| `0` | `0..5` | Порядок цветов в буфере WS2812 | Сохраняется в NVS | +| `1` | `0..255` | Яркость ленты | Только до перезагрузки | +| `2` | `0/1` | Гамма-коррекция: `1` включить, `0` выключить | Только до перезагрузки | Порядки цвета для `K=0`: @@ -142,17 +182,83 @@ by: Паша Николаевич | `4` | GRB | | `5` | GBR | -***Примеры:*** -- `89004` - установить порядок `GRB` для всех каналов -- `89104` - установить порядок `GRB` для 1-го канала -- `89404` - установить порядок `GRB` для 4-го канала -- `8901255` - установить яркость `255` для всех каналов -- `8901128` - установить яркость `128` для всех каналов -- `89020` - выключить гамма-коррекцию на всех каналах -- `89421` - включить гамма-коррекцию для 4-го канала +Для проверки удобно включать тестовые цвета: + +- `8003` - все ленты красным; +- `8004` - все ленты зеленым; +- `8005` - все ленты синим. + +Если какая-то лента показывает цвета неверно, поменяйте ее порядок через `89C0P`. + +###### Примеры порядка цветов + +| Команда | Что делает | +| :--- | :--- | +| `89004` | Установить `GRB` для всех лент | +| `89104` | Установить `GRB` для 2-го физического канала | +| `89204` | Установить `GRB` для 3-го физического канала | +| `89304` | Установить `GRB` для 4-го физического канала | +| `89000` | Установить `RGB` для всех лент | +| `89300` | Установить `RGB` для 4-го физического канала | + +###### Примеры яркости и гаммы + +| Команда | Что делает | +| :-------- | :--------------------------------------------------- | +| `8901255` | Яркость `255` для всех лент | +| `8901128` | Яркость `128` для всех лент | +| `8931128` | Яркость `128` для 4-го физического канала | +| `89021` | Включить гамма-коррекцию для всех лент | +| `89020` | Выключить гамма-коррекцию для всех лент | +| `89321` | Включить гамма-коррекцию для 4-го физического канала | +| | | + +#### Карты матриц + +Выбор карты командой `96<имя>`, сохраняется в NVS, восстанавливается при загрузке. + +**Морской бой (s_b):** +- `s_b` — основная карта, 58×42, 4 канала +- `s_b_v1` — версия 1, 65×69, 3 канала, 4 канал шкалы (3 шкалы) +- `s_b_v2` — версия 2, 65×69, 3 канала, 4 канал шкалы (4 шкалы) + +**Данро (dan_ro):** +- `dan_ro` — основная карта, 61×19, 2 стрипа (strip 0 зеркалируется в strip 1) +- `dan_ro_v1` — версия 1, 61×19, 1 стрип (без зеркала) + +**Резервная панель RZ (rz):** +- `rz` — основная карта, 61×19, 2 стрипа (strip 0 зеркалируется в strip 1) +- `rz_v1` — версия 1, 61×19, 1 стрип (без зеркала) #### Специфичные программы +##### Отдельный раздел для призовой стойки + +- `20` - режим простоя призовой стойки +- `21BCF` - подсветить полку призовой стойки: `B` ячейка `1..5`, `C` цвет, `F` мигание `0/1` +- `22` - красная мигающая тревога +- `23` - ЛГБТ переливы на всю ленту +- `90` - выводить внешний буфер, который заполняет рендер виртуальной панели + +`25CCB`: +- `CC` – подкоманда; +- `B` – номер ячейки `1..5`, если подкоманда работает с ячейкой. + +| Формат | Назначение | +| :----: | :--------- | +| `25` | Показать состояние всех ячеек | +| `2501B` | Выдать приз из ячейки `B` | +| `2511B` | Открыть ячейку `B` без списания приза | +| `25991` | Включить автозапуск режима призовой стойки и перезагрузиться через 3 сек | +| `25990` | Выключить автозапуск режима призовой стойки и перезагрузиться через 3 сек | + +Ответы: +- `BOX_OPEN` – ячейка открыта; +- `BOX_ERROR` – ячейка не открылась или нет приза; +- `BOX_OK` – ячейка закрыта и содержит приз; +- `BOX_OK+CARD` – в ячейке есть приз и привязанная RFID-карта; +- `BOX_EMPTY` – ячейка пуста. + ##### Отдельный раздел для Бродяги морей `81XX[NN]` управляет двумя отдельными direct-объектами Бродяги морей. Эта группа похожа на direct-шкалы `8530..8534`, но не является частью команды `85` и используется отдельно от панелей `85`, `86` и `87`. @@ -414,52 +520,34 @@ by: Паша Николаевич - `87254105` - адресный элемент `105` - `87` - остановить анимации -## Список команд +##### Дополнительные цифровые GPIO -| Команда | Назначение, примеры, ответы | -| ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 00 | Перезагрузить контроллер (RESET) | -| 01 | Отладочная. включает-выключает подробные логи. В релизе будет отключена | -| 02 | Подготовиться к приему файла обновления.
_**Например**_, `02356987` - заявка на файл размером 356987 байт.
После подготовки все данные из порта записываются в файл обновления.
Ответ при приеме файла - размер принятого блока.
По окончании - переход снова в режим команд (подробнее – [Обновление](#Обновление)). | -| 03 | Показать список файлов обновления и служебных файлов | -| 04 | Запустить обновление с ранее переданным файлом | -| 05 | Показать версию прошивки (указана в дефолтах) | -| 06 | Показать MAC-адрес (без двоеточий, как в оригинале), уникальный, можно считать серийным номером | -| 07 | Безопасность (запрос авторизации от компа. На этот запрос создается рандомный запрос навстречу. См. [[#Алгоритм авторизации]]) | -| 08 | Безопасность (прием ответа от компьютера на запрос `07`. См. [[#Алгоритм авторизации]]) | -| 09 | Сброс настроек контроллера. Параметр - MAC без двоеточий, иначе команда не выполнится. Накопительные счетчики сохраняются | -| 10 | Подтверждение принятия сигнала COIN, иначе этот сигнал будет посылаться снова с периодичностью `200 мс` (сколько приняли койнов, столько и подтверждений быть должно) | -| 20X | Установить состояние 8 выходов двоичной маской.
_**Например**_, `203` - включить выходы 1 и 2, остальные выключить. | -| 21XY | Установить состояние выхода номер Х в -> Y \[0,1,2(инверсия)\].
_**Примеры:**_
`2131` - Включить 3 по индексу выход
`2170` - Выключить 7 по индексу выход | -| 25CCB | Команды призового шкафа.
`25` - состояние всех ячеек
`2501B` - выдать приз из ячейки `B` (`1..5`)
`2511B` - открыть ячейку без списания
`25991` / `25990` - включить / выключить автозапуск призовой стойки с перезагрузкой | -| 30X | Хоппер 1.
`301` - Включить мотор хоппера
`300` - Выключить мотор хоппера
`309` - Выдать приз (в авторежиме[^1]) | -| 40X | Хоппер 2.
Аналогично | -| 50CCP | Дополнительные выходы.
`50` - показать режимы и уровни
`5001P` - настроить режимы дополнительных выходов
`5005P` - показать краткое состояние `ADD:..`
`5010P` - установить уровни выходов | -| 80NNYY | Выбор программы адресных диодов `YY` по каналу `NN`: `00` - все каналы, `01..04` - канал 1..4 (См. [[#Программы адресных диодов]]) | -| 81XXNN | Бродяги морей: direct-объекты (См. [[#Отдельный раздел для Бродяги морей]]).
`8130` - очистить
`8131NN` / `8132NN` - уровни объектов
`81311..81313` и `81321..81323` - эффекты объектов | -| 82..84 | Свободно / зарезервировано под новую логику | -| 85XXSSS | Виртуальная панель морского боя `s_b` (См. [[#Отдельный раздел для морского боя VR]]) | -| 85 | Без параметра отключает анимации `s_b` | -| 86XXSSS | Виртуальная панель Данро (См. [[#Отдельный раздел для Данро]]) | -| 86 | Без параметра отключает анимации Данро | -| 87XXSSS | Резервная виртуальная панель RZ (См. [[#Отдельный раздел для RZ]]) | -| 87 | Без параметра отключает анимации RZ | -| 89CKP | Настройки адресной подсветки. Старый короткий вариант `89[X]` переключает цветовое чередование.
***Примеры чередования:***
- `89` или `8900` – RGB
- `8901` – RBG
- `8902` – BRG
- `8903` – BGR
- `8904` - GRB
- `8905` - GBR | -| 90 | Очистить очередь команд | -| 91 | Запрос состояния цифровых входов, их всего 24(+2 входа хоппера), ответ в двоичном коде.
Для уменьшения объема передаваемой информации, преобразуется в десятичное число
_**Примеры:**_
`INPUT67108863` (`11111111111111111111111111`) - все кнопки не нажаты
`INPUT67108861` (`11111111111111111111111101`) - нажата вторая кнопка | -| 91X | _Дополнительно_: задать время антидребезга входов (`10..100`; по умолчанию установлено на 50 мс)
_**Например**_, 9110 - установить антидребезг на 10 мс | -| 92 | Запрос значения аналоговых входов **(отключает автовывод)** - ответ в формате `ADC0,0,0,0`.
Всего 4 аналоговых входа | -| 92X | Периодический автовывод значений аналоговых входов.
_**Например**_, `92100` - каждые 100 миллисекунд выдавать значения ADC (`50..5000`) | -| 93 | Запрос `global_summa` (число коинов, нестираемо). Ответ: `SUMMA:` | -| 96 | Cохранение в памяти платы пользовательского значения.
***Например,*** «роли» контроллера (левый-правый в морском бое, или шкаф…)
***Пример команды:*** `96right` | -| 97 | Вывод пользовательского значения
***Формат вывода:*** `ROLE : <значение>` (до 20 символов) | -| 98 | Запрос технического статуса контроллера: загрузка, память, свободное место | -| 99 | Запрос статуса: имя контроллера, версия, `READY!` при `auth_ok=true` | +`50CCP`: +- `CC` – подкоманда; +- `P` – числовой параметр. -[^1]: Авторежим: если датчик в закрытом состоянии - на полсекунды включить мотор, ждать сработки датчика либо таймаута. Если таймаут - выдать сообщение "HOPPER1 ERROR" и наглухо повесить процесс хоппера до перезагрузки. Иначе - сообщение "HOPPER1 OK" +| Формат | Назначение | +| :----: | :--------- | +| `50` | Показать режимы и уровни GPIO25/GPIO26 | +| `5001P` | Настроить режимы: если `P > 9`, GPIO25 выход; если младший бит `P` равен `1`, GPIO26 выход | +| `5005P` | Показать краткое состояние: `ADD:..` | +| `5010P` | Установить уровни выходов: GPIO25 = `P > 9`, GPIO26 = младший бит `P` | + +# Обновление прошивки платы + +## Православный (новый) + +Зайти в програму для платы, и обновить прошивку через него. + +Для этого надо: +1. Заполучить новую прошивку +2. Подключить плату +3. Открыть приложение +4. Подключиться к плате через приложение +5. Обновить прошивку через специальный пункт "Обновление прошивки" + +## Пендосский (старый) -# Обновление - Файл обновления принимается командой `02`. После полного приема контроллер отвечает текущим количеством записанных байт и итоговым `file size= OK`, затем обновление запускается командой `04`. Для обновления платы на новую версию прошивки надо: