9 #include <QApplication>
10 #include <QSplashScreen>
12 #include <QCommandLineParser>
13 #include <QDesktopWidget>
14 #include <QFontDatabase>
16 #include <QPushButton>
17 #include <QNetworkAccessManager>
18 #include <QNetworkReply>
19 #include <QJsonDocument>
23 #include <QDesktopServices>
38 #ifdef COMPILED_WITH_CATKIN
41 #ifdef COMPILED_WITH_AMENT
42 #include <rclcpp/rclcpp.hpp>
46 QString(
"%1.%2.%3").arg(PJ_MAJOR_VERSION).arg(PJ_MINOR_VERSION).arg(PJ_PATCH_VERSION);
50 QStringList online_version = str.split(
'.');
51 if (online_version.size() != 3)
55 int major = online_version[0].toInt();
56 int minor = online_version[1].toInt();
57 int patch = online_version[2].toInt();
58 return major * 10000 + minor * 100 + patch;
65 qDebug() <<
"reply error";
69 QString answer = reply->readAll();
70 QJsonDocument document = QJsonDocument::fromJson(answer.toUtf8());
71 QJsonObject
data = document.object();
72 QString url =
data[
"html_url"].toString();
73 QString name =
data[
"name"].toString();
74 QString tag_name =
data[
"tag_name"].toString();
78 settings.value(
"NewRelease/dontShowThisVersion",
VERSION_STRING).toString();
82 if (online_number > current_number && online_number > dontshow_number)
95 const int last_image_num = 94;
96 return rand() % (last_image_num);
98 std::set<int> previous_set;
99 std::list<int> previous_nums;
101 QStringList previous_list = settings.value(
"previousFunnyMemesList").toStringList();
102 for (
auto str : previous_list)
104 int num = str.toInt();
105 previous_set.insert(num);
106 previous_nums.push_back(num);
110 while (previous_set.count(n) != 0)
115 while (previous_nums.size() >= 10)
117 previous_nums.pop_front();
119 previous_nums.push_back(n);
121 QStringList new_list;
122 for (
int num : previous_nums)
124 new_list.push_back(QString::number(num));
127 settings.setValue(
"previousFunnyMemesList", new_list);
128 auto filename = QString(
"://resources/memes/meme_%1.jpg").arg(n, 2, 10, QChar(
'0'));
129 return QPixmap(filename);
134 #ifdef PJ_DEFAULT_ARGS
137 std::vector<std::string> new_args;
138 new_args.push_back(
args.front());
145 for (
auto cmdline_arg : default_cmdline_args)
149 cmdline_arg = cmdline_arg.replace(
"_0x20_",
" ", Qt::CaseSensitive);
150 cmdline_arg = cmdline_arg.replace(
"_0x3b_",
";", Qt::CaseSensitive);
151 new_args.push_back(strdup(cmdline_arg.toLocal8Bit().data()));
156 for (
size_t i = 1; i <
args.size(); ++i)
158 new_args.push_back(
args[i]);
168 int main(
int argc,
char* argv[])
170 std::vector<std::string>
args;
172 #if !defined(COMPILED_WITH_CATKIN) && !defined(COMPILED_WITH_AMENT)
173 for (
int i = 0; i < argc; i++)
175 args.push_back(argv[i]);
177 #elif defined(COMPILED_WITH_CATKIN)
179 #elif defined(COMPILED_WITH_AMENT)
180 args = rclcpp::remove_ros_arguments(argc, argv);
185 int new_argc =
args.size();
186 std::vector<char*> new_argv;
187 for (
int i = 0; i < new_argc; i++)
192 QApplication app(new_argc, new_argv.data());
196 QCoreApplication::setOrganizationName(
"PlotJuggler");
197 QCoreApplication::setApplicationName(
"PlotJuggler-3");
198 QSettings::setDefaultFormat(QSettings::IniFormat);
202 if (!settings.isWritable())
204 qDebug() <<
"ERROR: the file [" << settings.fileName()
205 <<
"] is not writable. This may happen when you run PlotJuggler with sudo. "
206 "Change the permissions of the file (\"sudo chmod 666 <file_name>\"on "
213 TransformFactory::registerTransform<FirstDerivative>();
214 TransformFactory::registerTransform<ScaleTransform>();
215 TransformFactory::registerTransform<MovingAverageFilter>();
216 TransformFactory::registerTransform<MovingRMS>();
217 TransformFactory::registerTransform<OutlierRemovalFilter>();
218 TransformFactory::registerTransform<IntegralTransform>();
219 TransformFactory::registerTransform<AbsoluteTransform>();
220 TransformFactory::registerTransform<MovingVarianceFilter>();
221 TransformFactory::registerTransform<SamplesCountFilter>();
224 QCommandLineParser
parser;
225 parser.setApplicationDescription(
"PlotJuggler: the time series visualization"
226 " tool that you deserve ");
227 parser.addVersionOption();
230 QCommandLineOption nosplash_option(QStringList() <<
"n"
232 "Don't display the splashscreen");
233 parser.addOption(nosplash_option);
235 QCommandLineOption test_option(QStringList() <<
"t"
237 "Generate test curves at startup");
238 parser.addOption(test_option);
240 QCommandLineOption loadfile_option(QStringList() <<
"d"
242 "Load a file containing data",
"file_path");
243 parser.addOption(loadfile_option);
245 QCommandLineOption layout_option(QStringList() <<
"l"
247 "Load a file containing the layout configuration",
249 parser.addOption(layout_option);
251 QCommandLineOption publish_option(QStringList() <<
"p"
253 "Automatically start publisher when loading the "
255 parser.addOption(publish_option);
257 QCommandLineOption folder_option(QStringList() <<
"plugin_folders",
258 "Add semicolon-separated list of folders where you "
260 "for additional plugins.",
262 parser.addOption(folder_option);
264 QCommandLineOption buffersize_option(QStringList() <<
"buffer_size",
265 QCoreApplication::translate(
"main",
"Change the "
273 QCoreApplication::translate(
"main",
"seconds"));
275 parser.addOption(buffersize_option);
277 QCommandLineOption nogl_option(QStringList() <<
"disable_opengl",
"Disable OpenGL "
286 parser.addOption(nogl_option);
288 QCommandLineOption enabled_plugins_option(QStringList() <<
"enabled_plugins",
289 "Limit the loaded plugins to ones in the "
290 "semicolon-separated list",
292 parser.addOption(enabled_plugins_option);
294 QCommandLineOption disabled_plugins_option(QStringList() <<
"disabled_plugins",
295 "Do not load any of the plugins in the "
296 "semicolon separated list",
298 parser.addOption(disabled_plugins_option);
300 QCommandLineOption skin_path_option(QStringList() <<
"skin_path",
301 "New \"skin\". Refer to the sample in "
302 "[plotjuggler_app/resources/skin]",
304 parser.addOption(skin_path_option);
306 QCommandLineOption start_streamer(QStringList() <<
"start_streamer",
307 "Automatically start a Streaming Plugin with the "
309 "file_name (no extension)");
310 parser.addOption(start_streamer);
312 QCommandLineOption window_title(QStringList() <<
"window_title",
"Set the window title",
314 parser.addOption(window_title);
318 if (
parser.isSet(publish_option) && !
parser.isSet(layout_option))
320 std::cerr <<
"Option [ -p / --publish ] is invalid unless [ -l / --layout ] is used "
326 if (
parser.isSet(enabled_plugins_option) &&
parser.isSet(disabled_plugins_option))
328 std::cerr <<
"Option [ --enabled_plugins ] and [ --disabled_plugins ] can't be used "
334 if (
parser.isSet(nogl_option))
336 settings.setValue(
"Preferences::use_opengl",
false);
339 if (
parser.isSet(skin_path_option))
341 QDir path(
parser.value(skin_path_option));
344 qDebug() <<
"Skin path [" <<
parser.value(skin_path_option) <<
"] not found";
349 QIcon app_icon(
"://resources/plotjuggler.svg");
350 QApplication::setWindowIcon(app_icon);
352 QNetworkAccessManager manager_new_release;
353 QObject::connect(&manager_new_release, &QNetworkAccessManager::finished,
356 QNetworkRequest request_new_release;
357 request_new_release.setUrl(QUrl(
"https://api.github.com/repos/facontidavide/"
358 "PlotJuggler/releases/latest"));
359 manager_new_release.get(request_new_release);
375 if (!
parser.isSet(nosplash_option) &&
376 !(
parser.isSet(loadfile_option) ||
parser.isSet(layout_option)))
381 if (
parser.isSet(skin_path_option))
383 QDir path(
parser.value(skin_path_option));
384 QFile splash = path.filePath(
"pj_splashscreen.png");
387 main_pixmap = QPixmap(splash.fileName());
391 if (main_pixmap.isNull())
396 QSplashScreen splash(main_pixmap, Qt::WindowStaysOnTopHint);
397 QDesktopWidget* desktop = QApplication::desktop();
398 const int scrn = desktop->screenNumber();
399 const QPoint currentDesktopsCenter = desktop->availableGeometry(scrn).center();
400 splash.move(currentDesktopsCenter - splash.rect().center());
405 auto deadline = QDateTime::currentDateTime().addMSecs(500);
406 while (QDateTime::currentDateTime() < deadline)
413 deadline = QDateTime::currentDateTime().addMSecs(3000);
414 while (QDateTime::currentDateTime() < deadline && !splash.isHidden())
427 if (
parser.isSet(start_streamer))
432 QNetworkAccessManager manager_message;
433 QObject::connect(&manager_message, &QNetworkAccessManager::finished,
434 [window](QNetworkReply* reply) {
439 QString answer = reply->readAll();
440 QJsonDocument document = QJsonDocument::fromJson(answer.toUtf8());
441 QJsonObject
data = document.object();
442 QString message =
data[
"message"].toString();
446 QNetworkRequest request_message;
447 request_message.setUrl(QUrl(
"https://fastapi-example-7kz3.onrender.com"));
448 manager_message.get(request_message);