1 #include "config.h" 2 3 #include "group.hpp" 4 #include "ledlayout.hpp" 5 #ifdef LED_USE_JSON 6 #include "json-parser.hpp" 7 #else 8 #include "led-gen.hpp" 9 #endif 10 #include "config-validator.hpp" 11 #include "manager.hpp" 12 #include "serialize.hpp" 13 #include "utils.hpp" 14 #ifdef USE_LAMP_TEST 15 #include "lamptest/lamptest.hpp" 16 #endif 17 18 #include <CLI/CLI.hpp> 19 #include <sdeventplus/event.hpp> 20 21 #include <algorithm> 22 #include <iostream> 23 #include <memory> 24 25 int main(int argc, char** argv) 26 { 27 CLI::App app("phosphor-led-manager"); 28 29 #ifdef LED_USE_JSON 30 std::string configFile{}; 31 app.add_option("-c,--config", configFile, "Path to JSON config"); 32 #endif 33 34 CLI11_PARSE(app, argc, argv); 35 36 // Get a default event loop 37 auto event = sdeventplus::Event::get_default(); 38 39 /** @brief Dbus constructs used by LED Group manager */ 40 auto& bus = phosphor::led::utils::DBusHandler::getBus(); 41 42 #ifdef LED_USE_JSON 43 auto systemLedMap = getSystemLedMap(configFile); 44 #endif 45 46 phosphor::led::validateConfigV1(systemLedMap); 47 48 /** @brief Group manager object */ 49 phosphor::led::Manager manager(bus, systemLedMap, event); 50 51 /** @brief sd_bus object manager */ 52 sdbusplus::server::manager_t objManager(bus, 53 "/xyz/openbmc_project/led/groups"); 54 55 /** @brief vector of led groups */ 56 std::vector<std::unique_ptr<phosphor::led::Group>> groups; 57 58 std::shared_ptr<phosphor::led::Serialize> serializePtr = nullptr; 59 #ifdef PERSISTENT_LED_ASSERTED 60 /** @brief store and re-store Group */ 61 serializePtr = 62 std::make_shared<phosphor::led::Serialize>(SAVED_GROUPS_FILE); 63 #endif 64 65 #ifdef USE_LAMP_TEST 66 phosphor::led::LampTest lampTest(event, manager); 67 68 // Clear leds triggered by lamp test in previous boot 69 lampTest.clearLamps(); 70 71 groups.emplace_back(std::make_unique<phosphor::led::Group>( 72 bus, LAMP_TEST_OBJECT, manager, serializePtr, 73 std::bind(std::mem_fn(&phosphor::led::LampTest::requestHandler), 74 &lampTest, std::placeholders::_1, std::placeholders::_2))); 75 76 // Register a lamp test method in the manager class, and call this method 77 // when the lamp test is started 78 manager.setLampTestCallBack( 79 std::bind(std::mem_fn(&phosphor::led::LampTest::processLEDUpdates), 80 &lampTest, std::placeholders::_1, std::placeholders::_2)); 81 #endif 82 83 /** Now create so many dbus objects as there are groups */ 84 std::ranges::transform(systemLedMap, std::back_inserter(groups), 85 [&bus, &manager, serializePtr](auto& grp) { 86 return std::make_unique<phosphor::led::Group>( 87 bus, grp.first, manager, serializePtr); 88 }); 89 90 // Attach the bus to sd_event to service user requests 91 bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL); 92 93 /** @brief Claim the bus */ 94 bus.request_name("xyz.openbmc_project.LED.GroupManager"); 95 event.loop(); 96 97 return 0; 98 } 99