[diag] diagnostic module improvements (#3969)

Added diagnostic statistic clearing.
Improved tx power setting.
Provide RSSI of the last received packet.
This commit is contained in:
Paweł Wańczyk
2019-07-18 21:24:58 -07:00
committed by Jonathan Hui
parent 050cc07206
commit db8c4c8339
4 changed files with 47 additions and 12 deletions
+10
View File
@@ -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
+29 -10
View File
@@ -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<int>(sStats.mReceivedPackets), static_cast<int>(sStats.mSentPackets),
static_cast<int>(sStats.mFirstRssi), static_cast<int>(sStats.mFirstLqi), error);
static_cast<int>(sStats.mFirstRssi), static_cast<int>(sStats.mFirstLqi),
static_cast<int>(sStats.mLastRssi), static_cast<int>(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<int8_t>(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<int>(sStats.mReceivedPackets), static_cast<int>(sStats.mSentPackets),
static_cast<int>(sStats.mFirstRssi), static_cast<int>(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<int>(sStats.mReceivedPackets), static_cast<int>(sStats.mSentPackets),
static_cast<int>(sStats.mFirstRssi), static_cast<int>(sStats.mFirstLqi),
static_cast<int>(sStats.mLastRssi), static_cast<int>(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);
+2
View File
@@ -64,6 +64,8 @@ private:
uint32_t mSentPackets;
int8_t mFirstRssi;
uint8_t mFirstLqi;
int8_t mLastRssi;
uint8_t mLastLqi;
};
struct Command
+6 -2
View File
@@ -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',