diff --git a/Multiprotocol/Convert.ino b/Multiprotocol/Convert.ino index edfc26e..944c3a0 100644 --- a/Multiprotocol/Convert.ino +++ b/Multiprotocol/Convert.ino @@ -140,3 +140,25 @@ uint16_t convert_channel_frsky(uint8_t num) uint16_t val=Channel_data[num]; return ((val*15)>>4)+1290; } + +// 0-2047, 0 = 817, 1024 = 1500, 2047 = 2182 +//64=860,1024=1500,1984=2140//Taranis 125% +static uint16_t __attribute__((unused)) FrSkyX_scaleForPXX( uint8_t i ) +{ //mapped 860,2140(125%) range to 64,1984(PXX values); + uint16_t chan_val=convert_channel_frsky(i)-1226; + if(i>7) chan_val|=2048; // upper channels offset + return chan_val; +} + +#ifdef FAILSAFE_ENABLE +static uint16_t __attribute__((unused)) FrSkyX_scaleForPXX_FS( uint8_t i ) +{ //mapped 1,2046(125%) range to 64,1984(PXX values); + uint16_t chan_val=((Failsafe_data[i]*15)>>4)+64; + if(Failsafe_data[i]==FAILSAFE_CHANNEL_NOPULSES) + chan_val=FAILSAFE_CHANNEL_NOPULSES; + else if(Failsafe_data[i]==FAILSAFE_CHANNEL_HOLD) + chan_val=FAILSAFE_CHANNEL_HOLD; + if(i>7) chan_val|=2048; // upper channels offset + return chan_val; +} +#endif diff --git a/Multiprotocol/FrSkyDVX_common.ino b/Multiprotocol/FrSkyDVX_common.ino index a827f87..34e6c06 100644 --- a/Multiprotocol/FrSkyDVX_common.ino +++ b/Multiprotocol/FrSkyDVX_common.ino @@ -142,7 +142,7 @@ void Frsky_init_hop(void) /*15_DEVIATN*/ 0x42 }; #endif - #if defined(FRSKYX_CC2500_INO) + #if defined(FRSKYX_CC2500_INO) || defined(FRSKYX2_CC2500_INO) const PROGMEM uint8_t FRSKYX_cc2500_conf[]= { //FRSKYX /*02_IOCFG0*/ 0x06 , @@ -222,8 +222,59 @@ void Frsky_init_hop(void) uint8_t val=pgm_read_byte_near(&FRSKY_common_end_cc2500_conf[i][1]); CC2500_WriteReg(reg,val); } + if(protocol==PROTO_FRSKYX2) + CC2500_WriteReg(CC2500_08_PKTCTRL0, 0x05); // enable CRC CC2500_SetTxRxMode(TX_EN); CC2500_SetPower(); CC2500_Strobe(CC2500_SIDLE); // Go to idle... } #endif + +#if defined(FRSKYX_CC2500_INO) || defined(FRSKYX2_CC2500_INO) +uint8_t FrSkyX_chanskip; +uint8_t FrSkyX_TX_Seq, FrSkyX_TX_IN_Seq; +uint8_t FrSkyX_RX_Seq ; + +#ifdef SPORT_SEND + struct t_FrSkyX_TX_Frame + { + uint8_t count; + uint8_t payload[8]; + } ; + // Store FrskyX telemetry + struct t_FrSkyX_TX_Frame FrSkyX_TX_Frames[4] ; +#endif + +#define FRSKYX_FAILSAFE_TIMEOUT 1032 + +static void __attribute__((unused)) FrSkyX_set_start(uint8_t ch ) +{ + CC2500_Strobe(CC2500_SIDLE); + CC2500_WriteReg(CC2500_25_FSCAL1, calData[ch]); + CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[ch]); +} + +static void __attribute__((unused)) FrSkyX_init() +{ + FRSKY_init_cc2500((sub_protocol&2)?FRSKYXEU_cc2500_conf:FRSKYX_cc2500_conf); // LBT or FCC + // + for(uint8_t c=0;c < 48;c++) + {//calibrate hop channels + CC2500_Strobe(CC2500_SIDLE); + CC2500_WriteReg(CC2500_0A_CHANNR,hopping_frequency[c]); + CC2500_Strobe(CC2500_SCAL); + delayMicroseconds(900);// + calData[c] = CC2500_ReadReg(CC2500_25_FSCAL1); + } + //#######END INIT######## +} + +static void __attribute__((unused)) FrSkyX_initialize_data(uint8_t adr) +{ + CC2500_WriteReg(CC2500_18_MCSM0, 0x8); + CC2500_WriteReg(CC2500_09_ADDR, adr ? 0x03 : rx_tx_addr[3]); + CC2500_WriteReg(CC2500_07_PKTCTRL1,0x05); // check address +} + +#endif + diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index 68de29e..0e20dd1 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -19,52 +19,6 @@ #include "iface_cc2500.h" -uint8_t FrSkyX_chanskip; -uint8_t FrSkyX_TX_Seq, FrSkyX_TX_IN_Seq; -uint8_t FrSkyX_RX_Seq ; - -#ifdef SPORT_SEND - struct t_FrSkyX_TX_Frame - { - uint8_t count; - uint8_t payload[8]; - } ; - // Store FrskyX telemetry - struct t_FrSkyX_TX_Frame FrSkyX_TX_Frames[4] ; -#endif - -#define FrSkyX_FAILSAFE_TIMEOUT 1032 - -static void __attribute__((unused)) FrSkyX_set_start(uint8_t ch ) -{ - CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteReg(CC2500_25_FSCAL1, calData[ch]); - CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[ch]); -} - -static void __attribute__((unused)) FrSkyX_init() -{ - FRSKY_init_cc2500((sub_protocol&2)?FRSKYXEU_cc2500_conf:FRSKYX_cc2500_conf); // LBT or FCC - // - for(uint8_t c=0;c < 48;c++) - {//calibrate hop channels - CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteReg(CC2500_0A_CHANNR,hopping_frequency[c]); - CC2500_Strobe(CC2500_SCAL); - delayMicroseconds(900);// - calData[c] = CC2500_ReadReg(CC2500_25_FSCAL1); - } - //#######END INIT######## -} - -static void __attribute__((unused)) FrSkyX_initialize_data(uint8_t adr) -{ - CC2500_WriteReg(CC2500_0C_FSCTRL0,option); // Frequency offset hack - CC2500_WriteReg(CC2500_18_MCSM0, 0x8); - CC2500_WriteReg(CC2500_09_ADDR, adr ? 0x03 : rx_tx_addr[3]); - CC2500_WriteReg(CC2500_07_PKTCTRL1,0x05); -} - static void __attribute__((unused)) FrSkyX_build_bind_packet() { packet[0] = (sub_protocol & 2 ) ? 0x20 : 0x1D ; // LBT or FCC @@ -97,27 +51,6 @@ static void __attribute__((unused)) FrSkyX_build_bind_packet() // } -// 0-2047, 0 = 817, 1024 = 1500, 2047 = 2182 -//64=860,1024=1500,1984=2140//Taranis 125% -static uint16_t __attribute__((unused)) FrSkyX_scaleForPXX( uint8_t i ) -{ //mapped 860,2140(125%) range to 64,1984(PXX values); - uint16_t chan_val=convert_channel_frsky(i)-1226; - if(i>7) chan_val|=2048; // upper channels offset - return chan_val; -} -#ifdef FAILSAFE_ENABLE -static uint16_t __attribute__((unused)) FrSkyX_scaleForPXX_FS( uint8_t i ) -{ //mapped 1,2046(125%) range to 64,1984(PXX values); - uint16_t chan_val=((Failsafe_data[i]*15)>>4)+64; - if(Failsafe_data[i]==FAILSAFE_CHANNEL_NOPULSES) - chan_val=FAILSAFE_CHANNEL_NOPULSES; - else if(Failsafe_data[i]==FAILSAFE_CHANNEL_HOLD) - chan_val=FAILSAFE_CHANNEL_HOLD; - if(i>7) chan_val|=2048; // upper channels offset - return chan_val; -} -#endif - #define FrSkyX_FAILSAFE_TIME 1032 static void __attribute__((unused)) FrSkyX_build_packet() { diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 176f24a..740d650 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -61,3 +61,4 @@ 61,Tiger 62,XK,X450,X420 63,XN_DUMP,250K,1M,2M,AUTO +64,FrskyX2,CH_16,CH_8,EU_16,EU_8 diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino index 120d4be..759906d 100644 --- a/Multiprotocol/Multi_Names.ino +++ b/Multiprotocol/Multi_Names.ino @@ -30,6 +30,7 @@ const char STR_CX10[] ="CX10"; const char STR_CG023[] ="CG023"; const char STR_BAYANG[] ="Bayang"; const char STR_FRSKYX[] ="FrSky X"; +const char STR_FRSKYX2[] ="FrSkyX2"; const char STR_ESKY[] ="ESky"; const char STR_MT99XX[] ="MT99XX"; const char STR_MJXQ[] ="MJXq"; @@ -180,6 +181,9 @@ const mm_protocol_definition multi_protocols[] = { #if defined(FRSKYX_CC2500_INO) {PROTO_FRSKYX, STR_FRSKYX, 4, STR_SUBTYPE_FRSKYX, OPTION_RFTUNE }, #endif +#if defined(FRSKYX2_CC2500_INO) + {PROTO_FRSKYX2, STR_FRSKYX2, 4, STR_SUBTYPE_FRSKYX, OPTION_RFTUNE }, +#endif #if defined(ESKY_NRF24L01_INO) {PROTO_ESKY, STR_ESKY, 0, NO_SUBTYPE, OPTION_NONE }, #endif diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 8b8e15f..3b3ec29 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 63 +#define VERSION_PATCH_LEVEL 64 //****************** // Protocols @@ -90,6 +90,7 @@ enum PROTOCOLS PROTO_TIGER = 61, // =>NRF24L01 PROTO_XK = 62, // =>NRF24L01 PROTO_XN297DUMP = 63, // =>NRF24L01 + PROTO_FRSKYX2 = 64, // =>CC2500 }; enum Flysky @@ -212,6 +213,13 @@ enum FRSKYX EU_16 = 2, EU_8 = 3, }; +enum FRSKYX2 +{ + FRSKYX2_CH_16 = 0, + FRSKYX2_CH_8 = 1, + FRSKYX2_EU_16 = 2, + FRSKYX2_EU_8 = 3, +}; enum HONTAI { HONTAI = 0, diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 771c8df..cbdf666 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -514,6 +514,11 @@ void setup() option = FORCE_FRSKYX_TUNING; // Use config-defined tuning value for FrSkyX else #endif + #if defined(FORCE_FRSKYX2_TUNING) && defined(FRSKYX2_CC2500_INO) + if(protocol==PROTO_FRSKYX2) + option = FORCE_FRSKYX2_TUNING; // Use config-defined tuning value for FrSkyX2 + else + #endif #if defined(FORCE_SFHSS_TUNING) && defined(SFHSS_CC2500_INO) if (protocol==PROTO_SFHSS) option = FORCE_SFHSS_TUNING; // Use config-defined tuning value for SFHSS @@ -737,7 +742,7 @@ bool Update_All() update_led_status(); #if defined(TELEMETRY) #if ( !( defined(MULTI_TELEMETRY) || defined(MULTI_STATUS) ) ) - if((protocol == PROTO_BAYANG_RX) || (protocol == PROTO_AFHDS2A_RX) || (protocol == PROTO_FRSKY_RX) || (protocol == PROTO_SCANNER) || (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_NCC1701) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_HOTT)) + if((protocol == PROTO_BAYANG_RX) || (protocol == PROTO_AFHDS2A_RX) || (protocol == PROTO_FRSKY_RX) || (protocol == PROTO_SCANNER) || (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_NCC1701) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_HOTT)) || (protocol==PROTO_FRSKYX2) #endif if(IS_DISABLE_TELEM_off) TelemetryUpdate(); @@ -1128,6 +1133,14 @@ static void protocol_init() remote_callback = ReadFrSkyX; break; #endif + #if defined(FRSKYX2_CC2500_INO) + case PROTO_FRSKYX2: + PE1_off; //antenna RF2 + PE2_on; + next_callback = initFrSkyX2(); + remote_callback = ReadFrSkyX2; + break; + #endif #if defined(SFHSS_CC2500_INO) case PROTO_SFHSS: PE1_off; //antenna RF2 @@ -1603,6 +1616,11 @@ void update_serial_data() option=FORCE_FRSKYX_TUNING; // Use config-defined tuning value for FrSkyX else #endif + #if defined(FORCE_FRSKYX2_TUNING) && defined(FRSKYX2_CC2500_INO) + if(protocol==PROTO_FRSKYX2) + option=FORCE_FRSKYX2_TUNING; // Use config-defined tuning value for FrSkyX2 + else + #endif #if defined(FORCE_SFHSS_TUNING) && defined(SFHSS_CC2500_INO) if (protocol==PROTO_SFHSS) option=FORCE_SFHSS_TUNING; // Use config-defined tuning value for SFHSS @@ -1765,14 +1783,14 @@ void update_serial_data() #endif if(rx_len>27) { // Data available for the current protocol - #ifdef FRSKYX_CC2500_INO - if(protocol==PROTO_FRSKYX && rx_len==28) + #if defined FRSKYX_CC2500_INO || defined FRSKYX2_CC2500_INO + if((protocol==PROTO_FRSKYX || protocol==PROTO_FRSKYX2) && rx_len==28) {//Protocol waiting for 1 byte during bind binding_idx=rx_ok_buff[27]; } #endif #ifdef SPORT_SEND - if(protocol==PROTO_FRSKYX && rx_len==35) + if((protocol==PROTO_FRSKYX || protocol==PROTO_FRSKYX2) && rx_len==35) {//Protocol waiting for 8 bytes #define BYTE_STUFF 0x7D #define STUFF_MASK 0x20 @@ -2057,12 +2075,12 @@ void PPM_Telemetry_serial_init() { if( (protocol==PROTO_FRSKYD) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_BAYANG)|| (protocol==PROTO_NCC1701) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) #ifdef TELEMETRY_FRSKYX_TO_FRSKYD - || (protocol==PROTO_FRSKYX) + || (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2) #endif ) initTXSerial( SPEED_9600 ) ; #ifndef TELEMETRY_FRSKYX_TO_FRSKYD - if(protocol==PROTO_FRSKYX) + if(protocol==PROTO_FRSKYX || protocol==PROTO_FRSKYX2) initTXSerial( SPEED_57600 ) ; #endif if(protocol==PROTO_DSM) diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index 8159fef..910426c 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -89,6 +89,11 @@ #error "The FrSkyX forced frequency tuning value is outside of the range -127..127." #endif #endif +#ifdef FORCE_FRSKYX2_TUNING + #if ( FORCE_FRSKYX2_TUNING < -127 ) || ( FORCE_FRSKYX2_TUNING > 127 ) + #error "The FrSkyX2 forced frequency tuning value is outside of the range -127..127." + #endif +#endif #ifdef FORCE_HITEC_TUNING #if ( FORCE_HITEC_TUNING < -127 ) || ( FORCE_HITEC_TUNING > 127 ) #error "The HITEC forced frequency tuning value is outside of the range -127..127." @@ -203,6 +208,7 @@ #undef FRSKYD_CC2500_INO #undef FRSKYV_CC2500_INO #undef FRSKYX_CC2500_INO + #undef FRSKYX2_CC2500_INO #undef SFHSS_CC2500_INO #undef CORONA_CC2500_INO #undef REDPINE_CC2500_INO @@ -324,7 +330,7 @@ #if not defined(FRSKYD_CC2500_INO) #undef HUB_TELEMETRY #endif - #if not defined(FRSKYX_CC2500_INO) + #if not defined(FRSKYX_CC2500_INO) and not defined(FRSKYX2_CC2500_INO) #undef SPORT_TELEMETRY #undef SPORT_SEND #endif diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 2cec993..a86d3b9 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -176,6 +176,7 @@ #define FRSKYD_CC2500_INO #define FRSKYV_CC2500_INO #define FRSKYX_CC2500_INO +#define FRSKYX2_CC2500_INO #define FRSKY_RX_CC2500_INO #define HITEC_CC2500_INO #define HOTT_CC2500_INO @@ -567,6 +568,11 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { CH_8 EU_16 EU_8 + PROTO_FRSKYX2 + FRSKYX2_CH_16 + FRSKYX2_CH_8 + FRSKYX2_EU_16 + FRSKYX2_EU_8 PROTO_FRSKY_RX NONE PROTO_FX816