/// <summary> /// Обработать и добавить событие от модуля энкодеров /// </summary> /// <param name="buffer">буфер, считанный из COM-порта</param> /// <param name="blockOffset">смещение с которого начинается пакет</param> /// <returns>набор полученных событий</returns> private IEnumerable <ControlEventBase> ProcessEncoderEvent(byte[] buffer, int blockOffset) { var events = new List <ControlEventBase>(); var controlEvent = new EncoderEvent { Hardware = new ControlProcessorHardware { ModuleType = HardwareModuleType.Encoder, ControlId = buffer[blockOffset + 15], ModuleId = buffer[blockOffset + 1], MotherBoardId = _motherboardId }, RotateDirection = (buffer[blockOffset + 17] == 1), ClicksCount = buffer[blockOffset + 16], }; events.Add(controlEvent); return(events); }
public void ArccCheckEncoderDataProcessing() { const string testMotherboardId = "TestMotherboard"; var arccProcessor = new ArccHardwareDataProcessor(testMotherboardId); // Длина пакета модуля энкодеров - 18 байт var encoderEventByteArray = new byte[] { 3, // 3 - признак группы плат "модуль энкодеров" 2, // ID платы 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // произвольные 13 байт, не занятые передачей полезных данных в пакете 4, // номер энкодера 1-14 100, // количество щелчков 1 // направление. 0 - влево, 1 - вправо }; var encoderEventStruct = new EncoderEvent { Hardware = { MotherBoardId = testMotherboardId, ModuleType = HardwareModuleType.Encoder, ModuleId = 2, BlockId = 0, ControlId = 4 }, ClicksCount = 100, RotateDirection = true }; var events = arccProcessor.ProcessDataFromSerialPort(encoderEventByteArray).ToList(); Assert.AreEqual(1, events.Count); Assert.IsTrue(events[0] is EncoderEvent); var resultEvent = events[0] as EncoderEvent; Assert.AreEqual(resultEvent.ClicksCount, encoderEventStruct.ClicksCount); Assert.AreEqual(resultEvent.RotateDirection, encoderEventStruct.RotateDirection); Assert.AreEqual(resultEvent.Hardware.GetHardwareGuid(), encoderEventStruct.Hardware.GetHardwareGuid()); }
public void ArccCheckProcessEventSentInTwoPackets() { const string testMotherboardId = "TestMotherboard"; var arccProcessor = new ArccHardwareDataProcessor(testMotherboardId); // Длина пакета модуля клавиатуры - 18 байт var keyEventByteArray = new byte[] { 2, // 2 - признак группы плат "клавиатурный модуль" 2, // ID платы 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // произвольные 13 байт, не занятые передачей полезных данных в пакете 0, // признак дампа 0 - клавиша нажата в модуле, 1 - начат дамп, 2 - окончен дамп 100, // номер кнопки 1-168 1 // состояние. 1 - вкл, 0 - выкл }; var keyEventStruct = new ButtonEvent { Hardware = { MotherBoardId = testMotherboardId, ModuleType = HardwareModuleType.Button, ModuleId = 2, BlockId = 0, ControlId = 100 }, IsPressed = true }; // Длина пакета модуля энкодеров - 18 байт var encoderEventByteArray = new byte[] { 3, // 3 - признак группы плат "модуль энкодеров" 2, // ID платы 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // произвольные 13 байт, не занятые передачей полезных данных в пакете 4, // номер энкодера 1-14 100, // количество щелчков 1 // направление. 0 - влево, 1 - вправо }; var encoderEventStruct = new EncoderEvent { Hardware = { MotherBoardId = testMotherboardId, ModuleType = HardwareModuleType.Encoder, ModuleId = 2, BlockId = 0, ControlId = 4 }, ClicksCount = 100, RotateDirection = true }; var trashByteArray = new byte[] { 1, 4, 55, 3 }; const int encoderArrayPartToSendFirstTime = 16; // Отправляем массив данных события клавиатуры и часть события энкодера // В результате получаем событие клавиатуры var arrayToTransfer = new byte[keyEventByteArray.Length + encoderArrayPartToSendFirstTime]; keyEventByteArray.CopyTo(arrayToTransfer, 0); Array.Copy(encoderEventByteArray, 0, arrayToTransfer, keyEventByteArray.Length, 16); var events = arccProcessor.ProcessDataFromSerialPort(arrayToTransfer).ToList(); Assert.AreEqual(1, events.Count); Assert.IsTrue(events[0] is ButtonEvent); var resultEvent = events[0] as ButtonEvent; Assert.AreEqual(resultEvent.IsPressed, keyEventStruct.IsPressed); Assert.AreEqual(resultEvent.Hardware.GetHardwareGuid(), keyEventStruct.Hardware.GetHardwareGuid()); // Досылаем данные от события энкодера // Получаем событие энкодера arrayToTransfer = new byte[encoderEventByteArray.Length - encoderArrayPartToSendFirstTime + trashByteArray.Length]; Array.Copy(encoderEventByteArray, encoderArrayPartToSendFirstTime, arrayToTransfer, 0, encoderEventByteArray.Length - encoderArrayPartToSendFirstTime); Array.Copy(trashByteArray, 0, arrayToTransfer, encoderEventByteArray.Length - encoderArrayPartToSendFirstTime, trashByteArray.Length); events = arccProcessor.ProcessDataFromSerialPort(arrayToTransfer).ToList(); Assert.AreEqual(1, events.Count); Assert.IsTrue(events[0] is EncoderEvent); var encoderResultEvent = events[0] as EncoderEvent; Assert.AreEqual(encoderResultEvent.ClicksCount, encoderEventStruct.ClicksCount); Assert.AreEqual(encoderResultEvent.RotateDirection, encoderEventStruct.RotateDirection); Assert.AreEqual(encoderResultEvent.Hardware.GetHardwareGuid(), encoderResultEvent.Hardware.GetHardwareGuid()); }