mirror of
https://github.com/meshtastic/firmware.git
synced 2025-12-22 02:32:23 +00:00
Refactored status handlers and merged
This commit is contained in:
@@ -1,77 +1,103 @@
|
||||
#pragma once
|
||||
#include "lock.h"
|
||||
#include <Arduino.h>
|
||||
#include "Status.h"
|
||||
#include "configuration.h"
|
||||
|
||||
namespace meshtastic
|
||||
{
|
||||
namespace meshtastic {
|
||||
|
||||
/// Describes the state of the power system.
|
||||
struct PowerStatus
|
||||
{
|
||||
|
||||
/// Whether or not values have changed since last read
|
||||
bool isDirty = false;
|
||||
/// Whether we have a battery connected
|
||||
bool hasBattery;
|
||||
/// Battery voltage in mV, valid if haveBattery is true
|
||||
int batteryVoltageMv;
|
||||
/// Battery charge percentage, either read directly or estimated
|
||||
int batteryChargePercent;
|
||||
/// Whether USB is connected
|
||||
bool hasUSB;
|
||||
/// Whether we are charging the battery
|
||||
bool isCharging;
|
||||
|
||||
};
|
||||
|
||||
class PowerStatusHandler
|
||||
{
|
||||
|
||||
private:
|
||||
PowerStatus status;
|
||||
CallbackObserver<PowerStatusHandler, const PowerStatus> powerObserver = CallbackObserver<PowerStatusHandler, const PowerStatus>(this, &PowerStatusHandler::updateStatus);
|
||||
bool initialized = false;
|
||||
/// Protects all of internal state.
|
||||
Lock lock;
|
||||
|
||||
public:
|
||||
|
||||
Observable<void *> onNewStatus;
|
||||
|
||||
void observe(Observable<const PowerStatus> *source)
|
||||
/// Describes the state of the GPS system.
|
||||
class PowerStatus : public Status
|
||||
{
|
||||
powerObserver.observe(source);
|
||||
}
|
||||
|
||||
bool isInitialized() { LockGuard guard(&lock); return initialized; }
|
||||
bool isCharging() { LockGuard guard(&lock); return status.isCharging; }
|
||||
bool hasUSB() { LockGuard guard(&lock); return status.hasUSB; }
|
||||
bool hasBattery() { LockGuard guard(&lock); return status.hasBattery; }
|
||||
int getBatteryVoltageMv() { LockGuard guard(&lock); return status.batteryVoltageMv; }
|
||||
int getBatteryChargePercent() { LockGuard guard(&lock); return status.batteryChargePercent; }
|
||||
private:
|
||||
CallbackObserver<PowerStatus, const PowerStatus *> statusObserver = CallbackObserver<PowerStatus, const PowerStatus *>(this, &PowerStatus::updateStatus);
|
||||
|
||||
int updateStatus(const PowerStatus newStatus) {
|
||||
// Only update the status if values have actually changed
|
||||
status.isDirty = (
|
||||
newStatus.hasBattery != status.hasBattery ||
|
||||
newStatus.hasUSB != status.hasUSB ||
|
||||
newStatus.batteryVoltageMv != status.batteryVoltageMv
|
||||
);
|
||||
LockGuard guard(&lock);
|
||||
initialized = true;
|
||||
status.hasBattery = newStatus.hasBattery;
|
||||
status.batteryVoltageMv = newStatus.batteryVoltageMv;
|
||||
status.batteryChargePercent = newStatus.batteryChargePercent;
|
||||
status.hasUSB = newStatus.hasUSB;
|
||||
status.isCharging = newStatus.isCharging;
|
||||
if(status.isDirty) {
|
||||
DEBUG_MSG("Battery %dmV %d%%\n", status.batteryVoltageMv, status.batteryChargePercent);
|
||||
onNewStatus.notifyObservers(this);
|
||||
/// Whether we have a battery connected
|
||||
bool hasBattery;
|
||||
/// Battery voltage in mV, valid if haveBattery is true
|
||||
int batteryVoltageMv;
|
||||
/// Battery charge percentage, either read directly or estimated
|
||||
uint8_t batteryChargePercent;
|
||||
/// Whether USB is connected
|
||||
bool hasUSB;
|
||||
/// Whether we are charging the battery
|
||||
bool isCharging;
|
||||
|
||||
public:
|
||||
|
||||
PowerStatus() {
|
||||
statusType = STATUS_TYPE_POWER;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
PowerStatus( bool hasBattery, bool hasUSB, bool isCharging, int batteryVoltageMv, uint8_t batteryChargePercent ) : Status()
|
||||
{
|
||||
this->hasBattery = hasBattery;
|
||||
this->hasUSB = hasUSB;
|
||||
this->isCharging = isCharging;
|
||||
this->batteryVoltageMv = batteryVoltageMv;
|
||||
this->batteryChargePercent = batteryChargePercent;
|
||||
}
|
||||
PowerStatus(const PowerStatus &);
|
||||
PowerStatus &operator=(const PowerStatus &);
|
||||
|
||||
} // namespace meshtastic
|
||||
void observe(Observable<const PowerStatus *> *source)
|
||||
{
|
||||
statusObserver.observe(source);
|
||||
}
|
||||
|
||||
extern meshtastic::PowerStatus powerStatus;
|
||||
bool getHasBattery() const
|
||||
{
|
||||
return hasBattery;
|
||||
}
|
||||
|
||||
bool getHasUSB() const
|
||||
{
|
||||
return hasUSB;
|
||||
}
|
||||
|
||||
bool getIsCharging() const
|
||||
{
|
||||
return isCharging;
|
||||
}
|
||||
|
||||
int getBatteryVoltageMv() const
|
||||
{
|
||||
return batteryVoltageMv;
|
||||
}
|
||||
|
||||
uint8_t getBatteryChargePercent() const
|
||||
{
|
||||
return batteryChargePercent;
|
||||
}
|
||||
|
||||
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;
|
||||
{
|
||||
isDirty = matches(newStatus);
|
||||
initialized = true;
|
||||
hasBattery = newStatus->getHasBattery();
|
||||
batteryVoltageMv = newStatus->getBatteryVoltageMv();
|
||||
batteryChargePercent = newStatus->getBatteryChargePercent();
|
||||
hasUSB = newStatus->getHasUSB();
|
||||
isCharging = newStatus->getIsCharging();
|
||||
}
|
||||
if(isDirty) {
|
||||
DEBUG_MSG("Battery %dmV %d%%\n", batteryVoltageMv, batteryChargePercent);
|
||||
onNewStatus.notifyObservers(this);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
extern meshtastic::PowerStatus *powerStatus;
|
||||
|
||||
Reference in New Issue
Block a user