diff --git a/src/core/diags/README.md b/src/core/diags/README.md index ba2a9ec75..090aa0376 100644 --- a/src/core/diags/README.md +++ b/src/core/diags/README.md @@ -171,3 +171,63 @@ last received packet: rssi=-61, lqi=98 stop diagnostics mode status 0x00 ``` + +### diag rcp + +RCP-related diagnostics commands. These commands are used for debugging and testing only. + +#### diag rcp start + +Start RCP diagnostics mode. + +```bash +> diag rcp start +Done +``` + +#### diag rcp stop + +Stop RCP diagnostics mode. + +```bash +> diag rcp stop +Done +``` + +#### diag rcp channel \ + +Set the RCP IEEE 802.15.4 Channel value for diagnostics module. + +```bash +> diag rcp channel 11 +Done +``` + +#### diag rcp power \ + +Set the RCP tx power value(dBm) for diagnostics module. + +```bash +> diag rcp power 0 +Done +``` + +#### diag rcp echo \ + +RCP echoes the given message. + +```bash +> diag rcp echo 0123456789 +0123456789 +Done +``` + +#### diag rcp echo -n \ + +RCP echoes the message with the given number of bytes. + +```bash +> diag rcp echo -n 20 +01234567890123456789 +Done +``` diff --git a/src/core/diags/factory_diags.cpp b/src/core/diags/factory_diags.cpp index 5eeec1906..6410421f7 100644 --- a/src/core/diags/factory_diags.cpp +++ b/src/core/diags/factory_diags.cpp @@ -70,10 +70,8 @@ namespace FactoryDiags { #if OPENTHREAD_RADIO && !OPENTHREAD_RADIO_CLI const struct Diags::Command Diags::sCommands[] = { - {"channel", &Diags::ProcessChannel}, - {"power", &Diags::ProcessPower}, - {"start", &Diags::ProcessStart}, - {"stop", &Diags::ProcessStop}, + {"channel", &Diags::ProcessChannel}, {"echo", &Diags::ProcessEcho}, {"power", &Diags::ProcessPower}, + {"start", &Diags::ProcessStart}, {"stop", &Diags::ProcessStop}, }; Diags::Diags(Instance &aInstance) @@ -114,6 +112,43 @@ exit: return error; } +Error Diags::ProcessEcho(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen) +{ + Error error = kErrorNone; + + if (aArgsLength == 1) + { + snprintf(aOutput, aOutputMaxLen, "%s\r\n", aArgs[0]); + } + else if ((aArgsLength == 2) && (strcmp(aArgs[0], "-n") == 0)) + { + const uint8_t kReservedLen = 3; // 1 byte '\r', 1 byte '\n' and 1 byte '\0' + uint32_t outputMaxLen = static_cast(aOutputMaxLen) - kReservedLen; + long value; + uint32_t i; + uint32_t number; + + SuccessOrExit(error = ParseLong(aArgs[1], value)); + number = static_cast(value); + number = (number < outputMaxLen) ? number : outputMaxLen; + + for (i = 0; i < number; i++) + { + aOutput[i] = '0' + i % 10; + } + + snprintf(&aOutput[i], aOutputMaxLen - i, "\r\n"); + } + else + { + error = kErrorInvalidArgs; + } + +exit: + AppendErrorResult(error, aOutput, aOutputMaxLen); + return error; +} + Error Diags::ProcessStart(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen) { OT_UNUSED_VARIABLE(aArgsLength); diff --git a/src/core/diags/factory_diags.hpp b/src/core/diags/factory_diags.hpp index 69301f991..26ccd9e83 100644 --- a/src/core/diags/factory_diags.hpp +++ b/src/core/diags/factory_diags.hpp @@ -151,6 +151,9 @@ private: Error ProcessStart(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen); Error ProcessStats(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen); Error ProcessStop(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen); +#if OPENTHREAD_RADIO && !OPENTHREAD_RADIO_CLI + Error ProcessEcho(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen); +#endif void TransmitPacket(void); diff --git a/tests/scripts/expect/posix-diag-rcp.exp b/tests/scripts/expect/posix-diag-rcp.exp index 2e4732e83..08b9553e3 100755 --- a/tests/scripts/expect/posix-diag-rcp.exp +++ b/tests/scripts/expect/posix-diag-rcp.exp @@ -53,5 +53,17 @@ expect "status 0x7" expect_line "Done" send "diag rcp power 10\n" expect_line "Done" +send "diag rcp echo\n" +expect "failed" +expect "status 0x7" +expect_line "Done" +send "diag rcp echo 0123456789\n" +expect_line "0123456789" +expect_line "Done" +send "diag rcp echo -n 0\n" +expect_line "Done" +send "diag rcp echo -n 253\n" +expect_line {[0-9]{253}} +expect_line "Done" dispose_all