diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt
index 43210e7..6fa989d 100644
--- a/Lua_scripts/MultiChan.txt
+++ b/Lua_scripts/MultiChan.txt
@@ -136,6 +136,7 @@
72,0,Q90C,Std,0,FMode,VTX+
50,0,Redpine,Fast,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16
50,1,Redpine,Slow,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16
+74,0,RadioLink,Surface,0,CH5,CH6,CH7,CH8,FS_CH1,FS_CH2,FS_CH3,FS_CH4,FS_CH5,FS_CH6,FS_CH7,FS_CH8
21,0,SFHSS,Std,0,CH5,CH6,CH7,CH8
19,0,Shenqi,Cycle,1
68,0,Skyartec,Std,0,CH5,CH6,CH7
diff --git a/Lua_scripts/MultiChannelsUpdater.lua b/Lua_scripts/MultiChannelsUpdater.lua
index ede6b4d..1b1d8f9 100644
--- a/Lua_scripts/MultiChannelsUpdater.lua
+++ b/Lua_scripts/MultiChannelsUpdater.lua
@@ -278,6 +278,15 @@ local function Multi_Init()
ch_order = math.floor(ch_order/4)
channel_names[bitand(ch_order,3)+1] = stick_names[1]
end
+
+ --Exceptions on first 4 channels...
+ if ( protocol == 74 and sub_protocol == 0 ) then -- RadioLink Surface
+ channel_names[1] = "ST"
+ channel_names[2] = "THR"
+ channel_names[3] = "CH3"
+ channel_names[4] = "CH4"
+ end
+
--Check MultiChan.txt
local f = io.open("/SCRIPTS/TOOLS/MultiChan.txt", "r")
if f == nil then return end
diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt
index 6139abe..803e6e9 100644
--- a/Multiprotocol/Multi.txt
+++ b/Multiprotocol/Multi.txt
@@ -70,4 +70,5 @@
70,DSM_RX
71,JJRC345
72,Q90C
-73,Kyosho
\ No newline at end of file
+73,Kyosho
+74,RadioLink,Surface
\ No newline at end of file
diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino
index f296bdc..f549c2f 100644
--- a/Multiprotocol/Multi_Names.ino
+++ b/Multiprotocol/Multi_Names.ino
@@ -87,6 +87,7 @@ const char STR_FRSKYR9[] ="FrSkyR9";
const char STR_PROPEL[] ="Propel";
const char STR_SKYARTEC[] ="Skyartc";
const char STR_KYOSHO[] ="Kyosho";
+const char STR_RLINK[] ="RadLink";
const char STR_TEST[] ="Test";
const char STR_FAKE[] ="Fake";
@@ -140,6 +141,7 @@ const char STR_SUBTYPE_WFLY[] = "\x06""WFR0xS";
const char STR_SUBTYPE_HOTT[] = "\x07""Sync\0 ""No_Sync";
const char STR_SUBTYPE_PELIKAN[] = "\x04""Pro\0""Lite";
const char STR_SUBTYPE_V761[] = "\x03""3CH""4CH";
+const char STR_SUBTYPE_RLINK[] = "\x07""Surface";
enum
{
@@ -324,6 +326,9 @@ const mm_protocol_definition multi_protocols[] = {
#if defined(REDPINE_CC2500_INO)
{PROTO_REDPINE, STR_REDPINE, 2, STR_SUBTYPE_REDPINE, OPTION_RFTUNE },
#endif
+ #if defined(RLINK_CC2500_INO)
+ {PROTO_RLINK, STR_RLINK, 1, STR_SUBTYPE_RLINK, OPTION_RFTUNE },
+ #endif
#if defined(SCANNER_CC2500_INO)
// {PROTO_SCANNER, STR_SCANNER, 0, NO_SUBTYPE, OPTION_NONE },
#endif
diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h
index 581eb4a..b42da70 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 42
+#define VERSION_PATCH_LEVEL 43
//******************
// Protocols
@@ -100,6 +100,7 @@ enum PROTOCOLS
PROTO_JJRC345 = 71, // =>NRF24L01
PROTO_Q90C = 72, // =>NRF24L01 or CC2500
PROTO_KYOSHO = 73, // =>A7105
+ PROTO_RLINK = 74, // =>CC2500
PROTO_FAKE = 126, // =>CC2500+NRF24L01
PROTO_TEST = 127, // =>CC2500
@@ -801,6 +802,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
JJRC345 71
Q90C 72
KYOSHO 73
+ RLINK 74
BindBit=> 0x80 1=Bind/0=No
AutoBindBit=> 0x40 1=Yes /0=No
RangeCheck=> 0x20 1=Yes /0=No
diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino
index 0ece78f..9fdc022 100644
--- a/Multiprotocol/Multiprotocol.ino
+++ b/Multiprotocol/Multiprotocol.ino
@@ -768,7 +768,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_FRSKYX2) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_HOTT) || (protocol==PROTO_PROPEL) || (protocol==PROTO_DEVO) || (protocol==PROTO_DSM_RX) || (protocol==PROTO_FRSKY_R9))
+ 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_FRSKYX2) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_HOTT) || (protocol==PROTO_PROPEL) || (protocol==PROTO_DEVO) || (protocol==PROTO_DSM_RX) || (protocol==PROTO_FRSKY_R9) || (protocol==PROTO_RLINK))
#endif
if(IS_DISABLE_TELEM_off)
TelemetryUpdate();
@@ -1254,6 +1254,14 @@ static void protocol_init()
remote_callback = ESKY150V2_callback;
break;
#endif
+ #if defined(RLINK_CC2500_INO)
+ case PROTO_RLINK:
+ PE1_off;
+ PE2_on; //antenna RF2
+ next_callback = initRLINK();
+ remote_callback = RLINK_callback;
+ break;
+ #endif
#endif
#ifdef CYRF6936_INSTALLED
#if defined(DSM_CYRF6936_INO)
@@ -2191,7 +2199,7 @@ void pollBoot()
#if defined(TELEMETRY)
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) || (protocol==PROTO_PROPEL)
+ 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) || (protocol==PROTO_PROPEL) || (protocol==PROTO_RLINK)
#ifdef TELEMETRY_FRSKYX_TO_FRSKYD
|| (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2)
#endif
diff --git a/Multiprotocol/RadioLink_cc2500.ino b/Multiprotocol/RadioLink_cc2500.ino
new file mode 100644
index 0000000..6c62a33
--- /dev/null
+++ b/Multiprotocol/RadioLink_cc2500.ino
@@ -0,0 +1,209 @@
+/*
+ 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 .
+ */
+// Radiolink surface protocol. TXs: RC4GS,RC6GS. Compatible RXs:R7FG(Std),R6FG,R6F,R8EF,R8FM,R8F,R4FGM
+
+#if defined(RLINK_CC2500_INO)
+
+#include "iface_cc2500.h"
+
+#define RLINK_FORCE_ID
+
+#define RLINK_TX_PACKET_LEN 33
+#define RLINK_RX_PACKET_LEN 15
+#define RLINK_TX_ID_LEN 4
+
+enum {
+ RLINK_DATA = 0x00,
+ RLINK_RX1 = 0x01,
+ RLINK_RX2 = 0x02,
+};
+
+const PROGMEM uint8_t RLINK_init_values[] = {
+ /* 00 */ 0x5B, 0x06, 0x5C, 0x07, 0xAB, 0xCD, 0x40, 0x04,
+ /* 08 */ 0x45, 0x00, 0x00, 0x06, 0x00, 0x5C, 0x62, 0x76,
+ /* 10 */ 0x7A, 0x7F, 0x13, 0x23, 0xF8, 0x44, 0x07, 0x30,
+ /* 18 */ 0x18, 0x16, 0x6C, 0x43, 0x40, 0x91, 0x87, 0x6B,
+ /* 20 */ 0xF8, 0x56, 0x10, 0xA9, 0x0A, 0x00, 0x11
+};
+
+static void __attribute__((unused)) RLINK_init()
+{
+ rf_ch_num=(random(0xfefefefe)&0x0F)+1; // 0x01..0x10
+ memcpy(hopping_frequency,"\x12\xBA\x66\x72\x1E\x42\x06\x4E\x36\xAE\x8A\xA2\x2A\x7E\x96\x5A",16);
+ hopping_frequency[rf_ch_num]=0xC6;
+ #ifdef RLINK_FORCE_ID
+ memcpy(rx_tx_addr,"\x3A\x99\x22\x3A",RLINK_TX_ID_LEN);
+ #endif
+}
+
+static void __attribute__((unused)) RLINK_rf_init()
+{
+ CC2500_Strobe(CC2500_SIDLE);
+
+ for (uint8_t i = 0; i < 39; ++i)
+ CC2500_WriteReg(i, pgm_read_byte_near(&RLINK_init_values[i]));
+
+ prev_option = option;
+ CC2500_WriteReg(CC2500_0C_FSCTRL0, option);
+
+ CC2500_SetTxRxMode(TX_EN);
+ CC2500_SetPower();
+}
+
+static void __attribute__((unused)) RLINK_tune_freq()
+{
+ if ( prev_option != option )
+ {
+ CC2500_WriteReg(CC2500_0C_FSCTRL0, option);
+ prev_option = option ;
+ }
+}
+
+static void __attribute__((unused)) RLINK_TIMING_RFSEND_packet()
+{
+ uint32_t pseudo=0, bits = 0;
+ uint8_t bitsavailable = 0;
+ uint8_t idx = 6;
+
+ CC2500_Strobe(CC2500_SIDLE);
+
+ // packet length
+ packet[0] = RLINK_TX_PACKET_LEN;
+ // header
+ packet[1] = packet_count>3?0x03:0x01; // packet type: 0x01 normal, 0x03 request telemetry
+ //if(RX_num) packet[1] |= ((RX_num+2)<<4)+4; // RX number limited to 10 values, 0 is a wildcard
+
+ // ID
+ memcpy(&packet[2],rx_tx_addr,RLINK_TX_ID_LEN);
+
+ // pack 16 channels on 11 bits values between 170 and 1876, 1023 middle. The last 8 channels are failsafe values associated to the first 8 values.
+ for (uint8_t i = 0; i < 16; i++)
+ {
+ uint32_t val = convert_channel_16b_nolimit(i,170,1876); // allow extended limits
+ if (val & 0x8000)
+ val = 0;
+ else if (val > 2047)
+ val=2047;
+
+ bits |= val << bitsavailable;
+ bitsavailable += 11;
+ while (bitsavailable >= 8) {
+ packet[idx++] = bits & 0xff;
+ bits >>= 8;
+ bitsavailable -= 8;
+ }
+ }
+
+ // hop
+ pseudo=((pseudo * 0xAA) + 3) % 0x7673; // calc next pseudo random value
+ CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[pseudo &0x0F]);
+ packet[28]= pseudo;
+ packet[29]= pseudo >> 8;
+ packet[30]= 0x00; // unknown
+ packet[31]= 0x00; // unknown
+ packet[32]= rf_ch_num; // value equal to 0xC6 in the RF table
+
+ // check
+ uint8_t sum=0;
+ for(uint8_t i=0;i<33;i++)
+ sum+=packet[i];
+ packet[33]=sum;
+
+ // send packet
+ CC2500_WriteData(packet, RLINK_TX_PACKET_LEN+1);
+
+ // packets type
+ packet_count++;
+ if(packet_count>6) packet_count=0;
+}
+
+#define RLINK_TIMING_PROTO 20000
+#define RLINK_TIMING_RFSEND 10223
+#define RLINK_TIMING_CHECK 2000
+uint16_t RLINK_callback()
+{
+ switch(phase)
+ {
+ case RLINK_DATA:
+ #ifdef MULTI_SYNC
+ telemetry_set_input_sync(RLINK_TIMING_PROTO);
+ #endif
+ RLINK_tune_freq();
+ RLINK_TIMING_RFSEND_packet();
+#if not defined RLINK_HUB_TELEMETRY
+ return RLINK_TIMING_PROTO;
+#else
+ if(packet[1]==0x01)
+ return RLINK_TIMING_PROTO;
+ phase++; // RX1
+ return RLINK_TIMING_RFSEND;
+ case RLINK_RX1:
+ CC2500_Strobe(CC2500_SIDLE);
+ CC2500_Strobe(CC2500_SFRX);
+ CC2500_SetTxRxMode(RX_EN);
+ CC2500_Strobe(CC2500_SRX);
+ phase++; // RX2
+ return RLINK_TIMING_PROTO-RLINK_TIMING_RFSEND-RLINK_TIMING_CHECK;
+ case RLINK_RX2:
+ len = CC2500_ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
+ if (len == RLINK_RX_PACKET_LEN + 1 + 2) //Telemetry frame is 15 bytes + 1 byte for length + 2 bytes for RSSI&LQI&CRC
+ {
+ //debug("Telem:");
+ CC2500_ReadData(packet_in, len);
+ if(packet_in[0]==RLINK_RX_PACKET_LEN && (packet_in[len-1] & 0x80) && memcmp(&packet[2],rx_tx_addr,RLINK_TX_ID_LEN)==0 && packet_in[6]==0x03)
+ {//Correct telemetry received: length, CRC, ID and type
+ //Debug
+ //for(uint8_t i=0;i=128)
+ TX_RSSI -= 128;
+ else
+ TX_RSSI += 128;
+ RX_RSSI=packet_in[7]; //Should be packet_in[7]-256 but since it's an uint8_t...
+ v_lipo1=packet_in[8];
+ v_lipo2=packet_in[9];
+ telemetry_link=1; //Send telemetry out
+ pps_counter++;
+ packet_count=0;
+ }
+ //debugln("");
+ }
+ if (millis() - pps_timer >= 2000)
+ {//1 packet every 20ms
+ pps_timer = millis();
+ debugln("%d pps", pps_counter);
+ TX_LQI = pps_counter; //Max=100%
+ pps_counter = 0;
+ }
+ CC2500_SetTxRxMode(TX_EN);
+ phase=RLINK_DATA; // DATA
+ return RLINK_TIMING_CHECK;
+#endif
+ }
+ return 0;
+}
+
+uint16_t initRLINK()
+{
+ BIND_DONE; // Not a TX bind protocol
+ RLINK_init();
+ RLINK_rf_init();
+ packet_count = 0;
+ phase = RLINK_DATA;
+ return 10000;
+}
+
+#endif
\ No newline at end of file
diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino
index d89c7cf..a043609 100644
--- a/Multiprotocol/Telemetry.ino
+++ b/Multiprotocol/Telemetry.ino
@@ -531,7 +531,7 @@ void frsky_link_frame()
telemetry_link |= 2 ; // Send hub if available
}
else
- {//PROTO_HUBSAN, PROTO_AFHDS2A, PROTO_BAYANG, PROTO_NCC1701, PROTO_CABELL, PROTO_HITEC, PROTO_BUGS, PROTO_BUGSMINI, PROTO_FRSKYX, PROTO_FRSKYX2, PROTO_PROPEL, PROTO_DEVO
+ {//PROTO_HUBSAN, PROTO_AFHDS2A, PROTO_BAYANG, PROTO_NCC1701, PROTO_CABELL, PROTO_HITEC, PROTO_BUGS, PROTO_BUGSMINI, PROTO_FRSKYX, PROTO_FRSKYX2, PROTO_PROPEL, PROTO_DEVO, PROTO_RLINK
frame[1] = v_lipo1;
frame[2] = v_lipo2;
frame[3] = RX_RSSI;
@@ -952,7 +952,7 @@ void TelemetryUpdate()
#endif
if( telemetry_link & 1 )
- { // FrSkyD + Hubsan + AFHDS2A + Bayang + Cabell + Hitec + Bugs + BugsMini + NCC1701 + PROPEL
+ { // FrSkyD + Hubsan + AFHDS2A + Bayang + Cabell + Hitec + Bugs + BugsMini + NCC1701 + PROPEL + RLINK
// FrSkyX telemetry if in PPM
frsky_link_frame();
return;
diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h
index f74730c..bb3a9d1 100644
--- a/Multiprotocol/Validate.h
+++ b/Multiprotocol/Validate.h
@@ -243,6 +243,7 @@
#undef HITEC_CC2500_INO
#undef HOTT_CC2500_INO
#undef REDPINE_CC2500_INO
+ #undef RLINK_CC2500_INO
#undef SCANNER_CC2500_INO
#undef SFHSS_CC2500_INO
#undef SKYARTEC_CC2500_INO
@@ -332,6 +333,7 @@
#undef BAYANG_RX_NRF24L01_INO
#undef DEVO_HUB_TELEMETRY
#undef PROPEL_HUB_TELEMETRY
+ #undef RLINK_HUB_TELEMETRY
#undef DSM_RX_CYRF6936_INO
#else
#if defined(MULTI_TELEMETRY) && defined(MULTI_STATUS)
@@ -371,6 +373,9 @@
#if not defined(CABELL_NRF24L01_INO)
#undef CABELL_HUB_TELEMETRY
#endif
+ #if not defined(RLINK_CC2500_INO)
+ #undef RLINK_HUB_TELEMETRY
+ #endif
#if not defined(HUBSAN_A7105_INO)
#undef HUBSAN_HUB_TELEMETRY
#endif
@@ -398,7 +403,7 @@
#if not defined(HOTT_CC2500_INO)
#undef HOTT_FW_TELEMETRY
#endif
- #if not defined(HOTT_FW_TELEMETRY) && not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BUGS_HUB_TELEMETRY) && not defined(NCC1701_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) && not defined(HITEC_HUB_TELEMETRY) && not defined(HITEC_FW_TELEMETRY) && not defined(SCANNER_TELEMETRY) && not defined(FRSKY_RX_TELEMETRY) && not defined(AFHDS2A_RX_TELEMETRY) && not defined(BAYANG_RX_TELEMETRY) && not defined(DEVO_HUB_TELEMETRY) && not defined(PROPEL_HUB_TELEMETRY)
+ #if not defined(HOTT_FW_TELEMETRY) && not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BUGS_HUB_TELEMETRY) && not defined(NCC1701_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(RLINK_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) && not defined(HITEC_HUB_TELEMETRY) && not defined(HITEC_FW_TELEMETRY) && not defined(SCANNER_TELEMETRY) && not defined(FRSKY_RX_TELEMETRY) && not defined(AFHDS2A_RX_TELEMETRY) && not defined(BAYANG_RX_TELEMETRY) && not defined(DEVO_HUB_TELEMETRY) && not defined(PROPEL_HUB_TELEMETRY)
#undef TELEMETRY
#undef INVERT_TELEMETRY
#undef MULTI_TELEMETRY
diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h
index 0cc829d..a118190 100644
--- a/Multiprotocol/_Config.h
+++ b/Multiprotocol/_Config.h
@@ -197,6 +197,7 @@
#define SFHSS_CC2500_INO
#define SKYARTEC_CC2500_INO
#define REDPINE_CC2500_INO
+#define RLINK_CC2500_INO
//The protocols below need a NRF24L01 to be installed
#define ASSAN_NRF24L01_INO
@@ -313,6 +314,7 @@
#define NCC1701_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
#define PROPEL_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
#define CABELL_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
+#define RLINK_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
#define HITEC_HUB_TELEMETRY // Use FrSkyD Hub format to send basic telemetry to the radios which can decode it like er9x, erskyTX and OpenTX
#define HITEC_FW_TELEMETRY // Forward received telemetry packets to be decoded by erskyTX and OpenTX
#define SCANNER_TELEMETRY // Forward spectrum scanner data to TX
@@ -699,6 +701,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
PROTO_REDPINE
RED_FAST
RED_SLOW
+ PROTO_RLINK
+ NONE
PROTO_SCANNER
NONE
PROTO_SFHSS
diff --git a/Protocols_Details.md b/Protocols_Details.md
index b22b2a7..9401445 100644
--- a/Protocols_Details.md
+++ b/Protocols_Details.md
@@ -117,6 +117,7 @@ CFlie|38|CFlie||||||||NRF24L01|
[Q2X2](Protocols_Details.md#Q2X2---29)|29|Q222|Q242|Q282||||||NRF24L01|
[Q303](Protocols_Details.md#Q303---31)|31|Q303|CX35|CX10D|CX10WD|||||NRF24L01|XN297
[Q90C](Protocols_Details.md#Q90C---72)|72|Q90C*||||||||NRF24L01|XN297
+[RadioLink](Protocols_Details.md#RadioLink---74)|74|Surface||||||||CC2500|
[Redpine](Protocols_Details.md#Redpine---50)|50|FAST|SLOW|||||||NRF24L01|
[Scanner](Protocols_Details.md#Scanner---54)|54|||||||||CC2500|
[SFHSS](Protocols_Details.md#SFHSS---21)|21|SFHSS||||||||CC2500|
@@ -545,6 +546,24 @@ You should definitively upgrade your receivers/sensors to the latest firmware ve
## Scanner - *54*
2.4GHz scanner accessible using the OpenTX 2.3 Spectrum Analyser tool.
+## RadioLink - *74*
+
+Extended limits
+
+Option for this protocol corresponds to fine frequency tuning. This value is different for each Module and **must** be accurate otherwise the link will not be stable.
+Check the [Frequency Tuning page](/docs/Frequency_Tuning.md) to determine it.
+
+CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16
+---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
+CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|FS_CH1|FS_CH2|FS_CH3|FS_CH4|FS_CH5|FS_CH6|FS_CH7|FS_CH8
+
+FS=FailSafe
+
+### Sub_protocol Surface - *0*
+Surface protocol. TXs: RC4GS,RC6GS. Compatible RXs:R7FG(Std),R6FG,R6F,R8EF,R8FM,R8F,R4FGM
+
+CH1=Steering, CH2=Throttle, CH8=Gyro gain
+
## SFHSS - *21*
Models: Futaba RXs and XK models.