| #ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_COLLECTOR_GPIO_COLLECTOR_H_ |
| #define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_COLLECTOR_GPIO_COLLECTOR_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| #include "absl/container/flat_hash_map.h" |
| #include "absl/status/status.h" |
| #include "absl/status/statusor.h" |
| #include "absl/strings/string_view.h" |
| #include "thread/thread.h" |
| #include "time/clock.h" |
| #include "nlohmann/json.hpp" |
| #include "tlbmc/collector/collector.h" |
| #include "gpio_config.pb.h" |
| #include "tlbmc/hal/gpio/gpio.h" |
| #include "tlbmc/hal/gpio/gpio_monitor.h" |
| #include "tlbmc/scheduler/scheduler.h" |
| |
| namespace milotic_tlbmc { |
| |
| struct GpioThreadManager { |
| explicit GpioThreadManager(ecclesia::Clock* clock) |
| : task_scheduler(std::make_unique<TaskScheduler>(clock)) {} |
| |
| ~GpioThreadManager(); |
| |
| std::vector<std::unique_ptr<ecclesia::ThreadInterface>> threads; |
| std::vector<std::shared_ptr<boost::asio::io_context>> io_contexts; |
| std::vector< |
| boost::asio::executor_work_guard<boost::asio::io_context::executor_type>> |
| work_guards; |
| std::unique_ptr<TaskScheduler> task_scheduler; |
| }; |
| |
| class GpioCollector : public Collector { |
| public: |
| // Parameters for creating a GPIO collector. |
| struct Params { |
| // Using a thread factory to allow us to switch to fibers in future when it |
| // gets open sourced. |
| ecclesia::ThreadFactoryInterface* thread_factory = |
| ecclesia::GetDefaultThreadFactory(); |
| ecclesia::Clock* clock = ecclesia::Clock::RealClock(); |
| GpioConfigs gpio_configs; |
| }; |
| |
| static absl::StatusOr<std::unique_ptr<GpioCollector>> Create( |
| const Params& params); |
| |
| nlohmann::json ToJson() const override; |
| |
| nlohmann::json GetSchedulerStats() const override { |
| return thread_manager_->task_scheduler->ToJson(); |
| } |
| |
| absl::Status SetGpio(absl::string_view gpio_name, bool value); |
| |
| protected: |
| // Protected constructor to allow mocking. |
| GpioCollector() = default; |
| |
| private: |
| GpioCollector( |
| std::unique_ptr<GpioThreadManager>&& thread_manager, |
| absl::flat_hash_map<std::string, std::unique_ptr<Gpio>>&& input_gpios, |
| absl::flat_hash_map<std::string, std::unique_ptr<Gpio>>&& output_gpios, |
| absl::flat_hash_map<std::string, std::unique_ptr<GpioMonitor>>&& |
| gpio_monitors) |
| : thread_manager_(std::move(thread_manager)), |
| input_gpios_(std::move(input_gpios)), |
| output_gpios_(std::move(output_gpios)), |
| gpio_monitors_(std::move(gpio_monitors)) {} |
| |
| std::unique_ptr<GpioThreadManager> thread_manager_; |
| absl::flat_hash_map<std::string, std::unique_ptr<Gpio>> input_gpios_; |
| absl::flat_hash_map<std::string, std::unique_ptr<Gpio>> output_gpios_; |
| absl::flat_hash_map<std::string, std::unique_ptr<GpioMonitor>> gpio_monitors_; |
| }; |
| |
| class EmptyGpioCollector final : public GpioCollector { |
| public: |
| static std::unique_ptr<EmptyGpioCollector> Create(); |
| |
| nlohmann::json GetSchedulerStats() const override; |
| |
| nlohmann::json ToJson() const override; |
| }; |
| |
| } // namespace milotic_tlbmc |
| |
| #endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_COLLECTOR_GPIO_COLLECTOR_H_ |