protected override async Task tryQuitCalibrationModeAsync(CancellationToken cancellation) { Logger.LogInfoEverywhere("Установка рабочего режима"); var data = Requests.BuildInclinometrModeSetPacket(InclinometrMode.WORKING); await _device.BurnAsync(Command.CALIBRATION_MODE_SET, data, DeviceOperationScope.DEFAULT, cancellation); var statusReadResult = await _device.TryReadStatusAsync(DeviceOperationScope.DEFAULT, cancellation); var isInWorkingMode = statusReadResult == null ? false : !isInCalibrationMode(statusReadResult.StatusInfo.Status.Bits); if (!isInWorkingMode) { Logger.LogErrorEverywhere("Не удалось выйти из режима калибровки"); } }
protected override async Task <bool> ensureInCalibrationModeAsync(ReadResult readRequestResult) { { var status = readRequestResult.Entities.Find(e => e.Descriptor.Name == STATUS_MNEMONIC); if (status.Found) { var inCalibrationMode = isInCalibrationMode(status.Value.Value); if (!inCalibrationMode) { Logger.LogInfo(null, $"Установка режима {modeDuringCalibration}"); var data = Requests.BuildInclinometrModeSetPacket(modeDuringCalibration); await _device.BurnAsync(Command.CALIBRATION_MODE_SET, data, DeviceOperationScope.DEFAULT, CancellationToken.None); } return(!inCalibrationMode); } else { var msg = $"Мнемоника статуса \"{STATUS_MNEMONIC}\" не найдена в пакете данных"; Logger.LogErrorEverywhere($"Отсутствует мнемоника \"{STATUS_MNEMONIC}\""); throw new Exception(msg); } } bool isInCalibrationMode(object status) { var status16 = (ushort)Convert.ChangeType(status, TypeCode.UInt16); var incMode = new DeviceStatusInfo(_device.Id, 0, new DeviceStatusInfo.StatusInfo(16, status16)) .InclinometrMode; if (incMode == null) { Logger.LogWarningEverywhere($"Некорректный режим работы инклинометра. Статус: {status16:X4}"); } return(incMode == modeDuringCalibration); } }