food-market/docs/pos-scale-2026-10-11/REPORT.md
nns 8371ef6683
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
docs(pos): фикс автопоиска весов (Bluetooth) проверен на Win11 + --autofind
- 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>
2026-10-11 09:09:37 +05:00

138 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Касса 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` — сводка со скриншотами.