コード例 #1
0
ファイル: GTEDeviceCommand.cs プロジェクト: jesumarquez/lt
            public bool isValidResponse(GarminCommand garminCommandResponse)
            {
                // Valid Packet Ids in both commands
                var result = validPacketIds.Any(l => l == PacketId) && (garminCommandResponse.isAcknowledge || validPacketIds.Any(l => l == garminCommandResponse.PacketId));

                if (result)
                {
                    if (!garminCommandResponse.isAcknowledge)
                    {
                        if (PacketId == 0xA1 && garminCommandResponse.PacketId == 0xA1)
                        {
                            result =
                                validA1Combinations.Any(
                                    kv => CommandId == kv.Key && garminCommandResponse.CommandId == kv.Value);
                        }
                    }
                    else
                    {
                        result = (MessageId == garminCommandResponse.MessageId && ((PacketId == 0xA1 && validA1NonReturn.Any(v => v == CommandId)) || PacketId == 0x06));
                    }
                }

                return(result);
            }
コード例 #2
0
        public override DeviceCommandResponseStatus isExpectedResponse(BaseDeviceCommand response)
        {
            var error  = "";
            var result = base.isExpectedResponse(response);

            STrace.Error("GARMIN RESPONSE", IdNum ?? response.IdNum ?? 0, string.Format("MessageId: {0}, response.MessageId: {1}", MessageId, response.MessageId));

            if (DeviceCommandResponseStatus.Valid == result)
            {
                var rcmd = response.getCommand();

                const string zz =
                    @"^[E|Q|R|S]{1}(?<COMMANDPREFIX>[A-Z]{2}(?:[*|U]|\s|[0-9]{1}(?:$|\s)|[A-Z0-9]{2}|[SP.],))";
                var matchCmd  = Regex.Match(_command, zz);
                var matchRCmd = Regex.Match(rcmd, zz);

                if (matchCmd.Success && matchRCmd.Success && matchCmd.Groups["COMMANDPREFIX"].Success &&
                    matchRCmd.Groups["COMMANDPREFIX"].Success)
                {
                    var cmdPrefix  = matchCmd.Groups["COMMANDPREFIX"].Value;
                    var rCmdPrefix = matchRCmd.Groups["COMMANDPREFIX"].Value;
                    result = (cmdPrefix == rCmdPrefix ||
                              (cmdPrefix.Contains("*") && cmdPrefix == rCmdPrefix.Replace("*", " ")) ? DeviceCommandResponseStatus.Valid: DeviceCommandResponseStatus.Invalid);

                    if (DeviceCommandResponseStatus.Valid != result)
                    {
                        if (validGAPCombinations.ContainsKey(cmdPrefix))
                        {
                            result = validGAPCombinations[cmdPrefix] == rCmdPrefix
                                         ? DeviceCommandResponseStatus.Valid
                                         : DeviceCommandResponseStatus.Invalid;
                        }
                    }
                }
                else
                {
                    var cmdPrefix  = _command.Substring(1, 2);
                    var rCmdPrefix = rcmd.Substring(1, 2);
                    result = (result == DeviceCommandResponseStatus.Valid && (cmdPrefix == rCmdPrefix)) ? DeviceCommandResponseStatus.Valid : DeviceCommandResponseStatus.Invalid;

                    if (result != DeviceCommandResponseStatus.Valid)
                    {
                        error += " + '" + rCmdPrefix + "' IS NOT AN EXPECTED RESPONSE FOR '" + cmdPrefix + "'";
                    }

                    if (result == DeviceCommandResponseStatus.Valid)
                    {
                        result = ((response.MessageId == null || response.MessageId == MessageId) && response.IdNum == IdNum) ? DeviceCommandResponseStatus.Valid : DeviceCommandResponseStatus.Invalid;
                        if (result != DeviceCommandResponseStatus.Valid)
                        {
                            error += " + INVALID ID/MESSAGE  ID=" + MessageId + "/" + response.MessageId + " - " + IdNum +
                                     "/" + response.IdNum;
                            error += Environment.NewLine +
                                     String.Format("=>{0}{1}=>{2}", getCommand(), "/", response.getCommand());
                        }
                    }
                }

                if (!String.IsNullOrEmpty(error))
                {
                    STrace.Debug(typeof(GTEDeviceCommand).FullName, IdNum ?? response.IdNum ?? 0, "GTE LEVEL   :" + error);
                }
                error = "";

                if (DeviceCommandResponseStatus.Valid == result)
                {
                    var gCommand = ">" + _command + ";ID=" + String.Format("{0:0000}", IdNum) +
                                   (MessageId != null ? ";#" + String.Format("{0:X4}", MessageId.Value) : "") + "<";
                    var gDC =
                        GarminCommand.createFrom(gCommand);
                    if (gDC.Success) // Success Parsing Garmin Command // its a Garmin Command
                    {
                        var grDC = GarminCommand.createFrom(response.ToString(true));
                        if (grDC.Success)
                        {
                            result = gDC.IsValidResponse(grDC);

                            if (result == DeviceCommandResponseStatus.Invalid && !grDC.isAcknowledge)
                            {
                                error += " + '" + response + "' WAS NOT AN EXPECTING RESPONSE";
                            }
                        }
                        if (!String.IsNullOrEmpty(error))
                        {
                            STrace.Debug(typeof(GTEDeviceCommand).FullName, IdNum ?? response.IdNum ?? 0, "GARMIN LEVEL:" + error);
                        }
                        else
                        {
                            //              STrace.Debug(typeof(GTEDeviceCommand).FullName, IdNum ?? response.IdNum ?? 0, "GARMIN LEVEL: + EXPECTED RESPONSE");
                            //result = DeviceCommandResponseStatus.Valid;
                        }
                    }
                    else
                    {
                        //                  STrace.Debug(typeof(GTEDeviceCommand).FullName, IdNum ?? response.IdNum ?? 0, "GTE LEVEL   : + EXPECTED RESPONSE");
                    }
                }
            }
            //   STrace.Debug(typeof (GTEDeviceCommand).FullName, IdNum??response.IdNum??0, String.Format("- GET GARMIN RESPONSE {0} -", result));
            return(result);
        }
