/// <summary>
 /// For each input activation event, update the input flags to show the given button was pressed and reset the starting time of the loop.
 /// </summary>
 void InputDownEventHelper(string inputLogName, DOFSCIIMap inputFlag)
 {
     //Debug.Log(inputLogName + " button pressed");
     inputFlags        |= inputFlag;
     timeCheckLoopBegan = Time.time;
     inputsActiveTally++;
     if (combinationCheckLoop == null)
     {
         StartCheckLoop();
     }
 }
 void EndCheckLoop()
 {
     // Avoid duplicate checks by only running the check if the loop iEnumerator is not null
     if (combinationCheckLoop != null)
     {
         Send();
         StopCoroutine(combinationCheckLoop);
         combinationCheckLoop = null;
     }
     inputFlags = 0;
 }
        void EndCheckLoop()
        {
            // Avoid duplicate checks by only running the check if the loop inenumerator is not null
            if (combinationCheckLoop != null)
            {
                if (doubleThumbToggle.isOn && inputFlags.HasFlag(DOFSCIIMap.DOFSCIIToggle))
                {
                    dofsciiOn = !dofsciiOn;
                    dofsciiActiveStatus.isOn = dofsciiOn;
                    inputFlags = 0;
                    return;
                }

                if (dofsciiOn)
                {
                    if (inputFlags.HasFlag(DOFSCIIMap.arrowLeft))
                    {
                        if (caps)
                        {
                            InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.SHIFT, VirtualKeyCode.LEFT);
                        }
                        else
                        {
                            InputSimulator.SimulateKeyPress(VirtualKeyCode.LEFT);
                        }
                    }
                    else if (inputFlags.HasFlag(DOFSCIIMap.arrowRight))
                    {
                        if (caps)
                        {
                            InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.SHIFT, VirtualKeyCode.RIGHT);
                        }
                        else
                        {
                            InputSimulator.SimulateKeyPress(VirtualKeyCode.RIGHT);
                        }
                    }
                    else if (inputFlags.HasFlag(DOFSCIIMap.arrowUp))
                    {
                        if (caps)
                        {
                            InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.SHIFT, VirtualKeyCode.UP);
                        }
                        else
                        {
                            InputSimulator.SimulateKeyPress(VirtualKeyCode.UP);
                        }
                    }
                    else if (inputFlags.HasFlag(DOFSCIIMap.arrowDown))
                    {
                        if (caps)
                        {
                            InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.SHIFT, VirtualKeyCode.DOWN);
                        }
                        else
                        {
                            InputSimulator.SimulateKeyPress(VirtualKeyCode.DOWN);
                        }
                    }
                    else if (inputFlags.HasFlag(DOFSCIIMap.Backspace))
                    {
                        if (displayText != null && displayText.text.Length > 0)
                        {
                            displayText.text = displayText.text.Substring(0, displayText.text.Length - 1);
                        }

                        InputSimulator.SimulateKeyPress(VirtualKeyCode.BACK);
                    }
                    else if (inputFlags.HasFlag(DOFSCIIMap.Delete))
                    {
                        if (displayText.text.Length > 0)
                        {
                            displayText.text = displayText.text.Substring(0, displayText.text.Length - 1);
                        }

                        InputSimulator.SimulateKeyPress(VirtualKeyCode.DELETE);
                    }
                    else if (inputFlags.HasFlag(DOFSCIIMap.modeSwitch))
                    {
                        int newMode = (currentKeyMode == KeyMode.Alphanumeric) ? 1 : -1;
                        currentKeyMode = (KeyMode)((int)currentKeyMode + newMode);
                        alphaButtons[49].Highlight();
                        Debug.Log("Mode: " + currentKeyMode);
                    }
                    //else if (inputFlags.HasFlag(DOFSCIIMap.CapsToggle)) caps = !caps;
                    else if (inputFlags.HasFlag(DOFSCIIMap.CapsToggle))
                    {
                        caps = !caps;
                        InputSimulator.SimulateKeyPress(VirtualKeyCode.CAPITAL);
                        alphaButtons[48].HighlightToggle(caps);
                    }
                    else
                    {
                        // No special keys were pressed. The only other possibilities are combinations from either alpha mode or bracket mode.
                        // Here, we determine how many keys were pressed simultaneously to narrow down the number of checks,
                        // and then we check the possible mappings for either alpha mode or bracket mode.

                        switch (HammingWeight((int)inputFlags))
                        {
                        case 5:     // Five simultaneous keys were pressed
                            if (inputFlags.HasFlag(DOFSCIIMap.Hashtag))
                            {
                                HandleInput("#");
                                alphaButtons[43].Highlight();
                            }
                            else if (inputFlags.HasFlag(DOFSCIIMap.Ampersand))
                            {
                                HandleInput("&");
                                alphaButtons[44].Highlight();
                            }
                            else if (inputFlags.HasFlag(DOFSCIIMap.Percent))
                            {
                                HandleInput("%");
                                alphaButtons[45].Highlight();
                            }
                            else if (inputFlags.HasFlag(DOFSCIIMap.DollarSign))
                            {
                                HandleInput("$");
                                alphaButtons[46].Highlight();
                            }
                            else if (inputFlags.HasFlag(DOFSCIIMap.Caret))
                            {
                                HandleInput("^");
                                alphaButtons[47].Highlight();
                            }
                            break;

                        case 4:     // Four simultaneous keys were pressed
                            if (currentKeyMode == KeyMode.Alphanumeric)
                            {
                                if (inputFlags.HasFlag(DOFSCIIMap.Z))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_Z, "z");
                                    alphaButtons[25].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.X))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_X, "x");
                                    alphaButtons[23].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Semicolon))
                                {
                                    HandleInput(";");
                                    alphaButtons[35].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Colon))
                                {
                                    HandleInput(":");
                                    alphaButtons[36].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Period))
                                {
                                    HandleInput(".");
                                    alphaButtons[26].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Quote))
                                {
                                    HandleInput("\"");
                                    alphaButtons[37].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.QuestionMark))
                                {
                                    HandleInput("?");
                                    alphaButtons[28].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Exclamation))
                                {
                                    HandleInput("!");
                                    alphaButtons[38].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Tilde))
                                {
                                    HandleInput("~");
                                    alphaButtons[40].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Apostrophe))
                                {
                                    HandleInput("'");
                                    alphaButtons[41].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Comma))
                                {
                                    HandleInput(",");
                                    alphaButtons[27].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Underscore))
                                {
                                    HandleInput("_");
                                    alphaButtons[39].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.AccentGrave))
                                {
                                    HandleInput("`");
                                    alphaButtons[42].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.At))
                                {
                                    HandleInput("@");
                                    alphaButtons[34].Highlight();
                                }
                            }
                            else
                            {
                                if (inputFlags.HasFlag(DOFSCIIMap.WindowsKey))
                                {
                                    currentKeyMode = KeyMode.Alphanumeric;
                                    InputSimulator.SimulateKeyPress(VirtualKeyCode.LWIN);
                                    bracketButtons[19].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.BrowserBack))
                                {
                                    InputSimulator.SimulateKeyPress(VirtualKeyCode.BROWSER_BACK);
                                    bracketButtons[7].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.BrowserForward))
                                {
                                    InputSimulator.SimulateKeyPress(VirtualKeyCode.BROWSER_FORWARD);
                                    bracketButtons[17].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.VolumeDown))
                                {
                                    InputSimulator.SimulateKeyPress(VirtualKeyCode.VOLUME_DOWN);
                                    bracketButtons[8].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.VolumeUp))
                                {
                                    InputSimulator.SimulateKeyPress(VirtualKeyCode.VOLUME_UP);
                                    bracketButtons[18].Highlight();
                                }
                            }
                            break;

                        case 3:     // Three simultaneous keys were pressed
                            if (currentKeyMode == KeyMode.Alphanumeric)
                            {
                                if (inputFlags.HasFlag(DOFSCIIMap.B))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_B, "b");
                                    alphaButtons[1].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.P))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_P, "p");
                                    alphaButtons[15].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.V))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_V, "v");
                                    alphaButtons[21].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.K))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_K, "k");
                                    alphaButtons[10].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.J))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_J, "j");
                                    alphaButtons[9].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Q))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_Q, "q");
                                    alphaButtons[16].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Zero))
                                {
                                    HandleAlphaKey(VirtualKeyCode.NUMPAD0, "0");
                                    alphaButtons[50].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.One))
                                {
                                    HandleAlphaKey(VirtualKeyCode.NUMPAD1, "1");
                                    alphaButtons[51].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Two))
                                {
                                    HandleAlphaKey(VirtualKeyCode.NUMPAD2, "2");
                                    alphaButtons[52].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Three))
                                {
                                    HandleAlphaKey(VirtualKeyCode.NUMPAD3, "3");
                                    alphaButtons[53].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Four))
                                {
                                    HandleAlphaKey(VirtualKeyCode.NUMPAD4, "4");
                                    alphaButtons[54].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Five))
                                {
                                    HandleAlphaKey(VirtualKeyCode.NUMPAD5, "5");
                                    alphaButtons[55].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Six))
                                {
                                    HandleAlphaKey(VirtualKeyCode.NUMPAD6, "6");
                                    alphaButtons[56].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Seven))
                                {
                                    HandleAlphaKey(VirtualKeyCode.NUMPAD7, "7");
                                    alphaButtons[57].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Eight))
                                {
                                    HandleAlphaKey(VirtualKeyCode.NUMPAD8, "8");
                                    alphaButtons[58].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Nine))
                                {
                                    HandleAlphaKey(VirtualKeyCode.NUMPAD9, "9");
                                    alphaButtons[19].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Plus))
                                {
                                    HandleAlphaKey(VirtualKeyCode.ADD, "+");
                                    alphaButtons[30].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Minus))
                                {
                                    HandleAlphaKey(VirtualKeyCode.SUBTRACT, "-");
                                    alphaButtons[31].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Multiply))
                                {
                                    HandleAlphaKey(VirtualKeyCode.MULTIPLY, "*");
                                    alphaButtons[32].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Divide))
                                {
                                    HandleAlphaKey(VirtualKeyCode.DIVIDE, "/");
                                    alphaButtons[33].Highlight();
                                }
                            }
                            else
                            {
                                if (inputFlags.HasFlag(DOFSCIIMap.Undo))
                                {
                                    InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_Z);
                                    bracketButtons[6].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Redo))
                                {
                                    InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_Y);
                                    bracketButtons[16].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Cut))
                                {
                                    InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_X);
                                    bracketButtons[9].Highlight();
                                }
                            }

                            break;

                        case 2:     // Two simultaneous keys were pressed
                            if (currentKeyMode == KeyMode.Bracket)
                            {
                                if (inputFlags.HasFlag(DOFSCIIMap.OpenStraightBracket))
                                {
                                    HandleInput("[");
                                    bracketButtons[3].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.CloseStraightBracket))
                                {
                                    HandleInput("]");
                                    bracketButtons[13].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.StraightSlash))
                                {
                                    HandleInput("|");
                                    bracketButtons[4].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.BackSlash))
                                {
                                    HandleInput("\\");
                                    bracketButtons[14].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Copy))
                                {
                                    InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C);
                                    bracketButtons[5].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Paste))
                                {
                                    InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_V);
                                    bracketButtons[15].Highlight();
                                }
                            }
                            else
                            {
                                if (inputFlags.HasFlag(DOFSCIIMap.F))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_F, "f");
                                    alphaButtons[6].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.N))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_N, "n");
                                    alphaButtons[13].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.D))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_D, "d");
                                    alphaButtons[3].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.C))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_C, "c");
                                    alphaButtons[2].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.R))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_R, "r");
                                    alphaButtons[17].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.S))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_S, "s");
                                    alphaButtons[18].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.T))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_T, "t");
                                    alphaButtons[19].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.H))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_H, "h");
                                    alphaButtons[7].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.L))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_L, "l");
                                    alphaButtons[11].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.M))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_M, "m");
                                    alphaButtons[12].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.W))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_W, "w");
                                    alphaButtons[22].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.G))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_G, "g");
                                    alphaButtons[6].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Space))
                                {
                                    HandleAlphaKey(VirtualKeyCode.SPACE, " ");
                                    alphaButtons[29].Highlight();
                                }
                            }
                            break;

                        case 1:     // Only one key was pressed
                            if (currentKeyMode == KeyMode.Alphanumeric)
                            {
                                if (inputFlags.HasFlag(DOFSCIIMap.A))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_A, "a");
                                    alphaButtons[0].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.E))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_E, "e");
                                    alphaButtons[4].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.I))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_I, "i");
                                    alphaButtons[8].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.O))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_O, "o");
                                    alphaButtons[14].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.U))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_U, "u");
                                    alphaButtons[20].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Y))
                                {
                                    HandleAlphaKey(VirtualKeyCode.VK_Y, "y");
                                    alphaButtons[24].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Newline))
                                {
                                    HandleAlphaKey(VirtualKeyCode.RETURN, "\n");
                                }
                            }
                            else
                            {
                                if (inputFlags.HasFlag(DOFSCIIMap.OpenParinthesis))
                                {
                                    HandleInput("(");
                                    bracketButtons[2].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.CloseParinthesis))
                                {
                                    HandleInput(")");
                                    bracketButtons[12].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.OpenAngleBracket))
                                {
                                    HandleInput("<");
                                    bracketButtons[1].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.CloseAngleBracket))
                                {
                                    HandleInput(">");
                                    bracketButtons[11].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.OpenSquigglyBracket))
                                {
                                    HandleInput("{");
                                    bracketButtons[0].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.CloseSquigglyBracket))
                                {
                                    HandleInput("}");
                                    bracketButtons[10].Highlight();
                                }
                                else if (inputFlags.HasFlag(DOFSCIIMap.Newline))
                                {
                                    HandleAlphaKey(VirtualKeyCode.RETURN, "\n");
                                }
                            }

                            break;
                        }

                        if (outputToDisplayText && displayText != null)
                        {
                            displayText.text += newCharacter;
                        }
                    }

                    StopCoroutine(combinationCheckLoop);
                    combinationCheckLoop = null;
                }
            }

            inputFlags = 0;
        }