#include #include #include #include #include #include static bool showConfigCmd(uint8_t argc, char **args) { bool retCode = true; t_configBlock configBlock; eepromReadConfigBlock(&configBlock); sendString("This is the saved configuration.\n\r"); sendString("It is not necessarily the active configuration.\n\r"); sendFormatString("configMagic: %lx\n\r", configBlock.configMagic); sendFormatString("deviceName: %s\n\r", configBlock.deviceName); sendFormatString("MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n\r", configBlock.macAddress[0], configBlock.macAddress[1], configBlock.macAddress[2], configBlock.macAddress[3], configBlock.macAddress[4], configBlock.macAddress[5]); sendFormatString("NTP Server: %s\n\r", configBlock.ntpServer); sendFormatString("deviceId: %s\n\r", configBlock.deviceId); sendFormatString("sharedSecret: (will not be displayed)\n\r"); return retCode; } static bool setStringParameterCmd(uint8_t argc, char **args, size_t offset, size_t length) { bool retCode = true; t_configBlock configBlock; char *parameterName = args[1]; char *newParameterValue = args[2]; if (strlen(newParameterValue) >= length) { sendString("given new value for is too long\n\r"); retCode = false; } else { sendFormatString("set %s to %s\n\r", parameterName, newParameterValue); eepromReadConfigBlock(&configBlock); strcpy((((char*)&configBlock) + offset), newParameterValue); eepromWriteConfigBlock(&configBlock); } return retCode; } /* static bool setInt32ParameterCmd(uint8_t argc, char **args, size_t offset, int32_t minV, int32_t maxV) { bool retCode = true; t_configBlock configBlock; char *parameterName = args[1]; char *newParameterValue = args[2]; long int value = strtol(newParameterValue, NULL, 10); if (value < minV) { sendString("value is too small\n\r"); retCode = false; } else if (value > maxV) { sendString("value is too large\n\r"); } else { int32_t v = (int32_t) value; sendFormatString("set %s to %ld\n\r", parameterName, v); eepromReadConfigBlock(&configBlock); *((int32_t*)(((uint8_t*)&configBlock) + offset)) = v; eepromWriteConfigBlock(&configBlock); } return retCode; } */ static bool setDeviceNameCmd(uint8_t argc, char **args) { return setStringParameterCmd(argc, args, offsetof(t_configBlock, deviceName), sizeof(((t_configBlock*)0)->deviceName)); } static bool setNtpServerCmd(uint8_t argc, char **args) { return setStringParameterCmd(argc, args, offsetof(t_configBlock, ntpServer), sizeof(((t_configBlock*)0)->ntpServer)); } static bool setDeviceIdCmd(uint8_t argc, char **args) { return setStringParameterCmd(argc, args, offsetof(t_configBlock, deviceId), sizeof(((t_configBlock*)0)->deviceId)); } static bool setSharedSecretCmd(uint8_t argc, char **args) { return setStringParameterCmd(argc, args, offsetof(t_configBlock, sharedSecret), sizeof(((t_configBlock*)0)->sharedSecret)); } static bool setSinkServerCmd(uint8_t argc, char **args) { return setStringParameterCmd(argc, args, offsetof(t_configBlock, sinkServer), sizeof(((t_configBlock*)0)->sinkServer)); } const static cmd_t SET_COMMANDS[] = { { .name = "devicename", .cmdFunc = setDeviceNameCmd, .help = \ "devicename ........................... Name of this device\n\r" }, { .name = "ntpserver", .cmdFunc = setNtpServerCmd, .help = \ "ntpserver ............................ Name of the NTP server\n\r" }, { .name = "deviceid", .cmdFunc = setDeviceIdCmd, .help = \ "deviceid ............................. ID of this device\n\r" }, { .name = "sharedSecret", .cmdFunc = setSharedSecretCmd, .help = \ "sharedsecret ......................... Shared secret\n\r" }, { .name = "sinkserver", .cmdFunc = setSinkServerCmd, .help = \ "sinkserver ........................... Name of the sink server\n\r" }, { .name = "END_OF_CMDS", .help = "",.cmdFunc = NULL } }; const static char UNKNOWN_PARAMETER[] = "unknown parameter\n\r"; const static char OK_MSG[] = "OK\n\r"; const static char FAILED_MSG[] = "Failed\n\r"; static bool setCmd(uint8_t argc, char **args) { bool retCode = false; uint8_t *messageToSend = NULL; char *cmd = args[1]; if (argc >= 2) { if (0 == strcmp("help", cmd)) { sendString("You can set the following parameters:\n\r"); uint8_t cmdIdx = 0; while (true) { cmd_t command = SET_COMMANDS[cmdIdx]; if (0 == strcmp("END_OF_CMDS", command.name)) { break; } sendString(command.help); cmdIdx++; } retCode = true; } else { uint8_t cmdIdx = 0; while (true) { cmd_t command = SET_COMMANDS[cmdIdx]; if (0 == strcmp("END_OF_CMDS", command.name)) { messageToSend = (uint8_t*) UNKNOWN_PARAMETER; break; } if (0 == strcmp(cmd, command.name)) { retCode = command.cmdFunc(argc, args); messageToSend = retCode ? (uint8_t*)OK_MSG : (uint8_t*)FAILED_MSG; sendString("Remember you need to restart to active this change.\n\r"); break; } cmdIdx++; } sendString((const char*)messageToSend); } } return retCode; } static bool restartCmd(uint8_t argc, char **args) { HAL_NVIC_SystemReset(); // you won't come here ... return true; } const cmd_t CONFIG_COMMANDS[] = { { .name = "show", .cmdFunc = showConfigCmd, .help = \ "show ................................. Show the configuration\n\r" }, { .name = "set", .cmdFunc = setCmd, .help = \ "set .................................. Set configuration parameters\n\r" \ " Argument help gives a list of \n\r" \ " parameters\n\r" }, { .name = "restart", .cmdFunc = restartCmd, .help = \ "restart .............................. Restart the system,\n\r" \ " Required to reload config\n\r" }, { .name = "END_OF_CMDS", .help = "",.cmdFunc = NULL } }; const cmd_t *getConfigCommands() { return CONFIG_COMMANDS; }