/**
 * 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(
    PIDZone* owner,
    const std::string& id,
    std::vector<std::string>& inputs,
    float setpoint,
    ec::pidinfo initial)
{
    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;
}

