Added ValueModel, first run.

This commit is contained in:
2025-12-16 22:42:35 +01:00
parent afb5828a65
commit 4c5e42fcfd
8 changed files with 110 additions and 76 deletions

1
bc.h
View File

@@ -750,6 +750,7 @@ namespace BCTags
inline constexpr auto ID = "ID"_L1; inline constexpr auto ID = "ID"_L1;
inline constexpr auto Default = "Default"_L1; inline constexpr auto Default = "Default"_L1;
inline constexpr auto Current = "Current"_L1; inline constexpr auto Current = "Current"_L1;
inline constexpr auto Enabled = "Enabled"_L1;
inline constexpr auto UnitType = "UnitType"_L1; inline constexpr auto UnitType = "UnitType"_L1;
inline constexpr auto Min = "Min"_L1; inline constexpr auto Min = "Min"_L1;
inline constexpr auto Max = "Max"_L1; inline constexpr auto Max = "Max"_L1;

View File

@@ -32,12 +32,16 @@
BCMainWindow::BCMainWindow(QWidget *parent) BCMainWindow::BCMainWindow(QWidget *parent)
: QMainWindow(parent) : QMainWindow(parent)
, ui(new Ui::BCMainWindow)
{ {
ui->setupUi(this); setupUi(this);
_valueManager.loadXml();
auto model = _valueManager.getModel( "Console"_L1 );
if( model)
_valueView->setModel( *model );
} }
BCMainWindow::~BCMainWindow() BCMainWindow::~BCMainWindow()
{ {
delete ui;
} }

View File

@@ -32,15 +32,13 @@
#include <QMainWindow> #include <QMainWindow>
QT_BEGIN_NAMESPACE #include <ui_bcmainwindow.h>
namespace Ui #include <bcvaluemanager.h>
{
class BCMainWindow;
}
QT_END_NAMESPACE
class BCMainWindow : public QMainWindow
class BCMainWindow : public QMainWindow, public Ui_BCMainWindow
{ {
Q_OBJECT Q_OBJECT
@@ -49,9 +47,13 @@ public:
BCMainWindow(QWidget *parent = nullptr); BCMainWindow(QWidget *parent = nullptr);
~BCMainWindow(); ~BCMainWindow();
private: public slots:
protected:
BCValueManager _valueManager;
Ui::BCMainWindow *ui;
}; };
#endif // BCMAINWINDOW_H #endif // BCMAINWINDOW_H

View File

@@ -27,6 +27,7 @@
***************************************************************************/ ***************************************************************************/
#include <QMetaEnum>
#include <bcvalue.h> #include <bcvalue.h>
@@ -47,10 +48,39 @@ uint8_t BCValue::getLongValue()
} }
BCValue* BCValue::makeValue(BCDevice::ID deviceI, const BCValueParams& params ) BCValue* BCValue::makeValue( BCDevice::ID deviceID, const BCValueParams& params )
{ {
auto setIfExists = [&]( QStringView source, optDouble& target )
{
if( !source.isEmpty() )
{
bool ok;
double testVal = source.toDouble(&ok);
if (ok)
target = testVal;
}
};
static QMetaEnum s_bcValueEnum{QMetaEnum::fromType<BC::ID>()};
return nullptr; /*
Wir brauchen:
- eine gültige ID
*/
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 );
}
return newValue;
} }

View File

@@ -34,15 +34,15 @@
#include <QString> #include <QString>
#include <QList> #include <QList>
#include <QVariant>
#include <bc.h> #include <bc.h>
using optDouble = std::optional<double>;
struct BCValueParams struct BCValueParams
{ {
BCDevice::ID DeviceID{BCDevice::ID::Invalid}; QString ID;
BC::ID ID{BC::ID::Invalid};
QString IDString;
QString Default; QString Default;
QString Current; QString Current;
QString Enabled; QString Enabled;
@@ -74,12 +74,17 @@ public:
uint8_t getLongValue(); uint8_t getLongValue();
QString label; QString label;
BCDevice::ID deviceID{BCDevice::ID::Invalid}; BCDevice::ID deviceID{BCDevice::ID::Invalid};
BC::ID targetID{BC::ID::Invalid}; BC::ID targetID{BC::ID::Invalid};
double value{-1}; optDouble min;
optDouble max;
optDouble factor;
QVariant defaultValue;
QVariant value;
static BCValue* makeValue( const BCValueParams& params ); static BCValue* makeValue( BCDevice::ID deviceID, const BCValueParams& params );
}; };

