diff --git a/app/widgets/dialogs/led_test_dialog.py b/app/widgets/dialogs/led_test_dialog.py index 1397096..a8c5016 100644 --- a/app/widgets/dialogs/led_test_dialog.py +++ b/app/widgets/dialogs/led_test_dialog.py @@ -15,6 +15,7 @@ import sys from PySide6.QtCore import Qt, QTimer from PySide6.QtWidgets import ( + QCheckBox, QFormLayout, QGroupBox, QHBoxLayout, @@ -142,31 +143,72 @@ class LedTestDialog(StyledDialog): effect_form.addRow(btn_row) root.addWidget(effect_group) - # ── Цветовое чередование ── - color_group = QGroupBox("Цветовое чередование (cmd 89)") - color_root = QVBoxLayout(color_group) + # ── Настройки WS2812 (cmd 89) ── + color_group = QGroupBox("Настройки WS2812 (cmd 89)") + color_form = QFormLayout(color_group) + color_form.setSpacing(6) + # Выбор физического канала + self._cmd89_channel_combo = NoWheelComboBox() + self._cmd89_channel_combo.addItem("Все ленты (0)", 0) + self._cmd89_channel_combo.addItem("1-й канал (1)", 1) + self._cmd89_channel_combo.addItem("2-й канал (2)", 2) + self._cmd89_channel_combo.addItem("3-й канал (3)", 3) + self._cmd89_channel_combo.addItem("4-й канал (4)", 4) + color_form.addRow("Физический канал:", self._cmd89_channel_combo) + + # Порядок цветов self._color_order_combo = NoWheelComboBox() for code, name in _COLOR_ORDERS: self._color_order_combo.addItem(f"{code} — {name}", code) - color_root.addWidget(self._color_order_combo) - set_color_btn = QPushButton("1. Применить") - set_color_btn.setProperty("role", "primary") - set_color_btn.setIcon(icon("fa5s.palette", color="#ecfdf5")) - set_color_btn.clicked.connect(self._send_color_order) - color_root.addWidget(set_color_btn) + apply_order_btn = QPushButton("Применить порядок") + apply_order_btn.setProperty("role", "primary") + apply_order_btn.setIcon(icon("fa5s.palette", color="#ecfdf5")) + apply_order_btn.clicked.connect(self._send_color_order) - self._color_test_btn = QPushButton("2. Тест цвета") + order_layout = QHBoxLayout() + order_layout.addWidget(self._color_order_combo, 1) + order_layout.addWidget(apply_order_btn) + color_form.addRow("Порядок цветов:", order_layout) + + # Яркость + self._cmd89_brightness_spin = QSpinBox() + self._cmd89_brightness_spin.setRange(0, 255) + self._cmd89_brightness_spin.setValue(255) + + apply_bright_btn = QPushButton("Применить яркость") + apply_bright_btn.setIcon(icon("fa5s.sun", color=get_icon_color())) + apply_bright_btn.clicked.connect(self._send_brightness) + + bright_layout = QHBoxLayout() + bright_layout.addWidget(self._cmd89_brightness_spin, 1) + bright_layout.addWidget(apply_bright_btn) + color_form.addRow("Яркость:", bright_layout) + + # Гамма-коррекция + self._cmd89_gamma_check = QCheckBox("Включить гамма-коррекцию") + + apply_gamma_btn = QPushButton("Применить гамму") + apply_gamma_btn.setIcon(icon("fa5s.adjust", color=get_icon_color())) + apply_gamma_btn.clicked.connect(self._send_gamma) + + gamma_layout = QHBoxLayout() + gamma_layout.addWidget(self._cmd89_gamma_check, 1) + gamma_layout.addWidget(apply_gamma_btn) + color_form.addRow("Гамма-коррекция:", gamma_layout) + + # Тест цвета + self._color_test_btn = QPushButton("Тест цвета") self._color_test_btn.setProperty("role", "primary") self._color_test_btn.setIcon(icon("fa5s.eye", color="#ecfdf5")) self._color_test_btn.clicked.connect(self._run_color_test) - color_root.addWidget(self._color_test_btn) + color_form.addRow(self._color_test_btn) color_hint = QLabel("Должны вывестись: красный → зелёный → синий") - color_hint.setStyleSheet("color: #9ca3af; font-size: 12px;") + color_hint.setStyleSheet("color: #9ca3af; font-size: 11px;") color_hint.setWordWrap(True) - color_root.addWidget(color_hint) + color_form.addRow(color_hint) root.addWidget(color_group) @@ -279,8 +321,21 @@ class LedTestDialog(StyledDialog): self._send(mode.base_command) def _send_color_order(self) -> None: + ch = self._cmd89_channel_combo.currentData() code = self._color_order_combo.currentData() - cmd = f"8900{code}" + cmd = f"89{ch}0{code}" + self._send(cmd) + + def _send_brightness(self) -> None: + ch = self._cmd89_channel_combo.currentData() + val = self._cmd89_brightness_spin.value() + cmd = f"89{ch}1{val}" + self._send(cmd) + + def _send_gamma(self) -> None: + ch = self._cmd89_channel_combo.currentData() + val = 1 if self._cmd89_gamma_check.isChecked() else 0 + cmd = f"89{ch}2{val}" self._send(cmd) def _run_color_test(self) -> None: diff --git a/app/widgets/dialogs/role_dialog.py b/app/widgets/dialogs/role_dialog.py index b1e9ffc..5d3213e 100644 --- a/app/widgets/dialogs/role_dialog.py +++ b/app/widgets/dialogs/role_dialog.py @@ -18,6 +18,7 @@ from PySide6.QtWidgets import ( from ...services.com_service import ComConnection from ...ui.icons import get_icon_color, get_icon_muted, icon +from ..no_wheel_combo_box import NoWheelComboBox from .styled_dialog import StyledDialog @@ -47,6 +48,22 @@ class RoleDialog(StyledDialog): current_layout.addWidget(read_btn) root.addLayout(current_layout) + # ── Быстрый выбор роли ── + preset_layout = QHBoxLayout() + preset_layout.addWidget(QLabel("Шаблоны ролей:")) + self._role_preset_combo = NoWheelComboBox() + self._role_preset_combo.addItem("— Свой вариант —", "") + self._role_preset_combo.addItem("s_b (Морской бой)", "s_b") + self._role_preset_combo.addItem("s_b_v1 (Морской бой v1)", "s_b_v1") + self._role_preset_combo.addItem("s_b_v2 (Морской бой v2)", "s_b_v2") + self._role_preset_combo.addItem("dan_ro (Данро)", "dan_ro") + self._role_preset_combo.addItem("dan_ro_v1 (Данро v1)", "dan_ro_v1") + self._role_preset_combo.addItem("rz (Резервная панель RZ)", "rz") + self._role_preset_combo.addItem("rz_v1 (Резервная панель RZ v1)", "rz_v1") + self._role_preset_combo.currentIndexChanged.connect(self._on_preset_changed) + preset_layout.addWidget(self._role_preset_combo, 1) + root.addLayout(preset_layout) + # ── Установка новой роли ── set_layout = QHBoxLayout() set_layout.addWidget(QLabel("Новая роль:")) @@ -71,6 +88,11 @@ class RoleDialog(StyledDialog): btn_layout.addWidget(close_btn) root.addLayout(btn_layout) + def _on_preset_changed(self, index: int) -> None: + val = self._role_preset_combo.itemData(index) + if val: + self._role_input.setText(val) + def _read_role(self) -> None: if not self._conn.is_connected: return diff --git a/app/widgets/sections/led_test_section.py b/app/widgets/sections/led_test_section.py index 6a2af23..21d8fdb 100644 --- a/app/widgets/sections/led_test_section.py +++ b/app/widgets/sections/led_test_section.py @@ -8,16 +8,20 @@ from __future__ import annotations from PySide6.QtCore import QTimer from PySide6.QtWidgets import ( + QCheckBox, + QFormLayout, QGroupBox, + QHBoxLayout, QLabel, QMessageBox, QPushButton, + QSpinBox, QVBoxLayout, QWidget, ) from ...services.com_service import ComConnection -from ...ui.icons import icon +from ...ui.icons import get_icon_color, icon from ..no_wheel_combo_box import NoWheelComboBox _COLOR_ORDERS: list[tuple[int, str]] = [ @@ -45,39 +49,81 @@ class LedTestSection(QWidget): root.setContentsMargins(0, 0, 0, 0) root.setSpacing(10) - # ── Тест цвета ── - color_group = QGroupBox("Тест цвета (cmd 89)") - color_root = QVBoxLayout(color_group) + # ── Настройки WS2812 (cmd 89) ── + color_group = QGroupBox("Настройки WS2812 (cmd 89)") + color_form = QFormLayout(color_group) + color_form.setSpacing(6) desc = QLabel( - "Выберите порядок цветов и нажмите «1. Применить». " - "Затем нажмите «2. Тест цвета»: подсветка должна показать красный, зелёный и синий цвет." + "Настройки вывода WS2812. Выберите физический канал и настройте порядок цветов, " + "яркость или гамма-коррекцию." ) desc.setWordWrap(True) desc.setObjectName("HelpText") - color_root.addWidget(desc) + color_form.addRow(desc) + # Выбор физического канала + self._cmd89_channel_combo = NoWheelComboBox() + self._cmd89_channel_combo.addItem("Все ленты (0)", 0) + self._cmd89_channel_combo.addItem("1-й канал (1)", 1) + self._cmd89_channel_combo.addItem("2-й канал (2)", 2) + self._cmd89_channel_combo.addItem("3-й канал (3)", 3) + self._cmd89_channel_combo.addItem("4-й канал (4)", 4) + color_form.addRow("Физический канал:", self._cmd89_channel_combo) + + # Порядок цветов self._color_order_combo = NoWheelComboBox() for code, name in _COLOR_ORDERS: self._color_order_combo.addItem(f"{code} — {name}", code) - color_root.addWidget(self._color_order_combo) - self._set_color_btn = QPushButton("1. Применить") + self._set_color_btn = QPushButton("Применить порядок") self._set_color_btn.setProperty("role", "primary") self._set_color_btn.setIcon(icon("fa5s.palette", color="#ecfdf5")) self._set_color_btn.clicked.connect(self._send_color_order) - color_root.addWidget(self._set_color_btn) - self._color_test_btn = QPushButton("2. Тест цвета") + order_layout = QHBoxLayout() + order_layout.addWidget(self._color_order_combo, 1) + order_layout.addWidget(self._set_color_btn) + color_form.addRow("Порядок цветов:", order_layout) + + # Яркость + self._cmd89_brightness_spin = QSpinBox() + self._cmd89_brightness_spin.setRange(0, 255) + self._cmd89_brightness_spin.setValue(255) + + apply_bright_btn = QPushButton("Применить яркость") + apply_bright_btn.setIcon(icon("fa5s.sun", color=get_icon_color())) + apply_bright_btn.clicked.connect(self._send_brightness) + + bright_layout = QHBoxLayout() + bright_layout.addWidget(self._cmd89_brightness_spin, 1) + bright_layout.addWidget(apply_bright_btn) + color_form.addRow("Яркость:", bright_layout) + + # Гамма-коррекция + self._cmd89_gamma_check = QCheckBox("Включить гамма-коррекцию") + + apply_gamma_btn = QPushButton("Применить гамму") + apply_gamma_btn.setIcon(icon("fa5s.adjust", color=get_icon_color())) + apply_gamma_btn.clicked.connect(self._send_gamma) + + gamma_layout = QHBoxLayout() + gamma_layout.addWidget(self._cmd89_gamma_check, 1) + gamma_layout.addWidget(apply_gamma_btn) + color_form.addRow("Гамма-коррекция:", gamma_layout) + + # Тест цвета + self._color_test_btn = QPushButton("Тест цвета") self._color_test_btn.setProperty("role", "primary") self._color_test_btn.setIcon(icon("fa5s.eye", color="#ecfdf5")) self._color_test_btn.clicked.connect(self._run_color_test) - color_root.addWidget(self._color_test_btn) + color_form.addRow(self._color_test_btn) color_hint = QLabel("Должны вывестись: красный → зелёный → синий") - color_hint.setStyleSheet("color: #9ca3af; font-size: 12px;") + color_hint.setStyleSheet("color: #9ca3af; font-size: 11px;") color_hint.setWordWrap(True) - color_root.addWidget(color_hint) + color_form.addRow(color_hint) + root.addWidget(color_group) # ── Лог ── @@ -94,8 +140,22 @@ class LedTestSection(QWidget): # ── Отправка ────────────────────────────────────────────────────── def _send_color_order(self) -> None: + ch = self._cmd89_channel_combo.currentData() code = self._color_order_combo.currentData() - self._send(f"8900{code}") + cmd = f"89{ch}0{code}" + self._send(cmd) + + def _send_brightness(self) -> None: + ch = self._cmd89_channel_combo.currentData() + val = self._cmd89_brightness_spin.value() + cmd = f"89{ch}1{val}" + self._send(cmd) + + def _send_gamma(self) -> None: + ch = self._cmd89_channel_combo.currentData() + val = 1 if self._cmd89_gamma_check.isChecked() else 0 + cmd = f"89{ch}2{val}" + self._send(cmd) def _run_color_test(self) -> None: self._color_test_cmds = ["8003", "8004", "8005", "8002", "8000"] diff --git a/commands/Основные.csv b/commands/Основные.csv index 65eb4e2..9c49350 100644 --- a/commands/Основные.csv +++ b/commands/Основные.csv @@ -1,8 +1,8 @@ command;name;description 00;Перезагрузка;Перезагрузить контроллер (RESET). Помещается в очередь без ожидания. -01;Отладка;Включает/выключает подробные логи. В релизе будет отключена. +01;Отладка;Включает/выключает подробные логи (SILENT / DEVELOPER). В релизе будет отключена. 02;Приём файла;Подготовиться к приёму файла обновления. Параметр — размер в байтах. Пример: 02356987. Выполняется ~15 сек, затем весь приём данных записывается в update.bin. -03;SPIFFS;Показать содержимое SPIFFS (встроенной файловой системы). +03;SPIFFS;Показать содержимое встроенной файловой системы SPIFFS. 04;OTA обновление;Запустить OTA-обновление с ранее записанным файлом /update.bin. 05;Версия прошивки;Показать версию прошивки контроллера. 06;MAC-адрес;Показать MAC-адрес (без двоеточий). Уникальный, можно считать серийным номером. @@ -10,21 +10,26 @@ command;name;description 08;Авторизация (ответ);Приём ответа от компьютера на встречный вызов CHAL. 32 HEX-символа зашифрованных AES256. 09;Сброс EEPROM;Сброс EEPROM. Параметр — MAC-адрес без двоеточий, иначе не сбросится. 10;Подтверждение COIN;Подтвердить принятие сигнала COIN. Без подтверждения сигнал повторяется каждые 200 мс. -20X;Выходы (маска);Установить состояние 8 выходов двоичной маской. Пример: 203 → включить выходы 1 и 2. -21XY;Выход (один);Установить выход X в состояние Y [0/1/2(инверсия)]. Пример: 2131 → включить выход 3. +20X;Выходы (маска);Установить состояние 8 выходов двоичной маской. Пример: 203 → вывести 1 и 2 выходы по единичке, остальные - нолики. +21XY;Выход (один);Установить выход X (0-7) в состояние Y [0/1/2(инверсия)]. Пример: 2131 → включить выход 3. +25CCB;Витрина призов;25 — запрос состояния; 2501B — выдать приз из ячейки B; 2511B — открыть ячейку B без списания; 25991/25990 — вкл/выкл авторежим витрины. 30X;Хоппер 1;301 — включить мотор, 300 — выключить, 309 — выдать приз (авторежим с контролем датчика). 40X;Хоппер 2;Аналогично хопперу 1. -8XYY;Программа LED;Выбор программы YY адресных диодов по каналу X (1..4). 80YY — на все каналы. 0 — выкл, 3 — красный, 4 — зелёный, 5 — синий. -85XXYY;Спецэффект LED;Специфичная программа эффектов. XX — код эффекта, YY — время в секундах. Пример: 854505 — ЗАРЯДКА на 5 сек. +50CCP;Дополнительные GPIO;GPIO25/GPIO26: 50 — запрос состояния; 5001P — настроить режим; 5005P — запрос уровня; 5010P — установить выходы. +8XYY;Программа LED;Выбор программы YY по каналу X (1..4). 80YY — на все каналы. 08RRRGGGBBB — цвет. 8012.. / 8013.. — direct-группы монетника/выдачи. +81XX[NN];Бродяга морей;Управление direct-объектами Бродяги морей. 8130 — очистить; 8131NN / 8132NN — уровень; 81311..81313 / 81321..81323 — эффекты. +85XX[SSS];Эффекты VM-матрицы;Эффекты s_b: 00/01 — авто вкл/выкл; 25 — тесты; 30..34 — direct-шкалы; 10..22 — базовые; 40..49 — спец; 80..82 — цвета. SSS — время. 85;Стоп рендеринг;Без параметра — отключить процесс рендеринга эффектов (освободить RAM). -89[X];Цветовой порядок;Переключить чередование цветов: 0/пусто — RGB, 1 — RBG, 2 — BRG, 3 — BGR, 4 — GRB, 5 — GBR. +8550XX[SSS];Данро (принудительно);Данро (принудительная матрица dan_ro): 855000 — очистить; 855001 — авто вкл; 855010..855016 — эффекты. SSS — время. +8560XX[SSS];RZ (принудительно);Резервная панель RZ (принудительная матрица rz): 856000 — очистить; 856001 — авто вкл; 856010..856016 — эффекты. SSS — время. +89CKP;Настройки WS2812;C — канал (0..3); K — настройка: 0 порядок (0..5 для RGB..GBR), 1 яркость (0..255), 2 гамма (0/1); P — значение. 90;Очистка очереди;Очистить очередь команд. -91;Входы;Запрос состояния 26 цифровых входов. Ответ: INPUT<число>. Пример: INPUT67108863 — все не нажаты. +91;Входы;Запрос состояния 24 цифровых (+2 хоппера) входов в двоичном коде (преобразованном в десятичный). Пример: INPUT67108863. 91X;Антидребезг;Задать время антидребезга (10..100 мс). По умолчанию 50 мс. Пример: 9110. 92;ADC (однократно);Запрос значений 4 аналоговых входов. Отключает автовывод. Ответ: ADC0,0,0,0. 92X;ADC (авто);Периодический автовывод ADC каждые X мс (50..5000). Пример: 92100. 93;Счётчик монет;Запрос global_summa — нестираемый счётчик принятых монет. -96;Сохранить роль;Сохранить пользовательское значение в памяти платы (до 20 символов). Пример: 96right. -97;Показать роль;Вывод сохранённого пользовательского значения. Формат: ROLE : <значение>. +96;Активная матрица;Без параметра — запрос текущей активной VM-матрицы. С параметром — выбор и сохранение матрицы в NVS (s_b, dan_ro, rz, ...). +97;Показать активную матрицу;Вывод сохранённого в NVS имени активной матрицы. Формат: ROLE : <имя>. 98;Состояние системы;Запрос загруженности ядер, оперативки и свободного места в памяти. 99;Статус;Запрос текущего статуса платы. diff --git a/light_modes/Морской бой VR.lm b/light_modes/Морской бой VR.lm index e4d8b03..3cb2494 100644 --- a/light_modes/Морской бой VR.lm +++ b/light_modes/Морской бой VR.lm @@ -8,19 +8,19 @@ has_duration = true # ── Базовые эффекты ── [[effects]] -code = 0 +code = 10 name = "Горизонтальная волна" [[effects]] -code = 1 +code = 11 name = "Вертикальная волна" [[effects]] -code = 2 +code = 12 name = "Диагональная волна" [[effects]] -code = 3 +code = 13 name = "Плазма" [[effects]] @@ -28,35 +28,35 @@ code = 14 name = "Ночь" [[effects]] -code = 5 +code = 15 name = "Радуга" [[effects]] -code = 6 +code = 16 name = "Огонь-Лёд" [[effects]] -code = 7 +code = 17 name = "Вода" [[effects]] -code = 8 +code = 18 name = "Звёзды" [[effects]] -code = 9 +code = 19 name = "Сканер" [[effects]] -code = 10 +code = 20 name = "Поток" [[effects]] -code = 11 +code = 21 name = "Буря" [[effects]] -code = 12 +code = 22 name = "Лёд" # ── Специальные эффекты ── diff --git a/light_modes/Резервная панель RZ.lm b/light_modes/Резервная панель RZ.lm new file mode 100644 index 0000000..4e04b30 --- /dev/null +++ b/light_modes/Резервная панель RZ.lm @@ -0,0 +1,58 @@ +# Резервная панель RZ — специальные эффекты подсветки +# Формат команды: 87XXYY (XX — код эффекта, YY — время в секундах) +# Без параметра (87) — отключить рендеринг эффектов + +base_command = "87" +has_duration = true + +[[effects]] +code = 40 +name = "Горизонтальная волна" + +[[effects]] +code = 41 +name = "Вертикальная волна" + +[[effects]] +code = 42 +name = "Диагональная волна" + +[[effects]] +code = 43 +name = "Радуга" + +[[effects]] +code = 44 +name = "Волна вверх" + +[[effects]] +code = 45 +name = "Вертикальная волна вверх" + +[[effects]] +code = 46 +name = "Конечная волна" + +[[effects]] +code = 47 +name = "Синяя волна" + +[[effects]] +code = 48 +name = "Диагональная волна 2" + +[[effects]] +code = 49 +name = "Падающие ряды" + +[[effects]] +code = 50 +name = "Оранжевая волна" + +[[effects]] +code = 51 +name = "Морская волна" + +[[effects]] +code = 52 +name = "Диагональная волна 3" diff --git a/Система команд платы v2.x.md b/Система команд платы v2.x.md index c58f5d5..71c4000 100644 --- a/Система команд платы v2.x.md +++ b/Система команд платы v2.x.md @@ -5,6 +5,7 @@ by: Паша Николаевич >[!info] Информация >Это раздел с информацией о плате периферийного контроллера. >Информацию о плате для витрины призов смотреть в [[Витрина призов]] +>Текущая описанная прошивка: `ver_2.3.6_no_auth_prizes`. >[!info] Общие сведения > - Плата подключается к компьютеру по переходу USB - COM порт. @@ -17,35 +18,57 @@ by: Паша Николаевич 2. [[#Авторизация]] 1. [[#Алгоритм авторизации]] 2. [[#Команды]] - 1. [[#Примечания]] + 1. [[#Список команд]] + 2. [[#Примечания]] 1. [[#Служебные команды]] 2. [[#Программы адресных диодов]] - 1. [[#Специфичные программы]] - 2. [[#Список команд]] -3. [[#Обновление]] + 1. [[#Настройки адресной подсветки]] + 2. [[#Карты матриц]] + 3. [[#Специфичные программы]] + 1. [[#Отдельный раздел для призовой стойки]] + 2. [[#Отдельный раздел для Бродяги морей]] + 3. [[#Отдельный раздел для морского боя VR]] + 1. [[#Управляющие коды 85]] + 2. [[#Поведение после окончания эффекта]] + 3. [[#Direct-шкалы 8530..8534]] + 4. [[#Тесты морского боя VR 8525TVVV]] + 5. [[#Базовые эффекты 8510..8522]] + 6. [[#Спецэффекты 8540..8549]] + 7. [[#Тестовые заливки 8580..8582]] + 8. [[#Диагностика 85]] + 4. [[#Отдельный раздел для Данро]] + 1. [[#Тесты панели Данро 8625TVVV]] + 2. [[#Список эффектов]] + 5. [[#Отдельный раздел для RZ]] + 1. [[#Тесты панели RZ 8725TVVV]] + 6. [[#Дополнительные цифровые GPIO]] +3. [[#Обновление прошивки платы]] + 1. [[#Православный новый]] + 2. [[#Пендосский старый]] # Система команд - Общение - строка, заканчивающаяся кодами (0xD)+(0xA), достаточно любого из них  для окончания строки - Минимально – ДВА (2, two) символа. 00+\ – команда, а 0+\ – уже нет -- Таймаут - 100 милисекунд, если строка за это время не окончилась - идет игнорирование команды +- Максимальная длина входной строки - 199 символов +- Таймаут - 100 миллисекунд, если строка за это время не окончилась - идет игнорирование команды Команды получаемые от компьютера помещаются в очередь и выполняются последовательно, кроме команд "сброс" (00) и "очистка очереди". +Размер очереди команд - 100 строк. Команды `00` и `90` обрабатываются сразу. Шифрование обмена: двойное рукопожатие при помощи AES256 c фиксированным ключом. -#### Кнопка SERVICE на плате: -- Если ее зажать и удержать при включении – выполнится сброс EEPROM +## Кнопка SERVICE на плате: +- Если ее зажать и удержать при включении – выполнится сброс настроек контроллера - При работе – посылает команду «SERVICE – предлагая компьютеру перейти в режим настройки игровой программы >[!warning] Внимание! >Имеются два режима работы: SILENT (тихий режим) и DEVELOPER (режим разработки, с полными логами). > >Переключение режимов: ->Если соединить ногу GPIO_15 с землей через резистор <10кОм включается ТИХИЙ режим, и контроллер не выдает логи, а только необходимые ответы и команды. ->Также режим можно переключать командой «01» (временно, в релизе будет удалено) +>Команда `01` временно переключает режим логирования. В релизной версии команда может быть удалена. -### Авторизация +## Авторизация После загрузки контроллер не принимает никаких команд, кроме запросов на авторизацию. @@ -70,14 +93,57 @@ by: Паша Николаевич 4. **Контроллер ответит на первый запрос компа**: **RAES\ (16 байт или 32 HEX-символа)** ***Пример:*** **RAES***99ED731648AB8C1709CC4C3C8C3BB0E1* +5. При успехе контроллер отправляет `AUTH_PC_OK` и статус. При ошибке - `AUTH_PC_FAIL`. # Команды +## Список команд +| Команда | Назначение, примеры, ответы | +| ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [[#Служебные команды\|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" + + ## Примечания ### Служебные команды -`02…09` – команды относятся к служебным (обновление прошивки и двойное рукопожопие) +`02…09` – команды относятся к служебным (обновление прошивки и двойное рукопожатие) >[!warning] Внимание! >Перешивается только основная программа, не трогается таблица разделов и буты. @@ -87,88 +153,354 @@ by: Паша Николаевич ### Программы адресных диодов -`8XYY` - выбор программы адресных диодов - -Всего 4 канала - -- `81YY…84YY`  - переключить программу на канале - ***Например:*** `8204` – на второй канал вывести четвертую, "зеленую" программу -- `80YY` – переключает программу на всех каналах сразу. +`8XYY[PARAMS]` - выбор программы адресных диодов, где X - номер канала в формате одной цифры, а YY - номер параметра базового эффекта. Программа зависит от автомата и не может быть унифицирована. Именно для этого требуется обновление прошивки контроллера. -Кроме, пожалуй, этих (считать тестовыми. Остальное – добавлять по вкусу): -- 0 – ничего не выводить в канал -- 1 – повторный периодический вывод буфера -- 2 – погасить (выводить нолики на всю длину) -- 3 – красный -- 4 – зеленый -- 5 - синий -- 6 - серый (100, 100, 100) -- 7 - белый -- 9 - выводить ЛГБТ переливы +***Список базовых эффектов:*** +- `00` – ничего не выводить в канал +- `01` – повторный периодический вывод буфера +- `02` – погасить (выводить нолики на всю длину) +- `03` – красный +- `04` – зеленый +- `05` - синий +- `06` - серый (100, 100, 100) +- `07` - белый +- `08RRRGGGBBB` - пользовательский цвет, каждая компонента 3 десятичные цифры (`000..255`) +- `09` - выводить ЛГБТ переливы +- `10` - морская волна для шапки морского боя +- `11` - автоперебор медленных эффектов шапки морского боя -*10 и далее – пользовательские функции* +Для бродяг морей 4 канал - монетник и выдача приза: +`8012хх` +`8013хх` + +- `1200` - очистить обе direct-группы на 4-й ленте; `1201..1203` - direct-группа 1, эффекты 1..3 +- `1300` - очистить обе direct-группы на 4-й ленте; `1301..1303` - direct-группа 2, эффекты 1..3 + +#### Настройки адресной подсветки + +`89CKP` меняет настройки вывода WS2812. Это не выбор эффекта, а настройка того, как уже рассчитанный цвет будет записан в буфер конкретной ленты: +- `C` - канал: `0` для всех каналов подсветки, `0..3` для конкретного канала; +- `K` - настройка: `0` порядок цветов, `1` яркость, `2` гамма-коррекция; +- `P` - значение настройки. Может состоять из нескольких цифр, например `255` для яркости. Если отправить только `89CK` без `P`, параметр будет принят как `0`, поэтому лучше передавать `P` явно. + +| `K` | `P` | Что меняет | Сохранение | +| :-: | :------- | :------------------------------------------- | :--------------------- | +| `0` | `0..5` | Порядок цветов в буфере WS2812 | Сохраняется в NVS | +| `1` | `0..255` | Яркость ленты | Только до перезагрузки | +| `2` | `0/1` | Гамма-коррекция: `1` включить, `0` выключить | Только до перезагрузки | + +Порядки цвета для `K=0`: + +| `P` | Порядок | +|---|---| +| `0` | RGB | +| `1` | RBG | +| `2` | BRG | +| `3` | BGR | +| `4` | GRB | +| `5` | GBR | + +Для проверки удобно включать тестовые цвета: + +- `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`. + +- `XX` - подкоманда объекта; +- `NN` - уровень заполнения объекта; +- короткие команды `81311..81313` - эффекты для объекта 1; +- короткие команды `81321..81323` - эффекты для объекта 2; +- если нужен ручной уровень `1..3`, передавайте уровень с ведущим нулем: `813101..813103` или `813201..813203`; +- эффекты `81311..81313` и `81321..81323` ускорены примерно в 3 раза, цветовые переходы сглажены. + +| Команда | Назначение | Максимальный уровень | +|---|---|---| +| `8130` | Очистить оба объекта | - | +| `8131NN` | Объект 1. Заполнить шкалу градиентом красный -> фиолетовый -> синий | `21` | +| `81311` | Эффект 1 объекта 1: плавный перелив синий -> фиолетовый -> фиолетово-красный | - | +| `81312` | Эффект 2 объекта 1: плавный перелив фиолетовый -> синий -> сине-голубой | - | +| `81313` | Эффект 3 объекта 1: мягкое мигание белым | - | +| `8132NN` | Объект 2. Заполнить шкалу градиентом красный -> зеленый | `44` | +| `81321` | Эффект 1 объекта 2: плавный перелив синий -> фиолетовый -> фиолетово-красный | - | +| `81322` | Эффект 2 объекта 2: плавный перелив фиолетовый -> синий -> сине-голубой | - | +| `81323` | Эффект 3 объекта 2: мягкое мигание белым | - | + +Если `NN` больше длины объекта, значение ограничивается полной длиной объекта. Если `NN=0`, объект гаснет. Команды `8130`, `8131NN` и `8132NN` останавливают эффект соответствующего объекта. + +***Примеры:*** +- `8130` - очистить оба объекта +- `813105` - установить уровень `5` для первого объекта +- `81311` - запустить эффект 1 первого объекта +- `81312` - запустить эффект 2 первого объекта +- `81313` - запустить эффект 3 первого объекта +- `81321` - запустить эффект 1 второго объекта +- `81322` - запустить эффект 2 второго объекта +- `81323` - запустить эффект 3 второго объекта +- `813101` - вручную установить уровень `1` для первого объекта, не запускать эффект +- `813201` - вручную установить уровень `1` для второго объекта, не запускать эффект +- `813121` - полностью зажечь первый объект +- `813244` - полностью зажечь второй объект + ##### Отдельный раздел для морского боя VR -`85XXYY`: -- XX – команда; -- YY – время в секундах. +`85XX[SSS]` управляет виртуальной панелью морского боя (`s_b`). Это отдельная группа анимаций, которая работает независимо от обычных программ подсветки. -***Пример:*** `854505` – включить спецэффект ЗАРЯДКА на 5 секунд +- `XX` – код управления или эффекта, две цифры после `85`; +- `SSS` – необязательная длительность в секундах, все оставшиеся цифры после `XX`; +- для direct-шкал `XX=30..34` хвост команды трактуется как уровень `0..22`, а не как время; +- для тестов `XX=25` хвост команды разбирается как `TVVV`. -`85` – без параметра отключает процесс рендеринга эффектов (чтобы освободить оперативную память). +***Примеры разбора:*** -###### Список эффектов +| Команда | Как разбирается | +|---|---| +| `85` | Остановить анимации `s_b` | +| `8500` | Автокарусель выключена, очистить экран, перейти в ожидание | +| `8501` | Автокарусель включена | +| `8510` | Горизонтальная волна с длительностью по умолчанию | +| `851005` | Горизонтальная волна на 5 секунд | +| `853105` | Первая direct-шкала на уровень `5` | +| `854506` | `CHARGE` на 6 секунд | +| `858006` | Красная тестовая заливка на 6 секунд | -| Команда (`XX`) | Название эффекта | -| :-------------: | :------------------: | -| **Базовые** | **эффекты** | -| 00 | Горизонтальная волна | -| 01 | Вертикальная волна | -| 02 | Диагональная волна | -| 03 | Плазма | -| 04 | Ночь | -| 05 | Радуга | -| 06 | Огонь-Лёд | -| 07 | Вода | -| 08 | Звёзды | -| 09 | Сканер | -| 10 | Поток | -| 11 | Буря | -| 12 | Лёд | -| **Специальные** | **эффекты** | -| 40 | СТАРТ | -| 41 | КОНЕЦ | -| 42 | ПОПАДАНИЕ | -| 43 | ВЫСТРЕЛ | -| 44 | ПРОМАХ | -| 45 | ЗАРЯДКА | -| 46 | СОНАР | -| 47 | КРАСНАЯ ВОЛНА | -| 48 | ТРЕВОГА | -| 49 | ПУЛЬСАЦИЯ | -| 80 | красный | -| 81 | зеленый | -| 82 | синий | +`85` без параметра отключает анимации `s_b`. В debug-режиме контроллер может отправить `85 - rendering OFF`. + +Любая непустая команда `85...` запускает анимации `s_b`, если они еще не запущены. Direct-группы `813x` и `8530..8534` управляются отдельными командами и не смешиваются с обычными эффектами `85`. + +Анимации рассчитываются как виртуальная 2D-панель. Для внешней программы важны только коды эффектов, длительность и правила возврата к предыдущему состоянию. + +###### Управляющие коды `85` + +| `XX` | Назначение | Длительность по умолчанию | +|---|---|---| +| `00` | Автокарусель выключена, очистить экран, перейти в ожидание | - | +| `01` | Автокарусель включена | 10 сек на эффект | + +###### Поведение после окончания эффекта + +- Если запущен базовый эффект `10..22` и автокарусель выключена, после истечения времени экран очищается и `s_b` переходит в ожидание. +- Если автокарусель включена, базовые эффекты переключаются по кругу `10 -> 11 -> ... -> 22 -> 10`. +- Если запущен спецэффект `40..49` или `80..82`, после завершения контроллер возвращается к последнему базовому эффекту. +- Если автокарусель выключена, после спецэффекта экран очищается и уходит в ожидание. + +###### Direct-шкалы `8530..8534` + +Эти команды управляют отдельными шкалами `s_b`. Параметр после `XX` - уровень шкалы `0..22`. Значения больше `22` ограничиваются до полной шкалы. + +Шкалы живут независимо от эффектов и не обнуляются при `8500`, `8501`, `8510..8522`, `8540..`, перезапуске анимаций или автопереходе карусели. Обновляются командами `8531..8534`; `8530` вручную очищает шкалы. + +| Команда | Назначение | Параметр | +|---|---|---| +| `8530` | Очистить все direct-шкалы | не используется | +| `8531NN` | Шкала 1: красный -> фиолетовый -> синий | уровень `0..22` | +| `8532NN` | Шкала 2: красный -> зеленый | уровень `0..22` | +| `8533NN` | Шкала 3: красный -> фиолетовый -> синий | уровень `0..22` | +| `8534NN` | Шкала 4: красный -> зеленый | уровень `0..22` | + +***Примеры:*** +- `8530` - очистить все direct-шкалы +- `853105` - установить уровень `5` для первой шкалы +- `853222` - полностью зажечь вторую шкалу +- `853300` - погасить третью шкалу +- `853422` - полностью зажечь четвертую шкалу + +###### Тесты морского боя VR `8525TVVV` + +При запуске теста обычные анимации `s_b` останавливаются, и панель переходит в тестовый режим. + +| Команда | Назначение | +|---|---| +| `85250` | Стоп теста, очистить тестовый режим | +| `85251` | Общий тест подсветки VR: бегущая змейка, цвета меняются | +| `85252NN` | Тест строки панели VR, `NN` - номер строки | +| `85253NN` | Тест столбца панели VR, `NN` - номер столбца | +| `85254NNN` | Тест адресного элемента `NNN` | + +***Примеры:*** +- `85251` - змейка VR +- `8525212` - строка `12` VR +- `852533` - столбец `3` VR +- `85254105` - адресный элемент `105` + +###### Базовые эффекты `8510..8522` + +| `XX` | Имя в коде | Визуальный смысл | Длительность по умолчанию | +|---|---|---|---| +| `10` | `hor wave` | Горизонтальная волна: синяя и красная волны идут навстречу | 10 сек | +| `11` | `vert wave` | Вертикальная морская волна снизу вверх/вниз, ping-pong | 10 сек | +| `12` | `diag wave` | Диагональная волна с темно-синим/оранжевым характером | 10 сек | +| `13` | `plazma` | Плазма: смешение синий/красный/зеленый | 10 сек | +| `14` | `night` | Ночной градиент: голубой, фиолетовый, розовый | 10 сек | +| `15` | `rainbow` | Радуга, полный HSV-спектр | 10 сек | +| `16` | `fire-ice` | Огонь-лед, красный к голубому | 10 сек | +| `17` | `wave` | Вода, диагональная темно-синяя/голубая волна | 10 сек | +| `18` | `stars` | Звезды, розово-зеленая диагональная динамика | 10 сек | +| `19` | `scaner` | Зеленый сканер с затуханием | 10 сек | +| `20` | `flame` | Поток / 2D RGB-градиент | 10 сек | +| `21` | `shtorm` | Быстрая радужная буря | 10 сек | +| `22` | `ice` | Лед, холодный вариант красный/голубой | 10 сек | + +###### Спецэффекты `8540..8549` + +Спецэффекты предназначены для событий игры. Они имеют приоритет над базовой анимацией, очищают состояние панели перед показом и после завершения возвращают систему к предыдущему базовому состоянию или в ожидание. + +| `XX` | Имя в коде | Назначение | Длительность по умолчанию | +|---|---|---|---| +| `40` | `START` | Старт: волны темно-синий -> бирюзовый снизу вверх | 3 сек | +| `41` | `FINISH` | Финиш / завершение | 3 сек | +| `42` | `ONE_SHOT` | Попадание / торпеда | 2 сек | +| `43` | `SHOT` | Выстрел / boom: красно-оранжево-желтые полосы от центра | 1 сек | +| `44` | `MISS` | Промах: зелено-голубая волна снизу вверх | 1 сек | +| `45` | `CHARGE` | Зарядка: сине-красный фон и индикатор заряда | 2 сек | +| `46` | `SONAR` | Сонар: расширяющиеся концентрические круги | 3 сек | +| `47` | `RED WAVE` | Красная волна сверху вниз | 3 сек | +| `48` | `ALARM` | Тревога: мигание красным | 3 сек | +| `49` | `PULSE` | Оранжевая пульсация | 2 сек | + +###### Тестовые заливки `8580..8582` + +Эти коды идут через тот же механизм спецэффектов: + +| `XX` | Назначение | Длительность по умолчанию | +|---|---|---| +| `80` | Залить всю виртуальную панель красным | 3 сек | +| `81` | Залить всю виртуальную панель зеленым | 3 сек | +| `82` | Залить всю виртуальную панель синим | 3 сек | + +###### Диагностика `85` + +В debug-режиме возможны сообщения: + +| Сообщение | Значение | +|---|---| +| `85 - rendering ON` | Рендер `s_b` запущен | +| `85 - rendering OFF` | Рендер остановлен командой `85` | +| `[S_B_] autoCarousel ON` | Автокарусель включена | +| `[S_B_] autoCarousel OFF` | Автокарусель выключена, экран очищен | +| `[S_B_] effect: 85XX (...)` | Запущен базовый эффект | +| `[S_B_] gauge: 85XX, level=N` | Обновлена direct-шкала `30..34` | +| `[S_B_] spec: XX (...)` | Запущен спецэффект | +| `[S_B_] effect done, waiting...` | Эффект завершен, экран очищен, режим ожидания | + +Ограничения текущего кода: +- параметры после `85` должны быть цифрами, но строгой проверки каждого символа сейчас нет; +- для спецэффектов в текущем коде принимается любой `XX >= 40`, но безопасно описаны только `40..49` и `80..82`; +- полный останов анимаций выполняется пустой командой `85`. ##### Отдельный раздел для Данро -`85XXYY`: +`86XX[SSS]`: - XX – команда; -- YY – время в секундах. +- SSS – время в секундах. -***Пример:*** `854505` – включить спецэффект ЗАРЯДКА на 5 секунд +***Пример:*** `864906` – включить эффект "Падающие ряды" на 6 секунд -`85` – без параметра отключает процесс рендеринга эффектов (чтобы освободить оперативную память). +`86` – без параметра отключает анимации Данро. + +Команды `86XX[SSS]` управляют только панелью Данро и не меняют direct-объекты других аппаратов. + +###### Тесты панели Данро `8625TVVV` + +При запуске теста обычные анимации Данро останавливаются, и панель переходит в тестовый режим. + +| Команда | Назначение | +| ---------- | ---------------------------------------------------------- | +| `86250` | Стоп теста, очистить тестовый режим | +| `86251` | Общий тест подсветки Данро: бегущая змейка, цвета меняются | +| `86252NN` | Тест строки панели Данро, `NN` - номер строки | +| `86253NN` | Тест столбца панели Данро, `NN` - номер столбца | +| `86254NNN` | Тест адресного элемента `NNN` | + +***Примеры:*** +- `86251` - змейка Данро +- `8625212` - строка `12` Данро +- `862533` - столбец `3` Данро +- `86254105` - адресный элемент `105` ###### Список эффектов | Команда (`XX`) | Название эффекта | | :------------: | :----------------------: | +| 00 | Autoplay OFF, очистить экран | +| 01 | Autoplay ON | +| 25 | Тесты подсветки панели | | 40 | Горизонтальная волна | | 41 | Вертикальная волна | | 42 | Диагональная волна | @@ -183,51 +515,68 @@ by: Паша Николаевич | 51 | Морская волна | | 52 | Диагональная волна 3 | -## Список команд +##### Отдельный раздел для RZ -| Команда | Назначение, примеры, ответы | -| ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 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 по индексу выход | -| 30X | Хоппер 1.
`301` - Включить мотор хоппера
`300` - Выключить мотор хоппера
`309` - Выдать приз (в авторежиме[^1]) | -| 40X | Хоппер 2.
Аналогично | -| 8XY | Выбор программы адресных диодов Y по каналу X (См. [[#Программы адресных диодов]]) | -| 85XXYY | См. [[#Специфичные программы]] | -| 85 | Без параметра отключает процесс рендеринга эффектов (чтобы освободить оперативную память) | -| 89\[X\] | Переключить цветовое чередование.
***Примеры:***
- `89` или `890` – RGB
- `891` – RBG
- `892` – BRG
- `893` – BGR
- `894` - GRB
- `895` - 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` (число коинов, нестираемо) | -| 96 | Cохранение в памяти платы пользовательского значения.
***Например,*** «роли» контроллера (левый-правый в морском бое, или шкаф…)
***Пример команды:*** `96right` | -| 97 | Вывод пользовательского значения
***Формат вывода:*** `ROLE : <значение>` (до 20 символов) | -| 98 | Запрос загруженности ядер, оперативки, свободного места в памяти | -| 99 | Запрос статуса | +`87XX[SSS]` - резервная виртуальная панель. Формат и эффекты совпадают с `86`. -[^1]: Авторежим: если датчик в закрытом состоянии - на полсекунды включить мотор, ждать сработки датчика либо таймаута. Если таймаут - выдать сообщение "HOPPER1 ERROR" и наглухо повесить процесс хоппера до перезагрузки. Иначе - сообщение "HOPPER1 OK" +Команды `87XX[SSS]` управляют только резервной панелью RZ и не меняют direct-объекты других аппаратов. + +###### Тесты панели RZ `8725TVVV` + +При запуске теста обычные анимации RZ останавливаются, и панель переходит в тестовый режим. + +| Команда | Назначение | +|---|---| +| `87250` | Стоп теста, очистить тестовый режим | +| `87251` | Общий тест подсветки RZ: бегущая змейка, цвета меняются | +| `87252NN` | Тест строки панели RZ, `NN` - номер строки | +| `87253NN` | Тест столбца панели RZ, `NN` - номер столбца | +| `87254NNN` | Тест адресного элемента `NNN` | + +***Примеры:*** +- `8701` - включить автоперебор резервной панели +- `8743` - rainbow с длительностью по умолчанию +- `872533` - тест столбца `3` +- `87254105` - адресный элемент `105` +- `87` - остановить анимации + +##### Дополнительные цифровые GPIO + +`50CCP`: +- `CC` – подкоманда; +- `P` – числовой параметр. + +| Формат | Назначение | +| :----: | :--------- | +| `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`. -# Обновление - Для обновления платы на новую версию прошивки надо: 1. Волшебным образом заполучить флешку с новой прошивкой 2. Проверить, что прошивка на плате точно старше при помощи команды `05` 3. Выбрать файл новой прошивки с флешки -4. Вполнить появившуюся команду -5. После успешного выполнения команды, проверить состояние SPIFFS +4. Выполнить появившуюся команду +5. После успешного выполнения команды, проверить состояние файла обновления 6. При наличии выделенного места, обновить прошивку при помощи команды `04`, дождаться завершения обновления 7. Проверить, что прошивка на плату встала при помощи команды `05` 8. ... -9. PROFIT! \ No newline at end of file +9. PROFIT!