3#include "roo_io/text/string_printf.h"
4#include "roo_onewire.h"
5#include "roo_quantity/temperature.h"
22 : onewire_(onewire), listener_(*this) {
23 onewire_.thermometers().addEventListener(&listener_);
27 return onewire_.thermometers().count();
32 for (
const auto& t : onewire_.thermometers()) {
33 t.rom_code().toCharArray(code);
36 if (!callback(locator))
return false;
42 if (locator.
schema() != kOneWireSchema) {
45 roo_onewire::RomCode rom_code =
46 roo_onewire::RomCode::FromString(locator.
device_id().c_str());
47 const roo_onewire::Thermometer* t =
48 onewire_.thermometers().thermometerByRomCode(rom_code);
50 roo_time::Uptime::Now(),
51 t ==
nullptr ? nanf(
"") : t->temperature().degCelcius());
56 if (device_locator.
schema() != kOneWireSchema) {
65 auto result = event_listeners_.insert(listener);
66 CHECK(result.second) <<
"Event listener " << listener
67 <<
" was registered already.";
71 event_listeners_.erase(listener);
75 void notifySensorsChanged()
const {
76 for (
auto& listener : event_listeners_) {
77 listener->devicesChanged();
81 void notifyNewReadingsAvailable()
const {
82 for (
auto& listener : event_listeners_) {
83 listener->newReadingsAvailable();
87 class Listener :
public roo_onewire::Thermometers::EventListener {
89 Listener(OneWireUniverse& onewire) : onewire_(onewire) {}
91 void discoveryCompleted()
const override {
92 onewire_.notifySensorsChanged();
95 void conversionCompleted()
const override {
96 onewire_.notifyNewReadingsAvailable();
100 OneWireUniverse& onewire_;
103 roo_collections::FlatSmallHashSet<EventListener*> event_listeners_;
104 roo_onewire::OneWire& onewire_;
Identifies a transceiver device by schema and device id.
const DeviceId & device_id() const
Returns the device id.
const DeviceSchema & schema() const
Returns the device schema.
Listener for universe-level change notifications.
Measurement of a quantity at a specific time.
Universe adapter exposing OneWire thermometers as transceivers.
void requestUpdate() override
Requests sensor reading update from underlying devices.
void addEventListener(EventListener *listener) override
Registers a listener for device-set and reading update events.
Measurement readSensor(const DeviceLocator &locator) const override
bool forEachDevice(std::function< bool(const DeviceLocator &)> callback) const
Iterates over all transceiver devices in this universe, calling callback for each device.
OneWireUniverse(roo_onewire::OneWire &onewire)
roo_transceivers_Quantity getSensorQuantity(DeviceLocator device_locator) const override
void removeEventListener(EventListener *listener) override
Removes a previously registered event listener.
size_t deviceCount() const override
Returns the total number of transceiver devices in this universe.
Convenience Universe for identical, basic sensor-only transceivers.
roo_collections::SmallString< 16 > DeviceSchema
Device schema identifier (short string).
@ roo_transceivers_Quantity_kUnspecifiedQuantity
@ roo_transceivers_Quantity_kTemperature
enum _roo_transceivers_Quantity roo_transceivers_Quantity