Allow propagation of sensor updates from secondary to main

This commit is contained in:
Carl Philipp Klemm 2026-04-27 00:27:56 +02:00
parent da50a89866
commit 34f129967b
7 changed files with 45 additions and 8 deletions

View file

@ -165,6 +165,7 @@ SecondaryMainObject::SecondaryMainObject(QString host, int port, QObject *parent
{
connect(tcpClient, &TcpClient::gotSensor, &globalSensors, &SensorStore::sensorGotState);
globalItems.registerItemSource(tcpClient);
connect(&globalSensors, &SensorStore::sensorChangedState, tcpClient, &TcpClient::sensorEvent);
if(!tcpClient->launch(QHostAddress(host), port))
{

View file

@ -89,6 +89,31 @@ void SensorStore::sensorGotState(const Sensor& sensor, sensor_update_type_t type
needsUpdate = true;
}
}
else if(type == SENSOR_UPDATE_REMOTE)
{
if(sensors_[i].name != sensor.name || sensors_[i].hidden != sensor.hidden || sensors_[i].groupName != sensor.groupName)
{
sensors_[i].name = sensor.name;
sensors_[i].hidden = sensor.hidden;
sensors_[i].groupName = sensor.groupName;
for(Sensor& known : knownSensors_)
{
if(sensor.type == known.type && sensor.id == known.id)
{
known.name = sensor.name;
known.hidden = sensor.hidden;
known.groupName = sensor.groupName;
break;
}
}
needsUpdate = true;
}
if(sensors_[i].field != sensor.field)
{
needsUpdate = true;
sensors_[i].field = sensor.field;
}
}
else if(sensors_[i].field != sensor.field)
{
needsUpdate = true;

View file

@ -24,7 +24,7 @@ signals:
void sensorAdded(Sensor sensor, Sensor::sensor_backend_type_t backend, QJsonObject payload);
public slots:
void sensorEvent(Sensor sensor, sensor_update_type_t type);
virtual void sensorEvent(Sensor sensor, sensor_update_type_t type);
virtual void itemUpdated(ItemUpdateRequest update);
virtual void refresh() override;
virtual void addSensor(Sensor sensor, Sensor::sensor_backend_type_t backend, QJsonObject payload = {});

View file

@ -128,6 +128,16 @@ void TcpClient::itemUpdated(ItemUpdateRequest update)
}
}
void TcpClient::sensorEvent(Sensor sensor, sensor_update_type_t type)
{
// Only forward user-initiated sensor updates to the server
// to prevent feedback loops with backend/remote updates
if(type == SENSOR_UPDATE_USER)
{
Service::sensorEvent(sensor, type);
}
}
TcpClient::~TcpClient()
{
delete socket;

View file

@ -18,6 +18,7 @@ class TcpClient : public Service
public slots:
virtual void itemUpdated(ItemUpdateRequest update) override;
virtual void sensorEvent(Sensor sensor, sensor_update_type_t type) override;
public:
TcpClient(QObject* parent = nullptr);

View file

@ -37,7 +37,7 @@ void SensorListWidget::onDoubleClick(QTreeWidgetItem *item, int column)
{
if(item && item->type() == 1001)
{
const Sensor& sensor = getSensorForIndex(currentIndex());
const Sensor& sensor = static_cast<SensorListItem*>(item)->getSensor();
SensorSettingsDialog diag(sensor, this);
if(diag.exec())
{