Esempio n. 1
0
        private void OnNavdataPacketAcquired(NavigationPacket packet)
        {
            if (NavigationPacketAcquired != null)
                NavigationPacketAcquired(packet);

            UpdateNavigationData(packet);
        }
        private void MessageReceived(DatagramSocket socket, DatagramSocketMessageReceivedEventArgs eventArguments)
        {
            DataReader reader;

            try
            {
                reader = eventArguments.GetDataReader();
            }
            catch (Exception ex)
            {
                Debug.WriteLine("MessageReceived:" + ex);
                return;
            }
            uint dataLength = reader.UnconsumedBufferLength;

            byte[] data = new byte[dataLength];
            reader.ReadBytes(data);

            var packet = new NavigationPacket
            {
                Timestamp = DateTime.UtcNow.Ticks,
                Data      = data
            };

            UpdateNavigationData(packet);

            _TimeoutStopWatch.Restart();
        }
Esempio n. 3
0
        private void UpdateNavigationData(NavigationPacket packet)
        {
            NavigationData navigationData;

            if (TryParseNavigationPacket(ref packet, out navigationData))
            {
                _DroneClient.NavigationData = navigationData;
                _DroneClient.NavigationDataViewModel.Update(navigationData);
                if (navigationData.Masks.HasFlag(def_ardrone_state_mask_t.ARDRONE_COM_WATCHDOG_MASK))
                {
                    _DroneClient.PostCommand(Command.Watchdog());
                }

                if (navigationData.Masks.HasFlag(def_ardrone_state_mask_t.ARDRONE_COMMAND_MASK))
                {
                    if (consecutiveCommandMask >= 5)
                    {
                        _DroneClient.FlushConfigCommands();
                        consecutiveCommandMask = 0;
                    }
                    else
                    {
                        consecutiveCommandMask++;
                    }
                }
                else
                {
                    consecutiveCommandMask = 0;
                }
                //TODO gérer les autres MASKS (LOW Battery, Too much wind) pour la gestion d'alertes
            }
        }
        public static unsafe bool TryParse(ref NavigationPacket packet, out NavdataBag navigationData)
        {
            byte[] data = packet.Data;
            navigationData = new NavdataBag();

            if (data.Length < sizeof(navdata_t))
                return(false);

            fixed(byte *pData = &data[0])
            {
                navdata_t navdata = *(navdata_t *)pData;

                if (navdata.header == NavdataHeader)
                {
                    navigationData.ardrone_state = navdata.ardrone_state;

                    int offset = sizeof(navdata_t);
                    while (offset < data.Length)
                    {
                        var option = (navdata_option_t *)(pData + offset);
                        ProcessOption(option, ref navigationData);
                        offset += option->size;
                    }
                    uint dataCheckSum = CalculateChecksum(data);
                    if (navigationData.cks.cks == dataCheckSum)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Esempio n. 5
0
        public static unsafe bool TryParse(ref NavigationPacket packet, out NavdataBag navigationData)
        {
            byte[] data = packet.Data;
            navigationData = new NavdataBag();

            if (data.Length < sizeof (navdata_t))
                return false;

            fixed (byte* pData = &data[0])
            {
                navdata_t navdata = *(navdata_t*) pData;
                if (navdata.header == NavdataHeader)
                {
                    navigationData.ardrone_state = navdata.ardrone_state;

                    int offset = sizeof (navdata_t);
                    while (offset < data.Length)
                    {
                        var option = (navdata_option_t*) (pData + offset);
                        ProcessOption(option, ref navigationData);
                        offset += option->size;
                    }
                    uint dataCheckSum = CalculateChecksum(data);
                    if (navigationData.cks.cks == dataCheckSum)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
        /// <summary>
        /// 线程解析数据
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        protected override void Loop(CancellationToken token)
        {
            //创立文件流
            using (var stream = new FileStream(_path, FileMode.Open))
                //创立包解析类
                using (var reader = new PacketReader(stream))
                {
                    while (stream.Position < stream.Length && token.IsCancellationRequested == false)
                    {
                        PacketType packetType = reader.ReadPacketType();
                        switch (packetType)
                        {
                        case PacketType.Navigation:
                            NavigationPacket navigationPacket = reader.ReadNavigationPacket();
                            _navigationPacketAcquired(navigationPacket);
                            break;

                        case PacketType.Video:
                            VideoPacket videoPacket = reader.ReadVideoPacket();
                            _videoPacketAcquired(videoPacket);
                            break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }
                    }
                }
            if (OnFileEnd != null)
            {
                OnFileEnd();
            }
        }
        protected override void Loop(CancellationToken token)
        {
            using (var udpClient = new UdpClient(NavdataPort))
            {
                udpClient.Connect(_configuration.DroneHostname, NavdataPort);

                SendKeepAliveSignal(udpClient);

                var       droneEp          = new IPEndPoint(IPAddress.Any, NavdataPort);
                Stopwatch swKeepAlive      = Stopwatch.StartNew();
                Stopwatch swNavdataTimeout = Stopwatch.StartNew();
                while (token.IsCancellationRequested == false &&
                       swNavdataTimeout.ElapsedMilliseconds < NavdataTimeout)
                {
                    if (udpClient.Available > 0)
                    {
                        byte[] data   = udpClient.Receive(ref droneEp);
                        var    packet = new NavigationPacket
                        {
                            Timestamp = DateTime.UtcNow.Ticks,
                            Data      = data
                        };
                        _navigationPacketAcquired(packet);
                        swNavdataTimeout.Restart();
                    }

                    if (swKeepAlive.ElapsedMilliseconds > KeepAliveTimeout)
                    {
                        SendKeepAliveSignal(udpClient);
                        swKeepAlive.Restart();
                    }
                    Thread.Sleep(5);
                }
            }
        }
        private void OnNavigationPacketAcquired(NavigationPacket packet)
        {
            if (_packetRecorderWorker != null && _packetRecorderWorker.IsAlive)
            {
                _packetRecorderWorker.EnqueuePacket(packet);
            }

            _navigationPacket = packet;
        }
Esempio n. 9
0
 /// <summary>
 /// 写导航数据文件
 /// NavigationData
 /// </summary>
 /// <param name="navigationPacket"></param>
 /// <param name="navigationData"></param>
 /// <returns></returns>
 private void Write(NavigationPacket navigationPacket, NavigationData navigationData)
 {
     //_navigationDataWriter.WriteLine(navigationPacket.Timestamp + " " + navigationData.Yaw
     //         + " " + navigationData.Pitch + " " + navigationData.Roll + " " + navigationData.Altitude
     //         + " " + navigationData.Velocity.X + " " + navigationData.Velocity.Y + " " + navigationData.Velocity.Z);
     _navigationDataWriter.WriteLine(navigationData.GPS.latitude + " " + navigationData.GPS.longitude + " " +
                                     navigationData.GPS.latFuse + " " + navigationData.GPS.lonFuse);
     _navigationDataWriter.Flush();
 }
Esempio n. 10
0
        private void OnNavdataPacketAcquired(NavigationPacket packet)
        {
            if (NavigationPacketAcquired != null)
            {
                NavigationPacketAcquired(packet);
            }

            UpdateNavigationData(packet);
        }
Esempio n. 11
0
        protected override void Loop(CancellationToken token)
        {
            _isAcquiring = false;
            using (var udpClient = new UdpClient(NavdataPort))
                try
                {
                    udpClient.Connect(_configuration.DroneHostname, NavdataPort);

                    SendKeepAliveSignal(udpClient);

                    var       remoteEp         = new IPEndPoint(IPAddress.Any, NavdataPort);
                    Stopwatch swKeepAlive      = Stopwatch.StartNew();
                    Stopwatch swNavdataTimeout = Stopwatch.StartNew();
                    while (token.IsCancellationRequested == false &&
                           swNavdataTimeout.ElapsedMilliseconds < NavdataTimeout)
                    {
                        if (udpClient.Available == 0)
                        {
                            Thread.Sleep(1);
                        }
                        else
                        {
                            byte[] data   = udpClient.Receive(ref remoteEp);
                            var    packet = new NavigationPacket
                            {
                                Timestamp = DateTime.UtcNow.Ticks,
                                Data      = data
                            };

                            swNavdataTimeout.Restart();

                            _isAcquiring = true;
                            _onAcquisitionStarted();

                            _packetAcquired(packet);
                        }

                        if (swKeepAlive.ElapsedMilliseconds > KeepAliveTimeout)
                        {
                            SendKeepAliveSignal(udpClient);
                            swKeepAlive.Restart();
                        }
                    }
                }
                catch (Exception e)
                {
                }
            finally
            {
                if (_isAcquiring)
                {
                    _isAcquiring = false;
                    _onAcquisitionStopped();
                }
            }
        }
Esempio n. 12
0
        private void OnNavigationPacketAcquired(NavigationPacket packet)
        {
            if (_navigationData.State == NavigationState.Unknown)
                _requestedState = RequestedState.Initialize;

            if (NavigationPacketAcquired != null)
                NavigationPacketAcquired(packet);

            UpdateNavigationData(packet);
        }
        public NavigationPacket ReadNavigationPacket()
        {
            var packet = new NavigationPacket();

            packet.Timestamp = ReadInt64();
            int dataSize = ReadInt32();

            packet.Data = ReadBytes(dataSize);
            return(packet);
        }
Esempio n. 14
0
        public static void OnNavigationPacketAcquired(NavigationPacket packet)
        {
            //check if the worker is valid then send the nav packet to the worker.
            if (_packetRecorderWorker != null && _packetRecorderWorker.IsAlive)
            {
                _packetRecorderWorker.EnqueuePacket(packet);
            }

            _navigationPacket = packet;
        }
        public static NavigationPacket ReadNavigationPacket(BinaryReader reader)
        {
            var packet = new NavigationPacket();

            packet.Timestamp = reader.ReadInt64();
            int dataSize = reader.ReadInt32();

            packet.Data = reader.ReadBytes(dataSize);
            return(packet);
        }
 public static bool TryParse(ref NavigationPacket packet, out NavigationData navigationData)
 {
     navigationData = new NavigationData();
     NavdataBag navdataBag;
     if (NavdataBagParser.TryParse(ref packet, out navdataBag))
     {
         navigationData = NavdataConverter.ToNavigationData(navdataBag);
         return true;
     }
     return false;
 }
Esempio n. 17
0
        protected override void Loop(CancellationToken token)
        {
            _isAcquiring = false;
            using (var udpClient = new UdpClient(NavdataPort))
                try
                {
                    udpClient.Connect(_configuration.DroneHostname, NavdataPort);

                    SendKeepAliveSignal(udpClient);

                    var remoteEp = new IPEndPoint(IPAddress.Any, NavdataPort);
                    Stopwatch swKeepAlive = Stopwatch.StartNew();
                    Stopwatch swNavdataTimeout = Stopwatch.StartNew();
                    while (token.IsCancellationRequested == false && swNavdataTimeout.ElapsedMilliseconds < NavdataTimeout)
                    {
                        if (udpClient.Available == 0)
                        {
                            Thread.Sleep(1);
                        }
                        else
                        {
                            byte[] data = udpClient.Receive(ref remoteEp);
                            var packet = new NavigationPacket
                                {
                                    Timestamp = DateTime.UtcNow.Ticks,
                                    Data = data
                                };

                            swNavdataTimeout.Reset();
                            swNavdataTimeout.Start();

                            _isAcquiring = true;
                            _onAcquisitionStarted();

                            _packetAcquired(packet);
                        }

                        if (swKeepAlive.ElapsedMilliseconds > KeepAliveTimeout)
                        {
                            SendKeepAliveSignal(udpClient);
                            swKeepAlive.Reset();
                            swKeepAlive.Start();
                        }
                    }
                }
                finally
                {
                    if (_isAcquiring)
                    {
                        _isAcquiring = false;
                        _onAcquisitionStopped();
                    }
                }
        }
        public static bool TryParse(ref NavigationPacket packet, out NavigationData navigationData)
        {
            navigationData = new NavigationData();
            NavdataBag navdataBag;

            if (NavdataBagParser.TryParse(ref packet, out navdataBag))
            {
                navigationData = NavdataConverter.ToNavigationData(navdataBag);
                return(true);
            }
            return(false);
        }
Esempio n. 19
0
        private void UpdateNavigationData(NavigationPacket packet)
        {
            NavigationData navigationData;
            if (NavigationPacketParser.TryParse(ref packet, out navigationData))
            {
                OnNavigationDataAcquired(navigationData);

                _navigationData = navigationData;

                ProcessStateTransitions(navigationData.State);
            }
        }
Esempio n. 20
0
        private void UpdateNavigationData(NavigationPacket packet)
        {
            NavigationData navigationData;

            if (NavigationPacketParser.TryParse(ref packet, out navigationData))
            {
                OnNavigationDataAcquired(navigationData);

                _navigationData = navigationData;

                ProcessStateTransitions(navigationData.State);
            }
        }
Esempio n. 21
0
 private void OnNavigationPacketAcquired(NavigationPacket obj)
 {
     if (_fileWriter != null && _isWriter)
     {
         _fileWriter.EnqueuePacket(obj);
     }
     if (_isWriter)
     {
         _totalWriteStream.WriteLine("**Nav**");
         _totalWriteStream.WriteLine("Nav:" + obj.Timestamp);
         _totalWriteStream.WriteLine();
         // _totalWriteStream.Flush();
     }
 }
Esempio n. 22
0
        private void OnNavigationPacketAcquired(NavigationPacket packet)
        {
            if (_navigationData.State == NavigationState.Unknown)
            {
                _requestedState = RequestedState.Initialize;
            }

            if (NavigationPacketAcquired != null)
            {
                NavigationPacketAcquired(packet);
            }

            UpdateNavigationData(packet);
        }
Esempio n. 23
0
        /// <summary>
        /// 写导航数据文件
        /// NavgationBag
        /// </summary>
        /// <param name="navigationPacket"></param>
        /// <returns></returns>
        private void Write(NavigationPacket navigationPacket)
        {
            using (FileStream navFileStream = new FileStream(_navdataDir + @"/" + navigationPacket.Timestamp + ".nav", FileMode.OpenOrCreate))
            {
                using (StreamWriter navWriter = new StreamWriter(navFileStream))
                {
                    NavdataBag navdataBag;

                    if (navigationPacket.Data != null && NavdataBagParser.TryParse(ref navigationPacket, out navdataBag))
                    {
                        DumpBranch(navWriter, navdataBag);
                    }
                }
            }
        }
Esempio n. 24
0
        private void UpdateNavigationData(NavigationPacket packet)
        {
            NavigationData navigationData;

            if (NavigationPacketParser.TryParse(ref packet, out navigationData))
            {
                _navigationData = navigationData;

                ProcessRequestedState();

                if (NavigationDataUpdated != null)
                {
                    NavigationDataUpdated(_navigationData);
                }
            }
        }
Esempio n. 25
0
        /// <summary>
        /// This method will handle every packet that's coming from the drone.
        /// </summary>
        /// <param name="packet"></param>
        private void OnNavigationPacketAcquired(NavigationPacket packet)
        {
            _navigationPacket = packet;

            if (_navigationData != null)
            {
                if (!File.Exists("log.txt"))
                {
                    File.Create("log.txt");
                    Console.WriteLine("No file");
                }
                else
                {
                    File.AppendAllText("log.txt", _navigationData.ToString());
                }
            }
            else
            {
                Console.WriteLine("No navigation data");
            }
        }
Esempio n. 26
0
        private void UpdateNavigationData(NavigationPacket packet)
        {
            NavigationData navigationData;
            if (NavigationPacketParser.TryParse(ref packet, out navigationData))
            {
                _navigationData = navigationData;

                ProcessRequestedState();

                if (NavigationDataUpdated != null)
                    NavigationDataUpdated(_navigationData);
            }
        }
Esempio n. 27
0
 private void OnNavigationPacketAcquired(NavigationPacket obj)
 {
     // do nothing
 }
 public static void WriteNavigationPacket(BinaryWriter writer, NavigationPacket packet)
 {
     writer.Write(packet.Timestamp);
     writer.Write(packet.Data.Length);
     writer.Write(packet.Data);
 }
        /// <summary>
        /// 线程
        /// 用来与飞机通讯获取数据
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        protected override void Loop(CancellationToken token)
        {
            _isAcquiring = false;
            //新建UDP客户端端口

            //using (var udpClient = new UdpClient(NavdataPort))
            //测试不绑定本地端口 有一个会看不到导航数据
            using (var udpClient = new UdpClient())
                try
                {
                    //与飞机连接
                    udpClient.Connect(_configuration.DroneHostname, NavdataPort);

                    //发数据确认连接可行
                    SendKeepAliveSignal(udpClient);
                    //接收任何ip传入NavdataPort的数据
                    //var remoteEp = new IPEndPoint(IPAddress.Any, NavdataPort);
                    //只接受固定ip
                    var remoteEp = new IPEndPoint(IPAddress.Parse(_configuration.DroneHostname), NavdataPort);

                    //定位超时时间的变量
                    Stopwatch swKeepAlive      = Stopwatch.StartNew();
                    Stopwatch swNavdataTimeout = Stopwatch.StartNew();
                    while (token.IsCancellationRequested == false && swNavdataTimeout.ElapsedMilliseconds < NavdataTimeout)
                    {
                        //udp客户端不可以使用时让线程休眠
                        if (udpClient.Available == 0)
                        {
                            Thread.Sleep(1);
                        }
                        else
                        {
                            //接收数据,阻塞式
                            byte[] data = udpClient.Receive(ref remoteEp);
                            //创建新的packet
                            var packet = new NavigationPacket
                            {
                                Timestamp = DateTime.UtcNow.Ticks,
                                Data      = data
                            };
                            //重启超时计时器
                            swNavdataTimeout.Restart();

                            //设置正在获取状态为真
                            _isAcquiring = true;
                            _onAcquisitionStarted();

                            //发送以获取到的包
                            _packetAcquired(packet);
                        }

                        if (swKeepAlive.ElapsedMilliseconds > KeepAliveTimeout)
                        {
                            SendKeepAliveSignal(udpClient);
                            swKeepAlive.Restart();
                        }
                    }
                }
                finally
                {
                    //若之前状态为正在获取
                    //就将其关闭,并发送事件
                    if (_isAcquiring)
                    {
                        _isAcquiring = false;
                        _onAcquisitionStopped();
                    }
                }
        }
 public void Write(NavigationPacket packet)
 {
     Write(packet.Timestamp);
     Write(packet.Data.Length);
     Write(packet.Data);
 }
Esempio n. 31
0
 public void EnqueuePacket(NavigationPacket packet)
 {
     _packetQueue.Enqueue(packet);
 }