private void InternalMessageProc()
        {
            int          bytesToRead;
            int          i;
            IFlMessage   parsedMessage;
            FlParseState parseState;

            byte[] data = new byte[128];

            _logger.Debug("InternalMessageProc started");

            while (_messageLoop == true)
            {
                bytesToRead = _serialPort.BytesToRead;
                if (bytesToRead > 0)
                {
                    _serialPort.Read(data, 0, bytesToRead);
                    for (i = 0; i < bytesToRead; i++)
                    {
                        parseState = _parser.Parse(data[i], out parsedMessage);
                        if (parseState == FlParseState.ParseOk)
                        {
                            lock (_generalLock)
                            {
                                switch (parsedMessage.MessageCategory)
                                {
                                case FlMessageCategory.Response:
                                    int commandCount = 0;
                                    lock (_generalLock)
                                    {
                                        commandCount = _commandQ.Count;
                                    }

                                    if (commandCount > 0)
                                    {
                                        FlBinMessageResponse response = (FlBinMessageResponse)parsedMessage;
                                        _responseQ.Add(response);
                                    }
                                    else
                                    {
                                        _logger.Debug("Timeout response received");
                                    }
                                    break;

                                case FlMessageCategory.Event:
                                    FlBinMessageEvent evt = (FlBinMessageEvent)parsedMessage;
                                    OnEventReceived?.Invoke(this, evt);
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            _logger.Debug("InternalMessageProc stopped");
        }
示例#2
0
        private unsafe bool MakeEventObject(FlBinMsgFullStruct fullMsg, ref IFlMessage message)
        {
            bool          ret           = false;
            ushort        receivedCrc   = 0;
            int           crcDataLen    = _bufPos - 4;
            int           crcStartIndex = _bufPos - 3;
            List <object> arguments     = null;
            FlMessageId   messageId     = (FlMessageId)fullMsg.header.message_id;

            switch (messageId)
            {
            case FlMessageId.ButtonEvent:
            {
                _crc16      = FlUtil.CRC16(_buf, 1, crcDataLen);
                receivedCrc = BitConverter.ToUInt16(_buf, crcStartIndex);

                if ((CompareCrc(_crc16, receivedCrc) == true) &&
                    (FlConstant.FL_BIN_MSG_ETX == _buf[_bufPos - 1]))
                {
                    arguments = new List <object>()
                    {
                        fullMsg.payload[0],         // Button number
                        fullMsg.payload[1]          // Button value
                    };
                    ret = true;
                }
            }
            break;
            }

            if (ret == true)
            {
                FlBinMessageEvent evt = new FlBinMessageEvent()
                {
                    Arguments   = arguments,
                    ReceiveTime = DateTime.UtcNow
                };
                evt.Header.device_id  = fullMsg.header.device_id;
                evt.Header.length     = fullMsg.header.length;
                evt.Header.message_id = (FlMessageId)fullMsg.header.message_id;
                evt.Header.flag1      = fullMsg.header.flag1;
                evt.Header.flag2      = fullMsg.header.flag2;

                message = evt;
            }

            return(ret);
        }