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 
18*aced3098SEddie James void Device::setActive(bool active)
19*aced3098SEddie James {
20*aced3098SEddie James     std::string data = active ? "1" : "0";
21*aced3098SEddie James     auto activeFile = devPath / "occ_active";
22*aced3098SEddie James     try
23*aced3098SEddie James     {
24*aced3098SEddie James         write(activeFile, data);
25*aced3098SEddie James     }
26*aced3098SEddie James     catch (const std::exception& e)
27*aced3098SEddie James     {
28*aced3098SEddie James         log<level::ERR>(fmt::format("Failed to set {} active: {}",
29*aced3098SEddie James                                     devPath.c_str(), e.what())
30*aced3098SEddie James                             .c_str());
31*aced3098SEddie James     }
32*aced3098SEddie 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 
54*aced3098SEddie James bool Device::active() const
55*aced3098SEddie James {
56*aced3098SEddie James     return readBinary("occ_active");
57*aced3098SEddie James }
58*aced3098SEddie James 
59636577f4SEdward A. James bool Device::master() const
60636577f4SEdward A. James {
61*aced3098SEddie James     return readBinary("occ_master");
62*aced3098SEddie James }
63*aced3098SEddie James 
64*aced3098SEddie James bool Device::readBinary(const std::string& fileName) const
65*aced3098SEddie James {
66*aced3098SEddie James     int v;
67*aced3098SEddie James     auto filePath = devPath / fileName;
68*aced3098SEddie James     std::ifstream file(filePath, std::ios::in);
69636577f4SEdward A. James 
70636577f4SEdward A. James     if (!file)
71636577f4SEdward A. James     {
72636577f4SEdward A. James         return false;
73636577f4SEdward A. James     }
74636577f4SEdward A. James 
75*aced3098SEddie James     file >> v;
76636577f4SEdward A. James     file.close();
77*aced3098SEddie James     return v == 1;
78636577f4SEdward A. James }
79636577f4SEdward A. James 
80cbad219eSEddie James void Device::errorCallback(bool error)
81cbad219eSEddie James {
82cbad219eSEddie James     if (error)
83cbad219eSEddie James     {
84cbad219eSEddie James         statusObject.deviceError();
85cbad219eSEddie James     }
86cbad219eSEddie James }
87cbad219eSEddie James 
88cbad219eSEddie James #ifdef PLDM
89cbad219eSEddie James void Device::timeoutCallback(bool error)
90cbad219eSEddie James {
91cbad219eSEddie James     if (error)
92cbad219eSEddie James     {
93cbad219eSEddie James         managerObject.sbeTimeout(instance);
94cbad219eSEddie James     }
95cbad219eSEddie James }
96cbad219eSEddie James #endif
97cbad219eSEddie James 
98482e31ffSEddie James void Device::throttleProcTempCallback(bool error)
99482e31ffSEddie James {
100482e31ffSEddie James     statusObject.throttleProcTemp(error);
101482e31ffSEddie James }
102482e31ffSEddie James 
103482e31ffSEddie James void Device::throttleProcPowerCallback(bool error)
104482e31ffSEddie James {
105482e31ffSEddie James     statusObject.throttleProcPower(error);
106482e31ffSEddie James }
107482e31ffSEddie James 
108482e31ffSEddie James void Device::throttleMemTempCallback(bool error)
109482e31ffSEddie James {
110482e31ffSEddie James     statusObject.throttleMemTemp(error);
111482e31ffSEddie James }
112482e31ffSEddie James 
113e2d0a43cSChris Cain fs::path Device::getFilenameByRegex(fs::path basePath,
114e2d0a43cSChris Cain                                     const std::regex& expr) const
115e2d0a43cSChris Cain {
116e2d0a43cSChris Cain     try
117e2d0a43cSChris Cain     {
118e2d0a43cSChris Cain         for (auto& file : fs::directory_iterator(basePath))
119e2d0a43cSChris Cain         {
120e2d0a43cSChris Cain             if (std::regex_search(file.path().string(), expr))
121e2d0a43cSChris Cain             {
122e2d0a43cSChris Cain                 // Found match
123e2d0a43cSChris Cain                 return file;
124e2d0a43cSChris Cain             }
125e2d0a43cSChris Cain         }
126e2d0a43cSChris Cain     }
127e2d0a43cSChris Cain     catch (const fs::filesystem_error& e)
128e2d0a43cSChris Cain     {
129e2d0a43cSChris Cain         log<level::ERR>(
130e2d0a43cSChris Cain             fmt::format("getFilenameByRegex: Failed to get filename: {}",
131e2d0a43cSChris Cain                         e.what())
132e2d0a43cSChris Cain                 .c_str());
133e2d0a43cSChris Cain     }
134e2d0a43cSChris Cain 
135e2d0a43cSChris Cain     // Return empty path
136e2d0a43cSChris Cain     return fs::path{};
137e2d0a43cSChris Cain }
138e2d0a43cSChris Cain 
13932e84e98SVishwanatha Subbanna } // namespace occ
14032e84e98SVishwanatha Subbanna } // namespace open_power
141