using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BirdyFlash.Lib { public class DeviceFinder { public delegate void OnPortDataUpdated(object sender, EventArgs e); public event OnPortDataUpdated PortDataUpdated; public List registeredPorts; Dictionary enabledPorts; public DeviceFinder() { this.registeredPorts = new List(); this.enabledPorts = new Dictionary(); // string[] portsToReRegister = Properties.Settings.Default.registeredPorts.Split('\n'); foreach (string registerPort in portsToReRegister) if (registerPort.Contains("://")) this.RegisterNewPort(registerPort); string[] enabledPortsLoaded = Properties.Settings.Default.enabledPorts.Split('\n'); List ports = System.IO.Ports.SerialPort.GetPortNames().ToList().Select(s => s.ToLower()).ToList(); foreach (string enablePort in enabledPortsLoaded) if (enablePort.Contains("://") && !(enablePort.StartsWith("serial://") && ports.IndexOf(new Uri(enablePort).Host) == -1)) this.EnablePort(enablePort); /*foreach (string enablePort in enabledPortsLoaded) if (enablePort.Contains("://")) Console.WriteLine("{0} {1} {2}", enablePort, enablePort.StartsWith("serial://"), ports.IndexOf(new Uri(enablePort).Host));*/ } private static DeviceFinder _instance; public static DeviceFinder instance { get { if (_instance == null) _instance = new DeviceFinder(); return _instance; } } public void ScanPagers() { Task.WaitAll( this.enabledPorts.Keys.ToList() .Select(portName => { return Task.Run(() => TryDetectPager(portName)); }) .ToArray() ); this.PortDataUpdated(this, new EventArgs()); } public List GetAvailablePagers() { /*foreach(var commPortInfo in this.ports.Values) Console.WriteLine("{0} {1} {2} {3} {4}", commPortInfo.port.ToString(), commPortInfo.unkown, commPortInfo.success, commPortInfo.deviceInfo.model, commPortInfo.deviceInfo.deviceSerial);*/ return this.enabledPorts.Values.ToList().Where(x => x.success).ToList(); } private async Task TryDetectPager(string portName) { if (!this.enabledPorts.ContainsKey(portName)) return false; CommPortInfo commPortInfo = this.enabledPorts[portName]; commPortInfo.success = false; commPortInfo.unkown = true; this.enabledPorts[portName] = commPortInfo; // using (var comm = new BirdyComm()) { comm.SetPort(commPortInfo.port); //if (comm.commPort is CommPortSerial) ((CommPortSerial)comm.commPort).ResetReOpen(); DeviceInfo deviceInfo; try { deviceInfo = await comm.TryGetDeviceInfo(); } catch (TimeoutException te) { Console.WriteLine(te.Message); try { deviceInfo = await comm.TryGetDeviceInfo(); } catch (TimeoutException te2) { Console.WriteLine(te2.Message); try { deviceInfo = await comm.TryGetDeviceInfo(); } catch (TimeoutException te3) { Console.WriteLine(te3.Message); await comm.ForceGotoProg(); try { deviceInfo = await comm.TryGetDeviceInfo(); } catch (TimeoutException te4) { Console.WriteLine(te4.Message); try { deviceInfo = await comm.TryGetDeviceInfo(); } catch (TimeoutException te5) { return false; } } } } } if (deviceInfo.deviceSerial != null) { var data = await comm.TryGetDeviceInfo(); Console.WriteLine(deviceInfo.deviceSerial); /*this.Invoke(new Action(() => { txtLog.AppendText(string.Format("{0} type {1} serial {2}\n", portName, data.model, data.deviceSerial)); }));*/ commPortInfo.deviceInfo = deviceInfo; commPortInfo.success = true; commPortInfo.unkown = false; this.enabledPorts[portName] = commPortInfo; return true; } else { /*this.Invoke(new Action(() => { txtLog.AppendText(string.Format("{0} timeout\n", portName)); }));*/ commPortInfo.success = false; commPortInfo.unkown = false; this.enabledPorts[portName] = commPortInfo; return false; } } return false; } internal void SetPortOption(string port, string option) { var portURI = new Uri(port); string strippedURI = portURI.Scheme + "://" + portURI.Host + "/"; if (this.enabledPorts.ContainsKey(port)) this.enabledPorts.Remove(port); Properties.Settings.Default.enabledPorts = string.Join("\n", this.enabledPorts.Keys); Properties.Settings.Default.Save(); if (this.PortDataUpdated != null) this.PortDataUpdated(this, new EventArgs()); } public void RescanLocalSerialPorts() { List ports = System.IO.Ports.SerialPort.GetPortNames().ToList().Select(s => s.ToLower()).ToList(); foreach (string portName in this.registeredPorts.ToList()) if (new Uri(portName).Scheme == "serial" && ports.IndexOf(portName.Substring(9)) == -1) { this.registeredPorts.Remove(portName); if (this.enabledPorts.ContainsKey(portName)) this.enabledPorts.Remove(portName); } foreach (string portName in ports) if (this.registeredPorts.Where(x => x.StartsWith("serial://" + portName + "/")).Count() == 0) this.registeredPorts.Add("serial://" + portName); if (this.PortDataUpdated != null) this.PortDataUpdated(this, new EventArgs()); } public void RegisterNewPort(string port) { if (registeredPorts.Contains(port)) return; registeredPorts.Add(port); Properties.Settings.Default.registeredPorts = string.Join("\n", this.registeredPorts); Properties.Settings.Default.Save(); if (this.PortDataUpdated != null) this.PortDataUpdated(this, new EventArgs()); } public void EnablePort(string port) { if (!this.enabledPorts.ContainsKey(port)) this.enabledPorts.Add(port, new CommPortInfo { unkown = true, port = CommPort.From(port), }); Properties.Settings.Default.enabledPorts = string.Join("\n", this.enabledPorts.Keys); Properties.Settings.Default.Save(); if (this.PortDataUpdated != null) this.PortDataUpdated(this, new EventArgs()); } public void DisablePort(string port) { if (this.enabledPorts.ContainsKey(port)) this.enabledPorts.Remove(port); Properties.Settings.Default.enabledPorts = string.Join("\n", this.enabledPorts.Keys); Properties.Settings.Default.Save(); if (this.PortDataUpdated != null) this.PortDataUpdated(this, new EventArgs()); } public bool IsPortEnabled(string port) { return this.enabledPorts.ContainsKey(port); } } }