9 #include <QApplication> 10 #include <QSplashScreen> 12 #include <QCommandLineParser> 13 #include <QDesktopWidget> 14 #include <QFontDatabase> 16 #include <QNetworkAccessManager> 17 #include <QNetworkReply> 18 #include <QJsonDocument> 34 #ifdef COMPILED_WITH_CATKIN 37 #ifdef COMPILED_WITH_AMENT 38 #include <rclcpp/rclcpp.hpp> 42 QString(
"%1.%2.%3").arg(PJ_MAJOR_VERSION).arg(PJ_MINOR_VERSION).arg(PJ_PATCH_VERSION);
46 QStringList online_version = str.split(
'.');
47 if (online_version.size() != 3)
51 int major = online_version[0].toInt();
52 int minor = online_version[1].toInt();
53 int patch = online_version[2].toInt();
54 return major * 10000 + minor * 100 + patch;
63 QString answer = reply->readAll();
64 QJsonDocument document = QJsonDocument::fromJson(answer.toUtf8());
65 QJsonObject
data = document.object();
66 QString url = data[
"html_url"].toString();
67 QString
name = data[
"name"].toString();
68 QString tag_name = data[
"tag_name"].toString();
72 settings.value(
"NewRelease/dontShowThisVersion",
VERSION_STRING).toString();
76 if (online_number > current_number && online_number > dontshow_number)
89 const int last_image_num = 89;
90 int n = rand() % (last_image_num + 2);
91 if (n > last_image_num)
97 std::set<int> previous_set;
98 std::list<int> previous_nums;
100 QStringList previous_list = settings.value(
"previousFunnyMemesList").toStringList();
101 for (
auto str : previous_list)
103 int num = str.toInt();
104 previous_set.insert(num);
105 previous_nums.push_back(num);
109 while (previous_set.count(n) != 0)
114 while (previous_nums.size() >= 10)
116 previous_nums.pop_front();
118 previous_nums.push_back(n);
120 QStringList new_list;
121 for (
int num : previous_nums)
123 new_list.push_back(QString::number(num));
126 settings.setValue(
"previousFunnyMemesList", new_list);
127 auto filename = QString(
"://resources/memes/meme_%1.jpg").arg(n, 2, 10, QChar(
'0'));
128 return QPixmap(filename);
133 #ifdef PJ_DEFAULT_ARGS 134 auto default_cmdline_args =
135 QString(PJ_DEFAULT_ARGS).split(
" ", QString::SkipEmptyParts);
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++)
189 new_argv.push_back(args[i].
data());
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>();
222 QCommandLineParser
parser;
223 parser.setApplicationDescription(
"PlotJuggler: the time series visualization tool that " 225 parser.addVersionOption();
226 parser.addHelpOption();
228 QCommandLineOption nosplash_option(QStringList() <<
"n" 230 "Don't display the splashscreen");
231 parser.addOption(nosplash_option);
233 QCommandLineOption test_option(QStringList() <<
"t" 235 "Generate test curves at startup");
236 parser.addOption(test_option);
238 QCommandLineOption loadfile_option(QStringList() <<
"d" 240 "Load a file containing data",
"file_path");
241 parser.addOption(loadfile_option);
243 QCommandLineOption layout_option(QStringList() <<
"l" 245 "Load a file containing the layout configuration",
247 parser.addOption(layout_option);
249 QCommandLineOption publish_option(QStringList() <<
"p" 251 "Automatically start publisher when loading the " 253 parser.addOption(publish_option);
255 QCommandLineOption folder_option(QStringList() <<
"plugin_folders",
256 "Add semicolon-separated list of folders where you " 258 "for additional plugins.",
260 parser.addOption(folder_option);
262 QCommandLineOption buffersize_option(QStringList() <<
"buffer_size",
263 QCoreApplication::translate(
"main",
"Change the " 271 QCoreApplication::translate(
"main",
"seconds"));
273 parser.addOption(buffersize_option);
275 QCommandLineOption nogl_option(QStringList() <<
"disable_opengl",
"Disable OpenGL " 284 parser.addOption(nogl_option);
286 QCommandLineOption enabled_plugins_option(QStringList() <<
"enabled_plugins",
287 "Limit the loaded plugins to ones in the " 288 "semicolon-separated list",
290 parser.addOption(enabled_plugins_option);
292 QCommandLineOption disabled_plugins_option(QStringList() <<
"disabled_plugins",
293 "Do not load any of the plugins in the " 294 "semicolon separated list",
296 parser.addOption(disabled_plugins_option);
298 QCommandLineOption skin_path_option(QStringList() <<
"skin_path",
299 "New \"skin\". Refer to the sample in " 300 "[plotjuggler_app/resources/skin]",
302 parser.addOption(skin_path_option);
304 QCommandLineOption start_streamer(QStringList() <<
"start_streamer",
305 "Automatically start a Streaming Plugin with the " 307 "file_name (no extension)");
308 parser.addOption(start_streamer);
310 QCommandLineOption window_title(QStringList() <<
"window_title",
311 "Set the window title",
313 parser.addOption(window_title);
315 parser.process(*qApp);
317 if (parser.isSet(publish_option) && !parser.isSet(layout_option))
319 std::cerr <<
"Option [ -p / --publish ] is invalid unless [ -l / --layout ] is used " 325 if (parser.isSet(enabled_plugins_option) && parser.isSet(disabled_plugins_option))
327 std::cerr <<
"Option [ --enabled_plugins ] and [ --disabled_plugins ] can't be used " 333 if (parser.isSet(nogl_option))
335 settings.setValue(
"Preferences::use_opengl",
false);
338 if (parser.isSet(skin_path_option))
340 QDir path(parser.value(skin_path_option));
343 qDebug() <<
"Skin path [" << parser.value(skin_path_option) <<
"] not found";
348 QIcon app_icon(
"://resources/plotjuggler.svg");
349 QApplication::setWindowIcon(app_icon);
351 QNetworkAccessManager manager;
354 QNetworkRequest request;
356 QString uuid = settings.value(
"UUID", QUuid::createUuid().toString()).toString();
357 settings.setValue(
"UUID", uuid);
359 request.setUrl(QUrl(QString(
"https://l4g9l4.deta.dev/check_updates/%1").
arg(uuid)));
360 manager.get(request);
377 if (!parser.isSet(nosplash_option) &&
378 !(parser.isSet(loadfile_option) || parser.isSet(layout_option)))
383 if (parser.isSet(skin_path_option))
385 QDir path(parser.value(skin_path_option));
386 QFile splash = path.filePath(
"pj_splashscreen.png");
389 main_pixmap = QPixmap(splash.fileName());
393 if (main_pixmap.isNull())
397 QSplashScreen splash(main_pixmap, Qt::WindowStaysOnTopHint);
398 QDesktopWidget* desktop = QApplication::desktop();
399 const int scrn = desktop->screenNumber();
400 const QPoint currentDesktopsCenter = desktop->availableGeometry(scrn).center();
401 splash.move(currentDesktopsCenter - splash.rect().center());
406 auto deadline = QDateTime::currentDateTime().addMSecs(500);
407 while (QDateTime::currentDateTime() < deadline)
414 deadline = QDateTime::currentDateTime().addMSecs(3000);
415 while (QDateTime::currentDateTime() < deadline && !splash.isHidden())
427 if (parser.isSet(start_streamer))
std::vector< std::string > MergeArguments(const std::vector< std::string > &args)
void on_buttonStreamingStart_clicked()
void OpenNewReleaseDialog(QNetworkReply *reply)
QPixmap getFunnySplashscreen()
auto arg(const Char *name, const T &arg) -> detail::named_arg< Char, T >
static QString VERSION_STRING
int GetVersionNumber(QString str)
ROSCPP_DECL void removeROSArgs(int argc, const char *const *argv, V_string &args_out)
int main(int argc, char *argv[])