public override void SignalateDiagnosticEvent(DiagnosticEventData data)
        {
            _curDiagnosticEventData = data;
            if (data.Actived != _diagnosticActive)
            {
                if (_currentObserver != null)
                {
                    _currentObserver.Dispose();
                }
                if (!data.Actived)
                {
                    WithoutDiagnosticTimerObserver();
                }
                _diagnosticActive = data.Actived;
            }

            if (_seqDir != data.SequencePath)
            {
                _seqDir = data.SequencePath;
                LoadPhotoDistance();
            }

            if (_curDiagnosticEventData.CurrentState == DiagnosticState.Restart)
            {
                _absoluteDistance = 0;
                _distanceDataSource.OnNext(new DistanceData {
                    AbsoluteDistance = 0, ReferenceEncoderNumber = 1, AbsoluteLeftPulseCount = 0 * PulsePerMeter, AbsoluteRightPulseCount = 0 * PulsePerMeter
                });
            }
            else if (_curDiagnosticEventData.CurrentState == DiagnosticState.Next)
            {
                long last     = _absoluteDistance;
                long distance = GetDistance(1);

                if (last != 0 && distance != 0 && last / 100 != distance / 100 && distance != (distance / 100) * 100)
                {
                    _distanceDataSource.OnNext(new DistanceData {
                        AbsoluteDistance = (distance / 100) * 100, ReferenceEncoderNumber = 1, AbsoluteLeftPulseCount = distance * PulsePerMeter, AbsoluteRightPulseCount = distance * PulsePerMeter
                    });
                }

                _distanceDataSource.OnNext(new DistanceData {
                    AbsoluteDistance = distance, ReferenceEncoderNumber = 1, AbsoluteLeftPulseCount = distance * PulsePerMeter, AbsoluteRightPulseCount = distance * PulsePerMeter
                });
            }
            else if (_curDiagnosticEventData.CurrentState == DiagnosticState.Back)
            {
                long distance = GetDistance(-1);

                _distanceDataSource.OnNext(new DistanceData {
                    AbsoluteDistance = distance, ReferenceEncoderNumber = 1, AbsoluteLeftPulseCount = distance * PulsePerMeter, AbsoluteRightPulseCount = distance * PulsePerMeter
                });
            }
        }
Beispiel #2
0
        public static async Task IgnoreElementsWhileConvertingTest()
        {
            var input = new SubjectSlim <int>();

            var output = input
                         .IgnoreElementsWhileConverting(
                async i =>
            {
                await Task.Delay(75).ConfigureAwait(false);
                return(i * 1000);
            })
                         .Replay();

            using (output.Connect())
            {
                for (int i = 0; i < 10; i++)
                {
                    input.OnNext(i);
                    await Task.Delay(50).ConfigureAwait(false);
                }
                input.OnCompleted();

                Assert.That(output.ToEnumerable(), Is.EqualTo(new[] { 0, 2000, 4000, 6000, 8000 }));
            }
        }
Beispiel #3
0
        public Task Initialize(Func <Task <bool> > before = null, Func <Task> after = null)
        {
            ValidateConfiguration();

            return(MakeStateTransition(ProviderState.Created, ProviderState.Initializing, ProviderState.Initialized,
                                       () => InitializeCore().ContinueWith(
                                           t =>
            {
                _rawDataSource = CreateDataSource(t.Result);

                if (_rawDataSource != null)
                {
                    _rawDataSourceObserver = _rawDataSource.Subscribe(
                        data => _dataSourceProxySubject.OnNext(data),
                        error =>
                    {
                        _dataSourceProxySubject.OnError(error);
                        Log.Error().Exception(error).Write();
                        _providerStateSubject.OnNext(ProviderState.Failed);
                    });
                }

                return t.Result;
            }, TaskContinuationOptions.OnlyOnRanToCompletion),
                                       before, after));
        }
        protected void TrackDependencyOperationalState <TAgent>(bool isMandatory = true, bool canFailover = true)
            where TAgent : IOperationalAgent
        {
            lock (_dependencies)
            {
                var dependency = new AgentDependency(isMandatory);
                _dependencies[typeof(TAgent)] = dependency;

                IObservable <Tuple <AgentInformation, OperationalAgentStates> > obs;
                if (canFailover)
                {
                    obs = AgentBroker.Instance.ObserveAnyWithAgentInfo <TAgent, OperationalAgentStates>("OperationalStateDataSource");
                }
                else
                {
                    obs = AgentBroker.Instance.ObserveFirstWithAgentInfo <TAgent, OperationalAgentStates>("OperationalStateDataSource");
                }

                this.RegisterObserver(obs.Subscribe(
                                          t =>
                {
                    dependency.State = t.Item2;
                    _dependenciesOperationalStateSubject.OnNext(Tuple.Create(typeof(TAgent).AssemblyQualifiedName, t.Item1.AgentId, t.Item2));
                    ValidateAgentDependencies();
                }));
            }
        }
		public static async Task IgnoreElementsWhileConvertingTest()
		{
			var input = new SubjectSlim<int>();

			var output = input
				.IgnoreElementsWhileConverting(
					async i =>
					{
						await Task.Delay(75).ConfigureAwait(false);
						return i * 1000;
					})
				.Replay();

			using (output.Connect())
			{
				for (int i = 0; i < 10; i++)
				{
					input.OnNext(i);
					await Task.Delay(50).ConfigureAwait(false);
				}
				input.OnCompleted();

				Assert.That(output.ToEnumerable(), Is.EqualTo(new[] { 0, 2000, 4000, 6000, 8000 }));
			}
		}
		public static void WithPreviousTest()
		{
			var input = new SubjectSlim<int?>();
			var output = input.WithPrevious().Replay();

			using (output.Connect())
			{
				for (int i = 0; i < 5; i++)
					input.OnNext(i);
				input.OnCompleted();

				Assert.That(output.ToEnumerable(), Is.EqualTo(
					new[] {
						Tuple.Create<int?, int?>(null, 0),
						Tuple.Create<int?, int?>(0, 1),
						Tuple.Create<int?, int?>(1, 2),
						Tuple.Create<int?, int?>(2, 3),
						Tuple.Create<int?, int?>(3, 4)
					}));
			}
		}
