diff --git a/bcdatamanager.cpp b/bcdatamanager.cpp index 423d9c5..15356a7 100644 --- a/bcdatamanager.cpp +++ b/bcdatamanager.cpp @@ -51,88 +51,17 @@ BCDataManager::BCDataManager(QObject *parent) { //qRegisterMetaType("BCDataValue*"); - qRegisterMetaType(); + //qRegisterMetaType(); - _transmitter.moveToThread(&_worker); - connect(this, &BCDataManager::sendValueCommand, &_transmitter, &BCTransmitter::enqueueValueOp); - - // B) Ergebnisse empfangen (Runner -> Manager) - //connect(&_transmitter, &BCTransmitter::commandFinished, this, &BCDataManager::onCommandFinished); - //connect(&_transmitter, &BCTransmitter::messageLogged, this, &BCDataManager::onRunnerMessage); - - // C) Aufräumen: Wenn Thread endet, lösche den Runner - connect(&_worker, &QThread::finished, &_transmitter, &QObject::deleteLater); - - // 5. Thread starten - _worker.start(); } BCDataManager::~BCDataManager() { - // nothing to do here for now, - // our models are autokilled. - _worker.quit(); // Event Loop stoppen - _worker.wait(); // Warten bis Thread wirklich fertig ist } -BCTransmitter* BCDataManager::getTransmitter() -{ - return &_transmitter; -}; - - -void BCDataManager::onCommandFinished(int id, bool success) -{ - qDebug() << "[Manager] Command" << id << "finished. Success:" << success; -} - -void BCDataManager::onRunnerMessage(const QString &msg) -{ - qDebug() << "[Worker says]:" << msg; -} - - - -void BCDataManager::onSyncFromDevice() -{ - qDebug() << " ---Syncing"; - /* - if( _currentDeviceID != BCDevice::ID::Invalid ) - { - if( _valueModels.contains(_currentDeviceID) ) - { - - BCValueModel* model = _valueModels[_currentDeviceID]; - BCValueList& currentList = model->getValueList(); - - //BCDataValue& value = currentList[4]; - - for( const BCDataValue& value : currentList ) - { - qDebug() << " --- value: " << value.label; - - // statt '_transmitter.enqueueValueCommand( value )' entkoppeln - // wir das eleganter über emit sendValueCommand() - - //_transmitter.enqueueValueCommand( value ); - emit sendValueCommand( BC::OpID::ReadValue, &value); - - emit valueTouched( value.rowInModel ); - - bc::processEventsFor(500); - - //QApplication::processEvents(); - // Thread schlafen lassen (Simulation einer blockierenden Operation) - //QThread::msleep(500); - - } - } // if contains - } -*/ -} void BCDataManager::loadXmlBikeData( const QString& fileName ) { diff --git a/bcdatamanager.h b/bcdatamanager.h index 543d275..46afb98 100644 --- a/bcdatamanager.h +++ b/bcdatamanager.h @@ -54,30 +54,17 @@ public: virtual ~BCDataManager(); std::optional getModel(BCDevice::ID deviceID ); - BCTransmitter* getTransmitter(); public slots: void loadXmlBikeData( const QString& fileName ); void saveBikeData(); - void onSyncFromDevice(); signals: void valueListReady( BCDevice::ID deviceID, BCValueList valueList ); - // Internes Signal, um Daten an den Worker Thread zu senden - void sendValueCommand( BC::OpID, const BCDataValue* cmd); - //void valuedTouched(const BCDataValue& cmd); - void valueTouched(int rowInModel ); - -private slots: - - // Slots für Rückmeldungen vom Runner - void onCommandFinished(int id, bool success); - void onRunnerMessage(const QString &msg); - protected: struct BCDataParams @@ -97,8 +84,7 @@ protected: QXmlStreamReader _xml; QMetaEnum _bcDeviceEnum{QMetaEnum::fromType()}; - QThread _worker; - BCTransmitter _transmitter; + }; diff --git a/bcdatavalue.cpp b/bcdatavalue.cpp index 71d5517..a3be97b 100644 --- a/bcdatavalue.cpp +++ b/bcdatavalue.cpp @@ -44,14 +44,17 @@ BCDataValue::BCDataValue(const BCValueType* valueType_, BCDevice::ID deviceID_, visibleValue = "--"; } -void BCDataValue::readRawValueX( const BCAbstractTransmitter& transmitter ) const +QString BCDataValue::readRawValueX( const BCAbstractTransmitter& transmitter ) const { qDebug() << " --- READ X!"; uint32_t devID = static_cast(deviceID); uint8_t regID = static_cast (registerID); - visibleValue = valueType->createStringValue( transmitter, devID, regID ); + // wir sind hier im anderen thread! nicht einfach so reinschreiben + //visibleValue = valueType->createStringValue( transmitter, devID, regID ); + + return valueType->createStringValue( transmitter, devID, regID ); } diff --git a/bcdatavalue.h b/bcdatavalue.h index 0d10be3..4e5f1b5 100644 --- a/bcdatavalue.h +++ b/bcdatavalue.h @@ -76,7 +76,7 @@ public: BCDataValue( const BCValueType* valueType_, BCDevice::ID deviceID_, BC::ID registerID_ ); - void readRawValueX( const BCAbstractTransmitter& transmitter ) const; + QString readRawValueX( const BCAbstractTransmitter& transmitter ) const; void writeRawValueX( const BCAbstractTransmitter& transmitter ) const; // void reset() diff --git a/bcdevicepanel.ui b/bcdevicepanel.ui index b080c86..cbbaa16 100644 --- a/bcdevicepanel.ui +++ b/bcdevicepanel.ui @@ -31,7 +31,32 @@ - + + + QFrame::Shape::NoFrame + + + QFrame::Shadow::Plain + + + 0 + + + Qt::ScrollBarPolicy::ScrollBarAsNeeded + + + Qt::ScrollBarPolicy::ScrollBarAlwaysOff + + + QAbstractScrollArea::SizeAdjustPolicy::AdjustToContents + + + false + + + true + + diff --git a/bcmainwindow.cpp b/bcmainwindow.cpp index 2f70b2a..9d83f00 100644 --- a/bcmainwindow.cpp +++ b/bcmainwindow.cpp @@ -48,18 +48,18 @@ BCMainWindow::BCMainWindow(QWidget *parent) qRegisterMetaType>("BCValueList"); setupUi(this); - initData(); + initMainWindow(); } BCMainWindow::~BCMainWindow() { - - + _worker.quit(); // Event Loop stoppen + _worker.wait(); // Warten bis Thread wirklich fertig ist } -void BCMainWindow::initData() +void BCMainWindow::initMainWindow() { // Die Daten und auch die Datenmodelle für die Views werden // vom DataManager verwaltet und an die Views weitergereicht. @@ -104,8 +104,6 @@ void BCMainWindow::initData() // Problem: alle Panels bekommen alle Datenmodelle angeboten. connect( &_dataManager, &BCDataManager::valueListReady, currentPanel, &BCDevicePanel::onValueListReady ); } - - }; // Wir wollen die Devices den Views zuordnen können @@ -140,14 +138,33 @@ void BCMainWindow::initData() // besser: model::emit dataChanged // also: emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole, ValueRole}); - connect( &_dataManager, &BCDataManager::valueTouched, _delegate, &BCItemDelegate::onHighlightRow ); + connect( &_dataManager, &BCMainWindow::valueTouched, _delegate, &BCItemDelegate::onHighlightRow ); connect( _connectButton, &QPushButton::clicked, transmitter, &BCTransmitter::onToggleConnectionState ); - connect( _syncButton, &QPushButton::clicked, &_dataManager, &BCDataManager::onSyncFromDevice ); + connect( _syncButton, &QPushButton::clicked, &_dataManager, &BCMainWindow::onSyncFromDevice ); */ + //_delegate->onHighlightRow(2); // 2 Sekunden Fade + // besser: model::emit dataChanged + // also: emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole, ValueRole}); + //connect( &_dataManager, &BCMainWindow::valueTouched, _delegate, &BCItemDelegate::onHighlightRow ); + connect( _connectButton, &QPushButton::clicked, &_transmitter, &BCTransmitter::onToggleConnectionState ); + connect( _syncButton, &QPushButton::clicked, this, &BCMainWindow::onSyncFromDevice ); // die Daten des eBikes laden _dataManager.loadXmlBikeData(":/bikeinfo.xml"_L1); + _transmitter.moveToThread(&_worker); + + connect(this, &BCMainWindow::sendValueCommand, &_transmitter, &BCTransmitter::enqueueValueOp); + + // B) Ergebnisse empfangen (Runner -> Manager) + //connect(&_transmitter, &BCTransmitter::commandFinished, this, &BCDataManager::onCommandFinished); + //connect(&_transmitter, &BCTransmitter::messageLogged, this, &BCDataManager::onRunnerMessage); + + // C) Aufräumen: Wenn Thread endet, lösche den Runner + connect(&_worker, &QThread::finished, &_transmitter, &QObject::deleteLater); + + // 5. Thread starten + _worker.start(); } @@ -168,6 +185,7 @@ void BCMainWindow::onValueListReady( BCDevice::ID deviceID ) } */ + void BCMainWindow::onShowDevicePanel( BCDevice::ID deviceID ) { qDebug() << " --- onShowDevicePanel:" << deviceID; @@ -199,3 +217,53 @@ void BCMainWindow::onConnectButtonToggled(bool checked ) { //_dataManager.setDriverConnectionState( checked ); } + +void BCMainWindow::onCommandFinished(int id, bool success) +{ + qDebug() << "[Manager] Command" << id << "finished. Success:" << success; +} + +void BCMainWindow::onRunnerMessage(const QString &msg) +{ + qDebug() << "[Worker says]:" << msg; +} + + + +void BCMainWindow::onSyncFromDevice() +{ + qDebug() << " ---Syncing"; + /* + if( _currentDeviceID != BCDevice::ID::Invalid ) + { + if( _valueModels.contains(_currentDeviceID) ) + { + + BCValueModel* model = _valueModels[_currentDeviceID]; + BCValueList& currentList = model->getValueList(); + + //BCDataValue& value = currentList[4]; + + for( const BCDataValue& value : currentList ) + { + qDebug() << " --- value: " << value.label; + + // statt '_transmitter.enqueueValueCommand( value )' entkoppeln + // wir das eleganter über emit sendValueCommand() + + //_transmitter.enqueueValueCommand( value ); + emit sendValueCommand( BC::OpID::ReadValue, &value); + + emit valueTouched( value.rowInModel ); + + bc::processEventsFor(500); + + //QApplication::processEvents(); + // Thread schlafen lassen (Simulation einer blockierenden Operation) + //QThread::msleep(500); + + } + } // if contains + } +*/ +} diff --git a/bcmainwindow.h b/bcmainwindow.h index 9ae8293..e40aae8 100644 --- a/bcmainwindow.h +++ b/bcmainwindow.h @@ -47,7 +47,7 @@ class BCMainWindow : public QMainWindow, public Ui_BCMainWindow public: BCMainWindow(QWidget *parent = nullptr); - ~BCMainWindow(); + virtual ~BCMainWindow(); public slots: @@ -57,9 +57,21 @@ public slots: void onActionButtonToggled( bool checked); void onConnectButtonToggled(bool active ); + // Slots für Rückmeldungen vom Runner + void onCommandFinished(int id, bool success); + void onRunnerMessage(const QString &msg); + void onSyncFromDevice(); + +signals: + + // Internes Signal, um Daten an den Worker Thread zu senden + void sendValueCommand( BC::OpID, const BCDataValue* cmd); + //void valuedTouched(const BCDataValue& cmd); + void valueTouched(int rowInModel ); + protected: - void initData(); + void initMainWindow(); BCDataManager _dataManager; @@ -70,6 +82,8 @@ protected: BCDevicePanels _devicePanels; BCDevicePanel* _currentPanel{}; + QThread _worker; + BCTransmitter _transmitter; }; #endif // BCMAINWINDOW_H diff --git a/bctransmitter.cpp b/bctransmitter.cpp index f03b747..e54e088 100644 --- a/bctransmitter.cpp +++ b/bctransmitter.cpp @@ -128,10 +128,24 @@ void BCTransmitter::processValueOp( BC::OpID opID ) } // Mutex wird hier freigegeben! WICHTIG: Execute ohne Lock! - if( opID == BC::OpID::ReadValue ) - currentValue->readRawValueX( *this ); - else if( opID == BC::OpID::WriteValue ) - currentValue->writeRawValueX( *this ); + try + { + if( opID == BC::OpID::ReadValue ) + { + QString result = currentValue->readRawValueX( *this ); + } + + else if( opID == BC::OpID::WriteValue ) + { + currentValue->writeRawValueX( *this ); + } + + } + catch (...) + { + qDebug() << " --- OUCH!"; + } + //emit commandFinished(cmd.id, true);