1 #pragma once
2 
3 #include "sensors/sensor.hpp"
4 
5 #include <map>
6 #include <memory>
7 #include <sdbusplus/bus.hpp>
8 #include <sdbusplus/server.hpp>
9 #include <string>
10 #include <vector>
11 
12 /*
13  * The SensorManager holds all sensors across all zones.
14  */
15 class SensorManager
16 {
17   public:
18     SensorManager(sdbusplus::bus::bus&& pass, sdbusplus::bus::bus&& host) :
19         _passiveListeningBus(std::move(pass)), _hostSensorBus(std::move(host))
20     {
21         // manager gets its interface from the bus. :D
22         sdbusplus::server::manager::manager(_hostSensorBus, SensorRoot);
23     }
24 
25     SensorManager() :
26         SensorManager(std::move(sdbusplus::bus::new_system()),
27                       std::move(sdbusplus::bus::new_system()))
28     {
29     }
30 
31     ~SensorManager() = default;
32     SensorManager(const SensorManager&) = delete;
33     SensorManager& operator=(const SensorManager&) = delete;
34     SensorManager(SensorManager&&) = default;
35     SensorManager& operator=(SensorManager&&) = default;
36 
37     /*
38      * Add a Sensor to the Manager.
39      */
40     void addSensor(const std::string& type, const std::string& name,
41                    std::unique_ptr<Sensor> sensor);
42 
43     // TODO(venture): Should implement read/write by name.
44     Sensor* getSensor(const std::string& name) const
45     {
46         return _sensorMap.at(name).get();
47     }
48 
49     sdbusplus::bus::bus& getPassiveBus(void)
50     {
51         return _passiveListeningBus;
52     }
53 
54     sdbusplus::bus::bus& getHostBus(void)
55     {
56         return _hostSensorBus;
57     }
58 
59   private:
60     std::map<std::string, std::unique_ptr<Sensor>> _sensorMap;
61     std::map<std::string, std::vector<std::string>> _sensorTypeList;
62 
63     sdbusplus::bus::bus _passiveListeningBus;
64     sdbusplus::bus::bus _hostSensorBus;
65 
66     static constexpr auto SensorRoot = "/xyz/openbmc_project/extsensors";
67 };
68