| /** | 
 |  * Copyright © 2020 IBM Corporation | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  *     http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  */ | 
 |  | 
 | #include "device.hpp" | 
 |  | 
 | #include "chassis.hpp" | 
 | #include "error_logging_utils.hpp" | 
 | #include "exception_utils.hpp" | 
 | #include "system.hpp" | 
 |  | 
 | #include <exception> | 
 |  | 
 | namespace phosphor::power::regulators | 
 | { | 
 |  | 
 | void Device::addToIDMap(IDMap& idMap) | 
 | { | 
 |     // Add this device to the map | 
 |     idMap.addDevice(*this); | 
 |  | 
 |     // Add rails to the map | 
 |     for (std::unique_ptr<Rail>& rail : rails) | 
 |     { | 
 |         idMap.addRail(*rail); | 
 |     } | 
 | } | 
 |  | 
 | void Device::clearCache() | 
 | { | 
 |     // If presence detection is defined for this device | 
 |     if (presenceDetection) | 
 |     { | 
 |         // Clear cached presence data | 
 |         presenceDetection->clearCache(); | 
 |     } | 
 | } | 
 |  | 
 | void Device::clearErrorHistory() | 
 | { | 
 |     // Clear error history in phase fault detection, if defined | 
 |     if (phaseFaultDetection) | 
 |     { | 
 |         phaseFaultDetection->clearErrorHistory(); | 
 |     } | 
 |  | 
 |     // Clear error history in each rail | 
 |     for (std::unique_ptr<Rail>& rail : rails) | 
 |     { | 
 |         rail->clearErrorHistory(); | 
 |     } | 
 | } | 
 |  | 
 | void Device::close(Services& services) | 
 | { | 
 |     try | 
 |     { | 
 |         // Close I2C interface if it is open | 
 |         if (i2cInterface->isOpen()) | 
 |         { | 
 |             i2cInterface->close(); | 
 |         } | 
 |     } | 
 |     catch (const std::exception& e) | 
 |     { | 
 |         // Log error messages in journal | 
 |         services.getJournal().logError(exception_utils::getMessages(e)); | 
 |         services.getJournal().logError("Unable to close device " + id); | 
 |  | 
 |         // Create error log entry | 
 |         error_logging_utils::logError(std::current_exception(), | 
 |                                       Entry::Level::Notice, services); | 
 |     } | 
 | } | 
 |  | 
 | void Device::configure(Services& services, System& system, Chassis& chassis) | 
 | { | 
 |     // Verify device is present | 
 |     if (isPresent(services, system, chassis)) | 
 |     { | 
 |         // If configuration changes are defined for this device, apply them | 
 |         if (configuration) | 
 |         { | 
 |             configuration->execute(services, system, chassis, *this); | 
 |         } | 
 |  | 
 |         // Configure rails | 
 |         for (std::unique_ptr<Rail>& rail : rails) | 
 |         { | 
 |             rail->configure(services, system, chassis, *this); | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | void Device::detectPhaseFaults(Services& services, System& system, | 
 |                                Chassis& chassis) | 
 | { | 
 |     // Verify device is present | 
 |     if (isPresent(services, system, chassis)) | 
 |     { | 
 |         // If phase fault detection is defined for this device, execute it | 
 |         if (phaseFaultDetection) | 
 |         { | 
 |             phaseFaultDetection->execute(services, system, chassis, *this); | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | void Device::monitorSensors(Services& services, System& system, | 
 |                             Chassis& chassis) | 
 | { | 
 |     // Verify device is present | 
 |     if (isPresent(services, system, chassis)) | 
 |     { | 
 |         // Monitor sensors in each rail | 
 |         for (std::unique_ptr<Rail>& rail : rails) | 
 |         { | 
 |             rail->monitorSensors(services, system, chassis, *this); | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | } // namespace phosphor::power::regulators |