Compare commits

...

63 Commits

Author SHA1 Message Date
Jm Casler
371335e6ab Update version to 1.2.48 2021-12-02 22:55:07 -08:00
Jm Casler
8bc4b581d1 Merge branch 'master' of https://github.com/meshtastic/Meshtastic-device 2021-12-02 22:54:22 -08:00
Jm Casler
2311653ca8 updating proto submodule to latest 2021-12-02 22:53:46 -08:00
Jm Casler
040e3234fc Merge pull request #948 from Solarvortx/SX1262-Power
Sx1262 power
2021-12-02 22:53:09 -08:00
Jm Casler
62cf2adaec Merge branch 'master' into SX1262-Power 2021-12-02 22:41:09 -08:00
Sacha Weatherstone
063499ef46 Cheanup old unused files. 2021-12-03 17:28:32 +11:00
Solanaceae
b7eaeb8c31 Merge branch 'master' into SX1262-Power 2021-12-02 21:50:37 -07:00
Solanaceae
6bd495a491 OCP limit into SX126x class where it belongs. 2021-12-02 20:46:36 -07:00
Jm Casler
f09aa9bec0 Fix promote-release #947
Fix promote-release #947
2021-12-02 19:40:40 -08:00
Jm Casler
a7b3b4386f Merge pull request #946 from mc-hamster/StoreAndForward
Store and forward generated protos & add Mac config in platform.ini
2021-12-02 19:15:23 -08:00
Jm Casler
6a426d5d71 Update S&F with new object name 2021-12-02 17:27:38 -08:00
Jm Casler
0ca061a457 uncomment meshtastic-diy-v1 2021-12-02 17:20:04 -08:00
Jm Casler
f1ef1eeaff Add monitor & upload for mac (commented out) 2021-12-02 17:19:21 -08:00
Jm Casler
1175c981c0 Update generated protos for S&F 2021-12-02 17:16:39 -08:00
Jm Casler
1d3387466f Merge branch 'master' of https://github.com/meshtastic/Meshtastic-device 2021-12-02 16:44:14 -08:00
Jm Casler
fcccddc4ad updating proto submodule to latest 2021-12-02 16:44:00 -08:00
Jm Casler
be44fa11b1 Merge pull request #944 from mc-hamster/StoreAndForward
Store and forward
2021-12-02 11:50:57 -08:00
Jm Casler
de104a2707 Merge branch 'master' into StoreAndForward 2021-12-02 09:27:42 -08:00
Ben Meadors
9d019c1a99 Adding batch script for generating uf2 files for NRF boards (#945)
* Updated generated protos

* Added uf2-converter batch for windows machines
2021-12-02 10:19:25 -06:00
Jm Casler
11d954422b Merge branch 'meshtastic:master' into StoreAndForward 2021-12-01 17:58:51 -08:00
Jm Casler
f4d348173c Refresh node info to ensure our information is current for smart position. #934 2021-12-01 17:56:47 -08:00
Jm Casler
79eb5546a1 Merge pull request #943 from mc-hamster/StoreAndForward
Little update to #934
2021-12-01 17:24:37 -08:00
Jm Casler
4f10ab8d04 Little update to #934
updated lastGpsSend
2021-12-01 17:24:01 -08:00
Solanaceae
ab0a06e536 Raising currentLimit for SX1262 2021-11-30 17:56:19 -07:00
Jm Casler
59ef28dfa7 updating proto submodule to latest 2021-11-29 21:43:46 -08:00
Jm Casler
d87106900b Merge pull request #942 from mc-hamster/OneButton
Upgrade to OneButton 2.0.3 #941
2021-11-29 09:15:57 -08:00
Jm Casler
241325d245 Upgrade to OneButton 2.0.3 #941 2021-11-29 09:09:25 -08:00
Jm Casler
0118f3991a Merge pull request #937 from Hydra-Designs/master
Automatic screen carousel behavior implementation (auto_screen_carousel_secs user preference)
2021-11-29 08:56:53 -08:00
Ben Meadors
2a617ba7b2 Upstream proto addition 2021-11-29 10:05:32 -06:00
Ben Meadors
bbf3091889 Merge branch 'master' into master 2021-11-29 09:58:16 -06:00
Jm Casler
5199b4d3c7 Merge pull request #924 from rxt1077/issue-919
ACK retried want_ack packets #919
2021-11-29 07:06:11 -08:00
Ben Meadors
99d35b175c Merge remote-tracking branch 'upstream/master' 2021-11-29 07:02:56 -06:00
Jm Casler
98d0907f4d Merge branch 'master' into issue-919 2021-11-28 22:36:41 -08:00
Jm Casler
5f6d97151c Merge pull request #940 from mc-hamster/StoreAndForward
Fix for: Wifi admin mode no longer works #939
2021-11-28 22:16:13 -08:00
Jm Casler
8cefa82ff1 Merge branch 'meshtastic:master' into StoreAndForward 2021-11-28 21:57:02 -08:00
Jm Casler
623b846713 Fix for: Wifi admin mode no longer works #939
Fix for: Wifi admin mode no longer works #939
2021-11-28 21:56:34 -08:00
Jm Casler
e791a5aa2f Merge branch 'master' into issue-919 2021-11-28 20:13:56 -08:00
Jm Casler
82332c9cd0 Merge pull request #938 from mc-hamster/StoreAndForward
Changes for S&F and Smart Positioning #934
2021-11-28 20:13:18 -08:00
Jm Casler
d5506bb33c Cleanup (Comments & Formatting) of S&F and PrositionPlugin.cpp 2021-11-28 19:41:34 -08:00
Jm Casler
937f67c4ec Check in partial work on S&F 2021-11-28 19:34:35 -08:00
Jm Casler
3ed4a1e3e1 Merge branch 'master' into StoreAndForward 2021-11-28 19:31:49 -08:00
Jm Casler
757de54a4f Merge pull request #935 from rxt1077/issue-927
#927 add SSL notification at boot
2021-11-28 19:30:29 -08:00
Jm Casler
5cf0b6b3b1 Merge branch 'StoreAndForward' of https://github.com/mc-hamster/Meshtastic-device into StoreAndForward 2021-11-28 19:27:54 -08:00
Jm Casler
809179ce0e Merge branch 'meshtastic:master' into StoreAndForward 2021-11-28 19:26:48 -08:00
Jm Casler
d7315778d6 Generated protos for S&F 2021-11-28 19:25:50 -08:00
Ben Meadors
69a2029ade Removed unnecessary debug print 2021-11-27 09:29:39 -06:00
Ben Meadors
7a649e3fc3 Regen protobufs from upstream 2021-11-27 09:16:26 -06:00
Ben Meadors
f019151e3f auto_screen_carousel_secs behavior implementation 2021-11-27 09:11:58 -06:00
Jm Casler
88fd671880 Tweaking values of Smart Position #934
Tweaking values of Smart Position #934
2021-11-26 21:26:36 -08:00
Jm Casler
d72c091ead Merge branch 'master' into issue-927 2021-11-26 19:50:40 -08:00
Jm Casler
3ec508169a Implementation of smart positioning #934
Initial check in for https://github.com/meshtastic/Meshtastic-device/issues/934
2021-11-26 19:12:00 -08:00
Jm Casler
1775770e54 Merge pull request #936 from mc-hamster/StoreAndForward
Update protobufs with the latest from meshtastic-protobufs
2021-11-26 19:09:53 -08:00
Jm Casler
f6fde55363 Update protobufs with the latest from meshtastic-protobufs 2021-11-26 18:25:08 -08:00
Jm Casler
e548de3c88 Merge branch 'master' of https://github.com/meshtastic/Meshtastic-device 2021-11-26 18:14:45 -08:00
Jm Casler
f75aac8ebf updating submodule to latest 2021-11-26 18:13:21 -08:00
Sacha Weatherstone
bc311ac9f6 Merge branch 'master' into issue-927 2021-11-27 08:59:22 +11:00
Sacha Weatherstone
d4c6007047 Merge pull request #932 from joarSv/feature/define-battery-pin-tlorav1
Define battery pin
2021-11-27 08:58:33 +11:00
Ryan Tolboom
c5f210384f add SSL notification at boot 2021-11-26 15:09:16 -05:00
Joar Svensson
d685682dd9 Define battery pin 2021-11-26 13:28:20 +01:00
Ryan Tolboom
e31f9b6e5e Merge branch 'master' into issue-919 2021-11-24 17:06:34 -05:00
Ryan Tolboom
a0d829a91e Merge branch 'master' into issue-919 2021-11-23 13:36:09 -05:00
Ryan Tolboom
e3ee3c411c Merge branch 'master' into issue-919 2021-11-22 23:08:06 -05:00
Ryan Tolboom
c36b233c49 ACK retried want_ack packets 2021-11-22 21:31:12 -05:00
42 changed files with 426 additions and 131 deletions

2
.gitignore vendored
View File

@@ -9,7 +9,7 @@ main/credentials.h
!.vscode/extensions.json
*.code-workspace
.idea/workspace.xml
.idea
.DS_Store
Thumbs.db

View File

@@ -1,7 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<clangFormatSettings>
<option name="ENABLED" value="true" />
</clangFormatSettings>
</code_scheme>
</component>

View File

@@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CMake" type="CPP_MODULE" version="4" />

4
.idea/misc.xml generated
View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
</project>

8
.idea/modules.xml generated
View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/meshtastic-esp32.iml" filepath="$PROJECT_DIR$/.idea/meshtastic-esp32.iml" />
</modules>
</component>
</project>

9
.idea/vcs.xml generated
View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/design" vcs="Git" />
<mapping directory="$PROJECT_DIR$/proto" vcs="Git" />
<mapping directory="$PROJECT_DIR$/sdk-nrfxlib" vcs="Git" />
</component>
</project>

View File

@@ -6,6 +6,10 @@ VERSION=`bin/buildinfo.py long`
# Must have a V prefix to trigger github
git tag "v${VERSION}"
git push root "v${VERSION}" # push the tag
# Commented out per https://github.com/meshtastic/Meshtastic-device/issues/947
#git push root "v${VERSION}" # push the tag
git push origin "v${VERSION}" # push the tag
echo "Tag ${VERSION} pushed to github, github actions should now be building the draft release. If it seems good, click to publish it"

2
bin/uf2-convert.bat Normal file
View File

@@ -0,0 +1,2 @@
@echo off
if [%1]==[] (echo "Please specify a platformio NRF target (i.e. rak4631) as the first argument.") else (python3 .\bin\uf2conv.py .\.pio\build\%1\firmware.hex -c -o .\.pio\build\%1\firmware.uf2 -f 0xADA52840)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 532 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm1 9.29c.88-.39 1.5-1.26 1.5-2.29 0-1.38-1.12-2.5-2.5-2.5S9.5 10.62 9.5 12c0 1.02.62 1.9 1.5 2.29v3.3L7.59 21 9 22.41l3-3 3 3L16.41 21 13 17.59v-3.3zM12 1C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z"/></svg>

Before

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,7 +0,0 @@
* install python
* install git (including git-bash)
* install platformio
* install vscode
* install https://sourceforge.net/projects/mingw-w64/ (for windows gcc/g++) - you'll need to add the bin directory to your PATH

View File

@@ -69,7 +69,7 @@ debug_tool = jlink
lib_deps =
https://github.com/meshtastic/esp8266-oled-ssd1306.git#35d796226b853b0c0ff818b2f1aa3d35e7296a96 ; ESP8266_SSD1306
https://github.com/geeksville/OneButton.git ; OneButton library for non-blocking button debounce
https://github.com/meshtastic/OneButton.git#3bcba9492d01e2a8a86f46700ab16f96dd2cf1f5 ; OneButton library for non-blocking button debounce
1202 ; CRC32, explicitly needed because dependency is missing in the ble ota update lib
https://github.com/meshtastic/arduino-fsm.git
https://github.com/meshtastic/SparkFun_Ublox_Arduino_Library.git#31015a55e630a2df77d9d714669c621a5bf355ad

2
proto

Submodule proto updated: e24fa8c6ed...5a556ee4a9

1
src/.gitignore vendored
View File

@@ -1 +0,0 @@
main.ino.cpp

View File

@@ -327,6 +327,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define GPS_RX_PIN 36
#define GPS_TX_PIN 37
#define BATTERY_PIN 35 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
#define I2C_SDA 4 // I2C pins for this board
#define I2C_SCL 15

View File

@@ -147,6 +147,17 @@ static void drawBootScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int1
drawIconScreen(region, display, state, x, y);
}
// Used on boot when a certificate is being created
static void drawSSLScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
display->setTextAlignment(TEXT_ALIGN_CENTER);
display->setFont(FONT_SMALL);
display->drawString(64 + x, y, "Creating SSL certificate");
display->setFont(FONT_SMALL);
display->drawString(64 + x, FONT_HEIGHT_SMALL + y + 2, "Please wait...");
}
#ifdef HAS_EINK
/// Used on eink displays while in deep sleep
static void drawSleepScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
@@ -794,6 +805,8 @@ void Screen::forceDisplay()
#endif
}
static uint32_t lastScreenTransition;
int32_t Screen::runOnce()
{
// If we don't have a screen, don't ever spend any CPU for us.
@@ -870,8 +883,13 @@ int32_t Screen::runOnce()
// standard screen switching is stopped.
if (showingNormalScreen) {
// standard screen loop handling here
if (radioConfig.preferences.auto_screen_carousel_secs > 0 &&
(millis() - lastScreenTransition) > (radioConfig.preferences.auto_screen_carousel_secs * 1000)) {
DEBUG_MSG("LastScreenTransition exceeded %ums transitioning to next frame\n", (millis() - lastScreenTransition));
handleOnPress();
}
}
// DEBUG_MSG("want fps %d, fixed=%d\n", targetFramerate,
// ui.getUiState()->frameState); If we are scrolling we need to be called
// soon, otherwise just 1 fps (to save CPU) We also ask to be called twice
@@ -898,6 +916,16 @@ void Screen::drawDebugInfoWiFiTrampoline(OLEDDisplay *display, OLEDDisplayUiStat
screen->debugInfo.drawFrameWiFi(display, state, x, y);
}
/* show a message that the SSL cert is being built
* it is expected that this will be used during the boot phase */
void Screen::setSSLFrames()
{
DEBUG_MSG("showing SSL frames\n");
static FrameCallback sslFrames[] = {drawSSLScreen};
ui.setFrames(sslFrames, 1);
ui.update();
}
// restore our regular frame list
void Screen::setFrames()
{
@@ -933,8 +961,9 @@ void Screen::setFrames()
normalFrames[numframes++] = drawCriticalFaultFrame;
// If we have a text message - show it next, unless it's a phone message and we aren't using any special plugins
if (devicestate.has_rx_text_message && shouldDrawMessage(&devicestate.rx_text_message))
if (devicestate.has_rx_text_message && shouldDrawMessage(&devicestate.rx_text_message)) {
normalFrames[numframes++] = drawTextMessageFrame;
}
// then all the nodes
// We only show a few nodes in our scrolling list - because meshes with many nodes would have too many screens
@@ -1024,12 +1053,13 @@ void Screen::handlePrint(const char *text)
}
void Screen::handleOnPress()
{
{
// If screen was off, just wake it, otherwise advance to next frame
// If we are in a transition, the press must have bounced, drop it.
if (ui.getUiState()->frameState == FIXED) {
ui.nextFrame();
DEBUG_MSG("Setting LastScreenTransition\n");
lastScreenTransition = millis();
setFastFramerate();
}
}

View File

@@ -220,6 +220,9 @@ class Screen : public concurrency::OSThread
/// Used to force (super slow) eink displays to draw critical frames
void forceDisplay();
/// Draws our SSL cert screen during boot (called from WebServer)
void setSSLFrames();
protected:
/// Updates the UI.
//

View File

@@ -17,7 +17,7 @@ ErrorCode FloodingRouter::send(MeshPacket *p)
return Router::send(p);
}
bool FloodingRouter::shouldFilterReceived(const MeshPacket *p)
bool FloodingRouter::shouldFilterReceived(MeshPacket *p)
{
if (wasSeenRecently(p)) { // Note: this will also add a recent packet record
printPacket("Ignoring incoming msg, because we've already seen it", p);

View File

@@ -50,7 +50,7 @@ class FloodingRouter : public Router, protected PacketHistory
* Called immedately on receiption, before any further processing.
* @return true to abandon the packet
*/
virtual bool shouldFilterReceived(const MeshPacket *p);
virtual bool shouldFilterReceived(MeshPacket *p);
/**
* Look for broadcasts we need to rebroadcast

View File

@@ -87,8 +87,8 @@ class RadioLibInterface : public RadioInterface, protected concurrency::Notified
* for a long time.
*/
const uint8_t syncWord = 0x2b;
float currentLimit = 100; // FIXME
float currentLimit = 100; // 100mA OCP - Should be acceptable for RFM95/SX127x chipset.
LockingModule module; // The HW interface to the radio

View File

@@ -26,7 +26,7 @@ ErrorCode ReliableRouter::send(MeshPacket *p)
return FloodingRouter::send(p);
}
bool ReliableRouter::shouldFilterReceived(const MeshPacket *p)
bool ReliableRouter::shouldFilterReceived(MeshPacket *p)
{
// Note: do not use getFrom() here, because we want to ignore messages sent from phone
if (p->to == NODENUM_BROADCAST && p->from == getNodeNum()) {
@@ -54,6 +54,17 @@ bool ReliableRouter::shouldFilterReceived(const MeshPacket *p)
}
}
/* send acks for repeated packets that want acks and are destined for us
* this way if an ACK is dropped and a packet is resent we'll ACK the resent packet
* make sure wasSeenRecently _doesn't_ update
* finding the channel requires decoding the packet. */
if (p->want_ack && (p->to == getNodeNum()) && wasSeenRecently(p, false)) {
if (perhapsDecode(p)) {
sendAckNak(Routing_Error_NONE, getFrom(p), p->id, p->channel);
DEBUG_MSG("acking a repeated want_ack packet\n");
}
}
return FloodingRouter::shouldFilterReceived(p);
}

View File

@@ -102,7 +102,7 @@ class ReliableRouter : public FloodingRouter
/**
* We hook this method so we can see packets before FloodingRouter says they should be discarded
*/
virtual bool shouldFilterReceived(const MeshPacket *p);
virtual bool shouldFilterReceived(MeshPacket *p);
/**
* Add p to the list of packets to retransmit occasionally. We will free it once we stop retransmitting.

View File

@@ -90,7 +90,7 @@ class Router : protected concurrency::OSThread
* Called immedately on receiption, before any further processing.
* @return true to abandon the packet
*/
virtual bool shouldFilterReceived(const MeshPacket *p) { return false; }
virtual bool shouldFilterReceived(MeshPacket *p) { return false; }
/**
* Every (non duplicate) packet this node receives will be passed through this method. This allows subclasses to

View File

@@ -29,6 +29,8 @@ class SX126xInterface : public RadioLibInterface
protected:
float currentLimit = 140; // Higher OCP limit for SX126x PA
/**
* Specific module instance
*/

View File

@@ -4,9 +4,9 @@
#ifndef PB_ADMIN_PB_H_INCLUDED
#define PB_ADMIN_PB_H_INCLUDED
#include <pb.h>
#include "channel.pb.h"
#include "mesh.pb.h"
#include "radioconfig.pb.h"
#include "channel.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator.
@@ -79,7 +79,7 @@ extern const pb_msgdesc_t AdminMessage_msg;
#define AdminMessage_fields &AdminMessage_msg
/* Maximum encoded size of messages (where known) */
#define AdminMessage_size 420
#define AdminMessage_size 447
#ifdef __cplusplus
} /* extern "C" */

