| #include "tlbmc/sensors/gpio_sensor.h" |
| |
| #include <memory> |
| #include <optional> |
| #include <string> |
| |
| #include "absl/log/log.h" |
| #include "absl/status/status.h" |
| #include "absl/status/statusor.h" |
| #include "g3/macros.h" |
| #include "tlbmc/collector/gpio_collector.h" |
| #include "gpio_sensor_config.pb.h" |
| #include "reading_range_config.pb.h" |
| #include "reading_transform_config.pb.h" |
| #include "resource.pb.h" |
| #include "sensor.pb.h" |
| #include "tlbmc/sensors/sync_polling_sensor.h" |
| #include "tlbmc/time/time.h" |
| |
| namespace milotic_tlbmc { |
| |
| absl::StatusOr<std::shared_ptr<GpioSensor>> GpioSensor::Create( |
| const GpioSensorConfig& config, |
| const std::shared_ptr<boost::asio::io_context>& io_context, |
| GpioCollector* gpio_collector, |
| std::optional<NotificationCb> on_batch_notify) { |
| SensorInstanceProperties mutable_instance_properties = |
| config.instance_properties(); |
| // Populate default related item if not specified. |
| if (!mutable_instance_properties.has_related_item()) { |
| mutable_instance_properties.mutable_related_item()->set_type( |
| RESOURCE_TYPE_BOARD); |
| mutable_instance_properties.mutable_related_item()->set_id( |
| config.entity_common_config().board_config_key()); |
| } |
| return std::make_shared<GpioSensor>( |
| Token(), config.gpio_pin_name(), config.entity_common_config(), |
| mutable_instance_properties, io_context, gpio_collector, on_batch_notify); |
| } |
| |
| GpioSensor::GpioSensor( |
| Token token, const std::string& gpio_pin_name, |
| const EntityCommonConfig& entity_common_config, |
| const SensorInstanceProperties& sensor_instance_properties, |
| const std::shared_ptr<boost::asio::io_context>& io_context, |
| GpioCollector* gpio_collector, |
| std::optional<NotificationCb> on_batch_notify) |
| : SyncPollingSensor(CreateStaticAttributes(sensor_instance_properties, |
| /*hal_common_config=*/{}, |
| entity_common_config), |
| sensor_instance_properties.thresholds(), io_context, |
| on_batch_notify), |
| sensor_name_(sensor_instance_properties.name()), |
| gpio_pin_name_(gpio_pin_name), |
| gpio_collector_(gpio_collector) {} |
| |
| absl::StatusOr<SensorValue> GpioSensor::ReadSensorData() { |
| if (gpio_collector_ == nullptr) { |
| return absl::InternalError("GpioCollector is null"); |
| } |
| ECCLESIA_ASSIGN_OR_RETURN(bool value, |
| gpio_collector_->GetValue(gpio_pin_name_)); |
| SensorValue sensor_data; |
| *sensor_data.mutable_timestamp() = Now(); |
| sensor_data.set_reading(value ? 1.0 : 0.0); |
| return sensor_data; |
| } |
| |
| } // namespace milotic_tlbmc |