public void TestReadHardwareVersionResponseParse()
        {
            _binMsg = new FlBinMessageResponse()
            {
                MessageId = FlMessageId.ReadHardwareVersion,
                Arguments = new List <object>()
                {
                    "a.1.2.3" // Hardware version
                }
            };
            _binMsg.Header.device_id          = 1;
            _binMsg.Header.flag1.sequence_num = 1;

            _message = _binMsg;
            FlBinPacketBuilder.BuildMessagePacket(ref _message);

            _parser.Role = FlParserRole.Host;
            for (_i = 0; _i < _message.Buffer.Length; _i++)
            {
                _parseResult = _parser.Parse(_message.Buffer[_i], out _parsedMessage);
            }

            _parsedBinMsg = (IFlBinMessage)_parsedMessage;
            Assert.AreEqual(FlParseState.ParseOk, _parseResult);
            Assert.AreEqual(FlMessageType.Binary, _parsedBinMsg.MessageType);
            Assert.AreEqual(FlMessageCategory.Response, _parsedBinMsg.MessageCategory);
            Assert.AreEqual((uint)1, _parsedBinMsg.Header.device_id);
            Assert.AreEqual((byte)1, _parsedBinMsg.Header.flag1.sequence_num);
            Assert.AreEqual(FlMessageId.ReadHardwareVersion, _parsedBinMsg.MessageId);

            Assert.AreEqual(1, _parsedBinMsg.Arguments.Count);
            Assert.AreEqual("a.1.2.3", (string)_parsedBinMsg.Arguments[0]);
        }
        private void AppBinWriteGpio()
        {
            if (CheckStartStatus() != true)
            {
                return;
            }

            IFlBinMessage binMsg = new FlBinMessageCommand()
            {
                MessageId = FlMessageId.WriteGpio,
                Arguments = new List <object>()
                {
                    (byte)1,
                    (byte)1
                }
            };

            binMsg.Header.device_id          = 1;
            binMsg.Header.flag1.sequence_num = _hostSimul.GetNextSeqNum();

            IFlMessage message = binMsg;

            FlBinPacketBuilder.BuildMessagePacket(ref message);

            _hostSimul.ResponseReceived = false;
            _hostSimul.SendPacket(message.Buffer);

            WaitForResponse();
        }
        public void TestReadFirmwareVersionCommandParse()
        {
            _binMsg = new FlBinMessageCommand()
            {
                MessageId = FlMessageId.ReadFirmwareVersion
            };
            _binMsg.Header.device_id          = 1;
            _binMsg.Header.flag1.sequence_num = 2;

            _message = _binMsg;
            FlBinPacketBuilder.BuildMessagePacket(ref _message);

            _parser.Role = FlParserRole.Device;
            for (_i = 0; _i < _message.Buffer.Length; _i++)
            {
                _parseResult = _parser.Parse(_message.Buffer[_i], out _parsedMessage);
            }

            _parsedBinMsg = (IFlBinMessage)_parsedMessage;
            Assert.AreEqual(FlParseState.ParseOk, _parseResult);
            Assert.AreEqual(FlMessageType.Binary, _parsedBinMsg.MessageType);
            Assert.AreEqual(FlMessageCategory.Command, _parsedBinMsg.MessageCategory);
            Assert.AreEqual((uint)1, _parsedBinMsg.Header.device_id);
            Assert.AreEqual((byte)2, _parsedBinMsg.Header.flag1.sequence_num);
            Assert.AreEqual(FlMessageId.ReadFirmwareVersion, _parsedBinMsg.MessageId);
        }
        public void TestBootModeCommandMessageBuild()
        {
            _binMsg = new FlBinMessageCommand()
            {
                MessageId = FlMessageId.BootMode,
                Arguments = new List <object>()
                {
                    (byte)1    // Boot mode(Bootloader)
                }
            };
            _binMsg.Header.device_id          = 1;
            _binMsg.Header.flag1.sequence_num = 1;

            _message = _binMsg;
            FlBinPacketBuilder.BuildMessagePacket(ref _message);

            _parser.Role = FlParserRole.Device;
            for (_i = 0; _i < _message.Buffer.Length; _i++)
            {
                _parseResult = _parser.Parse(_message.Buffer[_i], out _parsedMessage);
            }

            _parsedBinMsg = (IFlBinMessage)_parsedMessage;
            Assert.AreEqual(FlParseState.ParseOk, _parseResult);
            Assert.AreEqual(FlMessageType.Binary, _parsedBinMsg.MessageType);
            Assert.AreEqual(FlMessageCategory.Command, _parsedBinMsg.MessageCategory);
            Assert.AreEqual((uint)1, _parsedBinMsg.Header.device_id);
            Assert.AreEqual((byte)1, _parsedBinMsg.Header.flag1.sequence_num);
            Assert.AreEqual(FlMessageId.BootMode, _parsedBinMsg.MessageId);

            Assert.AreEqual(1, _parsedBinMsg.Arguments.Count);
            Assert.AreEqual(1, (byte)_parsedBinMsg.Arguments[0]);
        }
        public unsafe void TestResetOkResponseMessageBuild()
        {
            _binMsg = new FlBinMessageResponse()
            {
                MessageId = FlMessageId.Reset,
            };
            _binMsg.Header.device_id          = 1;
            _binMsg.Header.flag1.sequence_num = 2;

            _message = _binMsg;
            FlBinPacketBuilder.BuildMessagePacket(ref _message);

            _parser.Role = FlParserRole.Host;
            for (_i = 0; _i < _message.Buffer.Length; _i++)
            {
                _parseResult = _parser.Parse(_message.Buffer[_i], out _parsedMessage);
            }

            _parsedBinMsg = (IFlBinMessage)_parsedMessage;
            Assert.AreEqual(FlParseState.ParseOk, _parseResult);
            Assert.AreEqual(FlMessageType.Binary, _parsedBinMsg.MessageType);
            Assert.AreEqual(FlMessageCategory.Response, _parsedBinMsg.MessageCategory);
            Assert.AreEqual((uint)1, _parsedBinMsg.Header.device_id);
            Assert.AreEqual((byte)2, _parsedBinMsg.Header.flag1.sequence_num);
            Assert.AreEqual(FlMessageId.Reset, _parsedBinMsg.MessageId);
            Assert.AreEqual((byte)0, _parsedBinMsg.Header.flag2.error);
        }
        public void TestReadTemperatureHumidityCommandMessageBuild()
        {
            _binMsg = new FlBinMessageCommand()
            {
                MessageId = FlMessageId.ReadTempAndHum,
                Arguments = new List <object>()
                {
                    (byte)3    // Sensor number
                }
            };
            _binMsg.Header.device_id          = 1;
            _binMsg.Header.flag1.sequence_num = 7;

            _message = _binMsg;
            FlBinPacketBuilder.BuildMessagePacket(ref _message);

            _parser.Role = FlParserRole.Device;
            for (_i = 0; _i < _message.Buffer.Length; _i++)
            {
                _parseResult = _parser.Parse(_message.Buffer[_i], out _parsedMessage);
            }

            _parsedBinMsg = (IFlBinMessage)_parsedMessage;
            Assert.AreEqual(FlParseState.ParseOk, _parseResult);
            Assert.AreEqual(FlMessageType.Binary, _parsedBinMsg.MessageType);
            Assert.AreEqual(FlMessageCategory.Command, _parsedBinMsg.MessageCategory);
            Assert.AreEqual((uint)1, _parsedBinMsg.Header.device_id);
            Assert.AreEqual((byte)7, _parsedBinMsg.Header.flag1.sequence_num);
            Assert.AreEqual(FlMessageId.ReadTempAndHum, _parsedBinMsg.MessageId);

            Assert.AreEqual(1, _parsedBinMsg.Arguments.Count);
            Assert.AreEqual(3, (byte)_parsedBinMsg.Arguments[0]);
        }
        public void TestReadHumidityOkResponseMessageBuild()
        {
            _binMsg = new FlBinMessageResponse()
            {
                MessageId = FlMessageId.ReadHumidity,
                Arguments = new List <object>()
                {
                    (byte)2,        // Sensor number
                    (double)23.4    // Humidity
                }
            };
            _binMsg.Header.device_id          = 1;
            _binMsg.Header.flag1.sequence_num = 6;

            _message = _binMsg;
            FlBinPacketBuilder.BuildMessagePacket(ref _message);

            _parser.Role = FlParserRole.Host;
            for (_i = 0; _i < _message.Buffer.Length; _i++)
            {
                _parseResult = _parser.Parse(_message.Buffer[_i], out _parsedMessage);
            }

            _parsedBinMsg = (IFlBinMessage)_parsedMessage;
            Assert.AreEqual(FlParseState.ParseOk, _parseResult);
            Assert.AreEqual(FlMessageType.Binary, _parsedBinMsg.MessageType);
            Assert.AreEqual(FlMessageCategory.Response, _parsedBinMsg.MessageCategory);
            Assert.AreEqual((uint)1, _parsedBinMsg.Header.device_id);
            Assert.AreEqual((byte)6, _parsedBinMsg.Header.flag1.sequence_num);
            Assert.AreEqual(FlMessageId.ReadHumidity, _parsedBinMsg.MessageId);

            Assert.AreEqual(2, _parsedBinMsg.Arguments.Count);
            Assert.AreEqual(2, (byte)_parsedBinMsg.Arguments[0]);
            Assert.AreEqual(23.4, (double)_parsedBinMsg.Arguments[1]);
        }
        private void AppHwVer()
        {
            IFlMessage message = null;

            if (_flMsgMgr.MessageType == FwMessageType.Text)
            {
                message = new FlTxtMessageCommand()
                {
                    MessageId = FlMessageId.ReadHardwareVersion,
                    Arguments = new List <object>()
                    {
                        _deviceId.ToString() // DeviceID
                    }
                };
                FlTxtPacketBuilder.BuildMessagePacket(ref message);
            }
            else if (_flMsgMgr.MessageType == FwMessageType.Binary)
            {
                IFlBinMessage binMsg = new FlBinMessageCommand()
                {
                    MessageId = FlMessageId.ReadHardwareVersion
                };
                binMsg.Header.device_id          = _deviceId;
                binMsg.Header.flag1.sequence_num = GetNextSeqNum();

                message = binMsg;
                FlBinPacketBuilder.BuildMessagePacket(ref message);
            }

            _flMsgMgr.EnqueueCommand(message);
        }
        private IFlMessage ProcessCommand(FlBinMessageCommand command)
        {
            TimeSpan   timeSpan;
            bool       waitTimeExpired;
            IFlMessage response = null;
            IFlMessage message  = (IFlMessage)command;

            FlBinPacketBuilder.BuildMessagePacket(ref message);
            lock (_generalLock)
            {
                _commandQ.Add(command);
            }

            for (int i = 0; i < command.MaxTryCount; i++)
            {
                _serialPort.Write(command.Buffer, 0, command.Buffer.Length);
                if (command.SendTimeHistory == null)
                {
                    command.SendTimeHistory = new List <DateTime>();
                }
                command.SendTimeHistory.Add(DateTime.UtcNow);

                waitTimeExpired = false;
                while (true)
                {
                    response = GetResponse(command);
                    if (response != null)
                    {
                        break;
                    }

                    timeSpan = DateTime.UtcNow - command.SendTimeHistory[i];
                    if (timeSpan.TotalMilliseconds > command.ResponseWaitTimeout)
                    {
                        waitTimeExpired = true;
                        Console.WriteLine($"Response wait time expired");
                        break;
                    }
                }

                if (response != null)
                {
                    break;
                }

                if ((waitTimeExpired == true) &&
                    (command.TryInterval > 0))
                {
                    Thread.Sleep(command.TryInterval);
                }
            }

            lock (_generalLock)
            {
                _commandQ.RemoveAt(0);
            }

            return(response);
        }
        private void AppBinFwVer()
        {
            IFlBinMessage binMsg = new FlBinMessageCommand()
            {
                MessageId = FlMessageId.ReadFirmwareVersion
            };

            binMsg.Header.device_id          = 1;
            binMsg.Header.flag1.sequence_num = _hostSimul.GetNextSeqNum();

            IFlMessage message = binMsg;

            FlBinPacketBuilder.BuildMessagePacket(ref message);

            _hostSimul.ResponseReceived = false;
            _hostSimul.SendPacket(message.Buffer);

            WaitForResponse();
        }
        private void AppWriteGpio()
        {
            IFlMessage message = null;

            if (_flMsgMgr.MessageType == FwMessageType.Text)
            {
                message = new FlTxtMessageCommand()
                {
                    MessageId = FlMessageId.WriteGpio,
                    Arguments = new List <object>()
                    {
                        _deviceId.ToString(), // DeviceID
                        "3",                  // GPIO number
                        "1"                   // GPIO value
                    }
                };
                FlTxtPacketBuilder.BuildMessagePacket(ref message);
            }
            else if (_flMsgMgr.MessageType == FwMessageType.Binary)
            {
                IFlBinMessage binMsg = new FlBinMessageCommand()
                {
                    MessageId = FlMessageId.WriteGpio,
                    Arguments = new List <object>()
                    {
                        (byte)3,
                        (byte)1
                    }
                };
                binMsg.Header.device_id          = _deviceId;
                binMsg.Header.flag1.sequence_num = GetNextSeqNum();

                message = binMsg;
                FlBinPacketBuilder.BuildMessagePacket(ref message);
            }

            _flMsgMgr.EnqueueCommand(message);
        }
        private void AppBinHwVer()
        {
            if (CheckStartStatus() != true)
            {
                return;
            }

            IFlBinMessage binMsg = new FlBinMessageCommand()
            {
                MessageId = FlMessageId.ReadHardwareVersion
            };

            binMsg.Header.device_id          = 1;
            binMsg.Header.flag1.sequence_num = _hostSimul.GetNextSeqNum();

            IFlMessage message = binMsg;

            FlBinPacketBuilder.BuildMessagePacket(ref message);

            _hostSimul.ResponseReceived = false;
            _hostSimul.SendPacket(message.Buffer);

            WaitForResponse();
        }
        private void AppBootBmode()
        {
            IFlMessage message = null;

            if (_flMsgMgr.MessageType == FwMessageType.Text)
            {
                message = new FlTxtMessageCommand()
                {
                    MessageId = FlMessageId.BootMode,
                    Arguments = new List <object>()
                    {
                        _deviceId.ToString(),                         // DeviceID
                            FlConstant.FL_BMODE_BOOTLOADER.ToString() // Bootloader
                    }
                };
                FlTxtPacketBuilder.BuildMessagePacket(ref message);
            }
            else if (_flMsgMgr.MessageType == FwMessageType.Binary)
            {
                IFlBinMessage binMsg = new FlBinMessageCommand()
                {
                    MessageId = FlMessageId.BootMode,
                    Arguments = new List <object>()
                    {
                        (byte)FlConstant.FL_BMODE_BOOTLOADER
                    }
                };
                binMsg.Header.device_id          = _deviceId;
                binMsg.Header.flag1.sequence_num = GetNextSeqNum();

                message = binMsg;
                FlBinPacketBuilder.BuildMessagePacket(ref message);
            }

            _flMsgMgr.EnqueueCommand(message);
        }