예제 #1
0
        public static string GetFormattedDataLine(KeysData data)
        {
            bool AppendCombID = true, AppendHoldTime = true, AppendFlightTime = true;
            bool AppendDi1 = false, AppendDi2 = false, AppendDi3 = false;

            string formattedDataString = "";

            if (AppendCombID)
            {
                formattedDataString += data.CombinationID.ToString();
            }
            if (AppendHoldTime)
            {
                formattedDataString += ',' + ((int)data.HoldTime.TotalMilliseconds).ToString();
            }
            if (AppendFlightTime)
            {
                formattedDataString += ',' + ((int)data.FlightTime.TotalMilliseconds).ToString();
            }
            if (AppendDi1)
            {
                formattedDataString += ',' + ((int)data.Digraph1.TotalMilliseconds).ToString();
            }
            if (AppendDi2)
            {
                formattedDataString += ',' + ((int)data.Digraph2.TotalMilliseconds).ToString();
            }
            if (AppendDi3)
            {
                formattedDataString += ',' + ((int)data.Digraph3.TotalMilliseconds).ToString();
            }

            return(formattedDataString);
        }
예제 #2
0
        public void KeyWasReleased(char charReleased, long timeInTicks)
        {
            charsReleased.Add(charReleased);

            timeSinceLastAction = timeInTicks;

            KeyPressRelease keyReleased = KeysPressedAndReleased.LastOrDefault(x => x.Character == charReleased);

            if (keyReleased != null)
            {
                keyReleased.TimeReleasedInTicks = timeInTicks;
            }



            KeysData keysData = KeysDataWhereFirstCharIs(charReleased);

            if (keysData != null)
            {
                RecordOnReleaseData(charReleased, timeInTicks, keysData);
            }

            keysCurrentlyHeld.Remove(charReleased);
            timeOfPreviousRelease   = timeInTicks;
            previousReleaseKeysData = keysData;
        }
예제 #3
0
        private void RecordOnReleaseData(char charReleased, long timeInTicks, KeysData keysData)
        {
            keysData.WaitingForEvents.Remove(KeysData.WaitingForEvent.EFirstKeyRelease);

            keysData.HoldTime = TimeSpan.FromTicks(timeInTicks - keysCurrentlyHeld[charReleased]);

            if (NextKeyAlreadyPressed(keysData))
            {
                KeyPressRelease keyReleased = KeysPressedAndReleased.FirstOrDefault(x => x.Character == keysData.SecondChar);
                if (keyReleased != null)
                {
                    keysData.FlightTime = TimeSpan.FromTicks(keyReleased.TimePressedInTicks - timeInTicks);
                }
            }

            KeysData previousKeyData = KeysDataWhereSecondCharIs(charReleased);

            if (previousKeyData != null)
            {
                previousKeyData.WaitingForEvents.Remove(KeysData.WaitingForEvent.ESecondKeyRelease);
            }

            if (previousReleaseKeysData != null)
            {
                if (KeysDataWhereSecondCharIs(charReleased) == null)
                {
                    KeyPressRelease secondKeyReleasedFirst = KeysPressedAndReleased[KeysPressedAndReleased.FindIndex(x => x.Character == keysData.FirstChar) + 1];



                    keysData.Digraph2 = TimeSpan.FromTicks(secondKeyReleasedFirst.TimeReleasedInTicks - timeInTicks);
                    keysData.Digraph3 = GetDigraph3(keysData);

                    RemoveUnnecesarryKeys(charReleased);
                }
                else // This happens when the second key of the key combination is released first
                {
                    previousKeyData = KeysDataWhereSecondCharIs(charReleased);

                    previousKeyData.Digraph2 = GetDigraph2(timeInTicks, previousKeyData);
                    previousKeyData.Digraph3 = GetDigraph3(previousKeyData);

                    previousKeyData.WaitingForEvents.Remove(KeysData.WaitingForEvent.ESecondKeyRelease);


                    KeyPressRelease secondKeyReleasedFirst = KeysPressedAndReleased.FirstOrDefault(x => x.Character == keysData.SecondChar);

                    if (secondKeyReleasedFirst != null)
                    {
                        keysData.Digraph2 = TimeSpan.FromTicks(secondKeyReleasedFirst.TimeReleasedInTicks - timeInTicks);
                        keysData.Digraph3 = GetDigraph3(keysData);
                    }

                    RemoveUnnecesarryKeys(charReleased);
                }
            }
        }
