예제 #1
0
 public MissionClient(IMavlinkV2Connection mavlink, MavlinkClientIdentity identity, IPacketSequenceCalculator seq, MissionClientConfig config) : base(mavlink, identity, seq, "MISSION")
 {
     _config         = config;
     _missionCurrent = new RxValue <ushort>().DisposeItWith(Disposable);
     _missionReached = new RxValue <ushort>().DisposeItWith(Disposable);
     mavlink.FilterVehicle(identity).Filter <MissionCurrentPacket>().Select(_ => _.Payload.Seq).Subscribe(_missionCurrent)
     .DisposeItWith(Disposable);
     mavlink.FilterVehicle(identity).Filter <MissionItemReachedPacket>().Select(_ => _.Payload.Seq).Subscribe(_missionReached)
     .DisposeItWith(Disposable);
 }
예제 #2
0
        public HeartbeatClient(IMavlinkV2Connection connection, MavlinkClientIdentity config, int heartBeatTimeoutMs = 2000)
        {
            _heartBeatTimeoutMs = heartBeatTimeoutMs;
            connection
            .FilterVehicle(config)
            .Select(_ => _.Sequence)
            .Subscribe(_ =>
            {
                Interlocked.Exchange(ref _lastPacketId, _);
                Interlocked.Increment(ref _packetCounter);
            }, _disposeCancel.Token);


            connection
            .FilterVehicle(config)
            .Where(_ => _.MessageId == HeartbeatPacket.PacketMessageId)
            .Cast <HeartbeatPacket>()
            .Select(_ => _.Payload)
            .Subscribe(_heartBeat);
            _disposeCancel.Token.Register(() => _heartBeat.Dispose());

            connection
            .FilterVehicle(config)
            .Select(_ => 1)
            .Buffer(TimeSpan.FromSeconds(1))
            .Select(_ => _.Sum()).Subscribe(_packetRate, _disposeCancel.Token);
            _disposeCancel.Token.Register(() => _packetRate.Dispose());

            Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)).Subscribe(CheckConnection, _disposeCancel.Token);
            RawHeartbeat.Subscribe(_ =>
            {
                if (_disposeCancel.IsCancellationRequested)
                {
                    return;
                }
                _lastHeartbeat = DateTime.Now;
                _link.Upgrade();
                CalculateLinqQuality();
            }, _disposeCancel.Token);
            _disposeCancel.Token.Register(() => _link.Dispose());
        }
예제 #3
0
        public MavlinkTelemetry(IMavlinkV2Connection connection, MavlinkClientIdentity config)
        {
            _config       = config;
            _connection   = connection;
            _inputPackets = connection.FilterVehicle(config);

            HandleSystemStatus();
            HandleGps();
            HandleHighresImu();
            HandleVfrHud();
            HandleAttitude();
            HandleBatteryStatus();
            HandleAltitude();
            HandleExtendedSysState();
            HandleHome();
            HandleGlobalPositionInt();
            HandleRadioStatus();
        }
예제 #4
0
        public LoggingClient(IMavlinkV2Connection connection, MavlinkClientIdentity identity)
        {
            if (connection == null)
            {
                throw new ArgumentNullException(nameof(connection));
            }
            if (identity == null)
            {
                throw new ArgumentNullException(nameof(identity));
            }

            connection
            .FilterVehicle(identity)
            .Where(_ => _.MessageId == LoggingDataPacket.PacketMessageId)
            .Cast <LoggingDataPacket>()
            .Where(_ => _.Payload.TargetSystem == identity.SystemId && _.Payload.TargetComponent == identity.ComponentId)
            .Select(_ => _.Payload)
            .Subscribe(_loggingData, _disposeCancel.Token);

            _disposeCancel.Token.Register(() => _loggingData.Dispose());
        }
예제 #5
0
        public DebugClient(IMavlinkV2Connection connection, MavlinkClientIdentity identity)
        {
            _identity = identity;
            var inputPackets = connection.FilterVehicle(identity);

            inputPackets
            .Where(_ => _.MessageId == NamedValueFloatPacket.PacketMessageId)
            .Cast <NamedValueFloatPacket>()
            .Select(_ => new KeyValuePair <string, float>(ConvertToKey(_.Payload.Name), _.Payload.Value))
            .Subscribe(_onFloatSubject, _disposeCancel.Token);

            _disposeCancel.Token.Register(() =>
            {
                _onFloatSubject.OnCompleted();
                _onFloatSubject.Dispose();
            });

            inputPackets
            .Where(_ => _.MessageId == NamedValueIntPacket.PacketMessageId)
            .Cast <NamedValueIntPacket>()
            .Select(_ => new KeyValuePair <string, int>(ConvertToKey(_.Payload.Name), _.Payload.Value))
            .Subscribe(_onIntSubject, _disposeCancel.Token);

            _disposeCancel.Token.Register(() =>
            {
                _onIntSubject.OnCompleted();
                _onIntSubject.Dispose();
            });

            inputPackets
            .Where(_ => _.MessageId == DebugFloatArrayPacket.PacketMessageId)
            .Cast <DebugFloatArrayPacket>()
            .Select(_ => _.Payload)
            .Subscribe(_debugFloatArray, _disposeCancel.Token);
            _disposeCancel.Token.Register(() => _debugFloatArray.Dispose());
        }