コード例 #3
0
            public DeviceCommandResponseStatus IsValidResponse(GarminCommand garminCommandResponse)
            {
                // Valid Packet Ids in both commands
                var cond1  = validPacketIds.Any(l => l == PacketId);
                var cond2  = validPacketIds.Any(l => l == garminCommandResponse.PacketId);
                var result = cond1 && (cond2 || garminCommandResponse.isAcknowledge);

                if (result == false)
                {
                    STrace.Error("GARMIN RESPONSE", IdNum, string.Format("Invalid Packet Ids - cond1: {0}, cond2: {1}, isAcknowledge: {2}", cond1, cond2, garminCommandResponse.isAcknowledge));
                }

                if (result)
                {
                    if (!garminCommandResponse.isAcknowledge)
                    {
                        if (PacketId == 0xA1 && garminCommandResponse.PacketId == 0xA1)
                        {
                            result = validA1Combinations.Any(kv => CommandId == kv.Key && garminCommandResponse.CommandId == kv.Value);
                            if (result == false)
                            {
                                STrace.Error("GARMIN RESPONSE", IdNum, string.Format("Invalid A1 Combinations - CommandId: {0}, garminCommandResponse.CommandId: {1}", CommandId, garminCommandResponse.CommandId));
                            }
                        }
                    }
                    else
                    {
                        result = (MessageId == garminCommandResponse.MessageId && ((PacketId == 0xA1 && validA1NonReturn.Any(v => v == CommandId)) || PacketId == 0x06));
                        if (result == false)
                        {
                            STrace.Error("GARMIN RESPONSE", IdNum, string.Format("Invalid MessageId - MessageId: {0}, garminCommandResponse.MessageId: {1}, PacketId: {2}", MessageId, garminCommandResponse.MessageId, PacketId));
                        }
                    }
                }

                if (result && !garminCommandResponse.isAcknowledge) // check for exceptions
                {
                    var pArr  = StringUtils.HexStringToByteArray(Payload);
                    var rPArr = StringUtils.HexStringToByteArray(garminCommandResponse.Payload);
                    switch (garminCommandResponse.CommandId)
                    {
                    case FmiPacketId.CsStopStatus:

                        //response && lastsent

                        /*
                         * typedef struct / D603 /
                         * {
                         * uint32 unique_id;
                         * uint16 stop_status;
                         * uint16 stop_index_in_list;
                         * } stop_status_data_type;
                         */
                        var rUId        = BitConverter.ToUInt32(rPArr, 2);
                        var rStopStatus = BitConverter.ToUInt16(rPArr, 4);

                        if (((StopStatusValue)rStopStatus) != StopStatusValue.StopStatusUnreadInactive)
                        {
                            break;
                        }

                        var UId = BitConverter.ToUInt32(pArr, 2);

                        if (UId != rUId)
                        {
                            STrace.Error("GARMIN RESPONSE", IdNum, string.Format("UId != rUId - UId: {0}, rUId: {1}", UId, rUId));
                        }

                        return(UId == rUId ? DeviceCommandResponseStatus.Valid : DeviceCommandResponseStatus.Invalid);

                    case FmiPacketId.CsTextMessageReceiptA604OpenServer2Client:
                        /*
                         * typedef struct / D604 /
                         *  {
                         *      time_type origination_time;
                         *      uint8 id_size;
                         *      boolean result_code;
                         *      uint16 reserved; / set to 0 /
                         *      uint8 id[/ 16 bytes /];
                         *  } server_to_client_text_msg_receipt_data_type;
                         *
                         * status_code:
                         *      0 == false
                         *      1 == true
                         */

                        if (rPArr.Length > 5)
                        {
                            return(rPArr[6] == 0 ? DeviceCommandResponseStatus.Exception : DeviceCommandResponseStatus.Valid);
                        }
                        break;

                    case FmiPacketId.CsTextMessageStatus:
                        /*
                         * typedef struct / D604 /
                         * {
                         *  uint8 id_size;
                         *  uint8 status_code;
                         *  uint16 reserved; / set to 0 /
                         *  uint8 id[/ 16 bytes /];
                         * } message_status_data_type;
                         *
                         * status_code:
                         *      0 Message is unread
                         *      1 Message is read
                         *      2 Message is not found (e.g. deleted)
                         *
                         */
                        if (rPArr.Length > 1)
                        {
                            return(rPArr[2] == 2 ? DeviceCommandResponseStatus.Exception : DeviceCommandResponseStatus.Valid);
                        }
                        break;

                    case FmiPacketId.CsDeleteTextMessageResponse:
                        /*
                         * typedef struct / D607 /
                         * {
                         *  uint8 id_size;
                         *  boolean status_code;
                         *  uint16 reserved; / set to 0 /
                         *  uint8 id[/ 16 bytes /];
                         * } message_delete_response_data_type;
                         *
                         * status_code:
                         *      0 == message was found but could not be deleted
                         *      1 == otherwise
                         */
                        if (rPArr.Length > 1)
                        {
                            return(rPArr[2] == 0 ? DeviceCommandResponseStatus.Exception : DeviceCommandResponseStatus.Valid);
                        }
                        break;

                    case FmiPacketId.CsCreateWaypointReceipt:
                        /*
                         * typedef struct / D607 /
                         * {
                         *  uint16 unique_id;
                         *  boolean status_code;
                         *  uint8 reserved; / set to 0 /
                         * } waypoint_receipt_data_type;
                         *
                         * status_code:
                         *      1 == true if the operation was succesful
                         *      0 == otherwise
                         */
                        if (rPArr.Length > 2)
                        {
                            return(rPArr[3] == 0 ? DeviceCommandResponseStatus.Exception : DeviceCommandResponseStatus.Valid);
                        }
                        break;

                    case FmiPacketId.WaypointDeleted:
                        /*
                         * typedef struct / D607 /
                         * {
                         *  uint16 unique_id;
                         *  boolean status_code;
                         *  uint8 reserved; / set to 0 /
                         * } waypoint_deleted_data_type;
                         *
                         * status_code:
                         *      1 == true if the waypoint with the specified unique_id no longer exists
                         *      0 == otherwise
                         */
                        if (rPArr.Length > 2)
                        {
                            return(rPArr[3] == 0 ? DeviceCommandResponseStatus.Exception : DeviceCommandResponseStatus.Valid);
                        }
                        break;

                    case FmiPacketId.CsCreateWaypointByCategoryReceipt:
                        /*
                         * typedef struct / D607 /
                         * {
                         *  uint8 cat_id;
                         *  boolean status_code;
                         * } waypoint_cat_receipt_data_type;
                         *
                         * status_code:
                         *      0 == otherwise
                         *      1 == true if the operation was succesful
                         */
                        if (rPArr.Length > 1)
                        {
                            return(rPArr[2] == 0 ? DeviceCommandResponseStatus.Exception : DeviceCommandResponseStatus.Valid);
                        }
                        break;
                    }
                }

                return(result ? DeviceCommandResponseStatus.Valid : DeviceCommandResponseStatus.Invalid);
            }
