/**
 * 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, 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;
}
