/// <summary>
    /// Changes the current HUD page.
    /// </summary>
    /// <param name='page'>
    /// the new HUD
    /// </param>
    ///
    private void changeHudPage(HudPage page)
    {
        if (page != hudPage)
        {
            clearText();
            switch (page)
            {
            case HudPage.SPEED:
            {
                setLedColour(ledLCD, Color.white);
                setLed(ledLCD, 99, 0, 0);
                setText(0, "Speed: 0000 km/h");
                setText(1, "       0.00 mach");
                break;
            }

            case HudPage.THRUST:
            {
                setLedColour(ledLCD, Color.white);
                setLed(ledLCD, 99, 0, 0);
                setText(0, "Thrust E1: 000%");
                setText(1, "       E2: 000%");
                break;
            }

            case HudPage.FUEL:
            {
                setLedColour(ledLCD, Color.white);
                setLed(ledLCD, 99, 0, 0);
                setText(0, "Fuel E1: 000%");
                setText(1, "     E2: 000%");
                break;
            }

            case HudPage.ABORT:
            {
                // make background LED blink in red
                setLedColour(ledLCD, Color.red);
                setLed(9, 99, 500, 50);
                // write text
                setText(0, "!!!! ABORT !!!! ");
                setText(1, "!!!! ABORT !!!! ");
                break;
            }
            }
            hudPage = page;

            // immediately update the data
            nextHudUpdateTime  = Time.time;
            nextButtonPollTime = nextHudUpdateTime;
        }
    }
    /// <summary>
    /// Checks the buttons and updates the LCD display accordingly
    /// </summary>
    ///
    private void checkButtons()
    {
        if (IsConnected() && (Time.time > nextButtonPollTime))
        {
            // poll the buttons and switch the HUD accordingly
            HudPage newPage = hudPage;
            if (getButtonPresses(buttonLeft) > 0)
            {
                newPage--;
            }
            if (getButtonPresses(buttonRight) > 0)
            {
                newPage++;
            }

            // if vehicle starts to move: switch to speed page automatically
            if ((vehicleData.speed > 0.1) && (hudPage == HudPage.STANDBY))
            {
                newPage = HudPage.SPEED;
            }

            if (newPage != hudPage)
            {
                // page has changed: stay within "selectable" range
                if (newPage <= HudPage.FIRST_SELECTABLE)
                {
                    newPage = HudPage.LAST_SELECTABLE - 1;
                }
                if (newPage >= HudPage.LAST_SELECTABLE)
                {
                    newPage = HudPage.FIRST_SELECTABLE + 1;
                }
                changeHudPage(newPage);
            }

            nextButtonPollTime = Time.time + (buttonPollInterval / 1000.0);
        }
    }
    /// <summary>
    /// Runs a quick diagnose routine on the IO box.
    /// </summary>
    /// <returns>
    /// ???
    /// </returns>
    private IEnumerator RunDiagnose()
    {
        hudPage = HudPage.DIAGNOSE;
        const float stepWait = 0.25f;

        setLedColour(ledLCD, Color.yellow); setLed (ledLCD, 255, 0, 0);
        setText(0, "System Check:   ");
        setText(1, "                ");
        yield return new WaitForSeconds(stepWait);

        getButtonPresses(buttonLeft); // clear button presses
        getButtonPresses(buttonRight);

        setLed(ledLeft, 100, 0, 0);       setLed(ledRight, 100, 0, 0);
        setLedColour(ledLeft, Color.red); setLedColour(ledRight, Color.red);
        setText(1, "HUD");
        yield return new WaitForSeconds(stepWait);

        setLedColour(ledLeft, Color.green); setLedColour(ledRight, Color.green);
        setText(1, "Engine");
        yield return new WaitForSeconds(stepWait);

        setLedColour(ledLeft, Color.blue); setLedColour(ledRight, Color.blue);
        setText(1, "Booster");
        yield return new WaitForSeconds(stepWait);

        setLedColour(ledLeft, Color.yellow); setLedColour(ledRight, Color.yellow);
        setText(1, "Steering");
        yield return new WaitForSeconds(stepWait);

        setLedColour(ledLeft, Color.cyan); setLedColour(ledRight, Color.cyan);
        setText(1, "Brakes  ");
        yield return new WaitForSeconds(stepWait);

        setLedColour(ledLeft, Color.magenta); setLedColour(ledRight, Color.magenta);
        setText(1, "Parachute");
        yield return new WaitForSeconds(stepWait);

        setLedColour(ledLeft, Color.white); setLedColour(ledRight, Color.white);
        setLedColour(9, Color.green);
        setText(0, " All Systems OK ");
        setText(1, " Ready to go... ");

        yield return new WaitForSeconds(stepWait);
        setLed(ledLeft, 0); setLed(ledRight, 0);

        hudPage = HudPage.STANDBY;
    }
    /// <summary>
    /// Changes the current HUD page.
    /// </summary>
    /// <param name='page'>
    /// the new HUD 
    /// </param>
    /// 
    private void changeHudPage(HudPage page)
    {
        if ( page != hudPage )
        {
            clearText();
            switch ( page )
            {
                case HudPage.SPEED:
                {
                    setLedColour(ledLCD, Color.white);
                    setLed(ledLCD, 99, 0, 0);
                    setText(0, "Speed: 0000 km/h");
                    setText(1, "       0.00 mach");
                    break;
                }
                case HudPage.THRUST:
                {
                    setLedColour(ledLCD, Color.white);
                    setLed(ledLCD, 99, 0, 0);
                    setText(0, "Thrust E1: 000%");
                    setText(1, "       E2: 000%");
                    break;
                }
                case HudPage.FUEL:
                {
                    setLedColour(ledLCD, Color.white);
                    setLed(ledLCD, 99, 0, 0);
                    setText(0, "Fuel E1: 000%");
                    setText(1, "     E2: 000%");
                    break;
                }
                case HudPage.ABORT:
                {
                    // make background LED blink in red
                    setLedColour(ledLCD, Color.red);
                    setLed (9, 99, 500, 50);
                    // write text
                    setText(0, "!!!! ABORT !!!! ");
                    setText(1, "!!!! ABORT !!!! ");
                    break;
                }
            }
            hudPage = page;

            // immediately update the data
            nextHudUpdateTime  = Time.time;
            nextButtonPollTime = nextHudUpdateTime;
        }
    }