/*************************************************************************** BionxControl Copyright © 2025 christoph holzheuer christoph.holzheuer@gmail.com Using: BigXionFlasher USB V 0.2.4 rev. 97 © 2011-2013 by Thomas Koenig @see www.bigxionflasher.org Bionx Bike Info © 2018 Thorsten Schmidt (tschmidt@ts-soft.de) @see www.ts-soft.de mhs_can_drv.c 3.00 © 2011 - 2015 by MHS-Elektronik GmbH & Co. KG, Germany Demlehner Klaus, info@mhs-elektronik.de @see www.mhs-elektronik.de This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. @see https://github.com/bikemike/bionx-bikeinfo ***************************************************************************/ #include #include #include #include #include // main.cpp #include #include #include #include #include #include #include #include #include bool setApplicationStyleSheet( QAnyStringView path ) { QFile styleFile( path.toString() ); if (styleFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QString style = styleFile.readAll(); qApp->setStyleSheet(style); styleFile.close(); return true; } qWarning() << "Konnte Stylesheet nicht laden:" << styleFile.errorString(); return true; } struct moo { QString moo_str {"irgendwas"}; }; // Verschiedene Datentypen für die Sensoren struct Temperature : public moo{ float celsius; }; struct CpuLoad : public moo{ int percentage; }; struct Status : public moo{ std::string message; }; // Die Variant als universeller Datencontainer using SensorReading = std::variant; struct UIUpdateVisitor { QLabel* tempLabel; QProgressBar* cpuBar; QLabel* statusLabel; // Überladene operator() für jeden Typ in der Variant void operator()(const Temperature& t) const { tempLabel->setText(QString("Temp: %1°C").arg(t.celsius, 0, 'f', 1)); tempLabel->setStyleSheet(t.celsius > 40 ? "color: red;" : "color: black;"); } void operator()(const CpuLoad& c) const { cpuBar->setValue(c.percentage); qDebug() << c.moo_str; } void operator()(const Status& s) const { statusLabel->setText(QString::fromStdString(s.message)); } }; void onNewDataReceived(const SensorReading& data) { QLabel* labelTemp = nullptr; QProgressBar* progressCpu = nullptr; QLabel* labelStatus = nullptr; // Wir erstellen den Visitor mit Referenzen auf unsere UI-Elemente UIUpdateVisitor visitor { labelTemp, progressCpu, labelStatus }; // Die Magie: std::visit wählt zur Kompilierzeit die richtige Methode std::visit(visitor, data); } // 2. Datei öffnen und lesen int main(int argc, char *argv[]) { QApplication app(argc, argv); setApplicationStyleSheet( ":/bionxcontrol.qss"_L1 ); BCMainWindow w; w.show(); return app.exec(); }