예제 #4
0
        private TimeSpan GetDigraph2(long timeInTicks, KeysData keysData)
        {
            KeyPressRelease keyReleased = KeysPressedAndReleased.FirstOrDefault(x => x.Character == keysData.FirstChar);

            if (keyReleased != null)
            {
                return(TimeSpan.FromTicks(timeInTicks - keyReleased.TimeReleasedInTicks));
            }
            return(new TimeSpan(0));
        }
예제 #5
0
 public void End()
 {
     lastKeyPress            = '\0';
     timeOfPreviousRelease   = 0;
     timeOfPreviousPress     = 0;
     previousReleaseKeysData = null;
     timer.Enabled           = false;
     CurrentState            = SessionState.Inactive;
     UnprocessedData         = new List <KeysData>();
     DataRecorded            = new List <KeysData>();
     timeSinceLastAction     = 0;
     KeysPressedAndReleased  = new List <KeyPressRelease>();
 }
예제 #6
0
        private bool PreviousKeysDataHasReleasedFirstKey(KeysData keysData, List <KeysData> unprocessedData)
        {
            KeysData previousKeysData;
            int      indexOfCurrentKeysData = unprocessedData.FindIndex(x => x == keysData);

            if (indexOfCurrentKeysData == 0)
            {
                return(false);
            }

            previousKeysData = unprocessedData[indexOfCurrentKeysData - 1];
            return(previousKeysData.WaitingForEvents.Contains(KeysData.WaitingForEvent.EFirstKeyRelease));
        }
예제 #7
0
        public void KeyWasPressed(char charPressed, long timeInTicks)
        {
            timeSinceLastAction = timeInTicks;
            ResetTimer();

            if (keysCurrentlyHeld.ContainsKey(charPressed))
            {
                return;
            }

            keysCurrentlyHeld.Add(charPressed, timeInTicks);



            if (CurrentState.Equals(SessionState.Inactive))
            {
                CurrentState = SessionState.Active;
            }
            else
            {
                DataRecorded.Last().SecondChar = charPressed;

                DataRecorded.Last().CombinationID = HelperFunctions.GetCombinationId(lastKeyPress, charPressed);


                if (!NextKeyAlreadyPressed(DataRecorded.Last()))
                {
                    DataRecorded.Last().FlightTime = TimeSpan.FromTicks(timeInTicks - KeysPressedAndReleased.Last().TimeReleasedInTicks);
                }

                DataRecorded.Last().Digraph1 = TimeSpan.FromTicks(timeInTicks - timeOfPreviousPress);

                DataRecorded.Last().WaitingForEvents.Remove(KeysData.WaitingForEvent.ESecondKeyPress);
            }

            KeysPressedAndReleased.Add(new KeyPressRelease(charPressed, timeInTicks));


            KeysData keysData = new KeysData
            {
                FirstChar = charPressed
            };

            DataRecorded.Add(keysData);


            UnprocessedData.Add(keysData);

            timeOfPreviousPress = timeInTicks;
            lastKeyPress        = charPressed;
        }
예제 #8
0
 private bool NextKeyAlreadyPressed(KeysData keysData)
 {
     return(lastKeyPress != keysData.FirstChar);
 }
예제 #9
0
 private TimeSpan GetDigraph3(KeysData keysData)
 {
     return(keysData.HoldTime + keysData.Digraph2);
 }