Pelikan and Tiger protocol fixes

This commit is contained in:
pascallanger 2019-12-20 09:29:37 +01:00
parent ec92edfc85
commit 917e27280f
6 changed files with 64 additions and 19 deletions

View File

@ -313,7 +313,7 @@ const mm_protocol_definition multi_protocols[] = {
{PROTO_TIGER, STR_TIGER , 0, NO_SUBTYPE, OPTION_NONE }, {PROTO_TIGER, STR_TIGER , 0, NO_SUBTYPE, OPTION_NONE },
#endif #endif
#if defined(XN297DUMP_NRF24L01_INO) #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 #endif
{0x00, nullptr, 0, nullptr, 0 } {0x00, nullptr, 0, nullptr, 0 }
}; };

View File

@ -19,7 +19,7 @@
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 3 #define VERSION_MINOR 3
#define VERSION_REVISION 0 #define VERSION_REVISION 0
#define VERSION_PATCH_LEVEL 50 #define VERSION_PATCH_LEVEL 51
//****************** //******************
// Protocols // Protocols

View File

@ -505,7 +505,7 @@ boolean XN297_ReadPayload(uint8_t* msg, uint8_t len)
//process address //process address
for (uint8_t i = 0; i < xn297_addr_len; ++i) 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) if(xn297_scramble_enabled)
b_in ^= xn297_scramble[i]; b_in ^= xn297_scramble[i];
crc = crc16_update(crc, b_in, 8); 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) 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 buffer[32];
uint8_t pcf_size; // pcf payload size 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]; pcf_size = buffer[0];
if(xn297_scramble_enabled) if(xn297_scramble_enabled)
pcf_size ^= xn297_scramble[xn297_addr_len]; 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) | msg[i] ^= bit_reverse((xn297_scramble[xn297_addr_len+i+1] << 2) |
(xn297_scramble[xn297_addr_len+i+2] >> 6)); (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 // End of XN297 emulation

View File

@ -72,7 +72,6 @@ static void __attribute__((unused)) pelikan_build_packet()
packet[9]=upper?0xAA:0x00; packet[9]=upper?0xAA:0x00;
upper=!upper; upper=!upper;
//Hopping counters //Hopping counters
packet[11]=packet_count;
if(++packet_count>4) if(++packet_count>4)
{ {
packet_count=0; packet_count=0;
@ -80,6 +79,7 @@ static void __attribute__((unused)) pelikan_build_packet()
hopping_frequency_no=0; hopping_frequency_no=0;
} }
packet[10]=hopping_frequency_no; packet[10]=hopping_frequency_no;
packet[11]=packet_count;
packet_length = 15; packet_length = 15;
} }
@ -91,6 +91,15 @@ static void __attribute__((unused)) pelikan_build_packet()
packet[packet_length-1]=crc8; packet[packet_length-1]=crc8;
//Send //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;i<packet_length;i++)
debug(" %02X",packet[i]);
debugln("");
}
#endif
A7105_WriteData(packet_length, IS_BIND_IN_PROGRESS?PELIKAN_BIND_RF:hopping_frequency[hopping_frequency_no]); A7105_WriteData(packet_length, IS_BIND_IN_PROGRESS?PELIKAN_BIND_RF:hopping_frequency[hopping_frequency_no]);
A7105_SetPower(); A7105_SetPower();
} }
@ -139,8 +148,8 @@ uint16_t initPelikan()
for(uint8_t i=0;i<PELIKAN_NUM_RF_CHAN;i++) for(uint8_t i=0;i<PELIKAN_NUM_RF_CHAN;i++)
hopping_frequency[i]=pgm_read_byte_near(&pelikan_hopp[0][i]); hopping_frequency[i]=pgm_read_byte_near(&pelikan_hopp[0][i]);
hopping_frequency_no=0; hopping_frequency_no=PELIKAN_NUM_RF_CHAN;
packet_count=0; packet_count=5;
return 2400; return 2400;
} }
#endif #endif

View File

@ -31,15 +31,18 @@ Multiprotocol is distributed in the hope that it will be useful,
static uint8_t __attribute__((unused)) TIGER_convert_channel(uint8_t num) static uint8_t __attribute__((unused)) TIGER_convert_channel(uint8_t num)
{ {
uint8_t val=convert_channel_8b(num); uint8_t val=convert_channel_8b(num);
// 00=center, 01..7F=left, 80..FF=right // 7F..01=left, 00=center, 80..FF=right
if(val==80) if(val==0x80)
val=0; val=0; // 0
else else
if(val>80) if(val>0x80)
val--; val--; // 80..FE
else else
if(val==0) {
val++; val=0x80-val; // 80..01
if(val==0x80)
val--; // 7F..01
}
return val; return val;
} }
@ -49,9 +52,9 @@ static void __attribute__((unused)) TIGER_send_packet()
{ {
//Channels //Channels
packet[0]=convert_channel_8b(THROTTLE); // 00..FF packet[0]=convert_channel_8b(THROTTLE); // 00..FF
packet[1]=TIGER_convert_channel(RUDDER); // 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); // 00=center, 01..7F=down, 80..FF=up packet[2]=TIGER_convert_channel(ELEVATOR); // 7F..01=down, 00=center, 80..FF=up
packet[3]=TIGER_convert_channel(AILERON); // 00=center, 01..7F=left, 80..FF=right packet[3]=TIGER_convert_channel(AILERON); // 7F..01=left, 00=center, 80..FF=right
//Flags //Flags
packet[14]= GET_FLAG(CH5_SW, 0x04) //FLIP packet[14]= GET_FLAG(CH5_SW, 0x04) //FLIP
| GET_FLAG(CH6_SW, 0x10); //LIGHT | GET_FLAG(CH6_SW, 0x10); //LIGHT

View File

@ -1282,6 +1282,8 @@ Start/Stop|EMERGENCY|CAMERA_UP/DN
## Tiger - *61* ## Tiger - *61*
Autobind protocol Autobind protocol
**Only 1 ID**
CH1|CH2|CH3|CH4|CH5|CH6 CH1|CH2|CH3|CH4|CH5|CH6
---|---|---|---|---|--- ---|---|---|---|---|---
A|E|T|R|FLIP|LIGHT A|E|T|R|FLIP|LIGHT