141 lines
2.7 KiB
C++
141 lines
2.7 KiB
C++
#include <Arduino.h>
|
|
#include <WiFi.h>
|
|
|
|
#include "utils.h"
|
|
#include "main.h"
|
|
#include "bafang.h"
|
|
#include "commands.h"
|
|
|
|
namespace Commands {
|
|
|
|
int parseLine(char *line)
|
|
{
|
|
const int MAX_ARGV = 16;
|
|
char *lineStart = line;
|
|
char *argv[MAX_ARGV];
|
|
int argc = 0;
|
|
bool found = false;
|
|
bool end = false;
|
|
bool inString = false;
|
|
|
|
while(1)
|
|
{
|
|
if(*line == '"' && (line == lineStart || *(line - 1) != '\\'))
|
|
{
|
|
inString ^= true;
|
|
if(!inString)
|
|
{
|
|
found = true;
|
|
end = true;
|
|
lineStart++;
|
|
}
|
|
}
|
|
|
|
if(!inString && *line == ' ')
|
|
end = true;
|
|
|
|
if(end || !*line)
|
|
{
|
|
if(found && argc < MAX_ARGV)
|
|
argv[argc++] = lineStart;
|
|
|
|
found = false;
|
|
end = false;
|
|
|
|
if(!*line)
|
|
break;
|
|
|
|
*line = 0;
|
|
lineStart = ++line;
|
|
continue;
|
|
}
|
|
|
|
line++;
|
|
found = true;
|
|
}
|
|
|
|
if(!argc)
|
|
return -1;
|
|
|
|
for(int i = 0; g_Commands[i].cmd; i++)
|
|
{
|
|
if(strcmp(g_Commands[i].cmd, argv[0]) == 0)
|
|
{
|
|
int ret = g_Commands[i].fun(argc, argv);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int CMD_help(int argc, char **argv)
|
|
{
|
|
Main::channel()->println("Available Commands\n------------------");
|
|
|
|
int i = 0;
|
|
while(g_Commands[i].cmd)
|
|
{
|
|
Main::channel()->printf("%17s %s\n", g_Commands[i].cmd, g_Commands[i].help);
|
|
i++;
|
|
}
|
|
Main::channel()->println();
|
|
|
|
return 0;
|
|
}
|
|
|
|
int CMD_debug(int argc, char **argv)
|
|
{
|
|
if(argc != 2) {
|
|
Main::channel()->println("Usage: debug <0|1>");
|
|
return 1;
|
|
}
|
|
|
|
bool debug = false;
|
|
if(strtoul(argv[1], NULL, 10))
|
|
debug = true;
|
|
|
|
Main::g_Debug[Main::g_CurrentChannel] = debug;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int CMD_wifi(int argc, char **argv)
|
|
{
|
|
Main::channel()->printf("connected: %d\n", WiFi.status());
|
|
Main::channel()->println(WiFi.localIP());
|
|
WiFi.printDiag(*Main::channel());
|
|
return 0;
|
|
}
|
|
|
|
int CMD_serial(int argc, char **argv)
|
|
{
|
|
if(argc != 3) {
|
|
Main::channel()->println("Usage: serial <0|1|2> <text>");
|
|
return 1;
|
|
}
|
|
|
|
int port = strtoul(argv[1], NULL, 10);
|
|
|
|
if(port == 0)
|
|
Serial.println(argv[2]);
|
|
else if(port == 1)
|
|
Serial1.println(argv[2]);
|
|
else if(port == 2)
|
|
Serial2.println(argv[2]);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
CommandEntry g_Commands[] =
|
|
{
|
|
{"help", CMD_help, " : Display list of commands"},
|
|
{"debug", CMD_debug, " : debug <0|1>"},
|
|
{"wifi", CMD_wifi, " : show wifi config"},
|
|
{"serial", CMD_serial, " : write to serial <0|1|2> <text>"},
|
|
{ 0, 0, 0 }
|
|
};
|
|
|
|
}
|