private void _SetFlightMapData()
        {
            //Create Flight Map Data records
            _FlightMapData = new FlightMapData {
                FlightID      = _FlightID,
                BBFlightID    = _BBFlightID.ToString(),
                CreatedTime   = DateTime.UtcNow,
                DroneId       = _DroneID,
                ReadTime      = _ReadTime,
                ReceivedTime  = _DroneData.CreatedTime,
                Distance      = 0,
                PointDistance = 0,
                IsChecked     = true,
                IsSoftFence   = 0,
                IsOutSide     = true,

                //Initilize these values, but calculate at end of flight only
                Min_Altitude   = 0,
                Max_Altitude   = 0,
                avg_Altitude   = 0,
                Min_Satellites = 0,
                Max_Satellites = 0,
                Avg_Satellites = 0,
                Min_Speed      = 0,
                Max_Speed      = 0,
                Avg_Speed      = 0,


                //Unused, Just initilize
                DroneRFID       = String.Empty,
                GCAID           = 0,
                IsActive        = true,
                IsAdsbProcessed = false,
                OtherFlightIDs  = String.Empty,
                ProductId       = 0,
                ProductQrCode   = String.Empty,
                ProductRFID     = String.Empty,
                ProductRSSI     = String.Empty,
                RecordType      = 0,

                //Parse it from Drone Data
                Altitude        = ToDecimal(_DroneData.Altitude, 100m, true),
                FixQuality      = ToDecimal(_DroneData.FixQuality),
                Heading         = Math.Abs(ToDecimal(_DroneData.Heading, 100m)),
                Latitude        = ToDecimal(_DroneData.Latitude, 1000000m),
                Longitude       = ToDecimal(_DroneData.Longitude, 1000000m),
                Roll            = ToDecimal(_DroneData.Roll, 100m),
                Pitch           = ToDecimal(_DroneData.Pitch, 100m),
                Satellites      = ToInt32(_DroneData.Satellites),
                Speed           = Math.Abs(ToDecimal(_DroneData.Speed, 100m, true)),
                voltage         = ToDecimal(_DroneData.Voltage, 100m),
                TotalFlightTime = 0
            };

            /*
             * if (_FlightMapData.Altitude < _MinFieldValue)
             * _FlightMapData.Altitude = 0;
             * if (_FlightMapData.Speed < _MinFieldValue)
             * _FlightMapData.Speed = 0;
             */
        }
