blob: 23eaa35affb5bc0c19fe9ad06fa0f8d7d71e997f [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_TEMPERATURE_SENSOR_MONITOR_H_
#define THERMALD_TEMPERATURE_SENSOR_MONITOR_H_
#include <map>
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/callback_list.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "thermald/temperature_monitor_interface.h"
#include "thermald/temperature_sensor_interface.h"
namespace thermald {
// Periodically reads a temperature sensor at a configurable rate and
// provides an interface to subscribe for notification upon temperature
// changes.
//
// Subscribers are only notified about changes in the temperature, not every
// time the sensor is read. The monitoring of the sensors is only performed
// when at least one subscription is active.
//
// The TemperatureSensorMonitor is based on the libbase event model. A
// TemperatureSensorMonitor instance must not be used in multiple threads
// of execution.
class TemperatureSensorMonitor : public TemperatureMonitorInterface {
public:
// Does not take ownership of the sensor.
TemperatureSensorMonitor(TemperatureSensorInterface *sensor,
base::TimeDelta sample_period);
virtual ~TemperatureSensorMonitor();
std::string name() const;
#if BASE_VER < 860220
std::unique_ptr<TemperatureMonitorInterface::Subscription>
#else
base::CallbackListSubscription
#endif
Subscribe(const TemperatureMonitorCallback &cb);
private:
friend class TemperatureSensorMonitorTest;
void StartSampling();
void StopSampling();
// Invoked whenever a subscriber is removed.
void OnSubscriberRemoved();
// Read the temperature sensor and reports changes to all subscribers.
void ReadAndReportTemperature();
// Report the current/latest temperature to a new subscriber.
void ReportInitialTemperature(const TemperatureMonitorCallback &cb,
int temperature);
TemperatureSensorInterface *sensor_;
const base::TimeDelta sample_period_;
base::WeakPtrFactory<TemperatureSensorMonitor> weak_ptr_factory_;
base::CallbackList<void(int)> subscribers_;
int prev_temperature_;
bool sensor_was_operational_;
// Timer for periodic sampling.
//
// The Timer class is used instead of RepeatingTimer to facilitate testing
// through injection of a MockTimer.
std::unique_ptr<base::RepeatingTimer> timer_;
DISALLOW_COPY_AND_ASSIGN(TemperatureSensorMonitor);
};
} // namespace thermald
#endif // THERMALD_TEMPERATURE_SENSOR_MONITOR_H_