feat: Clean output mode for VC2022 -decode and -encode options
- Replace direct printf/fprintf calls with DEBUG_PRINTF macros - Clean XML-only output for -decode mode (no debug messages) - Clean hex-only output for -encode mode (no debug messages) - Standardize usage message format to match dotnet version - Add contact information to usage display - Conditional debug output only when EXI_DEBUG_MODE is enabled - All sample files (test1-5.exi) tested with clean output 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -831,7 +831,7 @@ void dump_iso1_document_to_file(const struct iso1EXIDocument* doc, const char* f
|
|||||||
}
|
}
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
printf("✓ Structure dump saved to %s\n", filename);
|
DEBUG_PRINTF(("✓ Structure dump saved to %s\n", filename));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function to convert hex string to binary
|
// Helper function to convert hex string to binary
|
||||||
@@ -1146,7 +1146,7 @@ void print_iso1_message(struct iso1EXIDocument* doc) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
printf("DEBUG: argc=%d\n", argc);
|
DEBUG_PRINTF(("DEBUG: argc=%d\n", argc));
|
||||||
int xml_mode = 0;
|
int xml_mode = 0;
|
||||||
int encode_mode = 0;
|
int encode_mode = 0;
|
||||||
char *filename = NULL;
|
char *filename = NULL;
|
||||||
@@ -1179,16 +1179,17 @@ int main(int argc, char *argv[]) {
|
|||||||
encode_mode = 1;
|
encode_mode = 1;
|
||||||
filename = argv[arg_index + 1];
|
filename = argv[arg_index + 1];
|
||||||
} else {
|
} else {
|
||||||
printf("Usage: %s [-debug] [-decode|-encode] input_file\\n", argv[0]);
|
printf("Usage: V2GDecoder [-debug] [-decode|-encode] input_file\\n");
|
||||||
printf(" %s [-debug] -encode (read XML from stdin)\\n", argv[0]);
|
printf(" V2GDecoder [-debug] -encode (read XML from stdin)\\n");
|
||||||
printf(" %s [-debug] -decode (read hex string from stdin)\\n", argv[0]);
|
printf(" V2GDecoder [-debug] -decode (read hex string from stdin)\\n");
|
||||||
printf("Enhanced EXI viewer with XML conversion capabilities\\n");
|
printf("Enhanced EXI viewer with XML conversion capabilities\\n");
|
||||||
printf(" -debug Enable detailed bit-level encoding/decoding output\\n");
|
printf(" -debug Enable detailed bit-level encoding/decoding output\\n");
|
||||||
printf(" -decode Convert EXI to Wireshark-style XML format\\n");
|
printf(" -decode Convert EXI to Wireshark-style XML format\\n");
|
||||||
printf(" -decode Read hex string from stdin (echo hex | %s -decode)\\n", argv[0]);
|
printf(" -decode Read hex string from stdin (echo hex | V2GDecoder -decode)\\n");
|
||||||
printf(" -encode Convert XML to EXI format\\n");
|
printf(" -encode Convert XML to EXI format\\n");
|
||||||
printf(" -encode Read XML from stdin (type file.xml | %s -encode)\\n", argv[0]);
|
printf(" -encode Read XML from stdin (type file.xml | V2GDecoder -encode)\\n");
|
||||||
printf(" (default) Analyze EXI with detailed output\\n");
|
printf(" (default) Analyze EXI with detailed output\\n");
|
||||||
|
printf("\\nContact: tindevil82@gmail.com\\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1208,7 +1209,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
// Handle encode mode (XML to EXI)
|
// Handle encode mode (XML to EXI)
|
||||||
if (encode_mode) {
|
if (encode_mode) {
|
||||||
fprintf(stderr, "DEBUG: Entering encode mode\n");
|
DEBUG_PRINTF(("DEBUG: Entering encode mode\n"));
|
||||||
FILE* xml_file;
|
FILE* xml_file;
|
||||||
char* xml_content;
|
char* xml_content;
|
||||||
long xml_size;
|
long xml_size;
|
||||||
@@ -1266,9 +1267,9 @@ int main(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parse XML to ISO1 document structure
|
// Parse XML to ISO1 document structure
|
||||||
fprintf(stderr, "DEBUG: About to parse XML content\n");
|
DEBUG_PRINTF(("DEBUG: About to parse XML content\n"));
|
||||||
int parse_result = parse_xml_to_iso1(xml_content, &iso1Doc);
|
int parse_result = parse_xml_to_iso1(xml_content, &iso1Doc);
|
||||||
fprintf(stderr, "DEBUG: XML parse result: %d\n", parse_result);
|
DEBUG_PRINTF(("DEBUG: XML parse result: %d\n", parse_result));
|
||||||
if (parse_result != 0) {
|
if (parse_result != 0) {
|
||||||
printf("Error parsing XML file - no supported message type found\\n");
|
printf("Error parsing XML file - no supported message type found\\n");
|
||||||
free(xml_content);
|
free(xml_content);
|
||||||
@@ -1284,17 +1285,17 @@ int main(int argc, char *argv[]) {
|
|||||||
// Debug output disabled for clean hex-only output
|
// Debug output disabled for clean hex-only output
|
||||||
|
|
||||||
if (iso1Doc.V2G_Message.Body.CurrentDemandReq_isUsed) {
|
if (iso1Doc.V2G_Message.Body.CurrentDemandReq_isUsed) {
|
||||||
fprintf(stderr, "EVReady: %s\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVReady ? "true" : "false");
|
DEBUG_PRINTF(("EVReady: %s\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVReady ? "true" : "false"));
|
||||||
fprintf(stderr, "EVErrorCode: %d\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVErrorCode);
|
DEBUG_PRINTF(("EVErrorCode: %d\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVErrorCode));
|
||||||
fprintf(stderr, "EVRESSSOC: %d\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVRESSSOC);
|
DEBUG_PRINTF(("EVRESSSOC: %d\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVRESSSOC));
|
||||||
fprintf(stderr, "EVTargetCurrent: M=%d, U=%d, V=%d\\n",
|
DEBUG_PRINTF(("EVTargetCurrent: M=%d, U=%d, V=%d\\n",
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Multiplier,
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Multiplier,
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Unit,
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Unit,
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Value);
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Value));
|
||||||
fprintf(stderr, "EVTargetVoltage: M=%d, U=%d, V=%d\\n",
|
DEBUG_PRINTF(("EVTargetVoltage: M=%d, U=%d, V=%d\\n",
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Multiplier,
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Multiplier,
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Unit,
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Unit,
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Value);
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1309,9 +1310,11 @@ int main(int argc, char *argv[]) {
|
|||||||
stream.capacity = 0;
|
stream.capacity = 0;
|
||||||
|
|
||||||
// 구조체 덤프 (디버그용, 필요시 활성화)
|
// 구조체 덤프 (디버그용, 필요시 활성화)
|
||||||
fprintf(stderr, "DEBUG: About to dump structure to temp/struct_xml.txt\n");
|
DEBUG_PRINTF(("DEBUG: About to dump structure to temp/struct_xml.txt\n"));
|
||||||
dump_iso1_document_to_file(&iso1Doc, "temp/struct_xml.txt");
|
if (EXI_DEBUG_MODE) {
|
||||||
fprintf(stderr, "DEBUG: Structure dump completed\n");
|
dump_iso1_document_to_file(&iso1Doc, "temp/struct_xml.txt");
|
||||||
|
}
|
||||||
|
DEBUG_PRINTF(("DEBUG: Structure dump completed\n"));
|
||||||
|
|
||||||
errn = encode_iso1ExiDocument(&stream, &iso1Doc);
|
errn = encode_iso1ExiDocument(&stream, &iso1Doc);
|
||||||
|
|
||||||
@@ -1422,31 +1425,31 @@ int main(int argc, char *argv[]) {
|
|||||||
print_iso1_message(&iso1Doc);
|
print_iso1_message(&iso1Doc);
|
||||||
|
|
||||||
// Compare with expected structure
|
// Compare with expected structure
|
||||||
printf("\\n=== Original EXI Structure Debug ===\\n");
|
DEBUG_PRINTF(("\\n=== Original EXI Structure Debug ===\\n"));
|
||||||
printf("V2G_Message_isUsed: %s\\n", iso1Doc.V2G_Message_isUsed ? "true" : "false");
|
DEBUG_PRINTF(("V2G_Message_isUsed: %s\\n", iso1Doc.V2G_Message_isUsed ? "true" : "false"));
|
||||||
printf("SessionID length: %d\\n", iso1Doc.V2G_Message.Header.SessionID.bytesLen);
|
DEBUG_PRINTF(("SessionID length: %d\\n", iso1Doc.V2G_Message.Header.SessionID.bytesLen));
|
||||||
printf("CurrentDemandReq_isUsed: %s\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq_isUsed ? "true" : "false");
|
DEBUG_PRINTF(("CurrentDemandReq_isUsed: %s\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq_isUsed ? "true" : "false"));
|
||||||
|
|
||||||
if (iso1Doc.V2G_Message.Body.CurrentDemandReq_isUsed) {
|
if (iso1Doc.V2G_Message.Body.CurrentDemandReq_isUsed) {
|
||||||
printf("EVReady: %s\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVReady ? "true" : "false");
|
DEBUG_PRINTF(("EVReady: %s\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVReady ? "true" : "false"));
|
||||||
printf("EVErrorCode: %d\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVErrorCode);
|
DEBUG_PRINTF(("EVErrorCode: %d\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVErrorCode));
|
||||||
printf("EVRESSSOC: %d\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVRESSSOC);
|
DEBUG_PRINTF(("EVRESSSOC: %d\\n", iso1Doc.V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVRESSSOC));
|
||||||
printf("EVTargetCurrent: M=%d, U=%d, V=%d\\n",
|
DEBUG_PRINTF(("EVTargetCurrent: M=%d, U=%d, V=%d\\n",
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Multiplier,
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Multiplier,
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Unit,
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Unit,
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Value);
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Value));
|
||||||
printf("EVMaximumVoltageLimit_isUsed: %s\\n",
|
DEBUG_PRINTF(("EVMaximumVoltageLimit_isUsed: %s\\n",
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit_isUsed ? "true" : "false");
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit_isUsed ? "true" : "false"));
|
||||||
printf("EVMaximumCurrentLimit_isUsed: %s\\n",
|
DEBUG_PRINTF(("EVMaximumCurrentLimit_isUsed: %s\\n",
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit_isUsed ? "true" : "false");
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit_isUsed ? "true" : "false"));
|
||||||
printf("EVMaximumPowerLimit_isUsed: %s\\n",
|
DEBUG_PRINTF(("EVMaximumPowerLimit_isUsed: %s\\n",
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit_isUsed ? "true" : "false");
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit_isUsed ? "true" : "false"));
|
||||||
printf("BulkChargingComplete_isUsed: %s\\n",
|
DEBUG_PRINTF(("BulkChargingComplete_isUsed: %s\\n",
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.BulkChargingComplete_isUsed ? "true" : "false");
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.BulkChargingComplete_isUsed ? "true" : "false"));
|
||||||
printf("RemainingTimeToFullSoC_isUsed: %s\\n",
|
DEBUG_PRINTF(("RemainingTimeToFullSoC_isUsed: %s\\n",
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC_isUsed ? "true" : "false");
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC_isUsed ? "true" : "false"));
|
||||||
printf("RemainingTimeToBulkSoC_isUsed: %s\\n",
|
DEBUG_PRINTF(("RemainingTimeToBulkSoC_isUsed: %s\\n",
|
||||||
iso1Doc.V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC_isUsed ? "true" : "false");
|
iso1Doc.V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC_isUsed ? "true" : "false"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user