StephaneLenclud@244: using System; StephaneLenclud@244: using System.Collections.Generic; StephaneLenclud@244: using System.Linq; StephaneLenclud@244: using System.Reflection; StephaneLenclud@244: using System.Text; StephaneLenclud@244: using System.Threading.Tasks; StephaneLenclud@244: using System.Runtime.Serialization; StephaneLenclud@244: using System.Windows.Forms; StephaneLenclud@244: using Ear = SharpLib.Ear; StephaneLenclud@244: using Hid = SharpLib.Hid; StephaneLenclud@244: StephaneLenclud@244: namespace SharpDisplayManager StephaneLenclud@244: { StephaneLenclud@244: [DataContract] StephaneLenclud@247: [Ear.AttributeObject(Id = "Event.Hid", Name = "HID", Description = "Handle input from Keyboards and Remotes.")] StephaneLenclud@244: public class EventHid: Ear.Event StephaneLenclud@244: { StephaneLenclud@244: public EventHid() StephaneLenclud@244: { StephaneLenclud@244: } StephaneLenclud@244: StephaneLenclud@244: [DataMember] StephaneLenclud@244: public ushort UsagePage { get; set; } StephaneLenclud@244: StephaneLenclud@244: [DataMember] StephaneLenclud@244: public ushort UsageCollection { get; set; } StephaneLenclud@244: StephaneLenclud@244: [DataMember] StephaneLenclud@244: public ushort Usage { get; set; } StephaneLenclud@244: StephaneLenclud@244: [DataMember] StephaneLenclud@244: public Keys Key { get; set; } StephaneLenclud@244: StephaneLenclud@244: [DataMember] StephaneLenclud@244: [Ear.AttributeObjectProperty StephaneLenclud@244: ( StephaneLenclud@244: Id = "HID.Keyboard.IsKeyUp", StephaneLenclud@244: Name = "Key Up", StephaneLenclud@244: Description = "Key up if set, key down otherwise." StephaneLenclud@244: )] StephaneLenclud@244: public bool IsKeyUp { get; set; } = false; StephaneLenclud@244: StephaneLenclud@244: [DataMember] StephaneLenclud@246: public bool IsMouse { get; set; } = false; StephaneLenclud@244: StephaneLenclud@244: [DataMember] StephaneLenclud@246: public bool IsKeyboard { get; set; } = false; StephaneLenclud@244: StephaneLenclud@244: [DataMember] StephaneLenclud@246: public bool IsGeneric { get; set; } = false; StephaneLenclud@244: StephaneLenclud@244: [DataMember] StephaneLenclud@244: public bool HasModifierShift { get; set; } = false; StephaneLenclud@244: StephaneLenclud@244: [DataMember] StephaneLenclud@244: public bool HasModifierControl { get; set; } = false; StephaneLenclud@244: StephaneLenclud@244: [DataMember] StephaneLenclud@244: public bool HasModifierAlt { get; set; } = false; StephaneLenclud@244: StephaneLenclud@244: [DataMember] StephaneLenclud@244: public bool HasModifierWindows { get; set; } = false; StephaneLenclud@244: StephaneLenclud@246: [DataMember] StephaneLenclud@247: public string UsageName { get; set; } = "Press a key"; StephaneLenclud@246: StephaneLenclud@246: StephaneLenclud@244: StephaneLenclud@244: protected override void DoConstruct() StephaneLenclud@244: { StephaneLenclud@244: base.DoConstruct(); StephaneLenclud@244: UpdateDynamicProperties(); StephaneLenclud@244: } StephaneLenclud@244: StephaneLenclud@244: private void UpdateDynamicProperties() StephaneLenclud@244: { StephaneLenclud@244: StephaneLenclud@244: } StephaneLenclud@244: StephaneLenclud@244: /// StephaneLenclud@244: /// Make sure we distinguish between various configuration of this event StephaneLenclud@244: /// StephaneLenclud@244: /// StephaneLenclud@244: public override string Brief() StephaneLenclud@244: { StephaneLenclud@260: string brief = AttributeName + ": "; StephaneLenclud@244: StephaneLenclud@248: if (!IsValid()) StephaneLenclud@248: { StephaneLenclud@248: brief += "Press a key"; StephaneLenclud@248: return brief; StephaneLenclud@248: } StephaneLenclud@248: StephaneLenclud@244: if (IsKeyboard) StephaneLenclud@244: { StephaneLenclud@244: brief += Key.ToString(); StephaneLenclud@244: StephaneLenclud@244: if (HasModifierAlt) StephaneLenclud@244: { StephaneLenclud@244: brief += " + ALT"; StephaneLenclud@244: } StephaneLenclud@244: StephaneLenclud@244: if (HasModifierControl) StephaneLenclud@244: { StephaneLenclud@244: brief += " + CTRL"; StephaneLenclud@244: } StephaneLenclud@244: StephaneLenclud@244: if (HasModifierShift) StephaneLenclud@244: { StephaneLenclud@244: brief += " + SHIFT"; StephaneLenclud@244: } StephaneLenclud@244: StephaneLenclud@244: if (HasModifierWindows) StephaneLenclud@244: { StephaneLenclud@244: brief += " + WIN"; StephaneLenclud@244: } StephaneLenclud@244: } StephaneLenclud@244: else if (IsGeneric) StephaneLenclud@244: { StephaneLenclud@247: brief += UsageName; StephaneLenclud@244: } StephaneLenclud@244: StephaneLenclud@244: if (IsKeyUp) StephaneLenclud@244: { StephaneLenclud@244: brief += " (UP)"; StephaneLenclud@244: } StephaneLenclud@244: else StephaneLenclud@244: { StephaneLenclud@244: brief += " (DOWN)"; StephaneLenclud@244: } StephaneLenclud@244: StephaneLenclud@244: return brief; StephaneLenclud@244: } StephaneLenclud@244: StephaneLenclud@244: /// StephaneLenclud@244: /// StephaneLenclud@244: /// StephaneLenclud@244: /// StephaneLenclud@244: /// StephaneLenclud@244: public override bool Equals(object obj) StephaneLenclud@244: { StephaneLenclud@247: if (obj is EventHid) StephaneLenclud@244: { StephaneLenclud@247: EventHid e = (EventHid)obj; StephaneLenclud@244: return e.Key == Key StephaneLenclud@247: && e.Usage == Usage StephaneLenclud@247: && e.UsagePage == UsagePage StephaneLenclud@247: && e.UsageCollection == UsageCollection StephaneLenclud@247: && e.IsKeyUp == IsKeyUp StephaneLenclud@247: && e.IsGeneric == IsGeneric StephaneLenclud@247: && e.IsKeyboard == IsKeyboard StephaneLenclud@247: && e.IsMouse == IsMouse StephaneLenclud@247: && e.HasModifierAlt == HasModifierAlt StephaneLenclud@247: && e.HasModifierControl == HasModifierControl StephaneLenclud@247: && e.HasModifierShift == HasModifierShift StephaneLenclud@247: && e.HasModifierWindows == HasModifierWindows; StephaneLenclud@244: } StephaneLenclud@244: StephaneLenclud@244: return false; StephaneLenclud@244: } StephaneLenclud@246: StephaneLenclud@246: StephaneLenclud@246: /// StephaneLenclud@246: /// StephaneLenclud@246: /// StephaneLenclud@246: protected override void OnStateLeave() StephaneLenclud@246: { StephaneLenclud@246: if (CurrentState == State.Edit) StephaneLenclud@246: { StephaneLenclud@246: // Leaving edit mode StephaneLenclud@246: // Unhook HID events StephaneLenclud@246: Program.HidHandler.OnHidEvent -= HandleHidEvent; StephaneLenclud@246: StephaneLenclud@246: } StephaneLenclud@246: } StephaneLenclud@246: StephaneLenclud@246: /// StephaneLenclud@246: /// StephaneLenclud@246: /// StephaneLenclud@246: protected override void OnStateEnter() StephaneLenclud@246: { StephaneLenclud@246: if (CurrentState == State.Edit) StephaneLenclud@246: { StephaneLenclud@246: // Enter edit mode StephaneLenclud@246: // Hook-in HID events StephaneLenclud@246: Program.HidHandler.OnHidEvent += HandleHidEvent; StephaneLenclud@246: StephaneLenclud@246: } StephaneLenclud@246: } StephaneLenclud@246: StephaneLenclud@246: /// StephaneLenclud@246: /// Here we receive HID events from our HID library. StephaneLenclud@246: /// StephaneLenclud@246: /// StephaneLenclud@246: /// StephaneLenclud@246: public void HandleHidEvent(object aSender, SharpLib.Hid.Event aHidEvent) StephaneLenclud@246: { StephaneLenclud@246: if (CurrentState != State.Edit StephaneLenclud@246: || aHidEvent.IsMouse StephaneLenclud@246: || aHidEvent.IsButtonUp StephaneLenclud@246: || !aHidEvent.IsValid StephaneLenclud@246: || aHidEvent.IsBackground StephaneLenclud@246: || aHidEvent.IsRepeat StephaneLenclud@246: || aHidEvent.IsStray) StephaneLenclud@246: { StephaneLenclud@246: return; StephaneLenclud@246: } StephaneLenclud@246: StephaneLenclud@246: PrivateCopy(aHidEvent); StephaneLenclud@246: // StephaneLenclud@246: StephaneLenclud@246: //Tell observer the object itself changed StephaneLenclud@246: OnPropertyChanged("Brief"); StephaneLenclud@246: } StephaneLenclud@246: StephaneLenclud@246: /// StephaneLenclud@246: /// StephaneLenclud@246: /// StephaneLenclud@246: /// StephaneLenclud@246: public void Copy(Hid.Event aHidEvent) StephaneLenclud@246: { StephaneLenclud@246: PrivateCopy(aHidEvent); StephaneLenclud@246: //We need the key up/down too here StephaneLenclud@246: IsKeyUp = aHidEvent.IsButtonUp; StephaneLenclud@246: } StephaneLenclud@246: StephaneLenclud@246: /// StephaneLenclud@246: /// StephaneLenclud@246: /// StephaneLenclud@246: /// StephaneLenclud@246: private void PrivateCopy(Hid.Event aHidEvent) StephaneLenclud@246: { StephaneLenclud@246: //Copy for scan StephaneLenclud@246: UsagePage = aHidEvent.UsagePage; StephaneLenclud@246: UsageCollection = aHidEvent.UsageCollection; StephaneLenclud@246: IsGeneric = aHidEvent.IsGeneric; StephaneLenclud@246: IsKeyboard = aHidEvent.IsKeyboard; StephaneLenclud@246: IsMouse = aHidEvent.IsMouse; StephaneLenclud@246: StephaneLenclud@246: if (IsGeneric) StephaneLenclud@246: { StephaneLenclud@246: if (aHidEvent.Usages.Count > 0) StephaneLenclud@246: { StephaneLenclud@246: Usage = aHidEvent.Usages[0]; StephaneLenclud@247: UsageName = aHidEvent.UsageName(0); StephaneLenclud@246: } StephaneLenclud@246: StephaneLenclud@246: Key = Keys.None; StephaneLenclud@246: HasModifierAlt = false; StephaneLenclud@246: HasModifierControl = false; StephaneLenclud@246: HasModifierShift = false; StephaneLenclud@246: HasModifierWindows = false; StephaneLenclud@246: } StephaneLenclud@246: else if (IsKeyboard) StephaneLenclud@246: { StephaneLenclud@246: Usage = 0; StephaneLenclud@246: Key = aHidEvent.VirtualKey; StephaneLenclud@246: HasModifierAlt = aHidEvent.HasModifierAlt; StephaneLenclud@246: HasModifierControl = aHidEvent.HasModifierControl; StephaneLenclud@246: HasModifierShift = aHidEvent.HasModifierShift; StephaneLenclud@246: HasModifierWindows = aHidEvent.HasModifierWindows; StephaneLenclud@246: } StephaneLenclud@246: StephaneLenclud@246: } StephaneLenclud@246: StephaneLenclud@247: /// StephaneLenclud@247: /// StephaneLenclud@247: /// StephaneLenclud@247: /// StephaneLenclud@247: public override bool IsValid() StephaneLenclud@247: { StephaneLenclud@247: return IsGeneric || IsKeyboard; StephaneLenclud@247: } StephaneLenclud@244: } StephaneLenclud@244: }