bool ParseCommandLine()

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;
}