Ejemplo n.º 1
0
        // TODO: Verify that length of data (number of terms) is correct -> validate message
        // Parses data into a List
        public void ParseData(string InputString)
        {
            rawDataFile.WriteLine(InputString);

            if (InputString.Length < 2)
            {
                return;
            }

            // Divide data by each comma
            string[] DataString = InputString.Split(',');

            // Ensure that there are at least 2 data objects in the string
            if (DataString.Length < 2)
            {
                return;
            }

            // Initialize the start time (if necessary) and get the total seconds from the start time
            if (startTime > DateTime.Now)
            {
                startTime = DateTime.Now;
            }
            double dataSeconds = DateTime.Now.Subtract(startTime).TotalSeconds;

            // Checks for the "MX" tag. If no tag, we are not receiving data from MX vehicle
            if (!DataString[1].Equals("MX"))
            {
                Console.WriteLine("Not Reading MX");
            }

            // Checks for 'A', 'B', or 'C' messages. If none, sends an error message

            // 'A' message delivers time in milliseconds, barometric altitude (meters),
            //      airspeed, payload drop time, and payload drop altitude (meters)
            if (DataString[0].Equals("A"))
            {
                // A,MX,MILLIS,ALT_BARO,ANALOG_PITOT,PRESS,TEMP,DROP_TIME,DROP_ALT

                // Ignore data string if the lengths are not equal
                if (DataString.Length < A_MSG_LEN)
                {
                    return;
                }

                // Parse Data from String
                DataDefault inDefault = new DataDefault();
                inDefault.time_seconds = dataSeconds;
                inDefault.alt_bar_ft   = Convert.ToDouble(DataString[3]) * ConversionFactors.METERS_TO_FEET;
                int AnalogPitotValue = (int)Convert.ToDouble(DataString[4]);
                inDefault.pressure_pa   = Convert.ToDouble(DataString[5]);
                inDefault.temperature_c = Convert.ToDouble(DataString[6]);

                inDefault.dropTime_seconds = Convert.ToDouble(DataString[7]) * ConversionFactors.MILLIS_TO_SECONDS;
                inDefault.dropAlt_ft       = Convert.ToDouble(DataString[8]) * ConversionFactors.METERS_TO_FEET;

                // Calculate Airspeed from Analog Value
                inDefault.airspeed_ft_s = PitotLibrary.GetAirspeedFeetSeconds(AnalogPitotValue, inDefault.temperature_c, inDefault.pressure_pa);

                // Write Data to File
                dataFile.WriteLine(inDefault.ToString());

                // Add data object to data master list
                MainDataMaster.DefaultDataList.Add(inDefault);

                // Update the standard altitude plot and instruments
                panelAltitudePlot.UpdateAltitude(inDefault.time_seconds, inDefault.alt_bar_ft);
                //panelInstruments.UpdateInstruments(inDefault.airspeed_ft_s, inDefault.alt_bar_ft);
                //panelInstruments.UpdateInstrumentsAir(inDefault.alt_bar_ft);
                panelInstruments.UpdateInstrumentsAir(inDefault.airspeed_ft_s);
                //panelInstruments.UpdateInstrumentsAlt(inDefault.alt_bar_ft);

                // Check if a payload has been dropped
                if (!PayloadDropped && inDefault.dropTime_seconds > 0)
                {
                    panelDropStatus.UpdateDrop(inDefault.time_seconds, inDefault.alt_bar_ft);
                    panelAltitudePlot.UpdateAltitudeDrop(inDefault.time_seconds, inDefault.dropAlt_ft);

                    // Get the last GPS coordinate to plot drop on the GPS panel
                    // Sends aircraft and predicted drop GPS coordinates to DropPredictionStatus panel
                    //      -> Will not show if GPS list is empty, no GPS position information
                    int gpsCount = MainDataMaster.GpsDataList.Count;
                    if (gpsCount > 0)
                    {
                        DataGPS lastGpsData = MainDataMaster.GpsDataList[gpsCount - 1];
                        panelGPSPlot.UpdateLatLonDrop(lastGpsData.gps_lat, lastGpsData.gps_lon);

                        panelDropPredictionStatus.UpdatePlaneLatLon(lastGpsData.gps_lat, lastGpsData.gps_lon);

                        LatLng predictedLatLng = PredictPayloadDropLoc(lastGpsData);
                        if (predictedLatLng != null)
                        {
                            panelDropPredictionStatus.UpdatePredictLatLon(predictedLatLng.lat, predictedLatLng.lon);
                        }
                    }

                    // Set PayloadDropped to true
                    PayloadDropped = true;
                }
            }

            // 'B' message delivers time in milliseconds, the gps system, the gps latitude,
            //      the gps longitude, the gps measurement for groundspeed in knots,
            //        gps course (degrees), gps altitude (meters),
            //        gps hdop, and gps fixtime (milliseconds)
            //      Converts meters to feet, and knots to ft/s
            //      Divide some variables to restore proper values
            else if (DataString[0].Equals("B"))
            {
                // B,MX,MILLIS,GPS_SYSTEM,LAT,LON,GPS_SPEED,GPS_COURSE,GPS_ALT,GPS_HDOP

                // Ignore data string if the lengths are not equal
                if (DataString.Length < B_MSG_LEN)
                {
                    return;
                }

                // Parse GPS Data
                DataGPS gpsData = new DataGPS();
                gpsData.time_seconds   = dataSeconds;
                gpsData.gps_system     = DataString[3];
                gpsData.gps_lat        = (Convert.ToDouble(DataString[4])) / 1000000;                                 //degrees
                gpsData.gps_lon        = (Convert.ToDouble(DataString[5])) / 1000000;                                 //degrees
                gpsData.gps_speed_ft_s = ((Convert.ToDouble(DataString[6])) / 1000) * ConversionFactors.KNOTS_TO_FPS; //Converts Speed from Knots to ft/s
                gpsData.gps_course     = (Convert.ToDouble(DataString[7])) / 1000;                                    //degrees
                gpsData.gps_alt_ft     = ((Convert.ToDouble(DataString[8])) / 1000) * ConversionFactors.METERS_TO_FEET;
                gpsData.gps_hdop       = (Convert.ToDouble(DataString[9])) / 10;

                // Write data to file
                dataFile.WriteLine(gpsData.ToString());

                // Add data object to DataMaster
                MainDataMaster.GpsDataList.Add(gpsData);

                // Check if if latitude is within USA
                if (((gpsData.gps_lat >= 20) && (gpsData.gps_lat <= 50)) && ((gpsData.gps_lon <= -65) && (gpsData.gps_lon >= -127)))
                {
                    // Update GPS Panel with new location
                    panelGPSPlot.UpdateLatLon(gpsData.gps_lat, gpsData.gps_lon);

                    // Add tangent line between target and MX vehicle
                    if (TARGET_ON)
                    {
                        panelGPSPlot.UpdateLatLonTangent_Target(gpsData.gps_lat, gpsData.gps_lon, targetLocation.lat, targetLocation.lon);
                    }

                    // Update GPS altitude plot
                    //panelAltitudePlot.UpdateAltitudeGPS(gpsData.time_seconds, gpsData.gps_alt_ft);

                    // Predict payload drop location and display location on screen if it exists
                    LatLng predictedLatLng = PredictPayloadDropLoc(gpsData);
                    if (predictedLatLng != null)
                    {
                        panelGPSPlot.UpdateLatLonPredict(predictedLatLng.lat, predictedLatLng.lon);
                        panelGPSPlot.UpdateLatLonTangent_Predict(gpsData.gps_lat, gpsData.gps_lon, predictedLatLng.lat, predictedLatLng.lon);
                    }
                }
            }

            // 'C' message delivers gyro data. Gives time in milliseconds; x, y, and z gyro values;
            //      and x, y, and z acceleration values.
            //      Gyro in radians/s
            //      Acceleration in m/s^2
            else if (DataString[0].Equals("C"))
            {
                // C,MX,MILLIS,GYROX,GYROY,GYROZ,ACCELX,ACCELY,ACCELZ

                // Ignore data string if the lengths are not equal
                if (DataString.Length < C_MSG_LEN)
                {
                    return;
                }

                // Parse incoming data
                DataAccelGyro gyroData = new DataAccelGyro();
                gyroData.time_seconds = dataSeconds;
                gyroData.gyro_x       = Convert.ToDouble(DataString[3]);
                gyroData.gyro_y       = Convert.ToDouble(DataString[4]);
                gyroData.gyro_z       = Convert.ToDouble(DataString[5]);
                gyroData.accel_x      = Convert.ToDouble(DataString[6]);
                gyroData.accel_y      = Convert.ToDouble(DataString[7]);
                gyroData.accel_z      = Convert.ToDouble(DataString[8]);

                // Write data to file
                dataFile.WriteLine(gyroData.ToString());

                // Add data object to DataMaster
                MainDataMaster.GryoAccelDataList.Add(gyroData);
            }
            // 'D' message delivers extra data. As of 2017-2018, delivers additional altitude data
            else if (DataString[0].Equals("D"))
            {
                // D,MX,MILLIS,BAROALT

                // Ignore string if length is not equal
                if (DataString.Length < D_MSG_LEN)
                {
                    return;
                }

                //Parse incoming data
                DataD extraData = new DataD();
                extraData.time_seconds = dataSeconds;
                extraData.alt          = Convert.ToDouble(DataString[3]) * ConversionFactors.METERS_TO_FEET;

                // Write data to file
                dataFile.WriteLine(extraData.ToString());

                // Add data object to DataMaster
                MainDataMaster.DataDList.Add(extraData);

                // Update altitude plot with additional altitude
                panelAltitudePlot.UpdateAltitudeBarometer(extraData.time_seconds, extraData.alt);

                // Update altitude in instruments panel
                panelInstruments.UpdateInstrumentsAlt(extraData.alt);
            }
            else
            {
                // If unknown message, write information to console
                dataFile.WriteLine("Unknown Message: " + InputString);
            }
        }
Ejemplo n.º 2
0
 public void Dispose()
 {
     DataD.Dispose();
     BiasD.Dispose();
 }