blob: d490fe3ac984b84411dfa5682d485dcabfe18170 [file] [log] [blame] [edit]
/*
* SPDX-FileCopyrightText: Copyright (c) 2022-2024. All rights
* reserved. SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include "config_provider.hpp"
#include "device_presence.hpp"
#include "sdbusplus/async/fdio.hpp"
#include <gpiod.hpp>
#include <string>
#include <unordered_map>
namespace gpio_presence
{
constexpr auto service = "xyz.openbmc_project.gpiopresence";
class GPIOPresenceManager
{
public:
explicit GPIOPresenceManager(sdbusplus::async::context& ctx);
// spawns the initialization function
auto start() -> void;
// @param[in] name name of device, e.g. 'cable0'
// @returns true if present
auto getPresence(const std::string& name) -> bool;
// request our dbus name
// @returns our dbus name
auto setupBusName() const -> std::string;
// add the configuration for object at path 'obj'
// @param[in] obj object path for the new config
// @param[in] config configuration for the new object
auto addConfig(const sdbusplus::message::object_path& obj,
std::unique_ptr<DevicePresence> config) -> void;
// update presence information based on new gpio state
// @param[in] gpioLine name of the gpio line
// @param[in] state new state of the gpio line
auto updatePresence(const std::string& gpioLine, bool state) -> void;
// maps gpio names to cached gpio state
// true <=> High
std::unordered_map<std::string, bool> gpioState;
private:
// fetch our configuration from dbus
// @param[in] obj object path of the configuration
auto addConfigFromDbusAsync(sdbusplus::message::object_path obj)
-> sdbusplus::async::task<void>;
// delete our configuration for the object at 'objPath'
// @param[in] objPath path of the object we want to forget
auto removeConfig(const std::string& objPath) -> void;
// fetch configuration from dbus via object mapper
// and register dbus matches for configuration
auto initialize() -> sdbusplus::async::task<void>;
// handle config interface added
// @param[in] obj object path of the configuration
auto addConfigHandler(sdbusplus::message::object_path obj) -> void;
// async block on fdio gpio event and handle it
// @param[in] gpioLine name of the gpio to watch for events
auto readGPIOAsyncEvent(std::string gpioLine)
-> sdbusplus::async::task<void>;
// maps dbus object paths to configurations
// e.g. /xyz/openbmc_project/inventory/system/board/My_Baseboard/cable0
std::unordered_map<std::string, std::unique_ptr<DevicePresence>>
presenceMap;
// maps gpio names to fdios
std::unordered_map<std::string, std::unique_ptr<sdbusplus::async::fdio>>
fdios;
// maps gpio names to libgpiod lines
std::unordered_map<std::string, ::gpiod::line> gpioLines;
sdbusplus::async::context& ctx;
sdbusplus::server::manager_t manager;
ConfigProvider configProvider;
};
} // namespace gpio_presence