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

12 KiB
Raw Blame History

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