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