diff --git a/Multiprotocol/DSM2_cyrf6936.ino b/Multiprotocol/DSM2_cyrf6936.ino index e6769a6..928d24e 100644 --- a/Multiprotocol/DSM2_cyrf6936.ino +++ b/Multiprotocol/DSM2_cyrf6936.ino @@ -42,8 +42,7 @@ enum { DSM2_CH2_READ_B = BIND_COUNT1 + 10, }; - -const uint8_t pncodes[5][9][8] = { +const uint8_t PROGMEM pncodes[5][9][8] = { /* Note these are in order transmitted (LSB 1st) */ { /* Row 0 */ /* Col 0 */ {0x03, 0xBC, 0x6E, 0x8A, 0xEF, 0xBD, 0xFE, 0xF8}, @@ -102,6 +101,12 @@ const uint8_t pncodes[5][9][8] = { }, }; +static void __attribute__((unused)) read_code(uint8_t *buf, uint8_t row, uint8_t col, uint8_t len) +{ + for(uint8_t i=0;i. - */ +/* ************************** + * By Midelic on RCGroups * + ************************** + This project is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Multiprotocol is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Multiprotocol. If not, see . +*/ #if defined(FRSKYX_CC2500_INO) + + #include "iface_cc2500.h" + + uint8_t chanskip; + uint8_t calData[48][3]; + uint8_t channr; + uint8_t pass_ = 1 ; + uint8_t counter_rst; + uint8_t ctr; + uint8_t FS_flag=0; + // uint8_t ptr[4]={0x01,0x12,0x23,0x30}; + //uint8_t ptr[4]={0x00,0x11,0x22,0x33}; + + const PROGMEM uint8_t hop_data[]={ + 0x02, 0xD4, 0xBB, 0xA2, 0x89, + 0x70, 0x57, 0x3E, 0x25, 0x0C, + 0xDE, 0xC5, 0xAC, 0x93, 0x7A, + 0x61, 0x48, 0x2F, 0x16, 0xE8, + 0xCF, 0xB6, 0x9D, 0x84, 0x6B, + 0x52, 0x39, 0x20, 0x07, 0xD9, + 0xC0, 0xA7, 0x8E, 0x75, 0x5C, + 0x43, 0x2A, 0x11, 0xE3, 0xCA, + 0xB1, 0x98, 0x7F, 0x66, 0x4D, + 0x34, 0x1B, 0x00, 0x1D, 0x03 + }; -#include "iface_cc2500.h" + uint8_t hop(uint8_t byte) + { + return pgm_read_byte_near(&hop_data[byte]); + } + uint16_t initFrSkyX() + { + while(!chanskip) + { + randomSeed((uint32_t)analogRead(A6) << 10 | analogRead(A7)); + chanskip=random(0xfefefefe)%47; + } + while((chanskip-ctr)%4) + ctr=(ctr+1)%4; + + counter_rst=(chanskip-ctr)>>2; + //for test*************** + //rx_tx_addr[3]=0xB3; + //rx_tx_addr[2]=0xFD; + //************************ + frskyX_init(); + // + if(IS_AUTOBIND_FLAG_on) + { + state = FRSKY_BIND; + initialize_data(1); + } + else + { + state = FRSKY_DATA1; + initialize_data(0); + } + return 10000; + } + + uint16_t ReadFrSkyX() + { + switch(state) + { + default: + set_start(47); + CC2500_SetPower(); + cc2500_strobe(CC2500_SFRX); + // + frskyX_build_bind_packet(); + cc2500_strobe(CC2500_SIDLE); + cc2500_writeFifo(packet, packet[0]+1); + state++; + return 9000; + case FRSKY_BIND_DONE: + initialize_data(0); + channr=0; + BIND_DONE; + state++; + break; + case FRSKY_DATA1: + LED_ON; + CC2500_SetTxRxMode(TX_EN); + set_start(channr); + CC2500_SetPower(); + cc2500_strobe(CC2500_SFRX); + channr = (channr+chanskip)%47; + cc2500_strobe(CC2500_SIDLE); + cc2500_writeFifo(packet, packet[0]+1); + // + frskyX_data_frame(); + state++; + return 5500; + case FRSKY_DATA2: + CC2500_SetTxRxMode(RX_EN); + cc2500_strobe(CC2500_SIDLE); + state++; + return 200; + case FRSKY_DATA3: + cc2500_strobe(CC2500_SRX); + state++; + return 3000; + case FRSKY_DATA4: + len = cc2500_readReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; + if (len &&(len>8) & 0x0F)|(chan_1 << 4))); + packet[9+i+2]=crc_Byte(chan_1>>4); + } + //packet[21]=crc_Byte(0x08);//first + packet[21]=crc_Byte(0x80);//??? when received first telemetry frame is changed to 0x80 + //packet[21]=crc_Byte(ptr[p]);//??? + //p=(p+1)%4;//repeating 4 bytes sequence pattern every 4th frame. + + pass_=lpass+1; + + for (uint8_t i=22;i<28;i++) + packet[i]=crc_Byte(0); + + packet[28]=highByte(crc); + packet[29]=lowByte(crc); + } -#endif + uint16_t scaleForPXX( uint8_t i ) + { //mapped 860,2140(125%) range to 64,1984(PXX values); + return (uint16_t)(((Servo_data[i]-PPM_MIN)*3)>>1)+64; + } + + uint8_t crc_Byte( uint8_t byte ) + { + crc = (crc<<8) ^ pgm_read_word(&CRCTable[((uint8_t)(crc>>8) ^ byte) & 0xFF]); + return byte; + } +#endif \ No newline at end of file diff --git a/Multiprotocol/FrSky_cc2500.ino b/Multiprotocol/FrSky_cc2500.ino index dae03c7..f3c6d3c 100644 --- a/Multiprotocol/FrSky_cc2500.ino +++ b/Multiprotocol/FrSky_cc2500.ino @@ -20,7 +20,6 @@ //##########Variables######## //uint32_t state; //uint8_t len; -uint8_t telemetry_counter=0; /* enum { @@ -128,8 +127,6 @@ static void __attribute__((unused)) frsky2way_build_bind_packet() packet[17] = 0x01; } - - static void __attribute__((unused)) frsky2way_data_frame() {//pachet[4] is telemetry user frame counter(hub) //11 d7 2d 22 00 01 c9 c9 ca ca 88 88 ca ca c9 ca 88 88 @@ -138,7 +135,11 @@ static void __attribute__((unused)) frsky2way_data_frame() packet[1] = rx_tx_addr[3]; packet[2] = rx_tx_addr[2]; packet[3] = counter;// - packet[4]=telemetry_counter; + #if defined TELEMETRY + packet[4] = telemetry_counter; + #else + packet[4] = 0x00; + #endif packet[5] = 0x01; // diff --git a/Multiprotocol/MT99xx_nrf24l01.ino b/Multiprotocol/MT99xx_nrf24l01.ino index ab4c825..51415b7 100644 --- a/Multiprotocol/MT99xx_nrf24l01.ino +++ b/Multiprotocol/MT99xx_nrf24l01.ino @@ -37,29 +37,16 @@ enum{ FLAG_MT_FLIP = 0x80, }; -enum{ - // flags going to ?????? (Yi Zhan i6S)ROLL - BLABLA, -}; - enum { MT99XX_INIT = 0, MT99XX_BIND, MT99XX_DATA }; -static uint8_t __attribute__((unused)) MT99XX_calcChecksum() -{ - uint8_t result=checksum_offset; - for(uint8_t i=0; i<8; i++) - result += packet[i]; - return result; -} - static void __attribute__((unused)) MT99XX_send_packet() { - static const uint8_t yz_p4_seq[] = {0xa0, 0x20, 0x60}; - static const uint8_t mys_byte[] = { + const uint8_t yz_p4_seq[] = {0xa0, 0x20, 0x60}; + const uint8_t mys_byte[] = { 0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17, 0x00, 0x10 }; @@ -71,8 +58,8 @@ static void __attribute__((unused)) MT99XX_send_packet() packet[1] = convert_channel_8b_scale(RUDDER ,0x00,0xE1); // rudder packet[2] = convert_channel_8b_scale(AILERON ,0x00,0xE1); // aileron packet[3] = convert_channel_8b_scale(ELEVATOR,0x00,0xE1); // elevator - packet[4] = convert_channel_8b_scale(AUX5,0x00,0x3F); // pitch trim (0x3f-0x20-0x00) - packet[5] = convert_channel_8b_scale(AUX6,0x00,0x3F); // roll trim (0x00-0x20-0x3f) + packet[4] = 0x20; // pitch trim (0x3f-0x20-0x00) + packet[5] = 0x20; // roll trim (0x00-0x20-0x3f) packet[6] = GET_FLAG( Servo_AUX1, FLAG_MT_FLIP ) | GET_FLAG( Servo_AUX3, FLAG_MT_SNAPSHOT ) | GET_FLAG( Servo_AUX4, FLAG_MT_VIDEO ); @@ -84,7 +71,10 @@ static void __attribute__((unused)) MT99XX_send_packet() // low nibble: index in chan list ? // high nibble: 0->start from start of list, 1->start from end of list ? packet[7] = mys_byte[hopping_frequency_no]; - packet[8] = MT99XX_calcChecksum(); + uint8_t result=checksum_offset; + for(uint8_t i=0; i<8; i++) + result += packet[i]; + packet[8] = result; } else { // YZ @@ -100,8 +90,12 @@ static void __attribute__((unused)) MT99XX_send_packet() packet_count=0; } packet[4] = yz_p4_seq[yz_seq_num]; - packet[5] = 0x02; // expert ? (0=unarmed, 1=normal) - packet[6] = 0x80; + packet[5] = 0x02 // expert ? (0=unarmed, 1=normal) + | GET_FLAG(Servo_AUX4, 0x10) //VIDEO + | GET_FLAG(Servo_AUX1, 0x80) //FLIP + | GET_FLAG(Servo_AUX5, 0x04) //HEADLESS + | GET_FLAG(Servo_AUX3, 0x20); //SNAPSHOT + packet[6] = GET_FLAG(Servo_AUX2, 0x80); //LED packet[7] = packet[0]; for(uint8_t idx = 1; idx < MT99XX_PACKET_SIZE-2; idx++) packet[7] += packet[idx]; @@ -138,6 +132,9 @@ static void __attribute__((unused)) MT99XX_init() else NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps NRF24L01_SetPower(); + + XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP) | (sub_protocol == YZ ? BV(XN297_UNSCRAMBLED):0) ); + XN297_SetTXAddr((uint8_t *)"\0xCC\0xCC\0xCC\0xCC\0xCC", 5); } @@ -210,8 +207,8 @@ uint16_t initMT99XX(void) packet[2] = 0x05; packet[3] = 0x06; } - packet[4] = rx_tx_addr[0]; // 1th byte for data state tx address - packet[5] = rx_tx_addr[1]; // 2th byte for data state tx address (always 0x00 on Yi Zhan ?) + packet[4] = rx_tx_addr[0]; // 1st byte for data state tx address + packet[5] = rx_tx_addr[1]; // 2nd byte for data state tx address (always 0x00 on Yi Zhan ?) packet[6] = 0x00; // 3th byte for data state tx address (always 0x00 ?) packet[7] = checksum_offset; // checksum offset packet[8] = 0xAA; // fixed diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index b76d74f..38c23aa 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -47,7 +47,7 @@ uint8_t Servo_AUX; // PPM variable volatile uint16_t PPM_data[NUM_CHN]; -// NRF variables +// Protocol variables uint8_t rx_tx_addr[5]; uint8_t phase; uint16_t bind_counter; @@ -64,6 +64,7 @@ uint8_t hopping_frequency_no=0; uint8_t rf_ch_num; uint8_t throttle, rudder, elevator, aileron; uint8_t flags; +uint16_t crc; // uint32_t state; uint8_t len; @@ -91,13 +92,14 @@ uint8_t prev_protocol=0; #define MAX_PKT 27 uint8_t pkt[MAX_PKT];//telemetry receiving packets #if defined(TELEMETRY) -uint8_t pktt[MAX_PKT];//telemetry receiving packets -volatile uint8_t tx_head; -volatile uint8_t tx_tail; -uint8_t v_lipo; -int16_t RSSI_dBm; -//const uint8_t RSSI_offset=72;//69 71.72 values db -uint8_t telemetry_link=0; + uint8_t pktt[MAX_PKT];//telemetry receiving packets + volatile uint8_t tx_head; + volatile uint8_t tx_tail; + uint8_t v_lipo; + int16_t RSSI_dBm; + //const uint8_t RSSI_offset=72;//69 71.72 values db + uint8_t telemetry_link=0; + uint8_t telemetry_counter=0; #endif // Callback diff --git a/Multiprotocol/NRF24l01_SPI.ino b/Multiprotocol/NRF24l01_SPI.ino index c14f5d5..cec1439 100644 --- a/Multiprotocol/NRF24l01_SPI.ino +++ b/Multiprotocol/NRF24l01_SPI.ino @@ -257,6 +257,7 @@ uint8_t NRF24L01_packet_ack() /////////////// // XN297 emulation layer +uint8_t xn297_scramble_enabled; uint8_t xn297_addr_len; uint8_t xn297_tx_addr[5]; uint8_t xn297_rx_addr[5]; @@ -269,9 +270,16 @@ static const uint8_t xn297_scramble[] = { 0x1b, 0x5d, 0x19, 0x10, 0x24, 0xd3, 0xdc, 0x3f, 0x8e, 0xc5, 0x2f}; -static const uint16_t xn297_crc_xorout[] = { - 0x0000, 0x3448, 0x9BA7, 0x8BBB, 0x85E1, 0x3E8C, // 1st entry is missing, probably never needed - 0x451E, 0x18E6, 0x6B24, 0xE7AB, 0x3828, 0x814B, // it's used for 3-byte address w/ 0 byte payload only +const uint16_t PROGMEM xn297_crc_xorout[] = { + 0x0000, 0x3d5f, 0xa6f1, 0x3a23, 0xaa16, 0x1caf, + 0x62b2, 0xe0eb, 0x0821, 0xbe07, 0x5f1a, 0xaf15, + 0x4f0a, 0xad24, 0x5e48, 0xed34, 0x068c, 0xf2c9, + 0x1852, 0xdf36, 0x129d, 0xb17c, 0xd5f5, 0x70d7, + 0xb798, 0x5133, 0x67db, 0xd94e}; + +const uint16_t PROGMEM xn297_crc_xorout_scrambled[] = { + 0x0000, 0x3448, 0x9BA7, 0x8BBB, 0x85E1, 0x3E8C, + 0x451E, 0x18E6, 0x6B24, 0xE7AB, 0x3828, 0x814B, 0xD461, 0xF494, 0x2503, 0x691D, 0xFE8B, 0x9BA7, 0x8B17, 0x2920, 0x8B5F, 0x61B1, 0xD391, 0x7401, 0x2138, 0x129F, 0xB3A0, 0x2988}; @@ -327,16 +335,21 @@ void XN297_SetRXAddr(const uint8_t* addr, uint8_t len) memcpy(buf, addr, len); memcpy(xn297_rx_addr, addr, len); for (uint8_t i = 0; i < xn297_addr_len; ++i) - buf[i] = xn297_rx_addr[i] ^ xn297_scramble[xn297_addr_len-i-1]; + { + buf[i] = xn297_rx_addr[i]; + if(xn297_scramble_enabled) + buf[i] ^= xn297_scramble[xn297_addr_len-i-1]; + } NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, len-2); NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, buf, 5); } -void XN297_Configure(uint8_t flags) +void XN297_Configure(uint16_t flags) { + xn297_scramble_enabled = !(flags & BV(XN297_UNSCRAMBLED)); xn297_crc = !!(flags & BV(NRF24L01_00_EN_CRC)); flags &= ~(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO)); - NRF24L01_WriteReg(NRF24L01_00_CONFIG, flags); + NRF24L01_WriteReg(NRF24L01_00_CONFIG, flags & 0xFF); } void XN297_WritePayload(uint8_t* msg, uint8_t len) @@ -352,12 +365,20 @@ void XN297_WritePayload(uint8_t* msg, uint8_t len) buf[last++] = 0x55; } for (uint8_t i = 0; i < xn297_addr_len; ++i) - buf[last++] = xn297_tx_addr[xn297_addr_len-i-1] ^ xn297_scramble[i]; - - for (uint8_t i = 0; i < len; ++i) { + { + buf[last] = xn297_tx_addr[xn297_addr_len-i-1]; + if(xn297_scramble_enabled) + buf[last] ^= xn297_scramble[i]; + last++; + } + for (uint8_t i = 0; i < len; ++i) + { // bit-reverse bytes in packet uint8_t b_out = bit_reverse(msg[i]); - buf[last++] = b_out ^ xn297_scramble[xn297_addr_len+i]; + buf[last] = b_out; + if(xn297_scramble_enabled) + buf[last] ^= xn297_scramble[xn297_addr_len+i]; + last++; } if (xn297_crc) { @@ -365,7 +386,10 @@ void XN297_WritePayload(uint8_t* msg, uint8_t len) uint16_t crc = 0xb5d2; for (uint8_t i = offset; i < last; ++i) crc = crc16_update(crc, buf[i]); - crc ^= xn297_crc_xorout[xn297_addr_len - 3 + len]; + if(xn297_scramble_enabled) + crc ^= pgm_read_word(&xn297_crc_xorout_scrambled[xn297_addr_len - 3 + len]); + else + crc ^= pgm_read_word(&xn297_crc_xorout[xn297_addr_len - 3 + len]); buf[last++] = crc >> 8; buf[last++] = crc & 0xff; } @@ -374,9 +398,14 @@ void XN297_WritePayload(uint8_t* msg, uint8_t len) void XN297_ReadPayload(uint8_t* msg, uint8_t len) { + // TODO: if xn297_crc==1, check CRC before filling *msg NRF24L01_ReadPayload(msg, len); for(uint8_t i=0; i>5); - if(pktt[len-2] >=128) - RSSI_dBm -= 82; - else - RSSI_dBm += 65; -} - -void frsky_check_telemetry(uint8_t *pkt,uint8_t len) -{ - if(pkt[1] != rx_tx_addr[3] || pkt[2] != rx_tx_addr[2] || len != pkt[0] + 3) - {//only packets with the required id and packet length - for(uint8_t i=3;i<6;i++) - pktt[i]=0; - return; - } - else - { - for (uint8_t i=3;i0) - telemetry_counter=(telemetry_counter+1)%32; - } -} - -void frsky_link_frame() -{ - frame[0] = 0xFE; - if ((cur_protocol[0]&0x1F)==MODE_FRSKY) - { - compute_RSSIdbm(); - frame[1] = pktt[3]; - frame[2] = pktt[4]; - frame[3] = (uint8_t)RSSI_dBm; - frame[4] = pktt[5]*2; - } - else - if ((cur_protocol[0]&0x1F)==MODE_HUBSAN) - { - frame[1] = v_lipo*2; //v_lipo; common 0x2A=42/10=4.2V - frame[2] = frame[1]; - frame[3] = 0x00; - frame[4] = (uint8_t)RSSI_dBm; - } - frame[5] = frame[6] = frame[7] = frame[8] = 0; - frskySendStuffed(); -} - -#if defined HUB_TELEMETRY -void frsky_user_frame() -{ - uint8_t indexx = 0, c=0, j=8, n=0, i; - - if(pktt[6]>0 && pktt[6]<=MAX_PKTX) - {//only valid hub frames - frame[0] = 0xFD; - frame[1] = 0; - frame[2] = pktt[7]; + + void compute_RSSIdbm(){ - switch(pass) - { - case 0: - indexx=pktt[6]; - for(i=0;i>5); + if(pktt[len-2] >=128) + RSSI_dBm -= 82; + else + RSSI_dBm += 65; + } + + void frsky_check_telemetry(uint8_t *pkt,uint8_t len) + { + if(pkt[1] != rx_tx_addr[3] || pkt[2] != rx_tx_addr[2] || len != pkt[0] + 3) + {//only packets with the required id and packet length + for(uint8_t i=3;i<6;i++) + pktt[i]=0; return; - frame[1] = index; + } + else + { + for (uint8_t i=3;i0) + telemetry_counter=(telemetry_counter+1)%32; + } + } + + void frsky_link_frame() + { + frame[0] = 0xFE; + if ((cur_protocol[0]&0x1F)==MODE_FRSKY) + { + compute_RSSIdbm(); + frame[1] = pktt[3]; + frame[2] = pktt[4]; + frame[3] = (uint8_t)RSSI_dBm; + frame[4] = pktt[5]*2; + } + else + if ((cur_protocol[0]&0x1F)==MODE_HUBSAN) + { + frame[1] = v_lipo*2; //v_lipo; common 0x2A=42/10=4.2V + frame[2] = frame[1]; + frame[3] = 0x00; + frame[4] = (uint8_t)RSSI_dBm; + } + frame[5] = frame[6] = frame[7] = frame[8] = 0; frskySendStuffed(); } - else - pass=0; -} -#endif - -void frskyUpdate() -{ - if(telemetry_link) - { - frsky_link_frame(); - telemetry_link=0; - return; - } + #if defined HUB_TELEMETRY - if(!telemetry_link && (cur_protocol[0]&0x1F) != MODE_HUBSAN ) - frsky_user_frame(); + void frsky_user_frame() + { + uint8_t indexx = 0, c=0, j=8, n=0, i; + + if(pktt[6]>0 && pktt[6]<=MAX_PKTX) + {//only valid hub frames + frame[0] = 0xFD; + frame[1] = 0; + frame[2] = pktt[7]; + + switch(pass) + { + case 0: + indexx=pktt[6]; + for(i=0;i0) + { + crc_s += p[i]; //0-1FF + crc_s += crc_s >> 8; //0-100 + crc_s &= 0x00ff; + } + } + } + + void sportIdle() + { + Serial_write(0x7e); + } + void sportSendFrame() + { + //at the moment only SWR RSSI,RxBt and A2. + sport_counter = (sport_counter + 1) %9; + + for (uint8_t i=5;i<8;i++) + frame[i]=0; + + switch (sport_counter) + { + case 0: // SWR + frame[0] = 0x98; + frame[1] = 0x10; + frame[2] = 0x05; + frame[3] = 0xf1; + frame[4] = 0x20;//dummy values if swr 20230f00 + frame[5] = 0x23; + frame[6] = 0x0F; + frame[7] = 0x00; + break; + case 1: // RSSI + frame[0] = 0x98; + frame[1] = 0x10; + frame[2] = 0x01; + frame[3] = 0xf1; + frame[4] = rssi; + break; + case 2: //BATT + frame[0] = 0x98; + frame[1] = 0x10; + frame[2] = 0x04; + frame[3] = 0xf1; + frame[4] = RxBt;//a1; + break; + case 3: //ADC2(A2) + frame[0] = 0x1A; + frame[1] = 0x10; + frame[2] = 0x03; + frame[3] = 0xf1; + frame[4] = ADC2;//a2;; + break; + default: + sportIdle(); + return; + } + sportSend(frame); + } + + void process_sport_data()//only for ADC2 + { + uint8_t j=7; + if(pktt[6]>0 && pktt[6]<=USER_MAX_BYTES) + { + for(uint8_t i=0;i<6;i++) + if(pktt[j++]==0x03) + if(pktt[j]==0xF1) + { + ADC2=pktt[j+1]; + break; + } + pktt[6]=0;//new frame + } + } + #endif + + + void frskyUpdate() + { + if(telemetry_link && (cur_protocol[0]&0x1F) != MODE_FRSKYX ) + { + frsky_link_frame(); + telemetry_link=0; + return; + } + #if defined HUB_TELEMETRY + if(!telemetry_link && (cur_protocol[0]&0x1F) != MODE_HUBSAN && (cur_protocol[0]&0x1F) != MODE_FRSKYX) + { + frsky_user_frame(); + return; + } + #endif + #if defined SPORT_TELEMETRY + if ((cur_protocol[0]&0x1F)==MODE_FRSKYX) + { + if(telemetry_link) + { + process_sport_data(); + if(pktt[4]>0x36) + rssi=pktt[4]/2; + else + RxBt=pktt[4]; + telemetry_link=0; + } + uint32_t now = micros(); + if ((now - last) > SPORT_TIME) + { + sportSendFrame(); + last = now; + } + } + #endif + } + #endif \ No newline at end of file diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index f76d79e..83bf3ec 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -23,31 +23,40 @@ //Uncomment to enable telemetry #define TELEMETRY -#define HUB_TELEMETRY + +//Comment if a module is not installed +#define A7105_INSTALLED +#define CYRF6936_INSTALLED +#define CC2500_INSTALLED +#define NFR24L01_INSTALLED //Comment a protocol to exclude it from compilation -//A7105 protocols -#define FLYSKY_A7105_INO -#define HUBSAN_A7105_INO -//CYRF6936 protocols -#define DEVO_CYRF6936_INO -#define DSM2_CYRF6936_INO -//CC2500 protocols -#define FRSKY_CC2500_INO -//#define FRSKYX_CC2500_INO -//NFR24L01 protocols -#define BAYANG_NRF24L01_INO -#define CG023_NRF24L01_INO -#define CX10_NRF24L01_INO -#define ESKY_NRF24L01_INO -#define HISKY_NRF24L01_INO -#define KN_NRF24L01_INO -#define SLT_NRF24L01_INO -#define SYMAX_NRF24L01_INO -#define V2X2_NRF24L01_INO -#define YD717_NRF24L01_INO -#define MT99XX_NRF24L01_INO -#define MJXQ_NRF24L01_INO +#ifdef A7105_INSTALLED + #define FLYSKY_A7105_INO + #define HUBSAN_A7105_INO +#endif +#ifdef CYRF6936_INSTALLED + #define DEVO_CYRF6936_INO + #define DSM2_CYRF6936_INO +#endif +#ifdef CC2500_INSTALLED + #define FRSKY_CC2500_INO + #define FRSKYX_CC2500_INO +#endif +#ifdef NFR24L01_INSTALLED + #define BAYANG_NRF24L01_INO + #define CG023_NRF24L01_INO + #define CX10_NRF24L01_INO + #define ESKY_NRF24L01_INO + #define HISKY_NRF24L01_INO + #define KN_NRF24L01_INO + #define SLT_NRF24L01_INO + #define SYMAX_NRF24L01_INO + #define V2X2_NRF24L01_INO + #define YD717_NRF24L01_INO + #define MT99XX_NRF24L01_INO + #define MJXQ_NRF24L01_INO +#endif //Update this table to set which protocol and all associated settings are called for the corresponding dial number static const PPM_Parameters PPM_prot[15]= diff --git a/Multiprotocol/iface_nrf24l01.h b/Multiprotocol/iface_nrf24l01.h index 1acf438..92ff9e1 100644 --- a/Multiprotocol/iface_nrf24l01.h +++ b/Multiprotocol/iface_nrf24l01.h @@ -102,18 +102,7 @@ enum { #define REUSE_TX_PL 0xE3 //#define NOP 0xFF -/* -void NRF24L01_Initialize(); -byte NRF24L01_WriteReg(byte reg, byte data); -byte NRF24L01_WriteRegisterMulti(byte reg, byte data[], byte length); -byte NRF24L01_WritePayload(byte *data, byte len); -byte NRF24L01_ReadReg(byte reg); -byte NRF24L01_ReadRegisterMulti(byte reg, byte data[], byte length); -byte NRF24L01_ReadPayload(byte *data, byte len); +// XN297 emulation layer +#define XN297_UNSCRAMBLED 8 -byte NRF24L01_FlushTx(); -byte NRF24L01_FlushRx(); -byte NRF24L01_Activate(byte code); - -*/ #endif \ No newline at end of file diff --git a/Multiprotocol/multiprotocol.h b/Multiprotocol/multiprotocol.h index 3f735e5..ec6e437 100644 --- a/Multiprotocol/multiprotocol.h +++ b/Multiprotocol/multiprotocol.h @@ -353,41 +353,40 @@ enum { //******************* const uint16_t PROGMEM CRCTable[]= { - 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, - 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7, - 0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e, - 0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876, - 0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd, - 0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5, - 0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c, - 0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974, - 0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb, - 0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3, - 0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a, - 0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72, - 0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9, - 0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1, - 0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738, - 0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70, - 0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7, - 0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff, - 0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036, - 0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e, - 0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5, - 0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd, - 0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134, - 0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c, - 0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3, - 0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb, - 0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232, - 0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a, - 0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1, - 0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9, - 0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330, - 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78 + 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, + 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7, + 0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e, + 0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876, + 0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd, + 0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5, + 0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c, + 0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974, + 0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb, + 0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3, + 0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a, + 0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72, + 0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9, + 0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1, + 0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738, + 0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70, + 0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7, + 0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff, + 0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036, + 0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e, + 0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5, + 0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd, + 0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134, + 0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c, + 0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3, + 0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb, + 0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232, + 0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a, + 0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1, + 0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9, + 0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330, + 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78 }; - //**************************************** //*** MULTI protocol serial definition *** //****************************************