using System; using System.Collections.Generic; using System.Linq; namespace MesWork { /// /// 扫码枪管理器 — 管理最多2把扫码枪的生命周期和事件分发 /// public static class BarcodeManager { /// /// 扫码枪实例字典,key = opName /// public static Dictionary Scanners { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); /// /// 是否启用扫码枪功能 /// public static bool IsEnabled => MesWorkForm.IsUseBarcode == 1; /// /// 扫码事件回调(由外部设置,通常指向 MIS_Funtion 的处理方法) /// public static Action OnBarcodeScanned; /// /// 初始化扫码枪(读取配置并创建实例) /// public static void Init() { if (!IsEnabled) return; int baudRate = MesWorkForm.BarcodeBaudRate; InitScanner(MesWorkForm.Station1OpName, MesWorkForm.Station1BarCOM, baudRate); InitScanner(MesWorkForm.Station2OpName, MesWorkForm.Station2BarCOM, baudRate); } private static void InitScanner(string opName, string comPort, int baudRate) { opName = opName?.Trim(); comPort = comPort?.Trim(); if (string.IsNullOrEmpty(opName) || string.IsNullOrEmpty(comPort)) { return; } var scanner = new BarcodeScanner(opName, baudRate); scanner.BarcodeReceived += HandleBarcodeReceived; scanner.Log += HandleLog; Scanners[opName] = scanner; scanner.Connect(comPort); } /// /// 统一扫码事件处理 /// private static void HandleBarcodeReceived(string opName, string barcode) { OnBarcodeScanned?.Invoke(opName, barcode); } /// /// 扫码枪日志 → 系统日志 + 称重页面 /// private static void HandleLog(string message) { MesWorkForm.WriteLog_Info("BarcodeScanner", message); MesWorkForm.WeighingPage?.AppendLog(message); } /// /// 手动发送条码(模拟扫码触发) /// public static void ManualSend(string opName, string barcode) { // 直接走事件回调,和自动扫码一样的路径 if (!string.IsNullOrWhiteSpace(barcode)) HandleBarcodeReceived(opName, barcode.Trim()); } /// /// 释放所有扫码枪 /// public static void Shutdown() { foreach (var scanner in Scanners.Values) { try { scanner.Dispose(); } catch { } } Scanners.Clear(); } /// /// 获取所有可用COM口 /// public static string[] GetAvailablePorts() { try { return System.IO.Ports.SerialPort.GetPortNames(); } catch { return new string[0]; } } } }