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); }
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); }
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); }
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); }