public async Task <CycleProcessingContext> ProcessAsync([NotNull] CycleProcessingContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (!context.IsValid())
            {
                _logger.Warning($"{GetType().Name}: действие не будет выполнено, т.к. в обработке сеанса возникли ошибки");
                return(context);
            }

            var angleParams = context.TryGetAngleParam();

            if (angleParams == null)
            {
                var forcedRequest = context.TryGetForcedDataCollectionRequest();
                forcedRequest?.CommonParamsSemaphore.SetResult(true);
                return(context);
            }

            var isFree = await _mutex
                         .WaitAsync(_blockWaitingTimeout)
                         .ConfigureAwait(false);

            if (!isFree)
            {
                _logger?.Warning($"{GetType().Name}: предыдущий запрос еще выполняется. " +
                                 $"Новый запрос не будет выполнен, т.к. прошло больше {_blockWaitingTimeout.TotalMilliseconds} мс");

                var forcedRequest = context.TryGetForcedDataCollectionRequest();
                forcedRequest?.CommonParamsSemaphore.SetResult(true);
                return(context);
            }

            PatientCommonParams param = null;

            var sessionInfo     = context.TryGetSessionProcessingInfo();
            var cycleNumber     = sessionInfo?.CurrentCycleNumber;
            var iterationInfo   = context.TryGetIterationParams();
            var iterationNumber = iterationInfo?.CurrentIteration;

            try
            {
                _logger?.Trace($"{GetType().Name}: запрос общих параметров пациента с таймаутом {_updatePatientParamTimeout.TotalMilliseconds} мс");
                var timeoutPolicy = Policy.TimeoutAsync(_updatePatientParamTimeout);
                param = await timeoutPolicy
                        .ExecuteAsync(_monitorController.GetPatientCommonParamsAsync)
                        .ConfigureAwait(false);
            }
            catch (DeviceConnectionException e)
            {
                context.AddOrUpdate(
                    new ExceptionCycleProcessingContextParams(
                        new SessionProcessingException(
                            SessionProcessingErrorCodes.InversionTableConnectionError,
                            e.Message,
                            e,
                            cycleNumber,
                            iterationNumber)));
            }
            catch (TimeoutRejectedException e)
            {
                context.AddOrUpdate(
                    new ExceptionCycleProcessingContextParams(
                        new SessionProcessingException(
                            SessionProcessingErrorCodes.PatientCommonParamsRequestTimeout,
                            "Получение общих параметров пациента прервано по таймауту",
                            e,
                            cycleNumber,
                            iterationNumber)));
            }
            catch (Exception e)
            {
                context.AddOrUpdate(
                    new ExceptionCycleProcessingContextParams(
                        new SessionProcessingException(
                            SessionProcessingErrorCodes.PatientCommonParamsRequestError,
                            e.Message,
                            e,
                            cycleNumber,
                            iterationNumber)));
            }
            finally
            {
                var forcedRequest = context.TryGetForcedDataCollectionRequest();
                forcedRequest?.CommonParamsSemaphore.SetResult(true);
                _mutex.Release();
                if (param == null)
                {
                    param = new PatientCommonParams(-1, -1, -1);
                }
            }

            _logger?.Trace($"{GetType().Name}: текущие общие показатели: ЧСС - {param.HeartRate}, " +
                           $"ЧСД - {param.RepsirationRate}, " +
                           $"SPO2 - {param.Spo2}");
            context.AddOrUpdate(
                new CommonPatientCycleProcessingContextParams(
                    param.HeartRate,
                    param.RepsirationRate,
                    param.Spo2));

            return(context);
        }
