Merge branch 'master' into store-and-forward

This commit is contained in:
Thomas Göttgens 2024-11-03 15:15:44 +01:00 committed by GitHub
commit beb69e93d0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
31 changed files with 71 additions and 69 deletions

View File

@ -1,6 +1,6 @@
; The Portduino based sim environment on top of any host OS, all hardware will be simulated ; The Portduino based sim environment on top of any host OS, all hardware will be simulated
[portduino_base] [portduino_base]
platform = https://github.com/meshtastic/platform-native.git#6b3796d697481c8f6e3f4aa5c111bd9979f29e64 platform = https://github.com/meshtastic/platform-native.git#bcd02436cfca91f7d28ad0f7dab977c6aaa781af
framework = arduino framework = arduino
build_src_filter = build_src_filter =

View File

@ -66,7 +66,7 @@ GpioBinaryTransformer::GpioBinaryTransformer(GpioVirtPin *inPin1, GpioVirtPin *i
assert(!inPin2->dependentPin); // We only allow one dependent pin assert(!inPin2->dependentPin); // We only allow one dependent pin
inPin2->dependentPin = this; inPin2->dependentPin = this;
// Don't update at construction time, because various GpioPins might be global constructor based not yet initied because // Don't update at construction time, because various GpioPins might be global constructor based not yet initiated because
// order of operations for global constructors is not defined. // order of operations for global constructors is not defined.
// update(); // update();
} }

View File

@ -640,7 +640,7 @@ void Power::readPowerStatus()
batteryChargePercent = batteryLevel->getBatteryPercent(); batteryChargePercent = batteryLevel->getBatteryPercent();
} else { } else {
// If the AXP192 returns a percentage less than 0, the feature is either not supported or there is an error // If the AXP192 returns a percentage less than 0, the feature is either not supported or there is an error
// In that case, we compute an estimate of the charge percent based on open circuite voltage table defined // In that case, we compute an estimate of the charge percent based on open circuit voltage table defined
// in power.h // in power.h
batteryChargePercent = clamp((int)(((batteryVoltageMv - (OCV[NUM_OCV_POINTS - 1] * NUM_CELLS)) * 1e2) / batteryChargePercent = clamp((int)(((batteryVoltageMv - (OCV[NUM_OCV_POINTS - 1] * NUM_CELLS)) * 1e2) /
((OCV[0] * NUM_CELLS) - (OCV[NUM_OCV_POINTS - 1] * NUM_CELLS))), ((OCV[0] * NUM_CELLS) - (OCV[NUM_OCV_POINTS - 1] * NUM_CELLS))),

View File

@ -185,7 +185,7 @@ static void powerEnter()
{ {
// LOG_DEBUG("Enter state: POWER"); // LOG_DEBUG("Enter state: POWER");
if (!isPowered()) { if (!isPowered()) {
// If we got here, we are in the wrong state - we should be in powered, let that state ahndle things // If we got here, we are in the wrong state - we should be in powered, let that state handle things
LOG_INFO("Loss of power in Powered"); LOG_INFO("Loss of power in Powered");
powerFSM.trigger(EVENT_POWER_DISCONNECTED); powerFSM.trigger(EVENT_POWER_DISCONNECTED);
} else { } else {
@ -230,7 +230,7 @@ static void onEnter()
static void onIdle() static void onIdle()
{ {
if (isPowered()) { if (isPowered()) {
// If we got here, we are in the wrong state - we should be in powered, let that state ahndle things // If we got here, we are in the wrong state - we should be in powered, let that state handle things
powerFSM.trigger(EVENT_POWER_CONNECTED); powerFSM.trigger(EVENT_POWER_CONNECTED);
} }
} }
@ -371,7 +371,7 @@ void PowerFSM_setup()
// We never enter light-sleep or NB states on NRF52 (because the CPU uses so little power normally) // We never enter light-sleep or NB states on NRF52 (because the CPU uses so little power normally)
#ifdef ARCH_ESP32 #ifdef ARCH_ESP32
// See: https://github.com/meshtastic/firmware/issues/1071 // See: https://github.com/meshtastic/firmware/issues/1071
// Don't add power saving transitions if we are a power saving tracker or sensor. Sleep will be initiatiated through the // Don't add power saving transitions if we are a power saving tracker or sensor. Sleep will be initiated through the
// modules // modules
if ((isRouter || config.power.is_power_saving) && !isTrackerOrSensor) { if ((isRouter || config.power.is_power_saving) && !isTrackerOrSensor) {
powerFSM.add_timed_transition(&stateNB, &stateLS, powerFSM.add_timed_transition(&stateNB, &stateLS,

View File

@ -447,10 +447,12 @@ bool GPS::setup()
} }
} }
} }
return false; }
if (gnssModel != GNSS_MODEL_UNKNOWN) {
setConnected();
} else { } else {
gnssModel = GNSS_MODEL_UNKNOWN; return false;
} }
if (gnssModel == GNSS_MODEL_MTK) { if (gnssModel == GNSS_MODEL_MTK) {
@ -1009,6 +1011,7 @@ int32_t GPS::runOnce()
} }
} }
GPSInitFinished = true; GPSInitFinished = true;
publishUpdate();
} }
// Repeaters have no need for GPS // Repeaters have no need for GPS

