From 08d6c593dab0a865b9ed0827eea4208ea42419f8 Mon Sep 17 00:00:00 2001 From: "PANIK\\chris" Date: Wed, 17 Dec 2025 13:11:26 +0100 Subject: [PATCH] Added stylesheet, demo docs etc. --- .gitignore | 1 + BionxControl.qrc | 1 + BionxControl.qss | 29 ++++ bc.h | 1 + bcmainwindow.ui | 43 +++++- bcvalue.cpp | 17 ++- bcvalue.h | 33 ++--- bcvaluemanager.cpp | 13 +- data/bikeinfo.xml | 264 ++++++++++++++++++--------------- doc/BF_BikeInformation.docx | Bin 0 -> 15519 bytes doc/BI_ConsoleInformation.docx | Bin 0 -> 16506 bytes doc/console_full.xml | 136 +++++++++++++++++ {data => doc}/demo.txt | 0 doc/dummy.c | 129 ++++++++++++++++ doc/~$_BikeInformation.docx | Bin 0 -> 162 bytes doc/~$_ConsoleInformation.docx | Bin 0 -> 162 bytes main.cpp | 23 ++- 17 files changed, 530 insertions(+), 160 deletions(-) create mode 100644 BionxControl.qss create mode 100644 doc/BF_BikeInformation.docx create mode 100644 doc/BI_ConsoleInformation.docx create mode 100644 doc/console_full.xml rename {data => doc}/demo.txt (100%) create mode 100644 doc/dummy.c create mode 100644 doc/~$_BikeInformation.docx create mode 100644 doc/~$_ConsoleInformation.docx diff --git a/.gitignore b/.gitignore index eb98eb9..1bb847c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ BionxControl.pro.user build/ bcvalue.cpp.autosave +.qtcreator/BionxControl.pro.user \ No newline at end of file diff --git a/BionxControl.qrc b/BionxControl.qrc index 202de4c..9e39b15 100644 --- a/BionxControl.qrc +++ b/BionxControl.qrc @@ -1,5 +1,6 @@ data/bikeinfo.xml + BionxControl.qss diff --git a/BionxControl.qss b/BionxControl.qss new file mode 100644 index 0000000..057c46b --- /dev/null +++ b/BionxControl.qss @@ -0,0 +1,29 @@ +/* app.qss */ + +/* Alle QWidgets bekommen diesen Font */ +QWidget { + font-size: 14px; + font-family: "Segoe UI", sans-serif; +} + +/* Spezifisches Styling für Buttons */ +QPushButton { + background-color: #0078d7; + color: white; + border-radius: 4px; + padding: 6px; +} + +QPushButton:hover { + background-color: #1084e3; +} + +QPushButton:pressed { + background-color: #005a9e; +} + +/* Styling anhand von Objektnamen (ID) */ +#loginButton { + font-weight: bold; + background-color: green; +} \ No newline at end of file diff --git a/bc.h b/bc.h index e886e9d..568422c 100644 --- a/bc.h +++ b/bc.h @@ -748,6 +748,7 @@ namespace BCTags { inline constexpr auto Device = "Device"_L1; inline constexpr auto ID = "ID"_L1; + inline constexpr auto Label = "Label"_L1; inline constexpr auto Default = "Default"_L1; inline constexpr auto Current = "Current"_L1; inline constexpr auto Enabled = "Enabled"_L1; diff --git a/bcmainwindow.ui b/bcmainwindow.ui index 7668116..c92f42e 100644 --- a/bcmainwindow.ui +++ b/bcmainwindow.ui @@ -27,8 +27,47 @@ QFrame::Shadow::Raised + + + + 30 + 50 + 171 + 51 + + + + PushButton + + + + + + 20 + 140 + 171 + 51 + + + + PushButton + + + + + + QFrame::Shape::NoFrame + + + QFrame::Shadow::Plain + + + false + + + Qt::PenStyle::CustomDashLine + - @@ -39,7 +78,7 @@ 0 0 800 - 22 + 18 diff --git a/bcvalue.cpp b/bcvalue.cpp index 21fd74e..1c7016b 100644 --- a/bcvalue.cpp +++ b/bcvalue.cpp @@ -48,7 +48,7 @@ uint8_t BCValue::getLongValue() } -BCValue* BCValue::makeValue( BCDevice::ID deviceID, const BCValueParams& params ) +BCValue BCValue::makeValue( BCDevice::ID deviceID, const BCValueParams& params ) { auto setIfExists = [&]( QStringView source, optDouble& target ) @@ -69,17 +69,18 @@ BCValue* BCValue::makeValue( BCDevice::ID deviceID, const BCValueParams& params - eine gültige ID */ - BCValue* newValue{}; + BCValue newValue{}; auto IDVal = s_bcValueEnum.keyToValue64( params.ID.toLatin1().constData() ); if( IDVal.has_value() ) { - newValue = new BCValue( deviceID, BC::ID( IDVal.value() ) ); - setIfExists( params.Factor, newValue->factor ); - setIfExists( params.Min, newValue->min ); - setIfExists( params.Max, newValue->max ); - newValue->defaultValue.setValue( params.Default ); - newValue->value.setValue( params.Current ); + newValue = BCValue( deviceID, BC::ID( IDVal.value() ) ); + setIfExists( params.Factor, newValue.factor ); + setIfExists( params.Min, newValue.min ); + setIfExists( params.Max, newValue.max ); + newValue.defaultValue.setValue( params.Label ); + newValue.value.setValue( params.Current ); + newValue.label = params.Label; } return newValue; diff --git a/bcvalue.h b/bcvalue.h index 1c6bd6d..6b59d18 100644 --- a/bcvalue.h +++ b/bcvalue.h @@ -42,14 +42,15 @@ using optDouble = std::optional; struct BCValueParams { - QString ID; - QString Default; - QString Current; - QString Enabled; - QString UnitType; - QString Min; - QString Max; - QString Factor; + QString ID; + QString Label; + QString Default; + QString Current; + QString Enabled; + QString UnitType; + QString Min; + QString Max; + QString Factor; }; @@ -81,10 +82,11 @@ public: optDouble min; optDouble max; optDouble factor; + QVariant defaultValue; QVariant value; - static BCValue* makeValue( BCDevice::ID deviceID, const BCValueParams& params ); + static BCValue makeValue(BCDevice::ID deviceID, const BCValueParams& params ); }; @@ -104,18 +106,7 @@ constexpr auto to_u(E e) noexcept { } */ -class BCValueShort -{ - -}; - - -class BCValueLong -{ - -}; - -using BCValueList = QList; +using BCValueList = QList; #endif // BCRawValue_H diff --git a/bcvaluemanager.cpp b/bcvaluemanager.cpp index 87caf07..0eecb0c 100644 --- a/bcvaluemanager.cpp +++ b/bcvaluemanager.cpp @@ -163,9 +163,11 @@ void BCValueManager::readDevice( BCValueList& parsedValues ) { //qDebug() << " --- found: " << _xml.name() << " : " << _xml.attributes().value(BCTags::ID); + QString id = _xml.attributes().value(BCTags::ID).toString(); BCValueParams params { - .ID = _xml.attributes().value(BCTags::ID).toString(), + .ID = id, + .Label = _xml.attributes().value(BCTags::Label).toString(), .Default = _xml.attributes().value(BCTags::Default).toString(), .Current = _xml.attributes().value(BCTags::Current).toString(), .Enabled = _xml.attributes().value(BCTags::Enabled).toString(), @@ -175,10 +177,11 @@ void BCValueManager::readDevice( BCValueList& parsedValues ) .Factor = _xml.attributes().value(BCTags::Factor).toString() }; - BCValue* newValue = BCValue::makeValue( _currentDeviceID, params ); - if(newValue) - parsedValues.push_back( BCValue::makeValue( _currentDeviceID, params ) ); - + // __fix! können ungültige werte erzeugt werden ? + //BCValue newValue = BCValue::makeValue( _currentDeviceID, params ); + //if(newValue) + // parsedValues.push_back( newValue ); + parsedValues.push_back( BCValue::makeValue( _currentDeviceID, params ) ); } //printAttrs (_xml); diff --git a/data/bikeinfo.xml b/data/bikeinfo.xml index fc955e2..51e9202 100644 --- a/data/bikeinfo.xml +++ b/data/bikeinfo.xml @@ -1,136 +1,156 @@ - - - - - - - - - - + - - - - - - - - - - - - - + + + + - - - - + + + + + - - - - - + + - + + - - + + - - - + + - - - - - + - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/doc/BF_BikeInformation.docx b/doc/BF_BikeInformation.docx new file mode 100644 index 0000000000000000000000000000000000000000..1f6a6a1dd7f1a3eb5c20a2e2e73e22928f709efe GIT binary patch literal 15519 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≻nIxXhcFH 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 J$MeVC{{yNh0q6h# literal 0 HcmV?d00001 diff --git a/doc/console_full.xml b/doc/console_full.xml new file mode 100644 index 0000000..fc955e2 --- /dev/null +++ b/doc/console_full.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/demo.txt b/doc/demo.txt similarity index 100% rename from data/demo.txt rename to doc/demo.txt diff --git a/doc/dummy.c b/doc/dummy.c new file mode 100644 index 0000000..5746a77 --- /dev/null +++ b/doc/dummy.c @@ -0,0 +1,129 @@ + + hwVersion = getValue(CONSOLE, CONSOLE_REF_HW); + + + " assistance level ........: %d" + getValue(CONSOLE, CONSOLE_ASSIST_INITLEVEL) + + printf( " part number .............: %05d" ((getValue(CONSOLE, CONSOLE_SN_PN_HI) << 8) + getValue(CONSOLE, CONSOLE_SN_PN_LO)), + " item number .............: %05d" ((getValue(CONSOLE, CONSOLE_SN_ITEM_HI) << 8) + getValue(CONSOLE, CONSOLE_SN_ITEM_LO)) + + + /* ASSIST speed limit */ + max limit enabled sl = getValue(CONSOLE, CONSOLE_ASSIST_MAXSPEEDFLAG) == 0 ? "no" : "yes"; + speed limit speedLimit = ((getValue(CONSOLE, CONSOLE_ASSIST_MAXSPEED_HI) << 8) + getValue(CONSOLE, CONSOLE_ASSIST_MAXSPEED_LO)) / (double)10; + + /* MIN speed limit */ + sl = getValue(CONSOLE, CONSOLE_ASSIST_MINSPEEDFLAG) == 0 ? "no" : "yes"; + speedLimit = (getValue(CONSOLE, CONSOLE_ASSIST_MINSPEED)) / (double)10; + + + /* THROTTLE speed limit */ + " throttle limit enabled ..: %sl = getValue(CONSOLE, CONSOLE_THROTTLE_MAXSPEEDFLAG) == 0 ? "no" : "yes"; + " throttle limit enabled ..: %s" = ((getValue(CONSOLE, CONSOLE_THROTTLE_MAXSPEED_HI) << 8) + getValue(CONSOLE, CONSOLE_THROTTLE_MAXSPEED_LO)) / (double)10; + printf( " throttle limit enabled ..: %s" _NL + " throttle speed limit ....: %0.2f Km/h" _NL _NL, sl, speedLimit); + + /* WHEEL CIRCUMFERENCE */ + wheel circumference .....: %d mm" = (getValue(CONSOLE, CONSOLE_GEOMETRY_CIRC_HI) << 8) + getValue(CONSOLE, CONSOLE_GEOMETRY_CIRC_LO); + + " mountain cap ............: %0.2f%%" _NL, + (getValue(CONSOLE, CONSOLE_ASSIST_MOUNTAINCAP) * 1.5625)); + + printf( " odo .....................: %0.2f Km" _NL _NL, + ((getValue(CONSOLE, CONSOLE_STATS_ODO_1) << 24) + + (getValue(CONSOLE, CONSOLE_STATS_ODO_2) << 16) + + (getValue(CONSOLE, CONSOLE_STATS_ODO_3) << 8) + + (getValue(CONSOLE, CONSOLE_STATS_ODO_4))) / (double)10 + ); + } + + + hwVersion = getValue(BATTERY, BATTERY_REF_HW); + if (hwVersion == 0) + printf("Battery not responding" _NL _NL); + else { + printf( "Battery information:" _NL + " hardware version ........: %02d" _NL + " software version ........: %02d" _NL, + hwVersion, getValue(BATTERY, BATTERY_REF_SW) + ); + + if (!gNoSerialNumbers) + printf( " part number .............: %05d" _NL + " item number .............: %05d" _NL, + ((getValue(BATTERY, BATTERY_SN_PN_HI) << 8) + getValue(BATTERY, BATTERY_SN_PN_LO)), + ((getValue(BATTERY, BATTERY_SN_ITEM_HI) << 8) + getValue(BATTERY, BATTERY_SN_ITEM_LO)) + ); + + printf( " voltage .................: %0.2fV" _NL + " battery level ...........: %0.2f%%" _NL + " maximum voltage .........: %0.2f%%" _NL + " minimum voltage .........: %0.2f%%" _NL + " mean voltage ............: %0.2f%%" _NL + " resets ..................: %0d" _NL + " ggjrCalib ...............: %0d" _NL + " vctrlShorts .............: %0d" _NL + " lmd .....................: %0.2fAh" _NL + " cell capacity ...........: %0.2fAh" _NL _NL, + ((getValue(BATTERY, BATTERY_STATUS_VBATT_HI) << 8) + getValue(BATTERY, BATTERY_STATUS_VBATT_LO)) * 0.001, + (getValue(BATTERY, BATTERY_STATUS_LEVEL) * 6.6667), + getVoltageValue(BATTERY, BATTERY_STATS_VBATTMAX), + getVoltageValue(BATTERY, BATTERY_STATS_VBATTMIN), + getVoltageValue(BATTERY, BATTERY_STATS_VBATTMEAN), + (getValue(BATTERY, BATTERY_STATS_RESET_HI) << 8) + getValue(BATTERY, BATTERY_STATS_RESET_LO), + getValue(BATTERY, BATTERY_STSTS_GGJSRCALIB), + getValue(BATTERY, BATTERY_STSTS_VCTRLSHORTS), + ((getValue(BATTERY, BATTERY_STATS_LMD_HI) << 8) + getValue(BATTERY, BATTERY_STATS_LMD_LO)) * 0.002142, + ((getValue(BATTERY, BATTERY_CONFIG_CELLCAPACITY_HI) << 8) + getValue(BATTERY, BATTERY_CONFIG_CELLCAPACITY_LO)) * 0.001 + ); + + printf( " charge time worst .......: %0d" _NL + " charge time mean ........: %0d" _NL + " charge cycles ...........: %0d" _NL + " full charge cycles ......: %0d" _NL + " power cycles ............: %0d" _NL + " battery temp max ........: %0d" _NL + " battery temp min ........: %0d" _NL _NL, + (getValue(BATTERY, BATTERY_STATS_CHARGETIMEWORST_HI) << 8) + getValue(BATTERY, BATTERY_STATS_CHARGETIMEWORST_LO), + (getValue(BATTERY, BATTERY_STATS_CHARGETIMEMEAN_HI) << 8) + getValue(BATTERY, BATTERY_STATS_CHARGETIMEMEAN_LO), + (getValue(BATTERY, BATTERY_STATS_BATTCYCLES_HI) << 8) + getValue(BATTERY, BATTERY_STATS_BATTCYCLES_LO), + (getValue(BATTERY, BATTERY_STATS_BATTFULLCYCLES_HI) << 8) + getValue(BATTERY, BATTERY_STATS_BATTFULLCYCLES_LO), + (getValue(BATTERY, BATTERY_STATS_POWERCYCLES_HI) << 8) + getValue(BATTERY, BATTERY_STATS_POWERCYCLES_HI), + getValue(BATTERY, BATTERY_STATS_TBATTMAX), + getValue(BATTERY, BATTERY_STATS_TBATTMIN) + ); + + printChargeStats(); + + if (hwVersion >= 60) + printBatteryStats(); + else + printf(" no battery details supported by battery hardware #%d" _NL _NL, hwVersion); + } + + hwVersion = getValue(MOTOR, MOTOR_REF_HW); + if (hwVersion == 0) + printf("Motor not responding" _NL _NL); + else { + printf( "Motor information:" _NL + " hardware version ........: %02d" _NL + " software version ........: %02d" _NL + " temperature .............: %02d" _DEGREE_SIGN "C"_NL + " speed limit .............: %02d Km/h" _NL, + hwVersion, getValue(MOTOR, MOTOR_REF_SW), + getValue(MOTOR, MOTOR_REALTIME_TEMP), + getValue(MOTOR, MOTOR_ASSIST_MAXSPEED) + ); + + wheelCirc = (getValue(MOTOR, MOTOR_GEOMETRY_CIRC_HI) << 8) + getValue(MOTOR, MOTOR_GEOMETRY_CIRC_LO); + printf( " wheel circumference .....: %d mm" _NL _NL, wheelCirc); + + if (!gNoSerialNumbers) + printf( " part number .............: %05d" _NL + " item number .............: %05d" _NL _NL, + ((getValue(MOTOR, MOTOR_SN_PN_HI) << 8) + getValue(MOTOR, MOTOR_SN_PN_LO)), + ((getValue(MOTOR, MOTOR_SN_ITEM_HI) << 8) + getValue(MOTOR, MOTOR_SN_ITEM_LO)) + ); + } +} \ No newline at end of file diff --git a/doc/~$_BikeInformation.docx b/doc/~$_BikeInformation.docx new file mode 100644 index 0000000000000000000000000000000000000000..b47c9230646c558a13b525ed30c335800c907279 GIT binary patch literal 162 zcmZQg&M3+(W*`x;G9)u(FcdLlGC;KYzGY-kc<{jB%CQJV=DT_Y4(11SHQw~;DIAYb zoOwsDfDLFqObkRX6%_J)ai>y61t>q|i*5m1sD)g>-3UeA&$?i}B0%*|1%!NUfHVM) C4kTRw literal 0 HcmV?d00001 diff --git a/doc/~$_ConsoleInformation.docx b/doc/~$_ConsoleInformation.docx new file mode 100644 index 0000000000000000000000000000000000000000..0c52200dd75be6653205f843fe3ec68750af4828 GIT binary patch literal 162 zcmZQg&M3+(W*`x;G9)u(FcdLlGC;KYzGY-!m=~pT7tjDzvw-;>;cc5up5(FS-S6p%!uucfQN=e%1x+6#=ThD!8{$0Z0P? DotP#n literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp index 712c507..ad07c10 100644 --- a/main.cpp +++ b/main.cpp @@ -30,6 +30,7 @@ #include #include +#include // main.cpp #include @@ -65,6 +66,22 @@ if (ok) { #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; +} + +// 2. Datei öffnen und lesen int main(int argc, char *argv[]) { auto x = BC::ID::Motor_Status_Main; @@ -80,8 +97,7 @@ int main(int argc, char *argv[]) QApplication app(argc, argv); - BCMainWindow w; - w.show(); + setApplicationStyleSheet( ":/BionxControl.qss"_L1 ); QMetaEnum metaEnum = QMetaEnum::fromType(); @@ -103,6 +119,9 @@ int main(int argc, char *argv[]) //myMgr.loadXml(); + BCMainWindow w; + w.show(); + return app.exec(); }