/**
 * 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 <chrono>
#include <map>
#include <memory>
#include <thread>
#include <vector>

#include "pidthread.hpp"

#include "pid/controller.hpp"
#include "sensors/sensor.hpp"


static void ProcessThermals(std::shared_ptr<PIDZone> zone)
{
    // Get the latest margins.
    zone->updateSensors();
    // Zero out the RPM set point goals.
    zone->clearRPMSetPoints();
    // Run the margin PIDs.
    zone->process_thermals();
    // Get the maximum RPM set-point.
    zone->determineMaxRPMRequest();
}


void PIDControlThread(std::shared_ptr<PIDZone> zone)
{
    int ms100cnt = 0;
    /*
     * This should sleep on the conditional wait for the listen thread to tell
     * us it's in sync.  But then we also need a timeout option in case
     * phosphor-hwmon is down, we can go into some weird failure more.
     *
     * Another approach would be to start all sensors in worst-case values,
     * and fail-safe mode and then clear out of fail-safe mode once we start
     * getting values.  Which I think it is a solid approach.
     *
     * For now this runs before it necessarily has any sensor values.  For the
     * host sensors they start out in fail-safe mode.  For the fans, they start
     * out as 0 as input and then are adjusted once they have values.
     *
     * If a fan has failed, it's value will be whatever we're told or however
     * we retrieve it.  This program disregards fan values of 0, so any code
     * providing a fan speed can set to 0 on failure and that fan value will be
     * effectively ignored.  The PID algorithm will be unhappy but nothing bad
     * will happen.
     *
     * TODO(venture): If the fan value is 0 should that loop just be skipped?
     * Right now, a 0 value is ignored in FanController::input_proc()
     */
#ifdef __TUNING_LOGGING__
    zone->initializeLog();
#endif
    zone->initializeCache();
    ProcessThermals(zone);

    while (true)
    {
        using namespace std::literals::chrono_literals;
        std::this_thread::sleep_for(0.1s);

        // Check if we should just go back to sleep.
        if (zone->getManualMode())
        {
            continue;
        }

        // Get the latest fan speeds.
        zone->updateFanTelemetry();

        if (10 <= ms100cnt)
        {
            ms100cnt = 0;

            ProcessThermals(zone);
        }

        // Run the fan PIDs every iteration.
        zone->process_fans();

#ifdef __TUNING_LOGGING__
        zone->getLogHandle() << std::endl;
#endif

        ms100cnt += 1;
    }

    return;
}