View File

@ -49,7 +49,7 @@ uint32_t GPSUpdateScheduling::msUntilNextSearch()
} }
// How long have we already been searching? // How long have we already been searching?
// Used to abort a search in progress, if it runs unnaceptably long // Used to abort a search in progress, if it runs unacceptably long
uint32_t GPSUpdateScheduling::elapsedSearchMs() uint32_t GPSUpdateScheduling::elapsedSearchMs()
{ {
// If searching // If searching
@ -98,7 +98,7 @@ void GPSUpdateScheduling::updateLockTimePrediction()
// Ignore the first lock-time: likely to be long, will skew data // Ignore the first lock-time: likely to be long, will skew data
// Second locktime: likely stable. Use to intialize the smoothing filter // Second locktime: likely stable. Use to initialize the smoothing filter
if (searchCount == 1) if (searchCount == 1)
predictedMsToGetLock = lockTime; predictedMsToGetLock = lockTime;
@ -106,7 +106,7 @@ void GPSUpdateScheduling::updateLockTimePrediction()
else if (searchCount > 1) else if (searchCount > 1)
predictedMsToGetLock = (lockTime * weighting) + (predictedMsToGetLock * (1 - weighting)); predictedMsToGetLock = (lockTime * weighting) + (predictedMsToGetLock * (1 - weighting));
searchCount++; // Only tracked so we can diregard initial lock-times searchCount++; // Only tracked so we can disregard initial lock-times
LOG_DEBUG("Predicting %us to get next lock", predictedMsToGetLock / 1000); LOG_DEBUG("Predicting %us to get next lock", predictedMsToGetLock / 1000);
} }

View File

@ -462,7 +462,7 @@ the PM config. Lets try without it.
PMREQ sort of works with SBAS, but the awake time is too short to re-acquire any SBAS sats. PMREQ sort of works with SBAS, but the awake time is too short to re-acquire any SBAS sats.
The defination of "Got Fix" doesn't seem to include SBAS. Much more too this... The defination of "Got Fix" doesn't seem to include SBAS. Much more too this...
Even if it was, it can take minutes (up to 12.5), Even if it was, it can take minutes (up to 12.5),
even under good sat visability conditions to re-acquire the SBAS data. even under good sat visibility conditions to re-acquire the SBAS data.
Another effect fo the quick transition to sleep is that no other sats will be acquired so the Another effect fo the quick transition to sleep is that no other sats will be acquired so the
sat count will tend to remain at what the initial fix was. sat count will tend to remain at what the initial fix was.

View File

