diff --git a/Software/src/debugger.cpp b/Software/src/debugger.cpp index 85373a5..148a249 100644 --- a/Software/src/debugger.cpp +++ b/Software/src/debugger.cpp @@ -15,7 +15,17 @@ DebugStatus_t DebuggerStatus[dbg_cntElements]; -void processCmdDebug(String command); +// Funktionszeiger +typedef void (*CommandFunction)(); + +// Struktur zur Zuordnung von Commands zu Funktionen +struct CommandMapping +{ + const char *command; + CommandFunction function; +}; + +void processCmdDebug(const char *command); void Debug_formatCFG(); void Debug_formatPersistence(); void Debug_printSystemInfo(); @@ -26,8 +36,97 @@ void Debug_dumpPersistance(); void Debug_ShowDTCs(); void Debug_dumpGlobals(); void Debug_printHelp(); +void Debug_Reboot(); const char *uint32_to_binary_string(uint32_t num); +// Adapter-Functions for Debug-Commands +void adapterCheckEEPOM() { Debug_CheckEEPOM(false); } +void adapterCheckEEPOMFix() { Debug_CheckEEPOM(true); } +void adapterDumpEEPROM1k() { dumpEEPROM(0, 1024); } +void adapterDumpEEPROMAll() { dumpEEPROM(0, EEPROM_SIZE_BYTES); } +void adapterKillEEPROM() { writeSequentialToEEPROM(0, 1024); } +void adapterZeroEEPROM() { writeZeroToEEPROM(0, 1024); } +void adapterResetPageEEPROM() { MovePersistencePage_EEPROM(true); } +void adapterSaveEEPROM() { globals.requestEEAction = EE_ALL_SAVE; } +void adapterSetDebugPort() { SetDebugportStatus(dbg_Serial, enabled); } +void adapterCritDTC() { MaintainDTC(DTC_FAKE_DTC_CRIT, true, millis()); } +void adapterWarnDTC() { MaintainDTC(DTC_FAKE_DTC_WARN, true, millis()); } +void adapterInfoDTC() { MaintainDTC(DTC_FAKE_DTC_INFO, true, millis()); } +void adapterNotifyError() { Websocket_PushNotification("Debug Error Notification", error); } +void adapterNotifyWarning() { Websocket_PushNotification("Debug Warning Notification", warning); } +void adapterNotifySuccess() { Websocket_PushNotification("Debug Success Notification", success); } +void adapterNotifyInfo() { Websocket_PushNotification("Debug Info Notification", info); } + +// Definition der Command-Mapping-Tabelle +const CommandMapping commandMappings[] = { + {"help", Debug_printHelp}, + {"reboot", Debug_Reboot}, + {"sysinfo", Debug_printSystemInfo}, + {"netinfo", Debug_printWifiInfo}, + {"formatCFG", Debug_formatCFG}, + {"formatPDS", Debug_formatPersistence}, + {"checkEE", adapterCheckEEPOM}, + {"checkEEfix", adapterCheckEEPOMFix}, + {"dumpEE1k", adapterDumpEEPROM1k}, + {"dumpEE", adapterDumpEEPROMAll}, + {"killEE", adapterKillEEPROM}, + {"zeroEE", adapterZeroEEPROM}, + {"resetPageEE", adapterResetPageEEPROM}, + {"dumpCFG", Debug_dumpConfig}, + {"dumpPDS", Debug_dumpPersistance}, + {"saveEE", adapterSaveEEPROM}, + {"dumpGlobals", Debug_dumpGlobals}, + {"sdbg", adapterSetDebugPort}, + {"dtc_show", Debug_ShowDTCs}, + {"dtc_clear", ClearAllDTC}, + {"dtc_crit", adapterCritDTC}, + {"dtc_warn", adapterWarnDTC}, + {"dtc_info", adapterInfoDTC}, + {"notify_error", adapterNotifyError}, + {"notify_warning", adapterNotifyWarning}, + {"notify_success", adapterNotifySuccess}, + {"notify_info", adapterNotifyInfo}, +}; + +const size_t NUM_COMMANDS = sizeof(commandMappings) / sizeof(commandMappings[0]); + +const char helpText[][64] PROGMEM = { + "help - Print this help text", + "sysinfo - System Info", + "reboot - System Reboot", + "netinfo - WiFi Info", + "formatPDS - Format Persistence EEPROM Data", + "formatCFG - Format Configuration EEPROM Data", + "checkEE - Check EEPROM with checksum", + "checkEEfix - Check and fix EEPROM with checksum", + "dumpEE1k - Dump the first 1kb of EEPROM to Serial", + "dumpEE - Dump the whole EEPROM to Serial", + "killEE - Kill the first 1024 bytes of EEPROM", + "zeroEE - Zero the first 1024 bytes of EEPROM", + "resetPageEE - Reset the PersistenceData Page", + "dumpCFG - Print Config struct", + "dumpPDS - Print PersistenceStruct", + "saveEE - Save EE-Data", + "dumpGlobals - Print globals", + "sdbg - Set debug port status", + "dtc_show - Show all DTCs", + "dtc_clear - Clear all DTCs", + "dtc_crit - Maintain critical DTC", + "dtc_warn - Maintain warning DTC", + "dtc_info - Maintain info DTC", + "notify_error - Send error notification", + "notify_warning - Send warning notification", + "notify_success - Send success notification", + "notify_info - Send info notification" +}; + +const size_t NUM_HELP_LINES = sizeof(helpText) / sizeof(helpText[0]); + +// Überprüfen, ob die Anzahl der Commands und Hilfetext-Zeilen übereinstimmen +static_assert(NUM_COMMANDS == NUM_HELP_LINES, "Number of commands and help text lines do not match!"); + + + /** * @brief Initializes the debugger by setting the initial status for different debug ports. * Serial debug output is turned off. @@ -109,7 +208,7 @@ void Debug_Process() break; case CMD_COMPLETE: - processCmdDebug(String(inputBuffer)); + processCmdDebug(inputBuffer); break; case CMD_OVERFLOW: @@ -184,65 +283,22 @@ void Debug_pushMessage(const char *format, ...) * * @param command The debug command to be processed. */ -void processCmdDebug(String command) +void processCmdDebug(const char *command) { - // Check the received command and execute corresponding actions - if (command == "help") - Debug_printHelp(); - else if (command == "reboot") - globals.systemStatus = sysStat_Shutdown; - else if (command == "sysinfo") - Debug_printSystemInfo(); - else if (command == "netinfo") - Debug_printWifiInfo(); - else if (command == "formatCFG") - Debug_formatCFG(); - else if (command == "formatPDS") - Debug_formatPersistence(); - else if (command == "checkEE") - Debug_CheckEEPOM(false); - else if (command == "checkEEfix") - Debug_CheckEEPOM(true); - else if (command == "dumpEE1k") - dumpEEPROM(0, 1024); - else if (command == "dumpEE") - dumpEEPROM(0, EEPROM_SIZE_BYTES); - else if (command == "killEE") - writeSequentialToEEPROM(0, 1024); - else if (command == "zeroEE") - writeZeroToEEPROM(0, 1024); - else if (command == "resetPageEE") - MovePersistencePage_EEPROM(true); - else if (command == "dumpCFG") - Debug_dumpConfig(); - else if (command == "dumpPDS") - Debug_dumpPersistance(); - else if (command == "saveEE") - globals.requestEEAction = EE_ALL_SAVE; - else if (command == "dumpGlobals") - Debug_dumpGlobals(); - else if (command == "sdbg") - SetDebugportStatus(dbg_Serial, enabled); - else if (command == "dtc_show") - Debug_ShowDTCs(); - else if (command == "dtc_clear") - ClearAllDTC(); - else if (command == "dtc_crit") - MaintainDTC(DTC_FAKE_DTC_CRIT, true, millis()); - else if (command == "dtc_warn") - MaintainDTC(DTC_FAKE_DTC_WARN, true, millis()); - else if (command == "dtc_info") - MaintainDTC(DTC_FAKE_DTC_INFO, true, millis()); - else if (command == "notify_error") - Websocket_PushNotification("Debug Error Notification", error); - else if (command == "notify_warning") - Websocket_PushNotification("Debug Warning Notification", warning); - else if (command == "notify_success") - Websocket_PushNotification("Debug Success Notification", success); - else if (command == "notify_info") - Websocket_PushNotification("Debug Info Notification", info); - else + bool commandFound = false; + for (size_t i = 0; i < NUM_COMMANDS; ++i) + { + if (strcmp(command, commandMappings[i].command) == 0) + { + commandMappings[i].function(); + commandFound = true; + break; + } + } + if (!commandFound) + { Debug_pushMessage("unknown Command\n"); + } } /** @@ -415,7 +471,7 @@ void Debug_ShowDTCs() char buff_active[9]; // Header for the DTC display - Debug_pushMessage("\n timestamp | DTC-Nr. | status | severity\n"); + Debug_pushMessage("\n timestamp | DTC-Nr. | status | debugval\n"); // Iterate through DTCStorage and display each entry for (uint32_t i = 0; i < MAX_DTC_STORAGE; i++) @@ -439,31 +495,37 @@ void Debug_ShowDTCs() strcpy(buff_active, "none"); // Display DTC information - Debug_pushMessage("%s %7d %8s %8d\n", buff_timestamp, DTCStorage[i].Number, buff_active); + Debug_pushMessage("%s %7d %8s %8d\n", buff_timestamp, DTCStorage[i].Number, buff_active, DTCStorage[i].debugVal); } } } /** - * @brief Displays the help commands for debugging through Serial or WebUI. - * Each command is printed individually in a formatted manner. + * @brief Prints the help information stored in PROGMEM. */ void Debug_printHelp() { - char buff[64]; - - // Iterate through helpCmd and display each command - for (unsigned int i = 0; i < sizeof(helpCmd) / 63; i++) + char buffer[64]; + for (size_t i = 0; i < NUM_HELP_LINES; ++i) { - // Copy a portion of helpCmd to buff for display - memcpy_P(buff, (helpCmd + (i * 63)), 63); - buff[63] = 0; + strcpy_P(buffer, (PGM_P)pgm_read_word(&(helpText[i]))); // Display the help command - Debug_pushMessage(buff); + Debug_pushMessage(buffer); } } +/** + * @brief Initiates a system reboot by setting the system status to shutdown. + * + * This function sets the global system status to `sysStat_Shutdown`, + * which will trigger a system reboot sequence. + */ +void Debug_Reboot() +{ + globals.systemStatus = sysStat_Shutdown; +} + /** * @brief Convert a uint32_t value to a binary string with nibbles separated by a space. *