mirror of
https://github.com/espressif/openthread.git
synced 2026-08-08 19:57:46 +00:00
[posix-host] add command mode for ot-ctl (#4457)
ot-ctl will now send the command line arguments to ot-daemon and print the reply.
This commit is contained in:
committed by
Jonathan Hui
parent
05ba4c29f4
commit
7d92134da2
@@ -80,6 +80,10 @@ check() {
|
||||
OT_CLI_CMD="$(pwd)/$(ls output/posix/*linux*/bin/ot-cli) ${OT_NCP_PATH} ${CORE_PTY}"
|
||||
fi
|
||||
|
||||
if [[ "${DAEMON}" = 1 ]]; then
|
||||
sudo ${OT_CLI_CMD} panid 0xface | grep 'Done' || die 'failed to get panid with ot-ctl'
|
||||
fi
|
||||
|
||||
sudo expect <<EOF > "${OT_OUTPUT}" &
|
||||
spawn ${OT_CLI_CMD}
|
||||
send "panid 0xface\r\n"
|
||||
|
||||
@@ -75,6 +75,107 @@ static void InputCallback(char *aLine)
|
||||
}
|
||||
#endif // OPENTHREAD_USE_READLINE
|
||||
|
||||
static bool FindDone(int *aDoneState, char aNowCharacter)
|
||||
{
|
||||
switch (aNowCharacter)
|
||||
{
|
||||
case 'D':
|
||||
*aDoneState = *aDoneState == 0 ? 1 : -1;
|
||||
break;
|
||||
case 'o':
|
||||
*aDoneState = *aDoneState == 1 ? 2 : -1;
|
||||
break;
|
||||
case 'n':
|
||||
*aDoneState = *aDoneState == 2 ? 3 : -1;
|
||||
break;
|
||||
case 'e':
|
||||
*aDoneState = *aDoneState == 3 ? 4 : -1;
|
||||
break;
|
||||
case '\r':
|
||||
case '\n':
|
||||
if (*aDoneState == 4)
|
||||
{
|
||||
*aDoneState = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
*aDoneState = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
*aDoneState = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
return *aDoneState == 5;
|
||||
}
|
||||
|
||||
static bool FindError(int *aErrorState, char aNowCharacter)
|
||||
{
|
||||
switch (aNowCharacter)
|
||||
{
|
||||
case 'E':
|
||||
*aErrorState = *aErrorState == 0 ? 1 : -1;
|
||||
break;
|
||||
case 'r':
|
||||
if (*aErrorState == 1 || *aErrorState == 2 || *aErrorState == 4)
|
||||
{
|
||||
(*aErrorState)++;
|
||||
}
|
||||
else
|
||||
{
|
||||
*aErrorState = -1;
|
||||
}
|
||||
break;
|
||||
case 'o':
|
||||
*aErrorState = *aErrorState == 3 ? 4 : -1;
|
||||
break;
|
||||
case ' ':
|
||||
*aErrorState = *aErrorState == 5 ? 6 : -1;
|
||||
break;
|
||||
case '\r':
|
||||
case '\n':
|
||||
*aErrorState = 0;
|
||||
break;
|
||||
default:
|
||||
*aErrorState = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
return *aErrorState == 6;
|
||||
}
|
||||
|
||||
static void SendBlockingCommand(int aArgc, char *aArgv[])
|
||||
{
|
||||
char buffer[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
|
||||
int doneState = 0;
|
||||
int errorState = 0;
|
||||
|
||||
for (int i = 0; i < aArgc; i++)
|
||||
{
|
||||
otEXPECT_ACTION(write(sSessionFd, aArgv[i], strlen(aArgv[i])) >= 0, perror("Failed to send command"));
|
||||
otEXPECT_ACTION(write(sSessionFd, " ", 1) >= 0, perror("Failed to send command"));
|
||||
}
|
||||
otEXPECT_ACTION(write(sSessionFd, "\n", 1) >= 0, perror("Failed to send command"));
|
||||
|
||||
while (true)
|
||||
{
|
||||
ssize_t rval = read(sSessionFd, buffer, sizeof(buffer));
|
||||
|
||||
otEXPECT(rval >= 0);
|
||||
write(STDOUT_FILENO, buffer, rval);
|
||||
for (ssize_t i = 0; i < rval; i++)
|
||||
{
|
||||
if (FindDone(&doneState, buffer[i]) || FindError(&errorState, buffer[i]))
|
||||
{
|
||||
otEXIT_NOW();
|
||||
}
|
||||
}
|
||||
}
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
OT_UNUSED_VARIABLE(argc);
|
||||
@@ -109,6 +210,12 @@ int main(int argc, char *argv[])
|
||||
#endif
|
||||
}
|
||||
|
||||
if (argc > 1)
|
||||
{
|
||||
SendBlockingCommand(argc - 1, &argv[1]);
|
||||
otEXIT_NOW(ret = 0);
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
fd_set readFdSet;
|
||||
|
||||
Reference in New Issue
Block a user