Ejemplo n.º 2
0
        public Task <CycleProcessingContext> ProcessAsync([NotNull] CycleProcessingContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (!context.IsValid())
            {
                _logger.Warning($"{GetType().Name}: действие не будет выполнено, т.к. в обработке сеанса возникли ошибки");
                return(Task.FromResult(context));
            }

            var sessionProcessingInfo = context.TryGetSessionProcessingInfo();

            if (sessionProcessingInfo == null)
            {
                return(Task.FromResult(context));
            }

            var iterationParams = context.TryGetIterationParams();

            if (iterationParams == null)
            {
                return(Task.FromResult(context));
            }


            var cycleNumber     = sessionProcessingInfo.CurrentCycleNumber;
            var iterationNumber = iterationParams.CurrentIteration;

            try
            {
                var currentCycleNumber                      = sessionProcessingInfo.CurrentCycleNumber;
                var currentIteration                        = iterationParams.CurrentIteration;
                var nextIterationToEcgMeassuring            = iterationParams.IterationToGetEcg;
                var nextIterationToCommonParamsMeassuring   = iterationParams.IterationToGetCommonParams;
                var nextIterationToPressureParamsMeassuring = iterationParams.IterationToGetPressureParams;
                _logger?.Trace($"{GetType().Name}: определение необходимости сбора параметров. Цикл {currentCycleNumber}, итерация {currentIteration}");

                var ecgCheckPoint            = new IterationBasedCheckPoint(currentCycleNumber, nextIterationToEcgMeassuring);
                var commonParamsCheckPoint   = new IterationBasedCheckPoint(currentCycleNumber, nextIterationToCommonParamsMeassuring);
                var pressureParamsCheckPoint = new IterationBasedCheckPoint(currentCycleNumber, nextIterationToPressureParamsMeassuring);

                var needRequestEcg = false;
                if (currentIteration == nextIterationToEcgMeassuring)
                {
                    needRequestEcg = !_ecgParamsCheckPoints.Contains(ecgCheckPoint);
                    if (needRequestEcg)
                    {
                        _ecgParamsCheckPoints.Add(ecgCheckPoint);
                    }
                }
                var needRequestCommonParams = false;
                if (currentIteration == nextIterationToCommonParamsMeassuring)
                {
                    needRequestCommonParams = !_commonParamsCheckPoints.Contains(commonParamsCheckPoint);
                    if (needRequestCommonParams)
                    {
                        _commonParamsCheckPoints.Add(commonParamsCheckPoint);
                    }
                }
                var needRequestPressureParams = false;
                if (currentIteration == nextIterationToPressureParamsMeassuring)
                {
                    needRequestPressureParams = !_pressureParamsCheckPoints.Contains(pressureParamsCheckPoint);
                    if (needRequestPressureParams)
                    {
                        _pressureParamsCheckPoints.Add(pressureParamsCheckPoint);
                    }
                }

                var ecgStatus = needRequestEcg
                    ? "требуется"
                    : "не требуется";
                var commonParamsStatus = needRequestCommonParams
                    ? "требуется"
                    : "не требуется";
                var pressureParamsStatus = needRequestPressureParams
                    ? "требуется"
                    : "не требуется";
                _logger?.Trace($"{GetType().Name}: Цикл {currentCycleNumber}, итерация {currentIteration}: запрос ЭКГ {ecgStatus}, запрос общих параметров {commonParamsStatus}, запрос давления {pressureParamsStatus}");

                context.AddOrUpdate(
                    new CheckPointCycleProcessingContextParams(
                        needRequestEcg,
                        needRequestCommonParams,
                        needRequestPressureParams));
            }
            catch (Exception e)
            {
                context.AddOrUpdate(
                    new ExceptionCycleProcessingContextParams(
                        new SessionProcessingException(
                            SessionProcessingErrorCodes.Unknown,
                            e.Message,
                            e,
                            cycleNumber,
                            iterationNumber)));
            }

            return(Task.FromResult(context));
        }
