diff --git a/Multiprotocol/FrSkyDVX_common.ino b/Multiprotocol/FrSkyDVX_common.ino index d281516..38fbf85 100644 --- a/Multiprotocol/FrSkyDVX_common.ino +++ b/Multiprotocol/FrSkyDVX_common.ino @@ -105,21 +105,17 @@ void FrSkyX2_init_hop(void) hopping_frequency[47] = 0; //Bind freq } -uint8_t hw_ver=0x02; - void Frsky_init_clone(void) { - uint16_t temp = FRSKY_RX_EEPROM_OFFSET; - temp++; - rx_tx_addr[3] = eeprom_read_byte((EE_ADDR)temp++); - rx_tx_addr[2] = eeprom_read_byte((EE_ADDR)temp++); - hw_ver = eeprom_read_byte((EE_ADDR)temp++); - temp++; - for (uint8_t ch = 0; ch < 47; ch++) - { - hopping_frequency[ch] = eeprom_read_byte((EE_ADDR)temp++); - } - debugln("Clone mode"); + uint16_t temp = FRSKY_RX_EEPROM_OFFSET; + temp++; + rx_tx_addr[3] = eeprom_read_byte((EE_ADDR)temp++); + rx_tx_addr[2] = eeprom_read_byte((EE_ADDR)temp++); + rx_tx_addr[1] = eeprom_read_byte((EE_ADDR)temp++); + temp++; + for (uint8_t ch = 0; ch < 47; ch++) + hopping_frequency[ch] = eeprom_read_byte((EE_ADDR)temp++); + debugln("Clone mode"); } #endif diff --git a/Multiprotocol/FrSkyD_cc2500.ino b/Multiprotocol/FrSkyD_cc2500.ino index 8de5296..fcbddb3 100644 --- a/Multiprotocol/FrSkyD_cc2500.ino +++ b/Multiprotocol/FrSkyD_cc2500.ino @@ -97,15 +97,18 @@ static void __attribute__((unused)) frsky2way_data_frame() uint16_t initFrSky_2way() { //FrskyD init hop - for(uint8_t i=0;i<50;i++) - { - uint8_t freq = (i * 0x1e) % 0xeb; - if(i == 3 || i == 23 || i == 47) - freq++; - if(i > 47) - freq=0; - hopping_frequency[i]=freq; - } + if (eeprom_read_byte((EE_ADDR)FRSKY_RX_EEPROM_OFFSET+4)==127 && eeprom_read_byte((EE_ADDR)FRSKY_RX_EEPROM_OFFSET)==2)// bound in FRSKY-RX CloneTX -> use clone mode + Frsky_init_clone(); + else + for(uint8_t i=0;i<50;i++) + { + uint8_t freq = (i * 0x1e) % 0xeb; + if(i == 3 || i == 23 || i == 47) + freq++; + if(i > 47) + freq=0; + hopping_frequency[i]=freq; + } packet_count=0; if(IS_BIND_IN_PROGRESS) diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index 1fd8ded..749fbc5 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -42,7 +42,7 @@ static void __attribute__((unused)) FrSkyX_build_bind_packet() packet[8] = hopping_frequency[idx++]; packet[9] = hopping_frequency[idx++]; packet[10] = hopping_frequency[idx++]; - packet[11] = hw_ver; // Unknown but constant ID? + packet[11] = rx_tx_addr[1]; // Unknown but constant ID? packet[12] = RX_num; // memset(&packet[13], 0, packet_size - 14); @@ -54,7 +54,7 @@ static void __attribute__((unused)) FrSkyX_build_bind_packet() else { //packet 1D 03 01 0E 1C 02 00 00 32 0B 00 00 A8 26 28 01 A1 00 00 00 3E F6 87 C7 00 00 00 00 C9 C9 - packet[5] = hw_ver; // Unknown but constant ID? + packet[5] = rx_tx_addr[1]; // Unknown but constant ID? packet[6] = RX_num; //Bind flags packet[7]=0; @@ -119,7 +119,7 @@ static void __attribute__((unused)) FrSkyX_build_packet() packet[0] = packet_size; // Number of bytes in the packet (after this one) packet[1] = rx_tx_addr[3]; // ID packet[2] = rx_tx_addr[2]; // ID - packet[3] = hw_ver; // Unknown but constant ID? + packet[3] = rx_tx_addr[1]; // Unknown but constant ID? // packet[4] = (FrSkyX_chanskip<<6)|hopping_frequency_no; packet[5] = FrSkyX_chanskip>>2; @@ -385,9 +385,11 @@ uint16_t ReadFrSkyX() uint16_t initFrSkyX() { set_rx_tx_addr(MProtocol_id_master); - if ((eeprom_read_byte((EE_ADDR)FRSKY_RX_EEPROM_OFFSET+4)==127) && (eeprom_read_byte((EE_ADDR)FRSKY_RX_EEPROM_OFFSET)<2))// bound in FRSKY-X RX-mode with RX Num 63 -> use clone mode - Frsky_init_clone(); - else if(protocol==PROTO_FRSKYX) + rx_tx_addr[1]=0x02; // ID related, hw version? + + if (eeprom_read_byte((EE_ADDR)FRSKY_RX_EEPROM_OFFSET+4)==127 && eeprom_read_byte((EE_ADDR)FRSKY_RX_EEPROM_OFFSET)<2)// bound in FRSKY-RX CloneTX -> use clone mode + Frsky_init_clone(); + else if(protocol==PROTO_FRSKYX) Frsky_init_hop(); else { diff --git a/Multiprotocol/FrSky_Rx_cc2500.ino b/Multiprotocol/FrSky_Rx_cc2500.ino index 171311e..6b397f4 100644 --- a/Multiprotocol/FrSky_Rx_cc2500.ino +++ b/Multiprotocol/FrSky_Rx_cc2500.ino @@ -392,17 +392,13 @@ uint16_t FrSky_Rx_callback() eeprom_write_byte((EE_ADDR)temp++, rx_tx_addr[2]); debug("addr[2]=%02X, ", rx_tx_addr[2]); debug("rx_num=%02X, ", packet[12]); // RX # (D16) - if (packet[12]==63) - { - // If RX Num is 63, write a finetune value of 127 to the EEPROM - // A real finetune value of 127 means, the frequency of module is out of range and the module should be replaced. - eeprom_write_byte((EE_ADDR)temp++, 127); - } - else - { - eeprom_write_byte((EE_ADDR)temp++, frsky_rx_finetune); - debugln("tune=%d", (int8_t)frsky_rx_finetune); - } + if (sub_protocol==FRSKY_CLONE) + eeprom_write_byte((EE_ADDR)temp++, 127); + else + { + eeprom_write_byte((EE_ADDR)temp++, frsky_rx_finetune); + debugln("tune=%d", (int8_t)frsky_rx_finetune); + } for (ch = 0; ch < 47; ch++) { eeprom_write_byte((EE_ADDR)temp++, hopping_frequency[ch]); diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 59e0da2..c132526 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -52,7 +52,7 @@ 52,ZSX,280 53,Flyzone,FZ-410 54,Scanner -55,Frsky_RX +55,Frsky_RX,RX,CloneTX 56,AFHDS2A_RX 57,HoTT 58,FX816,P38 diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino index 29e7a6b..00a5b65 100644 --- a/Multiprotocol/Multi_Names.ino +++ b/Multiprotocol/Multi_Names.ino @@ -123,6 +123,7 @@ const char STR_SUBTYPE_XK[] = "\x04""X450""X420"; const char STR_SUBTYPE_FRSKYR9[] = "\x07""915MHz\0""868MHz\0""915 8ch""868 8ch"; const char STR_SUBTYPE_ESKY[] = "\x03""Std""ET4"; const char STR_SUBTYPE_PROPEL[] = "\x04""74-Z"; +const char STR_SUBTYPE_FRSKY_RX[] = "\x07""RX\0 ""CloneTX"; enum { @@ -302,7 +303,7 @@ const mm_protocol_definition multi_protocols[] = { {PROTO_SCANNER, STR_SCANNER, 0, NO_SUBTYPE, OPTION_NONE }, #endif #if defined(FRSKY_RX_CC2500_INO) - {PROTO_FRSKY_RX, STR_FRSKY_RX, 0, NO_SUBTYPE, OPTION_RFTUNE }, + {PROTO_FRSKY_RX, STR_FRSKY_RX, 2, STR_SUBTYPE_FRSKY_RX, OPTION_RFTUNE }, #endif #if defined(AFHDS2A_RX_A7105_INO) {PROTO_AFHDS2A_RX, STR_AFHDS2A_RX,0, NO_SUBTYPE, OPTION_NONE }, diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index c6cbe87..41ef5c5 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 84 +#define VERSION_PATCH_LEVEL 85 //****************** // Protocols @@ -334,6 +334,12 @@ enum ESKY ESKY_ET4 = 1, }; +enum FRSKY_RX +{ + FRSKY_RX = 0, + FRSKY_CLONE = 1, +}; + #define NONE 0 #define P_HIGH 1 #define P_LOW 0 @@ -887,6 +893,9 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- sub_protocol==ESKY ESKY_STD 0 ESKY_ET4 1 + sub_protocol==FRSKY_RX + FRSKY_RX = 0, + FRSKY_CLONE = 1, Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 1815d58..83e535d 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -558,6 +558,9 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { FZ410 PROTO_FQ777 NONE + PROTO_FRSKY_RX + FRSKY_RX + FRSKY_CLONE PROTO_FRSKYD NONE PROTO_FRSKYR9 diff --git a/Protocols_Details.md b/Protocols_Details.md index b727cf1..a10d613 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -92,7 +92,7 @@ CFlie|38|CFlie||||||||NRF24L01| [FrskyV](Protocols_Details.md#FRSKYV---25)|25|FrskyV||||||||CC2500| [FrskyX](Protocols_Details.md#FRSKYX---15)|15|CH_16|CH_8|EU_16|EU_8|||||CC2500| [FrskyX2](Protocols_Details.md#FRSKYX2---64)|64|CH_16|CH_8|EU_16|EU_8|||||CC2500| -[Frsky_RX](Protocols_Details.md#FRSKY_RX---55)|55|||||||||CC2500| +[Frsky_RX](Protocols_Details.md#FRSKY_RX---55)|55|RX|CloneTX|||||||CC2500| [FX816](Protocols_Details.md#FX816---58)|28|FX816|P38|||||||NRF24L01| [FY326](Protocols_Details.md#FY326---20)|20|FY326|FY319|||||||NRF24L01| [GD00X](Protocols_Details.md#GD00X---47)|47|GD_V1*|GD_V2*|||||||NRF24L01| @@ -377,9 +377,11 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 Same as FrSkyX but for v2.1.0. ## FRSKY_RX - *55* + +### Sub_protocol RX - *0* The FrSky receiver protocol enables master/slave trainning, separate access from 2 different radios to the same model,... -Auto selection of FrSkyD and FrSkyX v1.xxx FCC/LBT at bind time. +Auto selection of FrSkyD/D8 and FrSkyX/D16 v1.xxx FCC/LBT at bind time. Available in OpenTX 2.3.3, Trainer Mode Master/Multi @@ -394,6 +396,20 @@ Check the [Frequency Tuning page](/docs/Frequency_Tuning.md) to determine it. Low power: enable/disable the LNA stage on the RF component to use depending on the distance with the TX. +### Sub_protocol CloneTX - *1* +Enables to clone a FrSky TX in FrSkyD/D8 or FrSkyX/D16 v1.xxx FCC/LBT mode. + +Clone mode operation: +- Select the FrSkyRX protocol, subprotocol CloneTX +- Place both the orginal TX and multi in bind mode +- Wait for the bind to complete +- From there the FrSkyD or FrSkyX protocol will now clone the original TX + +Notes: +- For FrSkyD, only the RX number used during bind is cloned -> you can't use RX num anymore +- For FrSkyX, RX number has to be adjusted on each model to match the original TX model +- Once the clone mode is activated the FrSkyD or FrSkyX protocols will always use the clone mode. If you want to disable CloneTX, you must do a bind with the FrSkyRX protocol and subprotocol RX. + ## HITEC - *39* Models: OPTIMA, MINIMA and MICRO receivers.