コード例 #1
0
        private FlTxtMessageResponse GetResponse(FlTxtMessageCommand command)
        {
            FlTxtMessageResponse response = null;
            int count = 0;
            int i;

            lock (_generalLock)
            {
                count = _responseQ.Count;
            }

            if (count > 0)
            {
                Console.WriteLine($"Response count : {count}");
            }

            for (i = 0; i < count; i++)
            {
                if (_responseQ[i].MessageId == command.MessageId)
                {
                    lock (_generalLock)
                    {
                        response = _responseQ[i];
                        _responseQ.RemoveAt(i);
                    }
                    break;
                }
            }

            return(response);
        }
コード例 #2
0
        private void AppTxtWriteGpio()
        {
            if (CheckStartStatus() != true)
            {
                return;
            }

            IFlMessage message = new FlTxtMessageCommand()
            {
                MessageId = FlMessageId.WriteGpio,
                Arguments = new List <object>()
                {
                    "1", // DeviceID
                    "1", // GPIO number
                    "1"  // GPIO value
                }
            };

            FlTxtPacketBuilder.BuildMessagePacket(ref message);

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

            WaitForResponse();
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        private IFlMessage ProcessCommand(FlTxtMessageCommand command)
        {
            TimeSpan   timeSpan;
            bool       waitTimeExpired;
            IFlMessage response = null;
            IFlMessage message  = (IFlMessage)command;

            FlTxtPacketBuilder.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);
        }
