mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-24 01:16:55 +00:00
Compare commits
6 Commits
5d25c304ad
...
beb69e93d0
Author | SHA1 | Date | |
---|---|---|---|
![]() |
beb69e93d0 | ||
![]() |
9415254dda | ||
![]() |
448c754882 | ||
![]() |
da7424a604 | ||
![]() |
1bec23b6bb | ||
![]() |
bee474ee54 |
@ -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 =
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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))),
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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)) {
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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 {
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "ProtobufModule.h"
|
#include "ProtobufModule.h"
|
||||||
#if HAS_WIFI
|
#if HAS_WIFI
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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");
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user