summaryrefslogtreecommitdiffstats
path: root/src/tools
diff options
context:
space:
mode:
authorAndreas Wilhelm <aw@emlix.com>2016-08-25 12:02:54 +0200
committerAndreas Wilhelm <aw@emlix.com>2016-09-30 06:10:48 +0000
commiteb1f2c41de5f99aab45c103c89e085bdd57159e7 (patch)
treeeb4022a853c42471cdb905788c78ad6a7c06074c /src/tools
parent0f237053c578526078b4a7909e5cf6fb7c72d9de (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.cpp50
-rw-r--r--src/tools/canbusutil/canbusutil.h8
-rw-r--r--src/tools/canbusutil/main.cpp63
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();
}