blob: c8c76f134c5a982dfaa73154d735b580245a1e3b [file] [log] [blame]
Zev Weissdabd48d2022-08-03 15:43:17 -07001#pragma once
Andrew Jefferye73bd0a2023-01-25 10:39:57 +10302
3#include "Utils.hpp"
4
Zev Weissdabd48d2022-08-03 15:43:17 -07005#include <boost/container/flat_map.hpp>
6
7#include <functional>
8#include <optional>
9#include <string_view>
10
11struct I2CDeviceType
12{
13 const char* name;
14 bool createsHWMon;
15};
16
Matt Simmering786efb82023-01-18 14:09:21 -080017struct I2CDeviceComparator
18{
19 bool operator()(const std::string& a, const std::string& b) const noexcept
20 {
21 return strcasecmp(a.c_str(), b.c_str()) < 0;
22 }
23};
24
Zev Weissdabd48d2022-08-03 15:43:17 -070025using I2CDeviceTypeMap =
Matt Simmering786efb82023-01-18 14:09:21 -080026 boost::container::flat_map<std::string, I2CDeviceType, I2CDeviceComparator>;
Zev Weissdabd48d2022-08-03 15:43:17 -070027
Zev Weiss3ee959a2022-09-21 17:16:28 -070028struct I2CDeviceParams
Zev Weissdabd48d2022-08-03 15:43:17 -070029{
Zev Weiss3ee959a2022-09-21 17:16:28 -070030 I2CDeviceParams(const I2CDeviceType& type, uint64_t bus, uint64_t address) :
Zev Weissdabd48d2022-08-03 15:43:17 -070031 type(&type), bus(bus), address(address){};
32
33 const I2CDeviceType* type;
34 uint64_t bus;
35 uint64_t address;
36
Zev Weiss3ee959a2022-09-21 17:16:28 -070037 bool devicePresent(void) const;
Zev Weiss41f49c02022-09-21 17:27:18 -070038 bool deviceStatic(void) const;
Zev Weiss3ee959a2022-09-21 17:16:28 -070039};
40
41std::optional<I2CDeviceParams>
42 getI2CDeviceParams(const I2CDeviceTypeMap& dtmap,
43 const SensorBaseConfigMap& cfg);
44
45class I2CDevice
46{
47 public:
48 explicit I2CDevice(I2CDeviceParams params);
49 ~I2CDevice();
50
51 private:
52 I2CDeviceParams params;
53
Zev Weissdabd48d2022-08-03 15:43:17 -070054 int create(void) const;
55 int destroy(void) const;
56};
57
Zev Weissdabd48d2022-08-03 15:43:17 -070058// HACK: this declaration "should" live in Utils.hpp, but that leads to a
59// tangle of header-dependency hell because each header needs types declared
60// in the other.
61std::vector<std::unique_ptr<sdbusplus::bus::match_t>>
62 setupPropertiesChangedMatches(
63 sdbusplus::asio::connection& bus, const I2CDeviceTypeMap& typeMap,
64 const std::function<void(sdbusplus::message_t&)>& handler);