diff --git a/src/configuration.h b/src/configuration.h
index 742d9e75e..59d0cf712 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -125,6 +125,12 @@ along with this program. If not, see .
#define RTC_DATA_ATTR
#endif
+// -----------------------------------------------------------------------------
+// Feature toggles
+// -----------------------------------------------------------------------------
+
+//#define DISABLE_NTP
+
// -----------------------------------------------------------------------------
// OLED & Input
// -----------------------------------------------------------------------------
diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp
index c81359604..9487231fd 100644
--- a/src/mesh/Router.cpp
+++ b/src/mesh/Router.cpp
@@ -303,6 +303,14 @@ bool perhapsDecode(MeshPacket *p)
// parsing was successful
p->which_payloadVariant = MeshPacket_decoded_tag; // change type to decoded
p->channel = chIndex; // change to store the index instead of the hash
+
+
+ // Decompress if needed. jm
+ if (p->decoded.which_payloadVariant == Data_payload_compressed_tag) {
+ // Decompress the file
+ }
+
+
printPacket("decoded message", p);
return true;
}
@@ -321,35 +329,53 @@ Routing_Error perhapsEncode(MeshPacket *p)
if (p->which_payloadVariant == MeshPacket_decoded_tag) {
static uint8_t bytes[MAX_RHPACKETLEN]; // we have to use a scratch buffer because a union
- // printPacket("pre encrypt", p); // portnum valid here
-
size_t numbytes = pb_encode_to_bytes(bytes, sizeof(bytes), Data_fields, &p->decoded);
+ // Only allow encryption on the text message app.
+ // TODO: Allow modules to opt into compression.
if (p->decoded.portnum == PortNum_TEXT_MESSAGE_APP) {
char original_payload[Constants_DATA_PAYLOAD_LEN];
memcpy(original_payload, p->decoded.payload.bytes, p->decoded.payload.size);
- int compressed_len;
- char compressed_out[100] = {0};
+ char compressed_out[Constants_DATA_PAYLOAD_LEN] = {0};
- compressed_len = unishox2_compress_simple(original_payload, p->decoded.payload.size, compressed_out);
+ int compressed_len = unishox2_compress_simple(original_payload, p->decoded.payload.size, compressed_out);
Serial.print("Original length - ");
Serial.println(p->decoded.payload.size);
Serial.print("Compressed length - ");
Serial.println(compressed_len);
- //Serial.println(compressed_out);
+ // Serial.println(compressed_out);
- char decompressed_out[100] = {};
- int decompressed_len;
+ // If the compressed length is greater than or equal to the original size, don't use the compressed form
+ if (compressed_len >= p->decoded.payload.size) {
- decompressed_len = unishox2_decompress_simple(compressed_out, compressed_len, decompressed_out);
+ DEBUG_MSG("Not compressing message. Not enough benefit from doing so.\n");
+ // Set the uncompressed payload varient anyway. Shouldn't hurt?
+ p->decoded.which_payloadVariant = Data_payload_tag;
- Serial.print("Decompressed length - ");
- Serial.println(decompressed_len);
- Serial.println(decompressed_out);
+ // Otherwise we use the compressor
+ } else {
+ DEBUG_MSG("Compressing message.\n");
+ // Copy the compressed data into the meshpacket
+ p->decoded.payload_compressed.size = compressed_len;
+ memcpy(p->decoded.payload_compressed.bytes, compressed_out, compressed_len);
+
+ p->decoded.which_payloadVariant = Data_payload_compressed_tag;
+ }
+
+ if (0) {
+ char decompressed_out[Constants_DATA_PAYLOAD_LEN] = {};
+ int decompressed_len;
+
+ decompressed_len = unishox2_decompress_simple(compressed_out, compressed_len, decompressed_out);
+
+ Serial.print("Decompressed length - ");
+ Serial.println(decompressed_len);
+ Serial.println(decompressed_out);
+ }
}
if (numbytes > MAX_RHPACKETLEN)
diff --git a/src/mesh/generated/mesh.pb.h b/src/mesh/generated/mesh.pb.h
index b4a9dbf90..8ce6fc803 100644
--- a/src/mesh/generated/mesh.pb.h
+++ b/src/mesh/generated/mesh.pb.h
@@ -500,6 +500,7 @@ typedef struct _User {
} User;
typedef PB_BYTES_ARRAY_T(237) Data_payload_t;
+typedef PB_BYTES_ARRAY_T(237) Data_payload_compressed_t;
/* (Formerly called SubPacket)
The payload portion fo a packet, this is the actual bytes that are sent
inside a radio packet (because from/to are broken out by the comms library) */
@@ -507,30 +508,34 @@ typedef struct _Data {
/* Formerly named typ and of type Type */
PortNum portnum;
/* TODO: REPLACE */
- Data_payload_t payload;
+ pb_size_t which_payloadVariant;
+ union {
+ Data_payload_t payload;
+ Data_payload_compressed_t payload_compressed;
+ };
+ /* TODO: REPLACE */
+ bool want_response;
/* Not normally used, but for testing a sender can request that recipient
responds in kind (i.e. if it received a position, it should unicast back it's position).
Note: that if you set this on a broadcast you will receive many replies. */
- bool want_response;
+ uint32_t dest;
/* The address of the destination node.
This field is is filled in by the mesh radio device software, application
layer software should never need it.
RouteDiscovery messages _must_ populate this.
Other message types might need to if they are doing multihop routing. */
- uint32_t dest;
+ uint32_t source;
/* The address of the original sender for this message.
This field should _only_ be populated for reliable multihop packets (to keep
packets small). */
- uint32_t source;
+ uint32_t request_id;
/* Only used in routing or response messages.
Indicates the original message ID that this message is reporting failure on. (formerly called original_id) */
- uint32_t request_id;
- /* If set, this message is intened to be a reply to a previously sent message with the defined id. */
uint32_t reply_id;
+ /* If set, this message is intened to be a reply to a previously sent message with the defined id. */
+ uint32_t emoji;
/* Defaults to false. If true, then what is in the payload should be treated as an emoji like giving
a message a heart or poop emoji. */
- uint32_t emoji;
- /* Location structure */
bool has_location;
Location location;
} Data;
@@ -738,7 +743,7 @@ extern "C" {
#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, 0, 0, false, Location_init_default}
+#define Data_init_default {_PortNum_MIN, 0, {{0, {0}}}, 0, 0, 0, 0, 0, 0, false, Location_init_default}
#define Location_init_default {0, 0, 0, 0, 0}
#define MeshPacket_init_default {0, 0, 0, 0, {Data_init_default}, 0, 0, 0, 0, 0, _MeshPacket_Priority_MIN, 0, _MeshPacket_Delayed_MIN}
#define NodeInfo_init_default {0, false, User_init_default, false, Position_init_default, 0, 0, false, DeviceMetrics_init_default}
@@ -751,7 +756,7 @@ extern "C" {
#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, 0, 0, false, Location_init_zero}
+#define Data_init_zero {_PortNum_MIN, 0, {{0, {0}}}, 0, 0, 0, 0, 0, 0, false, Location_init_zero}
#define Location_init_zero {0, 0, 0, 0, 0}
#define MeshPacket_init_zero {0, 0, 0, 0, {Data_init_zero}, 0, 0, 0, 0, 0, _MeshPacket_Priority_MIN, 0, _MeshPacket_Delayed_MIN}
#define NodeInfo_init_zero {0, false, User_init_zero, false, Position_init_zero, 0, 0, false, DeviceMetrics_init_zero}
@@ -825,6 +830,7 @@ extern "C" {
#define User_ant_azimuth_tag 12
#define Data_portnum_tag 1
#define Data_payload_tag 2
+#define Data_payload_compressed_tag 10
#define Data_want_response_tag 3
#define Data_dest_tag 4
#define Data_source_tag 5
@@ -923,14 +929,15 @@ X(a, STATIC, ONEOF, UENUM, (variant,error_reason,error_reason), 3)
#define Data_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UENUM, portnum, 1) \
-X(a, STATIC, SINGULAR, BYTES, payload, 2) \
+X(a, STATIC, ONEOF, BYTES, (payloadVariant,payload,payload), 2) \
X(a, STATIC, SINGULAR, BOOL, want_response, 3) \
X(a, STATIC, SINGULAR, FIXED32, dest, 4) \
X(a, STATIC, SINGULAR, FIXED32, source, 5) \
X(a, STATIC, SINGULAR, FIXED32, request_id, 6) \
X(a, STATIC, SINGULAR, FIXED32, reply_id, 7) \
X(a, STATIC, SINGULAR, FIXED32, emoji, 8) \
-X(a, STATIC, OPTIONAL, MESSAGE, location, 9)
+X(a, STATIC, OPTIONAL, MESSAGE, location, 9) \
+X(a, STATIC, ONEOF, BYTES, (payloadVariant,payload_compressed,payload_compressed), 10)
#define Data_CALLBACK NULL
#define Data_DEFAULT NULL
#define Data_location_MSGTYPE Location
diff --git a/src/mesh/generated/telemetry.pb.h b/src/mesh/generated/telemetry.pb.h
index 1fb5ea0d7..b3bf3df1d 100644
--- a/src/mesh/generated/telemetry.pb.h
+++ b/src/mesh/generated/telemetry.pb.h
@@ -40,10 +40,10 @@ typedef struct _EnvironmentMetrics {
/* Types of Measurements the telemetry module is equipped to handle */
typedef struct _Telemetry {
- /* This is usually not sent over the mesh (to save space), but it is sent
- from the phone so that the local device can set its RTC If it is sent over
- the mesh (because there are devices on the mesh without GPS), it will only
- be sent by devices which has a hardware GPS clock (IE Mobile Phone).
+ /* This is usually not sent over the mesh (to save space), but it is sent
+ from the phone so that the local device can set its RTC If it is sent over
+ the mesh (because there are devices on the mesh without GPS), it will only
+ be sent by devices which has a hardware GPS clock (IE Mobile Phone).
seconds since 1970 */
uint32_t time;
/* Key native device metrics such as battery level */
diff --git a/src/mesh/http/WiFiAPClient.cpp b/src/mesh/http/WiFiAPClient.cpp
index afda19702..be07acc53 100644
--- a/src/mesh/http/WiFiAPClient.cpp
+++ b/src/mesh/http/WiFiAPClient.cpp
@@ -10,10 +10,13 @@
#include "target_specific.h"
#include
#include
-#include
#include
#include
+#ifndef DISABLE_NTP
+#include
+#endif
+
using namespace concurrency;
static void WiFiEvent(WiFiEvent_t event);
@@ -23,7 +26,10 @@ DNSServer dnsServer;
// NTP
WiFiUDP ntpUDP;
+
+#ifndef DISABLE_NTP
NTPClient timeClient(ntpUDP, "0.pool.ntp.org");
+#endif
uint8_t wifiDisconnectReason = 0;
@@ -67,13 +73,13 @@ static int32_t reconnectWiFi()
DEBUG_MSG("... Reconnecting to WiFi access point\n");
WiFi.mode(WIFI_MODE_STA);
WiFi.begin(wifiName, wifiPsw);
-
// Starting timeClient;
}
}
- //if (*wifiName) {
+#ifndef DISABLE_NTP
+ // if (*wifiName) {
if (WiFi.isConnected()) {
DEBUG_MSG("Updating NTP time\n");
if (timeClient.update()) {
@@ -89,6 +95,7 @@ static int32_t reconnectWiFi()
DEBUG_MSG("NTP Update failed\n");
}
}
+#endif
return 30 * 1000; // every 30 seconds
}
@@ -155,9 +162,11 @@ static void onNetworkConnected()
MDNS.addService("https", "tcp", 443);
}
+#ifndef DISABLE_NTP
DEBUG_MSG("Starting NTP time client\n");
timeClient.begin();
- timeClient.setUpdateInterval(60*60); // Update once an hour
+ timeClient.setUpdateInterval(60 * 60); // Update once an hour
+#endif
initWebServer();
initApiServer();