2020-06-28 04:19:49 +00:00
|
|
|
#pragma once
|
2020-06-29 01:17:52 +00:00
|
|
|
#include "Status.h"
|
2020-06-28 04:19:49 +00:00
|
|
|
#include "configuration.h"
|
2020-08-25 19:48:47 +00:00
|
|
|
#include <Arduino.h>
|
2020-06-28 04:19:49 +00:00
|
|
|
|
2020-08-25 19:48:47 +00:00
|
|
|
namespace meshtastic
|
|
|
|
{
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A boolean where we have a third state of Unknown
|
|
|
|
*/
|
|
|
|
enum OptionalBool { OptFalse = 0, OptTrue = 1, OptUnknown = 2 };
|
|
|
|
|
2021-01-12 01:30:02 +00:00
|
|
|
/// Describes the state of the Power system.
|
2020-08-25 19:48:47 +00:00
|
|
|
class PowerStatus : public Status
|
|
|
|
{
|
|
|
|
|
|
|
|
private:
|
|
|
|
CallbackObserver<PowerStatus, const PowerStatus *> statusObserver =
|
|
|
|
CallbackObserver<PowerStatus, const PowerStatus *>(this, &PowerStatus::updateStatus);
|
|
|
|
|
|
|
|
/// Whether we have a battery connected
|
|
|
|
OptionalBool hasBattery = OptUnknown;
|
|
|
|
/// Battery voltage in mV, valid if haveBattery is true
|
2020-08-25 20:00:55 +00:00
|
|
|
int batteryVoltageMv = 0;
|
2020-08-25 19:48:47 +00:00
|
|
|
/// Battery charge percentage, either read directly or estimated
|
2020-08-25 20:00:55 +00:00
|
|
|
int8_t batteryChargePercent = 0;
|
2020-08-25 19:48:47 +00:00
|
|
|
/// Whether USB is connected
|
|
|
|
OptionalBool hasUSB = OptUnknown;
|
|
|
|
/// Whether we are charging the battery
|
|
|
|
OptionalBool isCharging = OptUnknown;
|
|
|
|
|
|
|
|
public:
|
|
|
|
PowerStatus() { statusType = STATUS_TYPE_POWER; }
|
|
|
|
PowerStatus(OptionalBool hasBattery, OptionalBool hasUSB, OptionalBool isCharging, int batteryVoltageMv = -1,
|
2020-08-25 20:00:55 +00:00
|
|
|
int8_t batteryChargePercent = 0)
|
2020-08-25 19:48:47 +00:00
|
|
|
: Status()
|
2020-06-29 01:17:52 +00:00
|
|
|
{
|
2020-08-25 19:48:47 +00:00
|
|
|
this->hasBattery = hasBattery;
|
|
|
|
this->hasUSB = hasUSB;
|
|
|
|
this->isCharging = isCharging;
|
|
|
|
this->batteryVoltageMv = batteryVoltageMv;
|
|
|
|
this->batteryChargePercent = batteryChargePercent;
|
|
|
|
}
|
|
|
|
PowerStatus(const PowerStatus &);
|
|
|
|
PowerStatus &operator=(const PowerStatus &);
|
2020-06-29 01:17:52 +00:00
|
|
|
|
2020-08-25 19:48:47 +00:00
|
|
|
void observe(Observable<const PowerStatus *> *source) { statusObserver.observe(source); }
|
2020-06-28 04:19:49 +00:00
|
|
|
|
2020-08-25 19:48:47 +00:00
|
|
|
bool getHasBattery() const { return hasBattery == OptTrue; }
|
2020-06-28 04:19:49 +00:00
|
|
|
|
2020-08-25 19:48:47 +00:00
|
|
|
bool getHasUSB() const { return hasUSB == OptTrue; }
|
2020-06-28 04:19:49 +00:00
|
|
|
|
2020-08-25 19:48:47 +00:00
|
|
|
/// Can we even know if this board has USB power or not
|
|
|
|
bool knowsUSB() const { return hasUSB != OptUnknown; }
|
2020-06-28 04:19:49 +00:00
|
|
|
|
2020-08-25 19:48:47 +00:00
|
|
|
bool getIsCharging() const { return isCharging == OptTrue; }
|
2020-06-28 04:19:49 +00:00
|
|
|
|
2020-08-25 19:48:47 +00:00
|
|
|
int getBatteryVoltageMv() const { return batteryVoltageMv; }
|
2020-06-29 01:17:52 +00:00
|
|
|
|
2020-08-25 20:00:55 +00:00
|
|
|
/**
|
|
|
|
* Note: 0% battery means 'unknown/this board doesn't have a battery installed'
|
|
|
|
*/
|
|
|
|
uint8_t getBatteryChargePercent() const { return getHasBattery() ? batteryChargePercent : 0; }
|
2020-06-29 01:17:52 +00:00
|
|
|
|
2020-08-25 19:48:47 +00:00
|
|
|
bool matches(const PowerStatus *newStatus) const
|
|
|
|
{
|
|
|
|
return (newStatus->getHasBattery() != hasBattery || newStatus->getHasUSB() != hasUSB ||
|
|
|
|
newStatus->getBatteryVoltageMv() != batteryVoltageMv);
|
|
|
|
}
|
|
|
|
int updateStatus(const PowerStatus *newStatus)
|
|
|
|
{
|
|
|
|
// Only update the status if values have actually changed
|
|
|
|
bool isDirty;
|
2020-06-29 01:17:52 +00:00
|
|
|
{
|
2020-08-25 19:48:47 +00:00
|
|
|
isDirty = matches(newStatus);
|
|
|
|
initialized = true;
|
|
|
|
hasBattery = newStatus->hasBattery;
|
|
|
|
batteryVoltageMv = newStatus->getBatteryVoltageMv();
|
|
|
|
batteryChargePercent = newStatus->getBatteryChargePercent();
|
|
|
|
hasUSB = newStatus->hasUSB;
|
|
|
|
isCharging = newStatus->isCharging;
|
2020-06-29 01:17:52 +00:00
|
|
|
}
|
2020-08-25 19:48:47 +00:00
|
|
|
if (isDirty) {
|
2020-10-18 01:32:12 +00:00
|
|
|
// DEBUG_MSG("Battery %dmV %d%%\n", batteryVoltageMv, batteryChargePercent);
|
2020-08-25 19:48:47 +00:00
|
|
|
onNewStatus.notifyObservers(this);
|
2020-06-29 01:17:52 +00:00
|
|
|
}
|
2020-08-25 19:48:47 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
};
|
2020-06-29 01:17:52 +00:00
|
|
|
|
2020-08-25 19:48:47 +00:00
|
|
|
} // namespace meshtastic
|
2020-06-28 04:19:49 +00:00
|
|
|
|
2020-06-29 01:17:52 +00:00
|
|
|
extern meshtastic::PowerStatus *powerStatus;
|