@ -398,7 +398,7 @@ bool Channels::decryptForHash(ChannelIndex chIndex, ChannelHash channelHash)
* *
* This method is called before encoding outbound packets * This method is called before encoding outbound packets
* *
* @eturn the (0 to 255) hash for that channel - if no suitable channel could be found, return -1 * @return the (0 to 255) hash for that channel - if no suitable channel could be found, return -1
*/ */
int16_t Channels::setActiveByIndex(ChannelIndex channelIndex) int16_t Channels::setActiveByIndex(ChannelIndex channelIndex)
{ {

View File

@ -161,11 +161,6 @@ template <typename T> bool LR11x0Interface<T>::reconfigure()
if (err != RADIOLIB_ERR_NONE) if (err != RADIOLIB_ERR_NONE)
RECORD_CRITICALERROR(meshtastic_CriticalErrorCode_INVALID_RADIO_SETTING); RECORD_CRITICALERROR(meshtastic_CriticalErrorCode_INVALID_RADIO_SETTING);
// Hmm - seems to lower SNR when the signal levels are high. Leaving off for now...
// TODO: Confirm gain registers are okay now
// err = lora.setRxGain(true);
// assert(err == RADIOLIB_ERR_NONE);
err = lora.setSyncWord(syncWord); err = lora.setSyncWord(syncWord);
assert(err == RADIOLIB_ERR_NONE); assert(err == RADIOLIB_ERR_NONE);

View File

@ -33,7 +33,7 @@ MeshModule::~MeshModule()
} }
meshtastic_MeshPacket *MeshModule::allocAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, meshtastic_MeshPacket *MeshModule::allocAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex,
uint8_t hopStart, uint8_t hopLimit) uint8_t hopLimit)
{ {
meshtastic_Routing c = meshtastic_Routing_init_default; meshtastic_Routing c = meshtastic_Routing_init_default;
@ -50,7 +50,7 @@ meshtastic_MeshPacket *MeshModule::allocAckNak(meshtastic_Routing_Error err, Nod
p->priority = meshtastic_MeshPacket_Priority_ACK; p->priority = meshtastic_MeshPacket_Priority_ACK;
p->hop_limit = routingModule->getHopLimitForResponse(hopStart, hopLimit); // Flood ACK back to original sender p->hop_limit = hopLimit; // Flood ACK back to original sender
p->to = to; p->to = to;
p->decoded.request_id = idFrom; p->decoded.request_id = idFrom;
p->channel = chIndex; p->channel = chIndex;
@ -181,8 +181,8 @@ void MeshModule::callModules(meshtastic_MeshPacket &mp, RxSource src)
// SECURITY NOTE! I considered sending back a different error code if we didn't find the psk (i.e. !isDecoded) // SECURITY NOTE! I considered sending back a different error code if we didn't find the psk (i.e. !isDecoded)
// but opted NOT TO. Because it is not a good idea to let remote nodes 'probe' to find out which PSKs were "good" vs // but opted NOT TO. Because it is not a good idea to let remote nodes 'probe' to find out which PSKs were "good" vs
// bad. // bad.
routingModule->sendAckNak(meshtastic_Routing_Error_NO_RESPONSE, getFrom(&mp), mp.id, mp.channel, mp.hop_start, routingModule->sendAckNak(meshtastic_Routing_Error_NO_RESPONSE, getFrom(&mp), mp.id, mp.channel,
mp.hop_limit); routingModule->getHopLimitForResponse(mp.hop_start, mp.hop_limit));
} }
} }
@ -295,4 +295,4 @@ bool MeshModule::isRequestingFocus()
} else } else
return false; return false;
} }
#endif #endif

View File

@ -162,7 +162,7 @@ class MeshModule
virtual Observable<const UIFrameEvent *> *getUIFrameObservable() { return NULL; } virtual Observable<const UIFrameEvent *> *getUIFrameObservable() { return NULL; }
meshtastic_MeshPacket *allocAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, meshtastic_MeshPacket *allocAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex,
uint8_t hopStart = 0, uint8_t hopLimit = 0); uint8_t hopLimit = 0);
/// Send an error response for the specified packet. /// Send an error response for the specified packet.
meshtastic_MeshPacket *allocErrorResponse(meshtastic_Routing_Error err, const meshtastic_MeshPacket *p); meshtastic_MeshPacket *allocErrorResponse(meshtastic_Routing_Error err, const meshtastic_MeshPacket *p);

View File

@ -38,6 +38,13 @@ bool PacketHistory::wasSeenRecently(const meshtastic_MeshPacket *p, bool withUpd
seenRecently = false; seenRecently = false;
} }
/* If the original transmitter is doing retransmissions (hopStart equals hopLimit) for a reliable transmission, e.g., when the
ACK got lost, we will handle the packet again to make sure it gets an ACK/response to its packet. */
if (seenRecently && p->hop_start > 0 && p->hop_start == p->hop_limit) {
LOG_DEBUG("Repeated reliable tx");
seenRecently = false;
}
if (seenRecently) { if (seenRecently) {
LOG_DEBUG("Found existing packet record for fr=0x%x,to=0x%x,id=0x%x", p->from, p->to, p->id); LOG_DEBUG("Found existing packet record for fr=0x%x,to=0x%x,id=0x%x", p->from, p->to, p->id);
} }

