232 lines
6.5 KiB
C++
232 lines
6.5 KiB
C++
/***************************************************************************
|
|
|
|
BionxControl
|
|
Copyright © 2025 christoph holzheuer
|
|
christoph.holzheuer@gmail.com
|
|
|
|
Using:
|
|
|
|
BigXionFlasher USB V 0.2.4 rev. 97
|
|
© 2011-2013 by Thomas Koenig <info@bigxionflasher.org>
|
|
@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 <QFile>
|
|
#include <QFileDialog>
|
|
#include <QTableView>
|
|
|
|
#include <QVBoxLayout>
|
|
#include <QPushButton>
|
|
#include <QMessageBox>
|
|
#include <QHeaderView>
|
|
#include <QStatusBar>
|
|
#include <bcvaluemanager.h>
|
|
|
|
|
|
using namespace Qt::StringLiterals;
|
|
|
|
|
|
BCValueManager::BCValueManager()
|
|
{
|
|
|
|
}
|
|
|
|
BCValueManager::~BCValueManager()
|
|
{
|
|
// nothing to do here for now,
|
|
// 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()
|
|
{
|
|
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;
|
|
*/
|
|
|
|
QFile file(":/bikeinfo.xml");
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
|
{
|
|
// __fix throw
|
|
QMessageBox::warning(nullptr, "Fehler", "Datei konnte nicht geöffnet werden.");
|
|
return;
|
|
}
|
|
|
|
_xml.setDevice(&file);
|
|
|
|
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);
|
|
|
|
while (!_xml.atEnd() && !_xml.hasError())
|
|
{
|
|
QXmlStreamReader::TokenType token = _xml.readNext();
|
|
if (token == QXmlStreamReader::StartElement)
|
|
{
|
|
QString deviceType = _xml.attributes().value("Type"_L1).toString();
|
|
qDebug() << " --- Device: " << _xml.name() << ": " << deviceType;
|
|
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;
|
|
if(deviceID.has_value())
|
|
{
|
|
BCValueList parsedValues;
|
|
readDevice( parsedValues );
|
|
if( parsedValues.count() )
|
|
{
|
|
BCValueModel* valueModel = new BCValueModel( this );
|
|
valueModel->setValueList(parsedValues);
|
|
_valueModels.insert( deviceType, valueModel );
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
/*
|
|
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( BCValueList& parsedValues )
|
|
{
|
|
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() << " ---------------";
|
|
|
|
|
|
//while (!_xml.atEnd() && !_xml.hasError())
|
|
while( _xml.readNextStartElement() )
|
|
{
|
|
if( _xml.attributes().hasAttribute(BCTags::ID) )
|
|
{
|
|
//qDebug() << " --- found: " << _xml.name() << " : " << _xml.attributes().value(BCTags::ID);
|
|
|
|
QString id = _xml.attributes().value(BCTags::ID).toString();
|
|
BCValueParams params
|
|
{
|
|
.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(),
|
|
.UnitType = _xml.attributes().value(BCTags::UnitType).toString(),
|
|
.Min = _xml.attributes().value(BCTags::Min).toString(),
|
|
.Max = _xml.attributes().value(BCTags::Max).toString(),
|
|
.Factor = _xml.attributes().value(BCTags::Factor).toString()
|
|
};
|
|
|
|
// __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);
|
|
_xml.skipCurrentElement();
|
|
}
|
|
}
|
|
|
|
|
|
// --- NEU: Speichern mit QXmlStreamWriter ---
|
|
void BCValueManager::saveXml()
|
|
{
|
|
/*
|
|
QString fileName = QFileDialog::getSaveFileName(this, "XML speichern", "", "XML Files (*.xml)");
|
|
if (fileName.isEmpty()) return;
|
|
|
|
QFile file(fileName);
|
|
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
|
QMessageBox::warning(this, "Fehler", "Datei konnte nicht zum Schreiben geöffnet werden.");
|
|
return;
|
|
}
|
|
|
|
QXmlStreamWriter xml(&file);
|
|
xml.setAutoFormatting(true); // Sorgt für schöne Einrückungen (Tabs/Spaces)
|
|
xml.writeStartDocument();
|
|
xml.writeStartElement("devices");
|
|
|
|
// Daten vom Model holen
|
|
const QList<Device> &devices = m_model->getDevices();
|
|
|
|
for (const Device &d : devices) {
|
|
xml.writeStartElement("device");
|
|
xml.writeAttribute("name", d.name);
|
|
xml.writeAttribute("ip", d.ip);
|
|
xml.writeEndElement(); // </device>
|
|
}
|
|
|
|
xml.writeEndElement(); // </devices>
|
|
xml.writeEndDocument();
|
|
|
|
// Prüfen ob alles geschrieben wurde
|
|
if (file.error() != QFile::NoError) {
|
|
QMessageBox::critical(this, "Fehler", "Fehler beim Schreiben der Datei.");
|
|
} else {
|
|
statusBar()->showMessage("Datei erfolgreich gespeichert!", 3000);
|
|
}
|
|
*/
|
|
}
|