# HG changeset patch # User sl # Date 1419516741 -3600 # Node ID 63a5f4c05179e49ff8fba998f5be7f84c3602d44 # Parent 5c7f34c627b917ff212cf642e08bfc44154963cb Fixing nasty double repeat event issue. Adding time column. diff -r 5c7f34c627b9 -r 63a5f4c05179 HidEvent.cs --- a/HidEvent.cs Wed Dec 24 14:31:16 2014 +0100 +++ b/HidEvent.cs Thu Dec 25 15:12:21 2014 +0100 @@ -24,7 +24,8 @@ public bool IsGeneric { get; private set; } public bool IsButtonDown { get { return Usages.Count == 1 && Usages[0] != 0; } } public bool IsButtonUp { get { return Usages.Count == 1 && Usages[0] == 0; } } - public bool IsRepeat { get; private set; } + public bool IsRepeat { get { return RepeatCount != 0; } } + public uint RepeatCount { get; private set; } public HidDevice Device { get; private set; } @@ -36,6 +37,8 @@ public event HidEventRepeatDelegate OnHidEventRepeat; private System.Timers.Timer Timer { get; set; } + public DateTime Time { get; private set; } + public DateTime OriginalTime { get; private set; } //Compute repeat delay and speed based on system settings //Those computations were taken from the Petzold here: ftp://ftp.charlespetzold.com/ProgWinForms/4%20Custom%20Controls/NumericScan/NumericScan/ClickmaticButton.cs @@ -64,12 +67,16 @@ /// Device Handle as provided by RAWINPUTHEADER.hDevice, typically accessed as rawinput.header.hDevice public HidEvent(Message aMessage, HidEventRepeatDelegate aRepeatDelegate) { - IsRepeat = false; + RepeatCount = 0; IsValid = false; IsKeyboard = false; IsGeneric = false; + + Time = DateTime.Now; + OriginalTime = DateTime.Now; Timer = new System.Timers.Timer(); + Timer.Elapsed += (sender, e) => OnRepeatTimerElapsed(sender, e, this); Usages = new List(); OnHidEventRepeat += aRepeatDelegate; @@ -242,22 +249,31 @@ return; } Timer.Enabled = false; - Timer.AutoReset = false; - Timer.Interval = aInterval; - Timer.Elapsed += (sender, e) => OnRepeatTimerElapsed(sender, e, this); - Timer.Enabled = true; + //Initial delay do not use auto reset + //After our initial delay however we do setup our timer one more time using auto reset + Timer.AutoReset = (RepeatCount!=0); + Timer.Interval = aInterval; + Timer.Enabled = true; } - private void OnRepeatTimerElapsed(object sender, ElapsedEventArgs e, HidEvent aHidEvent) + static private void OnRepeatTimerElapsed(object sender, ElapsedEventArgs e, HidEvent aHidEvent) { if (aHidEvent.IsStray) { //Skip events if canceled return; } - aHidEvent.IsRepeat = true; - StartRepeatTimer(iRepeatSpeed); - OnHidEventRepeat(aHidEvent); + + aHidEvent.RepeatCount++; + aHidEvent.Time = DateTime.Now; + if (aHidEvent.RepeatCount==1) + { + //Re-Start our timer only after the initial delay + aHidEvent.StartRepeatTimer(aHidEvent.iRepeatSpeed); + } + + //Broadcast our repeat event + aHidEvent.OnHidEventRepeat(aHidEvent); } public ListViewItem ToListViewItem() @@ -277,7 +293,7 @@ } - ListViewItem item = new ListViewItem(new[] { usage, UsagePage.ToString("X2"), UsageCollection.ToString("X2"), IsRepeat.ToString() }); + ListViewItem item = new ListViewItem(new[] { usage, UsagePage.ToString("X2"), UsageCollection.ToString("X2"), RepeatCount.ToString(), Time.ToString("HH:mm:ss:fff") }); return item; } diff -r 5c7f34c627b9 -r 63a5f4c05179 MainForm.cs --- a/MainForm.cs Wed Dec 24 14:31:16 2014 +0100 +++ b/MainForm.cs Thu Dec 25 15:12:21 2014 +0100 @@ -25,6 +25,7 @@ private ColumnHeader columnHeaderUsagePage; private ColumnHeader columnHeaderUsageCollection; private ColumnHeader columnHeaderRepeat; + private ColumnHeader columnHeaderTime; private Timer _timer; public delegate void OnHidEventDelegate(object aSender, Hid.HidEvent aHidEvent); @@ -71,6 +72,7 @@ this.columnHeaderUsagePage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeaderUsageCollection = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeaderRepeat = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.SuspendLayout(); // // labelButtonName @@ -103,7 +105,8 @@ this.columnHeaderUsage, this.columnHeaderUsagePage, this.columnHeaderUsageCollection, - this.columnHeaderRepeat}); + this.columnHeaderRepeat, + this.columnHeaderTime}); this.listViewEvents.GridLines = true; this.listViewEvents.Location = new System.Drawing.Point(12, 12); this.listViewEvents.Name = "listViewEvents"; @@ -131,6 +134,11 @@ // this.columnHeaderRepeat.Text = "Repeat"; // + // columnHeaderTime + // + this.columnHeaderTime.Text = "Time"; + this.columnHeaderTime.Width = 76; + // // MainForm // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);