Merge pull request #2153 from meshtastic/develop

Develop to master
This commit is contained in:
Ben Meadors
2023-01-16 13:00:15 -06:00
committed by GitHub
co-authored by GitHub
21 changed files with 203 additions and 64 deletions
+6 -6
View File
@@ -80,7 +80,7 @@ void listDir(const char * dirname, uint8_t levels, boolean del = false)
listDir(file.path(), levels -1, del); listDir(file.path(), levels -1, del);
if(del) { if(del) {
LOG_DEBUG("Removing %s\n", file.path()); LOG_DEBUG("Removing %s\n", file.path());
strcpy(buffer, file.path()); strncpy(buffer, file.path(), sizeof(buffer));
file.close(); file.close();
FSCom.rmdir(buffer); FSCom.rmdir(buffer);
} else { } else {
@@ -90,7 +90,7 @@ void listDir(const char * dirname, uint8_t levels, boolean del = false)
listDir(file.name(), levels -1, del); listDir(file.name(), levels -1, del);
if(del) { if(del) {
LOG_DEBUG("Removing %s\n", file.name()); LOG_DEBUG("Removing %s\n", file.name());
strcpy(buffer, file.name()); strncpy(buffer, file.name(), sizeof(buffer));
file.close(); file.close();
FSCom.rmdir(buffer); FSCom.rmdir(buffer);
} else { } else {
@@ -105,7 +105,7 @@ void listDir(const char * dirname, uint8_t levels, boolean del = false)
#ifdef ARCH_ESP32 #ifdef ARCH_ESP32
if(del) { if(del) {
LOG_DEBUG("Deleting %s\n", file.path()); LOG_DEBUG("Deleting %s\n", file.path());
strcpy(buffer, file.path()); strncpy(buffer, file.path(), sizeof(buffer));
file.close(); file.close();
FSCom.remove(buffer); FSCom.remove(buffer);
} else { } else {
@@ -115,7 +115,7 @@ void listDir(const char * dirname, uint8_t levels, boolean del = false)
#elif (defined(ARCH_RP2040) || defined(ARCH_PORTDUINO)) #elif (defined(ARCH_RP2040) || defined(ARCH_PORTDUINO))
if(del) { if(del) {
LOG_DEBUG("Deleting %s\n", file.name()); LOG_DEBUG("Deleting %s\n", file.name());
strcpy(buffer, file.name()); strncpy(buffer, file.name(), sizeof(buffer));
file.close(); file.close();
FSCom.remove(buffer); FSCom.remove(buffer);
} else { } else {
@@ -132,7 +132,7 @@ void listDir(const char * dirname, uint8_t levels, boolean del = false)
#ifdef ARCH_ESP32 #ifdef ARCH_ESP32
if(del) { if(del) {
LOG_DEBUG("Removing %s\n", root.path()); LOG_DEBUG("Removing %s\n", root.path());
strcpy(buffer, root.path()); strncpy(buffer, root.path(), sizeof(buffer));
root.close(); root.close();
FSCom.rmdir(buffer); FSCom.rmdir(buffer);
} else { } else {
@@ -141,7 +141,7 @@ void listDir(const char * dirname, uint8_t levels, boolean del = false)
#elif (defined(ARCH_RP2040) || defined(ARCH_PORTDUINO)) #elif (defined(ARCH_RP2040) || defined(ARCH_PORTDUINO))
if(del) { if(del) {
LOG_DEBUG("Removing %s\n", root.name()); LOG_DEBUG("Removing %s\n", root.name());
strcpy(buffer, root.name()); strncpy(buffer, root.name(), sizeof(buffer));
root.close(); root.close();
FSCom.rmdir(buffer); FSCom.rmdir(buffer);
} else { } else {
+1 -1
View File
@@ -623,7 +623,7 @@ GnssModel_t GPS::probe()
//tips: extensionNo field is 0 on some 6M GNSS modules //tips: extensionNo field is 0 on some 6M GNSS modules
for (int i = 0; i < info.extensionNo; ++i) { for (int i = 0; i < info.extensionNo; ++i) {
if (!strncmp(info.extension[i], "OD=", 3)) { if (!strncmp(info.extension[i], "OD=", 3)) {
strcpy((char *)buffer, &(info.extension[i][3])); strncpy((char *)buffer, &(info.extension[i][3]), sizeof(buffer));
LOG_DEBUG("GetModel:%s\n",(char *)buffer); LOG_DEBUG("GetModel:%s\n",(char *)buffer);
} }
} }
+6 -6
View File
@@ -16,10 +16,10 @@
* ------------------------------------------- * -------------------------------------------
*/ */
uint32_t printWPL(char *buf, const Position &pos, const char *name) uint32_t printWPL(char *buf, size_t bufsz, const Position &pos, const char *name)
{ {
GeoCoord geoCoord(pos.latitude_i,pos.longitude_i,pos.altitude); GeoCoord geoCoord(pos.latitude_i,pos.longitude_i,pos.altitude);
uint32_t len = sprintf(buf, "$GNWPL,%02d%07.4f,%c,%03d%07.4f,%c,%s", uint32_t len = snprintf(buf, bufsz, "$GNWPL,%02d%07.4f,%c,%03d%07.4f,%c,%s",
geoCoord.getDMSLatDeg(), geoCoord.getDMSLatDeg(),
(abs(geoCoord.getLatitude()) - geoCoord.getDMSLatDeg() * 1e+7) * 6e-6, (abs(geoCoord.getLatitude()) - geoCoord.getDMSLatDeg() * 1e+7) * 6e-6,
geoCoord.getDMSLatCP(), geoCoord.getDMSLatCP(),
@@ -31,7 +31,7 @@ uint32_t printWPL(char *buf, const Position &pos, const char *name)
for (uint32_t i = 1; i < len; i++) { for (uint32_t i = 1; i < len; i++) {
chk ^= buf[i]; chk ^= buf[i];
} }
len += sprintf(buf + len, "*%02X\r\n", chk); len += snprintf(buf + len, bufsz - len, "*%02X\r\n", chk);
return len; return len;
} }
@@ -59,10 +59,10 @@ uint32_t printWPL(char *buf, const Position &pos, const char *name)
* ------------------------------------------- * -------------------------------------------
*/ */
uint32_t printGGA(char *buf, const Position &pos) uint32_t printGGA(char *buf, size_t bufsz, const Position &pos)
{ {
GeoCoord geoCoord(pos.latitude_i,pos.longitude_i,pos.altitude); GeoCoord geoCoord(pos.latitude_i,pos.longitude_i,pos.altitude);
uint32_t len = sprintf(buf, "$GNGGA,%06u.%03u,%02d%07.4f,%c,%03d%07.4f,%c,%u,%02u,%04u,%04d,%c,%04d,%c,%d,%04d", uint32_t len = snprintf(buf, bufsz, "$GNGGA,%06u.%03u,%02d%07.4f,%c,%03d%07.4f,%c,%u,%02u,%04u,%04d,%c,%04d,%c,%d,%04d",
pos.time / 1000, pos.time / 1000,
pos.time % 1000, pos.time % 1000,
geoCoord.getDMSLatDeg(), geoCoord.getDMSLatDeg(),
@@ -85,6 +85,6 @@ uint32_t printGGA(char *buf, const Position &pos)
for (uint32_t i = 1; i < len; i++) { for (uint32_t i = 1; i < len; i++) {
chk ^= buf[i]; chk ^= buf[i];
} }
len += sprintf(buf + len, "*%02X\r\n", chk); len += snprintf(buf + len, bufsz - len, "*%02X\r\n", chk);
return len; return len;
} }
+2 -2
View File
@@ -3,5 +3,5 @@
#include <Arduino.h> #include <Arduino.h>
#include "main.h" #include "main.h"
uint32_t printWPL(char *buf, const Position &pos, const char *name); uint32_t printWPL(char *buf, size_t bufsz, const Position &pos, const char *name);
uint32_t printGGA(char *buf, const Position &pos); uint32_t printGGA(char *buf, size_t bufsz, const Position &pos);
+12 -12
View File
@@ -470,7 +470,7 @@ static void drawBattery(OLEDDisplay *display, int16_t x, int16_t y, uint8_t *img
static void drawNodes(OLEDDisplay *display, int16_t x, int16_t y, NodeStatus *nodeStatus) static void drawNodes(OLEDDisplay *display, int16_t x, int16_t y, NodeStatus *nodeStatus)
{ {
char usersString[20]; char usersString[20];
sprintf(usersString, "%d/%d", nodeStatus->getNumOnline(), nodeStatus->getNumTotal()); snprintf(usersString, sizeof(usersString), "%d/%d", nodeStatus->getNumOnline(), nodeStatus->getNumTotal());
#if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS) #if defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7735_CS)
display->drawFastImage(x, y + 3, 8, 8, imgUser); display->drawFastImage(x, y + 3, 8, 8, imgUser);
#else #else
@@ -521,7 +521,7 @@ static void drawGPS(OLEDDisplay *display, int16_t x, int16_t y, const GPSStatus
display->drawFastImage(x + 24, y, 8, 8, imgSatellite); display->drawFastImage(x + 24, y, 8, 8, imgSatellite);
// Draw the number of satellites // Draw the number of satellites
sprintf(satsString, "%u", gps->getNumSatellites()); snprintf(satsString, sizeof(satsString), "%u", gps->getNumSatellites());
display->drawString(x + 34, y - 2, satsString); display->drawString(x + 34, y - 2, satsString);
if(config.display.heading_bold) if(config.display.heading_bold)
display->drawString(x + 35, y - 2, satsString); display->drawString(x + 35, y - 2, satsString);
@@ -582,21 +582,21 @@ static void drawGPScoordinates(OLEDDisplay *display, int16_t x, int16_t y, const
if (gpsFormat != Config_DisplayConfig_GpsCoordinateFormat_DMS) { if (gpsFormat != Config_DisplayConfig_GpsCoordinateFormat_DMS) {
char coordinateLine[22]; char coordinateLine[22];
if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_DEC) { // Decimal Degrees if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_DEC) { // Decimal Degrees
sprintf(coordinateLine, "%f %f", geoCoord.getLatitude() * 1e-7, geoCoord.getLongitude() * 1e-7); snprintf(coordinateLine, sizeof(coordinateLine), "%f %f", geoCoord.getLatitude() * 1e-7, geoCoord.getLongitude() * 1e-7);
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_UTM) { // Universal Transverse Mercator } else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_UTM) { // Universal Transverse Mercator
sprintf(coordinateLine, "%2i%1c %06u %07u", geoCoord.getUTMZone(), geoCoord.getUTMBand(), snprintf(coordinateLine, sizeof(coordinateLine), "%2i%1c %06u %07u", geoCoord.getUTMZone(), geoCoord.getUTMBand(),
geoCoord.getUTMEasting(), geoCoord.getUTMNorthing()); geoCoord.getUTMEasting(), geoCoord.getUTMNorthing());
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_MGRS) { // Military Grid Reference System } else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_MGRS) { // Military Grid Reference System
sprintf(coordinateLine, "%2i%1c %1c%1c %05u %05u", geoCoord.getMGRSZone(), geoCoord.getMGRSBand(), snprintf(coordinateLine, sizeof(coordinateLine), "%2i%1c %1c%1c %05u %05u", geoCoord.getMGRSZone(), geoCoord.getMGRSBand(),
geoCoord.getMGRSEast100k(), geoCoord.getMGRSNorth100k(), geoCoord.getMGRSEasting(), geoCoord.getMGRSEast100k(), geoCoord.getMGRSNorth100k(), geoCoord.getMGRSEasting(),
geoCoord.getMGRSNorthing()); geoCoord.getMGRSNorthing());
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_OLC) { // Open Location Code } else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_OLC) { // Open Location Code
geoCoord.getOLCCode(coordinateLine); geoCoord.getOLCCode(coordinateLine);
} else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_OSGR) { // Ordnance Survey Grid Reference } else if (gpsFormat == Config_DisplayConfig_GpsCoordinateFormat_OSGR) { // Ordnance Survey Grid Reference
if (geoCoord.getOSGRE100k() == 'I' || geoCoord.getOSGRN100k() == 'I') // OSGR is only valid around the UK region if (geoCoord.getOSGRE100k() == 'I' || geoCoord.getOSGRN100k() == 'I') // OSGR is only valid around the UK region
sprintf(coordinateLine, "%s", "Out of Boundary"); snprintf(coordinateLine, sizeof(coordinateLine), "%s", "Out of Boundary");
else else
sprintf(coordinateLine, "%1c%1c %05u %05u", geoCoord.getOSGRE100k(), geoCoord.getOSGRN100k(), snprintf(coordinateLine, sizeof(coordinateLine), "%1c%1c %05u %05u", geoCoord.getOSGRE100k(), geoCoord.getOSGRN100k(),
geoCoord.getOSGREasting(), geoCoord.getOSGRNorthing()); geoCoord.getOSGREasting(), geoCoord.getOSGRNorthing());
} }
@@ -614,9 +614,9 @@ static void drawGPScoordinates(OLEDDisplay *display, int16_t x, int16_t y, const
} else { } else {
char latLine[22]; char latLine[22];
char lonLine[22]; char lonLine[22];
sprintf(latLine, "%2i° %2i' %2u\" %1c", geoCoord.getDMSLatDeg(), geoCoord.getDMSLatMin(), geoCoord.getDMSLatSec(), snprintf(latLine, sizeof(latLine), "%2i° %2i' %2u\" %1c", geoCoord.getDMSLatDeg(), geoCoord.getDMSLatMin(), geoCoord.getDMSLatSec(),
geoCoord.getDMSLatCP()); geoCoord.getDMSLatCP());
sprintf(lonLine, "%3i° %2i' %2u\" %1c", geoCoord.getDMSLonDeg(), geoCoord.getDMSLonMin(), geoCoord.getDMSLonSec(), snprintf(lonLine, sizeof(lonLine), "%3i° %2i' %2u\" %1c", geoCoord.getDMSLonDeg(), geoCoord.getDMSLonMin(), geoCoord.getDMSLonSec(),
geoCoord.getDMSLonCP()); geoCoord.getDMSLonCP());
display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth(latLine))) / 2, y - FONT_HEIGHT_SMALL * 1, latLine); display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth(latLine))) / 2, y - FONT_HEIGHT_SMALL * 1, latLine);
display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth(lonLine))) / 2, y, lonLine); display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth(lonLine))) / 2, y, lonLine);
@@ -831,7 +831,7 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_
} }
static char distStr[20]; static char distStr[20];
strcpy(distStr, "? km"); // might not have location data strncpy(distStr, "? km", sizeof(distStr)); // might not have location data
NodeInfo *ourNode = nodeDB.getNode(nodeDB.getNodeNum()); NodeInfo *ourNode = nodeDB.getNode(nodeDB.getNodeNum());
const char *fields[] = {username, distStr, signalStr, lastStr, NULL}; const char *fields[] = {username, distStr, signalStr, lastStr, NULL};
int16_t compassX = 0, compassY = 0; int16_t compassX = 0, compassY = 0;
@@ -1010,7 +1010,7 @@ void Screen::setup()
// Get our hardware ID // Get our hardware ID
uint8_t dmac[6]; uint8_t dmac[6];
getMacAddr(dmac); getMacAddr(dmac);
sprintf(ourId, "%02x%02x", dmac[4], dmac[5]); snprintf(ourId, sizeof(ourId), "%02x%02x", dmac[4], dmac[5]);
// Turn on the display. // Turn on the display.
handleSetOn(true); handleSetOn(true);
@@ -1738,7 +1738,7 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat
// Display Channel Utilization // Display Channel Utilization
char chUtil[13]; char chUtil[13];
sprintf(chUtil, "ChUtil %2.0f%%", airTime->channelUtilizationPercent()); snprintf(chUtil, sizeof(chUtil), "ChUtil %2.0f%%", airTime->channelUtilizationPercent());
display->drawString(x + SCREEN_WIDTH - display->getStringWidth(chUtil), y + FONT_HEIGHT_SMALL * 1, chUtil); display->drawString(x + SCREEN_WIDTH - display->getStringWidth(chUtil), y + FONT_HEIGHT_SMALL * 1, chUtil);
if (config.position.gps_enabled) { if (config.position.gps_enabled) {
// Line 3 // Line 3
+3 -3
View File
@@ -110,12 +110,12 @@ const char *getDeviceName()
// Meshtastic_ab3c or Shortname_abcd // Meshtastic_ab3c or Shortname_abcd
static char name[20]; static char name[20];
sprintf(name, "%02x%02x", dmac[4], dmac[5]); snprintf(name, sizeof(name), "%02x%02x", dmac[4], dmac[5]);
// if the shortname exists and is NOT the new default of ab3c, use it for BLE name. // if the shortname exists and is NOT the new default of ab3c, use it for BLE name.
if ((owner.short_name != NULL) && (strcmp(owner.short_name, name) != 0)) { if ((owner.short_name != NULL) && (strcmp(owner.short_name, name) != 0)) {
sprintf(name, "%s_%02x%02x", owner.short_name, dmac[4], dmac[5]); snprintf(name, sizeof(name), "%s_%02x%02x", owner.short_name, dmac[4], dmac[5]);
} else { } else {
sprintf(name, "Meshtastic_%02x%02x", dmac[4], dmac[5]); snprintf(name, sizeof(name), "Meshtastic_%02x%02x", dmac[4], dmac[5]);
} }
return name; return name;
} }
+1 -1
View File
@@ -84,7 +84,7 @@ void Channels::initDefaultChannel(ChannelIndex chIndex)
uint8_t defaultpskIndex = 1; uint8_t defaultpskIndex = 1;
channelSettings.psk.bytes[0] = defaultpskIndex; channelSettings.psk.bytes[0] = defaultpskIndex;
channelSettings.psk.size = 1; channelSettings.psk.size = 1;
strcpy(channelSettings.name, ""); strncpy(channelSettings.name, "", sizeof(channelSettings.name));
ch.has_settings = true; ch.has_settings = true;
ch.role = Channel_Role_PRIMARY; ch.role = Channel_Role_PRIMARY;
+3 -3
View File
@@ -265,10 +265,10 @@ void NodeDB::installDefaultDeviceState()
// Set default owner name // Set default owner name
pickNewNodeNum(); // based on macaddr now pickNewNodeNum(); // based on macaddr now
sprintf(owner.long_name, "Meshtastic %02x%02x", ourMacAddr[4], ourMacAddr[5]); snprintf(owner.long_name, sizeof(owner.long_name), "Meshtastic %02x%02x", ourMacAddr[4], ourMacAddr[5]);
sprintf(owner.short_name, "%02x%02x", ourMacAddr[4], ourMacAddr[5]); snprintf(owner.short_name, sizeof(owner.short_name), "%02x%02x", ourMacAddr[4], ourMacAddr[5]);
sprintf(owner.id, "!%08x", getNodeNum()); // Default node ID now based on nodenum snprintf(owner.id, sizeof(owner.id), "!%08x", getNodeNum()); // Default node ID now based on nodenum
memcpy(owner.macaddr, ourMacAddr, sizeof(owner.macaddr)); memcpy(owner.macaddr, ourMacAddr, sizeof(owner.macaddr));
} }
+12
View File
@@ -94,6 +94,18 @@ const RegionInfo regions[] = {
https://lora-alliance.org/wp-content/uploads/2020/11/lorawan_regional_parameters_v1.0.3reva_0.pdf https://lora-alliance.org/wp-content/uploads/2020/11/lorawan_regional_parameters_v1.0.3reva_0.pdf
*/ */
RDEF(TH, 920.0f, 925.0f, 100, 0, 16, true, false, false), RDEF(TH, 920.0f, 925.0f, 100, 0, 16, true, false, false),
/*
433,05-434,7 Mhz 10 mW
https://nkrzi.gov.ua/images/upload/256/5810/PDF_UUZ_19_01_2016.pdf
*/
RDEF(UA_433, 433.0f, 434.7f, 10, 0, 10, true, false, false),
/*
868,0-868,6 Mhz 25 mW
https://nkrzi.gov.ua/images/upload/256/5810/PDF_UUZ_19_01_2016.pdf
*/
RDEF(UA_868, 868.0f, 868.6f, 1, 0, 14, true, false, false),
/* /*
2.4 GHZ WLAN Band equivalent. Only for SX128x chips. 2.4 GHZ WLAN Band equivalent. Only for SX128x chips.
+7 -3
View File
@@ -147,7 +147,11 @@ typedef enum _Config_LoRaConfig_RegionCode {
/* Thailand */ /* Thailand */
Config_LoRaConfig_RegionCode_TH = 12, Config_LoRaConfig_RegionCode_TH = 12,
/* WLAN Band */ /* WLAN Band */
Config_LoRaConfig_RegionCode_LORA_24 = 13 Config_LoRaConfig_RegionCode_LORA_24 = 13,
/* Ukraine 433mhz */
Config_LoRaConfig_RegionCode_UA_433 = 14,
/* Ukraine 868mhz */
Config_LoRaConfig_RegionCode_UA_868 = 15
} Config_LoRaConfig_RegionCode; } Config_LoRaConfig_RegionCode;
/* Standard predefined channel settings /* Standard predefined channel settings
@@ -437,8 +441,8 @@ extern "C" {
#define _Config_DisplayConfig_DisplayMode_ARRAYSIZE ((Config_DisplayConfig_DisplayMode)(Config_DisplayConfig_DisplayMode_COLOR+1)) #define _Config_DisplayConfig_DisplayMode_ARRAYSIZE ((Config_DisplayConfig_DisplayMode)(Config_DisplayConfig_DisplayMode_COLOR+1))
#define _Config_LoRaConfig_RegionCode_MIN Config_LoRaConfig_RegionCode_UNSET #define _Config_LoRaConfig_RegionCode_MIN Config_LoRaConfig_RegionCode_UNSET
#define _Config_LoRaConfig_RegionCode_MAX Config_LoRaConfig_RegionCode_LORA_24 #define _Config_LoRaConfig_RegionCode_MAX Config_LoRaConfig_RegionCode_UA_868
#define _Config_LoRaConfig_RegionCode_ARRAYSIZE ((Config_LoRaConfig_RegionCode)(Config_LoRaConfig_RegionCode_LORA_24+1)) #define _Config_LoRaConfig_RegionCode_ARRAYSIZE ((Config_LoRaConfig_RegionCode)(Config_LoRaConfig_RegionCode_UA_868+1))
#define _Config_LoRaConfig_ModemPreset_MIN Config_LoRaConfig_ModemPreset_LONG_FAST #define _Config_LoRaConfig_ModemPreset_MIN Config_LoRaConfig_ModemPreset_LONG_FAST
#define _Config_LoRaConfig_ModemPreset_MAX Config_LoRaConfig_ModemPreset_SHORT_FAST #define _Config_LoRaConfig_ModemPreset_MAX Config_LoRaConfig_ModemPreset_SHORT_FAST
+18 -7
View File
@@ -9,6 +9,7 @@
#include "module_config.pb.h" #include "module_config.pb.h"
#include "portnums.pb.h" #include "portnums.pb.h"
#include "telemetry.pb.h" #include "telemetry.pb.h"
#include "xmodem.pb.h"
#if PB_PROTO_HEADER_VERSION != 40 #if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator. #error Regenerate this file with the current version of nanopb generator.
@@ -437,8 +438,9 @@ typedef struct _Waypoint {
int32_t longitude_i; int32_t longitude_i;
/* Time the waypoint is to expire (epoch) */ /* Time the waypoint is to expire (epoch) */
uint32_t expire; uint32_t expire;
/* If true, only allow the original sender to update the waypoint. */ /* If greater than zero, treat the value as a nodenum only allowing them to update the waypoint.
bool locked; If zero, the waypoint is open to be edited by any member of the mesh. */
uint32_t locked_to;
/* Name of the waypoint - max 30 chars */ /* Name of the waypoint - max 30 chars */
char name[30]; char name[30];
/* Description of the waypoint - max 100 chars */ /* Description of the waypoint - max 100 chars */
@@ -673,6 +675,8 @@ typedef struct _FromRadio {
Channel channel; Channel channel;
/* Queue status info */ /* Queue status info */
QueueStatus queueStatus; QueueStatus queueStatus;
/* File Transfer Chunk */
XModem xmodemPacket;
}; };
} FromRadio; } FromRadio;
@@ -696,6 +700,7 @@ typedef struct _ToRadio {
This is useful for serial links where there is no hardware/protocol based notification that the client has dropped the link. This is useful for serial links where there is no hardware/protocol based notification that the client has dropped the link.
(Sending this message is optional for clients) */ (Sending this message is optional for clients) */
bool disconnect; bool disconnect;
XModem xmodemPacket;
}; };
} ToRadio; } ToRadio;
@@ -850,7 +855,7 @@ extern "C" {
#define Waypoint_latitude_i_tag 2 #define Waypoint_latitude_i_tag 2
#define Waypoint_longitude_i_tag 3 #define Waypoint_longitude_i_tag 3
#define Waypoint_expire_tag 4 #define Waypoint_expire_tag 4
#define Waypoint_locked_tag 5 #define Waypoint_locked_to_tag 5
#define Waypoint_name_tag 6 #define Waypoint_name_tag 6
#define Waypoint_description_tag 7 #define Waypoint_description_tag 7
#define Waypoint_icon_tag 8 #define Waypoint_icon_tag 8
@@ -908,9 +913,11 @@ extern "C" {
#define FromRadio_moduleConfig_tag 9 #define FromRadio_moduleConfig_tag 9
#define FromRadio_channel_tag 10 #define FromRadio_channel_tag 10
#define FromRadio_queueStatus_tag 11 #define FromRadio_queueStatus_tag 11
#define FromRadio_xmodemPacket_tag 12
#define ToRadio_packet_tag 1 #define ToRadio_packet_tag 1
#define ToRadio_want_config_id_tag 3 #define ToRadio_want_config_id_tag 3
#define ToRadio_disconnect_tag 4 #define ToRadio_disconnect_tag 4
#define ToRadio_xmodemPacket_tag 5
#define Compressed_portnum_tag 1 #define Compressed_portnum_tag 1
#define Compressed_data_tag 2 #define Compressed_data_tag 2
@@ -982,7 +989,7 @@ X(a, STATIC, SINGULAR, UINT32, id, 1) \
X(a, STATIC, SINGULAR, SFIXED32, latitude_i, 2) \ X(a, STATIC, SINGULAR, SFIXED32, latitude_i, 2) \
X(a, STATIC, SINGULAR, SFIXED32, longitude_i, 3) \ X(a, STATIC, SINGULAR, SFIXED32, longitude_i, 3) \
X(a, STATIC, SINGULAR, UINT32, expire, 4) \ X(a, STATIC, SINGULAR, UINT32, expire, 4) \
X(a, STATIC, SINGULAR, BOOL, locked, 5) \ X(a, STATIC, SINGULAR, UINT32, locked_to, 5) \
X(a, STATIC, SINGULAR, STRING, name, 6) \ X(a, STATIC, SINGULAR, STRING, name, 6) \
X(a, STATIC, SINGULAR, STRING, description, 7) \ X(a, STATIC, SINGULAR, STRING, description, 7) \
X(a, STATIC, SINGULAR, FIXED32, icon, 8) X(a, STATIC, SINGULAR, FIXED32, icon, 8)
@@ -1067,7 +1074,8 @@ X(a, STATIC, ONEOF, UINT32, (payload_variant,config_complete_id,config_co
X(a, STATIC, ONEOF, BOOL, (payload_variant,rebooted,rebooted), 8) \ X(a, STATIC, ONEOF, BOOL, (payload_variant,rebooted,rebooted), 8) \
X(a, STATIC, ONEOF, MESSAGE, (payload_variant,moduleConfig,moduleConfig), 9) \ X(a, STATIC, ONEOF, MESSAGE, (payload_variant,moduleConfig,moduleConfig), 9) \
X(a, STATIC, ONEOF, MESSAGE, (payload_variant,channel,channel), 10) \ X(a, STATIC, ONEOF, MESSAGE, (payload_variant,channel,channel), 10) \
X(a, STATIC, ONEOF, MESSAGE, (payload_variant,queueStatus,queueStatus), 11) X(a, STATIC, ONEOF, MESSAGE, (payload_variant,queueStatus,queueStatus), 11) \
X(a, STATIC, ONEOF, MESSAGE, (payload_variant,xmodemPacket,xmodemPacket), 12)
#define FromRadio_CALLBACK NULL #define FromRadio_CALLBACK NULL
#define FromRadio_DEFAULT NULL #define FromRadio_DEFAULT NULL
#define FromRadio_payload_variant_packet_MSGTYPE MeshPacket #define FromRadio_payload_variant_packet_MSGTYPE MeshPacket
@@ -1078,14 +1086,17 @@ X(a, STATIC, ONEOF, MESSAGE, (payload_variant,queueStatus,queueStatus), 1
#define FromRadio_payload_variant_moduleConfig_MSGTYPE ModuleConfig #define FromRadio_payload_variant_moduleConfig_MSGTYPE ModuleConfig
#define FromRadio_payload_variant_channel_MSGTYPE Channel #define FromRadio_payload_variant_channel_MSGTYPE Channel
#define FromRadio_payload_variant_queueStatus_MSGTYPE QueueStatus #define FromRadio_payload_variant_queueStatus_MSGTYPE QueueStatus
#define FromRadio_payload_variant_xmodemPacket_MSGTYPE XModem
#define ToRadio_FIELDLIST(X, a) \ #define ToRadio_FIELDLIST(X, a) \
X(a, STATIC, ONEOF, MESSAGE, (payload_variant,packet,packet), 1) \ X(a, STATIC, ONEOF, MESSAGE, (payload_variant,packet,packet), 1) \
X(a, STATIC, ONEOF, UINT32, (payload_variant,want_config_id,want_config_id), 3) \ X(a, STATIC, ONEOF, UINT32, (payload_variant,want_config_id,want_config_id), 3) \
X(a, STATIC, ONEOF, BOOL, (payload_variant,disconnect,disconnect), 4) X(a, STATIC, ONEOF, BOOL, (payload_variant,disconnect,disconnect), 4) \
X(a, STATIC, ONEOF, MESSAGE, (payload_variant,xmodemPacket,xmodemPacket), 5)
#define ToRadio_CALLBACK NULL #define ToRadio_CALLBACK NULL
#define ToRadio_DEFAULT NULL #define ToRadio_DEFAULT NULL
#define ToRadio_payload_variant_packet_MSGTYPE MeshPacket #define ToRadio_payload_variant_packet_MSGTYPE MeshPacket
#define ToRadio_payload_variant_xmodemPacket_MSGTYPE XModem
#define Compressed_FIELDLIST(X, a) \ #define Compressed_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UENUM, portnum, 1) \ X(a, STATIC, SINGULAR, UENUM, portnum, 1) \
@@ -1138,7 +1149,7 @@ extern const pb_msgdesc_t Compressed_msg;
#define Routing_size 42 #define Routing_size 42
#define ToRadio_size 324 #define ToRadio_size 324
#define User_size 77 #define User_size 77
#define Waypoint_size 161 #define Waypoint_size 165
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
+13
View File
@@ -0,0 +1,13 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.7 */
#include "xmodem.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator.
#endif
PB_BIND(XModem, XModem, AUTO)
+77
View File
@@ -0,0 +1,77 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.7 */
#ifndef PB_XMODEM_PB_H_INCLUDED
#define PB_XMODEM_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 _XModem_Control {
XModem_Control_NUL = 0,
XModem_Control_SOH = 1,
XModem_Control_STX = 2,
XModem_Control_EOT = 4,
XModem_Control_ACK = 6,
XModem_Control_NAK = 21,
XModem_Control_CAN = 24,
XModem_Control_CTRLZ = 26
} XModem_Control;
/* Struct definitions */
typedef PB_BYTES_ARRAY_T(128) XModem_buffer_t;
typedef struct _XModem {
XModem_Control control;
uint16_t seq;
uint16_t crc16;
XModem_buffer_t buffer;
} XModem;
#ifdef __cplusplus
extern "C" {
#endif
/* Helper constants for enums */
#define _XModem_Control_MIN XModem_Control_NUL
#define _XModem_Control_MAX XModem_Control_CTRLZ
#define _XModem_Control_ARRAYSIZE ((XModem_Control)(XModem_Control_CTRLZ+1))
#define XModem_control_ENUMTYPE XModem_Control
/* Initializer values for message structs */
#define XModem_init_default {_XModem_Control_MIN, 0, 0, {0, {0}}}
#define XModem_init_zero {_XModem_Control_MIN, 0, 0, {0, {0}}}
/* Field tags (for use in manual encoding/decoding) */
#define XModem_control_tag 1
#define XModem_seq_tag 2
#define XModem_crc16_tag 3
#define XModem_buffer_tag 4
/* Struct field encoding specification for nanopb */
#define XModem_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UENUM, control, 1) \
X(a, STATIC, SINGULAR, UINT32, seq, 2) \
X(a, STATIC, SINGULAR, UINT32, crc16, 3) \
X(a, STATIC, SINGULAR, BYTES, buffer, 4)
#define XModem_CALLBACK NULL
#define XModem_DEFAULT NULL
extern const pb_msgdesc_t XModem_msg;
/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
#define XModem_fields &XModem_msg
/* Maximum encoded size of messages (where known) */
#define XModem_size 141
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif
+1 -1
View File
@@ -164,7 +164,7 @@ bool initWifi()
if (*wifiName) { if (*wifiName) {
uint8_t dmac[6]; uint8_t dmac[6];
getMacAddr(dmac); getMacAddr(dmac);
sprintf(ourHost, "Meshtastic-%02x%02x", dmac[4], dmac[5]); snprintf(ourHost, sizeof(ourHost), "Meshtastic-%02x%02x", dmac[4], dmac[5]);
WiFi.mode(WIFI_MODE_STA); WiFi.mode(WIFI_MODE_STA);
WiFi.setHostname(ourHost); WiFi.setHostname(ourHost);
+6 -6
View File
@@ -24,10 +24,10 @@ bool hasOpenEditTransaction;
static const char *secretReserved = "sekrit"; static const char *secretReserved = "sekrit";
/// If buf is the reserved secret word, replace the buffer with currentVal /// If buf is the reserved secret word, replace the buffer with currentVal
static void writeSecret(char *buf, const char *currentVal) static void writeSecret(char *buf, size_t bufsz, const char *currentVal)
{ {
if (strcmp(buf, secretReserved) == 0) { if (strcmp(buf, secretReserved) == 0) {
strcpy(buf, currentVal); strncpy(buf, currentVal, bufsz);
} }
} }
@@ -199,15 +199,15 @@ void AdminModule::handleSetOwner(const User &o)
if (*o.long_name) { if (*o.long_name) {
changed |= strcmp(owner.long_name, o.long_name); changed |= strcmp(owner.long_name, o.long_name);
strcpy(owner.long_name, o.long_name); strncpy(owner.long_name, o.long_name, sizeof(owner.long_name));
} }
if (*o.short_name) { if (*o.short_name) {
changed |= strcmp(owner.short_name, o.short_name); changed |= strcmp(owner.short_name, o.short_name);
strcpy(owner.short_name, o.short_name); strncpy(owner.short_name, o.short_name, sizeof(owner.short_name));
} }
if (*o.id) { if (*o.id) {
changed |= strcmp(owner.id, o.id); changed |= strcmp(owner.id, o.id);
strcpy(owner.id, o.id); strncpy(owner.id, o.id, sizeof(owner.id));
} }
if (owner.is_licensed != o.is_licensed) { if (owner.is_licensed != o.is_licensed) {
changed = 1; changed = 1;
@@ -381,7 +381,7 @@ void AdminModule::handleGetConfig(const MeshPacket &req, const uint32_t configTy
LOG_INFO("Getting config: Network\n"); LOG_INFO("Getting config: Network\n");
res.get_config_response.which_payload_variant = Config_network_tag; res.get_config_response.which_payload_variant = Config_network_tag;
res.get_config_response.payload_variant.network = config.network; res.get_config_response.payload_variant.network = config.network;
writeSecret(res.get_config_response.payload_variant.network.wifi_psk, config.network.wifi_psk); writeSecret(res.get_config_response.payload_variant.network.wifi_psk, sizeof(res.get_config_response.payload_variant.network.wifi_psk), config.network.wifi_psk);
break; break;
case AdminMessage_ConfigType_DISPLAY_CONFIG: case AdminMessage_ConfigType_DISPLAY_CONFIG:
LOG_INFO("Getting config: Display\n"); LOG_INFO("Getting config: Display\n");
+4 -4
View File
@@ -75,7 +75,7 @@ int CannedMessageModule::splitConfiguredMessages()
int i = 0; int i = 0;
// collect all the message parts // collect all the message parts
strcpy(this->messageStore, cannedMessageModuleConfig.messages); strncpy(this->messageStore, cannedMessageModuleConfig.messages, sizeof(this->messageStore));
// The first message points to the beginning of the store. // The first message points to the beginning of the store.
this->messages[messageIndex++] = this->messageStore; this->messages[messageIndex++] = this->messageStore;
@@ -454,7 +454,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st
} }
display->drawStringf(0 + x, 0 + y, buffer, "To: %s", cannedMessageModule->getNodeName(this->dest)); display->drawStringf(0 + x, 0 + y, buffer, "To: %s", cannedMessageModule->getNodeName(this->dest));
// used chars right aligned // used chars right aligned
sprintf(buffer, "%d left", Constants_DATA_PAYLOAD_LEN - this->freetext.length()); snprintf(buffer, sizeof(buffer), "%d left", Constants_DATA_PAYLOAD_LEN - this->freetext.length());
display->drawString(x + display->getWidth() - display->getStringWidth(buffer), y + 0, buffer); display->drawString(x + display->getWidth() - display->getStringWidth(buffer), y + 0, buffer);
if (this->destSelect) { if (this->destSelect) {
display->drawString(x + display->getWidth() - display->getStringWidth(buffer) - 1, y + 0, buffer); display->drawString(x + display->getWidth() - display->getStringWidth(buffer) - 1, y + 0, buffer);
@@ -551,7 +551,7 @@ void CannedMessageModule::handleGetCannedMessageModuleMessages(const MeshPacket
LOG_DEBUG("*** handleGetCannedMessageModuleMessages\n"); LOG_DEBUG("*** handleGetCannedMessageModuleMessages\n");
if(req.decoded.want_response) { if(req.decoded.want_response) {
response->which_payload_variant = AdminMessage_get_canned_message_module_messages_response_tag; response->which_payload_variant = AdminMessage_get_canned_message_module_messages_response_tag;
strcpy(response->get_canned_message_module_messages_response, cannedMessageModuleConfig.messages); strncpy(response->get_canned_message_module_messages_response, cannedMessageModuleConfig.messages, sizeof(response->get_canned_message_module_messages_response));
} // Don't send anything if not instructed to. Better than asserting. } // Don't send anything if not instructed to. Better than asserting.
} }
@@ -562,7 +562,7 @@ void CannedMessageModule::handleSetCannedMessageModuleMessages(const char *from_
if (*from_msg) { if (*from_msg) {
changed |= strcmp(cannedMessageModuleConfig.messages, from_msg); changed |= strcmp(cannedMessageModuleConfig.messages, from_msg);
strcpy(cannedMessageModuleConfig.messages, from_msg); strncpy(cannedMessageModuleConfig.messages, from_msg, sizeof(cannedMessageModuleConfig.messages));
LOG_DEBUG("*** from_msg.text:%s\n", from_msg); LOG_DEBUG("*** from_msg.text:%s\n", from_msg);
} }
+2 -2
View File
@@ -349,7 +349,7 @@ void ExternalNotificationModule::handleGetRingtone(const MeshPacket &req, AdminM
LOG_INFO("*** handleGetRingtone\n"); LOG_INFO("*** handleGetRingtone\n");
if(req.decoded.want_response) { if(req.decoded.want_response) {
response->which_payload_variant = AdminMessage_get_ringtone_response_tag; response->which_payload_variant = AdminMessage_get_ringtone_response_tag;
strcpy(response->get_ringtone_response, rtttlConfig.ringtone); strncpy(response->get_ringtone_response, rtttlConfig.ringtone, sizeof(response->get_ringtone_response));
} // Don't send anything if not instructed to. Better than asserting. } // Don't send anything if not instructed to. Better than asserting.
} }
@@ -360,7 +360,7 @@ void ExternalNotificationModule::handleSetRingtone(const char *from_msg)
if (*from_msg) { if (*from_msg) {
changed |= strcmp(rtttlConfig.ringtone, from_msg); changed |= strcmp(rtttlConfig.ringtone, from_msg);
strcpy(rtttlConfig.ringtone, from_msg); strncpy(rtttlConfig.ringtone, from_msg, sizeof(rtttlConfig.ringtone));
LOG_INFO("*** from_msg.text:%s\n", from_msg); LOG_INFO("*** from_msg.text:%s\n", from_msg);
} }
+2 -2
View File
@@ -200,7 +200,7 @@ int32_t SerialModule::runOnce()
// in NMEA mode send out GGA every 2 seconds, Don't read from Port // in NMEA mode send out GGA every 2 seconds, Don't read from Port
if (millis() - lastNmeaTime > 2000) { if (millis() - lastNmeaTime > 2000) {
lastNmeaTime = millis(); lastNmeaTime = millis();
printGGA(outbuf, nodeDB.getNode(myNodeInfo.my_node_num)->position); printGGA(outbuf, sizeof(outbuf), nodeDB.getNode(myNodeInfo.my_node_num)->position);
Serial2.printf("%s", outbuf); Serial2.printf("%s", outbuf);
} }
} else { } else {
@@ -293,7 +293,7 @@ ProcessMessage SerialModuleRadio::handleReceived(const MeshPacket &mp)
decoded = &scratch; decoded = &scratch;
} }
// send position packet as WPL to the serial port // send position packet as WPL to the serial port
printWPL(outbuf, *decoded, nodeDB.getNode(getFrom(&mp))->user.long_name); printWPL(outbuf, sizeof(outbuf), *decoded, nodeDB.getNode(getFrom(&mp))->user.long_name);
Serial2.printf("%s", outbuf); Serial2.printf("%s", outbuf);
} }
} }
+25 -3
View File
@@ -237,9 +237,31 @@ ProcessMessage StoreForwardModule::handleReceived(const MeshPacket &mp)
// The router node should not be sending messages as a client. Unless he is a ROUTER_CLIENT // The router node should not be sending messages as a client. Unless he is a ROUTER_CLIENT
if ((getFrom(&mp) != nodeDB.getNodeNum()) || (config.device.role == Config_DeviceConfig_Role_ROUTER_CLIENT)) { if ((getFrom(&mp) != nodeDB.getNodeNum()) || (config.device.role == Config_DeviceConfig_Role_ROUTER_CLIENT)) {
if (mp.decoded.portnum == PortNum_TEXT_MESSAGE_APP) { if ((mp.decoded.portnum == PortNum_TEXT_MESSAGE_APP) && is_server) {
storeForwardModule->historyAdd(mp); auto &p = mp.decoded;
LOG_INFO("*** S&F stored. Message history contains %u records now.\n", this->packetHistoryCurrent); if ((p.payload.bytes[0] == 'S') && (p.payload.bytes[1] == 'F') && (p.payload.bytes[2] == 0x00)) {
LOG_DEBUG("*** Legacy Request to send\n");
// Send the last 60 minutes of messages.
if (this->busy) {
storeForwardModule->sendMessage(getFrom(&mp), StoreAndForward_RequestResponse_ROUTER_BUSY);
LOG_INFO("*** S&F - Busy. Try again shortly.\n");
MeshPacket *pr = allocReply();
pr->to = getFrom(&mp);
pr->priority = MeshPacket_Priority_MIN;
pr->want_ack = false;
pr->decoded.want_response = false;
pr->decoded.portnum = PortNum_TEXT_MESSAGE_APP;
memcpy(pr->decoded.payload.bytes, "** S&F - Busy. Try again shortly.", 34);
pr->decoded.payload.size = 34;
service.sendToMesh(pr);
} else {
storeForwardModule->historySend(historyReturnWindow * 60000, getFrom(&mp));
}
} else {
storeForwardModule->historyAdd(mp);
LOG_INFO("*** S&F stored. Message history contains %u records now.\n", this->packetHistoryCurrent);
}
} else if (mp.decoded.portnum == PortNum_STORE_FORWARD_APP) { } else if (mp.decoded.portnum == PortNum_STORE_FORWARD_APP) {
auto &p = mp.decoded; auto &p = mp.decoded;
+1 -1
View File
@@ -478,7 +478,7 @@ std::string MQTT::downstreamPacketToJson(MeshPacket *mp)
msgPayload["name"] = new JSONValue(decoded->name); msgPayload["name"] = new JSONValue(decoded->name);
msgPayload["description"] = new JSONValue(decoded->description); msgPayload["description"] = new JSONValue(decoded->description);
msgPayload["expire"] = new JSONValue((int)decoded->expire); msgPayload["expire"] = new JSONValue((int)decoded->expire);
msgPayload["locked_to"] = new JSONValue(decoded->locked_to); msgPayload["locked_to"] = new JSONValue((int)decoded->locked_to);
msgPayload["latitude_i"] = new JSONValue((int)decoded->latitude_i); msgPayload["latitude_i"] = new JSONValue((int)decoded->latitude_i);
msgPayload["longitude_i"] = new JSONValue((int)decoded->longitude_i); msgPayload["longitude_i"] = new JSONValue((int)decoded->longitude_i);
jsonObj["payload"] = new JSONValue(msgPayload); jsonObj["payload"] = new JSONValue(msgPayload);