From b0d347ef79119b7c3dd789f49c31d8bf3c9a3d03 Mon Sep 17 00:00:00 2001 From: "PANIK\\chris" Date: Tue, 16 Dec 2025 18:33:44 +0100 Subject: [PATCH] Added BCValue creation, part I. --- bc.h | 13 ++++ bcvaluemanager.cpp | 155 +++++++++++++++++++++++++++++++++++++-------- bcvaluemanager.h | 18 ++++-- data/bikeinfo.xml | 16 ++--- main.cpp | 5 +- 5 files changed, 169 insertions(+), 38 deletions(-) diff --git a/bc.h b/bc.h index 13f0398..41eb7aa 100644 --- a/bc.h +++ b/bc.h @@ -66,6 +66,19 @@ template constexpr auto to_u(E e) noexcept { return static_cast>(e); } + +// constants.h +#pragma once +#include + +namespace Consts { + using namespace Qt::Literals::StringLiterals; +// 1. Compile-Time Konstante (constexpr) +// 2. Kein Heap-Speicher (Zero Allocation) +// 3. Minimale Binary-Größe (1 Byte char) <- 8 Bit! +// Beste Performance, keine Allokation, Typ-Sicher +inline constexpr auto OrgName = "source::worx"_L1; +} */ struct BC diff --git a/bcvaluemanager.cpp b/bcvaluemanager.cpp index a858857..69c0c48 100644 --- a/bcvaluemanager.cpp +++ b/bcvaluemanager.cpp @@ -28,8 +28,7 @@ ***************************************************************************/ -#include -#include + #include #include @@ -42,43 +41,149 @@ #include #include + +using namespace Qt::StringLiterals; + + BCValueManager::BCValueManager() -{} +{ + +} + +BCValueManager::~BCValueManager() +{ + // nothing to do here for now, + // our models are autokilled. +} + void BCValueManager::loadXml() { + auto printAttrs = [](const QXmlStreamReader& xml) + { + QStringList parts; + for (const auto &attr : xml.attributes()) { + parts << attr.name().toString() + "=\"" + attr.value().toString() + "\""; + } + qDebug().noquote() << parts.join(" "); + }; /* QString fileName = QFileDialog::getOpenFileName(this, "XML öffnen", "", "XML Files (*.xml)"); - if (fileName.isEmpty()) return; + if (fileName.isEmpty()) + return; + */ - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QMessageBox::warning(this, "Fehler", "Datei konnte nicht geöffnet werden."); - return; - } + QFile file(":/bikeinfo.xml"); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + // __fix throw + QMessageBox::warning(nullptr, "Fehler", "Datei konnte nicht geöffnet werden."); + return; + } - QList parsedDevices; - QXmlStreamReader xml(&file); + _xml.setDevice(&file); - while (!xml.atEnd() && !xml.hasError()) { - QXmlStreamReader::TokenType token = xml.readNext(); - if (token == QXmlStreamReader::StartElement && xml.name() == u"device") { - Device d; - d.name = xml.attributes().value(u"name").toString(); - d.ip = xml.attributes().value(u"ip").toString(); - parsedDevices.append(d); - } - } + if (_xml.readNextStartElement()) + { + if (_xml.name() != "Bike"_L1 ) + // fix throw + _xml.raiseError(QObject::tr("The file is not an 'Bike' file.")); + } + // ?? + Q_ASSERT(_xml.isStartElement() && _xml.name() == "Bike"_L1); - if (xml.hasError()) + + while (!_xml.atEnd() && !_xml.hasError()) + { + QXmlStreamReader::TokenType token = _xml.readNext(); + if (token == QXmlStreamReader::StartElement) { - QMessageBox::critical(this, "Parsing Fehler", xml.errorString()); - } else { - m_model->setDevices(parsedDevices); + qDebug() << " --- Device: " << _xml.name() << ": " << _xml.attributes().value("Type"_L1); + printAttrs (_xml); + const char* deviceKey = _xml.attributes().value("Type"_L1).toLatin1().constData(); + auto deviceID = _bcDeviceEnum.keyToValue64(deviceKey); + //_currentDeviceID = BCDevice::ID( deviceID.value_or( BCDevice::ID::Invalid ) ); + _currentDeviceID = deviceID.has_value() ? BCDevice::ID( deviceID.value() ) : BCDevice::ID::Invalid; + readDevice(); } -*/ + } + + /* + if (xml.hasError()) + { + QMessageBox::critical(nullptr, "Parsing Fehler", xml.errorString()); + } + else + { + m_model->setDevices(parsedValues); + } + */ + + // create & add new model to the model map + +} + +void BCValueManager::readDevice() +{ + auto printAttrs = [](const QXmlStreamReader& xml) + { + QStringList parts; + for (const auto &attr : xml.attributes()) { + parts << attr.name().toString() + "=\"" + attr.value().toString() + "\""; + } + qDebug().noquote() << parts.join(" "); + }; + + printAttrs (_xml); + Q_ASSERT(_xml.isStartElement() && _xml.name() == "Device"_L1); + qDebug() << " ---------------"; + + BCValueList parsedValues; + + //while (!_xml.atEnd() && !_xml.hasError()) + while( _xml.readNextStartElement() ) + { + const char* key = _xml.attributes().value("I##D"_L1).toLatin1().constData(); + qDebug() << " --- blub: " << _xml.name() << " : " << key << ":" <<_xml.attributes().value("ID"_L1); + if(key) + makeValue(parsedValues); + else + qDebug() << " --- fitz"; + + //printAttrs (_xml); + _xml.skipCurrentElement(); + /* + if (token == QXmlStreamReader::StartElement ) + { + qDebug() << " --- moo: " << _xml.name(); + //Q_ASSERT(_xml.name() == "Value"_L1); + //makeValue(); + //d.name = xml.attributes().value(u"name") + } + */ + } + + //qDebug()xml.attributes().value(u"name").toString(); + /* + Device d; + d.name = xml.attributes().value(u"name").toString(); + d.ip = xml.attributes().value(u"ip").toString(); + parsedValues.append(d); + */ + +} + +void BCValueManager::makeValue(BCValueList& parsedValues) +{ + // ID='Cons_Stat_Dist_Hi' Default='' Current='' Enabled='true' UnitType='mm' Factor='0.1' Min Max + const char* ID = _xml.attributes().value("firz"_L1).toLatin1().constData(); + auto enumVal = _bcValueEnum.keyToValue64( ID); + if( enumVal.has_value() ) + { + + } } // --- NEU: Speichern mit QXmlStreamWriter --- diff --git a/bcvaluemanager.h b/bcvaluemanager.h index 7e26698..bac0093 100644 --- a/bcvaluemanager.h +++ b/bcvaluemanager.h @@ -31,7 +31,12 @@ #ifndef BCVALUEMANAGER_H #define BCVALUEMANAGER_H -#include +#include +#include +#include +#include + +#include class BCValueManager : public QObject { @@ -41,16 +46,21 @@ public: BCValueManager(); - ~BCValueManager() = default; - - BCValue* makeValue(); + virtual ~BCValueManager(); void loadXml(); void saveXml(); protected: + void readDevice(); + void makeValue(BCValueList& parsedValues); + QXmlStreamReader _xml; + QMap _valueModels; + BCDevice::ID _currentDeviceID{BCDevice::ID::Invalid}; + QMetaEnum _bcDeviceEnum{QMetaEnum::fromType()}; + QMetaEnum _bcValueEnum{QMetaEnum::fromType()}; }; #endif // BCVALUEMANAGER_H diff --git a/data/bikeinfo.xml b/data/bikeinfo.xml index 4b4477d..fc955e2 100644 --- a/data/bikeinfo.xml +++ b/data/bikeinfo.xml @@ -1,7 +1,7 @@ - + @@ -125,12 +125,12 @@ + - - - - - - - + + + + + + diff --git a/main.cpp b/main.cpp index 6543469..2d01ec3 100644 --- a/main.cpp +++ b/main.cpp @@ -38,7 +38,7 @@ #include #include - +#include /* #include @@ -99,6 +99,9 @@ int main(int argc, char *argv[]) qDebug() << " schön: " << xxx << " -- " << uint8_t(xxx) << " : " << yyy; qDebug() << " nice: " << metaEnum.enumName() << " : " <className(); + BCValueManager myMgr; + myMgr.loadXml(); + return app.exec(); }