# 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);