- HwCheck: флаг --autofind (автопоиск при старте — для скриншотов/проверки). - docs/pos-scale-2026-10-11: добавлен скриншот автопоиска на VM (COM1 в журнале, без зависания), отчёт обновлён — новый zip hardware-check и его SHA256; полная проверка с эмулятором/зависшим виртуальным портом ждёт com0com (решение владельца). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
138 lines
12 KiB
Markdown
138 lines
12 KiB
Markdown
# Касса 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-байта (сейчас они логируются, но не
|
||
интерпретируются).
|
||
|
||
## Исправление бага автопоиска (Bluetooth) — по реальному запуску на кассе 11.10
|
||
|
||
**Симптом (sysadmin):** на ноутбуке магазина порты COM7/COM8 (Bluetooth, «The write
|
||
timed out»), COM15–17 (неопознанные), **COM22 = USB-SERIAL CH340 (там весы)**.
|
||
«Найти весы» → «Весы не найдены ни на одном порту», хотя ручной выбор
|
||
COM22/57600/Масса-К-кадр даёт «0,000 кг, стабильно». Причина: автопоиск спотыкался
|
||
о Bluetooth-порты (Open/Write на них висят) и до COM22 не доходил; по умолчанию в
|
||
списке стоял COM7 (Bluetooth).
|
||
|
||
**Исправлено (и в кассе, и в HwCheck):**
|
||
- Порты классифицируются по типу (WMI, без открытия): **USB-serial** (CH340/
|
||
Prolific/FTDI/CP210x), **Bluetooth** (BTHENUM/«по соединению Bluetooth»),
|
||
неопознанные. Порядок автопоиска: **USB-serial → неопознанные → Bluetooth**.
|
||
- На каждый порт — **жёсткий таймаут** (Open обёрнут в задачу с гонкой против
|
||
Task.Delay; при зависании транспорт принудительно закрывается). Порты
|
||
перебираются **параллельно (до 4)**, общий бюджет ~15 с. Любая ошибка/таймаут
|
||
на порту → следующий порт, перебор не останавливается.
|
||
- **Лог по каждому порту** в окне: «COM22 (USB-SERIAL CH340): ENQ→ACK, вес 0.000 кг»,
|
||
«COM7: пропущен Bluetooth-порт», «COM15: нет ответа». Листинг портов тоже не
|
||
открывает Bluetooth (помечает «не опрашивается»). По умолчанию выбирается
|
||
НЕ Bluetooth-порт.
|
||
- Из zip hardware-check **убран ярлык «(с тестовой печатью).bat»** (печать — только
|
||
отдельно, по слову владельца).
|
||
- Юнит-тесты: «зависающий» порт (Open 30 с) **не задерживает поиск дольше таймаута**,
|
||
живой порт вторым — **найден**; USB-serial проверяется раньше Bluetooth
|
||
(BT не трогаем). Всего по оборудованию 53/53 зелёных.
|
||
|
||
**Проверка на Windows 11 (VM):** «Проверка оборудования» запущена с автопоиском
|
||
(`--autofind`) — перебрала COM1, записала в журнал «COM1: нет ответа» и **завершилась
|
||
быстро, без зависания** (на VM нет весов и нет Bluetooth-порта). См.
|
||
`vm-hwcheck-autofind.png`.
|
||
|
||
**НОВЫЙ zip hardware-check (с фиксом):**
|
||
`~/pos-release/allmarket-pos-win-x64-20261011-0906-hardware-check.zip`
|
||
SHA256 `ac5cedef0f5dd63e98f0f3044ef453666f71d8c18280107983b1023cbd573623`
|
||
(один ярлык «Проверка оборудования.bat», без ярлыка печати).
|
||
|
||
**Полная проверка с эмулятором весов + «зависающим» виртуальным портом (п. 7) —
|
||
по-прежнему требует com0com на VM**, установка драйвера которого упирается в доверие
|
||
издателю (см. выше) — ждёт решения владельца. Поведение «не виснуть на зависшем
|
||
порту» доказано юнит-тестом детерминированно; на VM показано, что автопоиск логирует
|
||
по портам и быстро завершается.
|
||
|
||
## Файлы
|
||
- `vm-hwcheck-launch.png` — окно «Проверка оборудования» на Windows 11.
|
||
- `vm-hwcheck-autofind.png` — автопоиск с журналом по портам (COM1), без зависания.
|
||
- `index.html` — сводка со скриншотами.
|