blob: cbb7d7fed5c68eee7f96f9a4af12338e2b254c4f [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the tools applications of the QtSerialBus module.
**
** $QT_BEGIN_LICENSE:LGPL3$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or later as published by the Free
** Software Foundation and appearing in the file LICENSE.GPL included in
** the packaging of this file. Please review the following information to
** ensure the GNU General Public License version 2.0 requirements will be
** met: http://www.gnu.org/licenses/gpl-2.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "canbusutil.h"
#include "sigtermhandler.h"
#include <QCommandLineParser>
#include <QCoreApplication>
#include <QTextStream>
#include <QScopedPointer>
#include <signal.h>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QCoreApplication::setApplicationName(QStringLiteral("canbusutil"));
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, &app, &QCoreApplication::quit);
QTextStream output(stdout);
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 frames 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>##[flags]{payload} (CAN FD data frames),\n"
"where {payload} has 0..8 (0..64 CAN FD) ASCII hex-value pairs, "
"and flags is one optional ASCII hex char for CAN FD flags: "
"1 = Bitrate Switch, 2 = Error State Indicator\n"
"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);
const QCommandLineOption showTimeStampOption({"t", "timestamp"},
CanBusUtil::tr("Show timestamp for each received CAN bus frame."));
parser.addOption(showTimeStampOption);
const QCommandLineOption showFlagsOption({"i", "info"},
CanBusUtil::tr("Show flags bitrate switch, error indicator, and local echo"
" for each received CAN bus frame."));
parser.addOption(showFlagsOption);
const QCommandLineOption listDevicesOption({"d", "devices"},
CanBusUtil::tr("Show available CAN bus devices for the given plugin."));
parser.addOption(listDevicesOption);
const QCommandLineOption canFdOption({"f", "can-fd"},
CanBusUtil::tr("Enable CAN FD functionality when listening."));
parser.addOption(canFdOption);
const QCommandLineOption loopbackOption({"c", "local-loopback"},
CanBusUtil::tr("Transmits all sent frames to other local applications."));
parser.addOption(loopbackOption);
const QCommandLineOption receiveOwnOption({"o", "receive-own"},
CanBusUtil::tr("Receive each sent frame on successful transmission."));
parser.addOption(receiveOwnOption);
const QCommandLineOption bitrateOption({"b", "bitrate"},
CanBusUtil::tr("Set the CAN bus bitrate to the given value."),
QStringLiteral("bitrate"));
parser.addOption(bitrateOption);
const QCommandLineOption dataBitrateOption({"a", "data-bitrate"},
CanBusUtil::tr("Set the CAN FD data bitrate to the given value."),
QStringLiteral("bitrate"));
parser.addOption(dataBitrateOption);
parser.process(app);
if (parser.isSet(listOption))
return util.printPlugins();
QString data;
const QStringList args = parser.positionalArguments();
if (parser.isSet(canFdOption))
util.setConfigurationParameter(QCanBusDevice::CanFdKey, true);
if (parser.isSet(loopbackOption))
util.setConfigurationParameter(QCanBusDevice::LoopbackKey, true);
if (parser.isSet(receiveOwnOption))
util.setConfigurationParameter(QCanBusDevice::ReceiveOwnKey, true);
if (!parser.value(bitrateOption).isEmpty()) {
util.setConfigurationParameter(QCanBusDevice::BitRateKey,
parser.value(bitrateOption).toInt());
}
if (!parser.value(dataBitrateOption).isEmpty()) {
util.setConfigurationParameter(QCanBusDevice::DataBitRateKey,
parser.value(dataBitrateOption).toInt());
}
if (parser.isSet(listeningOption)) {
util.setShowTimeStamp(parser.isSet(showTimeStampOption));
util.setShowFlags(parser.isSet(showFlagsOption));
} else if (args.size() == 3) {
data = args.at(2);
} else if (args.size() == 1 && parser.isSet(listDevicesOption)) {
return util.printDevices(args.at(0));
}
if (args.size() < 2 || args.size() > 3) {
output << CanBusUtil::tr("Invalid number of arguments (%1 given).").arg(args.size());
output << Qt::endl << Qt::endl << parser.helpText();
return 1;
}
if (!util.start(args.at(0), args.at(1), data))
return -1;
return app.exec();
}