protected virtual void InitArmed() { var timer = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)).Where(_ => IsArmed.Value).Subscribe(_ => { var lastBin = Interlocked.Read(ref _lastArmedTime); if (lastBin == 0) { _armedTime.OnNext(TimeSpan.Zero); return; } var last = DateTime.FromBinary(lastBin); var now = DateTime.Now; var delay = (now - last); _armedTime.OnNext(delay); }); _isArmed.DistinctUntilChanged().Where(_ => _isArmed.Value).Subscribe(_ => Interlocked.Exchange(ref _lastArmedTime, DateTime.Now.ToBinary()), DisposeCancel.Token); DisposeCancel.Token.Register(() => timer.Dispose()); _mavlink.Heartbeat.RawHeartbeat.Select(_ => _.BaseMode.HasFlag(MavModeFlag.MavModeFlagSafetyArmed)).Subscribe(_isArmed, DisposeCancel.Token); DisposeCancel.Token.Register(() => _isArmed.Dispose()); }