Server/Events/EventHid.cs
author StephaneLenclud
Sat, 20 Aug 2016 21:00:35 +0200
changeset 246 30a221eecc06
parent 244 2e4d2558bb21
child 247 afdbe76ab03b
permissions -rw-r--r--
Generic HID event with key recognition functional.
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Reflection;
     5 using System.Text;
     6 using System.Threading.Tasks;
     7 using System.Runtime.Serialization;
     8 using System.Windows.Forms;
     9 using Ear = SharpLib.Ear;
    10 using Hid = SharpLib.Hid;
    11 
    12 namespace SharpDisplayManager
    13 {
    14     [DataContract]
    15     [Ear.AttributeObject(Id = "Event.Hid", Name = "HID", Description = "Corresponding HID message received.")]
    16     public class EventHid: Ear.Event
    17     {
    18         public EventHid()
    19         {
    20         }
    21 
    22         [DataMember]
    23         public ushort UsagePage { get; set; }
    24 
    25         [DataMember]
    26         public ushort UsageCollection { get; set; }
    27 
    28         [DataMember]
    29         public ushort Usage { get; set; }
    30 
    31         [DataMember]
    32         public Keys Key { get; set; }
    33 
    34         [DataMember]
    35         [Ear.AttributeObjectProperty
    36             (
    37             Id = "HID.Keyboard.IsKeyUp",
    38             Name = "Key Up",
    39             Description = "Key up if set, key down otherwise."
    40             )]
    41         public bool IsKeyUp { get; set; } = false;
    42 
    43         [DataMember]
    44         public bool IsMouse { get; set; } = false;
    45 
    46         [DataMember]
    47         public bool IsKeyboard { get; set; } = false;
    48 
    49         [DataMember]
    50         public bool IsGeneric { get; set; } = false;
    51 
    52         [DataMember]
    53         public bool HasModifierShift { get; set; } = false;
    54 
    55         [DataMember]
    56         public bool HasModifierControl { get; set; } = false;
    57 
    58         [DataMember]
    59         public bool HasModifierAlt { get; set; } = false;
    60 
    61         [DataMember]
    62         public bool HasModifierWindows { get; set; } = false;
    63 
    64         [DataMember]
    65         public string PersistedBrief { get; set; } = "Press a key";
    66 
    67 
    68 
    69         protected override void DoConstruct()
    70         {
    71             base.DoConstruct();
    72             UpdateDynamicProperties();
    73         }
    74 
    75         private void UpdateDynamicProperties()
    76         {
    77             
    78         }
    79 
    80         /// <summary>
    81         /// Make sure we distinguish between various configuration of this event 
    82         /// </summary>
    83         /// <returns></returns>
    84         public override string Brief()
    85         {
    86             string brief = Name + ": ";
    87 
    88             if (IsKeyboard)
    89             {
    90                 brief += Key.ToString();
    91 
    92                 if (HasModifierAlt)
    93                 {
    94                     brief += " + ALT";
    95                 }
    96 
    97                 if (HasModifierControl)
    98                 {
    99                     brief += " + CTRL";
   100                 }
   101 
   102                 if (HasModifierShift)
   103                 {
   104                     brief += " + SHIFT";
   105                 }
   106 
   107                 if (HasModifierWindows)
   108                 {
   109                     brief += " + WIN";
   110                 }
   111             }
   112             else if (IsGeneric)
   113             {
   114                 brief += PersistedBrief;
   115             }
   116 
   117             if (IsKeyUp)
   118             {
   119                 brief += " (UP)";
   120             }
   121             else
   122             {
   123                 brief += " (DOWN)";
   124             }
   125 
   126             return brief;
   127         }
   128 
   129         /// <summary>
   130         ///
   131         /// </summary>
   132         /// <param name="obj"></param>
   133         /// <returns></returns>
   134         public override bool Equals(object obj)
   135         {
   136             if (obj is EventHidKeyboard)
   137             {
   138                 EventHidKeyboard e = (EventHidKeyboard)obj;
   139                 return e.Key == Key
   140                         && e.IsKeyUp == IsKeyUp
   141                         && e.HasModifierAlt == HasModifierAlt
   142                         && e.HasModifierControl == HasModifierControl
   143                         && e.HasModifierShift == HasModifierShift
   144                         && e.HasModifierWindows == HasModifierWindows;
   145             }
   146 
   147             return false;
   148         }
   149 
   150 
   151         /// <summary>
   152         /// 
   153         /// </summary>
   154         protected override void OnStateLeave()
   155         {
   156             if (CurrentState == State.Edit)
   157             {
   158                 // Leaving edit mode
   159                 // Unhook HID events
   160                 Program.HidHandler.OnHidEvent -= HandleHidEvent;
   161 
   162             }
   163         }
   164 
   165         /// <summary>
   166         /// 
   167         /// </summary>
   168         protected override void OnStateEnter()
   169         {
   170             if (CurrentState == State.Edit)
   171             {
   172                 // Enter edit mode
   173                 // Hook-in HID events
   174                 Program.HidHandler.OnHidEvent += HandleHidEvent;
   175 
   176             }
   177         }
   178 
   179         /// <summary>
   180         /// Here we receive HID events from our HID library.
   181         /// </summary>
   182         /// <param name="aSender"></param>
   183         /// <param name="aHidEvent"></param>
   184         public void HandleHidEvent(object aSender, SharpLib.Hid.Event aHidEvent)
   185         {
   186             if (CurrentState != State.Edit
   187                 || aHidEvent.IsMouse
   188                 || aHidEvent.IsButtonUp
   189                 || !aHidEvent.IsValid
   190                 || aHidEvent.IsBackground
   191                 || aHidEvent.IsRepeat
   192                 || aHidEvent.IsStray)
   193             {
   194                 return;
   195             }
   196 
   197             PrivateCopy(aHidEvent);
   198             //
   199 
   200             //Tell observer the object itself changed
   201             OnPropertyChanged("Brief");
   202         }
   203 
   204         /// <summary>
   205         /// 
   206         /// </summary>
   207         /// <param name="aHidEvent"></param>
   208         public void Copy(Hid.Event aHidEvent)
   209         {
   210             PrivateCopy(aHidEvent);
   211             //We need the key up/down too here
   212             IsKeyUp = aHidEvent.IsButtonUp;
   213         }
   214 
   215         /// <summary>
   216         /// 
   217         /// </summary>
   218         /// <param name="aHidEvent"></param>
   219         private void PrivateCopy(Hid.Event aHidEvent)
   220         {
   221             //Copy for scan
   222             UsagePage = aHidEvent.UsagePage;
   223             UsageCollection = aHidEvent.UsageCollection;
   224             IsGeneric = aHidEvent.IsGeneric;
   225             IsKeyboard = aHidEvent.IsKeyboard;
   226             IsMouse = aHidEvent.IsMouse;
   227 
   228             if (IsGeneric)
   229             {
   230                 if (aHidEvent.Usages.Count > 0)
   231                 {
   232                     Usage = aHidEvent.Usages[0];
   233                     PersistedBrief = aHidEvent.UsageName(0);
   234                 }
   235 
   236                 Key = Keys.None;
   237                 HasModifierAlt = false;
   238                 HasModifierControl = false;
   239                 HasModifierShift = false;
   240                 HasModifierWindows = false;
   241             }
   242             else if (IsKeyboard)
   243             {
   244                 Usage = 0;
   245                 Key = aHidEvent.VirtualKey;
   246                 HasModifierAlt = aHidEvent.HasModifierAlt;
   247                 HasModifierControl = aHidEvent.HasModifierControl;
   248                 HasModifierShift = aHidEvent.HasModifierShift;
   249                 HasModifierWindows = aHidEvent.HasModifierWindows;
   250             }
   251 
   252         }
   253 
   254 
   255     }
   256 }