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();