From d4e77c649973cc9e1f24c78a08a137ef8321a53e Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Sat, 24 Aug 2019 21:37:26 +0200 Subject: [PATCH] XN297Dump: added enhanced packet mode --- Multiprotocol/Multiprotocol.h | 2 +- Multiprotocol/NRF24l01_SPI.ino | 4 +-- Multiprotocol/XN297Dump_nrf24l01.ino | 51 +++++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index e081422..b74b488 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 2 #define VERSION_REVISION 1 -#define VERSION_PATCH_LEVEL 71 +#define VERSION_PATCH_LEVEL 72 //****************** // Protocols diff --git a/Multiprotocol/NRF24l01_SPI.ino b/Multiprotocol/NRF24l01_SPI.ino index abe20cc..adee414 100644 --- a/Multiprotocol/NRF24l01_SPI.ino +++ b/Multiprotocol/NRF24l01_SPI.ino @@ -286,7 +286,7 @@ const uint16_t PROGMEM xn297_crc_xorout_scrambled_enhanced[] = { // unscrambled enhanced mode crc xorout table // unused so far -/* +#ifdef XN297DUMP_NRF24L01_INO const uint16_t xn297_crc_xorout_enhanced[] = { 0x0000, 0x8BE6, 0xD8EC, 0xB87A, 0x42DC, 0xAA89, 0x83AF, 0x10E4, 0xE83E, 0x5C29, 0xAC76, 0x1C69, @@ -294,7 +294,7 @@ const uint16_t xn297_crc_xorout_enhanced[] = { 0x7CDB, 0x7A14, 0xD5D2, 0x57D7, 0xE31D, 0xCE42, 0x648D, 0xBF2D, 0x653B, 0x190C, 0x9117, 0x9A97, 0xABFC, 0xE68E, 0x0DE7, 0x28A2, 0x1965 }; -*/ +#endif static uint8_t bit_reverse(uint8_t b_in) { diff --git a/Multiprotocol/XN297Dump_nrf24l01.ino b/Multiprotocol/XN297Dump_nrf24l01.ino index 85a8875..4032bd7 100644 --- a/Multiprotocol/XN297Dump_nrf24l01.ino +++ b/Multiprotocol/XN297Dump_nrf24l01.ino @@ -76,10 +76,10 @@ static boolean __attribute__((unused)) XN297Dump_process_packet(void) { uint16_t crcxored; uint8_t packet_sc[XN297DUMP_MAX_PACKET_LEN], packet_un[XN297DUMP_MAX_PACKET_LEN]; - // init crc crc = 0xb5d2; + //Try normal payload // address for (uint8_t i = 0; i < address_length; i++) { @@ -112,6 +112,55 @@ static boolean __attribute__((unused)) XN297Dump_process_packet(void) return true; } } + + //Try enhanced payload + crc = 0xb5d2; + packet_length=0; + uint16_t crc_enh; + for (uint8_t i = 0; i < XN297DUMP_MAX_PACKET_LEN-XN297DUMP_CRC_LENGTH; i++) + { + packet_sc[i]=packet[i]^xn297_scramble[i]; + crc = crc16_update(crc, packet[i], 8); + crc_enh = crc16_update(crc, packet[i+1] & 0xC0, 2); + crcxored=(packet[i+1]<<10)|(packet[i+2]<<2)|(packet[i+3]>>6) ; + if((crc_enh ^ pgm_read_word(&xn297_crc_xorout_scrambled_enhanced[i - 3])) == crcxored) + { + packet_length=i; + i++; + packet_sc[i]=packet[i]^xn297_scramble[i]; + memcpy(packet_un,packet_sc,packet_length+2); // unscramble packet + scramble=true; + break; + } + if((crc_enh ^ pgm_read_word(&xn297_crc_xorout_enhanced[i - 3])) == crcxored) + { + scramble=false; + packet_length=i; + break; + } + } + if(packet_length!=0) + { + debug("Enhanced "); + //check selected address length + if((packet_un[address_length]>>1)!=packet_length-address_length) + { + for(uint8_t i=3;i<=5;i++) + if((packet_un[i]>>1)==packet_length-i) + address_length=i; + debug("Wrong address length selected using %d ", address_length ) + } + debug("pid=%d ",((packet_un[address_length]&0x01)<<1)|(packet_un[address_length+1]>>7)); + debug("ack=%d ",(packet_un[address_length+1]>>6)&0x01); + // address + for (uint8_t i = 0; i < address_length; i++) + packet[address_length-1-i]=packet_un[i]; + // payload + for (uint8_t i = address_length; i < packet_length; i++) + packet[i] = bit_reverse((packet_un[i+1]<<2)|(packet_un[i+2]>>6)); + return true; + } + return false; }