From d2605975a101f6b578ac0d471570735a0cf3aa73 Mon Sep 17 00:00:00 2001 From: mikeller Date: Tue, 17 Mar 2020 22:05:57 +1300 Subject: [PATCH] Improved CLI error messages. --- src/main/cli/cli.c | 541 ++++++++++++++++++---------------- src/test/unit/cli_unittest.cc | 13 +- 2 files changed, 290 insertions(+), 264 deletions(-) diff --git a/src/main/cli/cli.c b/src/main/cli/cli.c index 5d175e4e1..838814fe0 100644 --- a/src/main/cli/cli.c +++ b/src/main/cli/cli.c @@ -324,7 +324,7 @@ static void cliWriterFlushInternal(bufWriter_t *writer) } } -void cliPrintInternal(bufWriter_t *writer, const char *str) +static void cliPrintInternal(bufWriter_t *writer, const char *str) { if (writer) { while (*str) { @@ -433,10 +433,12 @@ void cliPrintLinef(const char *format, ...) cliPrintLinefeed(); } -static void cliPrintErrorVa(const char *format, va_list va) +static void cliPrintErrorVa(const char *cmdName, const char *format, va_list va) { if (cliErrorWriter) { cliPrintInternal(cliErrorWriter, "###ERROR: "); + cliPrintInternal(cliErrorWriter, cmdName); + cliPrintInternal(cliErrorWriter, ": "); tfp_format(cliErrorWriter, cliPutp, format, va); va_end(va); @@ -451,11 +453,11 @@ static void cliPrintErrorVa(const char *format, va_list va) #endif } -static void cliPrintError(const char *format, ...) +static void cliPrintError(const char *cmdName, const char *format, ...) { va_list va; va_start(va, format); - cliPrintErrorVa(format, va); + cliPrintErrorVa(cmdName, format, va); if (!cliWriter) { // Supply our own linefeed in case we are printing inside a custom defaults operation @@ -465,11 +467,11 @@ static void cliPrintError(const char *format, ...) } } -static void cliPrintErrorLinef(const char *format, ...) +static void cliPrintErrorLinef(const char *cmdName, const char *format, ...) { va_list va; va_start(va, format); - cliPrintErrorVa(format, va); + cliPrintErrorVa(cmdName, format, va); cliPrintInternal(cliErrorWriter, "\r\n"); } @@ -490,7 +492,7 @@ static void getMinMax(const clivalue_t *var, int *min, int *max) } } -static void printValuePointer(const clivalue_t *var, const void *valuePointer, bool full) +static void printValuePointer(const char *cmdName, const clivalue_t *var, const void *valuePointer, bool full) { if ((var->type & VALUE_MODE_MASK) == MODE_ARRAY) { for (int i = 0; i < var->config.array.length; i++) { @@ -596,7 +598,7 @@ static void printValuePointer(const clivalue_t *var, const void *valuePointer, b if (valueIsCorrupted) { cliPrintLinefeed(); - cliPrintError("CORRUPTED CONFIG: %s = %d", var->name, value); + cliPrintError(cmdName, "CORRUPTED CONFIG: %s = %d", var->name, value); } } } @@ -759,7 +761,7 @@ STATIC_UNIT_TESTED void *cliGetValuePointer(const clivalue_t *value) } } -static const char *dumpPgValue(const clivalue_t *value, dumpFlags_t dumpMask, const char *headingStr) +static const char *dumpPgValue(const char *cmdName, const clivalue_t *value, dumpFlags_t dumpMask, const char *headingStr) { const pgRegistry_t *pg = pgFind(value->pgn); #ifdef DEBUG @@ -778,17 +780,17 @@ static const char *dumpPgValue(const clivalue_t *value, dumpFlags_t dumpMask, co if (((dumpMask & DO_DIFF) == 0) || !equalsDefault) { if (dumpMask & SHOW_DEFAULTS && !equalsDefault) { cliPrintf(defaultFormat, value->name); - printValuePointer(value, (uint8_t*)pg->address + valueOffset, false); + printValuePointer(cmdName, value, (uint8_t*)pg->address + valueOffset, false); cliPrintLinefeed(); } cliPrintf(format, value->name); - printValuePointer(value, pg->copy + valueOffset, false); + printValuePointer(cmdName, value, pg->copy + valueOffset, false); cliPrintLinefeed(); } return headingStr; } -static void dumpAllValues(uint16_t valueSection, dumpFlags_t dumpMask, const char *headingStr) +static void dumpAllValues(const char *cmdName, uint16_t valueSection, dumpFlags_t dumpMask, const char *headingStr) { headingStr = cliPrintSectionHeading(dumpMask, false, headingStr); @@ -796,16 +798,16 @@ static void dumpAllValues(uint16_t valueSection, dumpFlags_t dumpMask, const cha const clivalue_t *value = &valueTable[i]; cliWriterFlush(); if ((value->type & VALUE_SECTION_MASK) == valueSection || ((valueSection == MASTER_VALUE) && (value->type & VALUE_SECTION_MASK) == HARDWARE_VALUE)) { - headingStr = dumpPgValue(value, dumpMask, headingStr); + headingStr = dumpPgValue(cmdName, value, dumpMask, headingStr); } } } -static void cliPrintVar(const clivalue_t *var, bool full) +static void cliPrintVar(const char *cmdName, const clivalue_t *var, bool full) { const void *ptr = cliGetValuePointer(var); - printValuePointer(var, ptr, full); + printValuePointer(cmdName, var, ptr, full); } static void cliPrintVarRange(const clivalue_t *var) @@ -947,14 +949,23 @@ static void cliPrompt(void) } } -static void cliShowParseError(void) +static void cliShowParseError(const char *cmdName) { - cliPrintErrorLinef("PARSE ERROR"); + cliPrintErrorLinef(cmdName, "PARSING FAILED"); } -static void cliShowArgumentRangeError(char *name, int min, int max) +static void cliShowInvalidArgumentCountError(const char *cmdName) { - cliPrintErrorLinef("%s NOT BETWEEN %d AND %d", name, min, max); + cliPrintErrorLinef(cmdName, "INVALID ARGUMENT COUNT", cmdName); +} + +static void cliShowArgumentRangeError(const char *cmdName, char *name, int min, int max) +{ + if (name) { + cliPrintErrorLinef(cmdName, "%s: %s NOT BETWEEN %d AND %d", name, min, max); + } else { + cliPrintErrorLinef(cmdName, "ARGUMENT OUT OF RANGE"); + } } static const char *nextArg(const char *currentArg) @@ -1030,7 +1041,7 @@ static void printRxFailsafe(dumpFlags_t dumpMask, const rxFailsafeChannelConfig_ } } -static void cliRxFailsafe(char *cmdline) +static void cliRxFailsafe(const char *cmdName, char *cmdline) { uint8_t channel; char buf[3]; @@ -1038,7 +1049,7 @@ static void cliRxFailsafe(char *cmdline) if (isEmpty(cmdline)) { // print out rxConfig failsafe settings for (channel = 0; channel < MAX_SUPPORTED_RC_CHANNEL_COUNT; channel++) { - cliRxFailsafe(itoa(channel, buf, 10)); + cliRxFailsafe(cmdName, itoa(channel, buf, 10)); } } else { const char *ptr = cmdline; @@ -1061,7 +1072,7 @@ static void cliRxFailsafe(char *cmdline) mode = RX_FAILSAFE_MODE_INVALID; } if (mode == RX_FAILSAFE_MODE_INVALID) { - cliShowParseError(); + cliShowParseError(cmdName); return; } @@ -1070,19 +1081,19 @@ static void cliRxFailsafe(char *cmdline) ptr = nextArg(ptr); if (ptr) { if (!requireValue) { - cliShowParseError(); + cliShowParseError(cmdName); return; } uint16_t value = atoi(ptr); value = CHANNEL_VALUE_TO_RXFAIL_STEP(value); if (value > MAX_RXFAIL_RANGE_STEP) { - cliPrintLine("Value out of range"); + cliPrintErrorLinef(cmdName, "value out of range: %d", value); return; } channelFailsafeConfig->step = value; } else if (requireValue) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; } channelFailsafeConfig->mode = mode; @@ -1107,7 +1118,7 @@ static void cliRxFailsafe(char *cmdline) ); } } else { - cliShowArgumentRangeError("CHANNEL", 0, MAX_SUPPORTED_RC_CHANNEL_COUNT - 1); + cliShowArgumentRangeError(cmdName, "CHANNEL", 0, MAX_SUPPORTED_RC_CHANNEL_COUNT - 1); } } } @@ -1154,7 +1165,7 @@ static void printAux(dumpFlags_t dumpMask, const modeActivationCondition_t *mode } } -static void cliAux(char *cmdline) +static void cliAux(const char *cmdName, char *cmdline) { int i, val = 0; const char *ptr; @@ -1221,7 +1232,7 @@ static void cliAux(char *cmdline) findBoxByBoxId(mac->linkedTo)->permanentId ); } else { - cliShowArgumentRangeError("INDEX", 0, MAX_MODE_ACTIVATION_CONDITION_COUNT - 1); + cliShowArgumentRangeError(cmdName, "INDEX", 0, MAX_MODE_ACTIVATION_CONDITION_COUNT - 1); } } } @@ -1258,7 +1269,7 @@ static void printSerial(dumpFlags_t dumpMask, const serialConfig_t *serialConfig } } -static void cliSerial(char *cmdline) +static void cliSerial(const char *cmdName, char *cmdline) { const char *format = "serial %d %d %ld %ld %ld %ld"; if (isEmpty(cmdline)) { @@ -1332,7 +1343,7 @@ static void cliSerial(char *cmdline) } if (validArgumentCount < 6) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; } @@ -1379,10 +1390,10 @@ static int cliParseSerialMode(const char *tok) return mode; } -static void cliSerialPassthrough(char *cmdline) +static void cliSerialPassthrough(const char *cmdName, char *cmdline) { if (isEmpty(cmdline)) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; } @@ -1610,7 +1621,7 @@ static void printAdjustmentRange(dumpFlags_t dumpMask, const adjustmentRange_t * } } -static void cliAdjustmentRange(char *cmdline) +static void cliAdjustmentRange(const char *cmdName, char *cmdline) { const char *format = "adjrange %u 0 %u %u %u %u %u %u %u"; int i, val = 0; @@ -1662,7 +1673,7 @@ static void cliAdjustmentRange(char *cmdline) if (validArgumentCount != 6) { memset(ar, 0, sizeof(adjustmentRange_t)); - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; } @@ -1697,7 +1708,7 @@ static void cliAdjustmentRange(char *cmdline) ); } else { - cliShowArgumentRangeError("INDEX", 0, MAX_ADJUSTMENT_RANGE_COUNT - 1); + cliShowArgumentRangeError(cmdName, "INDEX", 0, MAX_ADJUSTMENT_RANGE_COUNT - 1); } } } @@ -1743,7 +1754,7 @@ static void printMotorMix(dumpFlags_t dumpMask, const motorMixer_t *customMotorM } #endif // USE_QUAD_MIXER_ONLY -static void cliMotorMix(char *cmdline) +static void cliMotorMix(const char *cmdName, char *cmdline) { #ifdef USE_QUAD_MIXER_ONLY UNUSED(cmdline); @@ -1765,13 +1776,13 @@ static void cliMotorMix(char *cmdline) len = strlen(ptr); for (uint32_t i = 0; ; i++) { if (mixerNames[i] == NULL) { - cliPrintErrorLinef("INVALID NAME"); + cliPrintErrorLinef(cmdName, "INVALID NAME"); break; } if (strncasecmp(ptr, mixerNames[i], len) == 0) { mixerLoadMix(i, customMotorMixerMutable(0)); cliPrintLinef("Loaded %s", mixerNames[i]); - cliMotorMix(""); + cliMotorMix(cmdName, ""); break; } } @@ -1801,12 +1812,12 @@ static void cliMotorMix(char *cmdline) check++; } if (check != 4) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); } else { printMotorMix(DUMP_MASTER, customMotorMixer(0), NULL, NULL); } } else { - cliShowArgumentRangeError("INDEX", 0, MAX_SUPPORTED_MOTORS - 1); + cliShowArgumentRangeError(cmdName, "INDEX", 0, MAX_SUPPORTED_MOTORS - 1); } } #endif @@ -1835,7 +1846,7 @@ static void printRxRange(dumpFlags_t dumpMask, const rxChannelRangeConfig_t *cha } } -static void cliRxRange(char *cmdline) +static void cliRxRange(const char *cmdName, char *cmdline) { const char *format = "rxrange %u %u %u"; int i, validArgumentCount = 0; @@ -1864,9 +1875,9 @@ static void cliRxRange(char *cmdline) } if (validArgumentCount != 2) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); } else if (rangeMin < PWM_PULSE_MIN || rangeMin > PWM_PULSE_MAX || rangeMax < PWM_PULSE_MIN || rangeMax > PWM_PULSE_MAX) { - cliShowParseError(); + cliShowArgumentRangeError(cmdName, "range min/max", PWM_PULSE_MIN, PWM_PULSE_MAX); } else { rxChannelRangeConfig_t *channelRangeConfig = rxChannelRangeConfigsMutable(i); channelRangeConfig->min = rangeMin; @@ -1879,7 +1890,7 @@ static void cliRxRange(char *cmdline) } } else { - cliShowArgumentRangeError("CHANNEL", 0, NON_AUX_CHANNEL_COUNT - 1); + cliShowArgumentRangeError(cmdName, "CHANNEL", 0, NON_AUX_CHANNEL_COUNT - 1); } } } @@ -1906,7 +1917,7 @@ static void printLed(dumpFlags_t dumpMask, const ledConfig_t *ledConfigs, const } } -static void cliLed(char *cmdline) +static void cliLed(const char *cmdName, char *cmdline) { const char *format = "led %u %s"; char ledConfigBuffer[20]; @@ -1924,10 +1935,10 @@ static void cliLed(char *cmdline) generateLedConfig((ledConfig_t *)&ledStripStatusModeConfig()->ledConfigs[i], ledConfigBuffer, sizeof(ledConfigBuffer)); cliDumpPrintLinef(0, false, format, i, ledConfigBuffer); } else { - cliShowParseError(); + cliShowParseError(cmdName); } } else { - cliShowArgumentRangeError("INDEX", 0, LED_MAX_STRIP_LENGTH - 1); + cliShowArgumentRangeError(cmdName, "INDEX", 0, LED_MAX_STRIP_LENGTH - 1); } } } @@ -1949,7 +1960,7 @@ static void printColor(dumpFlags_t dumpMask, const hsvColor_t *colors, const hsv } } -static void cliColor(char *cmdline) +static void cliColor(const char *cmdName, char *cmdline) { const char *format = "color %u %d,%u,%u"; if (isEmpty(cmdline)) { @@ -1963,10 +1974,10 @@ static void cliColor(char *cmdline) const hsvColor_t *color = &ledStripStatusModeConfig()->colors[i]; cliDumpPrintLinef(0, false, format, i, color->h, color->s, color->v); } else { - cliShowParseError(); + cliShowParseError(cmdName); } } else { - cliShowArgumentRangeError("INDEX", 0, LED_CONFIGURABLE_COLOR_COUNT - 1); + cliShowArgumentRangeError(cmdName, "INDEX", 0, LED_CONFIGURABLE_COLOR_COUNT - 1); } } } @@ -2012,7 +2023,7 @@ static void printModeColor(dumpFlags_t dumpMask, const ledStripStatusModeConfig_ cliDumpPrintLinef(dumpMask, equalsDefault, format, LED_AUX_CHANNEL, 0, ledStripAuxChannel); } -static void cliModeColor(char *cmdline) +static void cliModeColor(const char *cmdName, char *cmdline) { if (isEmpty(cmdline)) { printModeColor(DUMP_MASTER, ledStripStatusModeConfig(), NULL, NULL); @@ -2028,7 +2039,7 @@ static void cliModeColor(char *cmdline) } if (ptr != NULL || argNo != ARGS_COUNT) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; } @@ -2036,7 +2047,7 @@ static void cliModeColor(char *cmdline) int funIdx = args[FUNCTION]; int color = args[COLOR]; if (!setModeColor(modeIdx, funIdx, color)) { - cliShowParseError(); + cliShowParseError(cmdName); return; } // values are validated @@ -2102,7 +2113,7 @@ static void printServo(dumpFlags_t dumpMask, const servoParam_t *servoParams, co } } -static void cliServo(char *cmdline) +static void cliServo(const char *cmdName, char *cmdline) { const char *format = "servo %u %d %d %d %d %d"; enum { SERVO_ARGUMENT_COUNT = 6 }; @@ -2126,7 +2137,7 @@ static void cliServo(char *cmdline) while (*ptr) { if (*ptr == '-' || (*ptr >= '0' && *ptr <= '9')) { if (validArgumentCount >= SERVO_ARGUMENT_COUNT) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; } @@ -2138,7 +2149,7 @@ static void cliServo(char *cmdline) } else if (*ptr == ' ') { ptr++; } else { - cliShowParseError(); + cliShowParseError(cmdName); return; } } @@ -2149,7 +2160,7 @@ static void cliServo(char *cmdline) // Check we got the right number of args and the servo index is correct (don't validate the other values) if (validArgumentCount != SERVO_ARGUMENT_COUNT || i < 0 || i >= MAX_SUPPORTED_SERVOS) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; } @@ -2163,7 +2174,7 @@ static void cliServo(char *cmdline) arguments[RATE] < -100 || arguments[RATE] > 100 || arguments[FORWARD] >= MAX_SUPPORTED_RC_CHANNEL_COUNT ) { - cliShowParseError(); + cliShowArgumentRangeError(cmdName, NULL, 0, 0); return; } @@ -2227,7 +2238,7 @@ static void printServoMix(dumpFlags_t dumpMask, const servoMixer_t *customServoM } } -static void cliServoMix(char *cmdline) +static void cliServoMix(const char *cmdName, char *cmdline) { int args[8], check = 0; int len = strlen(cmdline); @@ -2246,13 +2257,13 @@ static void cliServoMix(char *cmdline) len = strlen(ptr); for (uint32_t i = 0; ; i++) { if (mixerNames[i] == NULL) { - cliPrintErrorLinef("INVALID NAME"); + cliPrintErrorLinef(cmdName, "INVALID NAME"); break; } if (strncasecmp(ptr, mixerNames[i], len) == 0) { servoMixerLoadMix(i); cliPrintLinef("Loaded %s", mixerNames[i]); - cliServoMix(""); + cliServoMix(cmdName, ""); break; } } @@ -2285,7 +2296,7 @@ static void cliServoMix(char *cmdline) } if (ptr == NULL || check != ARGS_COUNT - 1) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; } @@ -2298,11 +2309,11 @@ static void cliServoMix(char *cmdline) servoParamsMutable(args[SERVO])->reversedSources &= ~(1 << args[INPUT]); } } else { - cliShowParseError(); + cliShowArgumentRangeError(cmdName, "servo", 0, MAX_SUPPORTED_SERVOS); return; } - cliServoMix("reverse"); + cliServoMix(cmdName, "reverse"); } else { enum {RULE = 0, TARGET, INPUT, RATE, SPEED, MIN, MAX, BOX, ARGS_COUNT}; char *saveptr; @@ -2313,7 +2324,7 @@ static void cliServoMix(char *cmdline) } if (ptr != NULL || check != ARGS_COUNT) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; } @@ -2333,9 +2344,9 @@ static void cliServoMix(char *cmdline) customServoMixersMutable(i)->min = args[MIN]; customServoMixersMutable(i)->max = args[MAX]; customServoMixersMutable(i)->box = args[BOX]; - cliServoMix(""); + cliServoMix(cmdName, ""); } else { - cliShowParseError(); + cliShowArgumentRangeError(cmdName, NULL, 0, 0); } } } @@ -2352,8 +2363,9 @@ static void cliWriteBytes(const uint8_t *buffer, int count) } } -static void cliSdInfo(char *cmdline) +static void cliSdInfo(const char *cmdName, char *cmdline) { + UNUSED(cmdName); UNUSED(cmdline); cliPrint("SD card: "); @@ -2421,12 +2433,13 @@ static void cliSdInfo(char *cmdline) #ifdef USE_FLASH_CHIP -static void cliFlashInfo(char *cmdline) +static void cliFlashInfo(const char *cmdName, char *cmdline) { - const flashGeometry_t *layout = flashGetGeometry(); - + UNUSED(cmdName); UNUSED(cmdline); + const flashGeometry_t *layout = flashGetGeometry(); + cliPrintLinef("Flash sectors=%u, sectorSize=%u, pagesPerSector=%u, pageSize=%u, totalSize=%u", layout->sectors, layout->sectorSize, layout->pagesPerSector, layout->pageSize, layout->totalSize); @@ -2452,8 +2465,9 @@ static void cliFlashInfo(char *cmdline) } -static void cliFlashErase(char *cmdline) +static void cliFlashErase(const char *cmdName, char *cmdline) { + UNUSED(cmdName); UNUSED(cmdline); if (!flashfsIsSupported()) { @@ -2489,7 +2503,7 @@ static void cliFlashErase(char *cmdline) #ifdef USE_FLASH_TOOLS -static void cliFlashVerify(char *cmdline) +static void cliFlashVerify(const char *cmdName, char *cmdline) { UNUSED(cmdline); @@ -2497,17 +2511,17 @@ static void cliFlashVerify(char *cmdline) if (flashfsVerifyEntireFlash()) { cliPrintLine("Success"); } else { - cliPrintLine("Failed"); + cliPrintErrorLinef(cmdName, "Failed"); } } -static void cliFlashWrite(char *cmdline) +static void cliFlashWrite(const char *cmdName, char *cmdline) { const uint32_t address = atoi(cmdline); const char *text = strchr(cmdline, ' '); if (!text) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); } else { flashfsSeekAbs(address); flashfsWrite((uint8_t*)text, strlen(text), true); @@ -2517,14 +2531,14 @@ static void cliFlashWrite(char *cmdline) } } -static void cliFlashRead(char *cmdline) +static void cliFlashRead(const char *cmdName, char *cmdline) { uint32_t address = atoi(cmdline); const char *nextArg = strchr(cmdline, ' '); if (!nextArg) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); } else { uint32_t length = atoi(nextArg); @@ -2588,7 +2602,7 @@ static void printVtx(dumpFlags_t dumpMask, const vtxConfig_t *vtxConfig, const v } } -static void cliVtx(char *cmdline) +static void cliVtx(const char *cmdName, char *cmdline) { const char *format = "vtx %u %u %u %u %u %u %u"; int i, val = 0; @@ -2647,7 +2661,7 @@ static void cliVtx(char *cmdline) if (validArgumentCount != 6) { memset(cac, 0, sizeof(vtxChannelActivationCondition_t)); - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); } else { cliDumpPrintLinef(0, false, format, i, @@ -2660,7 +2674,7 @@ static void cliVtx(char *cmdline) ); } } else { - cliShowArgumentRangeError("INDEX", 0, MAX_CHANNEL_ACTIVATION_CONDITION_COUNT - 1); + cliShowArgumentRangeError(cmdName, "INDEX", 0, MAX_CHANNEL_ACTIVATION_CONDITION_COUNT - 1); } } } @@ -2834,7 +2848,7 @@ static void printVtxTable(dumpFlags_t dumpMask, const vtxTableConfig_t *currentC headingStr = printVtxTablePowerLabels(dumpMask, currentConfig, defaultConfig, headingStr); } -static void cliVtxTable(char *cmdline) +static void cliVtxTable(const char *cmdName, char *cmdline) { char *tok; char *saveptr; @@ -2851,7 +2865,7 @@ static void cliVtxTable(char *cmdline) tok = strtok_r(NULL, " ", &saveptr); int bands = atoi(tok); if (bands < 0 || bands > VTX_TABLE_MAX_BANDS) { - cliPrintErrorLinef("INVALID BAND COUNT (SHOULD BE BETWEEN 0 AND %d)", VTX_TABLE_MAX_BANDS); + cliShowArgumentRangeError(cmdName, "BAND COUNT", 0, VTX_TABLE_MAX_BANDS); return; } if (bands < vtxTableConfigMutable()->bands) { @@ -2866,7 +2880,7 @@ static void cliVtxTable(char *cmdline) int channels = atoi(tok); if (channels < 0 || channels > VTX_TABLE_MAX_CHANNELS) { - cliPrintErrorLinef("INVALID CHANNEL COUNT (SHOULD BE BETWEEN 0 AND %d)", VTX_TABLE_MAX_CHANNELS); + cliShowArgumentRangeError(cmdName, "CHANNEL COUNT", 0, VTX_TABLE_MAX_CHANNELS); return; } if (channels < vtxTableConfigMutable()->channels) { @@ -2882,7 +2896,7 @@ static void cliVtxTable(char *cmdline) if (tok) { int levels = atoi(tok); if (levels < 0 || levels > VTX_TABLE_MAX_POWER_LEVELS) { - cliPrintErrorLinef("INVALID POWER LEVEL COUNT (SHOULD BE BETWEEN 0 AND %d)", VTX_TABLE_MAX_POWER_LEVELS); + cliShowArgumentRangeError(cmdName, "POWER LEVEL COUNT", 0, VTX_TABLE_MAX_POWER_LEVELS); } else { if (levels < vtxTableConfigMutable()->powerLevels) { vtxTableConfigClearPowerValues(vtxTableConfigMutable(), levels); @@ -2911,10 +2925,10 @@ static void cliVtxTable(char *cmdline) // Check remaining tokens if (count < levels) { - cliPrintErrorLinef("NOT ENOUGH VALUES (EXPECTED %d)", levels); + cliPrintErrorLinef(cmdName, "NOT ENOUGH VALUES (EXPECTED %d)", levels); return; } else if ((tok = strtok_r(NULL, " ", &saveptr))) { - cliPrintErrorLinef("TOO MANY VALUES (EXPECTED %d)", levels); + cliPrintErrorLinef(cmdName, "TOO MANY VALUES (EXPECTED %d)", levels); return; } @@ -2937,10 +2951,10 @@ static void cliVtxTable(char *cmdline) // Check remaining tokens if (count < levels) { - cliPrintErrorLinef("NOT ENOUGH LABELS (EXPECTED %d)", levels); + cliPrintErrorLinef(cmdName, "NOT ENOUGH LABELS (EXPECTED %d)", levels); return; } else if ((tok = strtok_r(NULL, " ", &saveptr))) { - cliPrintErrorLinef("TOO MANY LABELS (EXPECTED %d)", levels); + cliPrintErrorLinef(cmdName, "TOO MANY LABELS (EXPECTED %d)", levels); return; } @@ -2960,7 +2974,7 @@ static void cliVtxTable(char *cmdline) --band; if (band < 0 || band >= bands) { - cliPrintErrorLinef("INVALID BAND NUMBER %s (EXPECTED 1-%d)", tok, bands); + cliShowArgumentRangeError(cmdName, "BAND NUMBER", 1, bands); return; } @@ -3000,23 +3014,23 @@ static void cliVtxTable(char *cmdline) } else if (strcasecmp(tok, "CUSTOM") == 0) { isFactory = false; } else { - cliPrintErrorLinef("INVALID FACTORY FLAG %s (EXPECTED FACTORY OR CUSTOM)", tok); + cliPrintErrorLinef(cmdName, "INVALID FACTORY FLAG %s (EXPECTED FACTORY OR CUSTOM)", tok); return; } } int freq = atoi(tok); if (freq < 0) { - cliPrintErrorLinef("INVALID FREQUENCY %s", tok); + cliPrintErrorLinef(cmdName, "INVALID FREQUENCY %s", tok); return; } bandfreq[channel] = freq; } if (channel < channels) { - cliPrintErrorLinef("NOT ENOUGH FREQUENCIES (EXPECTED %d)", channels); + cliPrintErrorLinef(cmdName, "NOT ENOUGH FREQUENCIES (EXPECTED %d)", channels); return; } else if ((tok = strtok_r(NULL, " ", &saveptr))) { - cliPrintErrorLinef("TOO MANY FREQUENCIES (EXPECTED %d)", channels); + cliPrintErrorLinef(cmdName, "TOO MANY FREQUENCIES (EXPECTED %d)", channels); return; } @@ -3029,11 +3043,11 @@ static void cliVtxTable(char *cmdline) vtxTableConfigMutable()->isFactoryBand[band] = isFactory; } else { // Bad subcommand - cliPrintErrorLinef("INVALID SUBCOMMAND %s", tok); + cliPrintErrorLinef(cmdName, "INVALID SUBCOMMAND %s", tok); } } -static void cliVtxInfo(char *cmdline) +static void cliVtxInfo(const char *cmdName, char *cmdline) { UNUSED(cmdline); @@ -3049,10 +3063,10 @@ static void cliVtxInfo(char *cmdline) cliPrintLinef("level %d dBm, power %d mW", levels[i], powers[i]); } } else { - cliPrintErrorLinef("NO POWER VALUES DEFINED"); + cliPrintErrorLinef(cmdName, "NO POWER VALUES DEFINED"); } } else { - cliPrintErrorLinef("NO VTX"); + cliPrintErrorLinef(cmdName, "NO VTX"); } } #endif // USE_VTX_TABLE @@ -3074,12 +3088,12 @@ static void printBoardName(dumpFlags_t dumpMask) } } -static void cliBoardName(char *cmdline) +static void cliBoardName(const char *cmdName, char *cmdline) { const unsigned int len = strlen(cmdline); const char *boardName = getBoardName(); if (len > 0 && strlen(boardName) != 0 && boardInformationIsSet() && (len != strlen(boardName) || strncmp(boardName, cmdline, len))) { - cliPrintErrorLinef(ERROR_MESSAGE, "BOARD_NAME", boardName); + cliPrintErrorLinef(cmdName, ERROR_MESSAGE, "BOARD_NAME", boardName); } else { if (len > 0 && !configIsInCopy && setBoardName(cmdline)) { boardInformationUpdated = true; @@ -3097,12 +3111,12 @@ static void printManufacturerId(dumpFlags_t dumpMask) } } -static void cliManufacturerId(char *cmdline) +static void cliManufacturerId(const char *cmdName, char *cmdline) { const unsigned int len = strlen(cmdline); const char *manufacturerId = getManufacturerId(); if (len > 0 && boardInformationIsSet() && strlen(manufacturerId) != 0 && (len != strlen(manufacturerId) || strncmp(manufacturerId, cmdline, len))) { - cliPrintErrorLinef(ERROR_MESSAGE, "MANUFACTURER_ID", manufacturerId); + cliPrintErrorLinef(cmdName, ERROR_MESSAGE, "MANUFACTURER_ID", manufacturerId); } else { if (len > 0 && !configIsInCopy && setManufacturerId(cmdline)) { boardInformationUpdated = true; @@ -3121,14 +3135,14 @@ static void writeSignature(char *signatureStr, uint8_t *signature) } } -static void cliSignature(char *cmdline) +static void cliSignature(const char *cmdName, char *cmdline) { const int len = strlen(cmdline); uint8_t signature[SIGNATURE_LENGTH] = {0}; if (len > 0) { if (len != 2 * SIGNATURE_LENGTH) { - cliPrintErrorLinef("INVALID LENGTH: %d (EXPECTED: %d)", len, 2 * SIGNATURE_LENGTH); + cliPrintErrorLinef(cmdName, "INVALID LENGTH: %d (EXPECTED: %d)", len, 2 * SIGNATURE_LENGTH); return; } @@ -3143,7 +3157,7 @@ static void cliSignature(char *cmdline) if (end == &temp[BLOCK_SIZE]) { signature[i] = result; } else { - cliPrintErrorLinef("INVALID CHARACTER FOUND: %c", end[0]); + cliPrintErrorLinef(cmdName, "INVALID CHARACTER FOUND: %c", end[0]); return; } @@ -3154,7 +3168,7 @@ static void cliSignature(char *cmdline) char signatureStr[SIGNATURE_LENGTH * 2 + 1] = {0}; if (len > 0 && signatureIsSet() && memcmp(signature, getSignature(), SIGNATURE_LENGTH)) { writeSignature(signatureStr, getSignature()); - cliPrintErrorLinef(ERROR_MESSAGE, "SIGNATURE", signatureStr); + cliPrintErrorLinef(cmdName, ERROR_MESSAGE, "SIGNATURE", signatureStr); } else { if (len > 0 && !configIsInCopy && setSignature(signature)) { signatureUpdated = true; @@ -3175,8 +3189,9 @@ static void cliSignature(char *cmdline) #endif // USE_BOARD_INFO -static void cliMcuId(char *cmdline) +static void cliMcuId(const char *cmdName, char *cmdline) { + UNUSED(cmdName); UNUSED(cmdline); cliPrintLinef("mcu_id %08x%08x%08x", U_ID_0, U_ID_1, U_ID_2); @@ -3209,7 +3224,7 @@ static void printFeature(dumpFlags_t dumpMask, const uint32_t mask, const uint32 } } -static void cliFeature(char *cmdline) +static void cliFeature(const char *cmdName, char *cmdline) { uint32_t len = strlen(cmdline); const uint32_t mask = featureConfig()->enabledFeatures; @@ -3247,7 +3262,7 @@ static void cliFeature(char *cmdline) for (uint32_t i = 0; ; i++) { if (featureNames[i] == NULL) { - cliPrintErrorLinef("INVALID NAME"); + cliPrintErrorLinef(cmdName, "INVALID NAME"); break; } @@ -3297,7 +3312,7 @@ static void printBeeper(dumpFlags_t dumpMask, const uint32_t offFlags, const uin } } -static void processBeeperCommand(char *cmdline, uint32_t *offFlags, const uint32_t allowedFlags) +static void processBeeperCommand(const char *cmdName, char *cmdline, uint32_t *offFlags, const uint32_t allowedFlags) { uint32_t len = strlen(cmdline); uint8_t beeperCount = beeperTableEntryCount(); @@ -3333,7 +3348,7 @@ static void processBeeperCommand(char *cmdline, uint32_t *offFlags, const uint32 for (uint32_t i = 0; ; i++) { if (i == beeperCount) { - cliPrintErrorLinef("INVALID NAME"); + cliPrintErrorLinef(cmdName, "INVALID NAME"); break; } if (strncasecmp(cmdline, beeperNameForTableIndex(i), len) == 0 && beeperModeMaskForTableIndex(i) & (allowedFlags | BEEPER_GET_FLAG(BEEPER_ALL))) { @@ -3361,25 +3376,26 @@ static void processBeeperCommand(char *cmdline, uint32_t *offFlags, const uint32 } #if defined(USE_DSHOT) -static void cliBeacon(char *cmdline) +static void cliBeacon(const char *cmdName, char *cmdline) { - processBeeperCommand(cmdline, &(beeperConfigMutable()->dshotBeaconOffFlags), DSHOT_BEACON_ALLOWED_MODES); + processBeeperCommand(cmdName, cmdline, &(beeperConfigMutable()->dshotBeaconOffFlags), DSHOT_BEACON_ALLOWED_MODES); } #endif -static void cliBeeper(char *cmdline) +static void cliBeeper(const char *cmdName, char *cmdline) { - processBeeperCommand(cmdline, &(beeperConfigMutable()->beeper_off_flags), BEEPER_ALLOWED_MODES); + processBeeperCommand(cmdName, cmdline, &(beeperConfigMutable()->beeper_off_flags), BEEPER_ALLOWED_MODES); } #endif #if defined(USE_RX_BIND) -void cliRxBind(char *cmdline){ +static void cliRxBind(const char *cmdName, char *cmdline) +{ UNUSED(cmdline); if (!startRxBind()) { - cliPrint("Not supported."); + cliPrintErrorLinef(cmdName, "Not supported."); } else { - cliPrint("Binding..."); + cliPrintLinef("Binding..."); } } #endif @@ -3411,7 +3427,7 @@ static void printMap(dumpFlags_t dumpMask, const rxConfig_t *rxConfig, const rxC } -static void cliMap(char *cmdline) +static void cliMap(const char *cmdName, char *cmdline) { uint32_t i; char buf[RX_MAPPABLE_CHANNEL_COUNT + 1]; @@ -3430,12 +3446,12 @@ static void cliMap(char *cmdline) if (strchr(rcChannelLetters, buf[i]) && !strchr(buf + i + 1, buf[i])) continue; - cliShowParseError(); + cliShowParseError(cmdName); return; } parseRcChannels(buf, rxConfigMutable()); } else if (len > 0) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; } @@ -3497,7 +3513,7 @@ static void cliReboot(void) cliRebootEx(REBOOT_TARGET_FIRMWARE); } -static void cliBootloader(char *cmdline) +static void cliBootloader(const char *cmdName, char *cmdline) { rebootTarget_e rebootTarget; if ( @@ -3515,7 +3531,7 @@ static void cliBootloader(char *cmdline) cliPrintHashLine("restarting in flash bootloader mode"); #endif } else { - cliPrintErrorLinef("Invalid option"); + cliPrintErrorLinef(cmdName, "Invalid option"); return; } @@ -3523,8 +3539,9 @@ static void cliBootloader(char *cmdline) cliRebootEx(rebootTarget); } -static void cliExit(char *cmdline) +static void cliExit(const char *cmdName, char *cmdline) { + UNUSED(cmdName); UNUSED(cmdline); cliPrintHashLine("leaving CLI mode, unsaved changes lost"); @@ -3539,8 +3556,9 @@ static void cliExit(char *cmdline) } #ifdef USE_GPS -static void cliGpsPassthrough(char *cmdline) +static void cliGpsPassthrough(const char *cmdName, char *cmdline) { + UNUSED(cmdName); UNUSED(cmdline); gpsEnablePassthrough(cliPort); @@ -3555,8 +3573,11 @@ static void cliPrintGyroRegisters(uint8_t whichSensor) cliPrintLinef("# GYRO_CONFIG 0x%X", gyroReadRegister(whichSensor, MPU_RA_GYRO_CONFIG)); } -static void cliDumpGyroRegisters(char *cmdline) +static void cliDumpGyroRegisters(const char *cmdName, char *cmdline) { + UNUSED(cmdName); + UNUSED(cmdline); + #ifdef USE_MULTI_GYRO if ((gyroConfig()->gyro_to_use == GYRO_CONFIG_USE_GYRO_1) || (gyroConfig()->gyro_to_use == GYRO_CONFIG_USE_GYRO_BOTH)) { cliPrintLinef("\r\n# Gyro 1"); @@ -3569,19 +3590,18 @@ static void cliDumpGyroRegisters(char *cmdline) #else cliPrintGyroRegisters(GYRO_CONFIG_USE_GYRO_1); #endif - UNUSED(cmdline); } #endif -static int parseOutputIndex(char *pch, bool allowAllEscs) { +static int parseOutputIndex(const char *cmdName, char *pch, bool allowAllEscs) { int outputIndex = atoi(pch); if ((outputIndex >= 0) && (outputIndex < getMotorCount())) { cliPrintLinef("Using output %d.", outputIndex); } else if (allowAllEscs && outputIndex == ALL_MOTORS) { cliPrintLinef("Using all outputs."); } else { - cliPrintErrorLinef("INVALID OUTPUT NUMBER. RANGE: 0 - %d.", getMotorCount() - 1); + cliPrintErrorLinef(cmdName, "INVALID OUTPUT NUMBER. RANGE: 0 - %d.", getMotorCount() - 1); return -1; } @@ -3604,7 +3624,7 @@ enum { #define ESC_INFO_VERSION_POSITION 12 -void printEscInfo(const uint8_t *escInfoBuffer, uint8_t bytesRead) +static void printEscInfo(const char *cmdName, const uint8_t *escInfoBuffer, uint8_t bytesRead) { bool escInfoReceived = false; if (bytesRead > ESC_INFO_VERSION_POSITION) { @@ -3752,7 +3772,7 @@ void printEscInfo(const uint8_t *escInfoBuffer, uint8_t bytesRead) } } } else { - cliPrintErrorLinef("CHECKSUM ERROR."); + cliPrintErrorLinef(cmdName, "CHECKSUM ERROR."); } } } @@ -3762,7 +3782,7 @@ void printEscInfo(const uint8_t *escInfoBuffer, uint8_t bytesRead) } } -static void executeEscInfoCommand(uint8_t escIndex) +static void executeEscInfoCommand(const char *cmdName, uint8_t escIndex) { cliPrintLinef("Info for ESC %d:", escIndex); @@ -3774,17 +3794,17 @@ static void executeEscInfoCommand(uint8_t escIndex) delay(10); - printEscInfo(escInfoBuffer, getNumberEscBytesRead()); + printEscInfo(cmdName, escInfoBuffer, getNumberEscBytesRead()); } #endif // USE_ESC_SENSOR && USE_ESC_SENSOR_INFO // XXX Review dshotprog command under refactored motor handling -static void cliDshotProg(char *cmdline) +static void cliDshotProg(const char *cmdName, char *cmdline) { if (isEmpty(cmdline) || motorConfig()->dev.motorPwmProtocol < PWM_TYPE_DSHOT150) { - cliShowParseError(); + cliShowParseError(cmdName); return; } @@ -3797,7 +3817,7 @@ static void cliDshotProg(char *cmdline) while (pch != NULL) { switch (pos) { case 0: - escIndex = parseOutputIndex(pch, true); + escIndex = parseOutputIndex(cmdName, pch, true); if (escIndex == -1) { return; } @@ -3826,10 +3846,10 @@ static void cliDshotProg(char *cmdline) #if defined(USE_ESC_SENSOR) && defined(USE_ESC_SENSOR_INFO) if (featureIsEnabled(FEATURE_ESC_SENSOR)) { if (escIndex != ALL_MOTORS) { - executeEscInfoCommand(escIndex); + executeEscInfoCommand(cmdName, escIndex); } else { for (uint8_t i = 0; i < getMotorCount(); i++) { - executeEscInfoCommand(i); + executeEscInfoCommand(cmdName, i); } } } else @@ -3842,7 +3862,7 @@ static void cliDshotProg(char *cmdline) cliPrintLinef("Command Sent: %d", command); } else { - cliPrintErrorLinef("INVALID COMMAND. RANGE: 1 - %d.", DSHOT_MIN_THROTTLE - 1); + cliPrintErrorLinef(cmdName, "INVALID COMMAND. RANGE: 1 - %d.", DSHOT_MIN_THROTTLE - 1); } } @@ -3858,10 +3878,10 @@ static void cliDshotProg(char *cmdline) #endif // USE_DSHOT #ifdef USE_ESCSERIAL -static void cliEscPassthrough(char *cmdline) +static void cliEscPassthrough(const char *cmdName, char *cmdline) { if (isEmpty(cmdline)) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; } @@ -3883,20 +3903,20 @@ static void cliEscPassthrough(char *cmdline) } else if (strncasecmp(pch, "cc", strlen(pch)) == 0) { mode = PROTOCOL_KISSALL; } else { - cliShowParseError(); + cliShowParseError(cmdName); return; } break; case 1: - escIndex = parseOutputIndex(pch, mode == PROTOCOL_KISS); + escIndex = parseOutputIndex(cmdName, pch, mode == PROTOCOL_KISS); if (escIndex == -1) { return; } break; default: - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; @@ -3908,13 +3928,13 @@ static void cliEscPassthrough(char *cmdline) } if (!escEnablePassthrough(cliPort, &motorConfig()->dev, escIndex, mode)) { - cliPrintErrorLinef("Error starting ESC connection"); + cliPrintErrorLinef(cmdName, "Error starting ESC connection"); } } #endif #ifndef USE_QUAD_MIXER_ONLY -static void cliMixer(char *cmdline) +static void cliMixer(const char *cmdName, char *cmdline) { int len; @@ -3936,7 +3956,7 @@ static void cliMixer(char *cmdline) for (uint32_t i = 0; ; i++) { if (mixerNames[i] == NULL) { - cliPrintErrorLinef("INVALID NAME"); + cliPrintErrorLinef(cmdName, "INVALID NAME"); return; } if (strncasecmp(cmdline, mixerNames[i], len) == 0) { @@ -3945,14 +3965,14 @@ static void cliMixer(char *cmdline) } } - cliMixer(""); + cliMixer(cmdName, ""); } #endif -static void cliMotor(char *cmdline) +static void cliMotor(const char *cmdName, char *cmdline) { if (isEmpty(cmdline)) { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); return; } @@ -3966,7 +3986,7 @@ static void cliMotor(char *cmdline) while (pch != NULL) { switch (index) { case 0: - motorIndex = parseOutputIndex(pch, true); + motorIndex = parseOutputIndex(cmdName, pch, true); if (motorIndex == -1) { return; } @@ -3983,7 +4003,7 @@ static void cliMotor(char *cmdline) if (index == 2) { if (motorValue < PWM_RANGE_MIN || motorValue > PWM_RANGE_MAX) { - cliShowArgumentRangeError("VALUE", 1000, 2000); + cliShowArgumentRangeError(cmdName, "VALUE", 1000, 2000); } else { uint32_t motorOutputValue = motorConvertFromExternal(motorValue); @@ -4000,12 +4020,12 @@ static void cliMotor(char *cmdline) } } } else { - cliShowParseError(); + cliShowInvalidArgumentCountError(cmdName); } } #ifndef MINIMAL_CLI -static void cliPlaySound(char *cmdline) +static void cliPlaySound(const char *cmdName, char *cmdline) { int i; const char *name; @@ -4020,7 +4040,7 @@ static void cliPlaySound(char *cmdline) if ((name=beeperNameForTableIndex(i)) != NULL) break; //if name OK then play sound below if (i == lastSoundIdx + 1) { //prevent infinite loop - cliPrintErrorLinef("ERROR PLAYING SOUND"); + cliPrintErrorLinef(cmdName, "ERROR PLAYING SOUND"); return; } } @@ -4039,7 +4059,7 @@ static void cliPlaySound(char *cmdline) } #endif -static void cliProfile(char *cmdline) +static void cliProfile(const char *cmdName, char *cmdline) { if (isEmpty(cmdline)) { cliPrintLinef("profile %d", getPidProfileIndexToUse()); @@ -4048,14 +4068,14 @@ static void cliProfile(char *cmdline) const int i = atoi(cmdline); if (i >= 0 && i < PID_PROFILE_COUNT) { changePidProfile(i); - cliProfile(""); + cliProfile(cmdName, ""); } else { - cliPrintErrorLinef("PROFILE OUTSIDE OF [0..%d]", PID_PROFILE_COUNT - 1); + cliPrintErrorLinef(cmdName, "PROFILE OUTSIDE OF [0..%d]", PID_PROFILE_COUNT - 1); } } } -static void cliRateProfile(char *cmdline) +static void cliRateProfile(const char *cmdName, char *cmdline) { if (isEmpty(cmdline)) { cliPrintLinef("rateprofile %d", getRateProfileIndexToUse()); @@ -4064,14 +4084,14 @@ static void cliRateProfile(char *cmdline) const int i = atoi(cmdline); if (i >= 0 && i < CONTROL_RATE_PROFILE_COUNT) { changeControlRateProfile(i); - cliRateProfile(""); + cliRateProfile(cmdName, ""); } else { - cliPrintErrorLinef("RATE PROFILE OUTSIDE OF [0..%d]", CONTROL_RATE_PROFILE_COUNT - 1); + cliPrintErrorLinef(cmdName, "RATE PROFILE OUTSIDE OF [0..%d]", CONTROL_RATE_PROFILE_COUNT - 1); } } } -static void cliDumpPidProfile(uint8_t pidProfileIndex, dumpFlags_t dumpMask) +static void cliDumpPidProfile(const char *cmdName, uint8_t pidProfileIndex, dumpFlags_t dumpMask) { if (pidProfileIndex >= PID_PROFILE_COUNT) { // Faulty values @@ -4081,16 +4101,16 @@ static void cliDumpPidProfile(uint8_t pidProfileIndex, dumpFlags_t dumpMask) pidProfileIndexToUse = pidProfileIndex; cliPrintLinefeed(); - cliProfile(""); + cliProfile(cmdName, ""); char profileStr[10]; tfp_sprintf(profileStr, "profile %d", pidProfileIndex); - dumpAllValues(PROFILE_VALUE, dumpMask, profileStr); + dumpAllValues(cmdName, PROFILE_VALUE, dumpMask, profileStr); pidProfileIndexToUse = CURRENT_PROFILE_INDEX; } -static void cliDumpRateProfile(uint8_t rateProfileIndex, dumpFlags_t dumpMask) +static void cliDumpRateProfile(const char *cmdName, uint8_t rateProfileIndex, dumpFlags_t dumpMask) { if (rateProfileIndex >= CONTROL_RATE_PROFILE_COUNT) { // Faulty values @@ -4100,21 +4120,21 @@ static void cliDumpRateProfile(uint8_t rateProfileIndex, dumpFlags_t dumpMask) rateProfileIndexToUse = rateProfileIndex; cliPrintLinefeed(); - cliRateProfile(""); + cliRateProfile(cmdName, ""); char rateProfileStr[14]; tfp_sprintf(rateProfileStr, "rateprofile %d", rateProfileIndex); - dumpAllValues(PROFILE_RATE_VALUE, dumpMask, rateProfileStr); + dumpAllValues(cmdName, PROFILE_RATE_VALUE, dumpMask, rateProfileStr); rateProfileIndexToUse = CURRENT_PROFILE_INDEX; } #ifdef USE_CLI_BATCH -static void cliPrintCommandBatchWarning(const char *warning) +static void cliPrintCommandBatchWarning(const char *cmdName, const char *warning) { - cliPrintErrorLinef("ERRORS WERE DETECTED - PLEASE REVIEW BEFORE CONTINUING"); + cliPrintErrorLinef(cmdName, "ERRORS WERE DETECTED - PLEASE REVIEW BEFORE CONTINUING"); if (warning) { - cliPrintErrorLinef(warning); + cliPrintErrorLinef(cmdName, warning); } } @@ -4124,7 +4144,7 @@ static void resetCommandBatch(void) commandBatchError = false; } -static void cliBatch(char *cmdline) +static void cliBatch(const char *cmdName, char *cmdline) { if (strncasecmp(cmdline, "start", 5) == 0) { if (!commandBatchActive) { @@ -4134,13 +4154,13 @@ static void cliBatch(char *cmdline) cliPrintLine("Command batch started"); } else if (strncasecmp(cmdline, "end", 3) == 0) { if (commandBatchActive && commandBatchError) { - cliPrintCommandBatchWarning(NULL); + cliPrintCommandBatchWarning(cmdName, NULL); } else { cliPrintLine("Command batch ended"); } resetCommandBatch(); } else { - cliPrintErrorLinef("Invalid option"); + cliPrintErrorLinef(cmdName, "Invalid option"); } } #endif @@ -4173,28 +4193,29 @@ static bool prepareSave(void) return true; } -bool tryPrepareSave(void) +bool tryPrepareSave(const char *cmdName) { bool success = prepareSave(); #if defined(USE_CLI_BATCH) if (!success) { - cliPrintCommandBatchWarning("PLEASE FIX ERRORS THEN 'SAVE'"); + cliPrintCommandBatchWarning(cmdName, "PLEASE FIX ERRORS THEN 'SAVE'"); resetCommandBatch(); return false; } #else + UNUSED(cmdName); UNUSED(success); #endif return true; } -static void cliSave(char *cmdline) +static void cliSave(const char *cmdName, char *cmdline) { UNUSED(cmdline); - if (tryPrepareSave()) { + if (tryPrepareSave(cmdName)) { writeEEPROM(); cliPrintHashLine("saving"); @@ -4227,7 +4248,7 @@ bool hasCustomDefaults(void) } #endif -static void cliDefaults(char *cmdline) +static void cliDefaults(const char *cmdName, char *cmdline) { bool saveConfigs = true; #if defined(USE_CUSTOM_DEFAULTS) @@ -4257,13 +4278,13 @@ static void cliDefaults(char *cmdline) } } } else { - cliPrintError("NO CUSTOM DEFAULTS FOUND"); + cliPrintError(cmdName, "NO CUSTOM DEFAULTS FOUND"); } return; #endif } else { - cliPrintError("INVALID OPTION"); + cliPrintError(cmdName, "INVALID OPTION"); return; } @@ -4286,14 +4307,14 @@ static void cliDefaults(char *cmdline) } #endif - if (saveConfigs && tryPrepareSave()) { + if (saveConfigs && tryPrepareSave(cmdName)) { writeUnmodifiedConfigToEEPROM(); cliReboot(); } } -void cliPrintVarDefault(const clivalue_t *value) +static void cliPrintVarDefault(const char *cmdName, const clivalue_t *value) { const pgRegistry_t *pg = pgFind(value->pgn); if (pg) { @@ -4302,13 +4323,13 @@ void cliPrintVarDefault(const clivalue_t *value) const bool equalsDefault = valuePtrEqualsDefault(value, pg->copy + valueOffset, pg->address + valueOffset); if (!equalsDefault) { cliPrintf(defaultFormat, value->name); - printValuePointer(value, (uint8_t*)pg->address + valueOffset, false); + printValuePointer(cmdName, value, (uint8_t*)pg->address + valueOffset, false); cliPrintLinefeed(); } } } -STATIC_UNIT_TESTED void cliGet(char *cmdline) +STATIC_UNIT_TESTED void cliGet(const char *cmdName, char *cmdline) { const clivalue_t *val; int matchedCommands = 0; @@ -4325,15 +4346,15 @@ STATIC_UNIT_TESTED void cliGet(char *cmdline) cliPrintLinefeed(); } cliPrintf("%s = ", valueTable[i].name); - cliPrintVar(val, 0); + cliPrintVar(cmdName, val, 0); cliPrintLinefeed(); switch (val->type & VALUE_SECTION_MASK) { case PROFILE_VALUE: - cliProfile(""); + cliProfile(cmdName, ""); break; case PROFILE_RATE_VALUE: - cliRateProfile(""); + cliRateProfile(cmdName, ""); break; default: @@ -4341,7 +4362,7 @@ STATIC_UNIT_TESTED void cliGet(char *cmdline) break; } cliPrintVarRange(val); - cliPrintVarDefault(val); + cliPrintVarDefault(cmdName, val); matchedCommands++; } @@ -4353,7 +4374,7 @@ STATIC_UNIT_TESTED void cliGet(char *cmdline) rateProfileIndexToUse = CURRENT_PROFILE_INDEX; if (!matchedCommands) { - cliPrintErrorLinef("INVALID NAME"); + cliPrintErrorLinef(cmdName, "INVALID NAME"); } } @@ -4379,7 +4400,7 @@ uint16_t cliGetSettingIndex(char *name, uint8_t length) return valueTableEntryCount; } -STATIC_UNIT_TESTED void cliSet(char *cmdline) +STATIC_UNIT_TESTED void cliSet(const char *cmdName, char *cmdline) { const uint32_t len = strlen(cmdline); char *eqptr; @@ -4390,7 +4411,7 @@ STATIC_UNIT_TESTED void cliSet(char *cmdline) for (uint32_t i = 0; i < valueTableEntryCount; i++) { const clivalue_t *val = &valueTable[i]; cliPrintf("%s = ", valueTable[i].name); - cliPrintVar(val, len); // when len is 1 (when * is passed as argument), it will print min/max values as well, for gui + cliPrintVar(cmdName, val, len); // when len is 1 (when * is passed as argument), it will print min/max values as well, for gui cliPrintLinefeed(); } } else if ((eqptr = strstr(cmdline, "=")) != NULL) { @@ -4404,7 +4425,7 @@ STATIC_UNIT_TESTED void cliSet(char *cmdline) const uint16_t index = cliGetSettingIndex(cmdline, variableNameLength); if (index >= valueTableEntryCount) { - cliPrintErrorLinef("INVALID NAME"); + cliPrintErrorLinef(cmdName, "INVALID NAME"); return; } const clivalue_t *val = &valueTable[index]; @@ -4549,7 +4570,7 @@ STATIC_UNIT_TESTED void cliSet(char *cmdline) } valueChanged = true; } else { - cliPrintErrorLinef("STRING MUST BE 1-%d CHARACTERS OR '-' FOR EMPTY", max); + cliPrintErrorLinef(cmdName, "STRING MUST BE 1-%d CHARACTERS OR '-' FOR EMPTY", max); } } break; @@ -4557,16 +4578,16 @@ STATIC_UNIT_TESTED void cliSet(char *cmdline) if (valueChanged) { cliPrintf("%s set to ", val->name); - cliPrintVar(val, 0); + cliPrintVar(cmdName, val, 0); } else { - cliPrintErrorLinef("INVALID VALUE"); + cliPrintErrorLinef(cmdName, "INVALID VALUE"); cliPrintVarRange(val); } return; } else { // no equals, check for matching variables. - cliGet(cmdline); + cliGet(cmdName, cmdline); } } @@ -4579,8 +4600,9 @@ const char *getMcuTypeById(mcuTypeId_e id) } } -static void cliStatus(char *cmdline) +static void cliStatus(const char *cmdName, char *cmdline) { + UNUSED(cmdName); UNUSED(cmdline); // MCU type, clock, vrefint, core temperature @@ -4693,7 +4715,7 @@ static void cliStatus(char *cmdline) cliPrintLinef("I2C Errors: %d", i2cErrorCounter); #ifdef USE_SDCARD - cliSdInfo(NULL); + cliSdInfo(cmdName, ""); #endif cliPrint("Arming disable flags:"); @@ -4707,8 +4729,9 @@ static void cliStatus(char *cmdline) } #if defined(USE_TASK_STATISTICS) -static void cliTasks(char *cmdline) +static void cliTasks(const char *cmdName, char *cmdline) { + UNUSED(cmdName); UNUSED(cmdline); int maxLoadSum = 0; int averageLoadSum = 0; @@ -4753,8 +4776,9 @@ static void cliTasks(char *cmdline) } #endif -static void cliVersion(char *cmdline) +static void cliVersion(const char *cmdName, char *cmdline) { + UNUSED(cmdName); UNUSED(cmdline); cliPrintf("# %s / %s (%s) %s %s / %s (%s) MSP API: %s", @@ -4794,8 +4818,9 @@ static void cliVersion(char *cmdline) } #ifdef USE_RC_SMOOTHING_FILTER -static void cliRcSmoothing(char *cmdline) +static void cliRcSmoothing(const char *cmdName, char *cmdline) { + UNUSED(cmdName); UNUSED(cmdline); rcSmoothingFilter_t *rcSmoothingData = getRcSmoothingData(); cliPrint("# RC Smoothing Type: "); @@ -5370,7 +5395,7 @@ static void printDmaopt(dumpFlags_t dumpMask, const char *headingStr) #endif } -static void cliDmaopt(char *cmdline) +static void cliDmaopt(const char *cmdName, char *cmdline) { char *pch = NULL; char *saveptr; @@ -5382,7 +5407,7 @@ static void cliDmaopt(char *cmdline) return; } else if (strcasecmp(pch, "list") == 0) { - cliPrintErrorLinef("NOT IMPLEMENTED YET"); + cliPrintErrorLinef(cmdName, "NOT IMPLEMENTED YET"); return; } @@ -5395,7 +5420,7 @@ static void cliDmaopt(char *cmdline) } if (!entry && strcasecmp(pch, "pin") != 0) { - cliPrintErrorLinef("BAD DEVICE: %s", pch); + cliPrintErrorLinef(cmdName, "BAD DEVICE: %s", pch); return; } @@ -5414,7 +5439,7 @@ static void cliDmaopt(char *cmdline) if (entry) { index = atoi(pch) - 1; if (index < 0 || index >= entry->maxIndex || (entry->presenceMask != MASK_IGNORED && !(entry->presenceMask & BIT(index + 1)))) { - cliPrintErrorLinef("BAD INDEX: '%s'", pch ? pch : ""); + cliPrintErrorLinef(cmdName, "BAD INDEX: '%s'", pch ? pch : ""); return; } @@ -5430,7 +5455,7 @@ static void cliDmaopt(char *cmdline) } else { // It's a pin if (!pch || !(strToPin(pch, &ioTag) && IOGetByTag(ioTag))) { - cliPrintErrorLinef("INVALID PIN: '%s'", pch ? pch : ""); + cliPrintErrorLinef(cmdName, "INVALID PIN: '%s'", pch ? pch : ""); return; } @@ -5478,13 +5503,13 @@ static void cliDmaopt(char *cmdline) if (entry) { if (!dmaGetChannelSpecByPeripheral(entry->peripheral, index, optval)) { - cliPrintErrorLinef("INVALID DMA OPTION FOR %s %d: '%s'", entry->device, DMA_OPT_UI_INDEX(index), pch); + cliPrintErrorLinef(cmdName, "INVALID DMA OPTION FOR %s %d: '%s'", entry->device, DMA_OPT_UI_INDEX(index), pch); return; } } else { if (!dmaGetChannelSpecByTimerValue(timer->tim, timer->channel, optval)) { - cliPrintErrorLinef("INVALID DMA OPTION FOR PIN %c%02d: '%s'", IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), pch); + cliPrintErrorLinef(cmdName, "INVALID DMA OPTION FOR PIN %c%02d: '%s'", IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), pch); return; } @@ -5521,7 +5546,7 @@ static void cliDmaopt(char *cmdline) #endif // USE_DMA_SPEC #ifdef USE_DMA -static void cliDma(char* cmdline) +static void cliDma(const char *cmdName, char* cmdline) { int len = strlen(cmdline); if (len && strncasecmp(cmdline, "show", len) == 0) { @@ -5531,9 +5556,9 @@ static void cliDma(char* cmdline) } #if defined(USE_DMA_SPEC) - cliDmaopt(cmdline); + cliDmaopt(cmdName, cmdline); #else - cliShowParseError(); + cliShowParseError(cmdName); #endif } #endif @@ -5679,7 +5704,7 @@ static void showTimers(void) } } -static void cliTimer(char *cmdline) +static void cliTimer(const char *cmdName, char *cmdline) { int len = strlen(cmdline); @@ -5688,7 +5713,7 @@ static void cliTimer(char *cmdline) return; } else if (strncasecmp(cmdline, "list", len) == 0) { - cliPrintErrorLinef("NOT IMPLEMENTED YET"); + cliPrintErrorLinef(cmdName, "NOT IMPLEMENTED YET"); return; } else if (strncasecmp(cmdline, "show", len) == 0) { @@ -5703,11 +5728,11 @@ static void cliTimer(char *cmdline) ioTag_t ioTag = IO_TAG_NONE; pch = strtok_r(cmdline, " ", &saveptr); if (!pch || !strToPin(pch, &ioTag)) { - cliShowParseError(); + cliShowParseError(cmdName); return; } else if (!IOGetByTag(ioTag)) { - cliPrintErrorLinef("PIN NOT USED ON BOARD."); + cliPrintErrorLinef(cmdName, "PIN NOT USED ON BOARD."); return; } @@ -5730,7 +5755,7 @@ static void cliTimer(char *cmdline) } if (timerIOIndex < 0) { - cliPrintErrorLinef("PIN TIMER MAP FULL."); + cliPrintErrorLinef(cmdName, "PIN TIMER MAP FULL."); return; } @@ -5764,12 +5789,12 @@ static void cliTimer(char *cmdline) } if (!timer) { - cliPrintErrorLinef("INVALID ALTERNATE FUNCTION FOR %c%02d: '%s'", IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), pch); + cliPrintErrorLinef(cmdName, "INVALID ALTERNATE FUNCTION FOR %c%02d: '%s'", IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), pch); return; } } else if (strcasecmp(pch, "none") != 0) { - cliPrintErrorLinef("INVALID TIMER OPTION FOR %c%02d: '%s'", IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), pch); + cliPrintErrorLinef(cmdName, "INVALID TIMER OPTION FOR %c%02d: '%s'", IO_GPIOPortIdxByTag(ioTag) + 'A', IO_GPIOPinIdxByTag(ioTag), pch); return; } @@ -5801,7 +5826,7 @@ static void cliTimer(char *cmdline) #endif #if defined(USE_RESOURCE_MGMT) -static void cliResource(char *cmdline) +static void cliResource(const char *cmdName, char *cmdline) { char *pch = NULL; char *saveptr; @@ -5832,10 +5857,10 @@ static void cliResource(char *cmdline) pch = strtok_r(NULL, " ", &saveptr); if (strcasecmp(pch, "all") == 0) { #if defined(USE_TIMER_MGMT) - cliTimer("show"); + cliTimer(cmdName, "show"); #endif #if defined(USE_DMA) - cliDma("show"); + cliDma(cmdName, "show"); #endif } @@ -5845,7 +5870,7 @@ static void cliResource(char *cmdline) unsigned resourceIndex = 0; for (; ; resourceIndex++) { if (resourceIndex >= ARRAYLEN(resourceTable)) { - cliPrintErrorLinef("INVALID RESOURCE NAME: '%s'", pch); + cliPrintErrorLinef(cmdName, "INVALID RESOURCE NAME: '%s'", pch); return; } @@ -5860,7 +5885,7 @@ static void cliResource(char *cmdline) if (resourceTable[resourceIndex].maxIndex > 0 || index > 0) { if (index <= 0 || index > MAX_RESOURCE_INDEX(resourceTable[resourceIndex].maxIndex)) { - cliShowArgumentRangeError("INDEX", 1, MAX_RESOURCE_INDEX(resourceTable[resourceIndex].maxIndex)); + cliShowArgumentRangeError(cmdName, "INDEX", 1, MAX_RESOURCE_INDEX(resourceTable[resourceIndex].maxIndex)); return; } index -= 1; @@ -5889,20 +5914,21 @@ static void cliResource(char *cmdline) cliPrintLinef("\r\nResource is set to %c%02d", IO_GPIOPortIdx(rec) + 'A', IO_GPIOPinIdx(rec)); #endif } else { - cliShowParseError(); + cliShowParseError(cmdName); } return; } } } - cliShowParseError(); + cliShowParseError(cmdName); } #endif #ifdef USE_DSHOT_TELEMETRY -static void cliDshotTelemetryInfo(char *cmdline) +static void cliDshotTelemetryInfo(const char *cmdName, char *cmdline) { + UNUSED(cmdName); UNUSED(cmdline); if (useDshotTelemetry) { @@ -5960,7 +5986,7 @@ static void cliDshotTelemetryInfo(char *cmdline) } #endif -static void printConfig(char *cmdline, bool doDiff) +static void printConfig(const char *cmdName, char *cmdline, bool doDiff) { dumpFlags_t dumpMask = DUMP_MASTER; char *options; @@ -5995,7 +6021,7 @@ static void printConfig(char *cmdline, bool doDiff) #endif if ((dumpMask & DUMP_MASTER) || (dumpMask & DUMP_ALL)) { cliPrintHashLine("version"); - cliVersion(NULL); + cliVersion(cmdName, ""); if (!(dumpMask & BARE)) { #ifdef USE_CLI_BATCH @@ -6017,9 +6043,9 @@ static void printConfig(char *cmdline, bool doDiff) #endif if ((dumpMask & DUMP_ALL) && !(dumpMask & BARE)) { - cliMcuId(NULL); + cliMcuId(cmdName, ""); #if defined(USE_SIGNATURE) - cliSignature(""); + cliSignature(cmdName, ""); #endif } @@ -6103,13 +6129,13 @@ static void printConfig(char *cmdline, bool doDiff) } if (dumpMask & HARDWARE_ONLY) { - dumpAllValues(HARDWARE_VALUE, dumpMask, "master"); + dumpAllValues(cmdName, HARDWARE_VALUE, dumpMask, "master"); } else { - dumpAllValues(MASTER_VALUE, dumpMask, "master"); + dumpAllValues(cmdName, MASTER_VALUE, dumpMask, "master"); if (dumpMask & DUMP_ALL) { for (uint32_t pidProfileIndex = 0; pidProfileIndex < PID_PROFILE_COUNT; pidProfileIndex++) { - cliDumpPidProfile(pidProfileIndex, dumpMask); + cliDumpPidProfile(cmdName, pidProfileIndex, dumpMask); } pidProfileIndexToUse = systemConfig_Copy.pidProfileIndex; @@ -6117,13 +6143,13 @@ static void printConfig(char *cmdline, bool doDiff) if (!(dumpMask & BARE)) { cliPrintHashLine("restore original profile selection"); - cliProfile(""); + cliProfile(cmdName, ""); } pidProfileIndexToUse = CURRENT_PROFILE_INDEX; for (uint32_t rateIndex = 0; rateIndex < CONTROL_RATE_PROFILE_COUNT; rateIndex++) { - cliDumpRateProfile(rateIndex, dumpMask); + cliDumpRateProfile(cmdName, rateIndex, dumpMask); } rateProfileIndexToUse = systemConfig_Copy.activeRateProfile; @@ -6131,7 +6157,7 @@ static void printConfig(char *cmdline, bool doDiff) if (!(dumpMask & BARE)) { cliPrintHashLine("restore original rateprofile selection"); - cliRateProfile(""); + cliRateProfile(cmdName, ""); cliPrintHashLine("save configuration"); cliPrint("save"); @@ -6142,15 +6168,15 @@ static void printConfig(char *cmdline, bool doDiff) rateProfileIndexToUse = CURRENT_PROFILE_INDEX; } else { - cliDumpPidProfile(systemConfig_Copy.pidProfileIndex, dumpMask); + cliDumpPidProfile(cmdName, systemConfig_Copy.pidProfileIndex, dumpMask); - cliDumpRateProfile(systemConfig_Copy.activeRateProfile, dumpMask); + cliDumpRateProfile(cmdName, systemConfig_Copy.activeRateProfile, dumpMask); } } } else if (dumpMask & DUMP_PROFILE) { - cliDumpPidProfile(systemConfig_Copy.pidProfileIndex, dumpMask); + cliDumpPidProfile(cmdName, systemConfig_Copy.pidProfileIndex, dumpMask); } else if (dumpMask & DUMP_RATES) { - cliDumpRateProfile(systemConfig_Copy.activeRateProfile, dumpMask); + cliDumpRateProfile(cmdName, systemConfig_Copy.activeRateProfile, dumpMask); } #ifdef USE_CLI_BATCH @@ -6164,18 +6190,18 @@ static void printConfig(char *cmdline, bool doDiff) restoreConfigs(); } -static void cliDump(char *cmdline) +static void cliDump(const char *cmdName, char *cmdline) { - printConfig(cmdline, false); + printConfig(cmdName, cmdline, false); } -static void cliDiff(char *cmdline) +static void cliDiff(const char *cmdName, char *cmdline) { - printConfig(cmdline, true); + printConfig(cmdName, cmdline, true); } #if defined(USE_USB_MSC) -static void cliMsc(char *cmdline) +static void cliMsc(const char *cmdName, char *cmdline) { if (mscCheckFilesystemReady()) { #ifdef USE_RTC_TIME @@ -6183,7 +6209,7 @@ static void cliMsc(char *cmdline) if (!isEmpty(cmdline)) { timezoneOffsetMinutes = atoi(cmdline); if ((timezoneOffsetMinutes < TIMEZONE_OFFSET_MINUTES_MIN) || (timezoneOffsetMinutes > TIMEZONE_OFFSET_MINUTES_MAX)) { - cliPrintErrorLinef("INVALID TIMEZONE OFFSET"); + cliPrintErrorLinef(cmdName, "INVALID TIMEZONE OFFSET"); return; } } @@ -6204,6 +6230,7 @@ static void cliMsc(char *cmdline) } #endif +typedef void cliCommandFn(const char* name, char *cmdline); typedef struct { const char *name; @@ -6211,26 +6238,26 @@ typedef struct { const char *description; const char *args; #endif - void (*func)(char *cmdline); + cliCommandFn *cliCommand; } clicmd_t; #ifndef MINIMAL_CLI -#define CLI_COMMAND_DEF(name, description, args, method) \ +#define CLI_COMMAND_DEF(name, description, args, cliCommand) \ { \ name , \ description , \ args , \ - method \ + cliCommand \ } #else -#define CLI_COMMAND_DEF(name, description, args, method) \ +#define CLI_COMMAND_DEF(name, description, args, cliCommand) \ { \ name, \ - method \ + cliCommand \ } #endif -static void cliHelp(char *cmdline); +static void cliHelp(const char *cmdName, char *cmdline); // should be sorted a..z for bsearch() const clicmd_t cmdTable[] = { @@ -6392,7 +6419,7 @@ const clicmd_t cmdTable[] = { #endif }; -static void cliHelp(char *cmdline) +static void cliHelp(const char *cmdName, char *cmdline) { bool anyMatches = false; @@ -6425,7 +6452,7 @@ static void cliHelp(char *cmdline) } } if (!isEmpty(cmdline) && !anyMatches) { - cliPrintErrorLinef("NO MATCHES FOR '%s'", cmdline); + cliPrintErrorLinef(cmdName, "NO MATCHES FOR '%s'", cmdline); } } @@ -6465,9 +6492,9 @@ static void processCharacter(const char c) } } if (cmd < cmdTable + ARRAYLEN(cmdTable)) { - cmd->func(options); + cmd->cliCommand(cmd->name, options); } else { - cliPrintError("UNKNOWN COMMAND, TRY 'HELP'"); + cliPrintError("input", "UNKNOWN COMMAND, TRY 'HELP'"); } bufferIndex = 0; } @@ -6529,7 +6556,7 @@ static void processCharacterInteractive(const char c) for (; i < bufferIndex; i++) cliWrite(cliBuffer[i]); } else if (!bufferIndex && c == 4) { // CTRL-D - cliExit(cliBuffer); + cliExit("", cliBuffer); return; } else if (c == 12) { // NewPage / CTRL-L // clear screen diff --git a/src/test/unit/cli_unittest.cc b/src/test/unit/cli_unittest.cc index c654720b3..0dd702afd 100644 --- a/src/test/unit/cli_unittest.cc +++ b/src/test/unit/cli_unittest.cc @@ -53,8 +53,7 @@ extern "C" { #include "scheduler/scheduler.h" #include "sensors/battery.h" - void cliSet(char *cmdline); - void cliGet(char *cmdline); + void cliSet(const char *cmdName, char *cmdline); int cliGetSettingIndex(char *name, uint8_t length); void *cliGetValuePointer(const clivalue_t *value); @@ -96,7 +95,7 @@ extern "C" { TEST(CLIUnittest, TestCliSetArray) { char *str = (char *)"array_unit_test = 123, -3 , 1"; - cliSet(str); + cliSet("", str); const uint16_t index = cliGetSettingIndex(str, 15); EXPECT_LT(index, valueTableEntryCount); @@ -119,7 +118,7 @@ TEST(CLIUnittest, TestCliSetArray) TEST(CLIUnittest, TestCliSetStringNoFlags) { char *str = (char *)"str_unit_test = SAMPLE"; - cliSet(str); + cliSet("", str); const uint16_t index = cliGetSettingIndex(str, 13); EXPECT_LT(index, valueTableEntryCount); @@ -147,7 +146,7 @@ TEST(CLIUnittest, TestCliSetStringWriteOnce) { char *str1 = (char *)"wos_unit_test = SAMPLE"; char *str2 = (char *)"wos_unit_test = ELPMAS"; - cliSet(str1); + cliSet("", str1); const uint16_t index = cliGetSettingIndex(str1, 13); EXPECT_LT(index, valueTableEntryCount); @@ -169,7 +168,7 @@ TEST(CLIUnittest, TestCliSetStringWriteOnce) EXPECT_EQ('E', data[5]); EXPECT_EQ(0, data[6]); - cliSet(str2); + cliSet("", str2); EXPECT_EQ('S', data[0]); EXPECT_EQ('A', data[1]); @@ -179,7 +178,7 @@ TEST(CLIUnittest, TestCliSetStringWriteOnce) EXPECT_EQ('E', data[5]); EXPECT_EQ(0, data[6]); - cliSet(str1); + cliSet("", str1); EXPECT_EQ('S', data[0]); EXPECT_EQ('A', data[1]);