// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: Copyright 2017 Google Inc

#include "pluggable.hpp"

#include "hoststatemonitor.hpp"
#include "interfaces.hpp"

#include <cstdint>
#include <string>

namespace pid_control
{

ReadReturn PluggableSensor::read(void)
{
    return _reader->read();
}

void PluggableSensor::write(double value)
{
    _writer->write(value);
}

void PluggableSensor::write(double value, bool force, int64_t* written)
{
    _writer->write(value, force, written);
}

bool PluggableSensor::getFailed(void)
{
    bool isFailed = _reader->getFailed();

    if (isFailed && getIgnoreFailIfHostOff())
    {
        auto& hostState = HostStateMonitor::getInstance();
        if (!hostState.isPowerOn())
        {
            return false;
        }
    }

    return isFailed;
}

std::string PluggableSensor::getFailReason(void)
{
    return _reader->getFailReason();
}

} // namespace pid_control
