82 State() : next_descriptor_key_(0) {}
84 size_t device_count()
const {
return devices_.size(); }
89 int key = addDescriptorReference(descriptor);
90 addDeviceEntry(loc, ordinal, key);
101 const auto& device = devices_[loc];
102 int old_descriptor_key = device.descriptor_key;
103 int old_ordinal = device.ordinal;
106 descriptors_by_key_[old_descriptor_key];
107 removeReadings(loc, old_descriptor);
108 removeDescriptorReference(old_descriptor);
115 int descriptor_key) {
116 devices_[loc] = DeviceEntry{ordinal, descriptor_key};
119 void removeDescriptorReference(
122 void eraseSensorReading(
const SensorLocator& loc) { readings_.erase(loc); }
125 auto itr = readings_.find(loc);
126 if (itr == readings_.end()) {
129 readings_[loc] = SensorReading{m.
value(), m.
time()};
132 auto& v = itr->second;
133 if (((m.
value() == v.value) ||
134 (isnanf(m.
value()) && isnanf(v.value))) &&
135 (m.
time() == v.time)) {
141 eraseSensorReading(loc);
152 return descriptors_by_key_[devices_[loc].descriptor_key];
189 device_deltas_.emplace_back(
DeviceDelta{loc, status, old_ordinal});
193 descriptor_deltas_.emplace_back(DescriptorDelta{key, kind});
196 void newSensorReadingDelta(
const SensorLocator& loc,
float value,
197 roo_time::Uptime time);
199 const std::vector<DeviceDelta>& device_deltas()
const {
200 return device_deltas_;
203 const std::vector<DescriptorDelta>& descriptor_deltas()
const {
204 return descriptor_deltas_;
207 const roo_collections::FlatSmallHashMap<DeviceLocator, DeviceEntry>&
212 const roo_collections::FlatSmallHashMap<int, roo_transceivers_Descriptor>&
213 descriptors_by_key()
const {
214 return descriptors_by_key_;
217 const std::vector<SensorReadingDeltaDeviceGroup>& reading_delta_groups()
219 return reading_delta_groups_;
222 const std::vector<SensorReadingDelta>& reading_deltas()
const {
223 return reading_deltas_;
227 struct SensorReading {
229 roo_time::Uptime time;
232 roo_collections::FlatSmallHashMap<DeviceLocator, DeviceEntry> devices_;
236 roo_collections::FlatSmallHashMap<int, roo_transceivers_Descriptor>
240 int next_descriptor_key_;
242 roo_collections::FlatSmallHashMap<SensorLocator, SensorReading> readings_;
244 std::vector<DeviceDelta> device_deltas_;
245 std::vector<DescriptorDelta> descriptor_deltas_;
248 std::vector<SensorReadingDeltaDeviceGroup> reading_delta_groups_;
249 std::vector<SensorReadingDelta> reading_deltas_;
254 void handleRequestState();
256 void triggerTransmission(
bool send_full_snapshot);
258 void snapshotDevices();
259 void snapshotSensorState(
bool new_only);
264 void transmissionLoop(
bool send_full_snapshot);
267 void transmit(
bool is_delta);
269 void transmitUpdateBegin(
bool delta);
270 void transmitUpdateEnd();
272 void transmitDescriptorAdded(
int key);
273 void transmitDescriptorRemoved(
int key);
275 void transmitDeviceAdded(
const DeviceLocator& locator,
int descriptor_key);
276 void transmitDevicesPreserved(
int first_preserved_ordinal,
size_t count);
277 void transmitDeviceModified(
int prev_ordinal,
int descriptor_key);
278 void transmitDeviceRemoved(
int prev_ordinal);
280 void transmitReadingsBegin();
281 void transmitReadingsEnd();
284 UniverseServerChannel& channel_;
285 Executor& transmit_executor_;
291 bool full_snapshot_transmitted_;
295 bool transmission_in_progress_;
299 bool state_snapshot_pending_;
303 bool device_update_pending_;
307 bool readings_pending_;
311 bool devices_changed_;
313 mutable roo::mutex state_guard_;