예제 #1
0
        public BedRegisterValues GetAllRegisterValues(byte[] receiveMessage)
        {
            UnPackageMessage(receiveMessage);
            if (_messageData.Length < 255)
            {
                throw new IndexOutOfRangeException();
            }
            var values = new BedRegisterValues
            {
                BedStatus        = GetBedStatus(_messageData[BedStatusPosition]),
                CurrentCycle     = _messageData[CurrentCyclePosition],
                CurrentIteration = _messageData[CurrentIterationPosition],
                MaxAngle         = GetHalfValuesFromBytes(_messageData[BedMaxAnglePosition * 2 + 1],
                                                          _messageData[BedMaxAnglePosition * 2]),
                Frequency = GetHalfValuesFromBytes(_messageData[BedFreqPosition * 2 + 1],
                                                   _messageData[BedFreqPosition * 2]),
                RemainingTime = TimeSpan.FromSeconds(GetValuesFromBytes(_messageData[RemainingTimePosition],
                                                                        _messageData[RemainingTimePosition + 1])),
                ElapsedTime = TimeSpan.FromSeconds(GetValuesFromBytes(_messageData[ElapsedTimePosition],
                                                                      _messageData[ElapsedTimePosition + 1])),
                BedTargetAngleX = GetHalfValuesFromBytes(_messageData[BedTargetAngleXPosition + 1],
                                                         _messageData[BedTargetAngleXPosition])
            };


            //Здесь тоже измененный порядок байт - todo подумать как его красиво реверсить

            //values.BedR

            return(values);
        }
예제 #2
0
        public void InitController([NotNull] IBedControllerConfig initParams)
        {
            if (initParams == null)
            {
                throw new ArgumentNullException(nameof(initParams));
            }
            var udpControllerInitParams = initParams as BedUdpControllerConfig;

            _config         = udpControllerInitParams ?? throw new InvalidOperationException($"Необходимо передать объект типа {typeof(BedUdpControllerConfig)}");
            _sessionInfo    = new BedSessionInfo(_config.MaxAngleX);
            _registerValues = new BedRegisterValues();
        }
예제 #3
0
        /// <summary>
        /// Обновляет значения регистров с кровати
        /// </summary>
        private async Task UpdateRegistersValueAsync()
        {
            // немного подождем, чтобы завершилось начатое обновление данных
            var waitingTimeout = GetWaitingTimeout();
            var isFree         = await _semaphoreSlim
                                 .WaitAsync(waitingTimeout)
                                 .ConfigureAwait(false);

            if (!isFree)
            {
                throw new DeviceConnectionException(
                          $"Не удалось подключиться к инверсинному столу в течение {waitingTimeout.TotalMilliseconds} мс");
            }


            await Task.Factory.StartNew(() => {
                try
                {
                    AssertConnection();
                    //здесь запрос данных и их парсинг
                    var message        = new BedMessage(BedMessageEventType.ReadAll);
                    var getAllRegister = message.GetAllRegisterMessage();
                    _udpSendingClient.Send(getAllRegister, getAllRegister.Length);
                    var receiveMessage          = _udpReceivingClient.Receive(ref _remoteRecievedIpEndPoint);
                    var previouslRegisterValues = _registerValues;
                    _registerValues             = message.GetAllRegisterValues(receiveMessage);

                    if ((previouslRegisterValues.BedStatus == BedStatus.SessionStarted ||
                         previouslRegisterValues.BedStatus == BedStatus.Pause) &&
                        _registerValues.BedStatus == BedStatus.Reverse)
                    {
                        OnReverseFromDeviceRequested?.Invoke(this, EventArgs.Empty);
                    }

                    if (previouslRegisterValues.BedStatus == BedStatus.SessionStarted &&
                        _registerValues.BedStatus == BedStatus.Pause)
                    {
                        OnPauseFromDeviceRequested?.Invoke(this, EventArgs.Empty);
                    }

                    if (previouslRegisterValues.BedStatus == BedStatus.Pause &&
                        _registerValues.BedStatus == BedStatus.SessionStarted)
                    {
                        OnResumeFromDeviceRequested?.Invoke(this, EventArgs.Empty);
                    }

                    if (previouslRegisterValues.BedStatus != BedStatus.EmergencyStop &&
                        _registerValues.BedStatus == BedStatus.EmergencyStop)
                    {
                        OnEmeregencyStopFromDeviceRequested?.Invoke(this, EventArgs.Empty);
                    }
                }
                catch (DeviceConnectionException)
                {
                    IsConnected = false;
                    throw;
                }
                catch (SocketException e)
                {
                    IsConnected = false;
                    throw new DeviceConnectionException("Ошибка соедининия с инверсионным столом", e);
                }
                catch (ObjectDisposedException e)
                {
                    IsConnected = false;
                    throw new DeviceConnectionException("Ошибка соедининия с инверсионным столом", e);
                }
                catch (Exception e)
                {
                    IsConnected = false;
                    throw new DeviceProcessingException("Ошибка получения данных от инверсионного стола", e);
                }
                finally
                {
                    _semaphoreSlim.Release();
                }
            }).ConfigureAwait(false);
        }