/*
htop - BatteryMeter.c
(C) 2004-2011 Hisham H. Muhammad
Released under the GNU GPLv2+, see the COPYING file
in the source distribution for its full text.

This meter written by Ian P. Hands (iphands@gmail.com, ihands@redhat.com).
*/

#include "config.h" // IWYU pragma: keep

#include "BatteryMeter.h"

#include <math.h>

#include "CRT.h"
#include "Macros.h"
#include "Object.h"
#include "Platform.h"
#include "XUtils.h"


static const int BatteryMeter_attributes[] = {
   BATTERY
};

static void BatteryMeter_updateValues(Meter* this) {
   ACPresence isOnAC;
   double percent;

   Platform_getBattery(&percent, &isOnAC);

   if (!isNonnegative(percent)) {
      this->values[0] = NAN;
      xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "N/A");
      return;
   }

   this->values[0] = percent;

   const char* text;
   switch (isOnAC) {
      case AC_PRESENT:
         text = this->mode == TEXT_METERMODE ? " (Running on A/C)" : "(A/C)";
         break;
      case AC_ABSENT:
         text = this->mode == TEXT_METERMODE ? " (Running on battery)" : "(bat)";
         break;
      case AC_ERROR:
      default:
         text = "";
         break;
   }

   xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "%.1f%%%s", percent, text);
}

const MeterClass BatteryMeter_class = {
   .super = {
      .extends = Class(Meter),
      .delete = Meter_delete
   },
   .updateValues = BatteryMeter_updateValues,
   .defaultMode = TEXT_METERMODE,
   .supportedModes = METERMODE_DEFAULT_SUPPORTED,
   .maxItems = 1,
   .total = 100.0,
   .attributes = BatteryMeter_attributes,
   .name = "Battery",
   .uiName = "Battery",
   .caption = "Battery: "
};
