/// <summary> /// Create a new emulator with the specified polling period /// </summary> /// <param name="pollingPeriod">Main loop period</param> /// <param name="token">Cancellation token</param> /// <param name="logger">Optional logger</param> public EmulationRunner(TimeSpan pollingPeriod, CancellationToken token, ILogger logger = null) { _emulator = new T(); _token = token; Config = new Rs232Config(_emulator) { Logger = logger, PollingPeriod = pollingPeriod }; }
/// <summary> /// 保存配置到配置文件 /// </summary> /// <param name="navConfig">导航仪配置</param> /// <param name="rs232Config">RS232COM口配置</param> /// <param name="plcConfig">PLC配置</param> /// <returns>保存成功返回True</returns> public static bool Save(NavConfig navConfig, Rs232Config rs232Config, PLCConfig plcConfig) { if (navConfig == null && rs232Config == null && plcConfig == null) { return(false); } try { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(configPath); if (navConfig != null) { XmlNode xmldocSelect = xmlDoc.SelectSingleNode("configs/Nav"); xmldocSelect.Attributes["ip"].InnerText = navConfig.Ip; xmldocSelect.Attributes["port"].InnerText = navConfig.Port.ToString(); } if (rs232Config != null) { XmlNode xmldocSelect = xmlDoc.SelectSingleNode("configs/Can"); xmldocSelect.Attributes["CanPortName"].InnerText = rs232Config.PortName; xmldocSelect.Attributes["BaudRate"].InnerText = rs232Config.BaudRate.ToString(); } if (plcConfig != null) { XmlNode xmldocSelect = xmlDoc.SelectSingleNode("configs/PLC"); xmldocSelect.Attributes["ip"].InnerText = plcConfig.Ip; xmldocSelect.Attributes["port"].InnerText = plcConfig.Port.ToString(); } xmlDoc.Save(@"Configs\AGVConfig.xml"); return(true); } catch (Exception ex) { Logger.Error("保存硬件配置文件失败.", ex); return(false); } }
/// <summary> /// Run a real bill validator /// </summary> /// <param name="logger">Logger attaches to validator</param> /// <param name="args">Program arguments</param> private static void RunValidator(ILogger logger, string[] args) { var portName = args.FirstOrDefault(); if (string.IsNullOrEmpty(portName)) { Console.WriteLine("Usage: rs232validator.cli.exe portName"); return; } var config = Rs232Config.UsbRs232Config(portName, logger); var validator = new ApexValidator(config); validator.OnLostConnection += (sender, eventArgs) => { config.Logger?.Error($"[APP] Lost connection to acceptor"); }; validator.OnBillInEscrow += (sender, i) => { // For USA this index represent $20. This example will always return a $20 // Alternatively you could set the Rs232Config mask to 0x5F to disable a 20. if (i == 5) { config.Logger.Info($"[APP] Issuing a return command for this {BillValues[i]}"); validator.Return(); } else { config.Logger.Info($"[APP] Issuing stack command for this {BillValues[i]}"); validator.Stack(); } }; validator.OnCreditIndexReported += (sender, i) => { config.Logger.Info($"[APP] Credit issued: {BillValues[i]}"); }; validator.OnStateChanged += (sender, state) => { config.Logger.Info($"[APP] State changed from {state.OldState} to {state.NewState}"); }; validator.OnEventReported += (sender, evt) => { config.Logger.Info($"[APP] Event(s) reported: {evt}"); }; validator.OnCashBoxRemoved += (sender, eventArgs) => { config.Logger.Info("[APP] Cash box removed"); }; validator.OnCashBoxAttached += (sender, eventArgs) => { config.Logger.Info("[APP] Cash box attached"); }; if (!validator.StartPollingLoop()) { config.Logger.Error("[APP] Failed to start RS232 main loop"); return; } config.Logger.Info("[APP] Validator is now running. CTRL+C to Exit"); while (true) { Thread.Sleep(TimeSpan.FromMilliseconds(100)); if (!validator.IsUnresponsive) { continue; } config.Logger?.Error("[APP] validator failed to start. Quitting now"); validator.StopPollingLoop(); break; } }
private static void Main(string[] args) { var portName = args.FirstOrDefault(); if (string.IsNullOrEmpty(portName)) { Console.WriteLine("Usage: app portName"); return; } var logger = new ConsoleLogger { Level = 3 }; var config = Rs232Config.UsbRs232Config(portName, logger); var validator = new ApexValidator(config); validator.OnLostConnection += (sender, eventArgs) => { config.Logger?.Error($"[APP] Lost connection to acceptor"); }; validator.OnCreditIndexReported += (sender, i) => { config.Logger.Info($"[APP] Credit issued: {BillValues[i]}"); }; validator.OnStateChanged += (sender, state) => { config.Logger.Info($"[APP] State changed from {state.OldState} to {state.NewState}"); }; validator.OnEventReported += (sender, evt) => { config.Logger.Info($"[APP] Event(s) reported: {evt}"); }; validator.OnCashBoxRemoved += (sender, eventArgs) => { config.Logger.Info("[APP] Cash box removed"); }; validator.OnCashBoxAttached += (sender, eventArgs) => { config.Logger.Info("[APP] Cash box attached"); }; if (!validator.StartPollingLoop()) { config.Logger.Error("[APP] Failed to start RS232 main loop"); return; } config.Logger.Info("[APP] Validator is now running. CTRL+C to Exit"); while (true) { Thread.Sleep(TimeSpan.FromMilliseconds(100)); if (!validator.IsUnresponsive) { continue; } config.Logger?.Error("[APP] validator failed to start. Quitting now"); validator.StopPollingLoop(); break; } }