コード例 #5
0
        private void OnTxtCommandResultReady(FwCommandMessageResult cmdResult)
        {
            FlTxtMessageCommand command = (FlTxtMessageCommand)cmdResult.Command;
            int      i;
            TimeSpan spanTime;

            DateTime         now          = DateTime.UtcNow;
            TxtCommandResult txtCmdResult = new TxtCommandResult()
            {
                Command     = command,
                Response    = (FlTxtMessageResponse)cmdResult.Response,
                CreatedDate = cmdResult.CreatedDate,
                LogName     = $"{now.Year}{now.Month.ToString("00")}{now.Day.ToString("00")} {now.Hour.ToString("00")}:{now.Minute.ToString("00")}:{now.Second.ToString("00")}.{now.Millisecond.ToString("000")}"
            };

            col.Insert(txtCmdResult);

            Console.WriteLine($"Command : {command.MessageId}");
            Console.WriteLine($"Try count : {command.TryCount}");
            if (command.TryCount > 1)
            {
                for (i = 0; i < command.TryCount; i++)
                {
                    if ((i + 1) < command.TryCount)
                    {
                        spanTime = command.SendTimeHistory[i + 1] - command.SendTimeHistory[i];
                        Console.WriteLine($"Try interval : {spanTime.TotalMilliseconds}");
                    }
                }
            }

            if (command.TryCount > 0)
            {
                spanTime = cmdResult.CreatedDate - command.SendTimeHistory[0];
                Console.WriteLine($"Total processing time : {spanTime.TotalMilliseconds}");
            }

            if (cmdResult.Response != null)
            {
                if (cmdResult.Response.Arguments?.Count > 0)
                {
                    foreach (var item in cmdResult.Response.Arguments)
                    {
                        Console.WriteLine($"{item}");
                    }
                }
            }
            else
            {
                Console.WriteLine("No response");
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        private void AppTxtFwVer()
        {
            if (CheckStartStatus() != true)
            {
                return;
            }

            IFlMessage message = new FlTxtMessageCommand()
            {
                MessageId = FlMessageId.ReadFirmwareVersion,
                Arguments = new List <object>()
                {
                    "1" // DeviceID
                }
            };

            FlTxtPacketBuilder.BuildMessagePacket(ref message);

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

            WaitForResponse();
        }
コード例 #8
0
        private void AppTxtBootBmode()
        {
            if (CheckStartStatus() != true)
            {
                return;
            }

            IFlMessage message = new FlTxtMessageCommand()
            {
                MessageId = FlMessageId.BootMode,
                Arguments = new List <object>()
                {
                    "1", // DeviceID
                    "1"  // Bootloader
                }
            };

            FlTxtPacketBuilder.BuildMessagePacket(ref message);

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

            WaitForResponse();
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        public FlParseState ParseCommand(byte data, out IFlMessage message)
        {
            FlParseState ret = FlParseState.Parsing;

            message = null;
            if (_fullPacketLength < FlConstant.FL_TXT_MSG_MAX_LENGTH)
            {
                _fullPacket[_fullPacketLength++] = data;
            }

            switch (_receiveState)
            {
            case ReceiveState.MessageId:
                if (IsMsgIdChar(data) == true)
                {
                    _buf[_bufPos++] = data;
                    if (_bufPos > FlConstant.TXT_MSG_ID_MAX_LEN)
                    {
                        ret = FlParseState.ParseFail;
                    }
                }
                else if (data == FlConstant.FL_TXT_MSG_ID_DEVICE_ID_DELIMITER)
                {
                    _msgId = GetMessageId();
                    if (_msgId != FlMessageId.Unknown)
                    {
                        _receiveState = ReceiveState.DeviceId;
                        ClearReceiveBuffer();
                    }
                    else
                    {
                        ret = FlParseState.ParseFail;
                    }
                }
                else
                {
                    ret = FlParseState.ParseFail;
                }
                break;

            case ReceiveState.DeviceId:
                if (IsDeviceIdChar(data) == true)
                {
                    _buf[_bufPos++] = data;
                    if (_bufPos > FlConstant.TXT_DEVICE_ID_MAX_LEN)
                    {
                        ret = FlParseState.ParseFail;
                    }
                }
                else if (data == FlConstant.FL_TXT_MSG_ARG_DELIMITER)
                {
                    if (ProcessCommandData() == true)
                    {
                        if (IsCommandWithArgument(_msgId) == true)
                        {
                            _receiveState = ReceiveState.Data;
                            ClearReceiveBuffer();
                        }
                        else
                        {
                            ret = FlParseState.ParseFail;
                        }
                    }
                    else
                    {
                        ret = FlParseState.ParseFail;
                    }
                }
                else if (IsTail(data) == true)
                {
                    if (ProcessCommandData() == true)
                    {
                        _receiveState = ReceiveState.Tail;
                        ret           = FlParseState.ParseOk;
                    }
                    else
                    {
                        ret = FlParseState.ParseFail;
                    }
                }
                else
                {
                    ret = FlParseState.ParseFail;
                }
                break;

            case ReceiveState.Data:
                if (IsTail(data) != true)
                {
                    if (data != FlConstant.FL_TXT_MSG_ARG_DELIMITER)
                    {
                        _buf[_bufPos++] = data;
                        if (_bufPos >= FlConstant.FL_TXT_MSG_MAX_LENGTH)
                        {
                            ret = FlParseState.ParseFail;
                        }
                    }
                    else
                    {
                        if (ProcessCommandData() == true)
                        {
                            ClearReceiveBuffer();
                        }
                        else
                        {
                            ret = FlParseState.ParseFail;
                        }
                    }
                }
                else
                {
                    if (ProcessCommandData() == true)
                    {
                        _receiveState = ReceiveState.Tail;
                        ClearReceiveBuffer();
                        ret = FlParseState.ParseOk;
                    }
                    else
                    {
                        ret = FlParseState.ParseFail;
                    }
                }
                break;

            default:
                ret = FlParseState.ParseFail;
                break;
            }

            if (ret != FlParseState.Parsing)
            {
                if (ret == FlParseState.ParseOk)
                {
                    if (OnParseDone != null)
                    {
                        OnParseDone?.Invoke(this, null);
                    }
                    else
                    {
                        message = new FlTxtMessageCommand()
                        {
                            MessageId = _msgId,
                            Arguments = new List <object>()
                        };

                        while (_arguments.Count > 0)
                        {
                            message.Arguments.Add(_arguments[0]);
                            _arguments.RemoveAt(0);
                        }
                    }
                }

                Clear();
            }

            return(ret);
        }
コード例 #11
0
        private void ReadTempAndHum(uint deviceId, byte sensorNum)
        {
            IFlMessage command = null;

            if (_currentParserType == ParserType.Binary)
            {
                command = new FlBinMessageCommand()
                {
                    MessageId = FlMessageId.ReadTempAndHum,
                    Arguments = new List <object>()
                    {
                        sensorNum
                    }
                };
                ((FlBinMessageCommand)command).Header.device_id          = deviceId;
                ((FlBinMessageCommand)command).Header.flag1.sequence_num = _sequenceNumber;
            }
            else if (_currentParserType == ParserType.Text)
            {
                command = new FlTxtMessageCommand()
                {
                    MessageId = FlMessageId.ReadTempAndHum,
                    Arguments = new List <object>()
                    {
                        deviceId.ToString(),
                            sensorNum.ToString()
                    }
                };
            }

            if (command != null)
            {
                CommandResult result = _msgManager.ReadTemperatureAndHumidity(command);

                LbMessageHistory.Items.Add($"S : ReadTemperature");

                string response = string.Empty;
                if (result != null)
                {
                    if (result.Response != null)
                    {
                        if (_currentParserType == ParserType.Binary)
                        {
                            FlBinMessageResponse resp = (FlBinMessageResponse)result.Response;
                            if (resp.Header.flag2.error == FlConstant.FL_OK)
                            {
                                if (result.Response.Arguments?.Count == 3)
                                {
                                    response = string.Format("R : {0},{1:0.##}.{2:0.##}",
                                                             (byte)result.Response.Arguments[0],
                                                             (double)result.Response.Arguments[1],
                                                             (double)result.Response.Arguments[1]
                                                             );
                                }
                                else
                                {
                                    response = "R : Invalid response(invalid argument count)";
                                }
                            }
                            else
                            {
                                response = "R : Error";
                            }
                        }
                        else if (_currentParserType == ParserType.Text)
                        {
                            if (result.Response.Arguments?.Count == 5)
                            {
                                if ((string)result.Response.Arguments[1] == FlConstant.FL_OK.ToString())
                                {
                                    response = $"R : OK, {(string)result.Response.Arguments[2]}, {(string)result.Response.Arguments[3]}, {(string)result.Response.Arguments[4]}";
                                }
                                else
                                {
                                    response = $"R : {GetArgumentString(result.Response.Arguments)}";
                                }
                            }
                            else
                            {
                                response = $"R : {GetArgumentString(result.Response.Arguments)}";
                            }
                        }
                        else
                        {
                            response = "R : Invalid parser type";
                        }
                    }
                    else
                    {
                        response = "R : No response";
                    }
                }
                else
                {
                    response = "R : Command fail";
                }

                LbMessageHistory.Items.Add(response);
            }
        }
コード例 #12
0
        private void ReadGpio(uint deviceId, byte gpioNum)
        {
            IFlMessage command = null;

            if (_currentParserType == ParserType.Binary)
            {
                command = new FlBinMessageCommand()
                {
                    MessageId = FlMessageId.ReadGpio,
                    Arguments = new List <object>()
                    {
                        gpioNum
                    }
                };
                ((FlBinMessageCommand)command).Header.device_id          = deviceId;
                ((FlBinMessageCommand)command).Header.flag1.sequence_num = _sequenceNumber;
            }
            else if (_currentParserType == ParserType.Text)
            {
                command = new FlTxtMessageCommand()
                {
                    MessageId = FlMessageId.ReadGpio,
                    Arguments = new List <object>()
                    {
                        deviceId.ToString(),
                            gpioNum.ToString()
                    }
                };
            }

            if (command != null)
            {
                CommandResult result = _msgManager.ReadGpio(command);

                LbMessageHistory.Items.Add($"S : ReadGpio");

                string response = string.Empty;
                if (result != null)
                {
                    if (result.Response != null)
                    {
                        if (_currentParserType == ParserType.Binary)
                        {
                            FlBinMessageResponse resp = (FlBinMessageResponse)result.Response;
                            if (resp.Header.flag2.error == FlConstant.FL_OK)
                            {
                                if (result.Response.Arguments?.Count == 2)
                                {
                                    response = $"R : {(byte)result.Response.Arguments[0]},{(byte)result.Response.Arguments[1]}";
                                }
                                else
                                {
                                    response = "R : Invalid response(invalid argument count)";
                                }
                            }
                            else
                            {
                                response = "R : Error";
                            }
                        }
                        else if (_currentParserType == ParserType.Text)
                        {
                            if (result.Response.Arguments?.Count == 4)
                            {
                                if ((string)result.Response.Arguments[1] == FlConstant.FL_OK.ToString())
                                {
                                    response = $"R : OK, {(string)result.Response.Arguments[2]}, {(string)result.Response.Arguments[3]}";
                                }
                                else
                                {
                                    response = $"R : {GetArgumentString(result.Response.Arguments)}";
                                }
                            }
                            else
                            {
                                response = $"R : {GetArgumentString(result.Response.Arguments)}";
                            }
                        }
                        else
                        {
                            response = "R : Invalid parser type";
                        }
                    }
                    else
                    {
                        response = "R : No response";
                    }
                }
                else
                {
                    response = "R : Command fail";
                }

                LbMessageHistory.Items.Add(response);
            }
        }
コード例 #13
0
        private void ReadFirmwareVersion(uint deviceId)
        {
            IFlMessage command = null;

            if (_currentParserType == ParserType.Binary)
            {
                command = new FlBinMessageCommand()
                {
                    MessageId = FlMessageId.ReadFirmwareVersion
                };
                ((FlBinMessageCommand)command).Header.device_id          = deviceId;
                ((FlBinMessageCommand)command).Header.flag1.sequence_num = _sequenceNumber;
            }
            else if (_currentParserType == ParserType.Text)
            {
                command = new FlTxtMessageCommand()
                {
                    MessageId = FlMessageId.ReadFirmwareVersion,
                    Arguments = new List <object>()
                    {
                        deviceId.ToString()
                    }
                };
            }

            if (command != null)
            {
                CommandResult result = _msgManager.ReadFirmwareVersion(command);

                LbMessageHistory.Items.Add($"S : ReadFirmwareVersion");

                string response = string.Empty;
                if (result != null)
                {
                    if (result.Response != null)
                    {
                        if (_currentParserType == ParserType.Binary)
                        {
                            if (((FlBinMessageResponse)(result.Response)).Header.flag2.error == FlConstant.FL_OK)
                            {
                                if (result.Response.Arguments?.Count == 1)
                                {
                                    response = $"R : {(string)result.Response.Arguments[0]}";
                                }
                                else
                                {
                                    response = "R : Invalid response(invalid version format)";
                                }
                            }
                            else
                            {
                                response = "R : Error";
                            }
                        }
                        else if (_currentParserType == ParserType.Text)
                        {
                            if (result.Response.Arguments?.Count == 3)
                            {
                                if ((string)result.Response.Arguments[1] == FlConstant.FL_OK.ToString())
                                {
                                    response = $"R : OK, {(string)result.Response.Arguments[2]}";
                                }
                                else
                                {
                                    response = $"R : {GetArgumentString(result.Response.Arguments)}";
                                }
                            }
                            else
                            {
                                response = $"R : {GetArgumentString(result.Response.Arguments)}";
                            }
                        }
                        else
                        {
                            response = "R : Invalid parser type";
                        }
                    }
                    else
                    {
                        response = "R : No response";
                    }
                }
                else
                {
                    response = "R : Command fail";
                }

                LbMessageHistory.Items.Add(response);
            }
        }
コード例 #14
0
        private void BootMode(uint deviceId, byte bootMode)
        {
            IFlMessage command = null;

            if (_currentParserType == ParserType.Binary)
            {
                command = new FlBinMessageCommand()
                {
                    MessageId = FlMessageId.BootMode
                };
                ((FlBinMessageCommand)command).Header.device_id          = deviceId;
                ((FlBinMessageCommand)command).Header.flag1.sequence_num = _sequenceNumber;

                command.Arguments = new List <object>()
                {
                    bootMode
                };
            }
            else if (_currentParserType == ParserType.Text)
            {
                command = new FlTxtMessageCommand()
                {
                    MessageId = FlMessageId.BootMode,
                    Arguments = new List <object>()
                    {
                        deviceId.ToString(),
                            bootMode.ToString()
                    }
                };
            }

            if (command != null)
            {
                CommandResult result = _msgManager.BootMode(command);

                LbMessageHistory.Items.Add($"S : Boot mode");

                string response = string.Empty;
                if (result != null)
                {
                    if (result.Response != null)
                    {
                        if (_currentParserType == ParserType.Binary)
                        {
                            if (((FlBinMessageResponse)(result.Response)).Header.flag2.error == FlConstant.FL_OK)
                            {
                                response = $"R : OK";
                            }
                            else
                            {
                                response = "R : Error";
                            }
                        }
                        else if (_currentParserType == ParserType.Text)
                        {
                            if (result.Response.Arguments?.Count == 2)
                            {
                                if ((string)result.Response.Arguments[1] == FlConstant.FL_OK.ToString())
                                {
                                    response = $"R : OK";
                                }
                                else
                                {
                                    response = $"R : {GetArgumentString(result.Response.Arguments)}";
                                }
                            }
                            else
                            {
                                response = $"R : {GetArgumentString(result.Response.Arguments)}";
                            }
                        }
                        else
                        {
                            response = "R : Invalid parser type";
                        }
                    }
                    else
                    {
                        response = "R : No response";
                    }
                }
                else
                {
                    response = "R : Command fail";
                }

                LbMessageHistory.Items.Add(response);
            }
        }