Beispiel #7
0
        public static void WithPreviousTest()
        {
            var input  = new SubjectSlim <int?>();
            var output = input.WithPrevious().Replay();

            using (output.Connect())
            {
                for (int i = 0; i < 5; i++)
                {
                    input.OnNext(i);
                }
                input.OnCompleted();

                Assert.That(output.ToEnumerable(), Is.EqualTo(
                                new[] {
                    Tuple.Create <int?, int?>(null, 0),
                    Tuple.Create <int?, int?>(0, 1),
                    Tuple.Create <int?, int?>(1, 2),
                    Tuple.Create <int?, int?>(2, 3),
                    Tuple.Create <int?, int?>(3, 4)
                }));
            }
        }
Beispiel #8
0
        public Task <Exception> ProcessCalibrationData(bool isAccepted, CalibrationData calibrationData, Func <Task <bool> > before = null, Func <Task> after = null)
        {
            if (calibrationData == null)
            {
                throw new ArgumentNullException("calibrationData");
            }

            return(MakeStateTransition(
                       ProviderState.Started,
                       ProviderState.Started,
                       ProviderState.Started,
                       async() =>
            {
                var result = await ProcessCalibrationDataCore(isAccepted, calibrationData).ConfigureAwait(false);

                if (isAccepted)
                {
                    _calibrationSubject.OnNext(calibrationData);
                }

                return result;
            },
                       before, after));
        }
        protected override async Task <AcquisitionActionResult> StartCore(StartAcquisitionParameter parameters, AcquisitionActionResult result)
        {
            result = await base.StartCore(parameters, result).ConfigureAwait(false);

            if (!result.IsSuccessful)
            {
                return(result);
            }

            this.RegisterObserver(AgentBroker.Instance.ObserveAny <ILocalisationAgent, LocalisationData>("DataSource").Subscribe(data => _localisationSubject.OnNext(data)));
            this.RegisterObserver(AgentBroker.Instance.ObserveAny <IDistanceAgent, DistanceData>("DataSource").Subscribe(data => _distanceSubject.OnNext(data)));

            return(result);
        }
        public async Task <ExecutionResult> RecycleAgent(string agentId)
        {
            if (string.IsNullOrEmpty(agentId))
            {
                throw new ArgumentNullException("agentId");
            }

            Lazy <LocalAgentInformation>  lazyLocal;
            Lazy <RemoteAgentInformation> lazyRemote;

            if (_localAgents.TryRemove(agentId, out lazyLocal))
            {
                var result = new ExecutionResult {
                    AgentId = agentId
                };
                try
                {
                    var local = lazyLocal.Value;

                    local.IsRecycled = true;
                    local.Agent.Dispose();
                    local.ServiceHost.Close();

                    foreach (var rxService in local.RxServices.Where(s => s.Value.IsValueCreated))
                    {
                        rxService.Value.Value.Connection.Dispose();
                    }

                    var agentInfo = await GetOrRegisterLocalAgent(local.Configuration, local.IsInternal, forceRegister : true).ConfigureAwait(false);

                    if (this.Configuration.AutoActivateAgents)
                    {
                        await agentInfo.Agent.Activate().ConfigureAwait(false);
                    }
                }
                catch (Exception ex)
                {
                    result.Exception = ex;
                }

                return(result);
            }
            else if (_remoteAgents.TryRemove(agentId, out lazyRemote))
            {
                try
                {
                    var remote = lazyRemote.Value;

                    remote.IsRecycled = true;
                    remote.SetIsReachable(false);
                    remote.SetLastKnownState(AgentState.Disposed);

                    _agentSubject.OnNext(new SerializableAgentInformation(remote));

                    await remote.ServiceClientFactory.Close().ConfigureAwait(false);

                    var peerAgentId = GetAgentId(remote.PeerNode, PeerCommunicationAgent.Configuration.Name);
                    var result      = await TryExecuteOnOne <IPeerCommunicationAgent, bool>(peerAgentId, a => a.RecycleAgent(remote.AgentId)).ConfigureAwait(false);

                    GetOrRegisterRemoteAgent(remote.PeerNode, remote.AgentId, remote.DisplayData, remote.Contracts, remote.IsInternal, forceRegister: true);

                    if (!result.IsSuccessful)
                    {
                        return(result);
                    }
                    else if (!result.Result)
                    {
                        return new ExecutionResult {
                                   AgentId = agentId, Exception = new InvalidOperationException(string.Format("Recycling of remote agent '{0}' failed.", agentId))
                        }
                    }
                    ;
                    else
                    {
                        return new ExecutionResult {
                                   AgentId = agentId
                        }
                    };
                }
                catch (Exception ex)
                {
                    return(new ExecutionResult {
                        AgentId = agentId, Exception = ex
                    });
                }
            }
            else
            {
                return(new ExecutionResult {
                    AgentId = agentId, Exception = new ArgumentException(string.Format("Agent '{0}' cannot be found.", agentId), "agentId")
                });
            }
        }