예제 #1
0
        private void StatusParseTest(IReadOnlyList <byte> packet)
        {
            var valueLowFirst   = packet[6] >> 4;
            var valueHighFirst  = packet[8] >> 4;
            var valueLowSecond  = packet[10] >> 4;
            var valueHighSecond = packet[12] >> 4;
            var low             = (byte)(valueLowFirst + (valueHighFirst << 4));
            var high            = (byte)(valueLowSecond + (valueHighSecond << 4));

            var isPumpingError      = high != 128;
            var isPumpingInProgress = low != 0;

            if (isPumpingError)
            {
                _status = PumpingStatus.Error;
                return;
            }

            if (isPumpingInProgress)
            {
                _status = PumpingStatus.InProgress;
                return;
            }

            _status = PumpingStatus.Completed;
        }
        // ReSharper disable once NotNullMemberIsNotInitialized
        public MitarMonitorController([NotNull] IWorkerController workerController)
        {
            _workerController = workerController ?? throw new ArgumentNullException(nameof(workerController));

            IsConnected = false;

            _isCommonParamsRequested   = 0;
            _isPressureParamsRequested = 0;
            _isEcgParamsRequested      = 0;

            _commonParamsReady       = new Nito.AsyncEx.AsyncManualResetEvent(false);
            _pressureParamsReady     = new Nito.AsyncEx.AsyncManualResetEvent(false);
            _ecgParamsReady          = new Nito.AsyncEx.AsyncManualResetEvent(false);
            _pumpingReady            = new Nito.AsyncEx.AsyncManualResetEvent(false);
            _pumpingStatus           = PumpingStatus.Completed;
            _updateDataSyncSemaphore = new SemaphoreSlim(1, 1);


            _ecgValues      = new ConcurrentQueue <short>();
            _lastExceptions = new ConcurrentQueue <Exception>();
        }
        private async Task UpdateDataAsync()
        {
            var isCommonParamsRequested   = _isCommonParamsRequested == IsRequestedValue;
            var isPressureParamsRequested = _isPressureParamsRequested == IsRequestedValue;
            var isEcgParamsRequested      = _isEcgParamsRequested == IsRequestedValue;

            if (!isCommonParamsRequested && !isPressureParamsRequested && !isEcgParamsRequested && !_isPumpingRequested)
            {
                return;
            }
            AssertConnection();

            await _updateDataSyncSemaphore
            .WaitAsync()
            .ConfigureAwait(false);

            var ecgValue = new short[2];

            try
            {
                var commonParams = await _mitar
                                   .GetCommonParams()
                                   .ConfigureAwait(false);

                var pressureParams = await _mitar
                                     .GetPressureParams()
                                     .ConfigureAwait(false);

                _pumpingStatus = await _mitar
                                 .GetPumpingStatus()
                                 .ConfigureAwait(false);

                if (_isPumpingRequested)
                {
                    if (!_isPumpingStarted && _pumpingStatus == PumpingStatus.InProgress)
                    {
                        _isPumpingStarted = true;
                    }
                    if (_isPumpingStarted &&
                        (_pumpingStatus != PumpingStatus.InProgress))
                    {
                        _isPumpingStarted   = false;
                        _isPumpingRequested = false;
                        _pumpingReady.Set();
                    }
                }


                if (isCommonParamsRequested)
                {
                    _lastCommonParams = commonParams;
                    _commonParamsReady.Set();
                }

                if (isPressureParamsRequested)
                {
                    _lastPressureParams = pressureParams;
                    _pressureParamsReady.Set();
                }

                if (isEcgParamsRequested)
                {
                    _ecgValues.Enqueue(ecgValue[0]);
                    _ecgValues.Enqueue(ecgValue[1]);
                    var currentTime = DateTime.UtcNow;

                    if (currentTime > _startedEcgCollectingTime &&
                        currentTime - _startedEcgCollectingTime >= _ecgCollectionDuration)
                    {
                        _lastEcgParams = new PatientEcgParams(_ecgValues.ToArray());
                        while (_ecgValues.TryDequeue(out _))
                        {
                        }

                        _ecgParamsReady.Set();
                    }
                }
            }
            catch (Exception)
            {
                // чтобы не было deadlock'ов
                if (isCommonParamsRequested)
                {
                    _commonParamsReady.Set();
                }

                if (isPressureParamsRequested)
                {
                    _commonParamsReady.Set();
                }

                if (isEcgParamsRequested)
                {
                    _ecgParamsReady.Set();
                }

                throw;
            }
            finally
            {
                _updateDataSyncSemaphore.Release();
            }
        }