132e84e98SVishwanatha Subbanna #include "occ_device.hpp"
294df8c90SGunnar Mills 
3cbad219eSEddie James #include "occ_manager.hpp"
4482e31ffSEddie James #include "occ_status.hpp"
532e84e98SVishwanatha Subbanna 
6*e2d0a43cSChris Cain #include <phosphor-logging/log.hpp>
7*e2d0a43cSChris Cain 
8*e2d0a43cSChris Cain #include <filesystem>
994df8c90SGunnar Mills #include <iostream>
1094df8c90SGunnar Mills 
1132e84e98SVishwanatha Subbanna namespace open_power
1232e84e98SVishwanatha Subbanna {
1332e84e98SVishwanatha Subbanna namespace occ
1432e84e98SVishwanatha Subbanna {
1532e84e98SVishwanatha Subbanna 
16*e2d0a43cSChris Cain using namespace phosphor::logging;
17*e2d0a43cSChris Cain 
1832e84e98SVishwanatha Subbanna fs::path Device::bindPath = fs::path(OCC_HWMON_PATH) / "bind";
1932e84e98SVishwanatha Subbanna fs::path Device::unBindPath = fs::path(OCC_HWMON_PATH) / "unbind";
2032e84e98SVishwanatha Subbanna 
21774f9af9SEddie James std::string Device::getPathBack(const fs::path& path)
22774f9af9SEddie James {
23774f9af9SEddie James     if (path.empty())
24bcef3b48SGeorge Liu     {
25774f9af9SEddie James         return std::string();
26bcef3b48SGeorge Liu     }
27774f9af9SEddie James 
28774f9af9SEddie James     // Points to the last element in the path
29774f9af9SEddie James     auto conf = --path.end();
30774f9af9SEddie James 
31bcef3b48SGeorge Liu     if (conf->empty() && conf != path.begin())
32774f9af9SEddie James     {
33774f9af9SEddie James         return *(--conf);
34774f9af9SEddie James     }
35774f9af9SEddie James     else
36774f9af9SEddie James     {
37774f9af9SEddie James         return *conf;
38774f9af9SEddie James     }
39774f9af9SEddie James }
40774f9af9SEddie James 
41636577f4SEdward A. James bool Device::master() const
42636577f4SEdward A. James {
43636577f4SEdward A. James     int master;
44774f9af9SEddie James     auto masterFile = devPath / "occ_master";
45636577f4SEdward A. James     std::ifstream file(masterFile, std::ios::in);
46636577f4SEdward A. James 
47636577f4SEdward A. James     if (!file)
48636577f4SEdward A. James     {
49636577f4SEdward A. James         return false;
50636577f4SEdward A. James     }
51636577f4SEdward A. James 
52636577f4SEdward A. James     file >> master;
53636577f4SEdward A. James     file.close();
54636577f4SEdward A. James     return (master != 0);
55636577f4SEdward A. James }
56636577f4SEdward A. James 
57cbad219eSEddie James void Device::errorCallback(bool error)
58cbad219eSEddie James {
59cbad219eSEddie James     if (error)
60cbad219eSEddie James     {
61cbad219eSEddie James         statusObject.deviceError();
62cbad219eSEddie James     }
63cbad219eSEddie James }
64cbad219eSEddie James 
65cbad219eSEddie James #ifdef PLDM
66cbad219eSEddie James void Device::timeoutCallback(bool error)
67cbad219eSEddie James {
68cbad219eSEddie James     if (error)
69cbad219eSEddie James     {
70cbad219eSEddie James         managerObject.sbeTimeout(instance);
71cbad219eSEddie James     }
72cbad219eSEddie James }
73cbad219eSEddie James #endif
74cbad219eSEddie James 
75482e31ffSEddie James void Device::throttleProcTempCallback(bool error)
76482e31ffSEddie James {
77482e31ffSEddie James     statusObject.throttleProcTemp(error);
78482e31ffSEddie James }
79482e31ffSEddie James 
80482e31ffSEddie James void Device::throttleProcPowerCallback(bool error)
81482e31ffSEddie James {
82482e31ffSEddie James     statusObject.throttleProcPower(error);
83482e31ffSEddie James }
84482e31ffSEddie James 
85482e31ffSEddie James void Device::throttleMemTempCallback(bool error)
86482e31ffSEddie James {
87482e31ffSEddie James     statusObject.throttleMemTemp(error);
88482e31ffSEddie James }
89482e31ffSEddie James 
90*e2d0a43cSChris Cain fs::path Device::getFilenameByRegex(fs::path basePath,
91*e2d0a43cSChris Cain                                     const std::regex& expr) const
92*e2d0a43cSChris Cain {
93*e2d0a43cSChris Cain     try
94*e2d0a43cSChris Cain     {
95*e2d0a43cSChris Cain         for (auto& file : fs::directory_iterator(basePath))
96*e2d0a43cSChris Cain         {
97*e2d0a43cSChris Cain             if (std::regex_search(file.path().string(), expr))
98*e2d0a43cSChris Cain             {
99*e2d0a43cSChris Cain                 // Found match
100*e2d0a43cSChris Cain                 return file;
101*e2d0a43cSChris Cain             }
102*e2d0a43cSChris Cain         }
103*e2d0a43cSChris Cain     }
104*e2d0a43cSChris Cain     catch (const fs::filesystem_error& e)
105*e2d0a43cSChris Cain     {
106*e2d0a43cSChris Cain         log<level::ERR>(
107*e2d0a43cSChris Cain             fmt::format("getFilenameByRegex: Failed to get filename: {}",
108*e2d0a43cSChris Cain                         e.what())
109*e2d0a43cSChris Cain                 .c_str());
110*e2d0a43cSChris Cain     }
111*e2d0a43cSChris Cain 
112*e2d0a43cSChris Cain     // Return empty path
113*e2d0a43cSChris Cain     return fs::path{};
114*e2d0a43cSChris Cain }
115*e2d0a43cSChris Cain 
11632e84e98SVishwanatha Subbanna } // namespace occ
11732e84e98SVishwanatha Subbanna } // namespace open_power
118