diff --git a/docs/pos-scale-2026-10-11/REPORT.md b/docs/pos-scale-2026-10-11/REPORT.md new file mode 100644 index 0000000..04260cd --- /dev/null +++ b/docs/pos-scale-2026-10-11/REPORT.md @@ -0,0 +1,93 @@ +# Касса ALL MARKET — реальный протокол весов Масса-К (11.10.2026) + +Отчёт по задаче: заменить угаданный протокол весов на реальный (по замеру с +ноутбука магазина) и сделать отдельную программу «Проверка оборудования» для +sysadmin без входа в кассу. + +## Что сделано + +### Приоритет 0 — «ALL MARKET — Проверка оборудования» (без входа/сервера/БД) +Отдельная программа `food-market.pos.hwcheck` (новый exe), ссылается ТОЛЬКО на +`pos.core` ради модулей оборудования. **Не умеет быть кассой**: нет экрана входа, +нет подключения к серверу, нет работы с БД продаж/каталога, нет токенов и сетевых +запросов. Обычная касса с входом в zip для sysadmin НЕ входит. + +Окно (Avalonia, светлая тема, русский): весы (ручной выбор порта/скорости/протокола, +«Найти весы», «Прочитать вес сейчас», «Запустить/Остановить» с live-весом ~350 мс, +сырой hex кадра), COM-порты с пометкой «занят другой программой», принтеры Windows +(только чтение — очередь не трогаем, число заданий), сканер (контрольная цифра +EAN-13/EAN-8 + отличие сканера от ручного набора по интервалу), «Сохранить/ +Копировать отчёт». **Тестовая печать ВЫКЛ по умолчанию**, включается только +запуском с `--allow-test-print` (ключ даёт владелец) — в zip два ярлыка. + +Запущена и проверена на реальной Windows 11 (VM 192.168.1.231) — см. +`vm-hwcheck-launch.png`: окно отрисовано, определены порт **COM1** и принтер +«Microsoft Print to PDF», кнопка «Тестовая печать» неактивна, поле сканера активно. + +### Реальный протокол весов (пп. 1–6) +По фактическому замеру sysadmin (11.10, ноутбук магазина, при закрытой кассе +МойСклад): весы Масса-К (USB-COM CH340) отвечают **только на 57600 8N1**; +рукопожатие **ENQ(0x05)→ACK(0x06)**; запрос веса **DC1(0x11)** → кадр +**SOH STX «флаг вес единица» CTRL ETX EOT** (например +`01 02 'S 0.000kg' 'q'(0x71) 03 04`). + +- `pos.core/Hardware/SerialScale.cs` — `ISerialTransport` (абстракция для тестов) + + `SystemSerialTransport` (8N1, DTR/RTS), `MassaK.ParseFrame/Handshake/ReadFrame/ + ReadWeight`. **Control-байт НЕ валидируем** (смысл не подтверждён) — только пишем + сырой hex (чтобы по кадрам с грузом уточнить). Единицы kg; «г/g» → /1000. +- `pos.core/Hardware/ScaleDiscovery.cs` — чтение + **стабильность по двум одинаковым + чтениям** (флаг весов не интерпретируем); автопоиск **57600 и Масса-К-кадр — + первыми**, общий бюджет ~12 с, занятые порты отмечаются отдельно → кассиру + «порт занят (закройте кассу МойСклад)», а не «весы не найдены». +- `pos` — `ComScale` стал тонким адаптером; настройки хранят `scale_proto` и по + умолчанию **MassaKFrame/57600**; если сохранённые весы не отвечают — автопоиск + молча + ручной выбор в настройках. `ProbeRunner (--probe-hw)` печатает сырой hex. +- Весовой товар на кассе (п. 6): вес берётся через `ScaleMonitor` (опрос по + требованию, мягкая деградация); нет связи → **ручной ввод веса остаётся** (как + сейчас), с понятным сообщением. Логика не менялась — уже была корректной. + +### Юнит-тесты (п. 5) — 50/50 зелёных +`tests/food-market.UnitTests/MassaKScaleTests.cs` на фейковом порту +(`FakeScaleTransport`): разбор **реального нулевого кадра** +`01 02 53 20 20 30 2E 30 30 30 6B 67 71 03 04`, вес 1.235 / 12.500 / отрицательный / +граммы, мусор до SOH, обрезанный кадр без ETX, мусор без SOH, рукопожатие с ACK и +без ACK, полный цикл, стабильность. `BarcodeScanTests.cs`: контрольная цифра +EAN-13/EAN-8 и классификация ввода. + +### Сборки (п. 7 + Приоритет 0) — в ~/pos-release/ +- **Проверка оборудования:** + `allmarket-pos-win-x64-20261011-0839-hardware-check.zip` + SHA256 `f4f5a53ffedc4c7e55452d6fad1c139848340e57232553d33f1ea7f8bc449623` + (внутри: `foodmarket.Pos.HwCheck.exe`, два ярлыка-bat, `README.txt`). +- **Диагностическая касса (с новым протоколом):** + `allmarket-pos-win-x64-20261011-0840-probe.zip` + SHA256 `67b9e72cdbc163ed9f93c49f2724e10740c1430d16a6c6d1f6954ef69a47c1f4`. + +Linux-сборку не ломали (System.IO.Ports/System.Management общие; WMI под +`OperatingSystem.IsWindows()`). pos.core/pos/hwcheck собираются, тесты зелёные. + +## Что проверено +- Протокол — **по фактическим байтам** (юнит-тесты, 50/50). +- Программа «Проверка оборудования» **запускается на реальной Windows 11**, + определяет COM-порт и принтер, отрисовывает русский интерфейс, тестовая печать + выключена (скриншот `vm-hwcheck-launch.png`). + +## Что НЕ проверено (нужен человек / решение владельца) +1. **Живое чтение веса через виртуальную пару COM на VM (п. 8) — НЕ выполнено.** + com0com — подписанный установщик `Setup_com0com_v3.0.0.0_W7_x64_signed.exe` + скачан и запущен (`/S`, exit 0), но **виртуальная пара COM10/COM11 не + зарегистрировалась**: на Win11 установка драйвера требует либо интерактивного + подтверждения доверия издателю (нельзя нажать по ssh), либо импорта сертификата + издателя в хранилище доверенных — это **ослабление доверия ОС**, я не стал делать + автономно. Нужно решение владельца: разрешить доверить сертификат издателя + com0com и установить драйвер на тест-VM (один раз), после чего я доведу + эмулятор весов + live-чтение + скриншоты. +2. **Реальные весы с грузом (гирей) в магазине — НЕ проверялись** (нет доступа к + железу; касса МойСклад и ноутбук магазина не трогали). Нужен человек с гирей: + положить груз, сверить вес и «стабильно», прислать сырые hex-кадры с грузом — + тогда уточним смысл флага и control-байта (сейчас они логируются, но не + интерпретируются). + +## Файлы +- `vm-hwcheck-launch.png` — окно «Проверка оборудования» на Windows 11. +- `index.html` — та же сводка со скриншотом. diff --git a/docs/pos-scale-2026-10-11/index.html b/docs/pos-scale-2026-10-11/index.html new file mode 100644 index 0000000..002768b --- /dev/null +++ b/docs/pos-scale-2026-10-11/index.html @@ -0,0 +1,30 @@ +
11.10.2026. Протокол весов заменён на реальный (по замеру с ноутбука магазина); +сделана отдельная программа диагностики оборудования без входа в кассу.
+ +01 02 53 20 20 30 2E 30 30 30 6B 67 71 03 04 → 0.000 кг, флаг 'S', control 0x71
+Подробности, SHA256 сборок и список «нужно решение владельца» — в REPORT.md.