qtrocket/QtRocket.cpp
Travis Hunter e6bf1fea9b
Some checks failed
CMake on multiple platforms / build (Release, cl, cl, windows-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, gcc-13, g++-13, ubuntu-latest) (push) Has been cancelled
Revert "Merge pull request #20 from cthunter01/propagator"
This reverts commit 6280d9fb0184275843a8f4406c7293e41e65a639, reversing
changes made to 3c9c8b8c6a2b2e7430ff09efdc2cc0c1996b16ca.
2025-04-16 18:23:28 -06:00

131 lines
3.0 KiB
C++

/// \cond
// C headers
// C++ headers
#include <thread>
// 3rd party headers
#include <QApplication>
#include <QLocale>
#include <QTranslator>
/// \endcond
// qtrocket headers
#include "QtRocket.h"
#include "utils/Logger.h"
#include "gui/MainWindow.h"
// Initialize static member data
QtRocket* QtRocket::instance = nullptr;
std::mutex QtRocket::mtx;
bool QtRocket::initialized = false;
// The gui worker thread
void guiWorker(int argc, char* argv[], int& ret)
{
utils::Logger* logger = utils::Logger::getInstance();
logger->info("Starting QApplication");
QApplication a(argc, argv);
a.setWindowIcon(QIcon(":/qtrocket.png"));
// Start translation component.
// TODO: Only support US English at the moment. Anyone want to help translate?
QTranslator translator;
const QStringList uiLanguages = QLocale::system().uiLanguages();
for (const QString &locale : uiLanguages)
{
const QString baseName = "qtrocket_" + QLocale(locale).name();
if (translator.load(":/i18n/" + baseName))
{
a.installTranslator(&translator);
break;
}
}
// Go!
MainWindow w(QtRocket::getInstance());
logger->debug("Showing MainWindow");
w.show();
ret = a.exec();
}
QtRocket* QtRocket::getInstance()
{
if(!initialized)
{
init();
}
return instance;
}
void QtRocket::init()
{
std::lock_guard<std::mutex> lck(mtx);
if(!initialized)
{
utils::Logger::getInstance()->debug("Instantiating new QtRocket");
instance = new QtRocket();
initialized = true;
}
}
QtRocket::QtRocket()
{
logger = utils::Logger::getInstance();
running = false;
// Need to set some sane defaults for the Environment
// The default constructor for Environment will do that for us, so just use that
setEnvironment(std::make_shared<sim::Environment>());
rocket.first =
std::make_shared<model::RocketModel>();
rocket.second =
std::make_shared<sim::Propagator>(rocket.first);
motorDatabase = std::make_shared<utils::MotorModelDatabase>();
logger->debug("Initial states vector size: " + std::to_string(states.capacity()) );
// Reserve at least 1024 spaces for StateData
if(states.capacity() < 1024)
{
states.reserve(1024);
}
logger->debug("New states vector size: " + std::to_string(states.capacity()) );
}
int QtRocket::run(int argc, char* argv[])
{
// Really should only start this thread once
if(!running)
{
running = true;
int ret = 0;
std::thread guiThread(guiWorker, argc, argv, std::ref(ret));
guiThread.join();
return ret;
}
return 0;
}
void QtRocket::launchRocket()
{
// initialize the propagator
rocket.first->clearStates();
rocket.second->setCurrentTime(0.0);
// start the rocket motor
rocket.first->launch();
// run the propagator until it terminates
rocket.second->runUntilTerminate();
}
void QtRocket::addMotorModels(std::vector<model::MotorModel>& m)
{
motorDatabase->addMotorModels(m);
// TODO: Now clear any duplicates?
}