From c52ac2cefc453b97b45f12a13c2ab1dd8af8c018 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Mon, 28 Jun 2021 18:04:17 +0200 Subject: [PATCH] Fix XN297Dump enhanced payload detection --- Multiprotocol/XN297Dump_nrf24l01.ino | 41 ++++++++++++++++------------ Multiprotocol/XN297_EMU.ino | 4 +-- Multiprotocol/iface_xn297.h | 2 +- 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/Multiprotocol/XN297Dump_nrf24l01.ino b/Multiprotocol/XN297Dump_nrf24l01.ino index 75abd88..b3207b3 100644 --- a/Multiprotocol/XN297Dump_nrf24l01.ino +++ b/Multiprotocol/XN297Dump_nrf24l01.ino @@ -119,29 +119,34 @@ static boolean __attribute__((unused)) XN297Dump_process_packet(void) } //Try enhanced payload - crc = 0xb5d2; + uint16_t crc_save = 0xb5d2; packet_length=0; - for (uint8_t i = 0; i < XN297DUMP_MAX_PACKET_LEN-XN297DUMP_CRC_LENGTH; i++) + for (uint8_t i = 0; i < XN297DUMP_MAX_PACKET_LEN-XN297DUMP_CRC_LENGTH; i++) { packet_sc[i]=packet[i]^xn297_scramble[i]; + crc = crc_save; crc16_update( packet[i], 8); + crc_save = crc; crc16_update( packet[i+1] & 0xC0, 2); crcxored=(packet[i+1]<<10)|(packet[i+2]<<2)|(packet[i+3]>>6) ; - if((crc ^ pgm_read_word(&xn297_crc_xorout_scrambled_enhanced[i - 3])) == crcxored) - { // Found a valid CRC for the enhanced payload mode - packet_length=i; - scramble=true; - i++; - packet_sc[i]=packet[i]^xn297_scramble[i]; - memcpy(packet_un,packet_sc,packet_length+2); // unscramble packet - break; - } - if((crc ^ pgm_read_word(&xn297_crc_xorout_enhanced[i - 3])) == crcxored) - { // Found a valid CRC for the enhanced payload mode - packet_length=i; - scramble=false; - memcpy(packet_un,packet,packet_length+2); // packet is unscrambled - break; + if(i>=3) + { + if((crc ^ pgm_read_word(&xn297_crc_xorout_scrambled_enhanced[i - 3])) == crcxored) + { // Found a valid CRC for the enhanced payload mode + packet_length=i; + scramble=true; + i++; + packet_sc[i]=packet[i]^xn297_scramble[i]; + memcpy(packet_un,packet_sc,packet_length+2); // unscramble packet + break; + } + if((crc ^ pgm_read_word(&xn297_crc_xorout_enhanced[i - 3])) == crcxored) + { // Found a valid CRC for the enhanced payload mode + packet_length=i; + scramble=false; + memcpy(packet_un,packet,packet_length+2); // packet is unscrambled + break; + } } } if(packet_length!=0) @@ -324,7 +329,7 @@ static uint16_t XN297Dump_callback() switch(bitrate) { case XN297DUMP_250K: - XN297_Configure(XN297_CRCEN, scramble?XN297_SCRAMBLED:XN297_UNSCRAMBLED, XN297_250K); + XN297_Configure(XN297_CRCEN, scramble?XN297_SCRAMBLED:XN297_UNSCRAMBLED, XN297_250K, true); debug("250K"); break; case XN297DUMP_2M: diff --git a/Multiprotocol/XN297_EMU.ino b/Multiprotocol/XN297_EMU.ino index a487b7c..000d8af 100644 --- a/Multiprotocol/XN297_EMU.ino +++ b/Multiprotocol/XN297_EMU.ino @@ -53,7 +53,7 @@ const uint16_t xn297_crc_xorout_enhanced[] = { 0xABFC, 0xE68E, 0x0DE7, 0x28A2, 0x1965 }; #endif -static bool __attribute__((unused)) XN297_Configure(bool crc_en, bool scramble_en, bool bitrate) +static bool __attribute__((unused)) XN297_Configure(bool crc_en, bool scramble_en, bool bitrate, bool force_nrf) { xn297_crc = crc_en; xn297_scramble_enabled = scramble_en; @@ -61,7 +61,7 @@ static bool __attribute__((unused)) XN297_Configure(bool crc_en, bool scramble_e xn297_rf = XN297_NRF; #if defined(NRF24L01_INSTALLED) and defined(CC2500_INSTALLED) - if(bitrate == XN297_1M) + if(bitrate == XN297_1M || force_nrf) xn297_rf = XN297_NRF; // Use NRF24L01 else xn297_rf = XN297_CC2500; // Use CC2500 diff --git a/Multiprotocol/iface_xn297.h b/Multiprotocol/iface_xn297.h index bd50122..4d65e1a 100644 --- a/Multiprotocol/iface_xn297.h +++ b/Multiprotocol/iface_xn297.h @@ -23,7 +23,7 @@ ////////////// // Functions -static bool __attribute__((unused)) XN297_Configure(bool, bool, bool); +static bool __attribute__((unused)) XN297_Configure(bool, bool, bool, bool force_nrf=false); static void __attribute__((unused)) XN297_SetTXAddr(const uint8_t*, uint8_t); static void __attribute__((unused)) XN297_SetRXAddr(const uint8_t*, uint8_t); static void __attribute__((unused)) XN297_SetTxRxMode(enum TXRX_State);