food-market/src/food-market.pos.hwcheck/Program.cs
nns ff1580d162 feat(pos): отдельная программа «ALL MARKET — Проверка оборудования» (без входа/сервера/БД)
Приоритет владельца: sysadmin проверяет весы/принтер/сканер на ноутбуке магазина
без входа в кассу. Отдельный exe (food-market.pos.hwcheck), ссылается ТОЛЬКО на
pos.core ради Hardware/* — не умеет быть кассой (нет логина, сервера, БД, токенов,
сетевых запросов).

- pos.core/Hardware/HardwareProbe.cs: детект COM-портов (занят/свободен, VID/PID,
  описание) и принтеров Windows (имя/порт/в сети/число заданий) — только чтение,
  очередь не трогаем. WMI под OperatingSystem.IsWindows(); на Linux — базовый COM.
- pos.core/Hardware/BarcodeScan.cs: контрольная цифра EAN-13/EAN-8 и оценка
  «сканер vs ручной набор» по среднему интервалу между символами (чистая логика).
- food-market.pos.hwcheck: окно на Avalonia (код, без XAML), светлая тема, русский.
  Весы (Найти/Прочитать/Запустить-Остановить, live-вес ~350 мс, сырой hex, ручной
  выбор порта/скорости/протокола), COM-порты с пометкой «занят», принтеры (только
  чтение), сканер (EAN + тип ввода), «Сохранить/Копировать отчёт». Тестовая печать
  ВЫКЛ по умолчанию, включается только --allow-test-print.
- tests: EAN контрольная цифра (13/8, валид/битый) + классификация ввода. 50/50.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-11 08:37:55 +05:00

29 lines
1.1 KiB
C#
Raw 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.

using Avalonia;
namespace foodmarket.Pos.HwCheck;
internal static class Program
{
/// <summary>Тестовая печать разрешена ТОЛЬКО при запуске с --allow-test-print
/// (ключ даёт владелец). Без него кнопка «Тестовая печать» выключена и на принтер
/// ничего не отправляется.</summary>
public static bool AllowTestPrint { get; private set; }
[STAThread]
public static int Main(string[] args)
{
AllowTestPrint = args.Contains("--allow-test-print");
BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
return 0;
}
public static AppBuilder BuildAvaloniaApp()
{
var b = AppBuilder.Configure<App>().UsePlatformDetect();
// На headless/VM без GPU — ПО-рендеринг, чтобы окно не было чёрным.
if (OperatingSystem.IsWindows())
b = b.With(new Win32PlatformOptions { RenderingMode = new[] { Win32RenderingMode.Software } });
return b.WithInterFont().LogToTrace();
}
}