summaryrefslogtreecommitdiffstats
path: root/led-manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'led-manager.cpp')
-rw-r--r--led-manager.cpp201
1 files changed, 0 insertions, 201 deletions
diff --git a/led-manager.cpp b/led-manager.cpp
deleted file mode 100644
index bfbf426..0000000
--- a/led-manager.cpp
+++ /dev/null
@@ -1,201 +0,0 @@
-#include <iostream>
-#include <cstring>
-#include <algorithm>
-#include <sdbusplus/vtable.hpp>
-#include <sdbusplus/message.hpp>
-#include <sdbusplus/bus.hpp>
-#include "led-manager.hpp"
-#include "led-gen.hpp"
-namespace phosphor
-{
-namespace led
-{
-
-std::set<const Group::group*> Group::assertedGroups;
-Group::group Group::currentState;
-
-/** @brief Called when the group's property is read
- * Signature as needed by sd_bus
- */
-int getGroupState(sd_bus *bus, const char *path, const char *interface,
- const char *property, sd_bus_message *reply,
- void *data, sd_bus_error* error)
-{
- auto ledMgr = static_cast<Group*>(data);
- auto state = ledMgr->getGroupState(path);
-
- sd_bus_message_append(reply, "b", state);
- return 0;
-}
-
-/** @brief Called when the group's asserted state is updated
- * Signature as needed by sd_bus
- */
-int setGroupState(sd_bus *bus, const char *path, const char *interface,
- const char *property, sd_bus_message *value,
- void *data, sd_bus_error* error)
-{
- bool state {};
- auto msg = sdbusplus::message::message(value);
- sd_bus_message_ref(value);
- msg.read(state);
-
- auto ledMgr = static_cast<Group*>(data);
- return ledMgr->setGroupState(path, state);
-}
-
-// Get the asserted state
-bool Group::getGroupState(const std::string& path)
-{
- return assertedGroups.find(&ledMap.at(path)) != assertedGroups.end();
-}
-
-// Assert -or- De-assert
-int Group::setGroupState(const std::string& path, bool assert)
-{
- if (assert)
- {
- assertedGroups.insert(&ledMap.at(path));
- }
- else
- {
- auto search = assertedGroups.find(&ledMap.at(path));
- if (search != assertedGroups.end())
- {
- assertedGroups.erase(&ledMap.at(path));
- }
- else
- {
- std::cout << "Group [ " << path << " ] Not present\n";
- }
- }
- return driveLEDs();
-}
-
-// Run through the map and apply action
-int Group::driveLEDs()
-{
- // This will contain the union of what's already in the asserted group
- group desiredState {};
- for(const auto& grp : assertedGroups)
- {
- desiredState.insert(grp->cbegin(), grp->cend());
- }
-
- // Always Do execute Turn Off and then Turn on since we have the Blink
- // taking priority over -on-
- group ledsToDeAssert {};
-
- std::set_difference(currentState.begin(), currentState.end(),
- desiredState.begin(), desiredState.end(),
- std::inserter(ledsToDeAssert, ledsToDeAssert.begin()));
- if(ledsToDeAssert.size())
- {
- // We really do not want the Group Manager to know how a particular LED
- // transitions from State-A --> State-B and all this must be handled by
- // the physical LED controller implementation.
- // So in this case, Group Manager really does not want to turn off the
- // LEDs and then turning it back on and let the physical LED controller
- // handle that.
-
- // If we previously had a FRU in ON state , and then if there was a
- // request to make it blink, the end state would now be blink.
- // If we either turn off blink / fault, then we need to go back to its
- // previous state.
- group ledsToReAssert {};
- std::set_intersection(desiredState.begin(), desiredState.end(),
- ledsToDeAssert.begin(), ledsToDeAssert.end(),
- std::inserter(ledsToReAssert, ledsToReAssert.begin()),
- ledComp);
-
- if (ledsToReAssert.size())
- {
- std::cout << "Asserting LEDs again" << std::endl;
- for (const auto& it: ledsToReAssert)
- {
- std::cout << "\t{" << it.name << "::" << it.action << "}"
- << std::endl;
- }
- }
- }
-
- // Turn on these
- group ledsToAssert {};
- std::set_difference(desiredState.begin(), desiredState.end(),
- currentState.begin(), currentState.end(),
- std::inserter(ledsToAssert, ledsToAssert.begin()));
-
- if(ledsToAssert.size())
- {
- std::cout << "Asserting LEDs" << std::endl;
- for (const auto& it: ledsToAssert)
- {
- std::cout << "\t{" << it.name << "::" << it.action << "}"
- << std::endl;
- }
- }
-
- // Done.. Save the latest and greatest.
- currentState = std::move(desiredState);
-
- return 0;
-}
-
-/** @brief Users having to assert a group will just turn this property to TRUE
- * similarly, setting this property to FALSE will deassert the group
- */
-constexpr sdbusplus::vtable::vtable_t led_vtable[] =
-{
- sdbusplus::vtable::start(),
- sdbusplus::vtable::property("Asserted", "b",
- getGroupState, setGroupState,
- sdbusplus::vtable::property_::emits_change),
- sdbusplus::vtable::end()
-};
-
-/** @brief Initialize the bus and announce services */
-Group::Group(const char* busName,
- const char* objPath,
- const char* intfName) :
- bus(sdbusplus::bus::new_system()),
- objManager(bus, objPath)
-{
- /** Now create so many dbus objects as there are groups */
- for (auto &grp: Group::ledMap)
- {
- intfContainer.emplace_back(bus, grp.first.c_str(),
- intfName, led_vtable, this);
-
- // These are now set of structs having LED name and the action. Do not
- // have anything to be done here at the moment but need to create a
- // mapping between led names to device strigs eventually
- //for (auto &set: grp.second)
- //{
-
- //}
- }
- // Once done, claim the bus and systemd will
- // consider this service started
- bus.request_name(busName);
-}
-
-/** @brief Wait for client requests */
-void Group::run()
-{
- while(true)
- {
- try
- {
- bus.process_discard();
- bus.wait();
- }
- catch (std::exception &e)
- {
- std::cerr << e.what() << std::endl;
- }
- }
-}
-
-} // namespace led
-
-} // namespace phosphor
OpenPOWER on IntegriCloud