Temp work on compression

This commit is contained in:
Jm Casler 2022-04-25 08:02:51 -07:00
parent 81588d8bdc
commit 4785367915
4 changed files with 55 additions and 23 deletions

View File

@ -133,7 +133,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
//#define DISABLE_NTP //#define DISABLE_NTP
// Disable the welcome screen and allow // Disable the welcome screen and allow
// #define DISABLE_WELCOME_UNSET #define DISABLE_WELCOME_UNSET
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// OLED & Input // OLED & Input

View File

@ -251,7 +251,7 @@ void printPacket(const char *prefix, const MeshPacket *p)
DEBUG_MSG(" rxSNR=%g", p->rx_snr); DEBUG_MSG(" rxSNR=%g", p->rx_snr);
} }
if (p->rx_rssi != 0) { if (p->rx_rssi != 0) {
DEBUG_MSG(" rxSNR=%g", p->rx_rssi); DEBUG_MSG(" rxRSSI=%g", p->rx_rssi);
} }
if (p->priority != 0) if (p->priority != 0)
DEBUG_MSG(" priority=%d", p->priority); DEBUG_MSG(" priority=%d", p->priority);

View File

@ -93,6 +93,9 @@ bool RadioLibInterface::canSendImmediately()
/// bluetooth comms code. If the txmit queue is empty it might return an error /// bluetooth comms code. If the txmit queue is empty it might return an error
ErrorCode RadioLibInterface::send(MeshPacket *p) ErrorCode RadioLibInterface::send(MeshPacket *p)
{ {
#ifndef DISABLE_WELCOME_UNSET
if (radioConfig.preferences.region != RegionCode_Unset) { if (radioConfig.preferences.region != RegionCode_Unset) {
if (disabled || radioConfig.preferences.is_lora_tx_disabled) { if (disabled || radioConfig.preferences.is_lora_tx_disabled) {
DEBUG_MSG("send - lora_tx_disabled\n"); DEBUG_MSG("send - lora_tx_disabled\n");
@ -106,6 +109,16 @@ ErrorCode RadioLibInterface::send(MeshPacket *p)
return ERRNO_DISABLED; return ERRNO_DISABLED;
} }
#else
if (disabled || radioConfig.preferences.is_lora_tx_disabled) {
DEBUG_MSG("send - lora_tx_disabled\n");
packetPool.release(p);
return ERRNO_DISABLED;
}
#endif
// Sometimes when testing it is useful to be able to never turn on the xmitter // Sometimes when testing it is useful to be able to never turn on the xmitter
#ifndef LORA_DISABLE_SENDING #ifndef LORA_DISABLE_SENDING
printPacket("enqueuing for send", p); printPacket("enqueuing for send", p);
@ -121,7 +134,7 @@ ErrorCode RadioLibInterface::send(MeshPacket *p)
// set (random) transmit delay to let others reconfigure their radio, // set (random) transmit delay to let others reconfigure their radio,
// to avoid collisions and implement timing-based flooding // to avoid collisions and implement timing-based flooding
// DEBUG_MSG("Set random delay before transmitting.\n"); // DEBUG_MSG("Set random delay before transmitting.\n");
setTransmitDelay(); setTransmitDelay();
return res; return res;
#else #else
@ -154,10 +167,10 @@ bool RadioLibInterface::cancelSending(NodeNum from, PacketId id)
/** radio helper thread callback. /** radio helper thread callback.
We never immediately transmit after any operation (either rx or tx). Instead we should start receiving and We never immediately transmit after any operation (either rx or tx). Instead we should start receiving and
wait a random delay of 100ms to 100ms+shortPacketMsec to make sure we are not stomping on someone else. The 100ms delay at the beginning ensures all wait a random delay of 100ms to 100ms+shortPacketMsec to make sure we are not stomping on someone else. The 100ms delay at the
possible listeners have had time to finish processing the previous packet and now have their radio in RX state. The up to 100ms+shortPacketMsec beginning ensures all possible listeners have had time to finish processing the previous packet and now have their radio in RX
random delay gives a chance for all possible senders to have high odds of detecting that someone else started transmitting first state. The up to 100ms+shortPacketMsec random delay gives a chance for all possible senders to have high odds of detecting that
and then they will wait until that packet finishes. someone else started transmitting first and then they will wait until that packet finishes.
NOTE: the large flood rebroadcast delay might still be needed even with this approach. Because we might not be able to hear other NOTE: the large flood rebroadcast delay might still be needed even with this approach. Because we might not be able to hear other
transmitters that we are potentially stomping on. Requires further thought. transmitters that we are potentially stomping on. Requires further thought.
@ -215,7 +228,7 @@ void RadioLibInterface::onNotify(uint32_t notification)
void RadioLibInterface::setTransmitDelay() void RadioLibInterface::setTransmitDelay()
{ {
MeshPacket *p = txQueue.getFront(); MeshPacket *p = txQueue.getFront();
// We want all sending/receiving to be done by our daemon thread. // We want all sending/receiving to be done by our daemon thread.
// We use a delay here because this packet might have been sent in response to a packet we just received. // We use a delay here because this packet might have been sent in response to a packet we just received.
// So we want to make sure the other side has had a chance to reconfigure its radio. // So we want to make sure the other side has had a chance to reconfigure its radio.

View File

@ -274,6 +274,9 @@ void Router::sniffReceived(const MeshPacket *p, const Routing *c)
bool perhapsDecode(MeshPacket *p) bool perhapsDecode(MeshPacket *p)
{ {
//DEBUG_MSG("\n\n** perhapsDecode payloadVariant - %d\n\n", p->which_payloadVariant);
if (p->which_payloadVariant == MeshPacket_decoded_tag) if (p->which_payloadVariant == MeshPacket_decoded_tag)
return true; // If packet was already decoded just return return true; // If packet was already decoded just return
@ -304,12 +307,28 @@ bool perhapsDecode(MeshPacket *p)
p->which_payloadVariant = MeshPacket_decoded_tag; // change type to decoded p->which_payloadVariant = MeshPacket_decoded_tag; // change type to decoded
p->channel = chIndex; // change to store the index instead of the hash p->channel = chIndex; // change to store the index instead of the hash
if (p->decoded.portnum == PortNum_TEXT_MESSAGE_APP) {
// Decompress if needed. jm DEBUG_MSG("\n\n** TEXT_MESSAGE_APP payloadVariant - %d\n\n", p->decoded.which_payloadVariant);
if (p->decoded.which_payloadVariant == Data_payload_compressed_tag) {
// Decompress the file
} }
// Decompress if needed. jm
if (p->decoded.portnum == PortNum_TEXT_MESSAGE_APP) {
if (p->decoded.which_payloadVariant == Data_payload_compressed_tag) {
// Decompress the payload
char compressed_in[Constants_DATA_PAYLOAD_LEN] = {};
char decompressed_out[Constants_DATA_PAYLOAD_LEN] = {};
int decompressed_len;
memcpy(compressed_in, p->decoded.payload.bytes, p->decoded.payload.size);
decompressed_len = unishox2_decompress_simple(compressed_in, p->decoded.payload.size, decompressed_out);
DEBUG_MSG("\n\n**\n\nDecompressed length - %d \n", decompressed_len);
// Serial.println(p->decoded.payload.bytes);
Serial.println(decompressed_out);
p->decoded.which_payloadVariant = Data_payload_tag;
}
}
printPacket("decoded message", p); printPacket("decoded message", p);
return true; return true;
@ -341,37 +360,37 @@ Routing_Error perhapsEncode(MeshPacket *p)
char compressed_out[Constants_DATA_PAYLOAD_LEN] = {0}; char compressed_out[Constants_DATA_PAYLOAD_LEN] = {0};
int compressed_len; int compressed_len;
// compressed_len = unishox2_compress_simple(original_payload, p->decoded.payload.size, compressed_out); compressed_len = unishox2_compress_simple(original_payload, p->decoded.payload.size, compressed_out);
Serial.print("Original length - "); DEBUG_MSG("Original length - %d \n", p->decoded.payload.size);
Serial.println(p->decoded.payload.size); DEBUG_MSG("Compressed length - %d \n", compressed_len);
Serial.print("Compressed length - ");
Serial.println(compressed_len);
// Serial.println(compressed_out); // Serial.println(compressed_out);
// If the compressed length is greater than or equal to the original size, don't use the compressed form // 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) { if (compressed_len >= p->decoded.payload.size) {
DEBUG_MSG("Not compressing message. Not enough benefit from doing so.\n"); DEBUG_MSG("Not using compressing message.\n");
// Set the uncompressed payload varient anyway. Shouldn't hurt? // Set the uncompressed payload varient anyway. Shouldn't hurt?
p->decoded.which_payloadVariant = Data_payload_tag; p->decoded.which_payloadVariant = Data_payload_tag;
// Otherwise we use the compressor // Otherwise we use the compressor
} else { } else {
DEBUG_MSG("Compressing message.\n"); DEBUG_MSG("Using compressed message.\n");
// Copy the compressed data into the meshpacket // Copy the compressed data into the meshpacket
//p->decoded.payload_compressed.size = compressed_len; p->decoded.payload_compressed.size = compressed_len;
//memcpy(p->decoded.payload_compressed.bytes, compressed_out, compressed_len); memcpy(p->decoded.payload_compressed.bytes, compressed_out, compressed_len);
//p->decoded.which_payloadVariant = Data_payload_compressed_tag; DEBUG_MSG("\n\n** TEXT_MESSAGE_APP payloadVariant - %d\n\n", p->decoded.which_payloadVariant);
p->decoded.which_payloadVariant = Data_payload_compressed_tag;
DEBUG_MSG("\n\n** TEXT_MESSAGE_APP payloadVariant - %d\n\n", p->decoded.which_payloadVariant);
} }
if (0) { if (0) {
char decompressed_out[Constants_DATA_PAYLOAD_LEN] = {}; char decompressed_out[Constants_DATA_PAYLOAD_LEN] = {};
int decompressed_len; int decompressed_len;
// decompressed_len = unishox2_decompress_simple(compressed_out, compressed_len, decompressed_out); decompressed_len = unishox2_decompress_simple(compressed_out, compressed_len, decompressed_out);
Serial.print("Decompressed length - "); Serial.print("Decompressed length - ");
Serial.println(decompressed_len); Serial.println(decompressed_len);