Skip to content

Commit

Permalink
Prevent lock in threading calls to sensor reading
Browse files Browse the repository at this point in the history
  • Loading branch information
iakov committed Jan 29, 2025
1 parent 6f9404f commit ae2b23b
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@ ScalarSensor::ScalarSensor(const DeviceInfo &info, const PortInfo &port)
: AbstractSensor(info, port)
, mLastValue(0)
{
connect(this, &ScalarSensor::newData, this, [this](const QVariant &reading) { mLastValue = reading.toInt(); });
connect(this, &ScalarSensor::newData
, this, [this](const QVariant &reading) { mLastValue = reading.toInt(); }
, Qt::QueuedConnection
);
}

int ScalarSensor::lastData() const
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ using namespace kitBase::robotModel::robotParts;
VectorSensor::VectorSensor(const DeviceInfo &info, const PortInfo &port)
: AbstractSensor(info, port)
{
connect(this, &VectorSensor::newData,
this, [this](const QVariant &reading) { mLastValue = reading.value<QVector<int>>(); });
connect(this, &VectorSensor::newData
, this, [this](const QVariant &reading) { mLastValue = reading.value<QVector<int>>(); }
, Qt::QueuedConnection
);
}

QVector<int> VectorSensor::lastData() const
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ public slots:

private slots:
void onTimerTimeout();
void onScalarSensorResponse(int reading);
void onVectorSensorResponse(const QVector<int> &reading);
void onScalarSensorResponse(const QVariant &reading);
void onVectorSensorResponse(const QVariant &reading);
void onFailure();

private:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@ SensorVariablesUpdater::~SensorVariablesUpdater()
void SensorVariablesUpdater::run()
{
mUpdateTimer.reset(mRobotModelManager.model().timeline().produceTimer());
connect(mUpdateTimer.data(), &utils::AbstractTimer::timeout, this, &SensorVariablesUpdater::onTimerTimeout);
connect(mUpdateTimer.data(), &utils::AbstractTimer::timeout
,this, &SensorVariablesUpdater::onTimerTimeout
,Qt::QueuedConnection);
resetVariables();

for (robotParts::Device * const device : mRobotModelManager.model().configuration().devices()) {
Expand All @@ -49,22 +51,20 @@ void SensorVariablesUpdater::run()
continue;
}

using namespace std::placeholders;
connect(
scalarSensor
, &robotParts::ScalarSensor::newData
, this
, std::bind(&SensorVariablesUpdater::onScalarSensorResponse, this,
std::bind(&QVariant::value<int>, _1))
, Qt::UniqueConnection
, &SensorVariablesUpdater::onScalarSensorResponse
, static_cast<Qt::ConnectionType>(Qt::UniqueConnection | Qt::QueuedConnection)
);

connect(
scalarSensor
, &robotParts::AbstractSensor::failure
, this
, &SensorVariablesUpdater::onFailure
, Qt::UniqueConnection
, static_cast<Qt::ConnectionType>(Qt::UniqueConnection | Qt::QueuedConnection)
);

continue;
Expand All @@ -78,22 +78,20 @@ void SensorVariablesUpdater::run()
continue;
}

using namespace std::placeholders;
connect(
vectorSensor
, &robotParts::VectorSensor::newData
, this
, std::bind(&SensorVariablesUpdater::onVectorSensorResponse,
this, std::bind(&QVariant::value<QVector<int>>, _1))
, Qt::UniqueConnection
, &SensorVariablesUpdater::onVectorSensorResponse
, static_cast<Qt::ConnectionType>(Qt::UniqueConnection | Qt::QueuedConnection)
);

connect(
vectorSensor
, &robotParts::AbstractSensor::failure
, this
, &SensorVariablesUpdater::onFailure
, Qt::UniqueConnection
, static_cast<Qt::ConnectionType>(Qt::UniqueConnection | Qt::QueuedConnection)
);

continue;
Expand All @@ -112,26 +110,26 @@ void SensorVariablesUpdater::suspend()
}
}

void SensorVariablesUpdater::onScalarSensorResponse(int reading)
void SensorVariablesUpdater::onScalarSensorResponse(const QVariant &reading)
{
robotParts::ScalarSensor * const scalarSensor = dynamic_cast<robotParts::ScalarSensor *>(sender());
if (!scalarSensor) {
/// @todo Error reporting.
return;
}

updateScalarSensorVariables(scalarSensor->port(), reading);
updateScalarSensorVariables(scalarSensor->port(), reading.toInt());
}

void SensorVariablesUpdater::onVectorSensorResponse(const QVector<int> &reading)
void SensorVariablesUpdater::onVectorSensorResponse(const QVariant &reading)
{
robotParts::VectorSensor * const vectorSensor = dynamic_cast<robotParts::VectorSensor *>(sender());
if (!vectorSensor) {
/// @todo Error reporting.
return;
}

updateVectorSensorVariables(vectorSensor->port(), reading);
updateVectorSensorVariables(vectorSensor->port(), reading.value<QVector<int>>());
}

void SensorVariablesUpdater::onTimerTimeout()
Expand Down

0 comments on commit ae2b23b

Please sign in to comment.