Exemple #2
0
        public ActionResult Info(int ID, Int64 lastdataid = 0)
        {
            var          flightmapdatas = db.FlightMapDatas.Where(x => x.FlightID == ID && (x.Altitude > 0 || x.Speed > 0) && x.FlightMapDataID > lastdataid).OrderBy(x => x.FlightMapDataID).ToList();
            int          count          = flightmapdatas.Count();
            MemoryStream ms             = new MemoryStream();
            var          outputStream   = new StreamWriter(ms);
            var          cesiumWriter   = new CesiumStreamWriter();
            var          output         = new CesiumOutputStream(outputStream)
            {
                // Since this is a demo, turning on PrettyFormatting makes the response easier to view
                // with web browser developer tools.  It just adds whitespace and newlines to the response,
                // so production environments would typically leave this turned off.
                PrettyFormatting = true
            };

            if (count > 0)
            {
                // The whole body of CZML must be wrapped in a JSON array, opened here.
                output.WriteStartSequence();

                FlightMapData firstItem = db.FlightMapDatas.Where(x => x.FlightID == ID && (x.Altitude > 0 || x.Speed > 0)).OrderBy(x => x.FlightMapDataID).ToList().Take(1).FirstOrDefault();

                FlightMapData       LastItem  = db.FlightMapDatas.Where(x => x.FlightID == ID && (x.Altitude > 0 || x.Speed > 0)).OrderBy(x => x.FlightMapDataID).ToList().LastOrDefault();
                JulianDate          StartTime = new JulianDate(firstItem.ReadTime.Value);
                JulianDate          EndTime   = new JulianDate(LastItem.ReadTime.Value);
                string              curFile   = @"C:\Cesium\test.czml";
                FileInfo            info      = new FileInfo(curFile);
                List <Cartographic> pList     = new List <Cartographic>();
                List <JulianDate>   JList     = new List <JulianDate>();
                List <Double>       HList     = new List <Double>();
                List <Double>       PList     = new List <Double>();
                List <Double>       RList     = new List <Double>();



                // The first packet (JSON object) of CZML must be the document packet.
                using (var entity = cesiumWriter.OpenPacket(output))
                {
                    entity.WriteId("document");
                    entity.WriteVersion("1.0");
                    using (var clock = entity.OpenClockProperty())
                    {
                        clock.WriteInterval(new TimeInterval(StartTime, EndTime));
                        if (lastdataid == 0)
                        {
                            clock.WriteCurrentTime(StartTime);
                        }
                        else
                        {
                            clock.WriteCurrentTime(EndTime);
                        }

                        clock.WriteMultiplier(2);
                        clock.WriteStep(ClockStep.SystemClockMultiplier);
                    }
                    //}
                }
                // Open a new CZML packet for each point.
                using (var entity = cesiumWriter.OpenPacket(output))
                {
                    entity.WriteId("Aircraft");
                    entity.WriteVersion("1.0");

                    entity.WriteAvailability(new TimeInterval(StartTime, EndTime));



                    using (var path = entity.OpenPathProperty())
                    {
                        using (var show = path.OpenShowProperty())
                        {
                            //if(lastdataid==0)
                            // show.WriteInterval(new TimeInterval(StartTime, EndTime));

                            show.WriteBoolean(true);
                        }

                        path.WriteWidthProperty(2);
                        using (var material = path.OpenMaterialProperty())
                        {
                            using (var sol = material.OpenSolidColorProperty())
                            {
                                sol.WriteColorProperty(0, 255, 255, 255);
                            }
                        }
                        path.WriteResolutionProperty(1200);
                    }



                    using (var position = entity.OpenPositionProperty())
                    {
                        foreach (FlightMapData fmp in flightmapdatas)
                        {
                            double       lat = Convert.ToDouble(fmp.Latitude);
                            double       lon = Convert.ToDouble(fmp.Longitude);
                            double       alt = Convert.ToDouble(fmp.Altitude);
                            Cartographic nC  = new Cartographic(lon, lat, alt);
                            pList.Add(nC);
                            JulianDate jd = new JulianDate(fmp.ReadTime.Value);
                            JList.Add(jd);
                            var heading = Convert.ToDouble(fmp.Heading);
                            HList.Add(heading);
                            var pitch = Convert.ToDouble(fmp.Pitch);
                            PList.Add(pitch);

                            var roll = Convert.ToDouble(fmp.Roll);
                            RList.Add(roll);
                        }
                        position.WriteCartographicDegrees(JList, pList);
                    }
                }

                // Now we generate some sample points and send them down.
                // Close the JSON array that wraps the entire CZML document.

                using (var entity = cesiumWriter.OpenPacket(output))
                {
                    entity.WriteId("Custom");
                    entity.WriteVersion("1.0");
                    entity.WriteAvailability(new TimeInterval(StartTime, EndTime));
                    var custom = entity.OpenPropertiesProperty();
                    CustomPropertyCesiumWriter newpro = custom.OpenCustomPropertyProperty("heading");
                    newpro.AsNumber();
                    newpro.WriteNumber(JList, HList);
                    newpro.Close();

                    CustomPropertyCesiumWriter newroll = custom.OpenCustomPropertyProperty("roll");
                    newroll.AsNumber();

                    newroll.WriteNumber(JList, RList);
                    newroll.Close();
                    CustomPropertyCesiumWriter newpitch = custom.OpenCustomPropertyProperty("pitch");                    // newpitch.Open(output);
                    newpitch.AsNumber();

                    newpitch.WriteNumber(JList, PList);
                    newpitch.Close();
                    CustomPropertyCesiumWriter LastDataID = custom.OpenCustomPropertyProperty("lastdataid");

                    LastDataID.AsNumber();

                    LastDataID.WriteNumber(LastItem.FlightMapDataID);
                    LastDataID.Close();
                    custom.Close();
                }

                output.WriteEndSequence();

                //ms.Position = 0;

                //ms.Seek(0, SeekOrigin.Begin);
                outputStream.Flush();

                // }
            }

            ms.Seek(0, SeekOrigin.Begin);
            return(File(ms, "application/json"));
        }
        public bool ProcessDroneData()
        {
            GPSPoint ThisPosition = new GPSPoint((float)_FlightMapData.Latitude, (float)_FlightMapData.Longitude);

            LastUpdatedOn = DateTime.Now;

            if (_LastFlightMapData != null)
            {
                //Fix sudden change in heading
                Double ChangeInHeading = (Double)_LastFlightMapData.Heading - (Double)_FlightMapData.Heading;
                if (ChangeInHeading > 20 || ChangeInHeading < -20)
                {
                    if (_LastFlightMapData.Heading > 340 && _FlightMapData.Heading < 10)
                    {
                        //then we leave it to rotate
                    }
                    else
                    {
                        _FlightMapData.Heading = _LastFlightMapData.Heading + (ChangeInHeading > 0 ? 1 : -1) * 20;
                        if (_FlightMapData.Heading > 360)
                        {
                            _FlightMapData.Heading = _FlightMapData.Heading - 360;
                        }
                        if (_FlightMapData.Heading < 0)
                        {
                            _FlightMapData.Heading = -1 * _FlightMapData.Heading;
                        }
                    }
                }

                if (_FlightMapData.Altitude >= _MinFieldValue || _FlightMapData.Speed >= _MinFieldValue)
                {
                    DateTime StartTime = (DateTime)(_LastFlightMapData.ReadTime);
                    DateTime EndTime   = (DateTime)(_FlightMapData.ReadTime);
                    _TotalFlightTime += (Decimal)Math.Abs(EndTime.Subtract(StartTime).TotalSeconds);

                    //Distance between Last point and this point
                    GPSPoint LastLocation = new GPSPoint((float)_LastFlightMapData.Latitude, (float)_LastFlightMapData.Longitude);
                    _FlightMapData.PointDistance = (Decimal)GPSCalc.GetDistance(ThisPosition, LastLocation);
                    _TotalDistance += (Decimal)_FlightMapData.PointDistance;
                }
            }

            SatelliteSummary.AddTo((Double)_FlightMapData.Satellites);
            SpeedSummary.AddTo((Double)_FlightMapData.Speed);
            AltitudeSummary.AddTo((Double)_FlightMapData.Altitude);

            _FlightMapData.TotalFlightTime = _TotalFlightTime;
            _FlightMapData.Distance        = _TotalDistance;

            _FlightMapData.avg_Altitude   = (Decimal)AltitudeSummary.Avg;
            _FlightMapData.Max_Altitude   = (Decimal)AltitudeSummary.Max;
            _FlightMapData.Min_Altitude   = (Decimal)AltitudeSummary.Min;
            _FlightMapData.Avg_Satellites = (Decimal)SatelliteSummary.Avg;
            _FlightMapData.Max_Satellites = (Decimal)SatelliteSummary.Max;
            _FlightMapData.Min_Satellites = (Decimal)SatelliteSummary.Min;
            _FlightMapData.Avg_Speed      = (Decimal)SpeedSummary.Avg;
            _FlightMapData.Max_Speed      = (Decimal)SpeedSummary.Max;
            _FlightMapData.Min_Speed      = (Decimal)SpeedSummary.Min;


            _DroneFlight.Longitude         = _FlightMapData.Longitude;
            _DroneFlight.Latitude          = _FlightMapData.Latitude;
            _ExtDroneFlight.Altitude       = (Double)_FlightMapData.Altitude;
            _ExtDroneFlight.LastFlightDate = _ReadTime;

            //Save the last point for the reference
            _LastFlightMapData = Cloner <FlightMapData> .Clone(_FlightMapData);

            return(true);
        }