36 for (
auto& transceiver : transceivers) {
37 add(transceiver.locator, transceiver.instance);
45 CHECK(transceivers_.insert(std::make_pair(locator, device)).second)
46 <<
"Duplicate device locator: " << locator;
54 auto itr = transceivers_.find(locator);
55 if (itr == transceivers_.end()) {
58 itr->second->removeEventListener(
this);
59 transceivers_.erase(locator);
63 size_t deviceCount()
const override {
return transceivers_.size(); }
70 std::function<
bool(
const DeviceLocator&)> callback)
const override {
71 for (
const auto& transceiver : transceivers_) {
72 if (!callback(transceiver.first))
return false;
83 const auto& itr = transceivers_.find(locator);
84 if (itr == transceivers_.end())
return false;
85 itr->second->getDescriptor(descriptor);
94 return (itr != transceivers_.end()) ? itr->second->read(locator.
sensor_id())
103 return (itr != transceivers_.end())
109 for (
const auto& transceiver : transceivers_) {
110 transceiver.second->requestUpdate();
115 listeners_.insert(listener);
119 listeners_.erase(listener);
123 for (
auto listener : listeners_) {
124 listener->devicesChanged();
129 for (
auto listener : listeners_) {
130 listener->newReadingsAvailable();
135 roo_collections::FlatSmallHashMap<DeviceLocator, Transceiver*> transceivers_;
136 roo_collections::FlatSmallHashSet<EventListener*> listeners_;
143 : descriptor_(
std::move(descriptor)) {
158 auto itr = sensors_.find(
id);
159 return (itr == sensors_.end()) ? -1 : itr->second;
164 auto itr = actuators_.find(
id);
165 return (itr == actuators_.end()) ? -1 : itr->second;
170 roo_collections::FlatSmallHashMap<SensorId, int> sensors_;
171 roo_collections::FlatSmallHashMap<ActuatorId, int> actuators_;
195 if (idx < 0)
return false;
216 listener->newReadingsAvailable();
235 strncpy(descriptor.
sensors[0].
id,
id_.c_str(), SensorId::kCapacity);
260 listener->newReadingsAvailable();
Identifies actuator within a transceiver device.
const DeviceLocator & device_locator() const
Returns the device locator.
const ActuatorId & actuator_id() const
Returns the actuator id.
Identifies a transceiver device by schema and device id.
Listener for universe-level change notifications.
Measurement of a quantity at a specific time.
Identifies sensor within a transceiver device.
const SensorId & sensor_id() const
Returns the sensor id.
const DeviceLocator & device_locator() const
Returns the device locator.
Transceiver exposing one statically defined sensor and no actuators.
void addEventListener(EventListener *listener) override
void notifyNewReadingsAvailable() const
virtual float readFromSensor() const =0
bool write(const ActuatorId &actuator, float value) override
Measurement read(const SensorId &sensor) const override
SimpleSensor(roo_transceivers_Quantity quantity, SensorId id="")
Constructs single-sensor transceiver metadata.
roo_transceivers_Quantity quantity_
void getDescriptor(roo_transceivers_Descriptor &descriptor) const override
void removeEventListener(EventListener *listener) override
roo_collections::FlatSmallHashSet< EventListener * > event_listeners_
Transceiver with statically defined descriptor.
Measurement read(const SensorId &sensor) const override
virtual bool writeToActuator(int idx, float value)=0
Writes actuator by validated descriptor index.
void getDescriptor(roo_transceivers_Descriptor &descriptor) const override
bool write(const ActuatorId &actuator, float value) override
roo_collections::FlatSmallHashSet< EventListener * > event_listeners_
SimpleTransceiver(const TransceiverType *type)
type must outlive this transceiver.
void removeEventListener(EventListener *listener) override
void notifyNewReadingsAvailable() const
void addEventListener(EventListener *listener) override
virtual Measurement readFromSensor(int idx) const =0
Reads sensor by validated descriptor index.
const TransceiverType * type_
void requestUpdate() override
Requests sensor reading update from underlying devices.
virtual void addEventListener(EventListener *listener)
Registers a listener for device-set and reading update events.
bool write(const ActuatorLocator &locator, float value) override
Writes to the addressed actuator.
size_t deviceCount() const override
Returns the total number of transceiver devices in this universe.
TransceiverCollection()=default
Creates an empty collection.
bool getDeviceDescriptor(const DeviceLocator &locator, roo_transceivers_Descriptor &descriptor) const override
Retrieves descriptor for a registered transceiver.
void devicesChanged() override
Called when the set of devices changes.
void newReadingsAvailable() override
Called when new readings are available.
virtual void removeEventListener(EventListener *listener)
Removes a previously registered event listener.
Measurement read(const SensorLocator &locator) const override
Returns latest known measurement for locator.
void add(const DeviceLocator &locator, Transceiver *device)
Registers a transceiver under locator.
bool remove(const DeviceLocator &locator)
Removes transceiver identified by locator.
bool forEachDevice(std::function< bool(const DeviceLocator &)> callback) const override
Iterates over device locators.
TransceiverCollection(std::vector< Entry > transceivers)
Creates a collection and registers the provided transceivers.
TransceiverType(roo_transceivers_Descriptor descriptor)
Builds index maps for a static descriptor.
int resolveSensorIndex(const SensorId &id) const
Returns sensor index or -1 if not found.
const roo_transceivers_Descriptor & getDescriptor() const
int resolveActuatorIndex(const ActuatorId &id) const
Returns actuator index or -1 if not found.
Abstract transceiver interface used by TransceiverCollection.
virtual void removeEventListener(EventListener *listener)=0
virtual void requestUpdate()
virtual void addEventListener(EventListener *listener)=0
virtual void getDescriptor(roo_transceivers_Descriptor &descriptor) const =0
virtual bool write(const ActuatorId &actuator, float value)=0
virtual Measurement read(const SensorId &sensor) const =0
virtual ~Transceiver()=default
An abstract collection of transceiver devices.
roo_collections::SmallString< 24 > SensorId
Sensor identifier (short string).
roo_collections::SmallString< 24 > ActuatorId
Actuator identifier (short string).
enum _roo_transceivers_Quantity roo_transceivers_Quantity
roo_transceivers_Quantity quantity
roo_transceivers_Descriptor_Sensor sensors[16]
pb_size_t actuators_count
roo_transceivers_Descriptor_Actuator actuators[16]
Entry pairing a device locator with a transceiver instance.