Mercurial > hg > ucis.core
diff USBLib/Communication/WindowsUsbDeviceRegistry.cs @ 21:dcfec2be27c9
Added USBLib
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Mon, 15 Apr 2013 01:04:59 +0200 |
parents | |
children | 556b4fb511bd |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBLib/Communication/WindowsUsbDeviceRegistry.cs Mon Apr 15 01:04:59 2013 +0200 @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text.RegularExpressions; +using UCIS.HWLib.Windows.Devices; +using UCIS.USBLib.Internal.Windows; + +namespace UCIS.USBLib.Communication { + public abstract class WindowsUsbDeviceRegistry { + public DeviceNode DeviceNode { get; private set; } + + // Parsed out of the device ID + private bool mIsDeviceIDParsed; + private byte mInterfaceID; + private ushort mVid; + private ushort mPid; + private ushort mRevision; + + private IDictionary<string, object> mDeviceProperties; + + public String DevicePath { get; private set; } + public String DeviceID { get; private set; } + public String SymbolicName { get { return DevicePath; } } + + private static Regex RegHardwareID = null; + + protected WindowsUsbDeviceRegistry(DeviceNode device, String interfacepath) { + DeviceNode = device; + DeviceID = device.DeviceID; + DevicePath = interfacepath; + } + + public IDictionary<string, object> DeviceProperties { + get { + if (mDeviceProperties == null) mDeviceProperties = SetupApi.GetSPDRPProperties(DeviceNode); + return mDeviceProperties; + } + } + + private void parseDeviceID() { + if (mIsDeviceIDParsed) return; + if (RegHardwareID == null) { + RegexOptions OPTIONS = RegexOptions.CultureInvariant | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase; + string PATTERN = "(Vid_(?<Vid>[0-9A-F]{1,4}))|(Pid_(?<Pid>[0-9A-F]{1,4}))|(Rev_(?<Rev>[0-9]{1,4}))|(MI_(?<MI>[0-9A-F]{1,2}))"; + RegHardwareID = new Regex(PATTERN, OPTIONS); + } + String[] HardwareIDs = DeviceNode.GetPropertyStringArray(CMRDP.HARDWAREID); + String HardwareID = null; + if (HardwareIDs == null || HardwareIDs.Length < 1 || HardwareIDs[0].Length == 0) { + HardwareID = DeviceID; + } else { + HardwareID = HardwareIDs[0]; + } + foreach (Match match in RegHardwareID.Matches(HardwareID)) { + Group group = match.Groups["Vid"]; + if (group.Success) ushort.TryParse(group.Value, NumberStyles.HexNumber, null, out mVid); + group = match.Groups["Pid"]; + if (group.Success) ushort.TryParse(group.Value, NumberStyles.HexNumber, null, out mPid); + group = match.Groups["Rev"]; + if (group.Success) ushort.TryParse(group.Value, NumberStyles.Integer, null, out mRevision); + group = match.Groups["MI"]; + if (group.Success) Byte.TryParse(group.Value, NumberStyles.HexNumber, null, out mInterfaceID); + } + mIsDeviceIDParsed = true; + } + public int Vid { + get { + parseDeviceID(); + return mVid; + } + } + public int Pid { + get { + parseDeviceID(); + return mPid; + } + } + public byte InterfaceID { + get { + parseDeviceID(); + return (byte)mInterfaceID; + } + } + + public string Name { get { return DeviceNode.GetPropertyString(CMRDP.DEVICEDESC); } } + public string Manufacturer { get { return DeviceNode.GetPropertyString(CMRDP.MFG); } } + public string FullName { + get { + String desc = Name; + String mfg = Manufacturer; + if (mfg == null) return desc; + if (desc == null) return mfg; + return mfg + " - " + desc; + } + } + } +}