in MavLinkCom/MavLinkTest/main.cpp [780:983]
bool ParseCommandLine(int argc, const char* argv[])
{
const char* logDirOption = "logdir";
const char* logformatOption = "logformat";
//const char* outLogFileOption = "outlogfile";
const char* wifiOption = "wifi";
const char* initOption = "init";
const char* filterOption = "filter";
const char* convertOption = "convert";
// parse command line
for (int i = 1; i < argc; i++) {
const char* arg = argv[i];
if (arg[0] == '-' || arg[0] == '/') {
std::string option(arg + 1);
std::vector<std::string> parts = Utils::split(option, ":,", 2);
std::string lower = Utils::toLower(parts[0]);
if (lower == "udp") {
udp = true;
offboard = true;
offboardEndPoint.port = DEFAULT_OFFBOARD_UDP_PORT;
if (parts.size() > 1) {
offboardEndPoint.addr = parts[1];
if (parts.size() > 2) {
offboardEndPoint.port = atoi(parts[2].c_str());
}
}
}
else if (lower == "tcp") {
tcp = true;
offboard = true;
offboardEndPoint.port = DEFAULT_OFFBOARD_TCP_PORT;
if (parts.size() > 1) {
offboardEndPoint.addr = parts[1];
if (parts.size() > 2) {
offboardEndPoint.port = atoi(parts[2].c_str());
}
}
}
else if (lower == "local") {
localEndPoint.port = 0; // any port.
if (parts.size() > 1) {
localEndPoint.addr = parts[1];
if (parts.size() > 2) {
localEndPoint.port = atoi(parts[2].c_str());
}
}
}
else if (lower == "server") {
server = true;
}
else if (lower == "sitl") {
sitl = true;
sitlEndPoint.port = 0; // any port.
if (parts.size() > 1) {
sitlEndPoint.addr = parts[1];
if (parts.size() > 2) {
sitlEndPoint.port = atoi(parts[2].c_str());
}
}
}
else if (lower == "proxy") {
PortAddress ep;
ep.port = DEFAULT_PROXY_PORT;
if (parts.size() > 1) {
ep.addr = parts[1];
if (parts.size() > 2) {
ep.port = atoi(parts[2].c_str());
}
}
proxyEndPoints.push_back(ep);
}
else if (lower == "logviewer") {
connectLogViewer = true;
logViewerEndPoint.port = DEFAULT_LOGVIEWER_PORT;
if (parts.size() > 1) {
logViewerEndPoint.addr = parts[1];
if (parts.size() > 2) {
logViewerEndPoint.port = atoi(parts[2].c_str());
}
}
}
else if (lower == logDirOption) {
if (parts.size() > 1) {
std::string fileName(arg + 1 + strlen(logDirOption) + 1);
logDirectory = fileName;
}
}
else if (lower == logformatOption) {
if (parts.size() > 1) {
std::string format(arg + 1 + strlen(logformatOption) + 1);
format = Utils::toLower(format);
if (format == "json") {
jsonLogFormat = true;
}
else {
printf("### Error: invalid logformat '%s', expecting 'json'\n", format.c_str());
return false;
}
}
}
else if (lower == convertOption) {
convertExisting = true;
if (parts.size() > 1) {
std::string format(arg + 1 + strlen(convertOption) + 1);
format = Utils::toLower(format);
if (format == "json") {
jsonLogFormat = true;
}
else if (format == "csv") {
csvLogFormat = true;
}
else {
printf("### Error: invalid format '%s', expecting 'json'\n", format.c_str());
return false;
}
}
}
else if (lower == filterOption) {
if (parts.size() > 1) {
std::string filters(arg + 1 + strlen(filterOption) + 1);
std::vector<std::string> fparts = Utils::split(filters, ",", 1);
for (auto ptr = fparts.begin(), end = fparts.end(); ptr != end; ptr++) {
std::string f = *ptr;
try {
long ft = std::stol(f);
filterTypes.push_back(ft);
}
catch (std::exception&) {
printf("expecting integer filter messagid, but found %s\n", f.c_str());
return false;
}
}
}
}
#if defined(USE_CPP_FILESYSTEM)
else if (lower == initOption) {
if (parts.size() > 1) {
std::string fileName(arg + 1 + strlen(initOption) + 1);
LoadInitScript(fileName);
}
}
#endif
else if (lower == "local") {
if (parts.size() > 1) {
defaultLocalAddress = parts[1];
}
}
else if (lower == "serial") {
serial = true;
if (parts.size() > 1) {
comPort = parts[1];
if (parts.size() > 2) {
baudRate = atoi(parts[2].c_str());
if (baudRate == 0) {
printf("### Error: invalid baud rate in -serial argument\n");
return false;
}
}
}
}
else if (lower == "h" || lower == "?" || lower == "help" || lower == "-help") {
return false;
}
else if (lower == "noradio") {
noRadio = true;
}
else if (lower == "test") {
unitTest = true;
}
else if (lower == "verbose") {
verbose = true;
}
else if (lower == "nsh") {
nsh = true;
}
else if (lower == "noparams") {
noparams = true;
}
else if (lower == "telemetry") {
telemetry = true;
}
else if (lower == wifiOption) {
if (parts.size() > 1) {
std::string name(arg + 1 + strlen(wifiOption) + 1);
ifaceName = name;
}
}
else {
printf("### Error: unexpected argument: %s\n", arg);
return false;
}
}
else {
printf("### Error: unexpected argument: %s\n", arg);
return false;
}
}
return true;
}