mirror of
https://github.com/meshtastic/firmware.git
synced 2025-09-01 01:15:10 +00:00
Temp work on compression
This commit is contained in:
parent
81588d8bdc
commit
4785367915
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user