View File

@ -596,10 +596,13 @@ bool PhoneAPI::handleToRadioPacket(meshtastic_MeshPacket &p)
{ {
printPacket("PACKET FROM PHONE", &p); printPacket("PACKET FROM PHONE", &p);
// For use with the simulator, we should not ignore duplicate packets
#if !(defined(ARCH_PORTDUINO) && !HAS_RADIO)
if (p.id > 0 && wasSeenRecently(p.id)) { if (p.id > 0 && wasSeenRecently(p.id)) {
LOG_DEBUG("Ignoring packet from phone, already seen recently"); LOG_DEBUG("Ignoring packet from phone, already seen recently");
return false; return false;
} }
#endif
if (p.decoded.portnum == meshtastic_PortNum_TRACEROUTE_APP && lastPortNumToRadio[p.decoded.portnum] && if (p.decoded.portnum == meshtastic_PortNum_TRACEROUTE_APP && lastPortNumToRadio[p.decoded.portnum] &&
Throttle::isWithinTimespanMs(lastPortNumToRadio[p.decoded.portnum], THIRTY_SECONDS_MS)) { Throttle::isWithinTimespanMs(lastPortNumToRadio[p.decoded.portnum], THIRTY_SECONDS_MS)) {

View File

@ -140,7 +140,7 @@ const RegionInfo regions[] = {
Philippines Philippines
433 - 434.7 MHz <10 mW erp, NTC approved device required 433 - 434.7 MHz <10 mW erp, NTC approved device required
868 - 869.4 MHz <25 mW erp, NTC approved device required 868 - 869.4 MHz <25 mW erp, NTC approved device required
915 - 918 MHz <250 mW EIRP, no external antennna allowed 915 - 918 MHz <250 mW EIRP, no external antenna allowed
https://github.com/meshtastic/firmware/issues/4948#issuecomment-2394926135 https://github.com/meshtastic/firmware/issues/4948#issuecomment-2394926135
*/ */

View File

@ -348,7 +348,7 @@ void RadioLibInterface::handleTransmitInterrupt()
// ignore the transmit interrupt // ignore the transmit interrupt
if (sendingPacket) if (sendingPacket)
completeSending(); completeSending();
powerMon->clearState(meshtastic_PowerMon_State_Lora_TXOn); // But our transmitter is deffinitely off now powerMon->clearState(meshtastic_PowerMon_State_Lora_TXOn); // But our transmitter is definitely off now
} }
void RadioLibInterface::completeSending() void RadioLibInterface::completeSending()

View File

@ -5,6 +5,7 @@
#include "concurrency/NotifiedWorkerThread.h" #include "concurrency/NotifiedWorkerThread.h"
#include <RadioLib.h> #include <RadioLib.h>
#include <sys/types.h>
// ESP32 has special rules about ISR code // ESP32 has special rules about ISR code
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32

View File

@ -1,10 +1,10 @@
#include "ReliableRouter.h" #include "ReliableRouter.h"
#include "Default.h" #include "Default.h"
#include "MeshModule.h"
#include "MeshTypes.h" #include "MeshTypes.h"
#include "configuration.h" #include "configuration.h"
#include "mesh-pb-constants.h" #include "mesh-pb-constants.h"
#include "modules/NodeInfoModule.h" #include "modules/NodeInfoModule.h"
#include "modules/RoutingModule.h"
// ReliableRouter::ReliableRouter() {} // ReliableRouter::ReliableRouter() {}
@ -73,18 +73,6 @@ bool ReliableRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
i->second.nextTxMsec += iface->getPacketTime(p); i->second.nextTxMsec += iface->getPacketTime(p);
} }
/* Resend implicit ACKs for repeated packets (hopStart equals hopLimit);
* this way if an implicit ACK is dropped and a packet is resent we'll rebroadcast again.
* Resending real ACKs is omitted, as you might receive a packet multiple times due to flooding and
* flooding this ACK back to the original sender already adds redundancy. */
bool isRepeated = p->hop_start == 0 ? (p->hop_limit == HOP_RELIABLE) : (p->hop_start == p->hop_limit);
if (wasSeenRecently(p, false) && isRepeated && !MeshModule::currentReply && !isToUs(p)) {
LOG_DEBUG("Resending implicit ack for a repeated floodmsg");
meshtastic_MeshPacket *tosend = packetPool.allocCopy(*p);
tosend->hop_limit--; // bump down the hop count
Router::send(tosend);
}
return FloodingRouter::shouldFilterReceived(p); return FloodingRouter::shouldFilterReceived(p);
} }
@ -107,16 +95,22 @@ void ReliableRouter::sniffReceived(const meshtastic_MeshPacket *p, const meshtas
if (MeshModule::currentReply) { if (MeshModule::currentReply) {
LOG_DEBUG("Another module replied to this message, no need for 2nd ack"); LOG_DEBUG("Another module replied to this message, no need for 2nd ack");
} else if (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag) { } else if (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag) {
sendAckNak(meshtastic_Routing_Error_NONE, getFrom(p), p->id, p->channel, p->hop_start, p->hop_limit); // A response may be set to want_ack for retransmissions, but we don't need to ACK a response if it received an
// implicit ACK already. If we received it directly, only ACK with a hop limit of 0
if (!p->decoded.request_id)
sendAckNak(meshtastic_Routing_Error_NONE, getFrom(p), p->id, p->channel,
routingModule->getHopLimitForResponse(p->hop_start, p->hop_limit));
else if (p->hop_start > 0 && p->hop_start == p->hop_limit)
sendAckNak(meshtastic_Routing_Error_NONE, getFrom(p), p->id, p->channel, 0);
} else if (p->which_payload_variant == meshtastic_MeshPacket_encrypted_tag && p->channel == 0 && } else if (p->which_payload_variant == meshtastic_MeshPacket_encrypted_tag && p->channel == 0 &&
(nodeDB->getMeshNode(p->from) == nullptr || nodeDB->getMeshNode(p->from)->user.public_key.size == 0)) { (nodeDB->getMeshNode(p->from) == nullptr || nodeDB->getMeshNode(p->from)->user.public_key.size == 0)) {
LOG_INFO("PKI packet from unknown node, send PKI_UNKNOWN_PUBKEY"); LOG_INFO("PKI packet from unknown node, send PKI_UNKNOWN_PUBKEY");
sendAckNak(meshtastic_Routing_Error_PKI_UNKNOWN_PUBKEY, getFrom(p), p->id, channels.getPrimaryIndex(), sendAckNak(meshtastic_Routing_Error_PKI_UNKNOWN_PUBKEY, getFrom(p), p->id, channels.getPrimaryIndex(),
p->hop_start, p->hop_limit); routingModule->getHopLimitForResponse(p->hop_start, p->hop_limit));
} else { } else {
// Send a 'NO_CHANNEL' error on the primary channel if want_ack packet destined for us cannot be decoded // Send a 'NO_CHANNEL' error on the primary channel if want_ack packet destined for us cannot be decoded
sendAckNak(meshtastic_Routing_Error_NO_CHANNEL, getFrom(p), p->id, channels.getPrimaryIndex(), p->hop_start, sendAckNak(meshtastic_Routing_Error_NO_CHANNEL, getFrom(p), p->id, channels.getPrimaryIndex(),
p->hop_limit); routingModule->getHopLimitForResponse(p->hop_start, p->hop_limit));
} }
} }
if (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag && c && if (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag && c &&
@ -224,7 +218,7 @@ int32_t ReliableRouter::doRetransmissions()
bool stillValid = true; // assume we'll keep this record around bool stillValid = true; // assume we'll keep this record around
// FIXME, handle 51 day rolloever here!!! // FIXME, handle 51 day rollover here!!!
if (p.nextTxMsec <= now) { if (p.nextTxMsec <= now) {
if (p.numRetransmissions == 0) { if (p.numRetransmissions == 0) {
LOG_DEBUG("Reliable send failed, returning a nak for fr=0x%x,to=0x%x,id=0x%x", p.packet->from, p.packet->to, LOG_DEBUG("Reliable send failed, returning a nak for fr=0x%x,to=0x%x,id=0x%x", p.packet->from, p.packet->to,

View File

@ -4,7 +4,7 @@
#include <unordered_map> #include <unordered_map>
/** /**
* An identifier for a globalally unique message - a pair of the sending nodenum and the packet id assigned * An identifier for a globally unique message - a pair of the sending nodenum and the packet id assigned
* to that message * to that message
*/ */
struct GlobalPacketId { struct GlobalPacketId {

View File

@ -136,10 +136,9 @@ meshtastic_MeshPacket *Router::allocForSending()
/** /**
* Send an ack or a nak packet back towards whoever sent idFrom * Send an ack or a nak packet back towards whoever sent idFrom
*/ */
void Router::sendAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, uint8_t hopStart, void Router::sendAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, uint8_t hopLimit)
uint8_t hopLimit)
{ {
routingModule->sendAckNak(err, to, idFrom, chIndex, hopStart, hopLimit); routingModule->sendAckNak(err, to, idFrom, chIndex, hopLimit);
} }
void Router::abortSendAndNak(meshtastic_Routing_Error err, meshtastic_MeshPacket *p) void Router::abortSendAndNak(meshtastic_Routing_Error err, meshtastic_MeshPacket *p)
@ -426,7 +425,7 @@ bool perhapsDecode(meshtastic_MeshPacket *p)
} }
} }
/** Return 0 for success or a Routing_Errror code for failure /** Return 0 for success or a Routing_Error code for failure
*/ */
meshtastic_Routing_Error perhapsEncode(meshtastic_MeshPacket *p) meshtastic_Routing_Error perhapsEncode(meshtastic_MeshPacket *p)
{ {

View File

@ -108,8 +108,7 @@ class Router : protected concurrency::OSThread
/** /**
* Send an ack or a nak packet back towards whoever sent idFrom * Send an ack or a nak packet back towards whoever sent idFrom
*/ */
void sendAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, uint8_t hopStart = 0, void sendAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, uint8_t hopLimit = 0);
uint8_t hopLimit = 0);
private: private:
/** /**
@ -132,7 +131,7 @@ class Router : protected concurrency::OSThread
*/ */
void handleReceived(meshtastic_MeshPacket *p, RxSource src = RX_SRC_RADIO); void handleReceived(meshtastic_MeshPacket *p, RxSource src = RX_SRC_RADIO);
/** Frees the provided packet, and generates a NAK indicating the speicifed error while sending */ /** Frees the provided packet, and generates a NAK indicating the specifed error while sending */
void abortSendAndNak(meshtastic_Routing_Error err, meshtastic_MeshPacket *p); void abortSendAndNak(meshtastic_Routing_Error err, meshtastic_MeshPacket *p);
}; };
@ -143,7 +142,7 @@ class Router : protected concurrency::OSThread
*/ */
bool perhapsDecode(meshtastic_MeshPacket *p); bool perhapsDecode(meshtastic_MeshPacket *p);
/** Return 0 for success or a Routing_Errror code for failure /** Return 0 for success or a Routing_Error code for failure
*/ */
meshtastic_Routing_Error perhapsEncode(meshtastic_MeshPacket *p); meshtastic_Routing_Error perhapsEncode(meshtastic_MeshPacket *p);

View File

@ -94,7 +94,7 @@ template <typename T> bool SX126xInterface<T>::init()
// Overriding current limit // Overriding current limit
// (https://github.com/jgromes/RadioLib/blob/690a050ebb46e6097c5d00c371e961c1caa3b52e/src/modules/SX126x/SX126x.cpp#L85) using // (https://github.com/jgromes/RadioLib/blob/690a050ebb46e6097c5d00c371e961c1caa3b52e/src/modules/SX126x/SX126x.cpp#L85) using
// value in SX126xInterface.h (currently 140 mA) It may or may not be neccessary, depending on how RadioLib functions, from // value in SX126xInterface.h (currently 140 mA) It may or may not be necessary, depending on how RadioLib functions, from
// SX1261/2 datasheet: OCP after setting DeviceSel with SetPaConfig(): SX1261 - 60 mA, SX1262 - 140 mA For the SX1268 the IC // SX1261/2 datasheet: OCP after setting DeviceSel with SetPaConfig(): SX1261 - 60 mA, SX1262 - 140 mA For the SX1268 the IC
// defaults to 140mA no matter the set power level, but RadioLib set it lower, this would need further checking Default values // defaults to 140mA no matter the set power level, but RadioLib set it lower, this would need further checking Default values
// are: SX1262, SX1268: 0x38 (140 mA), SX1261: 0x18 (60 mA) // are: SX1262, SX1268: 0x38 (140 mA), SX1261: 0x18 (60 mA)

View File

@ -1,3 +1,5 @@
#include <sys/types.h>
#pragma once #pragma once
#include "ProtobufModule.h" #include "ProtobufModule.h"
#if HAS_WIFI #if HAS_WIFI

View File

@ -126,7 +126,7 @@ int32_t NeighborInfoModule::runOnce()
} }
/* /*
Collect a recieved neighbor info packet from another node Collect a received neighbor info packet from another node
Pass it to an upper client; do not persist this data on the mesh Pass it to an upper client; do not persist this data on the mesh
*/ */
bool NeighborInfoModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_NeighborInfo *np) bool NeighborInfoModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_NeighborInfo *np)

