mirror of
https://github.com/meshtastic/firmware.git
synced 2025-08-01 19:35:42 +00:00
Compare commits
8 Commits
41f61ae7f9
...
5d19f642fe
Author | SHA1 | Date | |
---|---|---|---|
![]() |
5d19f642fe | ||
![]() |
b5a8e8f51b | ||
![]() |
2e96bf642c | ||
![]() |
0538a57cbd | ||
![]() |
fcd7d86f26 | ||
![]() |
18022ed535 | ||
![]() |
61e60c974d | ||
![]() |
43a1976f6d |
@ -224,9 +224,10 @@ ErrorCode Router::send(meshtastic_MeshPacket *p)
|
|||||||
if (!config.lora.override_duty_cycle && myRegion->dutyCycle < 100) {
|
if (!config.lora.override_duty_cycle && myRegion->dutyCycle < 100) {
|
||||||
float hourlyTxPercent = airTime->utilizationTXPercent();
|
float hourlyTxPercent = airTime->utilizationTXPercent();
|
||||||
if (hourlyTxPercent > myRegion->dutyCycle) {
|
if (hourlyTxPercent > myRegion->dutyCycle) {
|
||||||
#ifdef DEBUG_PORT
|
|
||||||
uint8_t silentMinutes = airTime->getSilentMinutes(hourlyTxPercent, myRegion->dutyCycle);
|
uint8_t silentMinutes = airTime->getSilentMinutes(hourlyTxPercent, myRegion->dutyCycle);
|
||||||
|
|
||||||
LOG_WARN("Duty cycle limit exceeded. Aborting send for now, you can send again in %d mins", silentMinutes);
|
LOG_WARN("Duty cycle limit exceeded. Aborting send for now, you can send again in %d mins", silentMinutes);
|
||||||
|
|
||||||
meshtastic_ClientNotification *cn = clientNotificationPool.allocZeroed();
|
meshtastic_ClientNotification *cn = clientNotificationPool.allocZeroed();
|
||||||
cn->has_reply_id = true;
|
cn->has_reply_id = true;
|
||||||
cn->reply_id = p->id;
|
cn->reply_id = p->id;
|
||||||
@ -234,7 +235,7 @@ ErrorCode Router::send(meshtastic_MeshPacket *p)
|
|||||||
cn->time = getValidTime(RTCQualityFromNet);
|
cn->time = getValidTime(RTCQualityFromNet);
|
||||||
sprintf(cn->message, "Duty cycle limit exceeded. You can send again in %d mins", silentMinutes);
|
sprintf(cn->message, "Duty cycle limit exceeded. You can send again in %d mins", silentMinutes);
|
||||||
service->sendClientNotification(cn);
|
service->sendClientNotification(cn);
|
||||||
#endif
|
|
||||||
meshtastic_Routing_Error err = meshtastic_Routing_Error_DUTY_CYCLE_LIMIT;
|
meshtastic_Routing_Error err = meshtastic_Routing_Error_DUTY_CYCLE_LIMIT;
|
||||||
if (isFromUs(p)) { // only send NAK to API, not to the mesh
|
if (isFromUs(p)) { // only send NAK to API, not to the mesh
|
||||||
abortSendAndNak(err, p);
|
abortSendAndNak(err, p);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
meshtastic_MeshPacket *ReplyModule::allocReply()
|
meshtastic_MeshPacket *ReplyModule::allocReply()
|
||||||
{
|
{
|
||||||
assert(currentRequest); // should always be !NULL
|
assert(currentRequest); // should always be !NULL
|
||||||
#ifdef DEBUG_PORT
|
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
|
||||||
auto req = *currentRequest;
|
auto req = *currentRequest;
|
||||||
auto &p = req.decoded;
|
auto &p = req.decoded;
|
||||||
// The incoming message is in p.payload
|
// The incoming message is in p.payload
|
||||||
|
@ -121,7 +121,7 @@ int32_t AirQualityTelemetryModule::runOnce()
|
|||||||
bool AirQualityTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *t)
|
bool AirQualityTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *t)
|
||||||
{
|
{
|
||||||
if (t->which_variant == meshtastic_Telemetry_air_quality_metrics_tag) {
|
if (t->which_variant == meshtastic_Telemetry_air_quality_metrics_tag) {
|
||||||
#ifdef DEBUG_PORT
|
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
|
||||||
const char *sender = getSenderShortName(mp);
|
const char *sender = getSenderShortName(mp);
|
||||||
|
|
||||||
LOG_INFO("(Received from %s): pm10_standard=%i, pm25_standard=%i, pm100_standard=%i", sender,
|
LOG_INFO("(Received from %s): pm10_standard=%i, pm25_standard=%i, pm100_standard=%i", sender,
|
||||||
|
@ -49,7 +49,7 @@ bool DeviceTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (t->which_variant == meshtastic_Telemetry_device_metrics_tag) {
|
if (t->which_variant == meshtastic_Telemetry_device_metrics_tag) {
|
||||||
#ifdef DEBUG_PORT
|
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
|
||||||
const char *sender = getSenderShortName(mp);
|
const char *sender = getSenderShortName(mp);
|
||||||
|
|
||||||
LOG_INFO("(Received from %s): air_util_tx=%f, channel_utilization=%f, battery_level=%i, voltage=%f", sender,
|
LOG_INFO("(Received from %s): air_util_tx=%f, channel_utilization=%f, battery_level=%i, voltage=%f", sender,
|
||||||
|
@ -502,7 +502,7 @@ void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiSt
|
|||||||
bool EnvironmentTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *t)
|
bool EnvironmentTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *t)
|
||||||
{
|
{
|
||||||
if (t->which_variant == meshtastic_Telemetry_environment_metrics_tag) {
|
if (t->which_variant == meshtastic_Telemetry_environment_metrics_tag) {
|
||||||
#ifdef DEBUG_PORT
|
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
|
||||||
const char *sender = getSenderShortName(mp);
|
const char *sender = getSenderShortName(mp);
|
||||||
|
|
||||||
LOG_INFO("(Received from %s): barometric_pressure=%f, current=%f, gas_resistance=%f, relative_humidity=%f, "
|
LOG_INFO("(Received from %s): barometric_pressure=%f, current=%f, gas_resistance=%f, relative_humidity=%f, "
|
||||||
|
@ -149,7 +149,7 @@ void HealthTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *
|
|||||||
bool HealthTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *t)
|
bool HealthTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *t)
|
||||||
{
|
{
|
||||||
if (t->which_variant == meshtastic_Telemetry_health_metrics_tag) {
|
if (t->which_variant == meshtastic_Telemetry_health_metrics_tag) {
|
||||||
#ifdef DEBUG_PORT
|
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
|
||||||
const char *sender = getSenderShortName(mp);
|
const char *sender = getSenderShortName(mp);
|
||||||
|
|
||||||
LOG_INFO("(Received from %s): temperature=%f, heart_bpm=%d, spO2=%d,", sender, t->variant.health_metrics.temperature,
|
LOG_INFO("(Received from %s): temperature=%f, heart_bpm=%d, spO2=%d,", sender, t->variant.health_metrics.temperature,
|
||||||
|
@ -27,7 +27,7 @@ bool HostMetricsModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp,
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (t->which_variant == meshtastic_Telemetry_host_metrics_tag) {
|
if (t->which_variant == meshtastic_Telemetry_host_metrics_tag) {
|
||||||
#ifdef DEBUG_PORT
|
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
|
||||||
const char *sender = getSenderShortName(mp);
|
const char *sender = getSenderShortName(mp);
|
||||||
if (t->variant.host_metrics.has_user_string)
|
if (t->variant.host_metrics.has_user_string)
|
||||||
t->variant.host_metrics.user_string[sizeof(t->variant.host_metrics.user_string) - 1] = '\0';
|
t->variant.host_metrics.user_string[sizeof(t->variant.host_metrics.user_string) - 1] = '\0';
|
||||||
|
@ -168,7 +168,7 @@ void PowerTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *s
|
|||||||
bool PowerTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *t)
|
bool PowerTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *t)
|
||||||
{
|
{
|
||||||
if (t->which_variant == meshtastic_Telemetry_power_metrics_tag) {
|
if (t->which_variant == meshtastic_Telemetry_power_metrics_tag) {
|
||||||
#ifdef DEBUG_PORT
|
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
|
||||||
const char *sender = getSenderShortName(mp);
|
const char *sender = getSenderShortName(mp);
|
||||||
|
|
||||||
LOG_INFO("(Received from %s): ch1_voltage=%.1f, ch1_current=%.1f, ch2_voltage=%.1f, ch2_current=%.1f, "
|
LOG_INFO("(Received from %s): ch1_voltage=%.1f, ch1_current=%.1f, ch2_voltage=%.1f, ch2_current=%.1f, "
|
||||||
|
@ -9,7 +9,7 @@ TextMessageModule *textMessageModule;
|
|||||||
|
|
||||||
ProcessMessage TextMessageModule::handleReceived(const meshtastic_MeshPacket &mp)
|
ProcessMessage TextMessageModule::handleReceived(const meshtastic_MeshPacket &mp)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_PORT
|
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
|
||||||
auto &p = mp.decoded;
|
auto &p = mp.decoded;
|
||||||
LOG_INFO("Received text msg from=0x%0x, id=0x%x, msg=%.*s", mp.from, mp.id, p.payload.size, p.payload.bytes);
|
LOG_INFO("Received text msg from=0x%0x, id=0x%x, msg=%.*s", mp.from, mp.id, p.payload.size, p.payload.bytes);
|
||||||
#endif
|
#endif
|
||||||
|
@ -232,7 +232,7 @@ void TraceRouteModule::appendMyIDandSNR(meshtastic_RouteDiscovery *updated, floa
|
|||||||
|
|
||||||
void TraceRouteModule::printRoute(meshtastic_RouteDiscovery *r, uint32_t origin, uint32_t dest, bool isTowardsDestination)
|
void TraceRouteModule::printRoute(meshtastic_RouteDiscovery *r, uint32_t origin, uint32_t dest, bool isTowardsDestination)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_PORT
|
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
|
||||||
std::string route = "Route traced:\n";
|
std::string route = "Route traced:\n";
|
||||||
route += vformat("0x%x --> ", origin);
|
route += vformat("0x%x --> ", origin);
|
||||||
for (uint8_t i = 0; i < r->route_count; i++) {
|
for (uint8_t i = 0; i < r->route_count; i++) {
|
||||||
|
@ -16,7 +16,7 @@ WaypointModule *waypointModule;
|
|||||||
|
|
||||||
ProcessMessage WaypointModule::handleReceived(const meshtastic_MeshPacket &mp)
|
ProcessMessage WaypointModule::handleReceived(const meshtastic_MeshPacket &mp)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_PORT
|
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
|
||||||
auto &p = mp.decoded;
|
auto &p = mp.decoded;
|
||||||
LOG_INFO("Received waypoint msg from=0x%0x, id=0x%x, msg=%.*s", mp.from, mp.id, p.payload.size, p.payload.bytes);
|
LOG_INFO("Received waypoint msg from=0x%0x, id=0x%x, msg=%.*s", mp.from, mp.id, p.payload.size, p.payload.bytes);
|
||||||
#endif
|
#endif
|
||||||
|
@ -282,9 +282,13 @@ void cpuDeepSleep(uint32_t msecToWake)
|
|||||||
#if SPI_INTERFACES_COUNT > 1
|
#if SPI_INTERFACES_COUNT > 1
|
||||||
SPI1.end();
|
SPI1.end();
|
||||||
#endif
|
#endif
|
||||||
// This may cause crashes as debug messages continue to flow.
|
if (Serial) // Another check in case of disabled default serial, does nothing bad
|
||||||
Serial.end();
|
Serial.end(); // This may cause crashes as debug messages continue to flow.
|
||||||
|
|
||||||
|
// This causes troubles with waking up on nrf52 (on pro-micro in particular):
|
||||||
|
// we have no Serial1 in use on nrf52, check Serial and GPS modules.
|
||||||
#ifdef PIN_SERIAL1_RX
|
#ifdef PIN_SERIAL1_RX
|
||||||
|
if (Serial1) // A straightforward solution to the wake from deepsleep problem
|
||||||
Serial1.end();
|
Serial1.end();
|
||||||
#endif
|
#endif
|
||||||
setBluetoothEnable(false);
|
setBluetoothEnable(false);
|
||||||
@ -362,6 +366,7 @@ void cpuDeepSleep(uint32_t msecToWake)
|
|||||||
// Resume on user button press
|
// Resume on user button press
|
||||||
// https://github.com/lyusupov/SoftRF/blob/81c519ca75693b696752235d559e881f2e0511ee/software/firmware/source/SoftRF/src/platform/nRF52.cpp#L1738
|
// https://github.com/lyusupov/SoftRF/blob/81c519ca75693b696752235d559e881f2e0511ee/software/firmware/source/SoftRF/src/platform/nRF52.cpp#L1738
|
||||||
constexpr uint32_t DFU_MAGIC_SKIP = 0x6d;
|
constexpr uint32_t DFU_MAGIC_SKIP = 0x6d;
|
||||||
|
sd_power_gpregret_clr(0, 0xFF); // Clear the register before setting a new values in it for stability reasons
|
||||||
sd_power_gpregret_set(0, DFU_MAGIC_SKIP); // Equivalent NRF_POWER->GPREGRET = DFU_MAGIC_SKIP
|
sd_power_gpregret_set(0, DFU_MAGIC_SKIP); // Equivalent NRF_POWER->GPREGRET = DFU_MAGIC_SKIP
|
||||||
|
|
||||||
// FIXME, use system off mode with ram retention for key state?
|
// FIXME, use system off mode with ram retention for key state?
|
||||||
@ -378,6 +383,12 @@ void cpuDeepSleep(uint32_t msecToWake)
|
|||||||
nrf_gpio_cfg_sense_set(PIN_BUTTON2, sense1);
|
nrf_gpio_cfg_sense_set(PIN_BUTTON2, sense1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef PROMICRO_DIY_TCXO
|
||||||
|
nrf_gpio_cfg_input(BUTTON_PIN, NRF_GPIO_PIN_PULLUP); // Enable internal pull-up on the button pin
|
||||||
|
nrf_gpio_pin_sense_t sense = NRF_GPIO_PIN_SENSE_LOW; // Configure SENSE signal on low edge
|
||||||
|
nrf_gpio_cfg_sense_set(BUTTON_PIN, sense); // Apply SENSE to wake up the device from the deep sleep
|
||||||
|
#endif
|
||||||
|
|
||||||
auto ok = sd_power_system_off();
|
auto ok = sd_power_system_off();
|
||||||
if (ok != NRF_SUCCESS) {
|
if (ok != NRF_SUCCESS) {
|
||||||
LOG_ERROR("FIXME: Ignoring soft device (EasyDMA pending?) and forcing system-off!");
|
LOG_ERROR("FIXME: Ignoring soft device (EasyDMA pending?) and forcing system-off!");
|
||||||
|
@ -32,3 +32,8 @@
|
|||||||
#define SX126X_DIO1 1001
|
#define SX126X_DIO1 1001
|
||||||
#define SX126X_RESET 1003
|
#define SX126X_RESET 1003
|
||||||
#define SX126X_BUSY 1004
|
#define SX126X_BUSY 1004
|
||||||
|
|
||||||
|
#if !defined(DEBUG_MUTE) && !defined(PIO_FRAMEWORK_ARDUINO_NANOLIB_FLOAT_PRINTF)
|
||||||
|
#error \
|
||||||
|
"You MUST enable PIO_FRAMEWORK_ARDUINO_NANOLIB_FLOAT_PRINTF if debug prints are enabled. printf will print uninitialized garbage instead of floats."
|
||||||
|
#endif
|
@ -131,7 +131,7 @@ void initDeepSleep()
|
|||||||
support busted boards, assume button one was pressed wakeButtons = ((uint64_t)1) << buttons.gpios[0];
|
support busted boards, assume button one was pressed wakeButtons = ((uint64_t)1) << buttons.gpios[0];
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef DEBUG_PORT
|
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
|
||||||
// If we booted because our timer ran out or the user pressed reset, send those as fake events
|
// If we booted because our timer ran out or the user pressed reset, send those as fake events
|
||||||
RESET_REASON hwReason = rtc_get_reset_reason(0);
|
RESET_REASON hwReason = rtc_get_reset_reason(0);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user