From db8c4c83399e5df7514d2ef8d4a57423e5f1b39a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Wa=C5=84czyk?= Date: Fri, 19 Jul 2019 06:24:58 +0200 Subject: [PATCH] [diag] diagnostic module improvements (#3969) Added diagnostic statistic clearing. Improved tx power setting. Provide RSSI of the last received packet. --- src/diag/README.md | 10 +++++++ src/diag/diag_process.cpp | 39 +++++++++++++++++++------- src/diag/diag_process.hpp | 2 ++ tests/scripts/thread-cert/test_diag.py | 8 ++++-- 4 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/diag/README.md b/src/diag/README.md index 7732bd55a..3e39f6250 100644 --- a/src/diag/README.md +++ b/src/diag/README.md @@ -134,8 +134,17 @@ Print statistics during diagnostics mode. received packets: 10 sent packets: 10 first received packet: rssi=-65, lqi=101 +last received packet: rssi=-64, lqi=98 ``` +### diag stats clear + +Clear statistics during diagnostics mode. + +```bash +> diag stats clear +stats cleared +``` ### diag stop Stop diagnostics mode and print statistics. @@ -145,6 +154,7 @@ Stop diagnostics mode and print statistics. received packets: 10 sent packets: 10 first received packet: rssi=-65, lqi=101 +last received packet: rssi=-61, lqi=98 stop diagnostics mode status 0x00 diff --git a/src/diag/diag_process.cpp b/src/diag/diag_process.cpp index c34a9aa13..5d3865590 100644 --- a/src/diag/diag_process.cpp +++ b/src/diag/diag_process.cpp @@ -126,6 +126,7 @@ void Diag::ProcessStart(int aArgCount, char *aArgVector[], char *aOutput, size_t otPlatRadioSetPromiscuous(sInstance, true); otPlatAlarmMilliStop(sInstance); SuccessOrExit(error = otPlatRadioReceive(sInstance, sChannel)); + SuccessOrExit(error = otPlatRadioSetTransmitPower(sInstance, sTxPower)); otPlatDiagModeSet(true); memset(&sStats, 0, sizeof(struct DiagStats)); snprintf(aOutput, aOutputMaxLen, "start diagnostics mode\r\nstatus 0x%02x\r\n", error); @@ -148,10 +149,13 @@ void Diag::ProcessStop(int aArgCount, char *aArgVector[], char *aOutput, size_t otPlatRadioSetPromiscuous(sInstance, false); snprintf(aOutput, aOutputMaxLen, - "received packets: %d\r\nsent packets: %d\r\nfirst received packet: rssi=%d, lqi=%d\r\n" + "received packets: %d\r\nsent packets: %d\r\n" + "first received packet: rssi=%d, lqi=%d\r\n" + "last received packet: rssi=%d, lqi=%d\r\n" "\nstop diagnostics mode\r\nstatus 0x%02x\r\n", static_cast(sStats.mReceivedPackets), static_cast(sStats.mSentPackets), - static_cast(sStats.mFirstRssi), static_cast(sStats.mFirstLqi), error); + static_cast(sStats.mFirstRssi), static_cast(sStats.mFirstLqi), + static_cast(sStats.mLastRssi), static_cast(sStats.mLastLqi), error); exit: AppendErrorResult(error, aOutput, aOutputMaxLen); @@ -222,6 +226,7 @@ void Diag::ProcessPower(int aArgCount, char *aArgVector[], char *aOutput, size_t SuccessOrExit(error = ParseLong(aArgVector[0], value)); sTxPower = static_cast(value); + SuccessOrExit(error = otPlatRadioSetTransmitPower(sInstance, sTxPower)); otPlatDiagTxPowerSet(sTxPower); snprintf(aOutput, aOutputMaxLen, "set tx power to %d dBm\r\nstatus 0x%02x\r\n", sTxPower, error); @@ -293,17 +298,26 @@ exit: void Diag::ProcessStats(int aArgCount, char *aArgVector[], char *aOutput, size_t aOutputMaxLen) { - OT_UNUSED_VARIABLE(aArgCount); - OT_UNUSED_VARIABLE(aArgVector); - otError error = OT_ERROR_NONE; VerifyOrExit(otPlatDiagModeGet(), error = OT_ERROR_INVALID_STATE); - snprintf(aOutput, aOutputMaxLen, - "received packets: %d\r\nsent packets: %d\r\nfirst received packet: rssi=%d, lqi=%d\r\n", - static_cast(sStats.mReceivedPackets), static_cast(sStats.mSentPackets), - static_cast(sStats.mFirstRssi), static_cast(sStats.mFirstLqi)); + if ((aArgCount == 1) && (strcmp(aArgVector[0], "clear") == 0)) + { + memset(&sStats, 0, sizeof(struct DiagStats)); + snprintf(aOutput, aOutputMaxLen, "stats cleared\r\n"); + } + else + { + VerifyOrExit(aArgCount == 0, error = OT_ERROR_INVALID_ARGS); + snprintf(aOutput, aOutputMaxLen, + "received packets: %d\r\nsent packets: %d\r\n" + "first received packet: rssi=%d, lqi=%d\r\n" + "last received packet: rssi=%d, lqi=%d\r\n", + static_cast(sStats.mReceivedPackets), static_cast(sStats.mSentPackets), + static_cast(sStats.mFirstRssi), static_cast(sStats.mFirstLqi), + static_cast(sStats.mLastRssi), static_cast(sStats.mLastLqi)); + } exit: AppendErrorResult(error, aOutput, aOutputMaxLen); @@ -324,7 +338,9 @@ void Diag::ProcessRadio(int aArgCount, char *aArgVector[], char *aOutput, size_t else if (strcmp(aArgVector[0], "receive") == 0) { SuccessOrExit(error = otPlatRadioReceive(sInstance, sChannel)); + SuccessOrExit(error = otPlatRadioSetTransmitPower(sInstance, sTxPower)); otPlatDiagChannelSet(sChannel); + otPlatDiagTxPowerSet(sTxPower); snprintf(aOutput, aOutputMaxLen, "set radio from sleep to receive on channel %d\r\nstatus 0x%02x\r\n", sChannel, error); @@ -363,13 +379,16 @@ void Diag::DiagReceiveDone(otInstance *aInstance, otRadioFrame *aFrame, otError if (aError == OT_ERROR_NONE) { - // for sensitivity test, only record the rssi and lqi for the first packet + // for sensitivity test, only record the rssi and lqi for the first and last packet if (sStats.mReceivedPackets == 0) { sStats.mFirstRssi = aFrame->mInfo.mRxInfo.mRssi; sStats.mFirstLqi = aFrame->mInfo.mRxInfo.mLqi; } + sStats.mLastRssi = aFrame->mInfo.mRxInfo.mRssi; + sStats.mLastLqi = aFrame->mInfo.mRxInfo.mLqi; + sStats.mReceivedPackets++; } otPlatDiagRadioReceived(aInstance, aFrame, aError); diff --git a/src/diag/diag_process.hpp b/src/diag/diag_process.hpp index 6fa8aaa6a..83a7c1439 100644 --- a/src/diag/diag_process.hpp +++ b/src/diag/diag_process.hpp @@ -64,6 +64,8 @@ private: uint32_t mSentPackets; int8_t mFirstRssi; uint8_t mFirstLqi; + int8_t mLastRssi; + uint8_t mLastLqi; }; struct Command diff --git a/tests/scripts/thread-cert/test_diag.py b/tests/scripts/thread-cert/test_diag.py index 709d7f0cd..bcc7a67ef 100755 --- a/tests/scripts/thread-cert/test_diag.py +++ b/tests/scripts/thread-cert/test_diag.py @@ -63,7 +63,9 @@ class TestDiag(unittest.TestCase): ('diag power\n', 'tx power: -10 dBm\r\n'), ('diag stats\n', - 'received packets: 0\r\nsent packets: 0\r\nfirst received packet: rssi=0, lqi=0\r\n', + 'received packets: 0\r\nsent packets: 0\r\n' + 'first received packet: rssi=0, lqi=0\r\n' + 'last received packet: rssi=0, lqi=0\r\n', ), ('diag send 20 100\n', r'sending 0x14 packet\(s\), length 0x64\r\nstatus 0x00\r\n', @@ -78,7 +80,9 @@ class TestDiag(unittest.TestCase): 'repeated packet transmission is stopped\r\nstatus 0x00\r\n', ), ('diag stop\n', - r'received packets: 0\r\nsent packets: ([1-9]\d*)\r\nfirst received packet: rssi=0, lqi=0\r\n\n' + r'received packets: 0\r\nsent packets: ([1-9]\d*)\r\n' + 'first received packet: rssi=0, lqi=0\r\n' + 'last received packet: rssi=0, lqi=0\r\n\n' r'stop diagnostics mode\r\nstatus 0x00\r\n', ), ('diag',