MrAlders0n
22 hours ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with
55 additions and
1 deletions
-
docs/cli_commands.md
-
examples/simple_repeater/MyMesh.cpp
-
examples/simple_repeater/MyMesh.h
-
src/helpers/CommonCLI.cpp
-
src/helpers/CommonCLI.h
-
src/helpers/SensorManager.h
-
src/helpers/sensors/EnvironmentSensorManager.cpp
-
src/helpers/sensors/EnvironmentSensorManager.h
|
|
|
@ -144,6 +144,17 @@ This document provides an overview of CLI commands that can be sent to MeshCore |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
### External Power Monitoring Stats - Per-channel voltage and current |
|
|
|
**Usage:** `stats-extpower` |
|
|
|
|
|
|
|
**Serial Only:** Yes |
|
|
|
|
|
|
|
**Note:** Returns JSON with only enabled channels, e.g. `{"ch1_voltage_mv":12450,"ch1_current_ma":150,"ch2_voltage_mv":3800,"ch2_current_ma":85}` |
|
|
|
|
|
|
|
**Note:** Returns "No external power monitoring board detected" if no supported hardware is present |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
## Logging |
|
|
|
|
|
|
|
### Begin capture of rx log to node storage |
|
|
|
|
|
|
|
@ -1148,10 +1148,16 @@ void MyMesh::formatRadioStatsReply(char *reply) { |
|
|
|
} |
|
|
|
|
|
|
|
void MyMesh::formatPacketStatsReply(char *reply) { |
|
|
|
StatsFormatHelper::formatPacketStats(reply, radio_driver, getNumSentFlood(), getNumSentDirect(), |
|
|
|
StatsFormatHelper::formatPacketStats(reply, radio_driver, getNumSentFlood(), getNumSentDirect(), |
|
|
|
getNumRecvFlood(), getNumRecvDirect()); |
|
|
|
} |
|
|
|
|
|
|
|
void MyMesh::formatExtPowerStatsReply(char *reply) { |
|
|
|
if (!sensors.formatExtPowerStats(reply)) { |
|
|
|
strcpy(reply, "{\"err\":\"No external power monitoring board detected\"}"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void MyMesh::saveIdentity(const mesh::LocalIdentity &new_id) { |
|
|
|
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) |
|
|
|
IdentityStore store(*_fs, ""); |
|
|
|
|
|
|
|
@ -214,6 +214,7 @@ public: |
|
|
|
void formatStatsReply(char *reply) override; |
|
|
|
void formatRadioStatsReply(char *reply) override; |
|
|
|
void formatPacketStatsReply(char *reply) override; |
|
|
|
void formatExtPowerStatsReply(char *reply) override; |
|
|
|
void startRegionsLoad() override; |
|
|
|
bool saveRegions() override; |
|
|
|
void onDefaultRegionChanged(const RegionEntry* r) override; |
|
|
|
|
|
|
|
@ -473,6 +473,8 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, char* command, char* re |
|
|
|
_callbacks->formatRadioStatsReply(reply); |
|
|
|
} else if (sender_timestamp == 0 && memcmp(command, "stats-core", 10) == 0 && (command[10] == 0 || command[10] == ' ')) { |
|
|
|
_callbacks->formatStatsReply(reply); |
|
|
|
} else if (sender_timestamp == 0 && memcmp(command, "stats-extpower", 14) == 0 && (command[14] == 0 || command[14] == ' ')) { |
|
|
|
_callbacks->formatExtPowerStatsReply(reply); |
|
|
|
} else { |
|
|
|
strcpy(reply, "Unknown command"); |
|
|
|
} |
|
|
|
|
|
|
|
@ -86,6 +86,9 @@ public: |
|
|
|
virtual void formatStatsReply(char *reply) = 0; |
|
|
|
virtual void formatRadioStatsReply(char *reply) = 0; |
|
|
|
virtual void formatPacketStatsReply(char *reply) = 0; |
|
|
|
virtual void formatExtPowerStatsReply(char *reply) { |
|
|
|
strcpy(reply, "{\"err\":\"No external power monitoring board detected\"}"); |
|
|
|
}; |
|
|
|
virtual mesh::LocalIdentity& getSelfId() = 0; |
|
|
|
virtual void saveIdentity(const mesh::LocalIdentity& new_id) = 0; |
|
|
|
virtual void clearStats() = 0; |
|
|
|
|
|
|
|
@ -23,6 +23,7 @@ public: |
|
|
|
virtual const char* getSettingValue(int i) const { return NULL; } |
|
|
|
virtual bool setSettingValue(const char* name, const char* value) { return false; } |
|
|
|
virtual LocationProvider* getLocationProvider() { return NULL; } |
|
|
|
virtual bool formatExtPowerStats(char* reply) { return false; } |
|
|
|
|
|
|
|
// Helper functions to manage setting by keys (useful in many places ...)
|
|
|
|
const char* getSettingByKey(const char* key) { |
|
|
|
|
|
|
|
@ -682,6 +682,35 @@ bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, Cayen |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool EnvironmentSensorManager::formatExtPowerStats(char* reply) { |
|
|
|
#if ENV_INCLUDE_INA3221 |
|
|
|
if (!INA3221_initialized) return false; |
|
|
|
char* dp = reply; |
|
|
|
int remaining = 160; // max reply buffer length
|
|
|
|
*dp++ = '{'; |
|
|
|
remaining--; |
|
|
|
bool first = true; |
|
|
|
for (int i = 0; i < TELEM_INA3221_NUM_CHANNELS; i++) { |
|
|
|
if (INA3221.isChannelEnabled(i)) { |
|
|
|
int ch = i + 1; |
|
|
|
int voltage_mv = (int)(INA3221.getBusVoltage(i) * 1000); |
|
|
|
int current_ma = (int)(INA3221.getCurrentAmps(i) * 1000); |
|
|
|
if (!first) { *dp++ = ','; remaining--; } |
|
|
|
int n = snprintf(dp, remaining, "\"ch%d_voltage_mv\":%d,\"ch%d_current_ma\":%d", ch, voltage_mv, ch, current_ma); |
|
|
|
if (n >= remaining) break; |
|
|
|
dp += n; |
|
|
|
remaining -= n; |
|
|
|
first = false; |
|
|
|
} |
|
|
|
} |
|
|
|
*dp++ = '}'; |
|
|
|
*dp = 0; |
|
|
|
return true; |
|
|
|
#else |
|
|
|
return false; |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
int EnvironmentSensorManager::getNumSettings() const { |
|
|
|
int settings = 0; |
|
|
|
#if ENV_INCLUDE_GPS |
|
|
|
|
|
|
|
@ -50,4 +50,5 @@ public: |
|
|
|
const char* getSettingName(int i) const override; |
|
|
|
const char* getSettingValue(int i) const override; |
|
|
|
bool setSettingValue(const char* name, const char* value) override; |
|
|
|
bool formatExtPowerStats(char* reply) override; |
|
|
|
}; |
|
|
|
|