View File

@ -49,10 +49,9 @@ meshtastic_MeshPacket *RoutingModule::allocReply()
return NULL; return NULL;
} }
void RoutingModule::sendAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, uint8_t hopStart, void RoutingModule::sendAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, uint8_t hopLimit)
uint8_t hopLimit)
{ {
auto p = allocAckNak(err, to, idFrom, chIndex, hopStart, hopLimit); auto p = allocAckNak(err, to, idFrom, chIndex, hopLimit);
router->sendLocal(p); // we sometimes send directly to the local node router->sendLocal(p); // we sometimes send directly to the local node
} }
@ -78,7 +77,7 @@ RoutingModule::RoutingModule() : ProtobufModule("routing", meshtastic_PortNum_RO
{ {
isPromiscuous = true; isPromiscuous = true;
// moved the ReboradcastMode logic into handleReceivedProtobuf // moved the RebroadcastMode logic into handleReceivedProtobuf
// LocalOnly requires either the from or to to be a known node // LocalOnly requires either the from or to to be a known node
// knownOnly specifically requires the from to be a known node. // knownOnly specifically requires the from to be a known node.
encryptedOk = true; encryptedOk = true;

View File

@ -13,8 +13,7 @@ class RoutingModule : public ProtobufModule<meshtastic_Routing>
*/ */
RoutingModule(); RoutingModule();
void sendAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, uint8_t hopStart = 0, void sendAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, uint8_t hopLimit = 0);
uint8_t hopLimit = 0);
// Given the hopStart and hopLimit upon reception of a request, return the hop limit to use for the response // Given the hopStart and hopLimit upon reception of a request, return the hop limit to use for the response
uint8_t getHopLimitForResponse(uint8_t hopStart, uint8_t hopLimit); uint8_t getHopLimitForResponse(uint8_t hopStart, uint8_t hopLimit);
@ -36,4 +35,4 @@ class RoutingModule : public ProtobufModule<meshtastic_Routing>
virtual bool wantPacket(const meshtastic_MeshPacket *p) override { return true; } virtual bool wantPacket(const meshtastic_MeshPacket *p) override { return true; }
}; };
extern RoutingModule *routingModule; extern RoutingModule *routingModule;

