diff --git a/src/mainobject.cpp b/src/mainobject.cpp index 103c8de..b70b891 100644 --- a/src/mainobject.cpp +++ b/src/mainobject.cpp @@ -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)) { diff --git a/src/sensors/sensor.cpp b/src/sensors/sensor.cpp index de07db4..8483127 100644 --- a/src/sensors/sensor.cpp +++ b/src/sensors/sensor.cpp @@ -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; diff --git a/src/service/service.h b/src/service/service.h index 7b96e1b..fcd2201 100644 --- a/src/service/service.h +++ b/src/service/service.h @@ -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 = {}); diff --git a/src/service/tcpclient.cpp b/src/service/tcpclient.cpp index 6e00e2d..ef2fc66 100644 --- a/src/service/tcpclient.cpp +++ b/src/service/tcpclient.cpp @@ -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; diff --git a/src/service/tcpclient.h b/src/service/tcpclient.h index b67f7b4..4e56e6b 100644 --- a/src/service/tcpclient.h +++ b/src/service/tcpclient.h @@ -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); diff --git a/src/ui/sensorlistwidget.cpp b/src/ui/sensorlistwidget.cpp index f9a24b5..b411768 100644 --- a/src/ui/sensorlistwidget.cpp +++ b/src/ui/sensorlistwidget.cpp @@ -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(item)->getSensor(); SensorSettingsDialog diag(sensor, this); if(diag.exec()) { diff --git a/tests/unit/sensors/test_sensor.cpp b/tests/unit/sensors/test_sensor.cpp index e604f15..deb14e3 100644 --- a/tests/unit/sensors/test_sensor.cpp +++ b/tests/unit/sensors/test_sensor.cpp @@ -362,16 +362,16 @@ private slots: // Add initial sensor Sensor initialSensor(Sensor::TYPE_TEMPERATURE, 1, 20.0, "Initial Name", false); store.sensorGotState(initialSensor, SENSOR_UPDATE_BACKEND); - - // Send REMOTE update with new name and hidden state + + // Send REMOTE update with new name and hidden state (e.g., from secondary instance) Sensor remoteUpdate(Sensor::TYPE_TEMPERATURE, 1, 25.0, "Remote Name", true); store.sensorGotState(remoteUpdate, SENSOR_UPDATE_REMOTE); - - // Verify name and hidden were NOT updated + + // Verify name, hidden and field were updated (remote updates should sync user-configurable fields) std::vector* sensors = store.getSensors(); QVERIFY(sensors->size() == 1); - QVERIFY(sensors->at(0).name == "Initial Name"); - QVERIFY(sensors->at(0).hidden == false); + QVERIFY(sensors->at(0).name == "Remote Name"); + QVERIFY(sensors->at(0).hidden == true); QVERIFY(sensors->at(0).field == 25.0); }