diff --git a/bcmainwindow.cpp b/bcmainwindow.cpp index fefc18c..6abae35 100644 --- a/bcmainwindow.cpp +++ b/bcmainwindow.cpp @@ -52,8 +52,6 @@ BCMainWindow::BCMainWindow(QWidget *parent) setupUi(this); - // den pimp-my-ride-button schalten wir vorerst aus. - _pimpButton->hide(); // Wir schreiben den 'initMainWindow()' Aufruf mit Hilfe des // timers in die Event-Queue, damit er erst ausgeführt wird, @@ -111,14 +109,11 @@ void BCMainWindow::initMainWindow() _devicePanels[BCDevice::ID::Console] = _consolePanel; _devicePanels[BCDevice::ID::Battery] = _batteryPanel; _devicePanels[BCDevice::ID::Motor] = _motorPanel; - //_devicePanels[BCDevice::ID::Pimp] = _pimpPanel; // Die actions an die Buttons binden configureAction(_motorButton, _motorAction, BCDevice::ID::Motor ); configureAction(_consoleButton, _consoleAction, BCDevice::ID::Console ); configureAction(_batteryButton, _batteryAction, BCDevice::ID::Battery ); - //configureAction(_pimpButton, _pimpAction, BCDevice::ID::Pimp ); - /* bool m_isDarkMode = false; @@ -151,7 +146,7 @@ void BCMainWindow::initMainWindow() connect( _syncButton, &QToolButton::clicked, this, &BCMainWindow::onSyncDeviceView ); connect( &_transmitter, &BCTransmitter::valueUpdated, this, &BCMainWindow::onValueUpdated ); - connect(this, &BCMainWindow::requestValueUpdate, &_transmitter, &BCTransmitter::onEnqueueValue); + connect(this, &BCMainWindow::requestValueUpdate, &_transmitter, &BCTransmitter::onUpdateValue); connect(&_worker, &QThread::finished, &_transmitter, &QObject::deleteLater); connect( &_transmitter, &BCTransmitter::driverStateChanged, this, &BCMainWindow::onDriverStateChanged ); @@ -322,7 +317,7 @@ void BCMainWindow::onSyncDeviceView() // wir setzen auf 'lesen' value->state.setFlag( BCValue::State::ReadMe ); - // statt '_transmitter.onEnqueueValue( value )' müssen wir hier + // statt '_transmitter.onUpdateValue( value )' müssen wir hier // über emit requestValueUpdate() zur Thread sysnchronisation // entkoppeln, diff --git a/bcmainwindow.ui b/bcmainwindow.ui index 71e4ac3..15c3acd 100644 --- a/bcmainwindow.ui +++ b/bcmainwindow.ui @@ -120,29 +120,7 @@ - - - - - 64 - 64 - - - - ... - - - - 48 - 48 - - - - true - - - - + Qt::Orientation::Vertical @@ -157,21 +135,73 @@ - - Sync + + + 64 + 64 + - - - - - Connect + SYNC - + + + 48 + 48 + + + true + + + + + 64 + 64 + + + + CONNECT + + + + 48 + 48 + + + + true + + + + + + + + 64 + 64 + + + + Quit + + + + 48 + 48 + + + + true + + + + + + @@ -190,7 +220,7 @@ 0 - 3 + 0 @@ -279,35 +309,6 @@ false - - - QFrame::Shape::NoFrame - - - QFrame::Shadow::Plain - - - 0 - - - false - - - Qt::PenStyle::NoPen - - - Pimp my Ride ... - - - false - - - true - - - false - - @@ -319,21 +320,6 @@ background-color: #DADADA - - - true - - - - :restart.png:restart.png - - - pimp - - - Pimp my Ride - - @@ -373,7 +359,7 @@ - :exit.png:exit.png + :exit.svg:exit.svg Exit diff --git a/bctransmitter.cpp b/bctransmitter.cpp index f1db6f8..8614c85 100644 --- a/bctransmitter.cpp +++ b/bctransmitter.cpp @@ -32,6 +32,7 @@ #include #include +#include #include @@ -40,7 +41,7 @@ */ BCTransmitter::BCTransmitter(QObject *parent) - : QObject(parent), _isBusy(false) + : QObject(parent)//, _isBusy(false) { //_canDriver = new BCDriverTinyCan{this}; _canDriver = &_dummyDriver; @@ -56,18 +57,24 @@ BCTransmitter::BCTransmitter(QObject *parent) void BCTransmitter::onToggleDriverConnection( bool connect ) { qDebug() << " --- onToggleDriverConnection: " << connect; - // FIX! Ende der current op abwarten! + emit driverStateChanged(BCDriver::DriverState::Initialized, "BUSY!"); + bc::delay_millis(350); + // kill all pending stuff + QCoreApplication::removePostedEvents(this, QEvent::MetaCall); + // FIX! Ende der current op abwarten! BCDriver::DriverState state = connect ? BCDriver::DriverState::DeviceReady : BCDriver::DriverState::NotPresent; const QString& message = connect ? "Trying to connect" : " FAILED"; emit driverStateChanged(state, message); return; + /* // Hier sind wir noch in GUI Thread QMutexLocker locker(&_mutex); // weitere operation stoppen _isBusy = true; connect ? connectCanDriver() : disconnectCanDriver(); _isBusy = false; + */ } @@ -120,98 +127,68 @@ void BCTransmitter::disconnectCanDriver() } -void BCTransmitter::onEnqueueValue( BCValuePtrConst value) +void BCTransmitter::onUpdateValue( BCValuePtrConst valuePtr) { - // wir stellen hier auf die arte Tour sicher, das onEnqueueValue + // wir stellen hier auf die harte Tour sicher, das onUpdateValue // nicht aus dem Parent-Thread direkt sondern über die EventQueue aufgerufen wurde. Q_ASSERT(QThread::currentThread() == this->thread()); - // Hier sind wir noch in GUI Thread - //QMutexLocker locker(&_mutex); - _valueQueue.enqueue( value ); + // Wir arbeiten hier ohne besondere Threadsynchronisation, mutexed o.ä: Die + // entkoppelung und serialisierung passiert bereits durch die Qt-Eventqueue. + // Das klappt aber nur in der hier gewählten Konstellation mit einer Parent-Thread + // und einem Worker. - // wir wollen nicht den ganzen Value verschicken, erstrecht - // wollen wir nicht den Value in verschiedenen Threads gleichzeitig - // in die Hand nehmen, also hantieren wir nur mit den Inidizes. + // Kosmetik + const BCValue& value = *(valuePtr.get()); + + qDebug() << "------- DE.-.QUEUE: " << QThread::currentThreadId() << ": " << value.label; + + // Value ist 'under construction' + //emit valueUpdated( value.deviceID, value.indexRow, BCValue::State::Locked ); + + + uint32_t devID = static_cast(value.deviceID); + uint8_t regID = static_cast (value.registerID); + + QString newVisibleValue; + BCValue::State newState = BCValue::State::NoState; + + if(value.state.testFlag( BCValue::State::WriteMe ) ) + { + + + } + // 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 ) ) + { + // wir sind hier im anderen thread! nicht einfach so reinschreiben, nur lesen + TransmitResult result = value.isWord ? readWordValue( devID, regID ) : readByteValue( devID, regID ); + if( result.has_value() ) + { + newVisibleValue = value.formatValue( result.value() ); + newState = BCValue::State::InSync; + } + else + { + newState = BCValue::State::Failed; + } + } + + emit valueUpdated( value.deviceID, value.indexRow, newState, newVisibleValue ); + + // __fix + //bc::processEventsFor(150); + bc::delay_millis(150); - // Trigger processing im Event-Loop des Worker Threads - // invokeMethod mit QueuedConnection entkoppelt den Aufruf, - // damit onEnqueueValue sofort zurückkehrt (non-blocking für den Aufrufer). - //QMetaObject::invokeMethod(this, "onProcessValue", Qt::QueuedConnection); - onProcessValue(); } void BCTransmitter::onProcessValue() -{ - - //if (_isBusy) - // return; - - _isBusy = true; - - while (true) - { - BCValuePtrConst valuePtr{}; - { - //QMutexLocker locker(&_mutex); - if (_valueQueue.isEmpty()) - { - _isBusy = false; - break; // Schleife verlassen, warten auf neue Events - } - valuePtr =_valueQueue.dequeue(); - } // Mutex wird hier freigegeben! WICHTIG: Execute ohne Lock! - - // Kosmetik - const BCValue& value = *(valuePtr.get()); - - qDebug() << "------- DE.-.QUEUE: " << QThread::currentThreadId() << ": " << value.label; - - // Value ist 'under construction' - //emit valueUpdated( value.deviceID, value.indexRow, BCValue::State::Locked ); - - - uint32_t devID = static_cast(value.deviceID); - uint8_t regID = static_cast (value.registerID); - - QString newVisibleValue; - BCValue::State newState = BCValue::State::NoState; - - if(value.state.testFlag( BCValue::State::WriteMe ) ) - { - - - } - // 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 ) ) - { - // wir sind hier im anderen thread! nicht einfach so reinschreiben, nur lesen - TransmitResult result = value.isWord ? readWordValue( devID, regID ) : readByteValue( devID, regID ); - if( result.has_value() ) - { - newVisibleValue = value.formatValue( result.value() ); - newState = BCValue::State::InSync; - } - else - { - newState = BCValue::State::Failed; - } - } - - emit valueUpdated( value.deviceID, value.indexRow, newState, newVisibleValue ); - - // __fix - //bc::processEventsFor(150); - bc::delay_millis(150); - - } -} - +{} TransmitResult BCTransmitter::readByteValue( uint32_t deviceID, uint8_t registerID ) { diff --git a/bctransmitter.h b/bctransmitter.h index 8eb0265..5f414f6 100644 --- a/bctransmitter.h +++ b/bctransmitter.h @@ -63,7 +63,7 @@ public: public slots: void onToggleDriverConnection( bool connect ); - void onEnqueueValue(BCValuePtrConst value ); + void onUpdateValue(BCValuePtrConst valuePtr ); void onProcessValue(); void onStartNativeDriver(); @@ -80,11 +80,11 @@ private: TransmitResult readByteValue( uint32_t deviceID, uint8_t registerID ); TransmitResult readWordValue( uint32_t deviceID, uint8_t registerID ); - using BCDataQueue = QQueue; + //using BCDataQueue = QQueue; - BCDataQueue _valueQueue; - QMutex _mutex; - std::atomic _isBusy{ false }; + //BCDataQueue _valueQueue; + //QMutex _mutex; + //std::atomic _isBusy{ false }; // __fix! BCDriver* _canDriver{}; diff --git a/bionxcontrol.qrc b/bionxcontrol.qrc index d5e1960..2961e4c 100644 --- a/bionxcontrol.qrc +++ b/bionxcontrol.qrc @@ -11,11 +11,13 @@ resources/important.png resources/restart.png resources/splash.png - resources/connect.png + resources/connect.png resources/connected.png resources/disconnected.png resources/connect_white.svg - resources/sync_green.svg - resources/sync_yellow.svg + resources/a_connect.svg + resources/a_exit.svg + resources/a_sync_green.svg + resources/a_sync_yellow.svg diff --git a/resources/a_connect.svg b/resources/a_connect.svg new file mode 100644 index 0000000..a59b35a --- /dev/null +++ b/resources/a_connect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/a_exit.svg b/resources/a_exit.svg new file mode 100644 index 0000000..fd7671a --- /dev/null +++ b/resources/a_exit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/a_sync_green.svg b/resources/a_sync_green.svg new file mode 100644 index 0000000..b3973e3 --- /dev/null +++ b/resources/a_sync_green.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/a_sync_yellow.svg b/resources/a_sync_yellow.svg new file mode 100644 index 0000000..fb8b323 --- /dev/null +++ b/resources/a_sync_yellow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/connect_white.svg b/resources/connect_white.svg new file mode 100644 index 0000000..8272942 --- /dev/null +++ b/resources/connect_white.svg @@ -0,0 +1 @@ + \ No newline at end of file