private void timerTick(object sender, EventArgs e)
        {
            if (reader == null)
            {
                if (GetFalconWindowHandle() != IntPtr.Zero)
                {
                    reader = new Reader();
                    if (!reader.IsFalconRunning)
                    {
                        reader.Dispose();
                        reader = null;
                    }
                    else
                    {
                        DebugUtils.Speak(string.Format("Falcon started"));
                        raiseFalconStarted();
                        timer.Interval = readFalconDataTimerInterval;
                    }
                }
            }
            else
            {
                if (GetFalconWindowHandle() == IntPtr.Zero)
                {
                    DebugUtils.Speak(string.Format("Falcon stopped"));
                    reader.Dispose();
                    reader = null;
                    raiseFalconStopped();
                    timer.Interval = detectFalconTimerInterval;
                }
            }

            FlightData newFlightData = null;

            if (reader != null)
            {
                newFlightData = reader.GetCurrentData();
            }

            if (newFlightData == null)
            {
                if (oldFlightData != null)
                {
                    raiseFlightDataChanged(oldFlightData, newFlightData);
                    raiseFlightDataLightsChanged(oldFlightData, newFlightData);
                }
            }
            else
            {
                if (oldFlightData == null)
                {
                    raiseFlightDataChanged(oldFlightData, newFlightData);
                    raiseFlightDataLightsChanged(oldFlightData, newFlightData);
                }
                else
                {
                    raiseFlightDataChanged(oldFlightData, newFlightData);

                    bool lightChanged = (oldFlightData.lightBits ^ newFlightData.lightBits) != 0;
                    lightChanged |= (oldFlightData.lightBits2 ^ newFlightData.lightBits2) != 0;
                    lightChanged |= (oldFlightData.lightBits3 ^ newFlightData.lightBits3) != 0;
                    lightChanged |= (oldFlightData.hsiBits ^ newFlightData.hsiBits) != 0;
                    lightChanged |= oldFlightData.speedBrake != newFlightData.speedBrake;
                    lightChanged |= oldFlightData.rpm != newFlightData.rpm;
                    lightChanged |= (oldFlightData.blinkBits ^ newFlightData.blinkBits) != 0;
                    lightChanged |= (oldFlightData.powerBits ^ newFlightData.powerBits) != 0;
                    lightChanged |= oldFlightData.tacanInfo != newFlightData.tacanInfo;
                    lightChanged |= oldFlightData.navMode != newFlightData.navMode;
                    lightChanged |= (oldFlightData.cmdsMode ^ newFlightData.cmdsMode) != 0;
                    lightChanged |= (oldFlightData.altBits ^ newFlightData.altBits) != 0;

                    if (lightChanged)
                    {
                        raiseFlightDataLightsChanged(oldFlightData, newFlightData);
                    }
                }
            }

            oldFlightData = newFlightData;
        }