xref: /openbmc/entity-manager/src/gpio-presence/device_presence.hpp (revision 8c4b1d999a13b27d6edc84cfaff1112a0cc07091)
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2022-2024. All rights
3  * reserved. SPDX-License-Identifier: Apache-2.0
4  */
5 #pragma once
6 
7 #include <xyz/openbmc_project/Inventory/Source/DevicePresence/aserver.hpp>
8 
9 #include <string>
10 
11 namespace gpio_presence
12 {
13 
14 enum GPIO_POLARITY
15 {
16     ACTIVE_HIGH,
17     ACTIVE_LOW,
18 };
19 
20 class DevicePresence;
21 
22 using DevicePresenceInterface =
23     sdbusplus::aserver::xyz::openbmc_project::inventory::source::DevicePresence<
24         DevicePresence>;
25 
26 class DevicePresence
27 {
28   public:
29     DevicePresence(sdbusplus::async::context& ctx,
30                    const std::vector<std::string>& gpioNames,
31                    const std::vector<uint64_t>& gpioValues,
32                    const std::string& deviceName,
33                    const std::unordered_map<std::string, bool>& gpioState);
34 
35     auto updateGPIOPresence(const std::string& gpioLine) -> void;
36 
37     // @returns the object path of the 'detected' interface
38     auto getObjPath() const -> sdbusplus::message::object_path;
39 
40     // computed from the state of the configured gpios
41     auto isPresent() -> bool;
42 
43     // name of the device to detect, e.g. 'cable0'
44     // (taken from EM config)
45     const std::string deviceName;
46 
47     // maps the name of the gpio to its polarity
48     std::map<std::string, GPIO_POLARITY> gpioPolarity;
49 
50   private:
51     // reference to the map in presence manager
52     const std::unordered_map<std::string, bool>& gpioState;
53 
54     sdbusplus::async::context& ctx;
55 
56     auto updateDbusInterfaces() -> void;
57 
58     // property added when the hw is detected
59     std::unique_ptr<DevicePresenceInterface> detectedIface = nullptr;
60 };
61 
62 } // namespace gpio_presence
63