View File

@ -532,7 +532,7 @@ void SerialModule::processWXSerial()
batVoltageF, capVoltageF, temperatureF); batVoltageF, capVoltageF, temperatureF);
} }
if (gotwind && !Throttle::isWithinTimespanMs(lastAveraged, averageIntervalMillis)) { if (gotwind && !Throttle::isWithinTimespanMs(lastAveraged, averageIntervalMillis)) {
// calulate averages and send to the mesh // calculate averages and send to the mesh
float velAvg = 1.0 * velSum / velCount; float velAvg = 1.0 * velSum / velCount;
double avgSin = dir_sum_sin / dirCount; double avgSin = dir_sum_sin / dirCount;

View File

@ -1,8 +1,8 @@
#include "UnitConversions.h" #include "UnitConversions.h"
float UnitConversions::CelsiusToFahrenheit(float celcius) float UnitConversions::CelsiusToFahrenheit(float celsius)
{ {
return (celcius * 9) / 5 + 32; return (celsius * 9) / 5 + 32;
} }
float UnitConversions::MetersPerSecondToKnots(float metersPerSecond) float UnitConversions::MetersPerSecondToKnots(float metersPerSecond)

View File

@ -3,7 +3,7 @@
class UnitConversions class UnitConversions
{ {
public: public:
static float CelsiusToFahrenheit(float celcius); static float CelsiusToFahrenheit(float celsius);
static float MetersPerSecondToKnots(float metersPerSecond); static float MetersPerSecondToKnots(float metersPerSecond);
static float MetersPerSecondToMilesPerHour(float metersPerSecond); static float MetersPerSecondToMilesPerHour(float metersPerSecond);
static float HectoPascalToInchesOfMercury(float hectoPascal); static float HectoPascalToInchesOfMercury(float hectoPascal);

View File

@ -12,7 +12,7 @@ bool LSM6DS3Sensor::init()
// Default threshold of 2G, less sensitive options are 4, 8 or 16G // Default threshold of 2G, less sensitive options are 4, 8 or 16G
sensor.setAccelRange(LSM6DS_ACCEL_RANGE_2_G); sensor.setAccelRange(LSM6DS_ACCEL_RANGE_2_G);
// Duration is number of occurances needed to trigger, higher threshold is less sensitive // Duration is number of occurrences needed to trigger, higher threshold is less sensitive
sensor.enableWakeup(config.display.wake_on_tap_or_motion, 1, LSM6DS3_WAKE_THRESH); sensor.enableWakeup(config.display.wake_on_tap_or_motion, 1, LSM6DS3_WAKE_THRESH);
LOG_DEBUG("LSM6DS3Sensor::init ok"); LOG_DEBUG("LSM6DS3Sensor::init ok");

View File

@ -11,6 +11,7 @@
#include "../mesh/generated/meshtastic/paxcount.pb.h" #include "../mesh/generated/meshtastic/paxcount.pb.h"
#endif #endif
#include "mesh/generated/meshtastic/remote_hardware.pb.h" #include "mesh/generated/meshtastic/remote_hardware.pb.h"
#include <sys/types.h>
std::string MeshPacketSerializer::JsonSerialize(const meshtastic_MeshPacket *mp, bool shouldLog) std::string MeshPacketSerializer::JsonSerialize(const meshtastic_MeshPacket *mp, bool shouldLog)
{ {

View File

@ -287,7 +287,7 @@ void doDeepSleep(uint32_t msecToWake, bool skipPreflight = false)
// No need to turn this off if the power draw in sleep mode really is just 0.2uA and turning it off would // No need to turn this off if the power draw in sleep mode really is just 0.2uA and turning it off would
// leave floating input for the IRQ line // leave floating input for the IRQ line
// If we want to leave the radio receiving in would be 11.5mA current draw, but most of the time it is just waiting // If we want to leave the radio receiving in would be 11.5mA current draw, but most of the time it is just waiting
// in its sequencer (true?) so the average power draw should be much lower even if we were listinging for packets // in its sequencer (true?) so the average power draw should be much lower even if we were listening for packets
// all the time. // all the time.
PMU->setChargingLedMode(XPOWERS_CHG_LED_OFF); PMU->setChargingLedMode(XPOWERS_CHG_LED_OFF);
@ -359,7 +359,7 @@ esp_sleep_wakeup_cause_t doLightSleep(uint64_t sleepMsec) // FIXME, use a more r
// never tries to go to sleep if the user is using the API // never tries to go to sleep if the user is using the API
// gpio_wakeup_enable((gpio_num_t)SERIAL0_RX_GPIO, GPIO_INTR_LOW_LEVEL); // gpio_wakeup_enable((gpio_num_t)SERIAL0_RX_GPIO, GPIO_INTR_LOW_LEVEL);
// doesn't help - I think the USB-UART chip losing power is pulling the signal llow // doesn't help - I think the USB-UART chip losing power is pulling the signal low
// gpio_pullup_en((gpio_num_t)SERIAL0_RX_GPIO); // gpio_pullup_en((gpio_num_t)SERIAL0_RX_GPIO);
// alas - can only work if using the refclock, which is limited to about 9600 bps // alas - can only work if using the refclock, which is limited to about 9600 bps