2020-06-27 21:19:49 -07:00
|
|
|
#pragma once
|
2020-06-28 18:17:52 -07:00
|
|
|
#include "Status.h"
|
2020-06-27 21:19:49 -07:00
|
|
|
#include "configuration.h"
|
2023-01-21 14:34:29 +01:00
|
|
|
#include <Arduino.h>
|
2020-06-27 21:19:49 -07:00
|
|
|
|
2023-01-21 14:34:29 +01:00
|
|
|
namespace meshtastic
|
|
|
|
|
{
|
2020-06-27 21:19:49 -07:00
|
|
|
|
2023-01-21 14:34:29 +01:00
|
|
|
/// Describes the state of the NodeDB system.
|
|
|
|
|
class NodeStatus : public Status
|
|
|
|
|
{
|
2020-06-27 21:19:49 -07:00
|
|
|
|
2023-01-21 14:34:29 +01:00
|
|
|
private:
|
|
|
|
|
CallbackObserver<NodeStatus, const NodeStatus *> statusObserver =
|
|
|
|
|
CallbackObserver<NodeStatus, const NodeStatus *>(this, &NodeStatus::updateStatus);
|
2020-06-27 21:19:49 -07:00
|
|
|
|
2025-10-28 13:32:08 -07:00
|
|
|
uint16_t numOnline = 0;
|
|
|
|
|
uint16_t numTotal = 0;
|
2020-06-27 21:19:49 -07:00
|
|
|
|
2025-10-28 13:32:08 -07:00
|
|
|
uint16_t lastNumTotal = 0;
|
2020-07-05 17:03:12 -07:00
|
|
|
|
2023-01-21 14:34:29 +01:00
|
|
|
public:
|
|
|
|
|
bool forceUpdate = false;
|
2020-06-27 21:19:49 -07:00
|
|
|
|
2023-01-21 14:34:29 +01:00
|
|
|
NodeStatus() { statusType = STATUS_TYPE_NODE; }
|
2025-10-28 13:32:08 -07:00
|
|
|
NodeStatus(uint16_t numOnline, uint16_t numTotal, bool forceUpdate = false) : Status()
|
2023-01-21 14:34:29 +01:00
|
|
|
{
|
|
|
|
|
this->forceUpdate = forceUpdate;
|
|
|
|
|
this->numOnline = numOnline;
|
|
|
|
|
this->numTotal = numTotal;
|
|
|
|
|
}
|
|
|
|
|
NodeStatus(const NodeStatus &);
|
|
|
|
|
NodeStatus &operator=(const NodeStatus &);
|
2020-06-27 21:19:49 -07:00
|
|
|
|
2023-01-21 14:34:29 +01:00
|
|
|
void observe(Observable<const NodeStatus *> *source) { statusObserver.observe(source); }
|
2020-06-27 21:19:49 -07:00
|
|
|
|
2025-10-28 13:32:08 -07:00
|
|
|
uint16_t getNumOnline() const { return numOnline; }
|
2020-06-27 21:19:49 -07:00
|
|
|
|
2025-10-28 13:32:08 -07:00
|
|
|
uint16_t getNumTotal() const { return numTotal; }
|
2020-06-27 21:19:49 -07:00
|
|
|
|
2025-10-28 13:32:08 -07:00
|
|
|
uint16_t getLastNumTotal() const { return lastNumTotal; }
|
2020-07-05 17:03:12 -07:00
|
|
|
|
2023-01-21 14:34:29 +01:00
|
|
|
bool matches(const NodeStatus *newStatus) const
|
|
|
|
|
{
|
|
|
|
|
return (newStatus->getNumOnline() != numOnline || newStatus->getNumTotal() != numTotal);
|
|
|
|
|
}
|
|
|
|
|
int updateStatus(const NodeStatus *newStatus)
|
|
|
|
|
{
|
|
|
|
|
// Only update the status if values have actually changed
|
|
|
|
|
lastNumTotal = numTotal;
|
|
|
|
|
bool isDirty;
|
2020-06-28 18:17:52 -07:00
|
|
|
{
|
2023-01-21 14:34:29 +01:00
|
|
|
isDirty = matches(newStatus);
|
|
|
|
|
initialized = true;
|
|
|
|
|
numOnline = newStatus->getNumOnline();
|
|
|
|
|
numTotal = newStatus->getNumTotal();
|
2020-06-28 18:17:52 -07:00
|
|
|
}
|
2023-01-21 14:34:29 +01:00
|
|
|
if (isDirty || newStatus->forceUpdate) {
|
2025-10-28 13:32:08 -07:00
|
|
|
LOG_DEBUG("Node status update: %u online, %u total", numOnline, numTotal);
|
2023-01-21 14:34:29 +01:00
|
|
|
onNewStatus.notifyObservers(this);
|
2020-06-27 21:19:49 -07:00
|
|
|
}
|
2023-01-21 14:34:29 +01:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
};
|
2020-06-27 21:19:49 -07:00
|
|
|
|
2023-01-21 14:34:29 +01:00
|
|
|
} // namespace meshtastic
|
2020-06-27 21:19:49 -07:00
|
|
|
|
2020-06-28 18:17:52 -07:00
|
|
|
extern meshtastic::NodeStatus *nodeStatus;
|