diff --git a/Multiprotocol/E010R5_cyrf6936.ino b/Multiprotocol/E010R5_cyrf6936.ino index ec774a3..115c3bb 100644 --- a/Multiprotocol/E010R5_cyrf6936.ino +++ b/Multiprotocol/E010R5_cyrf6936.ino @@ -19,17 +19,6 @@ #define E010R5_FORCE_ID -static uint8_t __attribute__((unused)) E010R5_BR(uint8_t byte) -{ - uint8_t result = 0; - for(uint8_t i=0;i<8;i++) - { - result = (result<<1) | (byte & 0x01); - byte >>= 1; - } - return result; -} - static void __attribute__((unused)) E010R5_build_data_packet() { uint8_t buf[16]; @@ -44,10 +33,13 @@ static void __attribute__((unused)) E010R5_build_data_packet() buf[ 6] = 0x20; // Trim Elevator buf[ 7] = 0x20; // Trim Aileron buf[ 8] = 0x01 // Flags: high=0x01, low=0x00 - | GET_FLAG(CH6_SW, 0x10) // headless=0x10 - | GET_FLAG(CH7_SW, 0x20); // one key return=0x20 + | GET_FLAG(CH5_SW, 0x04) // flip=0x04 + | GET_FLAG(CH6_SW, 0x08) // led=0x08 + | GET_FLAG(CH8_SW, 0x10) // headless=0x10 + | GET_FLAG(CH9_SW, 0x20); // one key return=0x20 buf[ 9] = IS_BIND_IN_PROGRESS ? 0x80 : 0x00 // Flags: bind=0x80 - | GET_FLAG(CH5_SW, 0x01); // flip=0x01 + | GET_FLAG(CH7_SW, 0x20) // calib=0x20 + | GET_FLAG(CH10_SW, 0x01); // strange effect=0x01=long press on right button buf[10] = rx_tx_addr[0]; buf[11] = rx_tx_addr[1]; buf[12] = rx_tx_addr[2]; @@ -58,9 +50,9 @@ static void __attribute__((unused)) E010R5_build_data_packet() //Add CRC crc=0x00; for(uint8_t i=0;i<14;i++) - crc=crc16_update(crc,E010R5_BR(buf[i]),8); - buf[14] = E010R5_BR(crc>>8); - buf[15] = E010R5_BR(crc); + crc16_update(bit_reverse(buf[i]),8); + buf[14] = bit_reverse(crc>>8); + buf[15] = bit_reverse(crc); #if 0 debug("B:"); @@ -96,7 +88,7 @@ static void __attribute__((unused)) E010R5_build_data_packet() //CYRF wants LSB first for(uint8_t i=0;i<71;i++) - packet[i]=E010R5_BR(packet[i]); + packet[i]=bit_reverse(packet[i]); } const uint8_t PROGMEM E010R5_init_vals[][2] = { @@ -109,7 +101,7 @@ const uint8_t PROGMEM E010R5_init_vals[][2] = { {CYRF_1B_TX_OFFSET_LSB, 0x00}, // Tx frequency offset LSB {CYRF_1C_TX_OFFSET_MSB, 0x00}, // Tx frequency offset MSB {CYRF_0F_XACT_CFG, 0x24}, // Force End State, transaction end state = idle - {CYRF_03_TX_CFG, 0x00 | 7}, // GFSK mode, PA = +4 dBm + {CYRF_03_TX_CFG, 0x00}, // GFSK mode {CYRF_12_DATA64_THOLD, 0x0a}, // 64 Chip Data PN Code Correlator Threshold = 10 {CYRF_0F_XACT_CFG, 0x04}, // Transaction End State = idle {CYRF_39_ANALOG_CTRL, 0x01}, // synth setting time for all channels is the same as for slow channels @@ -118,7 +110,7 @@ const uint8_t PROGMEM E010R5_init_vals[][2] = { {CYRF_12_DATA64_THOLD, 0x0a}, //set pn correlation threshold {CYRF_10_FRAMING_CFG, 0x4a}, //set sop len and threshold {CYRF_29_RX_ABORT, 0x0f}, //Clear RX abort? - {CYRF_03_TX_CFG, 0x00 | 4}, // GFSK mode, set power (0-7) + {CYRF_03_TX_CFG, 0x00}, // GFSK mode {CYRF_10_FRAMING_CFG, 0x4a}, // 0b11000000 //set sop len and threshold {CYRF_1F_TX_OVERRIDE, 0x04}, //disable tx CRC {CYRF_1E_RX_OVERRIDE, 0x14}, //disable rx crc @@ -177,6 +169,7 @@ uint16_t ReadE010R5() rf_ch_num = hopping_frequency[hopping_frequency_no]; CYRF_ConfigRFChannel(rf_ch_num); debugln("%d",hopping_frequency[hopping_frequency_no]); + CYRF_SetPower(0x00); packet_count = 0; case 3: E010R5_build_data_packet(); diff --git a/Multiprotocol/E016HV2_cc2500.ino b/Multiprotocol/E016HV2_cc2500.ino index c139df4..ea29319 100644 --- a/Multiprotocol/E016HV2_cc2500.ino +++ b/Multiprotocol/E016HV2_cc2500.ino @@ -115,7 +115,7 @@ static void __attribute__((unused)) E016HV2_send_packet() uint8_t byte = (bit_reverse(packet[i])<<1) | (packet[i+1]&0x01); debug(" %02X",byte) CC2500_WriteReg(CC2500_3F_TXFIFO,byte); - crc=crc16_update(crc, byte, 8); + crc16_update(byte, 8); } // crc diff --git a/Multiprotocol/FQ777_nrf24l01.ino b/Multiprotocol/FQ777_nrf24l01.ino index 8bc7526..728f86b 100644 --- a/Multiprotocol/FQ777_nrf24l01.ino +++ b/Multiprotocol/FQ777_nrf24l01.ino @@ -58,11 +58,12 @@ static void __attribute__((unused)) ssv_pack_dpl(uint8_t addr[], uint8_t pid, ui uint16_t val; } crc; - crc.val=0x3c18; + crc=0x3c18; for (i = 0; i < 7; ++i) - crc.val=crc16_update(crc.val,header[i],8); + crc16_update(header[i],8); for (i = 0; i < *len; ++i) - crc.val=crc16_update(crc.val,payload[i],8); + crc16_update(payload[i],8); + crc.val=crc; // encode payload and crc // xor with this: diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index ec64bd6..036059b 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 1 -#define VERSION_PATCH_LEVEL 98 +#define VERSION_PATCH_LEVEL 99 //****************** // Protocols diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index b96613c..3d727dc 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -112,7 +112,9 @@ uint8_t rf_ch_num; uint8_t throttle, rudder, elevator, aileron; uint8_t flags; uint16_t crc; +uint16_t crc16_polynomial; uint8_t crc8; +uint8_t crc8_polynomial; uint16_t seed; uint16_t failsafe_count; uint16_t state; @@ -1094,6 +1096,8 @@ static void protocol_init() next_callback=0; // Default is immediate call back LED_off; // Led off during protocol init modules_reset(); // Reset all modules + crc16_polynomial = 0x1021; // Default CRC crc16_polynomial + crc8_polynomial = 0x31; // Default CRC crc8_polynomial // reset telemetry #ifdef TELEMETRY @@ -2433,6 +2437,37 @@ static void __attribute__((unused)) calc_fh_channels(uint8_t num_ch) } } +static uint8_t __attribute__((unused)) bit_reverse(uint8_t b_in) +{ + uint8_t b_out = 0; + for (uint8_t i = 0; i < 8; ++i) + { + b_out = (b_out << 1) | (b_in & 1); + b_in >>= 1; + } + return b_out; +} + +static void __attribute__((unused)) crc16_update(uint8_t a, uint8_t bits) +{ + crc ^= a << 8; + while(bits--) + if (crc & 0x8000) + crc = (crc << 1) ^ crc16_polynomial; + else + crc = crc << 1; +} + +static void __attribute__((unused)) crc8_update(uint8_t byte) +{ + crc8 = crc8 ^ byte; + for ( uint8_t j = 0; j < 8; j++ ) + if ( crc8 & 0x80 ) + crc8 = (crc8<<1) ^ crc8_polynomial; + else + crc8 <<= 1; +} + /**************************/ /**************************/ /** Interrupt routines **/ diff --git a/Multiprotocol/NCC1701_nrf24l01.ino b/Multiprotocol/NCC1701_nrf24l01.ino index a9feabf..1ae4101 100644 --- a/Multiprotocol/NCC1701_nrf24l01.ino +++ b/Multiprotocol/NCC1701_nrf24l01.ino @@ -62,7 +62,7 @@ static void __attribute__((unused)) NCC_Crypt_Packet() for(uint8_t i=0; i< NCC_TX_PACKET_LEN-2; i++) { packet[i]^=NCC_xor[i]; - crc=crc16_update(crc, packet[i], 8); + crc16_update(packet[i], 8); } crc^=0x60DE; packet[NCC_TX_PACKET_LEN-2]=crc>>8; @@ -74,7 +74,7 @@ static boolean __attribute__((unused)) NCC_Decrypt_Packet() debug("RX: "); for(uint8_t i=0; i< NCC_RX_PACKET_LEN-2; i++) { - crc=crc16_update(crc, packet[i], 8); + crc=crc16_update( packet[i], 8); packet[i]^=NCC_xor[i]; debug("%02X ",packet[i]); } diff --git a/Multiprotocol/NRF24l01_SPI.ino b/Multiprotocol/NRF24l01_SPI.ino index cdf81fb..8cc3e85 100644 --- a/Multiprotocol/NRF24l01_SPI.ino +++ b/Multiprotocol/NRF24l01_SPI.ino @@ -300,29 +300,6 @@ const uint16_t xn297_crc_xorout_enhanced[] = { 0xABFC, 0xE68E, 0x0DE7, 0x28A2, 0x1965 }; #endif -static uint8_t bit_reverse(uint8_t b_in) -{ - uint8_t b_out = 0; - for (uint8_t i = 0; i < 8; ++i) - { - b_out = (b_out << 1) | (b_in & 1); - b_in >>= 1; - } - return b_out; -} - -static const uint16_t polynomial = 0x1021; -static uint16_t crc16_update(uint16_t crc, uint8_t a, uint8_t bits) -{ - crc ^= a << 8; - while(bits--) - if (crc & 0x8000) - crc = (crc << 1) ^ polynomial; - else - crc = crc << 1; - return crc; -} - void XN297_SetTXAddr(const uint8_t* addr, uint8_t len) { if (len > 5) len = 5; @@ -403,7 +380,7 @@ void XN297_WritePayload(uint8_t* msg, uint8_t len) uint8_t offset = xn297_addr_len < 4 ? 1 : 0; uint16_t crc = 0xb5d2; for (uint8_t i = offset; i < last; ++i) - crc = crc16_update(crc, buf[i], 8); + crc16_update( buf[i], 8); if(xn297_scramble_enabled) crc ^= pgm_read_word(&xn297_crc_xorout_scrambled[xn297_addr_len - 3 + len]); else @@ -468,8 +445,8 @@ void XN297_WriteEnhancedPayload(uint8_t* msg, uint8_t len, uint8_t noack) uint8_t offset = xn297_addr_len < 4 ? 1 : 0; uint16_t crc = 0xb5d2; for (uint8_t i = offset; i < last; ++i) - crc = crc16_update(crc, packet[i], 8); - crc = crc16_update(crc, packet[last] & 0xc0, 2); + crc16_update( packet[i], 8); + crc16_update( packet[last] & 0xc0, 2); if (xn297_scramble_enabled) crc ^= pgm_read_word(&xn297_crc_xorout_scrambled_enhanced[xn297_addr_len-3+len]); //else @@ -512,11 +489,11 @@ boolean XN297_ReadPayload(uint8_t* msg, uint8_t len) 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); + crc16_update( b_in, 8); } //process payload for (uint8_t i = 0; i < len; ++i) - crc = crc16_update(crc, buf[i], 8); + crc16_update( buf[i], 8); //xorout if(xn297_scramble_enabled) crc ^= pgm_read_word(&xn297_crc_xorout_scrambled[xn297_addr_len - 3 + len]); @@ -559,12 +536,12 @@ uint8_t XN297_ReadEnhancedPayload(uint8_t* msg, uint8_t len) 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); + crc16_update( 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); + crc16_update( buffer[i], 8); + crc16_update( buffer[len+1] & 0xc0, 2); //xorout if (xn297_scramble_enabled) crc ^= pgm_read_word(&xn297_crc_xorout_scrambled_enhanced[xn297_addr_len-3+len]); @@ -606,9 +583,10 @@ void HS6200_SetTXAddr(const uint8_t* addr, uint8_t len) NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, (uint8_t*)"\xaa\xaa\xaa\xaa\xaa", 5); // precompute address crc - hs6200_crc_init = 0xffff; + crc = 0xffff; for(int i=0; i 0) - crc = crc16_update(crc, msg[pos+1], 1); + crc16_update(msg[pos+1], 1); return crc; } @@ -817,14 +795,14 @@ uint8_t LT8900_ReadPayload(uint8_t* msg, uint8_t len) //Check len if(LT8900_Flags&_BV(LT8900_PACKET_LENGTH_EN)) { - crc=crc16_update(crc,buffer[pos],8); + crc16_update(buffer[pos],8); if(bit_reverse(len)!=buffer[pos++]) return 0; // wrong len... } //Decode message for(i=0;i> 8; buf[last++] = crc & 0xff; buf[last++] = 0; diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index e44babf..6f7601c 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -312,7 +312,6 @@ #undef XK_NRF24L01_INO #undef YD717_NRF24L01_INO #undef ZSX_NRF24L01_INO - #undef E010R5_CYRF6936_INO // Use both CYRF and NRF code #endif #if not defined(STM32_BOARD) #undef SX1276_INSTALLED diff --git a/Protocols_Details.md b/Protocols_Details.md index cb84740..3622744 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -837,11 +837,11 @@ A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 ## E010R5 - *81* Models: E010 R5 red boards, JJRC H36 -**Only 1 ID available** +**Only 1 ID available**. More IDs can be added if you send me your "unused" original TX. -CH1|CH2|CH3|CH4|CH5|CH6|CH7 ----|---|---|---|---|---|--- -A|E|T|R|FLIP|HEADLESS|RTH +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10 +---|---|---|---|---|---|---|---|---|--- +A|E|T|R|FLIP|LED|CALIB|HEADLESS|RTH|UNK ## J6Pro - *22*