/**
 * Copyright 2017 Google Inc.
 *
 * 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 "thermalcontroller.hpp"

#include "util.hpp"
#include "zone.hpp"

std::unique_ptr<PIDController> ThermalController::CreateThermalPid(
    ZoneInterface* owner, const std::string& id,
    const std::vector<std::string>& inputs, float setpoint,
    const ec::pidinfo& initial)
{
    // ThermalController currently only supports precisely one input.
    if (inputs.size() != 1)
    {
        return nullptr;
    }

    auto thermal = std::make_unique<ThermalController>(id, inputs, owner);

    ec::pid_info_t* info = thermal->get_pid_info();
    thermal->set_setpoint(setpoint);

    InitializePIDStruct(info, initial);

    return thermal;
}

// bmc_host_sensor_value_float
float ThermalController::input_proc(void)
{
    /*
     * This only supports one thermal input because it doesn't yet know how to
     * handle merging them, probably max?
     */
    double value = _owner->getCachedValue(_inputs.at(0));
    return static_cast<float>(value);
}

// bmc_get_setpt
float ThermalController::setpt_proc(void)
{
    float setpoint = get_setpoint();

    /* TODO(venture): Thermal setpoint invalid? */
#if 0
    if (-1 == setpoint)
    {
        return 0.0f;
    }
    else
    {
        return setpoint;
    }
#endif
    return setpoint;
}

// bmc_set_pid_output
void ThermalController::output_proc(float value)
{
    _owner->addRPMSetPoint(value);

    return;
}
