blob: 41bbd07f015c963dd6e8e736cd2fba48835d6227 [file]
#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