View File

@@ -50,15 +50,19 @@ BCValueManager::BCValueManager()
} }
BCValueManager::~BCValueManager() BCValueManager::~BCValueManager()
{ {
// nothing to do here for now, // nothing to do here for now,
// our models are autokilled. // our models are autokilled.
} }
std::optional<BCValueModel*> BCValueManager::getModel(const QString& key )
{
if( _valueModels.contains( key) )
return _valueModels[key];
return std::nullopt;
}
void BCValueManager::loadXml() void BCValueManager::loadXml()
{ {
auto printAttrs = [](const QXmlStreamReader& xml) auto printAttrs = [](const QXmlStreamReader& xml)
@@ -94,19 +98,30 @@ void BCValueManager::loadXml()
// ?? // ??
Q_ASSERT(_xml.isStartElement() && _xml.name() == "Bike"_L1); Q_ASSERT(_xml.isStartElement() && _xml.name() == "Bike"_L1);
while (!_xml.atEnd() && !_xml.hasError()) while (!_xml.atEnd() && !_xml.hasError())
{ {
QXmlStreamReader::TokenType token = _xml.readNext(); QXmlStreamReader::TokenType token = _xml.readNext();
if (token == QXmlStreamReader::StartElement) if (token == QXmlStreamReader::StartElement)
{ {
qDebug() << " --- Device: " << _xml.name() << ": " << _xml.attributes().value("Type"_L1); QString deviceType = _xml.attributes().value("Type"_L1).toString();
qDebug() << " --- Device: " << _xml.name() << ": " << deviceType;
printAttrs (_xml); printAttrs (_xml);
const char* deviceKey = _xml.attributes().value("Type"_L1).toLatin1().constData(); const char* deviceKey = _xml.attributes().value("Type"_L1).toLatin1().constData();
auto deviceID = _bcDeviceEnum.keyToValue64(deviceKey); auto deviceID = _bcDeviceEnum.keyToValue64(deviceKey);
//_currentDeviceID = BCDevice::ID( deviceID.value_or( BCDevice::ID::Invalid ) ); //_currentDeviceID = BCDevice::ID( deviceID.value_or( BCDevice::ID::Invalid ) );
_currentDeviceID = deviceID.has_value() ? BCDevice::ID( deviceID.value() ) : BCDevice::ID::Invalid; _currentDeviceID = deviceID.has_value() ? BCDevice::ID( deviceID.value() ) : BCDevice::ID::Invalid;
readDevice(); if(deviceID.has_value())
{
BCValueList parsedValues;
readDevice( parsedValues );
if( parsedValues.count() )
{
BCValueModel* valueModel = new BCValueModel( this );
valueModel->setValueList(parsedValues);
_valueModels.insert( deviceType, valueModel );
}
}
} }
} }
@@ -125,7 +140,7 @@ void BCValueManager::loadXml()
} }
void BCValueManager::readDevice() void BCValueManager::readDevice( BCValueList& parsedValues )
{ {
auto printAttrs = [](const QXmlStreamReader& xml) auto printAttrs = [](const QXmlStreamReader& xml)
{ {
@@ -140,62 +155,38 @@ void BCValueManager::readDevice()
Q_ASSERT(_xml.isStartElement() && _xml.name() == "Device"_L1); Q_ASSERT(_xml.isStartElement() && _xml.name() == "Device"_L1);
qDebug() << " ---------------"; qDebug() << " ---------------";
BCValueList parsedValues;
//while (!_xml.atEnd() && !_xml.hasError()) //while (!_xml.atEnd() && !_xml.hasError())
while( _xml.readNextStartElement() ) while( _xml.readNextStartElement() )
{ {
if( _xml.attributes().hasAttribute(BCTags::ID) ) if( _xml.attributes().hasAttribute(BCTags::ID) )
{ {
makeValue(parsedValues); //qDebug() << " --- found: " << _xml.name() << " : " << _xml.attributes().value(BCTags::ID);
}
//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)
{
const char* IDKey = _xml.attributes().value(BCTags::ID).toLatin1().constData();
qDebug() << " --- found: " << _xml.name() << " : " << IDKey;
auto IDVal = _bcValueEnum.keyToValue64( IDKey );
if( IDVal.has_value() )
{
BCValueParams params BCValueParams params
{ {
.DeviceID = _currentDeviceID, .ID = _xml.attributes().value(BCTags::ID).toString(),
.ID = BC::ID( IDVal.value() ),
.Default = _xml.attributes().value(BCTags::Default).toString(), .Default = _xml.attributes().value(BCTags::Default).toString(),
.Current = _xml.attributes().value(BCTags::Current).toString(), .Current = _xml.attributes().value(BCTags::Current).toString(),
.Enabled = _xml.attributes().value(BCTags::Enabled).toString(),
.UnitType = _xml.attributes().value(BCTags::UnitType).toString(), .UnitType = _xml.attributes().value(BCTags::UnitType).toString(),
.Min = _xml.attributes().value(BCTags::Min).toString(), .Min = _xml.attributes().value(BCTags::Min).toString(),
.Max = _xml.attributes().value(BCTags::Max).toString(), .Max = _xml.attributes().value(BCTags::Max).toString(),
.Factor = _xml.attributes().value(BCTags::Factor).toString() .Factor = _xml.attributes().value(BCTags::Factor).toString()
}; };
parsedValues.push_back( BCValue::makeValue( params ) );
BCValue* newValue = BCValue::makeValue( _currentDeviceID, params );
if(newValue)
parsedValues.push_back( BCValue::makeValue( _currentDeviceID, params ) );
}
//printAttrs (_xml);
_xml.skipCurrentElement();
} }
} }
// --- NEU: Speichern mit QXmlStreamWriter --- // --- NEU: Speichern mit QXmlStreamWriter ---
void BCValueManager::saveXml() void BCValueManager::saveXml()
{ {

View File

@@ -44,23 +44,23 @@ class BCValueManager : public QObject
public: public:
BCValueManager(); BCValueManager();
virtual ~BCValueManager(); virtual ~BCValueManager();
void loadXml(); void loadXml();
void saveXml(); void saveXml();
std::optional<BCValueModel*> getModel(const QString& key );
protected: protected:
void readDevice(); void readDevice( BCValueList& parsedValues );
void makeValue(BCValueList& parsedValues);
QXmlStreamReader _xml; QXmlStreamReader _xml;
QMap<QString,BCValueModel*> _valueModels; QMap<QString,BCValueModel*> _valueModels;
BCDevice::ID _currentDeviceID{BCDevice::ID::Invalid}; BCDevice::ID _currentDeviceID{BCDevice::ID::Invalid};
QMetaEnum _bcDeviceEnum{QMetaEnum::fromType<BCDevice::ID>()}; QMetaEnum _bcDeviceEnum{QMetaEnum::fromType<BCDevice::ID>()};
QMetaEnum _bcValueEnum{QMetaEnum::fromType<BC::ID>()};
}; };
#endif // BCVALUEMANAGER_H #endif // BCVALUEMANAGER_H

View File

@@ -99,9 +99,10 @@ int main(int argc, char *argv[])
qDebug() << " schön: " << xxx << " -- " << uint8_t(xxx) << " : " << yyy; qDebug() << " schön: " << xxx << " -- " << uint8_t(xxx) << " : " << yyy;
qDebug() << " nice: " << metaEnum.enumName() << " : " <<metaEnum.name() << ": " << metaEnum.enclosingMetaObject()->className(); qDebug() << " nice: " << metaEnum.enumName() << " : " <<metaEnum.name() << ": " << metaEnum.enclosingMetaObject()->className();
BCValueManager myMgr; //BCValueManager myMgr;
//myMgr.loadXml(); //myMgr.loadXml();
return app.exec(); return app.exec();
} }