diff --git a/bcdriver.cpp b/bcdriver.cpp index 33cbfd1..11fd3c8 100644 --- a/bcdriver.cpp +++ b/bcdriver.cpp @@ -101,7 +101,7 @@ BCDriverDummy::BCDriverDummy( QObject* parent ) { } -BCDriver::TransmitResult BCDriverDummy::readRawByte( uint32_t deviceID, uint8_t registerID ) const +TransmitResult BCDriverDummy::readRawByte( uint32_t deviceID, uint8_t registerID ) const { Q_UNUSED(deviceID) Q_UNUSED(registerID) @@ -110,7 +110,7 @@ BCDriver::TransmitResult BCDriverDummy::readRawByte( uint32_t deviceID, uint8_t return myRandomByte; } -BCDriver::TransmitResult BCDriverDummy::writeRawByte( uint32_t deviceID, uint8_t registerID, uint8_t value ) const +TransmitResult BCDriverDummy::writeRawByte( uint32_t deviceID, uint8_t registerID, uint8_t value ) const { Q_UNUSED(deviceID) Q_UNUSED(registerID) diff --git a/bcdriver.h b/bcdriver.h index 77339c0..ebd57cf 100644 --- a/bcdriver.h +++ b/bcdriver.h @@ -35,8 +35,8 @@ #include #include -#include - +#include +#include /* int32_t CanInitDriver(char *options); void CanDownDriver(void); @@ -106,8 +106,6 @@ public: // Enthält den Treiberzustand oder einen Fehlerstring using DriverStateResult = std::expected; - // Enthält den gelesenen Wert oder einen Fehlerstring - using TransmitResult = std::expected; explicit BCDriver( QObject* parent = nullptr ); virtual ~BCDriver() = default; diff --git a/bcdrivertinycan.cpp b/bcdrivertinycan.cpp index 4b1af22..c166709 100644 --- a/bcdrivertinycan.cpp +++ b/bcdrivertinycan.cpp @@ -160,8 +160,14 @@ BCDriver::DriverState BCDriverTinyCan::connectDriver() */ +/** + * @brief BCDriverTinyCan::readRawByte + * Kapselt den Treiberzugiff über die legacy C-Api. Liest ein byte, gibt dieses im std::expected aber + * als uint32_t zurück, um mit der ReadFunctions der ValueTypes kompatible zu sein. + * Im Fehlerfall wird ein Fehlerstring zurückgegeben. + */ -BCDriver::TransmitResult BCDriverTinyCan::readRawByte( uint32_t deviceID, uint8_t registerID ) const +TransmitResult BCDriverTinyCan::readRawByte( uint32_t deviceID, uint8_t registerID ) const { //TransmitResult @@ -223,13 +229,13 @@ retry: if( !timeOuts ) return std::unexpected(QString("CAN response errror: timeout" )); - return (uint8_t) msg.MsgData[3]; + return (uint32_t) msg.MsgData[3]; } // void BCDriverTinyCan::setValue( unsigned char receipient, unsigned char reg, unsigned char value ) -BCDriver::TransmitResult BCDriverTinyCan::writeRawByte( uint32_t deviceID, uint8_t registerID ,uint8_t value ) const +TransmitResult BCDriverTinyCan::writeRawByte( uint32_t deviceID, uint8_t registerID ,uint8_t value ) const { if( getDriverState() != DriverState::DeviceReady) @@ -256,6 +262,6 @@ BCDriver::TransmitResult BCDriverTinyCan::writeRawByte( uint32_t deviceID, uint8 if( timeout_count == -1 ) return std::unexpected(QString("error: could not send value to %1" ).arg( deviceID ) ); - return 1; // als 'true' + return uint32_t(1); // als 'true' } diff --git a/bcdrivertinycan.h b/bcdrivertinycan.h index 543c731..3b6cd77 100644 --- a/bcdrivertinycan.h +++ b/bcdrivertinycan.h @@ -47,11 +47,6 @@ public: TransmitResult readRawByte ( uint32_t deviceID, uint8_t registerID ) const override; TransmitResult writeRawByte( uint32_t deviceID, uint8_t registerID, uint8_t value ) const override; - QString getNodeName( unsigned char id ); - - - - public slots: void onStartDriver() override; diff --git a/bcmainwindow.cpp b/bcmainwindow.cpp index 53f91f7..349a1eb 100644 --- a/bcmainwindow.cpp +++ b/bcmainwindow.cpp @@ -153,13 +153,13 @@ void BCMainWindow::initMainWindow() // besser: model::emit dataChanged // also: emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole, ValueRole}); connect( _connectButton, &QToolButton::clicked, &_transmitter, &BCTransmitter::onToggleConnectionState ); - connect( _syncButton, &QToolButton::clicked, this, &BCMainWindow::onSyncFromDevice ); + connect( _syncButton, &QToolButton::clicked, this, &BCMainWindow::onSyncDeviceView ); connect( &_transmitter, &BCTransmitter::valueUpdated, this, &BCMainWindow::onValueUpdated ); _transmitter.moveToThread(&_worker); - connect(this, &BCMainWindow::requestValueUpdate, &_transmitter, &BCTransmitter::enqueueValueOp); + connect(this, &BCMainWindow::requestValueUpdate, &_transmitter, &BCTransmitter::enqueueValue); connect(&_worker, &QThread::finished, &_transmitter, &QObject::deleteLater); _worker.start(); @@ -239,10 +239,10 @@ void BCMainWindow::onValueUpdated(BCDevice::ID deviceID, int index, BCValue::Sta * zu synchronisieren, d.h. die aktuellen Werte über den CAN-Bus abzufragen. */ -void BCMainWindow::onSyncFromDevice() +void BCMainWindow::onSyncDeviceView() { - Q_ASSERT_X(_currentPanel, "onSyncFromDevice()", "_currentpanel ist null!"); + Q_ASSERT_X(_currentPanel, "onSyncDeviceView()", "_currentpanel ist null!"); qDebug() << " ---Syncing"; @@ -250,10 +250,11 @@ void BCMainWindow::onSyncFromDevice() // alle einzeln? echt jetzt? - for( const BCValuePtr &value : currentList ) + for( const BCValuePtr& value : currentList ) { qDebug() << " --- begin sync of value: " << value->label; - // wir setze + // wir setzen auf 'lesen' + value->state.setFlag( BCValue::State::ReadMe ); // statt '_transmitter.enqueueValueCommand( value )' entkoppeln // wir das eleganter über emit requestValueUpdate() emit requestValueUpdate( value); diff --git a/bcmainwindow.h b/bcmainwindow.h index 55a1d55..3792de2 100644 --- a/bcmainwindow.h +++ b/bcmainwindow.h @@ -59,12 +59,12 @@ public slots: // Slots für Rückmeldungen vom Runner void onValueUpdated( BCDevice::ID deviceID, int index, BCValue::State state, const QString& newValue="" ); - void onSyncFromDevice(); + void onSyncDeviceView(); signals: // Internes Signal, um Daten an den Worker Thread zu senden - void requestValueUpdate( const BCValuePtr value); + void requestValueUpdate( BCValuePtrConst value); protected: diff --git a/bctransmitter.cpp b/bctransmitter.cpp index 90e5857..25724a2 100644 --- a/bctransmitter.cpp +++ b/bctransmitter.cpp @@ -30,6 +30,7 @@ ***************************************************************************/ +#include "bcvaluetype.h" #include #include @@ -51,7 +52,7 @@ void BCTransmitter::onToggleConnectionState( bool connect ) _canDriver->onStartDriver(); // __fix! - BCDriver::TransmitResult hwVersion = _canDriver->readRawByte( (uint32_t)BCDevice::ID::Console, (uint8_t)BC::ID::Cons_Rev_Hw); + TransmitResult hwVersion = _canDriver->readRawByte( (uint32_t)BCDevice::ID::Console, (uint8_t)BC::ID::Cons_Rev_Hw); if(!hwVersion) { qDebug() << "Console not responding"; @@ -67,7 +68,7 @@ void BCTransmitter::onToggleConnectionState( bool connect ) } -void BCTransmitter::enqueueValueOp( const BCValuePtr value) +void BCTransmitter::enqueueValue( BCValuePtrConst value) { // Hier sind wir noch in GUI Thread QMutexLocker locker(&_mutex); @@ -79,16 +80,16 @@ void BCTransmitter::enqueueValueOp( const BCValuePtr value) // Trigger processing im Event-Loop des Worker Threads // invokeMethod mit QueuedConnection entkoppelt den Aufruf, - // damit enqueueValueOp sofort zurückkehrt (non-blocking für den Aufrufer). + // damit enqueueValue sofort zurückkehrt (non-blocking für den Aufrufer). - //QMetaObject::invokeMethod(this, "processValueOp", Qt::QueuedConnection); + //QMetaObject::invokeMethod(this, "processValue", Qt::QueuedConnection); QMetaObject::invokeMethod(this, [this]() { - processValueOp(); + processValue(); }, Qt::QueuedConnection ); } -void BCTransmitter::processValueOp() +void BCTransmitter::processValue() { if (_isBusy) @@ -98,7 +99,7 @@ void BCTransmitter::processValueOp() while (true) { - BCValuePtr value{}; + BCValuePtrConst valuePtr{}; { QMutexLocker locker(&_mutex); if (_valueQueue.isEmpty()) @@ -106,27 +107,39 @@ void BCTransmitter::processValueOp() _isBusy = false; break; // Schleife verlassen, warten auf neue Events } - value =_valueQueue.dequeue(); + valuePtr =_valueQueue.dequeue(); } // Mutex wird hier freigegeben! WICHTIG: Execute ohne Lock! + // Kosmetik + const BCValue& value = *(valuePtr.get()); - // Abkürzung - //const BCValue& value = *currentValue; // Value ist 'under construction' //emit valueUpdated( val.deviceID, val.indexRow, BCValue::State::Locked ); - /* - if( opID == BCValue::OpID::ReadValue ) + + const BCValueType& valueType = *value.valueType; + uint32_t devID = static_cast(value.deviceID); + uint8_t regID = static_cast (value.registerID); + QString newVisibleValue; + if(value.state.testFlag( BCValue::State::WriteMe ) ) { - QString result = currentValue->readRawValueX( *this ); - emit valueUpdated( valuel.deviceID, value.indexRow, BCValue::State::InSync, result ); + + } - else if( opID == BCValue::OpID::WriteValue ) + // oder sollen wir hier beides erlauben ? readFlag & writeFlag ? + // Was kommt dann zuerst? Schreiben und lesen als verify ? + + else if( value.state.testFlag( BCValue::State::ReadMe ) ) { - currentValue->writeRawValueX( *this ); + + // wir sind hier im anderen thread! nicht einfach so reinschreiben, nur lesen + TransmitResult result = valueType.readValueFunc( *this, devID, regID ); + if( result.has_value() ) + newVisibleValue = valueType.formatValue( result.value() ); + //emit valueUpdated( value.deviceID, value.indexRow, BCValue::State::InSync, result ); } - */ - emit valueUpdated( value->deviceID, value->indexRow, BCValue::State::InSync, "fitze!"); + + // emit valueUpdated( value->deviceID, value->indexRow, BCValue::State::InSync, "fitze!"); // __fix bc::processEventsFor(50); @@ -136,17 +149,29 @@ void BCTransmitter::processValueOp() } } -uint8_t BCTransmitter::readByte( uint32_t deviceID, uint8_t registerID ) const + +/** + * @brief BCTransmitter::readByte + * NEIN NEIN NEIN! + * Reicht den read request an den aktuellen Treiber weiter. Wird von aussen, von der readValueFunc des ValueTypes + * aufgerufen, deshalb public. + */ + +TransmitResult BCTransmitter::readByte( uint32_t deviceID, uint8_t registerID ) const { - BCDriver::TransmitResult result = _canDriver->readRawByte( deviceID, registerID ); - - return result.value(); - + return _canDriver->readRawByte( deviceID, registerID ); } -void BCTransmitter::writeByte( uint32_t deviceID, uint8_t registerID , uint8_t value ) const + +/** + * @brief BCTransmitter::writeByte + * Reicht den write request an den aktuellen Treiber weiter. Wird von aussen, von der writeValueFunc des ValueTypes + * aufgerufen, deshalb public. + */ + +TransmitResult BCTransmitter::writeByte( uint32_t deviceID, uint8_t registerID , uint8_t value ) const { - _canDriver->writeRawByte( deviceID, registerID, value ); + return _canDriver->writeRawByte( deviceID, registerID, value ); } diff --git a/bctransmitter.h b/bctransmitter.h index af8a612..5924958 100644 --- a/bctransmitter.h +++ b/bctransmitter.h @@ -39,10 +39,13 @@ #include #include +#include #include /** - * @brief Die BCTransmitter Klasse kapselt die Kommunikation mit dem + * @brief The BCTransmitter class + * + * Die BCTransmitter Klasse kapselt die Kommunikation mit dem * Treiber und läuft dazu in einem eigenen Thread. Werte, also BCValues, * die gelesen oder geschrieben werden sollen, landen in einer Queue und * werden nacheinander bearbeitet. Der Transmitter enthält auch den @@ -58,14 +61,14 @@ public: explicit BCTransmitter(QObject *parent = nullptr); - uint8_t readByte( uint32_t deviceID, uint8_t registerID ) const override; - void writeByte( uint32_t deviceID, uint8_t registerID, uint8_t value ) const override; + TransmitResult readByte( uint32_t deviceID, uint8_t registerID ) const override; + TransmitResult writeByte( uint32_t deviceID, uint8_t registerID, uint8_t value ) const override; public slots: void onToggleConnectionState( bool connect ); - void enqueueValueOp(const BCValuePtr value ); - void processValueOp(); + void enqueueValue(BCValuePtrConst value ); + void processValue(); signals: @@ -74,7 +77,10 @@ signals: private: - using BCDataQueue = QQueue; + void readRawValueX ( const BCValue& value ) const; + void writeRawValueX( const BCValue& value ) const; + + using BCDataQueue = QQueue; BCDataQueue _valueQueue; QMutex _mutex; diff --git a/bcvalue.cpp b/bcvalue.cpp index 6507205..6909fac 100644 --- a/bcvalue.cpp +++ b/bcvalue.cpp @@ -44,25 +44,5 @@ BCValue::BCValue(const BCValueType* valueType_, BCDevice::ID deviceID_, BC::ID r visibleValue = "--"; } -QString BCValue::readRawValueX( const BCAbstractTransmitter& transmitter ) const -{ - qDebug() << " --- READ X!"; - - uint32_t devID = static_cast(deviceID); - uint8_t regID = static_cast (registerID); - - // wir sind hier im anderen thread! nicht einfach so reinschreiben, nur lesen - if( valueType->readValueFunc ) - { - uint32_t result = valueType->readValueFunc( transmitter, devID, regID ); - return valueType->formatValue( result ); - } - return QString(); -} - -void BCValue::writeRawValueX( const BCAbstractTransmitter& transmitter ) const -{ - qDebug() << " --- WRITE X!"; -} diff --git a/bcvalue.h b/bcvalue.h index fccc267..98bd6a1 100644 --- a/bcvalue.h +++ b/bcvalue.h @@ -56,19 +56,6 @@ */ -/** - * @brief BCAbstractTransmitter ist das abstrakte Basisinterface für die eigentliche - * Datenübertragung auf Treiberebene. - */ - -class BCAbstractTransmitter -{ - -public: - - virtual uint8_t readByte ( uint32_t deviceID, uint8_t registerID ) const = 0; - virtual void writeByte( uint32_t deviceID, uint8_t registerID, uint8_t value_ ) const = 0; -}; class BCValueType; @@ -92,10 +79,7 @@ public: Q_DECLARE_FLAGS(States, State ) BCValue( const BCValueType* valueType_, BCDevice::ID deviceID_, BC::ID registerID_ ); - - QString readRawValueX( const BCAbstractTransmitter& transmitter ) const; - void writeRawValueX( const BCAbstractTransmitter& transmitter ) const; - + mutable States state{BCValue::State::NoState}; const BCValueType* valueType{}; BCDevice::ID deviceID{BCDevice::ID::Invalid}; @@ -111,7 +95,9 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(BCValue::States) //Q_DECLARE_METATYPE(const BCValue&) -using BCValuePtr = std::shared_ptr; +using BCValuePtr = std::shared_ptr; +using BCValuePtrConst = std::shared_ptr; + //using BCValueList = QList; using BCValueList = QList; diff --git a/bcvaluetype.cpp b/bcvaluetype.cpp index e9875f0..6ebf01f 100644 --- a/bcvaluetype.cpp +++ b/bcvaluetype.cpp @@ -38,34 +38,57 @@ -uint32_t readByteValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) +TransmitResult readDummy( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) { - return transmitter.readByte( deviceID, registerID ); + qDebug() << " --- NO: Read DUMMY: " << registerID; + return std::unexpected( QString("NO: Read DUMMY: %1 : %2 ").arg( deviceID, registerID ) ); +} + +TransmitResult readByteValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) +{ + qDebug() << " --- YES: Read ByteValue: " << registerID; + // Wir lesen nur ein Byte und gut. + return transmitter.readByte( deviceID, registerID ); } -uint32_t readWordValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) +TransmitResult readWordValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) { + qDebug() << " --- YES: Read WordValue: " << registerID; + //getValue(CONSOLE, CONSOLE_SN_PN_HI) << 8) + getValue(CONSOLE, CONSOLE_SN_PN_LO)), - // hi byte - uint32_t result = transmitter.readByte( deviceID, registerID ) << 8; - // low byte, use followup register: +1 - result += transmitter.readByte( deviceID, registerID+1 ); + uint32_t result{}; + // hi byte Leseversuch. + TransmitResult value = transmitter.readByte( deviceID, registerID ); + // Fehler? dann weg + if( !value) + return std::unexpected( value.error() ); + // hi byte speichern + result = *value << 8; + // low byte, liegt im followup register: +1 + value = transmitter.readByte( deviceID, registerID+1 ); + if( !value) + return std::unexpected( value.error() ); + result += *value; return result; - } -uint32_t readODOValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) +TransmitResult readSpeedValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) { return 0x0; } -uint32_t readVoltValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) +TransmitResult readODOValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) { return 0x0; } -uint32_t readCircValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) +TransmitResult readVoltValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) +{ + return 0x0; +} + +TransmitResult readCircValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) { return 0x0; } @@ -79,10 +102,34 @@ BCValueType::BCValueType() } -BCValueType::BCValueType( QString unitLabel_, double factor_, optDouble min_, optDouble max_ ) +BCValueType::BCValueType(QString unitKey_, QString unitLabel_, double factor_, optDouble min_, optDouble max_ ) : unitLabel{unitLabel_}, factor{factor_}, min{min_}, max{max_} { + std::optional readFn = fetchReadValueFunction( unitKey_ ); + readValueFunc = readFn.has_value() ? readFn.value() : readDummy; +} + +QString BCValueType::readRawValueX(const BCAbstractTransmitter& transmitter , const BCValue& value) const +{ + qDebug() << " --- READ X!"; + /* + uint32_t devID = static_cast(deviceID); + uint8_t regID = static_cast (registerID); + + // wir sind hier im anderen thread! nicht einfach so reinschreiben, nur lesen + if( valueType->readValueFunc ) + { + uint32_t result = valueType->readValueFunc( transmitter, devID, regID ); + return valueType->formatValue( result ); + } + */ + return QString(); +} + +void BCValueType::writeRawValueX( const BCAbstractTransmitter& transmitter, const BCValue& value ) const +{ + qDebug() << " --- WRITE X!"; } QString BCValueType::formatValue( uint32_t value ) const @@ -94,22 +141,6 @@ QString BCValueType::formatValue( uint32_t value ) const return QString::number(result, 'f', 2); } -/* - _dataTypes.insert( "Float", new Fitz{{ "", 1.5625F}} ); - _dataTypes.insert( "Percent",new Fatz{{ "%", 1.5625 }} ); - _dataTypes.insert( "KWh", new Fatz{{ "kwh", 1.5625 }} ); - _dataTypes.insert( "Watt", new Long{{ "w", 1.5625 }} ); - _dataTypes.insert( "Km", new BCValueTypeWord{{ "km", 1.5625 }} ); - _dataTypes.insert( "Kmh", new BCValueTypeWord{{ "km/h", 0.1 }} ); - _dataTypes.insert( "Mm", new BCValueTypeWord{{ "mm", 1.5625 }} ); - _dataTypes.insert( "Sec", new BCValueTypeWord{{ "s", 1.5625 }} ); - _dataTypes.insert( "SoC", new Long{{ "%", 1.5625 }} ); - _dataTypes.insert( "Odo", new Fitz{{ "km", 1.5625 }} ); - _dataTypes.insert( "Assist", new Fatz{{ "", 0 ,4 }} ); - _dataTypes.insert( "Assist", new Fatz{{ "%" }} ); - //_dataTypes.insert( "Date", { BCValueType::TypeID::Date } ); - */ - std::optional BCValueType::fetchReadValueFunction( const QString& unitTypeKey ) { static QHash s_bcReadValueFunctions @@ -126,8 +157,7 @@ std::optional BCValueType::fetchReadValueFunction( const QString& { "Degree", readByteValue }, { "SoC", readByteValue }, { "Odo", readByteValue }, - { "Assist", readByteValue }, - { "Assist", readByteValue }, + { "Assist", readByteValue } }; if( !s_bcReadValueFunctions.contains( unitTypeKey ) ) @@ -140,8 +170,9 @@ std::optional BCValueType::fetchValueType( const QString& unitType { static QHash s_bcDataTypes { - { "Byte", new BCValueType( "", 1.5625F) }, - { "Word", new BCValueType( "", 1.5625F) }, + { "Byte", new BCValueType( "Byte", "", 1.5625F) }, + { "Word", new BCValueType( "Word", "", 1.5625F) } + /* { "Float", new BCValueType( "", 1.5625F) }, { "Percent",new BCValueType( "%", 1.5625 ) }, { "KWh", new BCValueType( "kwh", 1.5625 ) }, @@ -155,6 +186,7 @@ std::optional BCValueType::fetchValueType( const QString& unitType { "Odo", new BCValueType( "km", 1.5625 ) }, { "Assist", new BCValueType( "", 0 ,4 ) }, { "Assist", new BCValueType( "%" ) }, + */ }; if( !s_bcDataTypes.contains( unitTypeKey ) ) diff --git a/bcvaluetype.h b/bcvaluetype.h index c4217b1..3d94faa 100644 --- a/bcvaluetype.h +++ b/bcvaluetype.h @@ -37,24 +37,49 @@ #include #include #include +#include #include -class BCAbstractTransmitter; class BCValue; +class BCAbstractTransmitter; using optDouble = std::optional; -using ReadValueFunc = std::function; + +// Enthält den gelesenen Wert oder einen Fehlerstring +using TransmitResult = std::expected; +// Funktionsobject, um Werte aus der Transmitterschicht zu holden +using ReadValueFunc = std::function; + + +/** + * @brief BCAbstractTransmitter ist das abstrakte Basisinterface für die eigentliche + * Datenübertragung auf Treiberebene. + */ + +class BCAbstractTransmitter +{ + +public: + + virtual TransmitResult readByte ( uint32_t deviceID, uint8_t registerID ) const = 0; + virtual TransmitResult writeByte( uint32_t deviceID, uint8_t registerID, uint8_t value_ ) const = 0; +}; + struct BCValueType { - Q_GADGET public: BCValueType(); - BCValueType( QString unitLabel_, double factor_= 1.0, optDouble min_=std::nullopt, optDouble max_= std::nullopt ); + BCValueType( QString unitKey_, QString unitLabel_, double factor_= 1.0, optDouble min_=std::nullopt, optDouble max_= std::nullopt ); + + QString readRawValueX ( const BCAbstractTransmitter& transmitter, const BCValue& value ) const; + void writeRawValueX( const BCAbstractTransmitter& transmitter, const BCValue& value ) const; + + virtual QString formatValue( uint32_t value ) const; QString unitLabel; double factor; @@ -62,8 +87,6 @@ public: optDouble max; ReadValueFunc readValueFunc; - virtual QString formatValue( uint32_t value ) const; - static std::optional fetchValueType( const QString& unitTypeKey ); static std::optional fetchReadValueFunction( const QString& unitTypeKey ); }; diff --git a/bcxmlloader.cpp b/bcxmlloader.cpp index 7e95023..0b487ab 100644 --- a/bcxmlloader.cpp +++ b/bcxmlloader.cpp @@ -221,14 +221,13 @@ std::optional BCXmlLoader::makeDataValue( BCDevice::ID deviceID, con */ - - - bool ok; + // geht nicht auf qt6.8 von debian trixie //std::optional IDVal = s_bcValueEnum.keyToValue64( params.ID.toLatin1().constData() ); + bool ok; int IDVal = s_bcValueEnum.keyToValue( params.ID.toLatin1().constData(), &ok ); qDebug() << " --- should create: " << params.Label << ": " << params.UnitType; //if( IDVal.has_value() ) - if( IDVal ) + if( ok ) { auto valueType = BCValueType::fetchValueType(params.UnitType); if( valueType.has_value() ) diff --git a/doc/BF_BikeInformation.docx b/doc/BF_BikeInformation.docx deleted file mode 100644 index 791d50d..0000000 Binary files a/doc/BF_BikeInformation.docx and /dev/null differ diff --git a/doc/BI_ConsoleInformation.docx b/doc/BI_ConsoleInformation.docx deleted file mode 100644 index 96adc2b..0000000 Binary files a/doc/BI_ConsoleInformation.docx and /dev/null differ diff --git a/doc/bbi_battery.txr.txt b/doc/bbi_battery.txr.txt new file mode 100644 index 0000000..553d17a --- /dev/null +++ b/doc/bbi_battery.txr.txt @@ -0,0 +1,187 @@ +Battery information: + Hardware version .....................: 62 + Software version .....................: 112 + Sub version ..........................: 45 + Part number ..........................: 05521 + Item number ..........................: 00011 + Manufacturing date ...................: 20.06.2012 + Location .............................: 65 + Cellpack item number .................: 03763 + Supervisor version ...................: 16 + Communication mode ...................: CAN + BOM ..................................: SMC 6.2 or SMC 6.3r1 + Nominal voltage ......................: 48V + PCB ..................................: no data + + + Charger data + ------------ + Version ..............................: 45 + Mode .................................: Idle + Charger manager status ...............: Charge done + State flags ..........................: 0x4118 + Final voltage ........................: 54,210V + Charge current .......................: 1,500A + Voltage calibration ..................: 45,410V + Current calibration ..................: 14,975A + + Charging statistic + ------------------ + Charge time worst ....................: 488 + Charge time mean .....................: 11 + Charge cycles ........................: 77 + Full charge cycles ...................: 6 + Total charged energy .................: 12876Wh + Total discharged energy ..............: 12436Wh + Charges from level 10% ...............: 15 + Charges from level 20% ...............: 13 + Charges from level 30% ...............: 15 + Charges from level 40% ...............: 7 + Charges from level 50% ...............: 7 + Charges from level 60% ...............: 6 + Charges from level 70% ...............: 2 + Charges from level 80% ...............: 4 + Charges from level 90% ...............: 8 + Total # of charges ...................: 77 + + Readings + -------- + Battery level ........................: 100,00% + Voltage ..............................: 53,49V + Relative voltage .....................: 110,83% + Maximum relative voltage .............: 100,42% + Minimum relative voltage .............: 100,00% + Avg. relative voltage ................: 100,42% + + Input voltage ........................: 25,80V + Internal battery voltage .............: 53,40V + Power voltage ........................: 0,00V + Control voltage ......................: 12,04V + Console voltage ......................: 5,43V + 12V voltage ..........................: 12,14V + Accessory voltage reading ............: 0,00V + + Cell monitor BOMID voltage ...........: 1099mV + Cell monitor PackID voltage ..........: 2814mV + Cell monitor 3.3V voltage ............: 3,23V + Cell monitor 5V voltage ..............: 5,50V + + Cellpack current .....................: 0,00A + + Battery temp max .....................: 73C + Battery temp min .....................: -17C + + Power cycles .........................: 449 + Resets ...............................: 0 + Watchdog resets ......................: 0 + PowerOn resets .......................: 3 + RTC resync ...........................: 79 + + Deep sleep on inactivity count .......: 0 days + Deep sleep on low SOC count ..........: 0 days + Deep sleep on low voltage count ......: 0 days + + Status leds ..........................: 0 + + Cellpack data + ------------- + Cell organisation ....................: 13s5p + Cell capacity ........................: 2,15Ah + Max. cell drift w/o balancing ........: 0,02V + Balancer active ......................: yes + Cell data ............................: Cell [V] to GND [V] Calib [%] + Cell # 1 ...........................: 4,068 4,068 0,810 + Cell # 2 ...........................: 4,082 8,150 0,330 + Cell # 3 ...........................: 4,082 12,232 0,240 + Cell # 4 ...........................: 4,085 16,317 0,540 + Cell # 5 ...........................: 4,098 20,414 -0,330 + Cell # 6 ...........................: 4,118 24,532 -0,150 + Cell # 7 ...........................: 4,102 28,633 0,060 + Cell # 8 ...........................: 4,107 32,740 -0,150 + Cell # 9 ...........................: 4,134 36,874 0,030 + Cell #10 ...........................: 4,165 41,039 -0,270 + Cell #11 ...........................: 4,133 45,173 0,120 + Cell #12 ...........................: 4,156 49,329 -0,450 + Cell #13 ...........................: 4,161 53,490 -0,060 + Temperature pack #1 ..................: 24C + Temperature pack #2 ..................: 24C + Temperature pack #3 ..................: 22C + Temperature pack #4 ..................: 21C + + Health + ------ + Low voltage alarm count ..............: 8960 + Cell dead short count ................: 0 + Cell partial short count .............: 0 + Cell voltage collapse count ..........: 0 + Control voltage shorts count .........: 0 + 5V voltage shorts count ..............: 0 + RTC status ...........................: 0xA5 (in sync, Read ok, Osc ok, RTC detected) + Status flags .........................: 0x0000 () + Permanent failure flag ...............: no + + Configuration + ------------- + Allow charging on bike ...............: yes + Wake on power voltage ................: no + Enable power voltage .................: no + Enable control voltage ...............: yes + Accessory mounted ....................: yes + Accessory enabled ....................: no + Accessory voltage ....................: 6,5V + Accessory shutdown delay .............: 15s + Taillamp intensity ...................: 0% + Motor precharge time .................: 5s + Power voltage shutdown delay .........: 2s + System shutdown delay ................: 300s + Enable internal battery voltage ......: yes + Max. power voltage regen current .....: 10,00A + Max. power voltage current ...........: 41,67A + Cap sense SOC mode ...................: Inactive + Deep sleep on inactivity delay .......: 60 days + Deep sleep on low SOC delay ..........: 7 days + Min. allowed gas gage temp. ..........: -30 + Max. allowed gas gage temp. ..........: 85 + Min. allowed pack temp. ..............: -30 + Max. allowed pack temp. ..............: 60 + Charger voltage calibration value ....: 45410,00 + Charger current calibration value ....: 65535,00 + Charger calibration value source .....: FF + 3V3 calibration value ................: 3,284 + Cap sense sensitivity ................: 7,00 + + Timestamps + ---------- + RTC time .............................: 399416969 + RTC time .............................: 14.02.2025 21:09:29 + Last valid battery timestamp .........: 399416134 + Last valid battery timestamp .........: 14.02.2025 20:55:34 + Last charge timestamp ................: 398852536 + Last charge timestamp ................: 08.02.2025 08:22:16 + + yet unassigned + -------------- + LMD ..................................: 6,74Ah + Estimated SOC ........................: 94% + Shipmode .............................: yes + Config type ..........................: 3 + Diag .................................: 0 + LMD adapt ............................: 5 + RTC control ..........................: 204 + ILMD .................................: 10,42Ah + Gasgage DMFSD ........................: 242 + Gasgage SOC ..........................: 100% + Gasgage AI ...........................: 0,08A + Gasgage LMD ..........................: 6,74Ah + Gasgage status flags .................: 14 + Gasgage voltage ......................: 52,96V + Gasgage temperature ..................: 31,75C + Gasgage voltage divider ..............: 15,40 + Gasgage jitter calibration ...........: 0 + NAC ..................................: 3141 + ProtectMode ..........................: 64 + ProtectControl .......................: 0 + Test flags ...........................: 0007 + Battery test button sensitivity ......: 32825 + Battery test button sensitivity reference : 32569 + diff --git a/doc/bbi_console.txt b/doc/bbi_console.txt new file mode 100644 index 0000000..63d621c --- /dev/null +++ b/doc/bbi_console.txt @@ -0,0 +1,120 @@ +Console information: + Hardware version .....................: 15 + Software version .....................: 66 + Sub version ..........................: 18 + Part number ..........................: 03205 + Item number ..........................: 00745 + Manufacturing date ...................: 13.01.2014 + Location .............................: 255 + OEM ..................................: 0 + Procuct Id ...........................: 0 + Type .................................: RIDE+ + Region ...............................: 3 + + Configuration + ------------- + Wheel circumference ..................: 2199 mm + Flipped switches .....................: no + Display units ........................: kmh + Show remaining distance and time .....: no + Lights on at start ...................: yes + Light button mode ....................: Click turns bike off, hold toggles accessory + Remember display mode ................: no + LCD Contrast .........................: 67 + + NIP ..................................: "" + ConfigBit0 ...........................: 0 + Test mode ............................: no + Expert mode ..........................: no + Auto regen ...........................: yes + Throttle mode ........................: 0 + + Console codes ........................: 0xF7FFFFFF 0xE7DD1B03 + Value (Code) .......................: read write + Wheel circumference (3771+2005) ....: yes yes + Diagnostic mode (3772) .............: yes yes + Max speed (3773) ...................: yes no + Overvoltage protection (3774) ......: yes no + Max throttle speed (3775) ..........: yes no + Minimum assist speed (3776) ........: yes no + Motor direction (1976) .............: yes no + Deprecated (5000) ..................: yes no + metric vs imperial (2001) ..........: yes yes + Regen value (2002) .................: yes yes + Remaining distance (2003) ..........: yes no + Clock time (2004) ..................: yes yes + Brake switch config (2006) .........: yes yes + Throttle polarity (2007) ...........: yes no + Accessory voltage (2008) ...........: yes no + Slave console (0041) ...............: yes no + Filter (1234) ......................: yes yes + Light sensor (1970) ................: yes no + Gauge gain (0007) ..................: yes yes + Assistance gain (0008) .............: yes yes + Gauge joint (0009) .................: yes yes + Deprecated (0911) ..................: yes no + Console info (0001) ................: yes yes + Battery info (0002) ................: yes yes + Motor info (0003) ..................: yes yes + Battery statistics (6000) ..........: yes yes + Speed gain (0006) ..................: yes yes + Alarm ..............................: no no + Time / Mountain mode ...............: yes no + + Assist & Reku + ------------- + Initial assist level .................: 0 + Assist level 1 .......................: 25,00% + Assist level 2 .......................: 50,00% + Assist level 3 .......................: 100,00% + Assist level 4 .......................: 200,00% + Assist level mountain mode ...........: 54,69% + + Rekuperation level 1 .................: 7,81% + Rekuperation level 2 .................: 23,44% + Rekuperation level 3 .................: 42,19% + Rekuperation level 4 .................: 62,50% + + Speed limits + ------------ + Assist max speed limited .............: yes + Assist max speed .....................: 44,00 Km/h + Assist min speed limited .............: yes + Assist min speed .....................: 0,50 Km/h + Throttle max speed limited ...........: yes + Throttle max speed ...................: 20,00 Km/h + + Throttle + -------- + Throttle calibrated ..................: yes + Throttle min actor reading ...........: 1 + Throttle max actor reading ...........: 200 + Throttle actor reading ...............: 0 + Throttle current level ...............: 0,00% + Throttle boost trigger level .........: 15,63% + Throttle boost display ...............: yes + Throttle enable on strain ............: yes + + Brake + ----- + Brake sensor aktiv ...................: yes + Brake sensor type ....................: NO (normal open) + Brake reku level .....................: 46,88% + + Torque sensor + ------------- + Torque sensor gain ...................: 1,00 + Torque sensor speed ..................: 3 + Torque sensor extra gain .............: 1,00 + Torque sensor extra max speed ........: 10,00 + Gauge knee ...........................: 0 + + Readings + -------- + Odometer .............................: 803,6 Km + Distance .............................: 13,4 Km + Average speed ........................: 20,5 Km/h + Chrono ...............................: 3:55:26 + Next service day .....................: 0 + Next service odo .....................: 0 + diff --git a/doc/bbi_motor.txt b/doc/bbi_motor.txt new file mode 100644 index 0000000..5df3bb1 --- /dev/null +++ b/doc/bbi_motor.txt @@ -0,0 +1,73 @@ +Motor information: + Hardware version .....................: 32 + Software version .....................: 102 + Sub version ..........................: 04 + Part number ..........................: 02283 + Item number ..........................: 00030 + Manufacturing date ...................: 26.02.2010 + Stator type ..........................: 1 + Stator part number ...................: 1569 + Location .............................: 255 + OEM ..................................: 2 + Procuct Id ...........................: 119 + Region ...............................: 3 + + Configuration + ------------- + Communication mode ...................: CAN + Wheel circumference ..................: 2199mm + Speed limit ..........................: 44,00km/h + Direction ............................: 1 + Low speed ramp .......................: yes + Dynamic flag .........................: no + PWM limit ............................: yes + + Walk level ...........................: 0,00% + Max. walk level ......................: 0,00% + Walk decrease start ..................: 1,0km/h + Walk decrease end ....................: 2,0km/h + + Assist level offslope ................: 2000,80%/s + Assist regen inflex ..................: 72,73rpm + Assist max speed derate delta ........: 27,27rpm + + Max. regen current ...................: 10,00A + Max. discharge current ...............: 41,67A + + + Readings + -------- + Odometer .............................: 0km + Operating time .......................: 0,00h + Max measured power voltage ...........: 65,54V + Max measured temperature .............: 30143,00 + + Hall DCHS ............................: 0 + Hall trans ...........................: 0 + Hall ring ............................: 0 + Hall lost ............................: 0 + + Status ...............................: VPwrUVP + Status codes .........................: 0x00 + Status codes latch ...................: 0x00 + + Temperature ..........................: 33C + Power voltage ........................: 0,05V + 12V voltage ..........................: 11,91V + 5V voltage ...........................: 5,64V + + Assist level .........................: 0,00% + Motor speed ..........................: 0,00rpm + Motor power ..........................: 0,00% + + Torque gauge polarity ................: 1 + Torque gauge type ....................: 0 + Torque gauge noise ...................: 0,61% + Torque gauge delay ...................: 1,00s + Torque gauge speed ...................: 45,46rpm + Torque gauge voltage .................: 5,00V + Torque gauge reference ...............: 0,00V + Torque gauge gain ....................: 100,00% + Torque gauge max voltage .............: 0,00V + Torque gauge max voltage delay .......: 0,00s + diff --git a/doc/bigxionflasher-usb-src-0.2.4r97/BigXionFlasher.c b/doc/bigxionflasher-usb-src-0.2.4r97/BigXionFlasher.c deleted file mode 100644 index f3312e1..0000000 --- a/doc/bigxionflasher-usb-src-0.2.4r97/BigXionFlasher.c +++ /dev/null @@ -1,635 +0,0 @@ -/* BigXionFlasher.c */ -/* ==================================================================== - * Copyright (c) 2011-2013 by Thomas König . - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the - * BigXionFlasher Project. (http://www.bigxionflasher.org/)" - * - * 4. The name "BigXionFlasher" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * info@bigxionflasher.org. - * - * 5. Products derived from this software may not be called "BigXionFlasher" - * nor may "BigXionFlasher" appear in their names without prior written - * permission of the BigXionFlasher Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the - * BigXionFlasher Project. (http://www.bigxionflasher.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE BigXionFlasher PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE BigXionFlasher PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - */ -#include -#include -#include -#include -#include -#ifdef __WIN32__ - #include - #define DEVICE_OPEN NULL - #define TREIBER_NAME "mhstcan.dll" - #define _NL "\n\r" - #define _DEGREE_SIGN "o" -#else - #define DEVICE_OPEN NULL - #define TREIBER_NAME "libmhstcan.so" - #define _NL "\n" - #define _DEGREE_SIGN "°" -#endif -#include "can_drv.h" - -#define __DOSTR(v) #v -#define __STR(v) __DOSTR(v) - -#define __BXF_VERSION__ "V 0.2.4 rev. 97" - -#define UNLIMITED_SPEED_VALUE 70 /* Km/h */ -#define UNLIMITED_MIN_SPEED_VALUE 30 /* Km/h */ -#define MAX_THROTTLE_SPEED_VALUE 70 /* Km/h */ - -#include "registers.h" - -#define TIMEOUT_VALUE 80 -#define TIMEOUT_US 10000 // 10ms - -#define doSleep(x) usleep(x*1000) - -int gAssistInitLevel = -1, gPrintSystemSettings = 0, gSkipShutdown = 0, gPowerOff = 0, gConsoleSetSlaveMode = 1, gNoSerialNumbers = 0, gSetMountainCap = -1, gSetWheelCircumference = 0; -double gSetSpeedLimit = -1, gSetMinSpeedLimit = -1, gSetThrottleSpeedLimit = -1; - -char *getNodeName(unsigned char id) -{ - if (id == CONSOLE) - return "console"; - else if (id == BATTERY) - return "battery"; - else if (id == MOTOR) - return "motor"; - else if (id == BIB) - return "bib"; - else - return "UNKNOWN"; -} - -void setValue(unsigned char receipient, unsigned char reg, unsigned char value) -{ - struct TCanMsg msg; - int timeout = TIMEOUT_VALUE; - - msg.MsgFlags = 0L; - msg.Id = receipient; - msg.MsgLen = 4; - msg.MsgData[0] = 0x00; - msg.MsgData[1] = reg; - msg.MsgData[2] = 0x00; - msg.MsgData[3] = value; - - CanTransmit(0, &msg, 1); - - while(timeout-- && CanTransmitGetCount(0)) - usleep(TIMEOUT_US); - - if (timeout == -1) - printf("error: could not send value to %s" _NL, getNodeName(receipient)); -} - -unsigned int getValue(unsigned char receipient, unsigned char reg) -{ - struct TCanMsg msg; - int err, retry = 20; - int timeout = TIMEOUT_VALUE; - - msg.MsgFlags = 0L; - msg.Id = receipient; - msg.MsgLen = 2; - msg.MsgData[0] = 0x00; - msg.MsgData[1] = reg; - - CanTransmit(0, &msg, 1); - - while(timeout-- && CanTransmitGetCount(0)) - usleep(TIMEOUT_US); - - if (timeout == -1) - printf("error: could not send value to node %s" _NL, getNodeName(receipient)); - -retry: - - timeout = TIMEOUT_VALUE; - while(timeout-- && !CanReceiveGetCount(0)) - usleep(TIMEOUT_US); - - if (timeout == -1) - { - printf("error: no response from node %s" _NL, getNodeName(receipient)); - return 0; - } - - if ((err = CanReceive(0, &msg, 1)) > 0) - { - if (--retry && (msg.Id != BIB || msg.MsgLen != 4 || msg.MsgData[1] != reg)) - goto retry; - - if (!retry) - { - printf("error: no response from node %s to %s" _NL, getNodeName(receipient), getNodeName(BIB)); - return 0; - } - - return (unsigned int) msg.MsgData[3]; - } - else - { - printf("Error: %d" _NL, err); - } - - return 0; -} - -void setSpeedLimit(double speed) -{ - int limit = (speed != 0); - - if (!speed) - speed = UNLIMITED_SPEED_VALUE; - setValue(CONSOLE, CONSOLE_ASSIST_MAXSPEEDFLAG, limit); - setValue(CONSOLE, CONSOLE_ASSIST_MAXSPEED_HI, ((int)(speed * 10)) >> 8); - setValue(CONSOLE, CONSOLE_ASSIST_MAXSPEED_LO, ((int)(speed * 10)) & 0xff); - setValue(MOTOR, MOTOR_PROTECT_UNLOCK, MOTOR_PROTECT_UNLOCK_KEY); - setValue(MOTOR, MOTOR_ASSIST_MAXSPEED, (int)speed); -} - -void setWheelCircumference(unsigned short circumference) -{ - if (!circumference) - return; - - setValue(CONSOLE, CONSOLE_GEOMETRY_CIRC_HI, (int) (circumference >> 8)); - setValue(CONSOLE, CONSOLE_GEOMETRY_CIRC_LO, (int) (circumference & 0xff)); - setValue(MOTOR, MOTOR_PROTECT_UNLOCK, MOTOR_PROTECT_UNLOCK_KEY); - setValue(MOTOR, MOTOR_GEOMETRY_CIRC_HI, (int) (circumference >> 8)); - setValue(MOTOR, MOTOR_GEOMETRY_CIRC_LO, (int) (circumference & 0xff)); -} - -void setMinSpeedLimit(double speed) -{ - char limit = (speed != 0); - - setValue(CONSOLE, CONSOLE_ASSIST_MINSPEEDFLAG, limit); - setValue(CONSOLE, CONSOLE_ASSIST_MINSPEED, (int)(speed * 10)); -} - -void setThrottleSpeedLimit(double speed) -{ - int limit = (speed != 0); - - if (!speed) - speed = MAX_THROTTLE_SPEED_VALUE; - - setValue(CONSOLE, CONSOLE_THROTTLE_MAXSPEEDFLAG, limit); - setValue(CONSOLE, CONSOLE_THROTTLE_MAXSPEED_HI, ((int)(speed * 10)) >> 8); - setValue(CONSOLE, CONSOLE_THROTTLE_MAXSPEED_LO, ((int)(speed * 10)) & 0xff); -} - -void printBatteryStats() -{ - int channel = 1, packSerial, packParallel; - - printf( " balancer enabled ...: %s" _NL _NL, (getValue(BATTERY, BATTERY_CELLMON_BALANCERENABLED != 0) ? "yes" : "no")); - - packSerial = getValue(BATTERY, BATTERY_CONFIG_PACKSERIAL); - packParallel = getValue(BATTERY, BATTERY_CONFIG_PACKPARALLEL); - - packSerial = (packSerial > 20) ? 0 : packSerial; - packParallel = (packParallel > 20) ? 0 : packParallel; - - for (;channel <= packSerial; channel++) { - setValue(BATTERY, BATTERY_CELLMON_CHANNELADDR, (int)0x80 + channel); - printf(" voltage cell #%02d ...: %.3fV" _NL, channel, - ((getValue(BATTERY, BATTERY_CELLMON_CHANNELDATA_HI) << 8) + getValue(BATTERY,BATTERY_CELLMON_CHANNELDATA_LO)) * 0.001); - } - - for (channel = 0 ; channel < packParallel ; channel ++) - printf(" temperature pack #%02d: %d" _DEGREE_SIGN "C" _NL, channel + 1, - getValue(BATTERY, BATTERY_STATUS_PACKTEMPERATURE1 + channel)); - - printf(_NL); -} - -void printChargeStats() { - int channel = 1, totalChagres = 0, c; - - for (channel = 1 ; channel <= 10; channel++) { - setValue(BATTERY, 0xf6, channel); - c = (getValue(BATTERY, 0xf7) << 8) + getValue(BATTERY,0xf8); - totalChagres += c; - printf(" charge level @ %03d%% : %04d" _NL, channel*10, c); - } - - printf(" total # of charges .: %04d" _NL _NL, totalChagres); -} - -double getVoltageValue(unsigned char in, unsigned char reg) -{ - return (getValue(BATTERY, reg) + 20.8333) * 0.416667; -} - -void usage(void) { - printf( "usage:" _NL - " -l .......... set the speed limit to (1 - " __STR(UNLIMITED_SPEED_VALUE) "), 0 = remove the limit" _NL - " -m ....... set the minimum speed limit to (0 - " __STR(UNLIMITED_MIN_SPEED_VALUE) "), 0 = remove the limit" _NL - " -t .. set the throttle speed limit to (0 - " __STR(MAX_THROTTLE_SPEED_VALUE) "), 0 = remove the limit" _NL - " -a ......... set the initial assist level after power on (0 - 4)" _NL - " -o ............... set the mountain cap level (0%% - 100%%), use 55%%" _NL - " -c . set the wheel circumference (in mm)" _NL - " -s ....................... print system settings overview" _NL - " -p ....................... power off system" _NL - " -n ....................... don't try to put console in slave mode" _NL - " -x ....................... skip automatic system shutdown when setting new speed limit. (should not be used)" _NL - " -i ....................... don't display private serial and part numbers" _NL - " -h ....................... print this help screen" _NL _NL); -} - -int parseOptions(int argc, char **argv) -{ - int oc; - char odef[] = "l:t:m:sa:pnxio:c:h?"; - - while((oc = getopt(argc,argv,odef)) != -1) { - switch(oc) { - case 'p': - gPowerOff = 1; - break; - case 'x': - gSkipShutdown = 1; - break; - case 'l': - gSetSpeedLimit = atof(optarg); - if (gSetSpeedLimit > UNLIMITED_SPEED_VALUE || gSetSpeedLimit < 0) { - printf("error: speed limit %.2f is out of range. exiting..." _NL, gSetSpeedLimit); - return -1; - } - break; - case 't': - gSetThrottleSpeedLimit = atof(optarg); - if (gSetThrottleSpeedLimit > MAX_THROTTLE_SPEED_VALUE || gSetThrottleSpeedLimit < 0) { - printf("error: throttle speed limit %.2f is out of range. exiting..." _NL, gSetThrottleSpeedLimit); - return -1; - } - break; - case 'm': - gSetMinSpeedLimit = atof(optarg); - if (gSetMinSpeedLimit > UNLIMITED_MIN_SPEED_VALUE || gSetMinSpeedLimit < 0) { - printf("error: min speed limit %.2f is out of range. exiting..." _NL, gSetMinSpeedLimit); - return -1; - } - break; - case 'a': - gAssistInitLevel = atoi(optarg); - if (gAssistInitLevel > 4 || gAssistInitLevel < 0) { - printf("error: initial assist level %d is out of range. exiting..." _NL, gAssistInitLevel); - return -1; - } - break; - case 'o': - gSetMountainCap = atoi(optarg); - if (gSetMountainCap > 100 || gSetMountainCap < 0) { - printf("error: mountain cap level %d is out of range. exiting..." _NL, gSetMountainCap); - return -1; - } - break; - case 'c': - gSetWheelCircumference = atoi(optarg); - if (gSetWheelCircumference > 3000 || gSetWheelCircumference < 1000) { - printf("error: wheel circumference %d is out of range. exiting..." _NL, gSetWheelCircumference); - return -1; - } - break; - case 'n': - gConsoleSetSlaveMode = 0; - break; - case 'i': - gNoSerialNumbers = 1; - break; - case 's': - gPrintSystemSettings = 1; - break; - case 'h': - case '?': - default: - usage(); - return -1; - } - } - - return 0; -} - -void printSystemSettings() -{ - int hwVersion, swVersion, wheelCirc; - char *sl; - double speedLimit = 0; - - printf(_NL _NL); - - hwVersion = getValue(CONSOLE, CONSOLE_REF_HW); - - if (hwVersion == 0) - printf("Console not responding" _NL _NL); - else { - swVersion = getValue(CONSOLE, CONSOLE_REF_SW); - printf( "Console information:" _NL - " hardware version ........: %02d" _NL - " software version ........: %02d" _NL - " assistance level ........: %d" _NL, - hwVersion, swVersion, - getValue(CONSOLE, CONSOLE_ASSIST_INITLEVEL) - ); - - if (!gNoSerialNumbers) - printf( " part number .............: %05d" _NL - " item number .............: %05d" _NL _NL, - ((getValue(CONSOLE, CONSOLE_SN_PN_HI) << 8) + getValue(CONSOLE, CONSOLE_SN_PN_LO)), - ((getValue(CONSOLE, CONSOLE_SN_ITEM_HI) << 8) + getValue(CONSOLE, CONSOLE_SN_ITEM_LO)) - ); - - /* ASSIST speed limit */ - sl = getValue(CONSOLE, CONSOLE_ASSIST_MAXSPEEDFLAG) == 0 ? "no" : "yes"; - speedLimit = ((getValue(CONSOLE, CONSOLE_ASSIST_MAXSPEED_HI) << 8) + getValue(CONSOLE, CONSOLE_ASSIST_MAXSPEED_LO)) / (double)10; - printf( " max limit enabled .......: %s" _NL - " speed limit .............: %0.2f Km/h" _NL _NL, sl, speedLimit); - - /* MIN speed limit */ - sl = getValue(CONSOLE, CONSOLE_ASSIST_MINSPEEDFLAG) == 0 ? "no" : "yes"; - speedLimit = (getValue(CONSOLE, CONSOLE_ASSIST_MINSPEED)) / (double)10; - printf( " min limit enabled .......: %s" _NL - " min speed limit .........: %0.2f Km/h" _NL _NL, sl, speedLimit); - - /* THROTTLE speed limit */ - sl = getValue(CONSOLE, CONSOLE_THROTTLE_MAXSPEEDFLAG) == 0 ? "no" : "yes"; - speedLimit = ((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 */ - wheelCirc = (getValue(CONSOLE, CONSOLE_GEOMETRY_CIRC_HI) << 8) + getValue(CONSOLE, CONSOLE_GEOMETRY_CIRC_LO); - printf( " wheel circumference .....: %d mm" _NL _NL, wheelCirc); - - if (swVersion >= 59) - printf( - " 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)) - ); - } -} - -int main(int argc, char **argv) -{ - int err, doShutdown = 0, consoleInSlaveMode = 0; - struct TDeviceStatus status; - - printf("BigXionFlasher USB " __BXF_VERSION__ _NL " (c) 2011-2013 by Thomas Koenig - www.bigxionflasher.org"_NL _NL); - - if ((err=parseOptions(argc, argv) < 0)) - exit(1); - - if ((err = LoadDriver(TREIBER_NAME)) < 0) { - printf("LoadDriver error: %d" _NL, err); - goto error; - } - - if ((err = CanInitDriver(NULL)) < 0) { - printf("CanInitDriver error: %d" _NL, err); - goto error; - } - - if ((err = CanDeviceOpen(0, DEVICE_OPEN)) < 0) { - printf("CanDeviceOpen error: %d" _NL, err); - goto error; - } - - CanSetSpeed(0, CAN_125K_BIT); - CanSetMode(0, OP_CAN_START, CAN_CMD_ALL_CLEAR); - CanGetDeviceStatus(0, &status); - - if (status.DrvStatus >= DRV_STATUS_CAN_OPEN) { - if (status.CanStatus == CAN_STATUS_BUS_OFF) { - printf("CAN Status BusOff" _NL); - CanSetMode(0, OP_CAN_RESET, CAN_CMD_NONE); - } - } else { - printf("error: could not open device" _NL); - goto error; - } - - consoleInSlaveMode = getValue(CONSOLE, CONSOLE_STATUS_SLAVE); - if (consoleInSlaveMode) { - printf("console already in salve mode. good!" _NL _NL); - } else { - if (gConsoleSetSlaveMode) { - int retry = 20; - - printf("putting console in salve mode ... "); - do { - setValue(CONSOLE, CONSOLE_STATUS_SLAVE, 1); - consoleInSlaveMode = getValue(CONSOLE, CONSOLE_STATUS_SLAVE); - usleep(200000); - } while(retry-- && !consoleInSlaveMode); - - doSleep(500); // give the console some time to settle - printf("%s" _NL _NL, consoleInSlaveMode ? "done" : "failed"); - } else - printf("console not in slave mode" _NL _NL); - } - - if (gAssistInitLevel != -1) { - printf("setting initial assistance level to %d" _NL, gAssistInitLevel); - setValue(CONSOLE, CONSOLE_ASSIST_INITLEVEL, gAssistInitLevel); - } - - if (gSetSpeedLimit > 0) { - printf("set speed limit to %0.2f km/h" _NL, gSetSpeedLimit); - setSpeedLimit(gSetSpeedLimit); - doShutdown = 1; - } else if (gSetSpeedLimit == 0) { - printf("disable speed limit, drive carefully" _NL); - setSpeedLimit(0); - doShutdown = 1; - } - - if (gSetMinSpeedLimit > 0) { - printf("set minimal speed limit to %0.2f km/h" _NL, gSetMinSpeedLimit); - setMinSpeedLimit(gSetMinSpeedLimit); - doShutdown = 1; - } else if (gSetMinSpeedLimit == 0) { - printf("disable minimal speed limit, drive carefully" _NL); - setMinSpeedLimit(0); - doShutdown = 1; - } - - if (gSetThrottleSpeedLimit > 0) { - printf("set throttle speed limit to %0.2f km/h" _NL, gSetThrottleSpeedLimit); - setThrottleSpeedLimit(gSetThrottleSpeedLimit); - doShutdown = 1; - } else if (gSetThrottleSpeedLimit == 0) { - printf("disable throttle speed limit, drive carefully" _NL); - setThrottleSpeedLimit(0); - doShutdown = 1; - } - - if (gSetMountainCap > 0) { - printf("set mountain cap level to %0.2f%%" _NL, ((int)gSetMountainCap / 1.5625) * 1.5625); - setValue(CONSOLE, CONSOLE_ASSIST_MOUNTAINCAP, gSetMountainCap / 1.5625); - } - - if (gSetWheelCircumference > 0) { - printf("set wheel circumference to %d" _NL, gSetWheelCircumference); - setWheelCircumference(gSetWheelCircumference); - } - - if (gPrintSystemSettings) - printSystemSettings(); - - if ((doShutdown && !gSkipShutdown) || gPowerOff) { - doSleep(1000); - printf("shutting down system." _NL); - setValue(BATTERY, BATTERY_CONFIG_SHUTDOWN, 1); - } - - CanDownDriver(); - UnloadDriver(); - - return 0; - -error: - CanDownDriver(); - UnloadDriver(); - - return 1; - -} diff --git a/doc/bigxionflasher-usb-src-0.2.4r97/CHANGELOG b/doc/bigxionflasher-usb-src-0.2.4r97/CHANGELOG deleted file mode 100644 index 634b426..0000000 --- a/doc/bigxionflasher-usb-src-0.2.4r97/CHANGELOG +++ /dev/null @@ -1,33 +0,0 @@ -# -# chagelog for BigXionFlasher USB (c) 2011-2013 by Thomas König -# -* 2013-03-23 Thomas König 0.2.4r97 -- added feature to set wheel circumference -- updated mhstcan.dll to latest version - -* 2012-05-15 Thomas König 0.2.3r86 -- can now set throttle speed limit to values higher then 25Km/h - -* 2012-04-21 Thomas König 0.2.2r72 -- code rewrite and clean-ups -- new command line options layout, setting a speed limit to zero disables it -- added throttle speed option -- added minimum (motor start) speed option -- added mountain mode option - -* 2011-09-08 Thomas König 0.2.0r46 -- major code rewrite and clean-ups so the everything is a bit less 'quick and dirty' -- implemented standard command line option parsing -- set the initial assist level after power on -- output item- and serial number of each CAN-node -- output detailed battery statistics (if supported by hardware) -- put console in slave-mode without user intervention - -* 2011-08-05 Thomas König 0.1.2r15 -- minor bug fixes - -* 2011-08-04 Thomas König 0.1.1r14 -- minor bug fixes - -* 2011-08-03 Thomas König 0.1.0r12 -- first public release diff --git a/doc/bigxionflasher-usb-src-0.2.4r97/GPLv3 b/doc/bigxionflasher-usb-src-0.2.4r97/GPLv3 deleted file mode 100644 index 94a9ed0..0000000 --- a/doc/bigxionflasher-usb-src-0.2.4r97/GPLv3 +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/doc/bigxionflasher-usb-src-0.2.4r97/Makefile b/doc/bigxionflasher-usb-src-0.2.4r97/Makefile deleted file mode 100644 index a72941c..0000000 --- a/doc/bigxionflasher-usb-src-0.2.4r97/Makefile +++ /dev/null @@ -1,44 +0,0 @@ -# -# Makefile for BigXionFlasher for Linux and Windows (MinGW) -# Copyright (c) 2011-2013 by Thomas König . -# All rights reserved. -# - -# -# point this variable to the /can_api/lib directory of the extracted -# tiny_can_*(.zip|.tar.gz) archive. -# -# Get it here http://www.mhs-elektronik.de/ -# -TINY_CAN_API = ../can_api/lib - -CC = gcc -LD = gcc -INCLUDE = -I$(TINY_CAN_API) -LDFLAGS = -Wall - -UNAME := $(shell uname) - -ifeq ($(UNAME),Linux) - API_DRV = can_drv_linux - LIB = -ldl -lc - CFLAGS = -Wall -pthread -g0 -O2 -else - API_DRV = can_drv_win - LIB = - CFLAGS = -Wall -g0 -O2 -endif - -OBJS = BigXionFlasher.o $(API_DRV).o - -all: $(OBJS) - $(LD) $(LDFLAGS) -o BigXionFlasher $(OBJS) $(LIB) - -BigXionFlasher.o: BigXionFlasher.c - $(CC) $(CFLAGS) $(INCLUDE) -o BigXionFlasher.o -c BigXionFlasher.c - -$(API_DRV).o: $(TINY_CAN_API)/$(API_DRV).c - $(CC) $(CFLAGS) $(INCLUDE) -o $(API_DRV).o -c $(TINY_CAN_API)/$(API_DRV).c - -clean: - rm -f *.o *~ ./BigXionFlasher ./BigXionFlasher.exe diff --git a/doc/bigxionflasher-usb-src-0.2.4r97/README b/doc/bigxionflasher-usb-src-0.2.4r97/README deleted file mode 100644 index 30bafbc..0000000 --- a/doc/bigxionflasher-usb-src-0.2.4r97/README +++ /dev/null @@ -1,99 +0,0 @@ -========== -ANLEITUNG: -========== - -Lizenz: -Diese Software steht unter der GPLv3 Lizenz. (siehe http://www.gnu.org/licenses/gpl.html) - -Systemvoraussetzungen: -Um diese Software verwenden zu können wird folgende Hardware benötigt: - - ein BionX oder kompatibles Antriebssystem - - ein PC oder Laptop mit Linux oder Windows - - ein PC-Can Adapter: Tiny-CAN I, Tiny-CAN II-XL (von mir getestet), Tiny-CAN IV-XL - mit !!! KORREKT INSTALLIERTER TREIBER SOFTWARE !!! - Bitte unbedingt die vom Hersteller des Tiny-CAN gelieferte Software can_view - zum laufen bringen. Erst wenn diese funktionert den BigXionFlasher verwenden! - - ein BionX CAN-Bus Kabel (weiter unten beschrieben) - -1.) -Zu aller erst muss die Treibersoftware für den Tiny-CAN installert und mit beiliegender -CAN-View Software getestet werden. Bitte die Hersteller-Web-Site konsultieren - -2.) -Das Bus-Kabel laut unten stehender Anleitung selber herstellen oder -sich eines bauen lassen. System ausschalten! - -3.) -Die Steckverbindung des BionX-CAN-Bus an einer beliebigen Stelle lösen (z.B. gleich -nach der Konsole) und das neue Kabel mit den entsprechenden Stecker verbinden. - -4.) -Den TinyCAN Adapter mit dem 9 Sub-D Stecker am Kabel verbinden und das USB-Kabel -mit dem PC und dem TinyCAN Adapter verbinden. - -5.) -Software installieren: dazu einfach das neueste binary package für das entsprechende -Betriebssystem herunterladen und in ein beliebiges Verzeichnis ENTPACKEN. - -6.) -Terminal starten: - - Ubuntu: Anwendungen -> Zubehör -> Terminal - - Windows: Start -> Ausführen -> cmd (eingeben + Enter drücken) - -und in das Verzeichnis wechseln wo der Download entpacken wurde. - -Nach der Eingabe von ls (unter Linux) oder dir (unter Windows) muss die Datei -BigXionFlasher (Linux) oder BigXionFlasher.exe (Windows) angezeigt werden. - -7.) -Antriebssystem einschalten. - -8.) -Es mehrere Argumente mit denen das Programm gestartet werden kann. Mit dem Argument -h -bekommt man eine Übersicht über diese. Zuerst startet man am besten mal ohne Argumente -um zu sehen ob das Kabel und die Software korrekt funktionieren. Der BigXionFalsher -setzt die Konsole automatisch in den CAN-Salve Modus. - -Einige Aufrufbeispiele: - - BigXionFlasher -h - zeigt eine Hilfeseite an auf der alle verfügbaren Optionen angeführt werden - - - BigXionFlasher -s - Zeigt diverse Informationen zu Konsole, Batterie und Motor an - und beendet sich dann wieder - - - BigXionFlasher -l 0 - Hebt das Geschwindigkeitslimit auf und schaltet das System danach ab - - - BigXionFlasher -l 32 - Setzt das Geschwindigkeitslimit auf den angegebenen Wert (hier 32 km/h) und - schaltet das System danach ab - - - BigXionFlasher -a 3 -l 27.4 - Setzt die vorgewählte Unterstützungsstufe auf Stufe 3 und das - Geschwindigkeitslimit auf 27.4 km/h (als Komma muss ein Punkt eingegeben werden) - -9.) -!!VORSICHTIG FAHREN!! Ich bin auf einer ebenen Teststrecke mit meinem voll aufgeladenen -48V System 46 km/h gefahren und hatte immer noch 1 Unterstützungsbalken und Tränen -in den Augen (wegen dem Wind!). - -========= -KABEL: -========= - -Es werden 2 Stecker, 1 Buchse und 1 6poliges geschirmtes Kabel (50cm - 100cm) benötigt: -Buchse: HR30-6J-6P -Stecker: HR30-6P-6S -Stecker: Sub-D Stecker 9-polig - -Die beiden HR30 müssen 1:1 durch verbunden werden inkl. Abschirmung. -Das ergibt dann eine gängige BionX-Bus Verlängerung. Das Kabel dann in der Mitte -auftrennen und die 3 CAN-Adern durchtrennen und an den Sub-D stecker löten. - - HR-30 Sub-D HR-30 -------------------------------------- -CAN LOW: 2 .... 2 .... 2 -CAN GND: 4 .... 3 .... 4 (Abschirmung) -CAN HI: 6 .... 7 .... 6 - diff --git a/doc/claude_fluent_light/.qtcreator/claude_fluent_light.pro.user b/doc/claude_fluent_light/.qtcreator/claude_fluent_light.pro.user deleted file mode 100644 index 0fb51d9..0000000 --- a/doc/claude_fluent_light/.qtcreator/claude_fluent_light.pro.user +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - EnvironmentId - {350f6538-4791-42f9-b43d-6ea1a7b22b7b} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - true - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 1 - 80 - true - true - 1 - 0 - false - true - false - 2 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - false - - - 0 - true - - true - true - Builtin.DefaultTidyAndClazy - 16 - true - - - - true - - 0 - - - - ProjectExplorer.Project.Target.0 - - Desktop - true - Desktop Qt 6.10.1 MinGW 64-bit - Desktop Qt 6.10.1 MinGW 64-bit - qt.qt6.6101.win64_mingw_kit - 0 - 0 - 0 - - 0 - C:\syncMePlease\projects.now\claude_fluent_light\build\Desktop_Qt_6_10_1_MinGW_64_bit-Debug - C:/syncMePlease/projects.now/claude_fluent_light/build/Desktop_Qt_6_10_1_MinGW_64_bit-Debug - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph "dwarf,4096" -F 250 - - Qt4ProjectManager.Qt4RunConfiguration: - C:/syncMePlease/projects.now/claude_fluent_light/claude_fluent_light.pro - false - - true - true - true - %{RunConfig:Executable:Path} - - 1 - 2 - - 1 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph "dwarf,4096" -F 250 - - Qt4ProjectManager.Qt4RunConfiguration: - C:/syncMePlease/projects.now/claude_fluent_light/claude_fluent_light.pro - false - - true - true - true - %{RunConfig:Executable:Path} - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - Version - 22 - - diff --git a/doc/claude_fluent_light/claude_fluent_light.pro b/doc/claude_fluent_light/claude_fluent_light.pro deleted file mode 100644 index 5cfb900..0000000 --- a/doc/claude_fluent_light/claude_fluent_light.pro +++ /dev/null @@ -1,26 +0,0 @@ -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -CONFIG += c++17 - -# You can make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -SOURCES += \ - fluentwidget.cpp \ - main.cpp \ - mainwindow.cpp - -HEADERS += \ - fluentwidget.h \ - mainwindow.h - -FORMS += \ - mainwindow.ui - -# Default rules for deployment. -qnx: target.path = /tmp/$${TARGET}/bin -else: unix:!android: target.path = /opt/$${TARGET}/bin -!isEmpty(target.path): INSTALLS += target diff --git a/doc/claude_fluent_light/fluentwidget.cpp b/doc/claude_fluent_light/fluentwidget.cpp deleted file mode 100644 index b0b0929..0000000 --- a/doc/claude_fluent_light/fluentwidget.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "fluentwidget.h" - diff --git a/doc/claude_fluent_light/fluentwidget.h b/doc/claude_fluent_light/fluentwidget.h deleted file mode 100644 index e7701ff..0000000 --- a/doc/claude_fluent_light/fluentwidget.h +++ /dev/null @@ -1,466 +0,0 @@ -// FluentWidget.h -#ifndef FLUENTWIDGET_H -#define FLUENTWIDGET_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// Fluent Card Widget mit Hover-Effekt -class FluentCard : public QWidget { - Q_OBJECT - Q_PROPERTY(qreal elevationFactor READ elevationFactor WRITE setElevationFactor) - -public: - FluentCard(const QString& title, const QString& subtitle, - const QColor& accentColor, QWidget* parent = nullptr) - : QWidget(parent), m_title(title), m_subtitle(subtitle), - m_accentColor(accentColor), m_elevationFactor(0.0) { - - setFixedSize(280, 140); - setMouseTracking(true); - } - - qreal elevationFactor() const { return m_elevationFactor; } - void setElevationFactor(qreal factor) - { - qDebug() << " --- set: " << factor; - m_elevationFactor = factor; - update(); - } - -protected: - void paintEvent(QPaintEvent*) override { - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - - // Draw shadow manually (multiple layers for smooth shadow) - int shadowSize = 2 + m_elevationFactor * 10; - int shadowOffset = m_elevationFactor * 4; - - for (int i = shadowSize; i > 0; i--) { - int alpha = 15 * (1.0 - i / (qreal)shadowSize); - QColor shadowColor(0, 0, 0, alpha); - painter.setPen(Qt::NoPen); - painter.setBrush(shadowColor); - painter.drawRoundedRect( - rect().adjusted(-i, -i + shadowOffset, i, i + shadowOffset), - 8 + i, 8 + i - ); - } - - // Card background - painter.setBrush(QColor(43, 43, 43)); // Dark surface - painter.setPen(QPen(QColor(63, 63, 63), 1)); // Border - painter.drawRoundedRect(rect().adjusted(1, 1, -1, -1), 8, 8); - - // Accent icon circle - QColor iconBg = m_accentColor; - iconBg.setAlpha(40); - painter.setBrush(iconBg); - painter.setPen(Qt::NoPen); - painter.drawEllipse(20, 20, 48, 48); - - // Icon (simplified) - painter.setPen(m_accentColor); - QFont iconFont = font(); - iconFont.setPointSize(24); - iconFont.setBold(true); - painter.setFont(iconFont); - painter.drawText(QRect(20, 20, 48, 48), Qt::AlignCenter, "📄"); - - // Title - painter.setPen(Qt::white); - QFont titleFont = font(); - titleFont.setPointSize(12); - titleFont.setWeight(QFont::DemiBold); - painter.setFont(titleFont); - painter.drawText(QRect(20, 80, width() - 40, 25), - Qt::AlignLeft | Qt::AlignVCenter, m_title); - - // Subtitle - painter.setPen(QColor(176, 176, 176)); - QFont subFont = font(); - subFont.setPointSize(9); - painter.setFont(subFont); - painter.drawText(QRect(20, 105, width() - 40, 20), - Qt::AlignLeft | Qt::AlignVCenter, m_subtitle); - } - - void enterEvent(QEnterEvent*) override { - QPropertyAnimation* anim = new QPropertyAnimation(this, "elevationFactor"); - anim->setDuration(200); - anim->setEasingCurve(QEasingCurve::OutCubic); - anim->setStartValue(m_elevationFactor); - anim->setEndValue(1.0); - anim->start(QAbstractAnimation::DeleteWhenStopped); - } - - void leaveEvent(QEvent*) override { - QPropertyAnimation* anim = new QPropertyAnimation(this, "elevationFactor"); - anim->setDuration(200); - anim->setEasingCurve(QEasingCurve::OutCubic); - anim->setStartValue(m_elevationFactor); - anim->setEndValue(0.0); - anim->start(QAbstractAnimation::DeleteWhenStopped); - } - -private: - QString m_title; - QString m_subtitle; - QColor m_accentColor; - qreal m_elevationFactor; -}; - -// Fluent Button mit Acrylic-Style -class FluentButton : public QPushButton { - Q_OBJECT - -public: - enum ButtonStyle { Primary, Secondary, Accent }; - - FluentButton(const QString& text, ButtonStyle style = Secondary, - QWidget* parent = nullptr) - : QPushButton(text, parent), m_style(style), m_pressed(false) { - - setMinimumHeight(32); - setCursor(Qt::PointingHandCursor); - updateStyle(); - } - -protected: - void enterEvent(QEnterEvent*) override { - updateStyle(true); - } - - void leaveEvent(QEvent*) override { - updateStyle(false); - } - - void mousePressEvent(QMouseEvent* e) override { - m_pressed = true; - QPushButton::mousePressEvent(e); - } - - void mouseReleaseEvent(QMouseEvent* e) override { - m_pressed = false; - QPushButton::mouseReleaseEvent(e); - } - -private: - void updateStyle(bool hovered = false) { - QString style; - - switch (m_style) { - case Primary: - if (hovered) { - style = "QPushButton { background-color: #106EBE; color: white; " - "border: none; border-radius: 4px; font-size: 9pt; " - "padding: 6px 16px; font-weight: 500; }"; - } else { - style = "QPushButton { background-color: #0078D4; color: white; " - "border: none; border-radius: 4px; font-size: 9pt; " - "padding: 6px 16px; font-weight: 500; }"; - } - break; - - case Secondary: - if (hovered) { - style = "QPushButton { background-color: #3A3A3A; color: white; " - "border: 1px solid #5A5A5A; border-radius: 4px; " - "font-size: 9pt; padding: 6px 16px; font-weight: 500; }"; - } else { - style = "QPushButton { background-color: #2B2B2B; color: white; " - "border: 1px solid #3F3F3F; border-radius: 4px; " - "font-size: 9pt; padding: 6px 16px; font-weight: 500; }"; - } - break; - - case Accent: - if (hovered) { - style = "QPushButton { background-color: rgba(0, 120, 212, 0.15); " - "color: #60CDFF; border: none; border-radius: 4px; " - "font-size: 9pt; padding: 6px 16px; font-weight: 500; }"; - } else { - style = "QPushButton { background-color: transparent; " - "color: #60CDFF; border: none; border-radius: 4px; " - "font-size: 9pt; padding: 6px 16px; font-weight: 500; }"; - } - break; - } - - setStyleSheet(style); - } - - ButtonStyle m_style; - bool m_pressed; -}; - -// Fluent Toggle Switch -class FluentToggle : public QWidget { - Q_OBJECT - Q_PROPERTY(int position READ position WRITE setPosition) - -public: - FluentToggle(QWidget* parent = nullptr) - : QWidget(parent), m_checked(false), m_position(2) { - - setFixedSize(44, 20); - setCursor(Qt::PointingHandCursor); - } - - bool isChecked() const { return m_checked; } - - void setChecked(bool checked) { - if (m_checked != checked) { - m_checked = checked; - animateToggle(); - emit toggled(m_checked); - } - } - - int position() const { return m_position; } - void setPosition(int pos) { - m_position = pos; - update(); - } - -signals: - void toggled(bool checked); - -protected: - void paintEvent(QPaintEvent*) override { - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - - // Track - QColor trackColor = m_checked ? QColor("#0078D4") : QColor("#3F3F3F"); - painter.setPen(Qt::NoPen); - painter.setBrush(trackColor); - painter.drawRoundedRect(rect(), 10, 10); - - // Thumb - painter.setBrush(Qt::white); - painter.drawEllipse(m_position, 2, 16, 16); - } - - void mousePressEvent(QMouseEvent*) override { - setChecked(!m_checked); - } - -private: - void animateToggle() { - QPropertyAnimation* anim = new QPropertyAnimation(this, "position"); - anim->setDuration(150); - anim->setEasingCurve(QEasingCurve::InOutQuad); - anim->setEndValue(m_checked ? 26 : 2); - anim->start(QAbstractAnimation::DeleteWhenStopped); - } - - bool m_checked; - int m_position; -}; - -// Main Fluent Widget -class FluentWidget : public QWidget { - Q_OBJECT - -public: - FluentWidget(QWidget* parent = nullptr) : QWidget(parent) { - setupUI(); - applyFluentDarkTheme(); - } - -private: - void setupUI() { - QVBoxLayout* mainLayout = new QVBoxLayout(this); - mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->setSpacing(0); - - // Title Bar - QWidget* titleBar = createTitleBar(); - mainLayout->addWidget(titleBar); - - // Content Area - QWidget* content = new QWidget(); - content->setStyleSheet("background-color: #202020;"); - - QVBoxLayout* contentLayout = new QVBoxLayout(content); - contentLayout->setContentsMargins(40, 40, 40, 40); - contentLayout->setSpacing(32); - - // Header - QLabel* titleLabel = new QLabel("Fluent Design System"); - titleLabel->setStyleSheet("color: white; font-size: 28pt; font-weight: 600;"); - contentLayout->addWidget(titleLabel); - - QLabel* subtitleLabel = new QLabel("Modern Windows 11 inspired UI components"); - subtitleLabel->setStyleSheet("color: #B0B0B0; font-size: 11pt;"); - contentLayout->addWidget(subtitleLabel); - - contentLayout->addSpacing(20); - - // Cards Grid - QWidget* cardsWidget = new QWidget(); - QGridLayout* cardsLayout = new QGridLayout(cardsWidget); - cardsLayout->setSpacing(20); - - cardsLayout->addWidget(new FluentCard("Documents", "128 files", - QColor("#0078D4")), 0, 0); - cardsLayout->addWidget(new FluentCard("Photos", "1,234 items", - QColor("#8764B8")), 0, 1); - cardsLayout->addWidget(new FluentCard("Music", "89 songs", - QColor("#00B7C3")), 0, 2); - cardsLayout->addWidget(new FluentCard("Videos", "24 clips", - QColor("#E3008C")), 1, 0); - cardsLayout->addWidget(new FluentCard("Downloads", "45 items", - QColor("#00CC6A")), 1, 1); - cardsLayout->addWidget(new FluentCard("Projects", "12 folders", - QColor("#FF8C00")), 1, 2); - - contentLayout->addWidget(cardsWidget); - - contentLayout->addSpacing(20); - - // Controls Section - QWidget* controlsPanel = createControlsPanel(); - contentLayout->addWidget(controlsPanel); - - contentLayout->addStretch(); - - mainLayout->addWidget(content); - } - - QWidget* createTitleBar() { - QWidget* titleBar = new QWidget(); - titleBar->setFixedHeight(48); - titleBar->setStyleSheet("background-color: #2B2B2B; border-bottom: 1px solid #3F3F3F;"); - - QHBoxLayout* layout = new QHBoxLayout(titleBar); - layout->setContentsMargins(16, 0, 16, 0); - - // App Icon - QLabel* iconLabel = new QLabel("💎"); - iconLabel->setStyleSheet("font-size: 20pt;"); - layout->addWidget(iconLabel); - - QLabel* appName = new QLabel("Fluent Demo"); - appName->setStyleSheet("color: white; font-size: 10pt; font-weight: 600;"); - layout->addWidget(appName); - - layout->addStretch(); - - // Action Buttons - QPushButton* searchBtn = new QPushButton("🔍"); - searchBtn->setFixedSize(32, 32); - searchBtn->setStyleSheet("QPushButton { background: transparent; color: white; " - "border: none; border-radius: 4px; font-size: 14pt; }" - "QPushButton:hover { background: #3A3A3A; }"); - layout->addWidget(searchBtn); - - QPushButton* notifBtn = new QPushButton("🔔"); - notifBtn->setFixedSize(32, 32); - notifBtn->setStyleSheet("QPushButton { background: transparent; color: white; " - "border: none; border-radius: 4px; font-size: 14pt; }" - "QPushButton:hover { background: #3A3A3A; }"); - layout->addWidget(notifBtn); - - QPushButton* userBtn = new QPushButton("👤"); - userBtn->setFixedSize(32, 32); - userBtn->setStyleSheet("QPushButton { background: transparent; color: white; " - "border: none; border-radius: 4px; font-size: 14pt; }" - "QPushButton:hover { background: #3A3A3A; }"); - layout->addWidget(userBtn); - - return titleBar; - } - - QWidget* createControlsPanel() { - QWidget* panel = new QWidget(); - panel->setStyleSheet("background-color: #2B2B2B; border: 1px solid #3F3F3F; " - "border-radius: 8px;"); - - QVBoxLayout* layout = new QVBoxLayout(panel); - layout->setContentsMargins(24, 24, 24, 24); - layout->setSpacing(24); - - // Section Title - QLabel* sectionTitle = new QLabel("Controls"); - sectionTitle->setStyleSheet("color: white; font-size: 16pt; font-weight: 600;"); - layout->addWidget(sectionTitle); - - // Buttons Demo - QLabel* btnLabel = new QLabel("Buttons"); - btnLabel->setStyleSheet("color: #B0B0B0; font-size: 10pt; font-weight: 600;"); - layout->addWidget(btnLabel); - - QHBoxLayout* btnLayout = new QHBoxLayout(); - btnLayout->setSpacing(12); - btnLayout->addWidget(new FluentButton("Primary", FluentButton::Primary)); - btnLayout->addWidget(new FluentButton("Secondary", FluentButton::Secondary)); - btnLayout->addWidget(new FluentButton("Accent", FluentButton::Accent)); - btnLayout->addStretch(); - layout->addLayout(btnLayout); - - // Slider Demo - QLabel* sliderLabel = new QLabel("Slider"); - sliderLabel->setStyleSheet("color: #B0B0B0; font-size: 10pt; font-weight: 600;"); - layout->addWidget(sliderLabel); - - QSlider* slider = new QSlider(Qt::Horizontal); - slider->setRange(0, 100); - slider->setValue(50); - slider->setStyleSheet( - "QSlider::groove:horizontal { background: #3F3F3F; height: 4px; " - "border-radius: 2px; }" - "QSlider::handle:horizontal { background: #0078D4; width: 16px; " - "height: 16px; margin: -6px 0; border-radius: 8px; }" - "QSlider::add-page:horizontal { background: #3F3F3F; }" - "QSlider::sub-page:horizontal { background: #0078D4; }" - ); - layout->addWidget(slider); - - // Toggle Demo - QLabel* toggleLabel = new QLabel("Toggles"); - toggleLabel->setStyleSheet("color: #B0B0B0; font-size: 10pt; font-weight: 600;"); - layout->addWidget(toggleLabel); - - QStringList toggleTexts = {"Enable notifications", "Dark mode", "Auto-save"}; - for (const QString& text : toggleTexts) { - QHBoxLayout* toggleRow = new QHBoxLayout(); - - QLabel* label = new QLabel(text); - label->setStyleSheet("color: white; font-size: 10pt;"); - toggleRow->addWidget(label); - - toggleRow->addStretch(); - - FluentToggle* toggle = new FluentToggle(); - if (text == "Dark mode") { - toggle->setChecked(true); - } - toggleRow->addWidget(toggle); - - layout->addLayout(toggleRow); - } - - return panel; - } - - void applyFluentDarkTheme() { - setStyleSheet("QWidget { font-family: 'Segoe UI', 'Noto Sans', sans-serif; }"); - } -}; - -#endif // FLUENTWIDGET_H diff --git a/doc/claude_fluent_light/main.cpp b/doc/claude_fluent_light/main.cpp deleted file mode 100644 index a8b51a1..0000000 --- a/doc/claude_fluent_light/main.cpp +++ /dev/null @@ -1,37 +0,0 @@ - -// main.cpp -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "FluentWidget.h" - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - - // Set font - QFont font; - font.setFamily("Segoe UI"); - font.setPointSize(9); - app.setFont(font); - - FluentWidget window; - window.setWindowTitle("Fluent Design Demo"); - window.resize(1000, 800); - window.show(); - - return app.exec(); -} diff --git a/doc/claude_fluent_light/mainwindow.cpp b/doc/claude_fluent_light/mainwindow.cpp deleted file mode 100644 index ffc1962..0000000 --- a/doc/claude_fluent_light/mainwindow.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "mainwindow.h" - -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent) -{ - setupUi(this); -} - -MainWindow::~MainWindow() {} diff --git a/doc/claude_fluent_light/mainwindow.h b/doc/claude_fluent_light/mainwindow.h deleted file mode 100644 index 3c2e413..0000000 --- a/doc/claude_fluent_light/mainwindow.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include "ui_mainwindow.h" - -#include - -class MainWindow : public QMainWindow, private Ui::MainWindow -{ - Q_OBJECT - -public: - MainWindow(QWidget *parent = nullptr); - ~MainWindow(); -}; -#endif // MAINWINDOW_H diff --git a/doc/claude_fluent_light/mainwindow.ui b/doc/claude_fluent_light/mainwindow.ui deleted file mode 100644 index becc91c..0000000 --- a/doc/claude_fluent_light/mainwindow.ui +++ /dev/null @@ -1,31 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 800 - 600 - - - - MainWindow - - - - - - 0 - 0 - 800 - 18 - - - - - - - - diff --git a/doc/dummy.c b/doc/dummy.c deleted file mode 100644 index 5746a77..0000000 --- a/doc/dummy.c +++ /dev/null @@ -1,129 +0,0 @@ - - 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/fancy_switch/.qtcreator/fancy_switch.pro.user b/doc/fancy_switch/.qtcreator/fancy_switch.pro.user deleted file mode 100644 index 88025fa..0000000 --- a/doc/fancy_switch/.qtcreator/fancy_switch.pro.user +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - EnvironmentId - {350f6538-4791-42f9-b43d-6ea1a7b22b7b} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - true - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 1 - 80 - true - true - 1 - 0 - false - true - false - 2 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - false - - - 0 - true - - true - true - Builtin.DefaultTidyAndClazy - 16 - true - - - - true - - 0 - - - - ProjectExplorer.Project.Target.0 - - Desktop - true - Desktop Qt 6.10.1 MinGW 64-bit - Desktop Qt 6.10.1 MinGW 64-bit - qt.qt6.6101.win64_mingw_kit - 0 - 0 - 0 - - 0 - C:\syncMePlease\projects.now\fancy_switch\build\Desktop_Qt_6_10_1_MinGW_64_bit-Debug - C:/syncMePlease/projects.now/fancy_switch/build/Desktop_Qt_6_10_1_MinGW_64_bit-Debug - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph "dwarf,4096" -F 250 - - Qt4ProjectManager.Qt4RunConfiguration: - C:/syncMePlease/projects.now/fancy_switch/fancy_switch.pro - false - - true - true - true - %{RunConfig:Executable:Path} - - 1 - 2 - - 1 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph "dwarf,4096" -F 250 - - Qt4ProjectManager.Qt4RunConfiguration: - C:/syncMePlease/projects.now/fancy_switch/fancy_switch.pro - false - - true - true - true - %{RunConfig:Executable:Path} - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - Version - 22 - - diff --git a/doc/fancy_switch/fancy_switch.pro b/doc/fancy_switch/fancy_switch.pro deleted file mode 100644 index 02d18d9..0000000 --- a/doc/fancy_switch/fancy_switch.pro +++ /dev/null @@ -1,26 +0,0 @@ -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -CONFIG += c++17 - -# You can make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -SOURCES += \ - main.cpp \ - mainwindow.cpp \ - themetogglewidget.cpp - -HEADERS += \ - mainwindow.h \ - themetogglewidget.h - -FORMS += \ - mainwindow.ui - -# Default rules for deployment. -qnx: target.path = /tmp/$${TARGET}/bin -else: unix:!android: target.path = /opt/$${TARGET}/bin -!isEmpty(target.path): INSTALLS += target diff --git a/doc/fancy_switch/main.cpp b/doc/fancy_switch/main.cpp deleted file mode 100644 index 02e873c..0000000 --- a/doc/fancy_switch/main.cpp +++ /dev/null @@ -1,54 +0,0 @@ -// ============================================================================ -// main.cpp - Vollständiges Beispiel -// ============================================================================ - - -#include -#include -#include -#include -#include - -#include -#include - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - - QMainWindow window; - window.setWindowTitle("Theme Toggle Demo"); - window.resize(600, 400); - - // Central Widget - QWidget* central = new QWidget(); - QVBoxLayout* layout = new QVBoxLayout(central); - - QLabel* label = new QLabel("Toggle theme using the button in the status bar →"); - label->setAlignment(Qt::AlignCenter); - label->setStyleSheet("font-size: 14pt;"); - layout->addWidget(label); - - window.setCentralWidget(central); - - // StatusBar mit Theme Toggle - QStatusBar* statusBar = window.statusBar(); - statusBar->showMessage("Ready"); - - ThemeToggleWidget* themeToggle = new ThemeToggleWidget(); - statusBar->addPermanentWidget(themeToggle); - - // Optional: Speichere Theme-Einstellung - QObject::connect(themeToggle, &ThemeToggleWidget::themeChanged, - [](bool isDark) { - // Settings speichern - // QSettings settings; - // settings.setValue("theme/darkMode", isDark); - qDebug() << "Theme:" << (isDark ? "Dark" : "Light"); - }); - - window.show(); - - return app.exec(); -} - diff --git a/doc/fancy_switch/mainwindow.cpp b/doc/fancy_switch/mainwindow.cpp deleted file mode 100644 index 0a4a1cf..0000000 --- a/doc/fancy_switch/mainwindow.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "mainwindow.h" diff --git a/doc/fancy_switch/mainwindow.h b/doc/fancy_switch/mainwindow.h deleted file mode 100644 index 01e2c23..0000000 --- a/doc/fancy_switch/mainwindow.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -// MainWindow.h -#include -#include -#include -#include "ThemeToggleWidget.h" - -#include - - - -class MainWindow : public QMainWindow { - Q_OBJECT - -public: - MainWindow(QWidget* parent = nullptr) : QMainWindow(parent) { - setupUI(); - setupStatusBar(); - } - -private: - void setupUI() { - // Dein UI Setup - setWindowTitle("My Application"); - resize(800, 600); - } - - void setupStatusBar() { - QStatusBar* statusBar = this->statusBar(); - statusBar->setSizeGripEnabled(true); - - // Theme Toggle Widget rechts hinzufügen - ThemeToggleWidget* themeToggle = new ThemeToggleWidget(this); - statusBar->addPermanentWidget(themeToggle); - - // Optional: Reagiere auf Theme-Änderungen - connect(themeToggle, &ThemeToggleWidget::themeChanged, - this, &MainWindow::onThemeChanged); - - // Status-Message links - statusBar->showMessage("Ready"); - } - -private slots: - void onThemeChanged(bool isDarkMode) { - qDebug() << "Theme changed to:" << (isDarkMode ? "Dark" : "Light"); - - // Hier kannst du zusätzliche Aktionen durchführen: - // - Icons aktualisieren - // - Custom Widgets neu zeichnen - // - Settings speichern - } -}; - - -// ============================================================================ -// Alternative: Mit QAction für Menu/Toolbar -// ============================================================================ - -/* -class MainWindowB : public MainWindow -{ - Q_OBJECT - -public: - MainWindowB(QWidget* parent = nullptr) : MainWindow(parent) - { - //setupUI(); - setupThemeToggle(); - } - -private: - void setupThemeToggle() - { - // Als QAction (kann in Menu UND StatusBar) - m_themeAction = new QAction(this); - m_themeAction->setText("🌙"); // Initial: Dark Mode Icon - m_themeAction->setToolTip("Toggle Dark/Light Mode"); - - connect(m_themeAction, &QAction::triggered, this, &MainWindowB::toggleTheme); - - // In Toolbar - QToolBar* toolbar = addToolBar("Main"); - toolbar->addAction(m_themeAction); - - // UND in StatusBar - QPushButton* statusBarThemeBtn = new QPushButton("🌙", this); - statusBarThemeBtn->setFixedSize(32, 24); - statusBarThemeBtn->setFlat(true); - statusBarThemeBtn->setCursor(Qt::PointingHandCursor); - connect(statusBarThemeBtn, &QPushButton::clicked, this, &MainWindowB::toggleTheme); - - statusBar()->addPermanentWidget(statusBarThemeBtn); - } - -private slots: - void toggleTheme() - { - m_isDarkMode = !m_isDarkMode; - - QString icon = m_isDarkMode ? "☀️" : "🌙"; - m_themeAction->setText(icon); - - // Theme anwenden... - if (m_isDarkMode) - { - applyDarkTheme(); - } else { - applyLightTheme(); - } - } - -private: - bool m_isDarkMode = true; - QAction* m_themeAction; -}; -*/ - - -#endif // MAINWINDOW_H diff --git a/doc/fancy_switch/mainwindow.ui b/doc/fancy_switch/mainwindow.ui deleted file mode 100644 index becc91c..0000000 --- a/doc/fancy_switch/mainwindow.ui +++ /dev/null @@ -1,31 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 800 - 600 - - - - MainWindow - - - - - - 0 - 0 - 800 - 18 - - - - - - - - diff --git a/doc/fancy_switch/themetogglewidget.cpp b/doc/fancy_switch/themetogglewidget.cpp deleted file mode 100644 index e265e8b..0000000 --- a/doc/fancy_switch/themetogglewidget.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "themetogglewidget.h" - diff --git a/doc/fancy_switch/themetogglewidget.h b/doc/fancy_switch/themetogglewidget.h deleted file mode 100644 index c525fcc..0000000 --- a/doc/fancy_switch/themetogglewidget.h +++ /dev/null @@ -1,278 +0,0 @@ -// ThemeToggleWidget.h -#ifndef THEMETOGGLEWIDGET_H -#define THEMETOGGLEWIDGET_H - -#include -#include -#include -#include -#include -#include -#include -#include - -class ThemeToggleWidget : public QWidget -{ - Q_OBJECT - Q_PROPERTY(int position READ position WRITE setPosition) - -public: - - explicit ThemeToggleWidget(QWidget* parent = nullptr) - : QWidget(parent), m_isDarkMode(true), m_position(0) { - - setupUI(); - applyDarkTheme(); - - } - - bool isDarkMode() const { return m_isDarkMode; } - - void setDarkMode(bool dark) - { - if (m_isDarkMode != dark) - { - m_isDarkMode = dark; - animateToggle(); - applyTheme(); - emit themeChanged(m_isDarkMode); - } - } - -signals: - - void themeChanged(bool isDarkMode); - -private slots: - - void toggleTheme() - { - setDarkMode(!m_isDarkMode); - } - -public: - - void setupUI() - { - QHBoxLayout* layout = new QHBoxLayout(this); - layout->setContentsMargins(0, 0, 0, 0); - layout->setSpacing(0); - - // Toggle Button - m_toggleButton = new QPushButton(this); - m_toggleButton->setFixedSize(64, 28); - m_toggleButton->setCursor(Qt::PointingHandCursor); - m_toggleButton->setFlat(true); - - connect(m_toggleButton, &QPushButton::clicked, this, &ThemeToggleWidget::toggleTheme); - - layout->addWidget(m_toggleButton); - - setFixedSize(64, 28); - } - - void paintEvent(QPaintEvent*) override - { - qDebug() << " --- paint!"; - - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - - int thumbX = 2 + m_position; - /* - // Track background - QColor trackColor = m_isDarkMode ? QColor(0x3A3A3A) : QColor(0xE1DFDD); - painter.setPen(Qt::NoPen); - painter.setBrush(trackColor); - painter.drawRoundedRect(rect(), 14, 14); - - // Animated thumb - int thumbX = 2 + m_position; - QColor thumbColor = m_isDarkMode ? QColor(0x1F1F1F) : QColor(0xFFFFFF); - - // Shadow - painter.setBrush(QColor(0, 0, 0, 30)); - painter.drawEllipse(thumbX + 1, 3, 22, 22); - - // Thumb - painter.setBrush(thumbColor); - painter.drawEllipse(thumbX, 2, 24, 24); - - - // Icon on thumb - painter.setPen(m_isDarkMode ? QColor(0xFFD700) : QColor(0xFFA500)); - QFont iconFont = font(); - iconFont.setPointSize(12); - painter.setFont(iconFont); -*/ - - QString icon = "FITZ!";// m_isDarkMode ? "🌙" : "☀️"; - painter.drawText(QRect(0, 2, 24, 24), Qt::AlignLeft, icon); - } - - int position() const { return m_position; } - void setPosition(int pos) { - m_position = pos; - update(); - } - - void animateToggle() - { - QPropertyAnimation* anim = new QPropertyAnimation(this, "position"); - anim->setDuration(200); - anim->setEasingCurve(QEasingCurve::InOutQuad); - anim->setStartValue(m_position); - anim->setEndValue(m_isDarkMode ? 36 : 0); - anim->start(QAbstractAnimation::DeleteWhenStopped); - } - - void applyTheme() - { - if (m_isDarkMode) { - applyDarkTheme(); - } else { - applyLightTheme(); - } - } - - void applyDarkTheme() - { - QFile file(":/styles/fluent_dark.qss"); - if (file.open(QFile::ReadOnly)) { - qApp->setStyleSheet(file.readAll()); - } else { - // Fallback: Inline Dark Theme - qApp->setStyleSheet(R"( - * { - background-color: #202020; - color: #FFFFFF; - } - QPushButton { - background-color: #2B2B2B; - border: 1px solid #3F3F3F; - border-radius: 4px; - padding: 6px 16px; - } - QPushButton:hover { - background-color: #3A3A3A; - } - QStatusBar { - background-color: #2B2B2B; - color: #B0B0B0; - border-top: 1px solid #3F3F3F; - } - )"); - } - } - - void applyLightTheme() { - QFile file(":/styles/fluent_light.qss"); - if (file.open(QFile::ReadOnly)) { - qApp->setStyleSheet(file.readAll()); - } else { - // Fallback: Inline Light Theme - qApp->setStyleSheet(R"( - * { - background-color: #F3F3F3; - color: #000000; - } - QPushButton { - background-color: #FFFFFF; - border: 1px solid #E1DFDD; - border-radius: 4px; - padding: 6px 16px; - } - QPushButton:hover { - background-color: #F9F9F9; - } - QStatusBar { - background-color: #FFFFFF; - color: #605E5C; - border-top: 1px solid #E1DFDD; - } - )"); - } - } - - bool m_isDarkMode; - int m_position; - QPushButton* m_toggleButton; -}; - -// ============================================================================ -// Alternative: Kompaktere Version ohne Animation -// ============================================================================ - -class SimpleThemeToggle : public QPushButton -{ - Q_OBJECT - -public: - explicit SimpleThemeToggle(QWidget* parent = nullptr) - : QPushButton(parent), m_isDarkMode(true) { - - setFixedSize(48, 28); - setCursor(Qt::PointingHandCursor); - setFlat(true); - updateIcon(); - - connect(this, &QPushButton::clicked, this, &SimpleThemeToggle::toggleTheme); - - // Tooltip - setToolTip("Toggle Dark/Light Mode"); - } - - bool isDarkMode() const { return m_isDarkMode; } - -signals: - void themeChanged(bool isDarkMode); - -private slots: - void toggleTheme() { - m_isDarkMode = !m_isDarkMode; - updateIcon(); - applyTheme(); - emit themeChanged(m_isDarkMode); - } - -private: - - void updateIcon() - { - QString icon = m_isDarkMode ? "☀️" : "🌙"; - setText(icon); - - // Style - QString style = QString( - "QPushButton {" - " background-color: %1;" - " border: 1px solid %2;" - " border-radius: 14px;" - " font-size: 16pt;" - " padding: 0px;" - "}" - "QPushButton:hover {" - " background-color: %3;" - "}" - ).arg(m_isDarkMode ? "#2B2B2B" : "#FFFFFF") - .arg(m_isDarkMode ? "#3F3F3F" : "#E1DFDD") - .arg(m_isDarkMode ? "#3A3A3A" : "#F9F9F9"); - - setStyleSheet(style); - } - - void applyTheme() - { - if (m_isDarkMode) { - // Dark theme - qApp->setStyleSheet("* { background-color: #202020; color: #FFFFFF; }"); - } else { - // Light theme - qApp->setStyleSheet("* { background-color: #F3F3F3; color: #000000; }"); - } - } - - bool m_isDarkMode; -}; - -#endif diff --git a/doc/gem_fluend_dark/.qtcreator/gem_fluend_dark.pro.user b/doc/gem_fluend_dark/.qtcreator/gem_fluend_dark.pro.user deleted file mode 100644 index 7f5a183..0000000 --- a/doc/gem_fluend_dark/.qtcreator/gem_fluend_dark.pro.user +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - EnvironmentId - {350f6538-4791-42f9-b43d-6ea1a7b22b7b} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - true - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 1 - 80 - true - true - 1 - 0 - false - true - false - 2 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - false - - - 0 - true - - true - true - Builtin.DefaultTidyAndClazy - 16 - true - - - - true - - 0 - - - - ProjectExplorer.Project.Target.0 - - Desktop - true - Desktop Qt 6.10.1 MinGW 64-bit - Desktop Qt 6.10.1 MinGW 64-bit - qt.qt6.6101.win64_mingw_kit - 0 - 0 - 0 - - 0 - C:\syncMePlease\projects.now\gem_fluend_dark\build\Desktop_Qt_6_10_1_MinGW_64_bit-Debug - C:/syncMePlease/projects.now/gem_fluend_dark/build/Desktop_Qt_6_10_1_MinGW_64_bit-Debug - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph "dwarf,4096" -F 250 - - Qt4ProjectManager.Qt4RunConfiguration: - C:/syncMePlease/projects.now/gem_fluend_dark/gem_fluend_dark.pro - false - - true - true - true - %{RunConfig:Executable:Path} - - 1 - 2 - - 1 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph "dwarf,4096" -F 250 - - Qt4ProjectManager.Qt4RunConfiguration: - C:/syncMePlease/projects.now/gem_fluend_dark/gem_fluend_dark.pro - false - - true - true - true - %{RunConfig:Executable:Path} - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - Version - 22 - - diff --git a/doc/gem_fluend_dark/gem_fluend_dark.pro b/doc/gem_fluend_dark/gem_fluend_dark.pro deleted file mode 100644 index b915c09..0000000 --- a/doc/gem_fluend_dark/gem_fluend_dark.pro +++ /dev/null @@ -1,24 +0,0 @@ -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -CONFIG += c++17 - -# You can make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -SOURCES += \ - main.cpp \ - mainwindow.cpp - -HEADERS += \ - mainwindow.h - -FORMS += \ - mainwindow.ui - -# Default rules for deployment. -qnx: target.path = /tmp/$${TARGET}/bin -else: unix:!android: target.path = /opt/$${TARGET}/bin -!isEmpty(target.path): INSTALLS += target diff --git a/doc/gem_fluend_dark/main.cpp b/doc/gem_fluend_dark/main.cpp deleted file mode 100644 index aa92944..0000000 --- a/doc/gem_fluend_dark/main.cpp +++ /dev/null @@ -1,219 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// Hilfsfunktion: Setzt die Fluent Dark Palette global -void applyFluentDarkTheme(QApplication &app) { - // 1. Schriftart setzen (Segoe UI ist Standard für Fluent, Fallback auf Sans) - QFont font = app.font(); - font.setFamily("Segoe UI Variable Display"); // Windows 11 Font - if (!QFontDatabase().families().contains("Segoe UI Variable Display")) { - font.setFamily("Segoe UI"); // Windows 10 - } - font.setPointSize(10); - app.setFont(font); - - // 2. Die Palette definieren - QPalette p; - // Window / Background: #202020 (Mica Alt Base) - QColor colBackground("#202020"); - // Surface / Container: #2D2D2D (Control Fill Secondary) - QColor colSurface("#2D2D2D"); - // Accent: #60CDFF (System Accent Light 2) - QColor colAccent("#60CDFF"); - // Text: White - QColor colText(Qt::white); - QColor colSubText("#D0D0D0"); - - p.setColor(QPalette::Window, colBackground); - p.setColor(QPalette::WindowText, colText); - p.setColor(QPalette::Base, colSurface); - p.setColor(QPalette::AlternateBase, colBackground); - p.setColor(QPalette::ToolTipBase, colSurface); - p.setColor(QPalette::ToolTipText, colText); - p.setColor(QPalette::Text, colText); - p.setColor(QPalette::Button, colSurface); - p.setColor(QPalette::ButtonText, colText); - p.setColor(QPalette::PlaceholderText, colSubText); - p.setColor(QPalette::Highlight, colAccent); - p.setColor(QPalette::HighlightedText, Qt::black); // Kontrast auf Accent - - app.setPalette(p); - - // 3. Stylesheets für die Details (Runde Ecken, Hover) - // Fluent Design nutzt Radius 4px für Controls und 8px für Layer - app.setStyleSheet(R"( - QWidget { - background-color: #202020; - color: #FFFFFF; - } - - /* CARD / CONTAINER STYLE */ - QFrame#Card { - background-color: #2D2D2D; - border: 1px solid #3A3A3A; - border-radius: 8px; - } - - /* BUTTONS */ - QPushButton { - background-color: #2D2D2D; - border: 1px solid #3A3A3A; - border-radius: 4px; - padding: 6px 12px; - border-bottom: 1px solid #505050; /* Leichter 3D Effekt */ - } - QPushButton:hover { - background-color: #3A3A3A; /* Hover Layer */ - } - QPushButton:pressed { - background-color: #1F1F1F; - color: #D0D0D0; - } - /* Accent Button (Primary) */ - QPushButton#PrimaryButton { - background-color: #60CDFF; - color: #000000; - border: 1px solid #60CDFF; - } - QPushButton#PrimaryButton:hover { - background-color: #70D5FF; - } - QPushButton#PrimaryButton:pressed { - background-color: #50B0DD; - } - - /* INPUT FIELDS */ - QLineEdit { - background-color: #2D2D2D; - border: 1px solid #3A3A3A; - border-radius: 4px; - padding: 5px; - border-bottom: 2px solid #505050; /* Focus indicator line hint */ - selection-background-color: #60CDFF; - selection-color: #000000; - } - QLineEdit:focus { - background-color: #1F1F1F; - border-bottom: 2px solid #60CDFF; /* Active highlight */ - } - - /* LABELS */ - QLabel#Title { - font-size: 18pt; - font-weight: bold; - } - QLabel#Subtitle { - font-size: 10pt; - color: #A0A0A0; - } - - /* PROGRESS BAR */ - QProgressBar { - border: none; - background-color: #3A3A3A; - border-radius: 2px; - height: 4px; - text-align: center; - } - QProgressBar::chunk { - background-color: #60CDFF; - border-radius: 2px; - } - )"); -} - -// Eine "Card" Komponente (wiederverwendbar) -class FluentCard : public QFrame { -public: - FluentCard(const QString &title, const QString &value) { - setObjectName("Card"); // Für Stylesheet - QVBoxLayout *layout = new QVBoxLayout(this); - - QLabel *lblTitle = new QLabel(title); - lblTitle->setObjectName("Subtitle"); - - QLabel *lblValue = new QLabel(value); - lblValue->setStyleSheet("font-size: 24pt; font-weight: 300;"); - - layout->addWidget(lblTitle); - layout->addWidget(lblValue); - layout->addStretch(); - } -}; - -int main(int argc, char *argv[]) { - QApplication app(argc, argv); - - // Theme anwenden - applyFluentDarkTheme(app); - - // Hauptfenster - QWidget window; - window.setWindowTitle("Fluent Dark Mode Demo"); - window.resize(800, 500); - - // Layouts - QVBoxLayout *mainLayout = new QVBoxLayout(&window); - mainLayout->setContentsMargins(24, 24, 24, 24); - mainLayout->setSpacing(20); - - // Header - QLabel *header = new QLabel("Dashboard"); - header->setObjectName("Title"); - mainLayout->addWidget(header); - - // Content Area (Grid aus Cards) - QHBoxLayout *cardsLayout = new QHBoxLayout(); - cardsLayout->setSpacing(12); - - cardsLayout->addWidget(new FluentCard("CPU Temp", "42.5 °C")); - cardsLayout->addWidget(new FluentCard("Memory", "1.2 GB")); - cardsLayout->addWidget(new FluentCard("Network", "12 Mb/s")); - - mainLayout->addLayout(cardsLayout); - - // Controls Area (Card für Settings) - QFrame *controlsCard = new QFrame(); - controlsCard->setObjectName("Card"); - QVBoxLayout *controlsLayout = new QVBoxLayout(controlsCard); - - QLabel *lblSettings = new QLabel("System Settings"); - lblSettings->setStyleSheet("font-size: 14pt; font-weight: bold; margin-bottom: 10px;"); - controlsLayout->addWidget(lblSettings); - - // Input Row - QHBoxLayout *inputRow = new QHBoxLayout(); - QLineEdit *edit = new QLineEdit(); - edit->setPlaceholderText("Enter Device Name..."); - QPushButton *btnApply = new QPushButton("Apply"); - btnApply->setObjectName("PrimaryButton"); // Accent Color! - - inputRow->addWidget(edit); - inputRow->addWidget(btnApply); - controlsLayout->addLayout(inputRow); - - // Progress Bar - controlsLayout->addSpacing(10); - QLabel *lblProgress = new QLabel("Processing..."); - lblProgress->setObjectName("Subtitle"); - controlsLayout->addWidget(lblProgress); - - QProgressBar *progress = new QProgressBar(); - progress->setValue(75); - progress->setTextVisible(false); // Fluent Bars haben meist keinen Text - controlsLayout->addWidget(progress); - - mainLayout->addWidget(controlsCard); - mainLayout->addStretch(); // Schiebt alles nach oben - - window.show(); - return app.exec(); -} diff --git a/doc/gem_fluend_dark/mainwindow.cpp b/doc/gem_fluend_dark/mainwindow.cpp deleted file mode 100644 index ffc1962..0000000 --- a/doc/gem_fluend_dark/mainwindow.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "mainwindow.h" - -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent) -{ - setupUi(this); -} - -MainWindow::~MainWindow() {} diff --git a/doc/gem_fluend_dark/mainwindow.h b/doc/gem_fluend_dark/mainwindow.h deleted file mode 100644 index 3c2e413..0000000 --- a/doc/gem_fluend_dark/mainwindow.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include "ui_mainwindow.h" - -#include - -class MainWindow : public QMainWindow, private Ui::MainWindow -{ - Q_OBJECT - -public: - MainWindow(QWidget *parent = nullptr); - ~MainWindow(); -}; -#endif // MAINWINDOW_H diff --git a/doc/gem_fluend_dark/mainwindow.ui b/doc/gem_fluend_dark/mainwindow.ui deleted file mode 100644 index becc91c..0000000 --- a/doc/gem_fluend_dark/mainwindow.ui +++ /dev/null @@ -1,31 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 800 - 600 - - - - MainWindow - - - - - - 0 - 0 - 800 - 18 - - - - - - - - diff --git a/doc/gemini_fluent_light/.qtcreator/gemini_fluent_light.pro.user b/doc/gemini_fluent_light/.qtcreator/gemini_fluent_light.pro.user deleted file mode 100644 index a09e5c9..0000000 --- a/doc/gemini_fluent_light/.qtcreator/gemini_fluent_light.pro.user +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - EnvironmentId - {350f6538-4791-42f9-b43d-6ea1a7b22b7b} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - true - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 1 - 80 - true - true - 1 - 0 - false - true - false - 2 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - false - - - 0 - true - - true - true - Builtin.DefaultTidyAndClazy - 16 - true - - - - true - - 0 - - - - ProjectExplorer.Project.Target.0 - - Desktop - true - Desktop Qt 6.10.1 MinGW 64-bit - Desktop Qt 6.10.1 MinGW 64-bit - qt.qt6.6101.win64_mingw_kit - 0 - 0 - 0 - - 0 - C:\syncMePlease\projects.now\gemini_fluent_light\build\Desktop_Qt_6_10_1_MinGW_64_bit-Debug - C:/syncMePlease/projects.now/gemini_fluent_light/build/Desktop_Qt_6_10_1_MinGW_64_bit-Debug - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph "dwarf,4096" -F 250 - - Qt4ProjectManager.Qt4RunConfiguration: - C:/syncMePlease/projects.now/gemini_fluent_light/gemini_fluent_light.pro - false - - true - true - true - %{RunConfig:Executable:Path} - - 1 - 2 - - 1 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph "dwarf,4096" -F 250 - - Qt4ProjectManager.Qt4RunConfiguration: - C:/syncMePlease/projects.now/gemini_fluent_light/gemini_fluent_light.pro - false - - true - true - true - %{RunConfig:Executable:Path} - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - Version - 22 - - diff --git a/doc/gemini_fluent_light/gemini_fluent_light.pro b/doc/gemini_fluent_light/gemini_fluent_light.pro deleted file mode 100644 index b915c09..0000000 --- a/doc/gemini_fluent_light/gemini_fluent_light.pro +++ /dev/null @@ -1,24 +0,0 @@ -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -CONFIG += c++17 - -# You can make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -SOURCES += \ - main.cpp \ - mainwindow.cpp - -HEADERS += \ - mainwindow.h - -FORMS += \ - mainwindow.ui - -# Default rules for deployment. -qnx: target.path = /tmp/$${TARGET}/bin -else: unix:!android: target.path = /opt/$${TARGET}/bin -!isEmpty(target.path): INSTALLS += target diff --git a/doc/gemini_fluent_light/main.cpp b/doc/gemini_fluent_light/main.cpp deleted file mode 100644 index 4b6ba0d..0000000 --- a/doc/gemini_fluent_light/main.cpp +++ /dev/null @@ -1,228 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// Hilfsfunktion: Setzt die Fluent LIGHT Palette global -void applyFluentLightTheme(QApplication &app) { - // 1. Schriftart setzen - QFont font = app.font(); - font.setFamily("Segoe UI Variable Display"); - if (!QFontDatabase().families().contains("Segoe UI Variable Display")) { - font.setFamily("Segoe UI"); - } - font.setPointSize(10); - app.setFont(font); - - // 2. Die Palette definieren (Light Mode) - QPalette p; - // Window / Background: #F3F3F3 (Mica Alt) - QColor colBackground("#F3F3F3"); - // Surface / Container: #FFFFFF (Solid White) - QColor colSurface("#FFFFFF"); - // Accent: #0078D4 (System Accent Default) - QColor colAccent("#0078D4"); - // Text: Black / Dark Gray - QColor colText("#1A1A1A"); // Fast Schwarz für weicheren Kontrast - QColor colSubText("#5D5D5D"); - - p.setColor(QPalette::Window, colBackground); - p.setColor(QPalette::WindowText, colText); - p.setColor(QPalette::Base, colSurface); - p.setColor(QPalette::AlternateBase, colBackground); - p.setColor(QPalette::ToolTipBase, colSurface); - p.setColor(QPalette::ToolTipText, colText); - p.setColor(QPalette::Text, colText); - p.setColor(QPalette::Button, colSurface); - p.setColor(QPalette::ButtonText, colText); - p.setColor(QPalette::PlaceholderText, colSubText); - p.setColor(QPalette::Highlight, colAccent); - p.setColor(QPalette::HighlightedText, Qt::white); // Weißer Text auf Blau - - app.setPalette(p); - - // 3. Stylesheets für die Details - app.setStyleSheet(R"( - QWidget { - background-color: #F3F3F3; - color: #1A1A1A; - } - - /* CARD / CONTAINER STYLE */ - QFrame#Card { - background-color: #FFFFFF; - border: 1px solid #E5E5E5; /* Subtiler Rand zur Abgrenzung */ - border-radius: 8px; - /* Optional: Qt unterstützt simple Schatten, aber auf Pi teuer. - Der Border reicht hier. */ - } - - /* BUTTONS */ - QPushButton { - background-color: #FFFFFF; - border: 1px solid #D1D1D1; - border-bottom: 1px solid #B0B0B0; /* Tiefe simulieren */ - border-radius: 4px; - padding: 6px 12px; - color: #1A1A1A; - } - QPushButton:hover { - background-color: #FBFBFB; - border: 1px solid #C0C0C0; - } - QPushButton:pressed { - background-color: #F0F0F0; - color: #5D5D5D; - border-bottom: 1px solid #D1D1D1; /* Flach drücken */ - } - - /* Accent Button (Primary) */ - QPushButton#PrimaryButton { - background-color: #0078D4; - color: #FFFFFF; - border: 1px solid #0078D4; - } - QPushButton#PrimaryButton:hover { - background-color: #1084D9; - } - QPushButton#PrimaryButton:pressed { - background-color: #006CC1; - border-color: #006CC1; - } - - /* INPUT FIELDS */ - QLineEdit { - background-color: #FFFFFF; - border: 1px solid #D1D1D1; - border-bottom: 2px solid #8A8A8A; /* Stärkerer Indikator */ - border-radius: 4px; - padding: 5px; - selection-background-color: #0078D4; - selection-color: #FFFFFF; - } - QLineEdit:hover { - background-color: #FDFDFD; - } - QLineEdit:focus { - background-color: #FFFFFF; - border-bottom: 2px solid #0078D4; /* Active highlight */ - } - - /* LABELS */ - QLabel#Title { - font-size: 18pt; - font-weight: bold; - color: #000000; - } - QLabel#Subtitle { - font-size: 10pt; - color: #5D5D5D; - } - - /* PROGRESS BAR */ - QProgressBar { - border: none; - background-color: #E0E0E0; /* Track Color */ - border-radius: 2px; - height: 4px; - text-align: center; - } - QProgressBar::chunk { - background-color: #0078D4; /* Accent Color */ - border-radius: 2px; - } - )"); -} - -// Eine "Card" Komponente (Identisch zum Dark Mode) -class FluentCard : public QFrame { -public: - FluentCard(const QString &title, const QString &value) { - setObjectName("Card"); - QVBoxLayout *layout = new QVBoxLayout(this); - - QLabel *lblTitle = new QLabel(title); - lblTitle->setObjectName("Subtitle"); - - QLabel *lblValue = new QLabel(value); - lblValue->setStyleSheet("font-size: 24pt; font-weight: 300; background: transparent;"); - // Wichtig: background transparent erzwingen, sonst erben Labels manchmal falsche Farbe - - layout->addWidget(lblTitle); - layout->addWidget(lblValue); - layout->addStretch(); - } -}; - -int main(int argc, char *argv[]) { - QApplication app(argc, argv); - - // HIER: Light Theme anwenden - applyFluentLightTheme(app); - - QWidget window; - window.setWindowTitle("Fluent Light Mode Demo"); - window.resize(800, 500); - - QVBoxLayout *mainLayout = new QVBoxLayout(&window); - mainLayout->setContentsMargins(24, 24, 24, 24); - mainLayout->setSpacing(20); - - // Header - QLabel *header = new QLabel("Dashboard"); - header->setObjectName("Title"); - mainLayout->addWidget(header); - - // Content Area - QHBoxLayout *cardsLayout = new QHBoxLayout(); - cardsLayout->setSpacing(12); - - cardsLayout->addWidget(new FluentCard("CPU Temp", "42.5 °C")); - cardsLayout->addWidget(new FluentCard("Memory", "1.2 GB")); - cardsLayout->addWidget(new FluentCard("Network", "12 Mb/s")); - - mainLayout->addLayout(cardsLayout); - - // Controls Area - QFrame *controlsCard = new QFrame(); - controlsCard->setObjectName("Card"); - QVBoxLayout *controlsLayout = new QVBoxLayout(controlsCard); - - QLabel *lblSettings = new QLabel("System Settings"); - lblSettings->setStyleSheet("font-size: 14pt; font-weight: bold; margin-bottom: 10px; background: transparent;"); - controlsLayout->addWidget(lblSettings); - - // Input Row - QHBoxLayout *inputRow = new QHBoxLayout(); - QLineEdit *edit = new QLineEdit(); - edit->setPlaceholderText("Enter Device Name..."); - QPushButton *btnApply = new QPushButton("Apply"); - btnApply->setObjectName("PrimaryButton"); - - inputRow->addWidget(edit); - inputRow->addWidget(btnApply); - controlsLayout->addLayout(inputRow); - - // Progress Bar - controlsLayout->addSpacing(10); - QLabel *lblProgress = new QLabel("Processing..."); - lblProgress->setObjectName("Subtitle"); - controlsLayout->addWidget(lblProgress); - - QProgressBar *progress = new QProgressBar(); - progress->setValue(75); - progress->setTextVisible(false); - controlsLayout->addWidget(progress); - - mainLayout->addWidget(controlsCard); - mainLayout->addStretch(); - - window.show(); - return app.exec(); -} diff --git a/doc/gemini_fluent_light/mainwindow.cpp b/doc/gemini_fluent_light/mainwindow.cpp deleted file mode 100644 index ffc1962..0000000 --- a/doc/gemini_fluent_light/mainwindow.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "mainwindow.h" - -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent) -{ - setupUi(this); -} - -MainWindow::~MainWindow() {} diff --git a/doc/gemini_fluent_light/mainwindow.h b/doc/gemini_fluent_light/mainwindow.h deleted file mode 100644 index 3c2e413..0000000 --- a/doc/gemini_fluent_light/mainwindow.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include "ui_mainwindow.h" - -#include - -class MainWindow : public QMainWindow, private Ui::MainWindow -{ - Q_OBJECT - -public: - MainWindow(QWidget *parent = nullptr); - ~MainWindow(); -}; -#endif // MAINWINDOW_H diff --git a/doc/gemini_fluent_light/mainwindow.ui b/doc/gemini_fluent_light/mainwindow.ui deleted file mode 100644 index becc91c..0000000 --- a/doc/gemini_fluent_light/mainwindow.ui +++ /dev/null @@ -1,31 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 800 - 600 - - - - MainWindow - - - - - - 0 - 0 - 800 - 18 - - - - - - - - diff --git a/doc/gui_test/.gitignore b/doc/gui_test/.gitignore deleted file mode 100644 index aa3808c..0000000 --- a/doc/gui_test/.gitignore +++ /dev/null @@ -1,82 +0,0 @@ -# This file is used to ignore files which are generated -# ---------------------------------------------------------------------------- - -*~ -*.autosave -*.a -*.core -*.moc -*.o -*.obj -*.orig -*.rej -*.so -*.so.* -*_pch.h.cpp -*_resource.rc -*.qm -.#* -*.*# -core -!core/ -tags -.DS_Store -.directory -*.debug -Makefile* -*.prl -*.app -moc_*.cpp -ui_*.h -qrc_*.cpp -Thumbs.db -*.res -*.rc -/.qmake.cache -/.qmake.stash - -# qtcreator generated files -*.pro.user* -*.qbs.user* -CMakeLists.txt.user* - -# xemacs temporary files -*.flc - -# Vim temporary files -.*.swp - -# Visual Studio generated files -*.ib_pdb_index -*.idb -*.ilk -*.pdb -*.sln -*.suo -*.vcproj -*vcproj.*.*.user -*.ncb -*.sdf -*.opensdf -*.vcxproj -*vcxproj.* - -# MinGW generated files -*.Debug -*.Release - -# Python byte code -*.pyc - -# Binaries -# -------- -*.dll -*.exe - -# Directories with generated files -.moc/ -.obj/ -.pch/ -.rcc/ -.uic/ -/build*/ diff --git a/doc/gui_test/dummy_gui.qrc b/doc/gui_test/dummy_gui.qrc deleted file mode 100644 index d5dd23e..0000000 --- a/doc/gui_test/dummy_gui.qrc +++ /dev/null @@ -1,23 +0,0 @@ - - - resources/gui_test.qss - resources/bionx_akku.png - resources/bionx_console.png - resources/bionx_motor.png - resources/connect.png - resources/connected.png - resources/disconnected.png - resources/document-import.png - resources/document-revert.png - resources/document-save.png - resources/document-save-as.png - resources/exit.png - resources/go-first.png - resources/go-jump.png - resources/go-last.png - resources/important.png - resources/restart.png - resources/splash.pdn - resources/splash.png - - diff --git a/doc/gui_test/gui_test.pro b/doc/gui_test/gui_test.pro deleted file mode 100644 index 0e55d7b..0000000 --- a/doc/gui_test/gui_test.pro +++ /dev/null @@ -1,27 +0,0 @@ -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -CONFIG += c++20 - -# You can make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -SOURCES += \ - main.cpp \ - mainwindow.cpp - -HEADERS += \ - mainwindow.h - -FORMS += \ - mainwindow.ui - -# Default rules for deployment. -qnx: target.path = /tmp/$${TARGET}/bin -else: unix:!android: target.path = /opt/$${TARGET}/bin -!isEmpty(target.path): INSTALLS += target - -RESOURCES += \ - dummy_gui.qrc diff --git a/doc/gui_test/main.cpp b/doc/gui_test/main.cpp deleted file mode 100644 index d109f9b..0000000 --- a/doc/gui_test/main.cpp +++ /dev/null @@ -1,40 +0,0 @@ - - -#include "mainwindow.h" - -#include - -#include -#include -#include -#include -#include - -// main.cpp -#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; -} - -int main (int argc, char *argv[]) -{ - QApplication a (argc, argv); - setApplicationStyleSheet( u":gui_test.qss" ); - MainWindow w; - w.show (); - return a.exec (); -} diff --git a/doc/gui_test/mainwindow.cpp b/doc/gui_test/mainwindow.cpp deleted file mode 100644 index 854de27..0000000 --- a/doc/gui_test/mainwindow.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -MainWindow::MainWindow (QWidget *parent) - : QMainWindow (parent) -{ - setupUi (this); - - _toolButtonMotor->setDefaultAction( _actionMotor ); - _toolButtonBattery->setDefaultAction( _actionBattery ); - _toolButtonConsole->setDefaultAction( _actionConsole ); - -} - -MainWindow::~MainWindow () -{ -} diff --git a/doc/gui_test/mainwindow.h b/doc/gui_test/mainwindow.h deleted file mode 100644 index ff10fca..0000000 --- a/doc/gui_test/mainwindow.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include -#include - -class MainWindow : public QMainWindow, public Ui_MainWindow -{ - Q_OBJECT - -public: - - MainWindow (QWidget *parent = nullptr); - ~MainWindow (); - - -}; -#endif // MAINWINDOW_H diff --git a/doc/gui_test/mainwindow.ui b/doc/gui_test/mainwindow.ui deleted file mode 100644 index cb5c93f..0000000 --- a/doc/gui_test/mainwindow.ui +++ /dev/null @@ -1,228 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 800 - 600 - - - - MainWindow - - - - - - - - 0 - 0 - - - - - 150 - 0 - - - - - 150 - 16777215 - - - - - - - - - - - 96 - 96 - - - - ... - - - - 64 - 64 - - - - _buttonGroup - - - - - - - - 96 - 96 - - - - ... - - - - 64 - 64 - - - - _buttonGroup - - - - - - - - 96 - 96 - - - - ... - - - - 64 - 64 - - - - _buttonGroup - - - - - - - - 96 - 96 - - - - ... - - - - 64 - 64 - - - - _buttonGroup - - - - - - - - - - - - - - - - - - - - - - :restart.png:restart.png - - - pimp - - - Pimp my Ride - - - - - - :/bionx_motor.png:/bionx_motor.png - - - motor - - - Show motor settings - - - - - - :/bionx_akku.png:/bionx_akku.png - - - battery - - - Show battery settings - - - - - - :/bionx_console.png:/bionx_console.png - - - console - - - Show console settings - - - - - - :/resources/exit.png:/resources/exit.png - - - Exit - - - Exit - - - - - - :/resources/connected.png:/resources/connected.png - - - connect - - - connect to bike - - - QAction::MenuRole::TextHeuristicRole - - - - - - - - - - - diff --git a/doc/gui_test/resources/96/bottom.png b/doc/gui_test/resources/96/bottom.png deleted file mode 100644 index bf1949d..0000000 Binary files a/doc/gui_test/resources/96/bottom.png and /dev/null differ diff --git a/doc/gui_test/resources/96/browser-download.png b/doc/gui_test/resources/96/browser-download.png deleted file mode 100644 index e29f13e..0000000 Binary files a/doc/gui_test/resources/96/browser-download.png and /dev/null differ diff --git a/doc/gui_test/resources/96/cab_extract.png b/doc/gui_test/resources/96/cab_extract.png deleted file mode 100644 index c266ab8..0000000 Binary files a/doc/gui_test/resources/96/cab_extract.png and /dev/null differ diff --git a/doc/gui_test/resources/96/document-export.png b/doc/gui_test/resources/96/document-export.png deleted file mode 100644 index a48c806..0000000 Binary files a/doc/gui_test/resources/96/document-export.png and /dev/null differ diff --git a/doc/gui_test/resources/96/document-import.png b/doc/gui_test/resources/96/document-import.png deleted file mode 100644 index b74531d..0000000 Binary files a/doc/gui_test/resources/96/document-import.png and /dev/null differ diff --git a/doc/gui_test/resources/96/document-revert.png b/doc/gui_test/resources/96/document-revert.png deleted file mode 100644 index 58e62c1..0000000 Binary files a/doc/gui_test/resources/96/document-revert.png and /dev/null differ diff --git a/doc/gui_test/resources/96/document-save-as.png b/doc/gui_test/resources/96/document-save-as.png deleted file mode 100644 index 67c38ee..0000000 Binary files a/doc/gui_test/resources/96/document-save-as.png and /dev/null differ diff --git a/doc/gui_test/resources/96/document-save.png b/doc/gui_test/resources/96/document-save.png deleted file mode 100644 index e29f13e..0000000 Binary files a/doc/gui_test/resources/96/document-save.png and /dev/null differ diff --git a/doc/gui_test/resources/96/go-jump.png b/doc/gui_test/resources/96/go-jump.png deleted file mode 100644 index dde9987..0000000 Binary files a/doc/gui_test/resources/96/go-jump.png and /dev/null differ diff --git a/doc/gui_test/resources/96/gtk-apply.png b/doc/gui_test/resources/96/gtk-apply.png deleted file mode 100644 index 4d7baf1..0000000 Binary files a/doc/gui_test/resources/96/gtk-apply.png and /dev/null differ diff --git a/doc/gui_test/resources/96/gtk-goto-first-ltr.png b/doc/gui_test/resources/96/gtk-goto-first-ltr.png deleted file mode 100644 index ed710d1..0000000 Binary files a/doc/gui_test/resources/96/gtk-goto-first-ltr.png and /dev/null differ diff --git a/doc/gui_test/resources/96/gtk-goto-last-ltr.png b/doc/gui_test/resources/96/gtk-goto-last-ltr.png deleted file mode 100644 index c337a0b..0000000 Binary files a/doc/gui_test/resources/96/gtk-goto-last-ltr.png and /dev/null differ diff --git a/doc/gui_test/resources/96/gtk-revert-to-saved-ltr.png b/doc/gui_test/resources/96/gtk-revert-to-saved-ltr.png deleted file mode 100644 index 58e62c1..0000000 Binary files a/doc/gui_test/resources/96/gtk-revert-to-saved-ltr.png and /dev/null differ diff --git a/doc/gui_test/resources/96/gtk-revert-to-saved-rtl.png b/doc/gui_test/resources/96/gtk-revert-to-saved-rtl.png deleted file mode 100644 index 58e62c1..0000000 Binary files a/doc/gui_test/resources/96/gtk-revert-to-saved-rtl.png and /dev/null differ diff --git a/doc/gui_test/resources/96/gtk-save.png b/doc/gui_test/resources/96/gtk-save.png deleted file mode 100644 index e29f13e..0000000 Binary files a/doc/gui_test/resources/96/gtk-save.png and /dev/null differ diff --git a/doc/gui_test/resources/96/gtk-undo-ltr.png b/doc/gui_test/resources/96/gtk-undo-ltr.png deleted file mode 100644 index e879b42..0000000 Binary files a/doc/gui_test/resources/96/gtk-undo-ltr.png and /dev/null differ diff --git a/doc/gui_test/resources/96/object-rotate-left.png b/doc/gui_test/resources/96/object-rotate-left.png deleted file mode 100644 index 927abf5..0000000 Binary files a/doc/gui_test/resources/96/object-rotate-left.png and /dev/null differ diff --git a/doc/gui_test/resources/96/object-rotate-right.png b/doc/gui_test/resources/96/object-rotate-right.png deleted file mode 100644 index ab21f3e..0000000 Binary files a/doc/gui_test/resources/96/object-rotate-right.png and /dev/null differ diff --git a/doc/gui_test/resources/96/reload.png b/doc/gui_test/resources/96/reload.png deleted file mode 100644 index 502394b..0000000 Binary files a/doc/gui_test/resources/96/reload.png and /dev/null differ diff --git a/doc/gui_test/resources/96/rotate.png b/doc/gui_test/resources/96/rotate.png deleted file mode 100644 index ab21f3e..0000000 Binary files a/doc/gui_test/resources/96/rotate.png and /dev/null differ diff --git a/doc/gui_test/resources/96/stock_bottom.png b/doc/gui_test/resources/96/stock_bottom.png deleted file mode 100644 index bf1949d..0000000 Binary files a/doc/gui_test/resources/96/stock_bottom.png and /dev/null differ diff --git a/doc/gui_test/resources/96/stock_mail-send-receive.png b/doc/gui_test/resources/96/stock_mail-send-receive.png deleted file mode 100644 index 5be2a73..0000000 Binary files a/doc/gui_test/resources/96/stock_mail-send-receive.png and /dev/null differ diff --git a/doc/gui_test/resources/96/view-refresh96.png b/doc/gui_test/resources/96/view-refresh96.png deleted file mode 100644 index 502394b..0000000 Binary files a/doc/gui_test/resources/96/view-refresh96.png and /dev/null differ diff --git a/doc/gui_test/resources/bikeinfo.xml b/doc/gui_test/resources/bikeinfo.xml deleted file mode 100644 index 202cade..0000000 --- a/doc/gui_test/resources/bikeinfo.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/gui_test/resources/bionx_akku.png b/doc/gui_test/resources/bionx_akku.png deleted file mode 100644 index 8db8b73..0000000 Binary files a/doc/gui_test/resources/bionx_akku.png and /dev/null differ diff --git a/doc/gui_test/resources/bionx_console.png b/doc/gui_test/resources/bionx_console.png deleted file mode 100644 index 024b333..0000000 Binary files a/doc/gui_test/resources/bionx_console.png and /dev/null differ diff --git a/doc/gui_test/resources/bionx_motor.png b/doc/gui_test/resources/bionx_motor.png deleted file mode 100644 index ea1c69f..0000000 Binary files a/doc/gui_test/resources/bionx_motor.png and /dev/null differ diff --git a/doc/gui_test/resources/connect.png b/doc/gui_test/resources/connect.png deleted file mode 100644 index e0c1571..0000000 Binary files a/doc/gui_test/resources/connect.png and /dev/null differ diff --git a/doc/gui_test/resources/connected.png b/doc/gui_test/resources/connected.png deleted file mode 100644 index 43d40b9..0000000 Binary files a/doc/gui_test/resources/connected.png and /dev/null differ diff --git a/doc/gui_test/resources/disconnected.png b/doc/gui_test/resources/disconnected.png deleted file mode 100644 index 6a7e035..0000000 Binary files a/doc/gui_test/resources/disconnected.png and /dev/null differ diff --git a/doc/gui_test/resources/document-import.png b/doc/gui_test/resources/document-import.png deleted file mode 100644 index 662b134..0000000 Binary files a/doc/gui_test/resources/document-import.png and /dev/null differ diff --git a/doc/gui_test/resources/document-revert.png b/doc/gui_test/resources/document-revert.png deleted file mode 100644 index fb38bd5..0000000 Binary files a/doc/gui_test/resources/document-revert.png and /dev/null differ diff --git a/doc/gui_test/resources/document-save-as.png b/doc/gui_test/resources/document-save-as.png deleted file mode 100644 index 3f4641f..0000000 Binary files a/doc/gui_test/resources/document-save-as.png and /dev/null differ diff --git a/doc/gui_test/resources/document-save.png b/doc/gui_test/resources/document-save.png deleted file mode 100644 index f412793..0000000 Binary files a/doc/gui_test/resources/document-save.png and /dev/null differ diff --git a/doc/gui_test/resources/exit.png b/doc/gui_test/resources/exit.png deleted file mode 100644 index 8f2d4e6..0000000 Binary files a/doc/gui_test/resources/exit.png and /dev/null differ diff --git a/doc/gui_test/resources/go-first.png b/doc/gui_test/resources/go-first.png deleted file mode 100644 index c271161..0000000 Binary files a/doc/gui_test/resources/go-first.png and /dev/null differ diff --git a/doc/gui_test/resources/go-jump.png b/doc/gui_test/resources/go-jump.png deleted file mode 100644 index e2002d6..0000000 Binary files a/doc/gui_test/resources/go-jump.png and /dev/null differ diff --git a/doc/gui_test/resources/go-last.png b/doc/gui_test/resources/go-last.png deleted file mode 100644 index 85ed476..0000000 Binary files a/doc/gui_test/resources/go-last.png and /dev/null differ diff --git a/doc/gui_test/resources/gui_test.qss b/doc/gui_test/resources/gui_test.qss deleted file mode 100644 index 7b0203f..0000000 --- a/doc/gui_test/resources/gui_test.qss +++ /dev/null @@ -1,137 +0,0 @@ -/* appqss */ - -/* Alle QWidgets bekommen diesen Font */ -QWidget -{ - font-size: 14px; - font-family: Segoe UI, sans-serif; -} - -QMainWindow -{ - background-color: white; -} - -/* Style für _buttonWidget */ -#_buttonWidget { - background-color: #e0e0e0; - border: 1px solid #b0b0b0; - border-radius: 8px; -} - -/* Style für _stackedWidget */ -#_stackedWidget { - background-color: #e0e0e0; - border: 1px solid #b0b0b0; - border-radius: 8px; -} - -/* 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; -} - -/* Normal */ -QToolButton { - background-color: transparent; - border: 1px solid transparent; - border-radius: 4px; - padding: 4px; -} - -/* Hover */ -QToolButton:hover { - background-color: #E3F2FD; - border: 1px solid #2196F3; -} - -/* Pressed/Clicked */ -QToolButton:pressed { - background-color: #BBDEFB; -} - -/* Checked (bei checkable buttons) */ -QToolButton:checked { - background-color: #2196F3; - color: white; -} - -/* Checked + Hover */ -QToolButton:checked:hover { - background-color: #1976D2; -} - -/* Disabled */ -QToolButton:disabled { - color: #BDBDBD; - background-color: transparent; -} - -/* Styling anhand von Objektnamen (ID) */ -#loginButton -{ - font-weight: bold; - background-color: green; -} - -QListView -{ - background-color: #404142; - border-radius: 8px; - outline: none; - show-decoration-selected: 0; -} - -QListView::item -{ - border: 2px solid #2196F3; - border-radius: 8px; - padding: 8px; - margin: 4px; - background-color: white; -} - -QListView::item:hover -{ - border-color: #FF9800; - background-color: #fff8f0; -} - -QListView::item:selected -{ - border-color: #F44336; /* Roter Rahmen */ - background-color: #ffebee; -} - -QListView::item:selected:hover -{ - border-color: #FF9800; - background-color: #ffe0b2; -} - -QListView::item:focus -{ -/* -// outline: none; Entfernt das Focus-Rectangle -// border-color: green; -// background-color: #ffe0b2; -*/ - border: 2px solid gray; - border-style: inset; - background-color: white; - color: black; -} diff --git a/doc/gui_test/resources/important.png b/doc/gui_test/resources/important.png deleted file mode 100644 index f162ee5..0000000 Binary files a/doc/gui_test/resources/important.png and /dev/null differ diff --git a/doc/gui_test/resources/restart.png b/doc/gui_test/resources/restart.png deleted file mode 100644 index 2136f49..0000000 Binary files a/doc/gui_test/resources/restart.png and /dev/null differ diff --git a/doc/gui_test/resources/splash.pdn b/doc/gui_test/resources/splash.pdn deleted file mode 100644 index 88e2808..0000000 Binary files a/doc/gui_test/resources/splash.pdn and /dev/null differ diff --git a/doc/gui_test/resources/splash.png b/doc/gui_test/resources/splash.png deleted file mode 100644 index ca74553..0000000 Binary files a/doc/gui_test/resources/splash.png and /dev/null differ diff --git a/doc/material_dummy/.qtcreator/material_dummy.pro.user b/doc/material_dummy/.qtcreator/material_dummy.pro.user deleted file mode 100644 index 9ae5e20..0000000 --- a/doc/material_dummy/.qtcreator/material_dummy.pro.user +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - EnvironmentId - {350f6538-4791-42f9-b43d-6ea1a7b22b7b} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - true - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 0 - 80 - true - true - 1 - 0 - false - true - false - 2 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - false - - - 0 - true - - true - true - Builtin.DefaultTidyAndClazy - 16 - true - - - - true - - 0 - - - - ProjectExplorer.Project.Target.0 - - Desktop - true - Desktop Qt 6.10.1 MinGW 64-bit - Desktop Qt 6.10.1 MinGW 64-bit - qt.qt6.6101.win64_mingw_kit - 0 - 0 - 0 - - 0 - C:\syncMePlease\projects.now\material_dummy\build\Desktop_Qt_6_10_1_MinGW_64_bit-Debug - C:/syncMePlease/projects.now/material_dummy/build/Desktop_Qt_6_10_1_MinGW_64_bit-Debug - - - true - QtProjectManager.QMakeBuildStep - true - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph "dwarf,4096" -F 250 - - Qt4ProjectManager.Qt4RunConfiguration: - C:/syncMePlease/projects.now/BionxControl/doc/material_dummy/material_dummy.pro - false - - true - true - true - %{RunConfig:Executable:Path} - - 1 - 2 - - 1 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph "dwarf,4096" -F 250 - - Qt4ProjectManager.Qt4RunConfiguration: - C:/syncMePlease/projects.now/BionxControl/doc/material_dummy/material_dummy.pro - false - - true - true - true - %{RunConfig:Executable:Path} - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - Version - 22 - - diff --git a/doc/material_dummy/main.cpp b/doc/material_dummy/main.cpp deleted file mode 100644 index c4e5ba8..0000000 --- a/doc/material_dummy/main.cpp +++ /dev/null @@ -1,307 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "mainwindow.h" -#include "sliderdelegate.h" - - -// Fluent Design Demo Widget -class FluentWidgetDemo : public QWidget { -public: - FluentWidgetDemo() { - setWindowTitle("Fluent Design System - Windows 11"); - resize(600, 500); - - // Acrylic-like background - setStyleSheet(R"( - QWidget { - background-color: #F3F3F3; - font-family: 'Segoe UI Variable', 'Segoe UI', sans-serif; - } - )"); - - auto* mainLayout = new QVBoxLayout(this); - mainLayout->setSpacing(20); - mainLayout->setContentsMargins(32, 32, 32, 32); - - // Title - auto* title = new QLabel("Fluent Design System"); - title->setStyleSheet(R"( - font-size: 28px; - font-weight: 600; - color: #201F1E; - margin-bottom: 8px; - )"); - mainLayout->addWidget(title); - - auto* subtitle = new QLabel("Windows 11 Style Components"); - subtitle->setStyleSheet("font-size: 14px; color: #605E5C;"); - mainLayout->addWidget(subtitle); - - // Text Input - auto* inputLabel = new QLabel("Text Input"); - inputLabel->setStyleSheet("font-size: 12px; color: #323130; font-weight: 600;"); - mainLayout->addWidget(inputLabel); - - auto* input = new QLineEdit(); - input->setPlaceholderText("Enter text here..."); - applyFluentInput(input); - mainLayout->addWidget(input); - - // Slider Section - auto* sliderLabel = new QLabel("Sliders"); - sliderLabel->setStyleSheet("font-size: 12px; color: #323130; font-weight: 600; margin-top: 8px;"); - mainLayout->addWidget(sliderLabel); - - auto* valueLabel = new QLabel("Volume: 50"); - valueLabel->setStyleSheet("font-size: 14px; color: #605E5C;"); - mainLayout->addWidget(valueLabel); - - auto* hSlider = new QSlider(Qt::Horizontal); - hSlider->setRange(0, 100); - hSlider->setValue(50); - hSlider->setStyle(new FluentSliderStyle()); - hSlider->setMinimumHeight(32); // Genug Platz für Handle - mainLayout->addWidget(hSlider); - - connect(hSlider, &QSlider::valueChanged, [valueLabel](int value) { - valueLabel->setText(QString("Volume: %1").arg(value)); - }); - - // Checkbox - auto* checkLabel = new QLabel("Checkbox"); - checkLabel->setStyleSheet("font-size: 12px; color: #323130; font-weight: 600; margin-top: 8px;"); - mainLayout->addWidget(checkLabel); - - auto* checkbox = new QCheckBox("Enable feature"); - applyFluentCheckbox(checkbox); - mainLayout->addWidget(checkbox); - - // Buttons Section - auto* btnLabel = new QLabel("Buttons"); - btnLabel->setStyleSheet("font-size: 12px; color: #323130; font-weight: 600; margin-top: 8px;"); - mainLayout->addWidget(btnLabel); - - auto* btnLayout = new QHBoxLayout(); - btnLayout->setSpacing(12); - - auto* primaryBtn = new QPushButton("Primary"); - applyFluentButton(primaryBtn, ButtonType::Primary); - btnLayout->addWidget(primaryBtn); - - auto* secondaryBtn = new QPushButton("Secondary"); - applyFluentButton(secondaryBtn, ButtonType::Secondary); - btnLayout->addWidget(secondaryBtn); - - auto* subtleBtn = new QPushButton("Subtle"); - applyFluentButton(subtleBtn, ButtonType::Subtle); - btnLayout->addWidget(subtleBtn); - - btnLayout->addStretch(); - mainLayout->addLayout(btnLayout); - - // Vertical Sliders - auto* vLabel = new QLabel("Equalizer"); - vLabel->setStyleSheet("font-size: 12px; color: #323130; font-weight: 600; margin-top: 8px;"); - mainLayout->addWidget(vLabel); - - auto* vLayout = new QHBoxLayout(); - vLayout->setSpacing(24); - - for (int i = 0; i < 5; ++i) { - auto* vSlider = new QSlider(Qt::Vertical); - vSlider->setRange(0, 100); - vSlider->setValue(20 + i * 15); - vSlider->setStyle(new FluentSliderStyle()); - vSlider->setMinimumHeight(120); - vSlider->setMinimumWidth(32); // Genug Platz für Handle - vLayout->addWidget(vSlider); - } - vLayout->addStretch(); - - mainLayout->addLayout(vLayout); - mainLayout->addStretch(); - } - -private: - enum class ButtonType { - Primary, - Secondary, - Subtle - }; - - void applyFluentButton(QPushButton* btn, ButtonType type) { - QString baseStyle = R"( - QPushButton { - background-color: %1; - color: %2; - border: %3; - border-radius: 4px; - padding: 5px 12px; - font-size: 14px; - min-height: 32px; - } - QPushButton:hover { - background-color: %4; - border: %5; - } - QPushButton:pressed { - background-color: %6; - border: %7; - } - QPushButton:disabled { - background-color: #F3F2F1; - color: #A19F9D; - border: 1px solid #EDEBE9; - } - )"; - - switch (type) { - case ButtonType::Primary: - btn->setStyleSheet(baseStyle - .arg("#0078D4") // bg - .arg("white") // text - .arg("none") // border - .arg("#106EBE") // hover bg - .arg("none") // hover border - .arg("#005A9E") // pressed bg - .arg("none") // pressed border - ); - break; - - case ButtonType::Secondary: - btn->setStyleSheet(baseStyle - .arg("white") // bg - .arg("#201F1E") // text - .arg("1px solid #8A8886") // border - .arg("#F3F2F1") // hover bg - .arg("1px solid #323130") // hover border - .arg("#EDEBE9") // pressed bg - .arg("1px solid #201F1E") // pressed border - ); - break; - - case ButtonType::Subtle: - btn->setStyleSheet(baseStyle - .arg("transparent") // bg - .arg("#201F1E") // text - .arg("none") // border - .arg("#F3F2F1") // hover bg - .arg("none") // hover border - .arg("#EDEBE9") // pressed bg - .arg("none") // pressed border - ); - break; - } - - // Subtle shadow for elevation - if (type == ButtonType::Primary) { - auto* shadow = new QGraphicsDropShadowEffect(); - shadow->setBlurRadius(4); - shadow->setColor(QColor(0, 0, 0, 40)); - shadow->setOffset(0, 1); - btn->setGraphicsEffect(shadow); - } - } - - void applyFluentInput(QLineEdit* input) { - input->setStyleSheet(R"( - QLineEdit { - border: 1px solid #8A8886; - border-radius: 4px; - padding: 6px 10px; - background-color: white; - font-size: 14px; - color: #201F1E; - min-height: 32px; - } - QLineEdit:hover { - border: 1px solid #323130; - } - QLineEdit:focus { - border: 2px solid #0078D4; - padding: 5px 9px; - } - QLineEdit:disabled { - background-color: #F3F2F1; - border: 1px solid #EDEBE9; - color: #A19F9D; - } - )"); - } - - void applyFluentCheckbox(QCheckBox* checkbox) { - checkbox->setStyleSheet(R"( - QCheckBox { - spacing: 8px; - font-size: 14px; - color: #201F1E; - } - QCheckBox::indicator { - width: 20px; - height: 20px; - border: 1px solid #8A8886; - border-radius: 4px; - background-color: white; - } - QCheckBox::indicator:hover { - border: 1px solid #323130; - background-color: #F3F2F1; - } - QCheckBox::indicator:checked { - background-color: #0078D4; - border: 1px solid #0078D4; - } - QCheckBox::indicator:checked:hover { - background-color: #106EBE; - border: 1px solid #106EBE; - } - QCheckBox::indicator:disabled { - background-color: #F3F2F1; - border: 1px solid #C8C6C4; - } - )"); - } -}; - - - - - - - -//#include "main.moc" // Wichtig für Q_OBJECT in .cpp Datei - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - -// Segoe UI is default on Windows -#ifdef Q_OS_WIN - QFont font("Segoe UI Variable", 10); -#else - QFont font("Segoe UI", 10); -#endif - app.setFont(font); - - TableViewDemo demo; - demo.show(); - - - FluentWidgetDemo fdemo; - fdemo.show(); - return app.exec(); -} - - diff --git a/doc/material_dummy/mainwindow.cpp b/doc/material_dummy/mainwindow.cpp deleted file mode 100644 index 139597f..0000000 --- a/doc/material_dummy/mainwindow.cpp +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/doc/material_dummy/mainwindow.h b/doc/material_dummy/mainwindow.h deleted file mode 100644 index 806d852..0000000 --- a/doc/material_dummy/mainwindow.h +++ /dev/null @@ -1,148 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -class TableViewDemo : public QWidget -{ -public: - TableViewDemo() - { - setWindowTitle("QTableView mit QSlider Editor"); - resize(700, 400); - - auto* layout = new QVBoxLayout(this); - - // Model erstellen (3 Spalten, 10 Zeilen) - auto* model = new QStandardItemModel(10, 2, this); - - // Header setzen - model->setHorizontalHeaderLabels({"Name", "Wert"}); - - // Daten einfügen - for (int row = 0; row < 10; ++row) - { - auto* nameItem = new QStandardItem(QString("Eintrag %1").arg(row + 1)); - auto* valueItem = new QStandardItem(); - - // Wert-Item editierbar machen - valueItem->setData(row * 10, Qt::EditRole); // Startwert 0-90 - valueItem->setEditable(true); - - // Andere nicht editierbar - nameItem->setEditable(false); - - - model->setItem(row, 0, nameItem); - model->setItem(row, 1, valueItem); - } - - // TableView erstellen - auto* tableView = new QTableView(); - tableView->setModel(model); - - // === SLIDER DELEGATE für Spalte 2 === - //auto* sliderDelegate = new SliderDelegate(this); - //tableView->setItemDelegateForColumn(1, sliderDelegate); - - tableView->setAlternatingRowColors(false); - // === LINIEN ENTFERNEN === - tableView->setShowGrid(false); - - // Header Style - tableView->horizontalHeader()->setStyleSheet(R"( - QHeaderView::section { - background-color: #F5F5F5; - padding: 10px; - border: none; - font-weight: bold; - color: #333; - } - )"); - - - - // Vertikaler Header ausblenden - tableView->verticalHeader()->setVisible(false); - - // Alternating Row Colors - //tableView->setAlternatingRowColors(true); - - // Style für TableView - tableView->setStyleSheet(R"( - QTableView - { - background-color: white; - border: none; - selection-background-color: #E3F2FD; - selection-color: black; - } - QTableView::item - { - padding: 10px; - border: none; - } - QTableView::item:selected { - background-color: #E3F2FD; - border: 1px solid #0078D4; /* Rahmen um JEDE Zelle */ - } - - } - )"); - - - // Spaltenbreite - tableView->setColumnWidth(0, 50); - tableView->setColumnWidth(1, 150); - tableView->horizontalHeader()->setStretchLastSection(true); - - // Row Height für bessere Slider-Darstellung - tableView->verticalHeader()->setDefaultSectionSize(40); - - // Selection - tableView->setSelectionBehavior(QAbstractItemView::SelectRows); - //tableView->setSelectionMode(QAbstractItemView::SingleSelection); - - // Edit Trigger - Klick zum Editieren - tableView->setEditTriggers(QAbstractItemView::DoubleClicked | - QAbstractItemView::SelectedClicked); - - layout->addWidget(tableView); - - // Signal für Änderungen - connect(model, &QStandardItemModel::dataChanged, this, - [](const QModelIndex& topLeft, const QModelIndex& bottomRight) { - if (topLeft.column() ==1) { - int row = topLeft.row(); - int value = topLeft.data(Qt::DisplayRole).toInt(); - qDebug() << "Zeile" << row << "wurde auf" << value << "gesetzt"; - } - }); - } -}; - -#endif // MAINWINDOW_H diff --git a/doc/material_dummy/mainwindow.ui b/doc/material_dummy/mainwindow.ui deleted file mode 100644 index becc91c..0000000 --- a/doc/material_dummy/mainwindow.ui +++ /dev/null @@ -1,31 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 800 - 600 - - - - MainWindow - - - - - - 0 - 0 - 800 - 18 - - - - - - - - diff --git a/doc/material_dummy/material_dummy.pro b/doc/material_dummy/material_dummy.pro deleted file mode 100644 index 28cc06e..0000000 --- a/doc/material_dummy/material_dummy.pro +++ /dev/null @@ -1,25 +0,0 @@ -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -CONFIG += c++17 - -# You can make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -SOURCES += \ - main.cpp \ - mainwindow.cpp - -HEADERS += \ - mainwindow.h \ - sliderdelegate.h - -FORMS += \ - mainwindow.ui - -# Default rules for deployment. -qnx: target.path = /tmp/$${TARGET}/bin -else: unix:!android: target.path = /opt/$${TARGET}/bin -!isEmpty(target.path): INSTALLS += target diff --git a/doc/material_dummy/sliderdelegate.h b/doc/material_dummy/sliderdelegate.h deleted file mode 100644 index 7df834a..0000000 --- a/doc/material_dummy/sliderdelegate.h +++ /dev/null @@ -1,355 +0,0 @@ -#ifndef SLIDERDELEGATE_H -#define SLIDERDELEGATE_H - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// Custom Delegate für QSlider in Spalte 3 - - -// Fluent Design Slider Style -class FluentSliderStyle : public QProxyStyle -{ -public: - - FluentSliderStyle() - : QProxyStyle() - {} - - // Wichtig: Genug Platz für Handle reservieren - int pixelMetric(PixelMetric metric, const QStyleOption* option = nullptr, const QWidget* widget = nullptr) const override - { - switch (metric) - { - case PM_SliderThickness: - return 32; // Höhe für horizontalen Slider - case PM_SliderLength: - return 20; // Handle-Größe - case PM_SliderControlThickness: - return 20; - case PM_SliderSpaceAvailable: - if (option) - { - if (const QStyleOptionSlider* sliderOpt = qstyleoption_cast(option)) { - if (sliderOpt->orientation == Qt::Horizontal) { - return sliderOpt->rect.width() - 20; - } else { - return sliderOpt->rect.height() - 20; - } - } - } - return QProxyStyle::pixelMetric(metric, option, widget); - - default: - return QProxyStyle::pixelMetric(metric, option, widget); - } - } - - QRect subControlRect(ComplexControl cc, const QStyleOptionComplex* opt,SubControl sc, const QWidget* widget) const override - { - if (cc == CC_Slider) { - if (const QStyleOptionSlider* slider = qstyleoption_cast(opt)) { - QRect rect = slider->rect; - int handleSize = 20; - - if (sc == SC_SliderHandle) { - // Handle Position korrekt berechnen - if (slider->orientation == Qt::Horizontal) { - int range = slider->maximum - slider->minimum; - int pos = slider->sliderPosition - slider->minimum; - int pixelRange = rect.width() - handleSize; - int pixelPos = (range != 0) ? (pos * pixelRange) / range : 0; - - return QRect(rect.x() + pixelPos, - rect.center().y() - handleSize / 2, - handleSize, handleSize); - } else { - int range = slider->maximum - slider->minimum; - int pos = slider->sliderPosition - slider->minimum; - int pixelRange = rect.height() - handleSize; - int pixelPos = (range != 0) ? (pos * pixelRange) / range : 0; - - return QRect(rect.center().x() - handleSize / 2, - rect.bottom() - pixelPos - handleSize, - handleSize, handleSize); - } - } - } - } - return QProxyStyle::subControlRect(cc, opt, sc, widget); - } - - void drawComplexControl(ComplexControl control, const QStyleOptionComplex* option, QPainter* painter, const QWidget* widget) const override - { - if (control == CC_Slider) - { - if (const QStyleOptionSlider* slider = qstyleoption_cast(option)) { - painter->setRenderHint(QPainter::Antialiasing); - - // Fluent Colors - QColor accentColor(0, 120, 212); // #0078D4 - QColor inactiveColor(138, 136, 134); // #8A8886 - QColor bgColor(255, 255, 255); // White background - - if (slider->orientation == Qt::Horizontal) { - drawHorizontalFluentSlider(painter, slider, accentColor, inactiveColor, bgColor); - } else { - drawVerticalFluentSlider(painter, slider, accentColor, inactiveColor, bgColor); - } - return; - } - } - QProxyStyle::drawComplexControl(control, option, painter, widget); - } - -private: - - void drawHorizontalFluentSlider(QPainter* painter, const QStyleOptionSlider* slider, - const QColor& activeColor, const QColor& inactiveColor, - const QColor& bgColor) const { - QRect groove = slider->rect; - QRect handle = subControlRect(CC_Slider, slider, SC_SliderHandle, nullptr); - - int grooveHeight = 4; - // Track sollte im Widget-Zentrum sein, nicht im groove-Zentrum - int grooveY = slider->rect.center().y() - grooveHeight / 2; - - // Full background track - QRect fullTrack(groove.left(), grooveY, groove.width(), grooveHeight); - painter->setPen(Qt::NoPen); - painter->setBrush(inactiveColor.lighter(150)); - painter->drawRoundedRect(fullTrack, grooveHeight / 2, grooveHeight / 2); - - // Active track (filled portion) - int activeWidth = handle.center().x() - groove.left(); - QRect activeTrack(groove.left(), grooveY, activeWidth, grooveHeight); - painter->setBrush(activeColor); - painter->drawRoundedRect(activeTrack, grooveHeight / 2, grooveHeight / 2); - - // Handle (Thumb) - Fluent style is more subtle - int handleSize = 20; - QRect thumbRect(handle.center().x() - handleSize / 2, - handle.center().y() - handleSize / 2, - handleSize, handleSize); - - // Hover effect - subtle glow - if (slider->state & State_MouseOver) { - painter->setBrush(QColor(activeColor.red(), activeColor.green(), - activeColor.blue(), 30)); - int glowSize = 32; - QRect glow(handle.center().x() - glowSize / 2, - handle.center().y() - glowSize / 2, - glowSize, glowSize); - painter->drawEllipse(glow); - } - - // Thumb - painter->setBrush(bgColor); - painter->setPen(QPen(activeColor, 2)); - painter->drawEllipse(thumbRect); - - // Inner circle for pressed state - if (slider->state & State_Sunken) { - int innerSize = 8; - QRect inner(handle.center().x() - innerSize / 2, - handle.center().y() - innerSize / 2, - innerSize, innerSize); - painter->setPen(Qt::NoPen); - painter->setBrush(activeColor); - painter->drawEllipse(inner); - } - } - - void drawVerticalFluentSlider(QPainter* painter, const QStyleOptionSlider* slider, - const QColor& activeColor, const QColor& inactiveColor, - const QColor& bgColor) const { - QRect groove = slider->rect; - QRect handle = subControlRect(CC_Slider, slider, SC_SliderHandle, nullptr); - - int grooveWidth = 4; - // Track sollte im Widget-Zentrum sein - int grooveX = slider->rect.center().x() - grooveWidth / 2; - - // Full background track - QRect fullTrack(grooveX, groove.top(), grooveWidth, groove.height()); - painter->setPen(Qt::NoPen); - painter->setBrush(inactiveColor.lighter(150)); - painter->drawRoundedRect(fullTrack, grooveWidth / 2, grooveWidth / 2); - - // Active track - int activeHeight = groove.bottom() - handle.center().y(); - QRect activeTrack(grooveX, handle.center().y(), grooveWidth, activeHeight); - painter->setBrush(activeColor); - painter->drawRoundedRect(activeTrack, grooveWidth / 2, grooveWidth / 2); - - // Handle - int handleSize = 20; - QRect thumbRect(handle.center().x() - handleSize / 2, - handle.center().y() - handleSize / 2, - handleSize, handleSize); - - if (slider->state & State_MouseOver) { - painter->setBrush(QColor(activeColor.red(), activeColor.green(), - activeColor.blue(), 30)); - int glowSize = 32; - QRect glow(handle.center().x() - glowSize / 2, - handle.center().y() - glowSize / 2, - glowSize, glowSize); - painter->drawEllipse(glow); - } - - painter->setBrush(bgColor); - painter->setPen(QPen(activeColor, 2)); - painter->drawEllipse(thumbRect); - - if (slider->state & State_Sunken) { - int innerSize = 8; - QRect inner(handle.center().x() - innerSize / 2, - handle.center().y() - innerSize / 2, - innerSize, innerSize); - painter->setPen(Qt::NoPen); - painter->setBrush(activeColor); - painter->drawEllipse(inner); - } - } -}; - -class SliderDelegate : public QStyledItemDelegate -{ - Q_OBJECT - -public: - SliderDelegate(QObject* parent = nullptr) - : QStyledItemDelegate(parent) - {} - - // Editor erstellen (QSlider) - QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option,const QModelIndex& index) const override - { - Q_UNUSED(option) - Q_UNUSED(index) - - auto* slider = new QSlider(Qt::Horizontal, parent); - slider->setRange(0, 100); - slider->setSingleStep(1); - slider->setPageStep(10); -slider->setStyle(new FluentSliderStyle()); - // Signal für sofortige Updates - connect(slider, &QSlider::valueChanged, this, [this, slider]() { - // Commit data sofort bei Änderung - emit const_cast(this)->commitData(slider); - }); - - return slider; - } - - // Editor mit aktuellem Wert füllen - void setEditorData(QWidget* editor, const QModelIndex& index) const override { - int value = index.model()->data(index, Qt::EditRole).toInt(); - auto* slider = static_cast(editor); - slider->setValue(value); - } - - // Wert vom Editor ins Model schreiben - void setModelData(QWidget* editor, QAbstractItemModel* model, - const QModelIndex& index) const override { - auto* slider = static_cast(editor); - int value = slider->value(); - model->setData(index, value, Qt::EditRole); - } - - // Editor-Geometrie (wichtig für korrekte Positionierung) - void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, - const QModelIndex& index) const override { - Q_UNUSED(index) - /* - QRect barRect = option.rect.adjusted(option.rect.width() - 55, - option.rect.height() / 2 - 2, - -8, - -option.rect.height() / 2 + 2); - */ - QRect sliderRect = option.rect.adjusted( - option.rect.width() - 115, // Von rechts: 115px (Breite der Progress Bar) - 0, // Oben: kein Offset - -8, // Rechts: 8px Padding - 0 // Unten: kein Offset - ); - editor->setGeometry(sliderRect); // Slider nur über Progress Bar - //editor->setGeometry(option.rect); - } - - // Anzeige wenn NICHT editiert wird - void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override - { - - if (index.column() == 1) - { // Nur für Wert-Spalte - // Wert holen - int value = index.model()->data(index, Qt::DisplayRole).toInt(); - - // Hintergrund - if (option.state & QStyle::State_Selected) { - painter->fillRect(option.rect, option.palette.highlight()); - } else if (index.row() % 2 == 1) { - painter->fillRect(option.rect, QColor(0xFAFAFA)); - } else { - painter->fillRect(option.rect, Qt::white); - } - - // Text und kleiner Slider-Indikator zeichnen - painter->save(); - painter->setRenderHint(QPainter::Antialiasing); - - QRect textRect = option.rect.adjusted(8, 0, -120, 0); - QRect barRect = option.rect.adjusted(option.rect.width() - 115, - option.rect.height() / 2 - 2, - -8, - -option.rect.height() / 2 + 2); - - // Text - painter->setPen(option.state & QStyle::State_Selected ? - option.palette.highlightedText().color() : Qt::black); - painter->drawText(textRect, Qt::AlignVCenter | Qt::AlignLeft, - QString::number(value)); - - // Mini Progress Bar - painter->setPen(Qt::NoPen); - painter->setBrush(QColor(0xE0E0E0)); - painter->drawRoundedRect(barRect, 2, 2); - - QRect fillRect = barRect; - fillRect.setWidth(barRect.width() * value / 100); - painter->setBrush(QColor(0x0078D4)); - painter->drawRoundedRect(fillRect, 2, 2); - - painter->restore(); - } else { - // Standard-Zeichnung für andere Spalten - QStyledItemDelegate::paint(painter, option, index); - } - } -}; - -#endif // SLIDERDELEGATE_H