XN297Dump: added enhanced packet mode

This commit is contained in:
Pascal Langer 2019-08-24 21:37:26 +02:00
parent ffc56b049d
commit d4e77c6499
3 changed files with 53 additions and 4 deletions

View File

@ -19,7 +19,7 @@
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 2 #define VERSION_MINOR 2
#define VERSION_REVISION 1 #define VERSION_REVISION 1
#define VERSION_PATCH_LEVEL 71 #define VERSION_PATCH_LEVEL 72
//****************** //******************
// Protocols // Protocols

View File

@ -286,7 +286,7 @@ const uint16_t PROGMEM xn297_crc_xorout_scrambled_enhanced[] = {
// unscrambled enhanced mode crc xorout table // unscrambled enhanced mode crc xorout table
// unused so far // unused so far
/* #ifdef XN297DUMP_NRF24L01_INO
const uint16_t xn297_crc_xorout_enhanced[] = { const uint16_t xn297_crc_xorout_enhanced[] = {
0x0000, 0x8BE6, 0xD8EC, 0xB87A, 0x42DC, 0xAA89, 0x0000, 0x8BE6, 0xD8EC, 0xB87A, 0x42DC, 0xAA89,
0x83AF, 0x10E4, 0xE83E, 0x5C29, 0xAC76, 0x1C69, 0x83AF, 0x10E4, 0xE83E, 0x5C29, 0xAC76, 0x1C69,
@ -294,7 +294,7 @@ const uint16_t xn297_crc_xorout_enhanced[] = {
0x7CDB, 0x7A14, 0xD5D2, 0x57D7, 0xE31D, 0xCE42, 0x7CDB, 0x7A14, 0xD5D2, 0x57D7, 0xE31D, 0xCE42,
0x648D, 0xBF2D, 0x653B, 0x190C, 0x9117, 0x9A97, 0x648D, 0xBF2D, 0x653B, 0x190C, 0x9117, 0x9A97,
0xABFC, 0xE68E, 0x0DE7, 0x28A2, 0x1965 }; 0xABFC, 0xE68E, 0x0DE7, 0x28A2, 0x1965 };
*/ #endif
static uint8_t bit_reverse(uint8_t b_in) static uint8_t bit_reverse(uint8_t b_in)
{ {

View File

@ -76,10 +76,10 @@ static boolean __attribute__((unused)) XN297Dump_process_packet(void)
{ {
uint16_t crcxored; uint16_t crcxored;
uint8_t packet_sc[XN297DUMP_MAX_PACKET_LEN], packet_un[XN297DUMP_MAX_PACKET_LEN]; uint8_t packet_sc[XN297DUMP_MAX_PACKET_LEN], packet_un[XN297DUMP_MAX_PACKET_LEN];
// init crc // init crc
crc = 0xb5d2; crc = 0xb5d2;
//Try normal payload
// address // address
for (uint8_t i = 0; i < address_length; i++) for (uint8_t i = 0; i < address_length; i++)
{ {
@ -112,6 +112,55 @@ static boolean __attribute__((unused)) XN297Dump_process_packet(void)
return true; 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; return false;
} }