// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// The System Management Controller (SMC) is a hardware component that controls
// the power functions of Intel-based Macs. This file defines a class to read
// known SMC keys.
#ifndef COMPONENTS_POWER_METRICS_SMC_MAC_H_
#define COMPONENTS_POWER_METRICS_SMC_MAC_H_
#import <Foundation/Foundation.h>
#include <memory>
#include <optional>
#include "base/containers/flat_map.h"
#include "base/mac/scoped_ioobject.h"
#include "components/power_metrics/smc_internal_types_mac.h"
namespace power_metrics {
class SMCReader {
public:
// Creates an SMC Reader. Returns nullptr in case of failure.
static std::unique_ptr<SMCReader> Create();
virtual ~SMCReader();
// Returns the value of a key, or nullopt if not available.
// Virtual for testing.
virtual std::optional<double> ReadKey(SMCKeyIdentifier identifier);
protected:
explicit SMCReader(base::mac::ScopedIOObject<io_object_t> connect);
private:
class SMCKey {
public:
SMCKey(base::mac::ScopedIOObject<io_object_t> connect,
SMCKeyIdentifier key_identifier);
SMCKey(SMCKey&&);
SMCKey& operator=(SMCKey&&);
~SMCKey();
bool Exists() const;
std::optional<double> Read();
private:
bool CallSMCFunction(uint8_t function, SMCParamStruct* out);
base::mac::ScopedIOObject<io_object_t> connect_;
SMCKeyIdentifier key_identifier_;
SMCKeyInfoData key_info_;
};
base::mac::ScopedIOObject<io_object_t> connect_;
base::flat_map<SMCKeyIdentifier, SMCKey> keys_;
};
} // namespace power_metrics
#endif // COMPONENTS_POWER_METRICS_SMC_MAC_H_