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); }
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(); }
/// <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); }