roo_transceivers
API Documentation for roo_transceivers
Loading...
Searching...
No Matches
onewire.h
Go to the documentation of this file.
1#pragma once
2
3#include "roo_io/text/string_printf.h"
4#include "roo_onewire.h"
5#include "roo_quantity/temperature.h"
6#include "roo_transceivers.h"
8
9namespace roo_transceivers {
10
11namespace {
12
13/// Device schema string for OneWire thermometers.
14static const DeviceSchema kOneWireSchema = DeviceSchema("1-Wire");
15
16} // namespace
17
18/// Universe adapter exposing OneWire thermometers as transceivers.
20 public:
21 OneWireUniverse(roo_onewire::OneWire& onewire)
22 : onewire_(onewire), listener_(*this) {
23 onewire_.thermometers().addEventListener(&listener_);
24 }
25
26 size_t deviceCount() const override {
27 return onewire_.thermometers().count();
28 }
29
30 bool forEachDevice(std::function<bool(const DeviceLocator&)> callback) const {
31 char code[17];
32 for (const auto& t : onewire_.thermometers()) {
33 t.rom_code().toCharArray(code);
34 code[16] = 0;
35 DeviceLocator locator(kOneWireSchema, code);
36 if (!callback(locator)) return false;
37 }
38 return true;
39 }
40
41 Measurement readSensor(const DeviceLocator& locator) const override {
42 if (locator.schema() != kOneWireSchema) {
43 return Measurement();
44 }
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());
52 }
53
55 DeviceLocator device_locator) const override {
56 if (device_locator.schema() != kOneWireSchema) {
58 }
60 }
61
62 void requestUpdate() override { onewire_.update(); }
63
64 void addEventListener(EventListener* listener) override {
65 auto result = event_listeners_.insert(listener);
66 CHECK(result.second) << "Event listener " << listener
67 << " was registered already.";
68 }
69
70 void removeEventListener(EventListener* listener) override {
71 event_listeners_.erase(listener);
72 }
73
74 private:
75 void notifySensorsChanged() const {
76 for (auto& listener : event_listeners_) {
77 listener->devicesChanged();
78 }
79 }
80
81 void notifyNewReadingsAvailable() const {
82 for (auto& listener : event_listeners_) {
83 listener->newReadingsAvailable();
84 }
85 }
86
87 class Listener : public roo_onewire::Thermometers::EventListener {
88 public:
89 Listener(OneWireUniverse& onewire) : onewire_(onewire) {}
90
91 void discoveryCompleted() const override {
92 onewire_.notifySensorsChanged();
93 }
94
95 void conversionCompleted() const override {
96 onewire_.notifyNewReadingsAvailable();
97 }
98
99 private:
100 OneWireUniverse& onewire_;
101 };
102
103 roo_collections::FlatSmallHashSet<EventListener*> event_listeners_;
104 roo_onewire::OneWire& onewire_;
105 Listener listener_;
106};
107
108} // namespace roo_transceivers
Identifies a transceiver device by schema and device id.
Definition id.h:21
const DeviceId & device_id() const
Returns the device id.
Definition id.h:30
const DeviceSchema & schema() const
Returns the device schema.
Definition id.h:28
Listener for universe-level change notifications.
Definition notification.h:9
Measurement of a quantity at a specific time.
Definition measurement.h:11
Universe adapter exposing OneWire thermometers as transceivers.
Definition onewire.h:19
void requestUpdate() override
Requests sensor reading update from underlying devices.
Definition onewire.h:62
void addEventListener(EventListener *listener) override
Registers a listener for device-set and reading update events.
Definition onewire.h:64
Measurement readSensor(const DeviceLocator &locator) const override
Definition onewire.h:41
bool forEachDevice(std::function< bool(const DeviceLocator &)> callback) const
Iterates over all transceiver devices in this universe, calling callback for each device.
Definition onewire.h:30
OneWireUniverse(roo_onewire::OneWire &onewire)
Definition onewire.h:21
roo_transceivers_Quantity getSensorQuantity(DeviceLocator device_locator) const override
Definition onewire.h:54
void removeEventListener(EventListener *listener) override
Removes a previously registered event listener.
Definition onewire.h:70
size_t deviceCount() const override
Returns the total number of transceiver devices in this universe.
Definition onewire.h:26
Convenience Universe for identical, basic sensor-only transceivers.
roo_collections::SmallString< 16 > DeviceSchema
Device schema identifier (short string).
Definition id.h:12
@ roo_transceivers_Quantity_kUnspecifiedQuantity
@ roo_transceivers_Quantity_kTemperature
enum _roo_transceivers_Quantity roo_transceivers_Quantity