View File

@@ -4,8 +4,8 @@
#ifndef PB_DEVICEONLY_PB_H_INCLUDED
#define PB_DEVICEONLY_PB_H_INCLUDED
#include <pb.h>
#include "mesh.pb.h"
#include "channel.pb.h"
#include "mesh.pb.h"
#include "radioconfig.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -125,7 +125,7 @@ extern const pb_msgdesc_t ChannelFile_msg;
/* Maximum encoded size of messages (where known) */
#define LegacyRadioConfig_size 4
#define LegacyRadioConfig_LegacyPreferences_size 2
#define DeviceState_size 9000
#define DeviceState_size 9594
#define ChannelFile_size 832
#ifdef __cplusplus

View File

@@ -198,6 +198,9 @@ typedef struct _User {
HardwareModel hw_model;
bool is_licensed;
Team team;
uint32_t tx_power_dbm;
uint32_t ant_gain_dbi;
uint32_t ant_azimuth;
} User;
typedef PB_BYTES_ARRAY_T(256) MeshPacket_encrypted_t;
@@ -306,7 +309,7 @@ extern "C" {
/* Initializer values for message structs */
#define Position_init_default {0, 0, 0, 0, 0, _Position_LocSource_MIN, _Position_AltSource_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define User_init_default {"", "", "", {0}, _HardwareModel_MIN, 0, _Team_MIN}
#define User_init_default {"", "", "", {0}, _HardwareModel_MIN, 0, _Team_MIN, 0, 0, 0}
#define RouteDiscovery_init_default {0, {0, 0, 0, 0, 0, 0, 0, 0}}
#define Routing_init_default {0, {RouteDiscovery_init_default}}
#define Data_init_default {_PortNum_MIN, {0, {0}}, 0, 0, 0, 0}
@@ -318,7 +321,7 @@ extern "C" {
#define ToRadio_init_default {0, {MeshPacket_init_default}}
#define ToRadio_PeerInfo_init_default {0, 0}
#define Position_init_zero {0, 0, 0, 0, 0, _Position_LocSource_MIN, _Position_AltSource_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define User_init_zero {"", "", "", {0}, _HardwareModel_MIN, 0, _Team_MIN}
#define User_init_zero {"", "", "", {0}, _HardwareModel_MIN, 0, _Team_MIN, 0, 0, 0}
#define RouteDiscovery_init_zero {0, {0, 0, 0, 0, 0, 0, 0, 0}}
#define Routing_init_zero {0, {RouteDiscovery_init_zero}}
#define Data_init_zero {_PortNum_MIN, {0, {0}}, 0, 0, 0, 0}
@@ -387,6 +390,9 @@ extern "C" {
#define User_hw_model_tag 6
#define User_is_licensed_tag 7
#define User_team_tag 8
#define User_tx_power_dbm_tag 10
#define User_ant_gain_dbi_tag 11
#define User_ant_azimuth_tag 12
#define MeshPacket_from_tag 1
#define MeshPacket_to_tag 2
#define MeshPacket_channel_tag 3
@@ -454,7 +460,10 @@ X(a, STATIC, SINGULAR, STRING, short_name, 3) \
X(a, STATIC, SINGULAR, FIXED_LENGTH_BYTES, macaddr, 4) \
X(a, STATIC, SINGULAR, UENUM, hw_model, 6) \
X(a, STATIC, SINGULAR, BOOL, is_licensed, 7) \
X(a, STATIC, SINGULAR, UENUM, team, 8)
X(a, STATIC, SINGULAR, UENUM, team, 8) \
X(a, STATIC, SINGULAR, UINT32, tx_power_dbm, 10) \
X(a, STATIC, SINGULAR, UINT32, ant_gain_dbi, 11) \
X(a, STATIC, SINGULAR, UINT32, ant_azimuth, 12)
#define User_CALLBACK NULL
#define User_DEFAULT NULL
@@ -595,12 +604,12 @@ extern const pb_msgdesc_t ToRadio_PeerInfo_msg;
/* Maximum encoded size of messages (where known) */
#define Position_size 153
#define User_size 78
#define User_size 96
#define RouteDiscovery_size 40
#define Routing_size 42
#define Data_size 260
#define MeshPacket_size 309
#define NodeInfo_size 252
#define NodeInfo_size 270
#define MyNodeInfo_size 101
#define LogRecord_size 81
#define FromRadio_size 318

View File

@@ -24,6 +24,7 @@ typedef enum _PortNum {
PortNum_STORE_FORWARD_APP = 65,
PortNum_RANGE_TEST_APP = 66,
PortNum_ENVIRONMENTAL_MEASUREMENT_APP = 67,
PortNum_ZPS_APP = 68,
PortNum_PRIVATE_APP = 256,
PortNum_ATAK_FORWARDER = 257,
PortNum_MAX = 511

View File

@@ -101,6 +101,7 @@ typedef struct _RadioConfig_UserPreferences {
bool wifi_ap_mode;
RegionCode region;
ChargeCurrent charge_current;
bool position_broadcast_smart;
LocationSharing location_share;
GpsOperation gps_operation;
uint32_t gps_update_interval;
@@ -135,6 +136,8 @@ typedef struct _RadioConfig_UserPreferences {
uint32_t range_test_plugin_sender;
bool range_test_plugin_save;
uint32_t store_forward_plugin_records;
uint32_t store_forward_plugin_history_return_max;
uint32_t store_forward_plugin_history_return_window;
bool environmental_measurement_plugin_measurement_enabled;
bool environmental_measurement_plugin_screen_enabled;
uint32_t environmental_measurement_plugin_read_error_count_threshold;
@@ -144,8 +147,10 @@ typedef struct _RadioConfig_UserPreferences {
RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType environmental_measurement_plugin_sensor_type;
uint32_t environmental_measurement_plugin_sensor_pin;
bool store_forward_plugin_enabled;
bool store_forward_plugin_heartbeat;
uint32_t position_flags;
bool is_always_powered;
uint32_t auto_screen_carousel_secs;
} RadioConfig_UserPreferences;
typedef struct _RadioConfig {
@@ -190,9 +195,9 @@ extern "C" {
/* Initializer values for message structs */
#define RadioConfig_init_default {false, RadioConfig_UserPreferences_init_default}
#define RadioConfig_UserPreferences_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, _LocationSharing_MIN, _GpsOperation_MIN, 0, 0, 0, 0, 0, 0, 0, "", 0, _GpsCoordinateFormat_MIN, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN, 0, 0, 0, 0}
#define RadioConfig_UserPreferences_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, 0, _LocationSharing_MIN, _GpsOperation_MIN, 0, 0, 0, 0, 0, 0, 0, "", 0, _GpsCoordinateFormat_MIN, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN, 0, 0, 0, 0, 0, 0}
#define RadioConfig_init_zero {false, RadioConfig_UserPreferences_init_zero}
#define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, _LocationSharing_MIN, _GpsOperation_MIN, 0, 0, 0, 0, 0, 0, 0, "", 0, _GpsCoordinateFormat_MIN, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN, 0, 0, 0, 0}
#define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, 0, _LocationSharing_MIN, _GpsOperation_MIN, 0, 0, 0, 0, 0, 0, 0, "", 0, _GpsCoordinateFormat_MIN, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN, 0, 0, 0, 0, 0, 0}
/* Field tags (for use in manual encoding/decoding) */
#define RadioConfig_UserPreferences_position_broadcast_secs_tag 1
@@ -210,6 +215,7 @@ extern "C" {
#define RadioConfig_UserPreferences_wifi_ap_mode_tag 14
#define RadioConfig_UserPreferences_region_tag 15
#define RadioConfig_UserPreferences_charge_current_tag 16
#define RadioConfig_UserPreferences_position_broadcast_smart_tag 17
#define RadioConfig_UserPreferences_location_share_tag 32
#define RadioConfig_UserPreferences_gps_operation_tag 33
#define RadioConfig_UserPreferences_gps_update_interval_tag 34
@@ -243,6 +249,8 @@ extern "C" {
#define RadioConfig_UserPreferences_range_test_plugin_sender_tag 133
#define RadioConfig_UserPreferences_range_test_plugin_save_tag 134
#define RadioConfig_UserPreferences_store_forward_plugin_records_tag 137
#define RadioConfig_UserPreferences_store_forward_plugin_history_return_max_tag 138
#define RadioConfig_UserPreferences_store_forward_plugin_history_return_window_tag 139
#define RadioConfig_UserPreferences_environmental_measurement_plugin_measurement_enabled_tag 140
#define RadioConfig_UserPreferences_environmental_measurement_plugin_screen_enabled_tag 141
#define RadioConfig_UserPreferences_environmental_measurement_plugin_read_error_count_threshold_tag 142
@@ -252,8 +260,10 @@ extern "C" {
#define RadioConfig_UserPreferences_environmental_measurement_plugin_sensor_type_tag 146
#define RadioConfig_UserPreferences_environmental_measurement_plugin_sensor_pin_tag 147
#define RadioConfig_UserPreferences_store_forward_plugin_enabled_tag 148
#define RadioConfig_UserPreferences_store_forward_plugin_heartbeat_tag 149
#define RadioConfig_UserPreferences_position_flags_tag 150
#define RadioConfig_UserPreferences_is_always_powered_tag 151
#define RadioConfig_UserPreferences_auto_screen_carousel_secs_tag 152
#define RadioConfig_preferences_tag 1
/* Struct field encoding specification for nanopb */
@@ -279,6 +289,7 @@ X(a, STATIC, SINGULAR, STRING, wifi_password, 13) \
X(a, STATIC, SINGULAR, BOOL, wifi_ap_mode, 14) \
X(a, STATIC, SINGULAR, UENUM, region, 15) \
X(a, STATIC, SINGULAR, UENUM, charge_current, 16) \
X(a, STATIC, SINGULAR, BOOL, position_broadcast_smart, 17) \
X(a, STATIC, SINGULAR, UENUM, location_share, 32) \
X(a, STATIC, SINGULAR, UENUM, gps_operation, 33) \
X(a, STATIC, SINGULAR, UINT32, gps_update_interval, 34) \
@@ -312,6 +323,8 @@ X(a, STATIC, SINGULAR, BOOL, range_test_plugin_enabled, 132) \
X(a, STATIC, SINGULAR, UINT32, range_test_plugin_sender, 133) \
X(a, STATIC, SINGULAR, BOOL, range_test_plugin_save, 134) \
X(a, STATIC, SINGULAR, UINT32, store_forward_plugin_records, 137) \
X(a, STATIC, SINGULAR, UINT32, store_forward_plugin_history_return_max, 138) \
X(a, STATIC, SINGULAR, UINT32, store_forward_plugin_history_return_window, 139) \
X(a, STATIC, SINGULAR, BOOL, environmental_measurement_plugin_measurement_enabled, 140) \
X(a, STATIC, SINGULAR, BOOL, environmental_measurement_plugin_screen_enabled, 141) \
X(a, STATIC, SINGULAR, UINT32, environmental_measurement_plugin_read_error_count_threshold, 142) \
@@ -321,8 +334,10 @@ X(a, STATIC, SINGULAR, BOOL, environmental_measurement_plugin_display_fare
X(a, STATIC, SINGULAR, UENUM, environmental_measurement_plugin_sensor_type, 146) \
X(a, STATIC, SINGULAR, UINT32, environmental_measurement_plugin_sensor_pin, 147) \
X(a, STATIC, SINGULAR, BOOL, store_forward_plugin_enabled, 148) \
X(a, STATIC, SINGULAR, BOOL, store_forward_plugin_heartbeat, 149) \
X(a, STATIC, SINGULAR, UINT32, position_flags, 150) \
X(a, STATIC, SINGULAR, BOOL, is_always_powered, 151)
X(a, STATIC, SINGULAR, BOOL, is_always_powered, 151) \
X(a, STATIC, SINGULAR, UINT32, auto_screen_carousel_secs, 152)
#define RadioConfig_UserPreferences_CALLBACK NULL
#define RadioConfig_UserPreferences_DEFAULT NULL
@@ -334,8 +349,8 @@ extern const pb_msgdesc_t RadioConfig_UserPreferences_msg;
#define RadioConfig_UserPreferences_fields &RadioConfig_UserPreferences_msg
/* Maximum encoded size of messages (where known) */
#define RadioConfig_size 417
#define RadioConfig_UserPreferences_size 414
#define RadioConfig_size 444
#define RadioConfig_UserPreferences_size 441
#ifdef __cplusplus
} /* extern "C" */

View File

@@ -0,0 +1,19 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.4 */
#include "storeforward.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator.
#endif
PB_BIND(StoreAndForward, StoreAndForward, AUTO)
PB_BIND(StoreAndForward_Statistics, StoreAndForward_Statistics, AUTO)
PB_BIND(StoreAndForward_History, StoreAndForward_History, AUTO)

View File

@@ -0,0 +1,135 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.4 */
#ifndef PB_STOREFORWARD_PB_H_INCLUDED
#define PB_STOREFORWARD_PB_H_INCLUDED
#include <pb.h>
#if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator.
#endif
/* Enum definitions */
typedef enum _StoreAndForward_RequestResponse {
StoreAndForward_RequestResponse_UNSET = 0,
StoreAndForward_RequestResponse_ROUTER_ERROR = 1,
StoreAndForward_RequestResponse_ROUTER_HEARTBEAT = 2,
StoreAndForward_RequestResponse_ROUTER_PING = 3,
StoreAndForward_RequestResponse_ROUTER_PONG = 4,
StoreAndForward_RequestResponse_ROUTER_BUSY = 5,
StoreAndForward_RequestResponse_CLIENT_ERROR = 101,
StoreAndForward_RequestResponse_CLIENT_HISTORY = 102,
StoreAndForward_RequestResponse_CLIENT_STATS = 103,
StoreAndForward_RequestResponse_CLIENT_PING = 104,
StoreAndForward_RequestResponse_CLIENT_PONG = 105
} StoreAndForward_RequestResponse;
/* Struct definitions */
typedef struct _StoreAndForward_History {
uint32_t HistoryMessages;
uint32_t Window;
} StoreAndForward_History;
typedef struct _StoreAndForward_Statistics {
uint32_t MessagesTotal;
uint32_t MessagesSaved;
uint32_t MessagesMax;
uint32_t UpTime;
uint32_t Requests;
uint32_t RequestsHistory;
bool Heartbeat;
uint32_t ReturnMax;
uint32_t ReturnWindow;
} StoreAndForward_Statistics;
typedef struct _StoreAndForward {
StoreAndForward_RequestResponse rr;
bool has_stats;
StoreAndForward_Statistics stats;
bool has_history;
StoreAndForward_History history;
} StoreAndForward;
/* Helper constants for enums */
#define _StoreAndForward_RequestResponse_MIN StoreAndForward_RequestResponse_UNSET
#define _StoreAndForward_RequestResponse_MAX StoreAndForward_RequestResponse_CLIENT_PONG
#define _StoreAndForward_RequestResponse_ARRAYSIZE ((StoreAndForward_RequestResponse)(StoreAndForward_RequestResponse_CLIENT_PONG+1))
#ifdef __cplusplus
extern "C" {
#endif
/* Initializer values for message structs */
#define StoreAndForward_init_default {_StoreAndForward_RequestResponse_MIN, false, StoreAndForward_Statistics_init_default, false, StoreAndForward_History_init_default}
#define StoreAndForward_Statistics_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0}
#define StoreAndForward_History_init_default {0, 0}
#define StoreAndForward_init_zero {_StoreAndForward_RequestResponse_MIN, false, StoreAndForward_Statistics_init_zero, false, StoreAndForward_History_init_zero}
#define StoreAndForward_Statistics_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0}
#define StoreAndForward_History_init_zero {0, 0}
/* Field tags (for use in manual encoding/decoding) */
#define StoreAndForward_History_HistoryMessages_tag 1
#define StoreAndForward_History_Window_tag 2
#define StoreAndForward_Statistics_MessagesTotal_tag 1
#define StoreAndForward_Statistics_MessagesSaved_tag 2
#define StoreAndForward_Statistics_MessagesMax_tag 3
#define StoreAndForward_Statistics_UpTime_tag 4
#define StoreAndForward_Statistics_Requests_tag 5
#define StoreAndForward_Statistics_RequestsHistory_tag 6
#define StoreAndForward_Statistics_Heartbeat_tag 7
#define StoreAndForward_Statistics_ReturnMax_tag 8
#define StoreAndForward_Statistics_ReturnWindow_tag 9
#define StoreAndForward_rr_tag 1
#define StoreAndForward_stats_tag 2
#define StoreAndForward_history_tag 3
/* Struct field encoding specification for nanopb */
#define StoreAndForward_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UENUM, rr, 1) \
X(a, STATIC, OPTIONAL, MESSAGE, stats, 2) \
X(a, STATIC, OPTIONAL, MESSAGE, history, 3)
#define StoreAndForward_CALLBACK NULL
#define StoreAndForward_DEFAULT NULL
#define StoreAndForward_stats_MSGTYPE StoreAndForward_Statistics
#define StoreAndForward_history_MSGTYPE StoreAndForward_History
#define StoreAndForward_Statistics_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT32, MessagesTotal, 1) \
X(a, STATIC, SINGULAR, UINT32, MessagesSaved, 2) \
X(a, STATIC, SINGULAR, UINT32, MessagesMax, 3) \
X(a, STATIC, SINGULAR, UINT32, UpTime, 4) \
X(a, STATIC, SINGULAR, UINT32, Requests, 5) \
X(a, STATIC, SINGULAR, UINT32, RequestsHistory, 6) \
X(a, STATIC, SINGULAR, BOOL, Heartbeat, 7) \
X(a, STATIC, SINGULAR, UINT32, ReturnMax, 8) \
X(a, STATIC, SINGULAR, UINT32, ReturnWindow, 9)
#define StoreAndForward_Statistics_CALLBACK NULL
#define StoreAndForward_Statistics_DEFAULT NULL
#define StoreAndForward_History_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT32, HistoryMessages, 1) \
X(a, STATIC, SINGULAR, UINT32, Window, 2)
#define StoreAndForward_History_CALLBACK NULL
#define StoreAndForward_History_DEFAULT NULL
extern const pb_msgdesc_t StoreAndForward_msg;
extern const pb_msgdesc_t StoreAndForward_Statistics_msg;
extern const pb_msgdesc_t StoreAndForward_History_msg;
/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
#define StoreAndForward_fields &StoreAndForward_msg
#define StoreAndForward_Statistics_fields &StoreAndForward_Statistics_msg
#define StoreAndForward_History_fields &StoreAndForward_History_msg
/* Maximum encoded size of messages (where known) */
#define StoreAndForward_size 68
#define StoreAndForward_Statistics_size 50
#define StoreAndForward_History_size 12
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif

View File

@@ -1,3 +1,4 @@
#include "main.h"
#include "mesh/http/WebServer.h"
#include "NodeDB.h"
#include "mesh/http/WiFiAPClient.h"
@@ -77,7 +78,7 @@ static void taskCreateCert(void *parameter)
{
prefs.begin("MeshtasticHTTPS", false);
// Delete the saved certs
// Delete the saved certs (used in debugging)
if (0) {
DEBUG_MSG("Deleting any saved SSL keys ...\n");
// prefs.clear();
@@ -166,11 +167,16 @@ void createSSLCert()
NULL); /* Task handle. */
DEBUG_MSG("Waiting for SSL Cert to be generated.\n");
int seconds = 0;
while (!isCertReady) {
DEBUG_MSG(".");
delay(1000);
yield();
esp_task_wdt_reset();
seconds++;
if ((seconds == 3) && screen) {
screen->setSSLFrames();
}
}
DEBUG_MSG("SSL Cert Ready!\n");
}

View File

@@ -57,7 +57,7 @@ static int32_t reconnectWiFi()
if (*wifiName) {
needReconnect = false;
DEBUG_MSG("... Reconnecting to WiFi access point");
DEBUG_MSG("... Reconnecting to WiFi access point\n");
WiFi.mode(WIFI_MODE_STA);
WiFi.begin(wifiName, wifiPsw);
}

View File

@@ -557,7 +557,7 @@ void setBluetoothEnable(bool on)
bluetoothOn = on;
if (on) {
if (!initWifi(0)) // if we are using wifi, don't turn on bluetooth also
if (!initWifi(isSoftAPForced())) // if we are using wifi, don't turn on bluetooth also
{
Serial.printf("Pre BT: %u heap size\n", ESP.getFreeHeap());
// ESP_ERROR_CHECK( heap_trace_start(HEAP_TRACE_LEAKS) );

View File

@@ -1,9 +1,10 @@
#include "configuration.h"
#include "PositionPlugin.h"
#include "MeshService.h"
#include "NodeDB.h"
#include "RTC.h"
#include "Router.h"
#include "configuration.h"
#include "gps/GeoCoord.h"
PositionPlugin *positionPlugin;
@@ -30,23 +31,11 @@ bool PositionPlugin::handleReceivedProtobuf(const MeshPacket &mp, Position *pptr
}
// Log packet size and list of fields
DEBUG_MSG("POSITION node=%08x l=%d %s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
getFrom(&mp),
mp.decoded.payload.size,
p.latitude_i ? "LAT ":"",
p.longitude_i ? "LON ":"",
p.altitude ? "MSL ":"",
p.altitude_hae ? "HAE ":"",
p.alt_geoid_sep ? "GEO ":"",
p.PDOP ? "PDOP ":"",
p.HDOP ? "HDOP ":"",
p.VDOP ? "VDOP ":"",
p.sats_in_view ? "SIV ":"",
p.fix_quality ? "FXQ ":"",
p.fix_type ? "FXT ":"",
p.pos_timestamp ? "PTS ":"",
p.time ? "TIME ":"",
p.battery_level ? "BAT ":"");
DEBUG_MSG("POSITION node=%08x l=%d %s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", getFrom(&mp), mp.decoded.payload.size,
p.latitude_i ? "LAT " : "", p.longitude_i ? "LON " : "", p.altitude ? "MSL " : "", p.altitude_hae ? "HAE " : "",
p.alt_geoid_sep ? "GEO " : "", p.PDOP ? "PDOP " : "", p.HDOP ? "HDOP " : "", p.VDOP ? "VDOP " : "",
p.sats_in_view ? "SIV " : "", p.fix_quality ? "FXQ " : "", p.fix_type ? "FXT " : "", p.pos_timestamp ? "PTS " : "",
p.time ? "TIME " : "", p.battery_level ? "BAT " : "");
if (p.time) {
struct timeval tv;
@@ -73,7 +62,7 @@ MeshPacket *PositionPlugin::allocReply()
uint32_t pos_flags = radioConfig.preferences.position_flags;
// Populate a Position struct with ONLY the requested fields
Position p = Position_init_default; // Start with an empty structure
Position p = Position_init_default; // Start with an empty structure
// lat/lon are unconditionally included - IF AVAILABLE!
p.latitude_i = node->position.latitude_i;
@@ -138,19 +127,56 @@ int32_t PositionPlugin::runOnce()
{
NodeInfo *node = nodeDB.getNode(nodeDB.getNodeNum());
// radioConfig.preferences.position_broadcast_smart = true;
// We limit our GPS broadcasts to a max rate
uint32_t now = millis();
if (lastGpsSend == 0 || now - lastGpsSend >= getPref_position_broadcast_secs() * 1000) {
lastGpsSend = now;
lastGpsLatitude = node->position.latitude_i;
lastGpsLongitude = node->position.longitude_i;
// If we changed channels, ask everyone else for their latest info
bool requestReplies = currentGeneration != radioGeneration;
currentGeneration = radioGeneration;
DEBUG_MSG("Sending pos@%x:6 to mesh (wantReplies=%d)\n",
node->position.pos_timestamp, requestReplies);
DEBUG_MSG("Sending pos@%x:6 to mesh (wantReplies=%d)\n", node->position.pos_timestamp, requestReplies);
sendOurPosition(NODENUM_BROADCAST, requestReplies);
} else if (radioConfig.preferences.position_broadcast_smart == true) {
NodeInfo *node = service.refreshMyNodeInfo(); // should guarantee there is now a position
if (node->has_position && (node->position.latitude_i != 0 || node->position.longitude_i != 0)) {
float distance = GeoCoord::latLongToMeter(lastGpsLatitude * 1e-7, lastGpsLongitude * 1e-7,
node->position.latitude_i * 1e-7, node->position.longitude_i * 1e-7);
/* Please don't change these values. This accomodates for possible poor positioning
in the event the GPS has a poor satelite lock.
*/
const uint8_t distanceTravel = 150;
/* Minimum time between position updates.
Note: At an average walking speed of 3.5mph, it takes 90 seconds to travel 150 meters.
*/
const uint8_t timeTravel = 60;
// If the distance traveled since the last update is greater than 100 meters
// and it's been at least 60 seconds since the last update
if ((abs(distance) >= distanceTravel) &&
(lastGpsSend == 0 || now - timeTravel >= getPref_position_broadcast_secs() * 1000)) {
bool requestReplies = currentGeneration != radioGeneration;
currentGeneration = radioGeneration;
DEBUG_MSG("Sending smart pos@%x:6 to mesh (wantReplies=%d)\n", node->position.pos_timestamp, requestReplies);
sendOurPosition(NODENUM_BROADCAST, requestReplies);
/* Update lastGpsSend to now. This means if the device is stationary, then
getPref_position_broadcast_secs will still apply.
*/
lastGpsSend = now;
}
}
}
return 5000; // to save power only wake for our callback occasionally

View File

@@ -13,6 +13,10 @@ class PositionPlugin : public ProtobufPlugin<Position>, private concurrency::OST
/// We limit our GPS broadcasts to a max rate
uint32_t lastGpsSend = 0;
// Store the latest good lat / long
uint32_t lastGpsLatitude = 0;
uint32_t lastGpsLongitude = 0;
/// We force a rebroadcast if the radio settings change
uint32_t currentGeneration = 0;

View File

@@ -151,6 +151,7 @@ ProcessMessage RangeTestPluginRadio::handleReceived(const MeshPacket &mp)
appendFile(mp);
}
/*
DEBUG_MSG("-----------------------------------------\n");
DEBUG_MSG("p.payload.bytes \"%s\"\n", p.payload.bytes);
DEBUG_MSG("p.payload.size %d\n", p.payload.size);
@@ -174,6 +175,7 @@ ProcessMessage RangeTestPluginRadio::handleReceived(const MeshPacket &mp)
DEBUG_MSG("gpsStatus->getHasLock() %d\n", gpsStatus->getHasLock());
DEBUG_MSG("gpsStatus->getDOP() %d\n", gpsStatus->getDOP());
DEBUG_MSG("-----------------------------------------\n");
*/
}
} else {

View File

@@ -5,11 +5,11 @@
#include "Router.h"
#include "configuration.h"
#include "mesh-pb-constants.h"
#include "mesh/generated/storeforward.pb.h"
#include "plugins/PluginDev.h"
#include <Arduino.h>
#include <map>
#include <iterator>
#include <map>
StoreForwardPlugin *storeForwardPlugin;
@@ -25,22 +25,22 @@ int32_t StoreForwardPlugin::runOnce()
if (this->busy) {
// Send out the message queue.
//DEBUG_MSG("--- --- --- In busy loop 1 %d\n", this->packetHistoryTXQueue_index);
// DEBUG_MSG("--- --- --- In busy loop 1 %d\n", this->packetHistoryTXQueue_index);
storeForwardPlugin->sendPayload(this->busyTo, this->packetHistoryTXQueue_index);
if (this->packetHistoryTXQueue_index == packetHistoryTXQueue_size) {
strcpy(this->routerMessage, "** S&F - Done");
storeForwardPlugin->sendMessage(this->busyTo, this->routerMessage);
//DEBUG_MSG("--- --- --- In busy loop - Done \n");
// DEBUG_MSG("--- --- --- In busy loop - Done \n");
this->packetHistoryTXQueue_index = 0;
this->busy = false;
} else {
this->packetHistoryTXQueue_index++;
}
}
// TODO: Dynamicly adjust the time this returns in the loop based on the size of the packets being actually transmitted.
// TODO: Dynamicly adjust the time this returns in the loop based on the size of the packets being actually
// transmitted.
return (this->packetTimeMax);
} else {
DEBUG_MSG("Store & Forward Plugin - Disabled (is_router = false)\n");
@@ -83,7 +83,8 @@ void StoreForwardPlugin::populatePSRAM()
: (((ESP.getFreePsram() / 3) * 2) / sizeof(PacketHistoryStruct)));
this->packetHistory = static_cast<PacketHistoryStruct *>(ps_calloc(numberOfPackets, sizeof(PacketHistoryStruct)));
this->packetHistoryTXQueue = static_cast<PacketHistoryStruct *>(ps_calloc(store_forward_plugin_replay_max_records, sizeof(PacketHistoryStruct)));
this->packetHistoryTXQueue =
static_cast<PacketHistoryStruct *>(ps_calloc(store_forward_plugin_replay_max_records, sizeof(PacketHistoryStruct)));
DEBUG_MSG("After PSRAM initilization:\n");
DEBUG_MSG(" Total heap: %d\n", ESP.getHeapSize());
@@ -107,7 +108,6 @@ void StoreForwardPlugin::historySend(uint32_t msAgo, uint32_t to)
{
uint32_t packetsSent = 0;
uint32_t queueSize = storeForwardPlugin->historyQueueCreate(msAgo, to);
@@ -124,9 +124,10 @@ void StoreForwardPlugin::historySend(uint32_t msAgo, uint32_t to)
}
}
uint32_t StoreForwardPlugin::historyQueueCreate(uint32_t msAgo, uint32_t to) {
//uint32_t packetHistoryTXQueueIndex = 0;
uint32_t StoreForwardPlugin::historyQueueCreate(uint32_t msAgo, uint32_t to)
{
// uint32_t packetHistoryTXQueueIndex = 0;
this->packetHistoryTXQueue_size = 0;
@@ -146,24 +147,19 @@ uint32_t StoreForwardPlugin::historyQueueCreate(uint32_t msAgo, uint32_t to) {
TODO: The condition (this->packetHistory[i].to & 0xffffffff) == to) is not tested since
I don't have an easy way to target a specific user. Will need to do this soon.
*/
if ((this->packetHistory[i].to & 0xffffffff) == 0xffffffff
||
((this->packetHistory[i].to & 0xffffffff) == to)
) {
if ((this->packetHistory[i].to & 0xffffffff) == 0xffffffff || ((this->packetHistory[i].to & 0xffffffff) == to)) {
this->packetHistoryTXQueue[this->packetHistoryTXQueue_size].time = this->packetHistory[i].time;
this->packetHistoryTXQueue[this->packetHistoryTXQueue_size].to = this->packetHistory[i].to;
this->packetHistoryTXQueue[this->packetHistoryTXQueue_size].from = this->packetHistory[i].from;
this->packetHistoryTXQueue[this->packetHistoryTXQueue_size].payload_size = this->packetHistory[i].payload_size;
memcpy(this->packetHistoryTXQueue[this->packetHistoryTXQueue_size].payload, this->packetHistory[i].payload, Constants_DATA_PAYLOAD_LEN);
memcpy(this->packetHistoryTXQueue[this->packetHistoryTXQueue_size].payload, this->packetHistory[i].payload,
Constants_DATA_PAYLOAD_LEN);
this->packetHistoryTXQueue_size++;
DEBUG_MSG("PacketHistoryStruct time=%d\n", this->packetHistory[i].time);
DEBUG_MSG("PacketHistoryStruct msg=%.*s\n", this->packetHistory[i].payload);
//DEBUG_MSG("PacketHistoryStruct msg=%.*s\n", this->packetHistoryTXQueue[packetHistoryTXQueueIndex].payload);
// DEBUG_MSG("PacketHistoryStruct msg=%.*s\n", this->packetHistoryTXQueue[packetHistoryTXQueueIndex].payload);
}
}
}
return this->packetHistoryTXQueue_size;
@@ -221,8 +217,9 @@ void StoreForwardPlugin::sendMessage(NodeNum dest, char *str)
p->decoded.payload.size = strlen(str); // You must specify how many bytes are in the reply
memcpy(p->decoded.payload.bytes, str, strlen(str));
service.sendToMesh(p);
// HardwareMessage_init_default
}
ProcessMessage StoreForwardPlugin::handleReceived(const MeshPacket &mp)
@@ -232,6 +229,12 @@ ProcessMessage StoreForwardPlugin::handleReceived(const MeshPacket &mp)
DEBUG_MSG("--- S&F Received something\n");
/*
StoreAndForwardMessage sfm = StoreAndForwardMessage_init_default;
switch (sfm.rr) {
}
*/
auto &p = mp.decoded;
// The router node should not be sending messages as a client.
@@ -250,14 +253,19 @@ ProcessMessage StoreForwardPlugin::handleReceived(const MeshPacket &mp)
} else {
storeForwardPlugin->historySend(1000 * 60, getFrom(&mp));
}
} else if ((p.payload.bytes[0] == 'S') && (p.payload.bytes[1] == 'F') && (p.payload.bytes[2] == 'm') && (p.payload.bytes[3] == 0x00)) {
strcpy(this->routerMessage, "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456");
} else if ((p.payload.bytes[0] == 'S') && (p.payload.bytes[1] == 'F') && (p.payload.bytes[2] == 'm') &&
(p.payload.bytes[3] == 0x00)) {
strcpy(this->routerMessage, "01234567890123456789012345678901234567890123456789012345678901234567890123456789"
"01234567890123456789012345678901234567890123456789012345678901234567890123456789"
"01234567890123456789012345678901234567890123456789012345678901234567890123456");
storeForwardPlugin->sendMessage(getFrom(&mp), this->routerMessage);
} else {
storeForwardPlugin->historyAdd(mp);
}
} else if (mp.decoded.portnum == PortNum_STORE_FORWARD_APP) {
} else {
DEBUG_MSG("Packet came from an unknown port %u\n", mp.decoded.portnum);
}
@@ -272,6 +280,66 @@ ProcessMessage StoreForwardPlugin::handleReceived(const MeshPacket &mp)
return ProcessMessage::CONTINUE; // Let others look at this message also if they want
}
ProcessMessage StoreForwardPlugin::handleReceivedProtobuf(const MeshPacket &mp, StoreAndForward *p)
{
if (!radioConfig.preferences.store_forward_plugin_enabled) {
// If this plugin is not enabled in any capacity, don't handle the packet, and allow other plugins to consume
return ProcessMessage::CONTINUE;
}
//auto sfp = *p;
//auto p = *p;
// Advance states as needed
switch (p->rr) {
case StoreAndForward_RequestResponse_CLIENT_ERROR:
// Do nothing
break;
case StoreAndForward_RequestResponse_CLIENT_HISTORY:
// Do nothing
break;
case StoreAndForward_RequestResponse_CLIENT_PING:
// Do nothing
break;
case StoreAndForward_RequestResponse_CLIENT_PONG:
// Do nothing
break;
case StoreAndForward_RequestResponse_CLIENT_STATS:
// Do nothing
break;
case StoreAndForward_RequestResponse_ROUTER_BUSY:
// Do nothing
break;
case StoreAndForward_RequestResponse_ROUTER_ERROR:
// Do nothing
break;
case StoreAndForward_RequestResponse_ROUTER_HEARTBEAT:
// Do nothing
break;
case StoreAndForward_RequestResponse_ROUTER_PING:
// Do nothing
break;
case StoreAndForward_RequestResponse_ROUTER_PONG:
// Do nothing
break;
default:
assert(0); // unexpected state - FIXME, make an error code and reboot
}
return ProcessMessage::CONTINUE; // Let others look at this message also if they want
}
StoreForwardPlugin::StoreForwardPlugin()
: SinglePortPlugin("StoreForwardPlugin", PortNum_TEXT_MESSAGE_APP), concurrency::OSThread("StoreForwardPlugin")
{
@@ -304,12 +372,6 @@ StoreForwardPlugin::StoreForwardPlugin()
// Popupate PSRAM with our data structures.
this->populatePSRAM();
// Calculate the packet time.
// this->packetTimeMax = RadioLibInterface::instance->getPacketTime(Constants_DATA_PAYLOAD_LEN);
//RadioLibInterface::instance->getPacketTime(Constants_DATA_PAYLOAD_LEN);
//RadioLibInterface::instance->getPacketTime(Constants_DATA_PAYLOAD_LEN);
//RadioInterface::getPacketTime(500)l
this->packetTimeMax = 2000;
} else {

View File

@@ -2,6 +2,8 @@
#include "SinglePortPlugin.h"
#include "concurrency/OSThread.h"
#include "mesh/generated/storeforward.pb.h"
#include "configuration.h"
#include <Arduino.h>
#include <functional>
@@ -17,7 +19,7 @@ struct PacketHistoryStruct {
class StoreForwardPlugin : public SinglePortPlugin, private concurrency::OSThread
{
//bool firstTime = 1;
// bool firstTime = 1;
bool busy = 0;
uint32_t busyTo;
char routerMessage[80];
@@ -30,9 +32,8 @@ class StoreForwardPlugin : public SinglePortPlugin, private concurrency::OSThrea
PacketHistoryStruct *packetHistoryTXQueue;
uint32_t packetHistoryTXQueue_size;
uint32_t packetHistoryTXQueue_index = 0;
uint32_t packetTimeMax = 0;
uint32_t packetTimeMax = 0;
public:
StoreForwardPlugin();
@@ -53,6 +54,9 @@ class StoreForwardPlugin : public SinglePortPlugin, private concurrency::OSThrea
void sendPayload(NodeNum dest = NODENUM_BROADCAST, uint32_t packetHistory_index = 0);
void sendMessage(NodeNum dest, char *str);
virtual MeshPacket *allocReply();
/*
Override the wantPortnum method.
*/
virtual bool wantPortnum(PortNum p) { return true; };
private:
@@ -67,6 +71,8 @@ class StoreForwardPlugin : public SinglePortPlugin, private concurrency::OSThrea
it
*/
virtual ProcessMessage handleReceived(const MeshPacket &mp);
virtual ProcessMessage handleReceivedProtobuf(const MeshPacket &mp, StoreAndForward *p);
};
extern StoreForwardPlugin *storeForwardPlugin;

View File

@@ -1,4 +1,4 @@
[VERSION]
major = 1
minor = 2
build = 47
build = 48