Gui cleanups, part I.
This commit is contained in:
@@ -32,6 +32,7 @@
|
||||
|
||||
#include <QThread>
|
||||
#include <QDebug>
|
||||
#include <QCoreApplication>
|
||||
|
||||
#include <bctransmitter.h>
|
||||
|
||||
@@ -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<uint32_t>(value.deviceID);
|
||||
uint8_t regID = static_cast<uint8_t> (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<uint32_t>(value.deviceID);
|
||||
uint8_t regID = static_cast<uint8_t> (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 )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user