using System; using System.Collections.Generic; using System.Linq; namespace MesWork { /// /// 扫码枪管理器 — 管理最多2把扫码枪的生命周期和事件分发 /// public static class BarcodeManager { /// /// 扫码枪实例字典,key = opName(OP10/OP20) /// 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; // OP10 string op10Com = MesWorkForm.OP10BarCOM?.Trim(); if (!string.IsNullOrEmpty(op10Com)) { var scanner = new BarcodeScanner("OP10", baudRate); scanner.BarcodeReceived += HandleBarcodeReceived; scanner.Log += HandleLog; Scanners["OP10"] = scanner; scanner.Connect(op10Com); } // OP20 string op20Com = MesWorkForm.OP20BarCOM?.Trim(); if (!string.IsNullOrEmpty(op20Com)) { var scanner = new BarcodeScanner("OP20", baudRate); scanner.BarcodeReceived += HandleBarcodeReceived; scanner.Log += HandleLog; Scanners["OP20"] = scanner; scanner.Connect(op20Com); } } /// /// 统一扫码事件处理 /// 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]; } } } }