Ejemplo n.º 3
0
        public async Task <CycleProcessingContext> ProcessAsync([NotNull] CycleProcessingContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (!context.IsValid())
            {
                _logger.Warning($"{GetType().Name}: действие не будет выполнено, т.к. в обработке сеанса возникли ошибки");
                return(context);
            }

            var isBlocked = await _mutex
                            .WaitAsync(_blockWaitingTimeout)
                            .ConfigureAwait(false);

            if (!isBlocked)
            {
                _logger?.Warning($"{GetType().Name}: предыдущий запрос еще выполняется. " +
                                 $"Новый запрос не будет выполнен, т.к. прошло больше {_blockWaitingTimeout.TotalMilliseconds} мс");
                return(context);
            }

            var sessionInfo     = context.TryGetSessionProcessingInfo();
            var cycleNumber     = sessionInfo?.CurrentCycleNumber;
            var iterationInfo   = context.TryGetIterationParams();
            var iterationNumber = iterationInfo?.CurrentIteration;

            try
            {
                var timeoutPolicy = Policy.TimeoutAsync(_bedControllerTimeout);

                _logger?.Trace($"{GetType().Name}: запрос текущего угла наклона кровати по оси X с таймаутом {_bedControllerTimeout.TotalMilliseconds} мс");
                var currentAngle = await timeoutPolicy.ExecuteAsync(_bedController
                                                                    .GetAngleXAsync)
                                   .ConfigureAwait(false);

                context.AddOrUpdate(new AngleXContextParams(currentAngle));
            }
            catch (DeviceConnectionException e)
            {
                context.AddOrUpdate(
                    new ExceptionCycleProcessingContextParams(
                        new SessionProcessingException(
                            SessionProcessingErrorCodes.InversionTableConnectionError,
                            e.Message,
                            e,
                            cycleNumber,
                            iterationNumber)));
            }
            catch (TimeoutRejectedException e)
            {
                context.AddOrUpdate(
                    new ExceptionCycleProcessingContextParams(
                        new SessionProcessingException(
                            SessionProcessingErrorCodes.InversionTableTimeout,
                            "Получение текущего угла по оси X прервано по таймауту",
                            e,
                            cycleNumber,
                            iterationNumber)));
            }
            catch (Exception e)
            {
                context.AddOrUpdate(
                    new ExceptionCycleProcessingContextParams(
                        new SessionProcessingException(
                            SessionProcessingErrorCodes.UpdateAngleError,
                            e.Message,
                            e,
                            cycleNumber,
                            iterationNumber)));
            }
            finally
            {
                _mutex.Release();
            }

            return(context);
        }
        public async Task <CycleProcessingContext> ProcessAsync([NotNull] CycleProcessingContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (!context.IsValid())
            {
                _logger.Warning($"{GetType().Name}: действие не будет выполнено, т.к. в обработке сеанса возникли ошибки");
                return(context);
            }

            var pumpingResult = context.TryGetAutoPumpingResultParams();

            if (!(pumpingResult?.WasPumpingCompleted ?? false))
            {
                _logger?.Trace($"{GetType().Name}: получение данных не будет выполнено, " +
                               $"т.к. накачка манжеты завершилась неудачно");
                var forcedRequest = context.TryGetForcedDataCollectionRequest();
                forcedRequest?.PressureParamsSemaphore.SetResult(true);
                return(context);
            }

            var isFree = await _mutex
                         .WaitAsync(_blockWaitingTimeout)
                         .ConfigureAwait(false);

            if (!isFree)
            {
                _logger?.Warning($"{GetType().Name}: предыдущий запрос еще выполняется. " +
                                 $"Новый запрос не будет выполнен, т.к. прошло больше " +
                                 $"{_blockWaitingTimeout.TotalMilliseconds} мс");
                var forcedRequest = context.TryGetForcedDataCollectionRequest();
                forcedRequest?.PressureParamsSemaphore.SetResult(true);
                return(context);
            }

            Devices.Monitor.Infrastructure.PatientPressureParams param = null;

            var sessionInfo     = context.TryGetSessionProcessingInfo();
            var cycleNumber     = sessionInfo?.CurrentCycleNumber;
            var iterationInfo   = context.TryGetIterationParams();
            var iterationNumber = iterationInfo?.CurrentIteration;

            try
            {
                _logger?.Trace($"{GetType().Name}: запрос показателей давления с таймаутом " +
                               $"{_updatePatientParamTimeout.TotalMilliseconds} мс");
                var timeoutPolicy = Policy.TimeoutAsync(_updatePatientParamTimeout);
                param = await timeoutPolicy.ExecuteAsync(
                    _monitorController
                    .GetPatientPressureParamsAsync)
                        .ConfigureAwait(false);
            }
            catch (DeviceConnectionException e)
            {
                context.AddOrUpdate(
                    new ExceptionCycleProcessingContextParams(
                        new SessionProcessingException(
                            SessionProcessingErrorCodes.MonitorConnectionError,
                            e.Message,
                            e,
                            cycleNumber,
                            iterationNumber)));
            }
            catch (TimeoutRejectedException e)
            {
                context.AddOrUpdate(
                    new ExceptionCycleProcessingContextParams(
                        new SessionProcessingException(
                            SessionProcessingErrorCodes.PatientPressureParamsRequestTimeout,
                            "Получение показателей давления пациента прервано по таймауту",
                            e,
                            cycleNumber,
                            iterationNumber)));
            }
            catch (Exception e)
            {
                context.AddOrUpdate(
                    new ExceptionCycleProcessingContextParams(
                        new SessionProcessingException(
                            SessionProcessingErrorCodes.PatientPressureParamsRequestError,
                            e.Message,
                            e,
                            cycleNumber,
                            iterationNumber)));
            }
            finally
            {
                var forcedRequest = context.TryGetForcedDataCollectionRequest();
                forcedRequest?.PressureParamsSemaphore.SetResult(true);
                _mutex.Release();
                if (param == null)
                {
                    param = GetDefaultParams();
                }
            }

            _logger?.Trace($"{GetType().Name}: текущие показатели давления: систолическиое - {param.SystolicArterialPressure}, " +
                           $"диастолическое - {param.DiastolicArterialPressure}, " +
                           $"среднее - {param.AverageArterialPressure}");
            UpdateContex(param, context);
            return(context);
        }