using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using DTS.Common.DASResource; using DTS.Common.Utilities.Logging; using DTS.Common.WINUSBConnection; namespace DTS.DASLib.DASFactory { internal class CDCUSBHandling : WindowsNotification { /// /// Timeout in milliseconds to connect an CDCUSB device /// public int ConnectCDCUSBTimeout { get; set; } private IDeviceSetup deviceHandler { get; set; } public CDCUSBHandling(DASFactory _factory, UpdateFinishedEventHandler _SerialUpdateFinished, IDeviceSetup _deviceHandler, BlockingCollection> queueActionPerDevice) : base(_factory, _SerialUpdateFinished, _deviceHandler.GetGuid(), queueActionPerDevice) { deviceHandler = _deviceHandler; ConnectCDCUSBTimeout = 60000; // 1000 ms } #region CDCUSB WinProc's /// /// This gets called whenever a CDCUSB devices connects /// /// The windows message protected override void NotificationDeviceArrived(ref Message m) { try { // \\?\hid#vid_1cb9&pid_0002#6&29dd55fe&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030} APILogger.LogString("CDCUSBArrived: A device has been connected"); EnqueueConnect(); } catch (Exception ex) { APILogger.Log("MessageBox", Strings.DASFactory_CDCUSBArrivedFailed, ex); } finally { APILogger.LogString("CDCUSBArrived: Exit"); } } /// /// This gets called whenever a CDCUSB devices disconnectes /// /// The windows message protected override void NotificationDeviceRemoved(ref Message m) { try { APILogger.LogString("CDCUSBRemoved: A device has been disconnected"); EnqueueDisconnect(); } catch (Exception ex) { APILogger.Log("MessageBox", Strings.DASFactory_CDCUSBRemovedFailed, ex); } finally { APILogger.LogString("CDCUSBRemoved: Exit"); } } #endregion #region Connect /// /// Throw an exception if currently connected CDCUSB devices contains duplicate dev paths. /// private void CheckForConnectedCDCUSBDups() { // get a list of units currently connected thru CDCUSB var ConnectedCDCUSBDevices = GetListOfConnectedDevices(); if (ConnectedCDCUSBDevices.Count != ConnectedCDCUSBDevices.Distinct().Count()) { var dupList = new StringBuilder(); foreach (var s in ConnectedCDCUSBDevices) { dupList.AppendLine(s); } var msg = "CheckForConnectedCDCUSBDups: Connected CDCUSB contain duplicates" + Environment.NewLine + dupList; APILogger.LogString(msg); throw new Exception("CheckForConnectedCDCUSBDups: Connected CDCUSB contain duplicates"); } } private List GetListOfConnectedDevices() { var newNames = new List(); var AllCDCUSBDevicePathNames = new string[128]; try { // Fill an array with the device path names of all attached HIDs. if (!MyDeviceManagement.FindDeviceFromGuid(deviceHandler.GetGuid(), ref AllCDCUSBDevicePathNames)) { return newNames; } } catch { return newNames; } // loop thru the array and copy the new ones (that actually contain something) // over to the list newNames foreach (var t in AllCDCUSBDevicePathNames) { var devPath = t; if (string.IsNullOrEmpty(t)) continue; var bValid = false; for (var curKey = 0; curKey < CDCUSBConnection.RegKeys.Count && !bValid; curKey++) { var regKey = CDCUSBConnection.RegKeys[curKey]; if (devPath.Contains(regKey.ToLower())) { bValid = true; } } if (!bValid) { continue; } // protect against windows giving us more than one of the same if (newNames.Find(str => str.Equals(devPath, StringComparison.OrdinalIgnoreCase)) == null) { // no, we haven't added it yet so do it now newNames.Add(devPath); } } return newNames; } public override void UpdateConnectedDevices() { ConnectNewDevices(delegate { // make sure the connected ones are OK CheckForConnectedCDCUSBDups(); // get a list of units currently connected thru CDCUSB return GetListOfConnectedDevices(); }, GetConnectedStrings, () => deviceHandler.GetICommunication(), comm => deviceHandler.GetIConnectedDevice(comm), deviceHandler.GetDASType(), deviceHandler, ConnectCDCUSBTimeout); } #endregion #region Disconnect public override void UpdateDisconnectedDevices() { DisconnectRemovedDevices(GetListOfConnectedDevices, dev => deviceHandler.IsCorrectType(dev), dev => deviceHandler.GetICommunication(dev), deviceHandler.GetDASType(), ConnectCDCUSBTimeout); } #endregion public override void UpdateDeviceSetups() { deviceHandler.SetHandler(this); } } }