diff options
author | Andreas Wilhelm <aw@emlix.com> | 2016-08-25 12:02:54 +0200 |
---|---|---|
committer | Andreas Wilhelm <aw@emlix.com> | 2016-09-30 06:10:48 +0000 |
commit | eb1f2c41de5f99aab45c103c89e085bdd57159e7 (patch) | |
tree | eb4022a853c42471cdb905788c78ad6a7c06074c /src/tools | |
parent | 0f237053c578526078b4a7909e5cf6fb7c72d9de (diff) |
canbusutil: Ported to QCommandLineParser
Change-Id: I285bad6f9df2014f3cbcdf66485a3004a4f16b02
Reviewed-by: Rolf Eike Beer <eb@emlix.com>
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/canbusutil/canbusutil.cpp | 50 | ||||
-rw-r--r-- | src/tools/canbusutil/canbusutil.h | 8 | ||||
-rw-r--r-- | src/tools/canbusutil/main.cpp | 63 |
3 files changed, 66 insertions, 55 deletions
diff --git a/src/tools/canbusutil/canbusutil.cpp b/src/tools/canbusutil/canbusutil.cpp index 48094fb..5f74411 100644 --- a/src/tools/canbusutil/canbusutil.cpp +++ b/src/tools/canbusutil/canbusutil.cpp @@ -48,15 +48,17 @@ CanBusUtil::CanBusUtil(QTextStream &output, QCoreApplication &app, QObject *pare { } -bool CanBusUtil::start(int argc, char *argv[]) +bool CanBusUtil::start(const QString &pluginName, const QString &deviceName, const QString &data) { if (!m_canBus) { m_output << "Unable to create QCanBus" << endl; return false; } - if (!parseArgs(argc, argv)) - return false; + m_pluginName = pluginName; + m_deviceName = deviceName; + m_data = data; + m_listening = data.isEmpty(); if (!connectCanDevice()) return false; @@ -72,21 +74,6 @@ bool CanBusUtil::start(int argc, char *argv[]) return true; } -void CanBusUtil::printUsage() -{ - m_output << "Usage: canbusutil [options] <plugin> <device> [data]" << endl - << "-l start listening CAN data on device" << endl - << "--list-plugins lists all available plugins" << endl - << "<plugin> plugin name to use. See --list-plugins." << endl - << "<device> device to use" << endl - << "[data] Data to send if -l is not specified. Format: " << endl - << " <id>#{payload} (CAN 2.0 data frames)," << endl - << " <id>#Rxx (CAN 2.0 RTR frames with xx bytes data length)," << endl - << " <id>##{payload} (CAN FD data frames)," << endl - << " where {payload} has 0..8 (0..64 CAN FD) ASCII hex-value pairs," << endl - << " e.g. 1#1a2b3c" << endl; -} - void CanBusUtil::printPlugins() { const QStringList plugins = m_canBus->plugins(); @@ -104,33 +91,6 @@ void CanBusUtil::printDataUsage() << "{payload} has 0..8 (0..64 CAN FD) ASCII hex-value pairs" << endl; } - -bool CanBusUtil::parseArgs(int argc, char *argv[]) -{ - QString arg1(argv[1]); - - if (arg1 == QStringLiteral("--list-plugins")) { - printPlugins(); - return false; - } - - if (argc != 4) { - printUsage(); - return false; - } - - m_listening = arg1 == QStringLiteral("-l"); - if (m_listening) { - m_pluginName = QString(argv[2]); - m_deviceName = QString(argv[3]); - } else { - m_pluginName = QString(arg1); - m_deviceName = QString(argv[2]); - m_data = QString(argv[3]); - } - return true; -} - bool CanBusUtil::parseDataField(qint32 &id, QString &payload) { int hashMarkPos = m_data.indexOf('#'); diff --git a/src/tools/canbusutil/canbusutil.h b/src/tools/canbusutil/canbusutil.h index 6333cf4..ce9f29c 100644 --- a/src/tools/canbusutil/canbusutil.h +++ b/src/tools/canbusutil/canbusutil.h @@ -50,13 +50,11 @@ class CanBusUtil : public QObject public: explicit CanBusUtil(QTextStream &output, QCoreApplication &app, QObject *parent = nullptr); - bool start(int argc, char *argv[]); - -private: - void printUsage(); + bool start(const QString &pluginName, const QString &deviceName, const QString &data = QString()); void printPlugins(); void printDataUsage(); - bool parseArgs(int argc, char *argv[]); + +private: bool parseDataField(qint32 &id, QString &payload); bool parsePayloadField(QString payload, bool &rtrFrame, bool &fdFrame, QByteArray &bytes); bool connectCanDevice(); diff --git a/src/tools/canbusutil/main.cpp b/src/tools/canbusutil/main.cpp index ee7d30e..d75a16a 100644 --- a/src/tools/canbusutil/main.cpp +++ b/src/tools/canbusutil/main.cpp @@ -34,6 +34,7 @@ ** ****************************************************************************/ +#include <QCommandLineParser> #include <QCoreApplication> #include <QTextStream> #include <QScopedPointer> @@ -43,19 +44,71 @@ #include "canbusutil.h" #include "sigtermhandler.h" +#define PROGRAMNAME "canbusutil" + int main(int argc, char *argv[]) { - QCoreApplication a(argc, argv); + QCoreApplication app(argc, argv); + QCoreApplication::setApplicationName(QStringLiteral(PROGRAMNAME)); + QCoreApplication::setApplicationVersion(QStringLiteral(QT_VERSION_STR)); QScopedPointer<SigTermHandler> s(SigTermHandler::instance()); if (signal(SIGINT, SigTermHandler::handle) == SIG_ERR) return -1; - QObject::connect(s.data(), &SigTermHandler::sigTermSignal, &a, &QCoreApplication::quit); + QObject::connect(s.data(), &SigTermHandler::sigTermSignal, &app, &QCoreApplication::quit); QTextStream output(stdout); - CanBusUtil util(output, a); - if (!util.start(argc, argv)) + CanBusUtil util(output, app); + + QCommandLineParser parser; + parser.setApplicationDescription(CanBusUtil::tr( + "Sends arbitrary CAN bus frames.\n" + "If the -l option is set, all received CAN bus packages are dumped.")); + parser.addHelpOption(); + parser.addVersionOption(); + + parser.addPositionalArgument(QStringLiteral("plugin"), + CanBusUtil::tr("Plugin name to use. See --list-plugins.")); + + parser.addPositionalArgument(QStringLiteral("device"), + CanBusUtil::tr("Device to use.")); + + parser.addPositionalArgument(QStringLiteral("data"), + CanBusUtil::tr( + "Data to send if -l is not specified. Format:\n" + "\t\t<id>#{payload} (CAN 2.0 data frames),\n" + "\t\t<id>#Rxx (CAN 2.0 RTR frames with xx bytes data length),\n" + "\t\t<id>##{payload} (CAN FD data frames),\n" + "where {payload} has 0..8 (0..64 CAN FD) ASCII hex-value pairs, " + "e.g. 1#1a2b3c\n"), QStringLiteral("[data]")); + + const QCommandLineOption listeningOption({"l", "listen"}, + CanBusUtil::tr("Start listening CAN data on device.")); + parser.addOption(listeningOption); + + const QCommandLineOption listOption({"L", "list-plugins"}, + CanBusUtil::tr("List all available plugins.")); + parser.addOption(listOption); + + parser.process(app); + + if (parser.isSet(listOption)) { + util.printPlugins(); + return 0; + } + + QString data; + const QStringList args = parser.positionalArguments(); + if (!parser.isSet(listeningOption) && args.size() == 3) { + data = args[2]; + } else if (!parser.isSet(listeningOption) || args.size() != 2) { + fprintf(stderr, "Invalid number of arguments (%d given).\n\n%s", + args.size(), qPrintable(parser.helpText())); + return 1; + } + + if (!util.start(args[0], args[1], data)) return -1; - return a.exec(); + return app.exec(); } |