/// <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);
        }
Пример #2
0
        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());
        }
Пример #3
0
        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());
        }