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]; }
}
}
}