blob: 6b0bdf4913c02087b665bf374b1834c8ef30c217 [file] [log] [blame]
// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THERMALD_THERMAL_OUTPUT_PROCESSOR_H_
#define THERMALD_THERMAL_OUTPUT_PROCESSOR_H_
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/timer/timer.h"
#include "thermald/ath10k_interface.h"
#include "thermald/cpufreq_device.h"
#include "thermald/key_value_publisher.h"
namespace thermald {
// The thermal output processor is notified upon changes in thermal parameters
// and performs the corresponding actions like throttling of the wireless
// interfaces or the CPU cores.
class ThermalOutputProcessor {
public:
// Subscribes to the publisher of thermal output values.
// ThermalOutputProcessor does not take ownership of outputs, so it must
// out-live the output processor.
explicit ThermalOutputProcessor(KeyValuePublisher *outputs);
private:
enum Status {
kSkipped,
kOk,
kInvalidKey,
kDeferred,
};
void OnOutputSet(const std::string &key, int value);
Status ProcessOutput(const std::string &key, int value);
// In some situations immediate processing of certain output values is not
// possible. These values are stored in deferred_values_ and processing is
// retried periodically.
void ProcessDeferredOutputs();
Status ProcessValueAth10k(const std::vector<std::string> &key_parts,
int value);
Status ProcessValueCpu(const std::vector<std::string> &key_parts, int value);
std::map<std::string, std::unique_ptr<Ath10kInterface>> ath10k_interfaces_;
// Map with output values for deferred processing.
std::map<std::string, int> deferred_values_;
base::RepeatingTimer deferred_values_timer_;
std::vector<std::unique_ptr<CpufreqDevice>> cpufreq_devices_;
#if BASE_VER < 860220
std::unique_ptr<KeyValuePublisher::Subscription> subscription_;
#else
base::CallbackListSubscription subscription_;
#endif
base::WeakPtrFactory<ThermalOutputProcessor> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(ThermalOutputProcessor);
};
} // namespace thermald
#endif // THERMALD_THERMAL_OUTPUT_PROCESSOR_H_