132e84e98SVishwanatha Subbanna #include "occ_device.hpp"
294df8c90SGunnar Mills 
3cbad219eSEddie James #include "occ_manager.hpp"
4482e31ffSEddie James #include "occ_status.hpp"
532e84e98SVishwanatha Subbanna 
6e2d0a43cSChris Cain #include <phosphor-logging/log.hpp>
7e2d0a43cSChris Cain 
8e2d0a43cSChris Cain #include <filesystem>
994df8c90SGunnar Mills #include <iostream>
1094df8c90SGunnar Mills 
1132e84e98SVishwanatha Subbanna namespace open_power
1232e84e98SVishwanatha Subbanna {
1332e84e98SVishwanatha Subbanna namespace occ
1432e84e98SVishwanatha Subbanna {
1532e84e98SVishwanatha Subbanna 
16e2d0a43cSChris Cain using namespace phosphor::logging;
17e2d0a43cSChris Cain 
18aced3098SEddie James void Device::setActive(bool active)
19aced3098SEddie James {
20aced3098SEddie James     std::string data = active ? "1" : "0";
21aced3098SEddie James     auto activeFile = devPath / "occ_active";
22aced3098SEddie James     try
23aced3098SEddie James     {
24aced3098SEddie James         write(activeFile, data);
25aced3098SEddie James     }
26aced3098SEddie James     catch (const std::exception& e)
27aced3098SEddie James     {
28aced3098SEddie James         log<level::ERR>(fmt::format("Failed to set {} active: {}",
29aced3098SEddie James                                     devPath.c_str(), e.what())
30aced3098SEddie James                             .c_str());
31aced3098SEddie James     }
32aced3098SEddie James }
3332e84e98SVishwanatha Subbanna 
34774f9af9SEddie James std::string Device::getPathBack(const fs::path& path)
35774f9af9SEddie James {
36774f9af9SEddie James     if (path.empty())
37bcef3b48SGeorge Liu     {
38774f9af9SEddie James         return std::string();
39bcef3b48SGeorge Liu     }
40774f9af9SEddie James 
41774f9af9SEddie James     // Points to the last element in the path
42774f9af9SEddie James     auto conf = --path.end();
43774f9af9SEddie James 
44bcef3b48SGeorge Liu     if (conf->empty() && conf != path.begin())
45774f9af9SEddie James     {
46774f9af9SEddie James         return *(--conf);
47774f9af9SEddie James     }
48774f9af9SEddie James     else
49774f9af9SEddie James     {
50774f9af9SEddie James         return *conf;
51774f9af9SEddie James     }
52774f9af9SEddie James }
53774f9af9SEddie James 
54aced3098SEddie James bool Device::active() const
55aced3098SEddie James {
56aced3098SEddie James     return readBinary("occ_active");
57aced3098SEddie James }
58aced3098SEddie James 
59636577f4SEdward A. James bool Device::master() const
60636577f4SEdward A. James {
61aced3098SEddie James     return readBinary("occ_master");
62aced3098SEddie James }
63aced3098SEddie James 
64aced3098SEddie James bool Device::readBinary(const std::string& fileName) const
65aced3098SEddie James {
66*bd551de3SChris Cain     int v = 0;
67*bd551de3SChris Cain     if (statusObject.occActive())
68*bd551de3SChris Cain     {
69aced3098SEddie James         auto filePath = devPath / fileName;
70aced3098SEddie James         std::ifstream file(filePath, std::ios::in);
71636577f4SEdward A. James         if (!file)
72636577f4SEdward A. James         {
73636577f4SEdward A. James             return false;
74636577f4SEdward A. James         }
75636577f4SEdward A. James 
76aced3098SEddie James         file >> v;
77636577f4SEdward A. James         file.close();
78*bd551de3SChris Cain     }
79aced3098SEddie James     return v == 1;
80636577f4SEdward A. James }
81636577f4SEdward A. James 
82cbad219eSEddie James void Device::errorCallback(bool error)
83cbad219eSEddie James {
84cbad219eSEddie James     if (error)
85cbad219eSEddie James     {
86cbad219eSEddie James         statusObject.deviceError();
87cbad219eSEddie James     }
88cbad219eSEddie James }
89cbad219eSEddie James 
90cbad219eSEddie James #ifdef PLDM
91cbad219eSEddie James void Device::timeoutCallback(bool error)
92cbad219eSEddie James {
93cbad219eSEddie James     if (error)
94cbad219eSEddie James     {
95cbad219eSEddie James         managerObject.sbeTimeout(instance);
96cbad219eSEddie James     }
97cbad219eSEddie James }
98cbad219eSEddie James #endif
99cbad219eSEddie James 
100482e31ffSEddie James void Device::throttleProcTempCallback(bool error)
101482e31ffSEddie James {
102482e31ffSEddie James     statusObject.throttleProcTemp(error);
103482e31ffSEddie James }
104482e31ffSEddie James 
105482e31ffSEddie James void Device::throttleProcPowerCallback(bool error)
106482e31ffSEddie James {
107482e31ffSEddie James     statusObject.throttleProcPower(error);
108482e31ffSEddie James }
109482e31ffSEddie James 
110482e31ffSEddie James void Device::throttleMemTempCallback(bool error)
111482e31ffSEddie James {
112482e31ffSEddie James     statusObject.throttleMemTemp(error);
113482e31ffSEddie James }
114482e31ffSEddie James 
115e2d0a43cSChris Cain fs::path Device::getFilenameByRegex(fs::path basePath,
116e2d0a43cSChris Cain                                     const std::regex& expr) const
117e2d0a43cSChris Cain {
118e2d0a43cSChris Cain     try
119e2d0a43cSChris Cain     {
120e2d0a43cSChris Cain         for (auto& file : fs::directory_iterator(basePath))
121e2d0a43cSChris Cain         {
122e2d0a43cSChris Cain             if (std::regex_search(file.path().string(), expr))
123e2d0a43cSChris Cain             {
124e2d0a43cSChris Cain                 // Found match
125e2d0a43cSChris Cain                 return file;
126e2d0a43cSChris Cain             }
127e2d0a43cSChris Cain         }
128e2d0a43cSChris Cain     }
129e2d0a43cSChris Cain     catch (const fs::filesystem_error& e)
130e2d0a43cSChris Cain     {
131e2d0a43cSChris Cain         log<level::ERR>(
132e2d0a43cSChris Cain             fmt::format("getFilenameByRegex: Failed to get filename: {}",
133e2d0a43cSChris Cain                         e.what())
134e2d0a43cSChris Cain                 .c_str());
135e2d0a43cSChris Cain     }
136e2d0a43cSChris Cain 
137e2d0a43cSChris Cain     // Return empty path
138e2d0a43cSChris Cain     return fs::path{};
139e2d0a43cSChris Cain }
140e2d0a43cSChris Cain 
14132e84e98SVishwanatha Subbanna } // namespace occ
14232e84e98SVishwanatha Subbanna } // namespace open_power
143