[cli] allow to define ping interval in milliseconds (#3607)

This commit is contained in:
Łukasz Duda
2019-02-19 12:04:23 -08:00
committed by Jonathan Hui
parent 8c13df5a51
commit 9297f3559d
3 changed files with 64 additions and 11 deletions
+4
View File
@@ -1399,6 +1399,10 @@ Done
Send an ICMPv6 Echo Request.
* size: The number of data bytes to be sent.
* count: The number of ICMPv6 Echo Requests to be sent.
* interval: The interval between two consecutive ICMPv6 Echo Requests in seconds. The value may have fractional form, for example `0.5`.
```bash
> ping fdde:ad00:beef:0:558:f56b:d688:799
16 bytes from fdde:ad00:beef:0:558:f56b:d688:799: icmp_seq=1 hlim=64 time=28ms
+55 -7
View File
@@ -418,6 +418,52 @@ otError Interpreter::ParseUnsignedLong(char *argv, unsigned long &value)
return (*endptr == '\0') ? OT_ERROR_NONE : OT_ERROR_PARSE;
}
otError Interpreter::ParsePingInterval(const char *aString, uint32_t &aInterval)
{
otError error = OT_ERROR_NONE;
const uint32_t msFactor = 1000;
uint32_t factor = msFactor;
aInterval = 0;
while (*aString)
{
if ('0' <= *aString && *aString <= '9')
{
// In the case of seconds, change the base of already calculated value.
if (factor == msFactor)
{
aInterval *= 10;
}
aInterval += static_cast<uint32_t>(*aString - '0') * factor;
// In the case of milliseconds, change the multiplier factor.
if (factor != msFactor)
{
factor /= 10;
}
}
else if (*aString == '.')
{
// Accept only one dot character.
VerifyOrExit(factor == msFactor, error = OT_ERROR_PARSE);
// Start analyzing hundreds of milliseconds.
factor /= 10;
}
else
{
ExitNow(error = OT_ERROR_PARSE);
}
aString++;
}
exit:
return error;
}
void Interpreter::ProcessHelp(int argc, char *argv[])
{
OT_UNUSED_VARIABLE(argc);
@@ -1926,9 +1972,10 @@ exit:
void Interpreter::ProcessPing(int argc, char *argv[])
{
otError error = OT_ERROR_NONE;
uint8_t index = 1;
long value;
otError error = OT_ERROR_NONE;
uint8_t index = 1;
long value;
uint32_t interval;
VerifyOrExit(argc > 0, error = OT_ERROR_INVALID_ARGS);
@@ -1957,21 +2004,22 @@ void Interpreter::ProcessPing(int argc, char *argv[])
while (index < argc)
{
SuccessOrExit(error = ParseLong(argv[index], value));
switch (index)
{
case 1:
SuccessOrExit(error = ParseLong(argv[index], value));
mLength = static_cast<uint16_t>(value);
break;
case 2:
SuccessOrExit(error = ParseLong(argv[index], value));
mCount = static_cast<uint16_t>(value);
break;
case 3:
VerifyOrExit(0 < value && value <= Timer::kMaxDt / 1000, error = OT_ERROR_INVALID_ARGS);
mInterval = static_cast<uint32_t>(value) * 1000;
SuccessOrExit(error = ParsePingInterval(argv[index], interval));
VerifyOrExit(0 < interval && interval <= Timer::kMaxDt, error = OT_ERROR_INVALID_ARGS);
mInterval = interval;
break;
default:
+5 -4
View File
@@ -188,10 +188,11 @@ private:
kDefaultJoinerTimeout = 120, ///< Default timeout for Joiners, in seconds.
};
void ProcessHelp(int argc, char *argv[]);
void ProcessAutoStart(int argc, char *argv[]);
void ProcessBufferInfo(int argc, char *argv[]);
void ProcessChannel(int argc, char *argv[]);
otError ParsePingInterval(const char *aString, uint32_t &aInterval);
void ProcessHelp(int argc, char *argv[]);
void ProcessAutoStart(int argc, char *argv[]);
void ProcessBufferInfo(int argc, char *argv[]);
void ProcessChannel(int argc, char *argv[]);
#if OPENTHREAD_FTD
void ProcessChild(int argc, char *argv[]);
void ProcessChildMax(int argc, char *argv[]);