1 #pragma once 2 3 #include "Utils.hpp" 4 5 #include <boost/container/flat_map.hpp> 6 7 #include <functional> 8 #include <optional> 9 #include <string_view> 10 11 struct I2CDeviceType 12 { 13 const char* name; 14 bool createsHWMon; 15 }; 16 17 struct 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 25 using I2CDeviceTypeMap = 26 boost::container::flat_map<std::string, I2CDeviceType, I2CDeviceComparator>; 27 28 struct I2CDeviceParams 29 { 30 I2CDeviceParams(const I2CDeviceType& type, uint64_t bus, uint64_t address) : 31 type(&type), bus(bus), address(address){}; 32 33 const I2CDeviceType* type; 34 uint64_t bus; 35 uint64_t address; 36 37 bool devicePresent(void) const; 38 bool deviceStatic(void) const; 39 }; 40 41 std::optional<I2CDeviceParams> 42 getI2CDeviceParams(const I2CDeviceTypeMap& dtmap, 43 const SensorBaseConfigMap& cfg); 44 45 class I2CDevice 46 { 47 public: 48 explicit I2CDevice(I2CDeviceParams params); 49 ~I2CDevice(); 50 51 private: 52 I2CDeviceParams params; 53 54 int create(void) const; 55 int destroy(void) const; 56 }; 57 58 // 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. 61 std::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); 65