コード例 #4
0
ファイル: GTEDeviceCommand.cs プロジェクト: jesumarquez/lt
        public bool isExpectedResponse(string response)
        {
            var result = false;

            var r    = createFrom(response);
            var rcmd = r.getCommand();

            #region Verify if we are receiving an expecting response for the last fota sent
            var rcmd_fistLetter = rcmd.Substring(0, 1);
            var cmd_firstLetter = _command.Substring(0, 1);

            var error = "";

            if (new String[] { "E", "R" }.Any(l => l == rcmd_fistLetter))
            {
                result = new String[] { "Q", "S" }.Any(l => l == cmd_firstLetter);
                if (!result)
                {
                    error += " + WE WERE EXPECTING RESPONSE (R) OR ERROR (E)";
                }

/*
 *              if (!result)
 *                  STrace.Debug(typeof(GTEDeviceCommand).FullName, DeviceId, "GTE #0.1: NOT AN EXPECTED RESPONSE " + cmd_firstLetter + " => " + rcmd_fistLetter );
 */
                const string zz        = @"^[E|Q|R|S]{1}(?<COMMANDPREFIX>[A-Z]{2}(?:[*|U]|\s|[0-9]{1}(?:$|\s)|[A-Z0-9]{2}|[SP.],))";
                var          matchCmd  = Regex.Match(_command, zz);
                var          matchRCmd = Regex.Match(rcmd, zz);

                if (matchCmd.Success && matchRCmd.Success && matchCmd.Groups["COMMANDPREFIX"].Success && matchRCmd.Groups["COMMANDPREFIX"].Success)
                {
                    var cmdPrefix  = matchCmd.Groups["COMMANDPREFIX"].Value;
                    var rCmdPrefix = matchRCmd.Groups["COMMANDPREFIX"].Value;
                    result = cmdPrefix == rCmdPrefix || (cmdPrefix.Contains("*") && cmdPrefix == rCmdPrefix.Replace("*", " "));

                    if (!result)
                    {
                        if (validGAPCombinations.ContainsKey(cmdPrefix))
                        {
                            result = validGAPCombinations[cmdPrefix] == rCmdPrefix;
                        }
                    }

/*
 *                  if (!result)
 *                      error += " + '" + rCmdPrefix + "' IS NOT AN EXPECTED RESPONSE FOR '" + cmdPrefix + "'";
 */
                }
                else
                {
                    var cmdPrefix  = _command.Substring(1, 2);
                    var rCmdPrefix = rcmd.Substring(1, 2);
                    result = result && (cmdPrefix == rCmdPrefix);

                    if (!result)
                    {
                        error += " + '" + rCmdPrefix + "' IS NOT AN EXPECTED RESPONSE FOR '" + cmdPrefix + "'";
                    }

                    if (result)
                    {
                        result = (r.MessageId == null || r.MessageId == MessageId) && r.DeviceId == DeviceId;
                        if (!result)
                        {
                            error += " + INVALID ID/MESSAGE  ID=" + MessageId + "/" + r.MessageId + " - " + DeviceId + "/" + r.DeviceId;
                        }
                    }
                }
            }
            #endregion Verify if we are receiving an expecting response for the last fota sent

            if (!String.IsNullOrEmpty(error))
            {
                STrace.Debug(typeof(GTEDeviceCommand).FullName, DeviceId, "GTE LEVEL   :" + error);
            }
            error = "";

            if (result)
            {
                var gCommand = ">" + _command + ";ID=" + String.Format("{0:0000}", DeviceId) +
                               (MessageId != null ? ";#" + String.Format("{0:X4}", MessageId.Value) : "") + "<";
                var gDC =
                    GarminCommand.createFrom(gCommand);
                if (gDC.Success) // Success Parsing Garmin Command // its a Garmin Command
                {
                    var grDC = GarminCommand.createFrom(response);
                    if (grDC.Success)
                    {
                        result = gDC.isValidResponse(grDC);

                        /*
                         * if (!result)
                         *  error += " + '" + response + "' WAS NOT AN EXPECTING RESPONSE";
                         */
                    }
                    if (!String.IsNullOrEmpty(error))
                    {
                        STrace.Debug(typeof(GTEDeviceCommand).FullName, DeviceId, "GARMIN LEVEL:" + error);
                    }
                    else
                    {
                        STrace.Debug(typeof(GTEDeviceCommand).FullName, DeviceId, "GARMIN LEVEL: + EXPECTED RESPONSE");
                    }
                }
                else
                {
                    STrace.Debug(typeof(GTEDeviceCommand).FullName, DeviceId, "GTE LEVEL   : + EXPECTED RESPONSE");
                }
            }

            return(result);
        }