// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "stdafx.h"

#include "power_sampler.h"

// These correspond to the funcID values returned by GetMsrFunc
const int MSR_FUNC_FREQ = 0;
const int MSR_FUNC_POWER = 1;
const int MSR_FUNC_TEMP = 2;
const int MSR_FUNC_MAX_POWER = 3; /* ????? */

void PowerSampler::SampleCPUPowerState() {
  if (!IntelEnergyLibInitialize || !GetNumMsrs || !GetMsrName || !GetMsrFunc ||
      !GetPowerData || !ReadSample) {
    return;
  }

  int num_MSRs = 0;
  GetNumMsrs(&num_MSRs);
  ReadSample();

  for (int i = 0; i < num_MSRs; ++i) {
    int func_id;
    wchar_t MSR_name[1024];
    GetMsrFunc(i, &func_id);

    int nData;
    double data[3] = {};
    GetPowerData(0, i, data, &nData);

    if (func_id == MSR_FUNC_POWER) {
      // data[0] is Power (W)
      // data[1] is Energy (J)
      // data[2] is Energy (mWh)
      // Round to nearest .0001 to avoid distracting excess precision.
      GetMsrName(i, MSR_name);
      power_[MSR_name] = round(data[0] * 10000) / 10000;
    }
  }
}

PowerSampler::PowerSampler() {
// If Intel Power Gadget is installed then use it to get CPU power data.
#if _M_X64
  PCWSTR dllName = L"\\EnergyLib64.dll";
#else
  PCWSTR dllName = L"\\EnergyLib32.dll";
#endif
#pragma warning(disable : 4996)
  PCWSTR powerGadgetDir = _wgetenv(L"IPG_Dir");
  if (powerGadgetDir)
    energy_lib_ = LoadLibrary((std::wstring(powerGadgetDir) + dllName).c_str());
  if (energy_lib_) {
    IntelEnergyLibInitialize = (IntelEnergyLibInitialize_t)GetProcAddress(
        energy_lib_, "IntelEnergyLibInitialize");
    GetNumMsrs = (GetNumMsrs_t)GetProcAddress(energy_lib_, "GetNumMsrs");
    GetMsrName = (GetMsrName_t)GetProcAddress(energy_lib_, "GetMsrName");
    GetMsrFunc = (GetMsrFunc_t)GetProcAddress(energy_lib_, "GetMsrFunc");
    GetPowerData = (GetPowerData_t)GetProcAddress(energy_lib_, "GetPowerData");
    ReadSample = (ReadSample_t)GetProcAddress(energy_lib_, "ReadSample");

    if (IntelEnergyLibInitialize && ReadSample) {
      IntelEnergyLibInitialize();
      ReadSample();
    }
  }
}

PowerSampler::~PowerSampler() {
  if (energy_lib_)
    FreeLibrary(energy_lib_);
}