# HG changeset patch
# User sl
# Date 1415446805 -3600
# Node ID ff7a8955f82dff6317028d0ff305c9d0997a3a93
# Parent  2ff6dbe0d356d50f6554b012434c0c553ffeb9df
Now supporting some HID consumer codes.
Architecture to support multiple Usage Page.
diff -r 2ff6dbe0d356 -r ff7a8955f82d RemoteControlDevice.cs
--- a/RemoteControlDevice.cs	Sat Nov 08 12:01:19 2014 +0100
+++ b/RemoteControlDevice.cs	Sat Nov 08 12:40:05 2014 +0100
@@ -54,7 +54,8 @@
 		RecordedTV,
 		Guide,
 		LiveTV,
-		Details,
+		MoreInfo,
+        Print,
 		DVDMenu,
 		DVDAngle,
 		DVDAudio,
@@ -155,6 +156,9 @@
 		public delegate void RemoteControlDeviceEventHandler(object sender, RemoteControlEventArgs e);
 		public event RemoteControlDeviceEventHandler ButtonPressed;
 
+        public delegate void HidUsageHandler(ushort aUsage);
+        
+
 
 		//-------------------------------------------------------------
 		// constructors
@@ -196,7 +200,7 @@
 
 		public void ProcessMessage(Message message)
 		{
-			int param;
+		int param;
 
 			switch (message.Msg)
 			{
@@ -341,6 +345,71 @@
 				this.ButtonPressed(this, new RemoteControlEventArgs(rcb, GetDevice(param)));
 		}
 
+        /// 
+        /// 
+        /// 
+        /// 
+        private void HidConsumerDeviceHandler(ushort aUsage)
+        {
+            if (aUsage == 0)
+            {
+                //Just skip those
+                return;
+            }
+
+            if (Enum.IsDefined(typeof(ConsumerControl), aUsage) && aUsage != 0) //Our button is a known consumer control
+            {
+                if (this.ButtonPressed != null)
+                {
+                    RemoteControlButton button=RemoteControlButton.Unknown;
+                    if (aUsage== (ushort)ConsumerControl.AppCtrlProperties)
+                    {
+                        button = RemoteControlButton.MoreInfo;
+                    }
+                    else if (aUsage==(ushort)ConsumerControl.AppCtrlPrint)
+                    {
+                        button = RemoteControlButton.Print;
+                    }
+                    else if (aUsage==(ushort)ConsumerControl.MediaSelectProgramGuide)
+                    {
+                        button = RemoteControlButton.Guide;
+                    }
+                    this.ButtonPressed(this, new RemoteControlEventArgs(button, InputDevice.OEM));
+                }
+            }
+            else
+            {
+                Debug.WriteLine("Unknown Consumer Control!");
+            }
+        }
+
+        /// 
+        /// 
+        /// 
+        /// 
+        private void HidMceRemoteHandler(ushort aUsage)
+        {
+            if (aUsage == 0)
+            {
+                //Just skip those
+                return;
+            }
+
+
+            if (Enum.IsDefined(typeof(MceButton), aUsage) && aUsage != 0) //Our button is a known MCE button
+            {
+                if (this.ButtonPressed != null)
+                {
+                    this.ButtonPressed(this, new RemoteControlEventArgs((MceButton)aUsage, InputDevice.OEM));
+                }
+            }
+            else
+            {
+                Debug.WriteLine("Unknown MCE button!");
+            }
+
+        }
+
 
 		private void ProcessInputCommand(ref Message message)
 		{
@@ -373,9 +442,20 @@
                     //Get Usage Page and Usage
                     Debug.WriteLine("Usage Page: 0x" + deviceInfo.hid.usUsagePage.ToString("X4") + " Usage: 0x" + deviceInfo.hid.usUsage.ToString("X4"));
 
+                    //
+                    HidUsageHandler handler=null;
+
                     //Make sure both usage page and usage are matching MCE remote
                     //TODO: handle more that just MCE usage page.
-                    if (deviceInfo.hid.usUsagePage != (ushort)Hid.UsagePage.MceRemote || deviceInfo.hid.usUsage != (ushort)Hid.UsageId.MceRemoteUsage)
+                    if (deviceInfo.hid.usUsagePage == (ushort)Hid.UsagePage.MceRemote || deviceInfo.hid.usUsage == (ushort)Hid.UsageId.MceRemoteUsage)
+                    {                        
+                        handler = HidMceRemoteHandler;
+                    }
+                    else if (deviceInfo.hid.usUsagePage == (ushort)Hid.UsagePage.Consumer || deviceInfo.hid.usUsage == (ushort)Hid.UsageId.ConsumerControl)
+                    {
+                        handler = HidConsumerDeviceHandler;
+                    }
+                    else
                     {
                         Debug.WriteLine("Not MCE remote page and usage.");
                         return;
@@ -424,17 +504,11 @@
                         else if (hidInput.Length > 2) //Defensive
                         {
                             //Assuming double bytes code
-                            usage = (ushort)((hidInput[1] << 2) + hidInput[2]);
+                            usage = (ushort)((hidInput[2] << 8) + hidInput[1]);
                         }
 
                         //
-                        if (Enum.IsDefined(typeof(MceButton), usage) && usage != 0) //Our button is a known MCE button
-                        {
-                            if (this.ButtonPressed != null) //What's that?
-                            {
-                                this.ButtonPressed(this, new RemoteControlEventArgs((MceButton)usage, InputDevice.OEM));
-                            }
-                        }
+                        handler(usage);
                     }
 
                 }