diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino index 00f790f..a557a96 100644 --- a/Multiprotocol/Multi_Names.ino +++ b/Multiprotocol/Multi_Names.ino @@ -313,7 +313,7 @@ const mm_protocol_definition multi_protocols[] = { {PROTO_TIGER, STR_TIGER , 0, NO_SUBTYPE, OPTION_NONE }, #endif #if defined(XN297DUMP_NRF24L01_INO) - {PROTO_XN297DUMP, STR_XN297DUMP, 3, STR_SUBTYPE_XN297DUMP, OPTION_RFCHAN }, + {PROTO_XN297DUMP, STR_XN297DUMP, 4, STR_SUBTYPE_XN297DUMP, OPTION_RFCHAN }, #endif {0x00, nullptr, 0, nullptr, 0 } }; diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 4f100fe..b2deb3b 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 0 -#define VERSION_PATCH_LEVEL 50 +#define VERSION_PATCH_LEVEL 51 //****************** // Protocols diff --git a/Multiprotocol/NRF24l01_SPI.ino b/Multiprotocol/NRF24l01_SPI.ino index adee414..3911a77 100644 --- a/Multiprotocol/NRF24l01_SPI.ino +++ b/Multiprotocol/NRF24l01_SPI.ino @@ -505,7 +505,7 @@ boolean XN297_ReadPayload(uint8_t* msg, uint8_t len) //process address for (uint8_t i = 0; i < xn297_addr_len; ++i) { - uint8_t b_in=xn297_tx_addr[xn297_addr_len-i-1]; + uint8_t b_in=xn297_rx_addr[xn297_addr_len-i-1]; if(xn297_scramble_enabled) b_in ^= xn297_scramble[i]; crc = crc16_update(crc, b_in, 8); @@ -525,10 +525,13 @@ boolean XN297_ReadPayload(uint8_t* msg, uint8_t len) } uint8_t XN297_ReadEnhancedPayload(uint8_t* msg, uint8_t len) -{ +{ //!!! Don't forget do a +2 and if using CRC add +2 on any of the used NRF24L01_11_RX_PW_Px !!! uint8_t buffer[32]; uint8_t pcf_size; // pcf payload size - NRF24L01_ReadPayload(buffer, len+2); // pcf + payload + if (xn297_crc) + NRF24L01_ReadPayload(buffer, len+4); // Read pcf + payload + CRC + else + NRF24L01_ReadPayload(buffer, len+2); // Read pcf + payload pcf_size = buffer[0]; if(xn297_scramble_enabled) pcf_size ^= xn297_scramble[xn297_addr_len]; @@ -540,7 +543,35 @@ uint8_t XN297_ReadEnhancedPayload(uint8_t* msg, uint8_t len) msg[i] ^= bit_reverse((xn297_scramble[xn297_addr_len+i+1] << 2) | (xn297_scramble[xn297_addr_len+i+2] >> 6)); } - return pcf_size; + + if (!xn297_crc) + return pcf_size; // No CRC so OK by default... + + // Calculate CRC + uint16_t crc = 0xb5d2; + //process address + for (uint8_t i = 0; i < xn297_addr_len; ++i) + { + uint8_t b_in=xn297_rx_addr[xn297_addr_len-i-1]; + if(xn297_scramble_enabled) + b_in ^= xn297_scramble[i]; + crc = crc16_update(crc, b_in, 8); + } + //process payload + for (uint8_t i = 0; i < len+1; ++i) + crc = crc16_update(crc, buffer[i], 8); + crc = crc16_update(crc, buffer[len+1] & 0xc0, 2); + //xorout + if (xn297_scramble_enabled) + crc ^= pgm_read_word(&xn297_crc_xorout_scrambled_enhanced[xn297_addr_len-3+len]); +#ifdef XN297DUMP_NRF24L01_INO + else + crc ^= pgm_read_word(&xn297_crc_xorout_enhanced[xn297_addr_len - 3 + len]); +#endif + uint16_t crcxored=(buffer[len+1]<<10)|(buffer[len+2]<<2)|(buffer[len+3]>>6) ; + if( crc == crcxored) + return pcf_size; // CRC OK + return 0; // CRC NOK } // End of XN297 emulation diff --git a/Multiprotocol/Pelikan_a7105.ino b/Multiprotocol/Pelikan_a7105.ino index 6386b22..9ac9de9 100644 --- a/Multiprotocol/Pelikan_a7105.ino +++ b/Multiprotocol/Pelikan_a7105.ino @@ -72,7 +72,6 @@ static void __attribute__((unused)) pelikan_build_packet() packet[9]=upper?0xAA:0x00; upper=!upper; //Hopping counters - packet[11]=packet_count; if(++packet_count>4) { packet_count=0; @@ -80,6 +79,7 @@ static void __attribute__((unused)) pelikan_build_packet() hopping_frequency_no=0; } packet[10]=hopping_frequency_no; + packet[11]=packet_count; packet_length = 15; } @@ -91,6 +91,15 @@ static void __attribute__((unused)) pelikan_build_packet() packet[packet_length-1]=crc8; //Send + #ifdef DEBUG_SERIAL + if(packet[9]==0x00) + { + debug("C: %02X P(%d):",IS_BIND_IN_PROGRESS?PELIKAN_BIND_RF:hopping_frequency[hopping_frequency_no],packet_length); + for(uint8_t i=0;i80) - val--; + if(val>0x80) + val--; // 80..FE else - if(val==0) - val++; + { + val=0x80-val; // 80..01 + if(val==0x80) + val--; // 7F..01 + } return val; } @@ -49,9 +52,9 @@ static void __attribute__((unused)) TIGER_send_packet() { //Channels packet[0]=convert_channel_8b(THROTTLE); // 00..FF - packet[1]=TIGER_convert_channel(RUDDER); // 00=center, 01..7F=left, 80..FF=right - packet[2]=TIGER_convert_channel(ELEVATOR); // 00=center, 01..7F=down, 80..FF=up - packet[3]=TIGER_convert_channel(AILERON); // 00=center, 01..7F=left, 80..FF=right + packet[1]=TIGER_convert_channel(RUDDER); // 7F..01=left, 00=center, 80..FF=right + packet[2]=TIGER_convert_channel(ELEVATOR); // 7F..01=down, 00=center, 80..FF=up + packet[3]=TIGER_convert_channel(AILERON); // 7F..01=left, 00=center, 80..FF=right //Flags packet[14]= GET_FLAG(CH5_SW, 0x04) //FLIP | GET_FLAG(CH6_SW, 0x10); //LIGHT diff --git a/Protocols_Details.md b/Protocols_Details.md index 53e63bc..e60aa88 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -1282,6 +1282,8 @@ Start/Stop|EMERGENCY|CAMERA_UP/DN ## Tiger - *61* Autobind protocol +**Only 1 ID** + CH1|CH2|CH3|CH4|CH5|CH6 ---|---|---|---|---|--- A|E|T|R|FLIP|LIGHT