Traxxas TQ 1st gen: try 5
[DIY-Multiprotocol-TX-Module.git] / Multiprotocol / Multi_Protos.ino
blobdaf501ff10e5aa5f03100516c98af7eb537c0dcb
1 /*
2  This project is free software: you can redistribute it and/or modify
3  it under the terms of the GNU General Public License as published by
4  the Free Software Foundation, either version 3 of the License, or
5  (at your option) any later version.
7  Multiprotocol is distributed in the hope that it will be useful,
8  but WITHOUT ANY WARRANTY; without even the implied warranty of
9  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  GNU General Public License for more details.
12  You should have received a copy of the GNU General Public License
13  along with Multiprotocol.  If not, see <http://www.gnu.org/licenses/>.
14  */
16 const char STR_FLYSKY[]         ="FlySky";
17 const char STR_HUBSAN[]         ="Hubsan";
18 const char STR_FRSKYD[]         ="FrSky D";
19 const char STR_HISKY[]          ="Hisky";
20 const char STR_V2X2[]           ="V2x2";
21 const char STR_DSM[]            ="DSM";
22 const char STR_DSM_RX[]         ="DSM_RX";
23 const char STR_DEVO[]           ="Devo";
24 const char STR_YD717[]          ="YD717";
25 const char STR_KN[]                     ="KN";
26 const char STR_SYMAX[]          ="SymaX";
27 const char STR_SLT[]            ="SLT";
28 const char STR_CX10[]           ="CX10";
29 const char STR_CG023[]          ="CG023";
30 const char STR_BAYANG[]         ="Bayang";
31 const char STR_FRSKYL[]         ="FrSky L";
32 const char STR_FRSKYX[]         ="FrSky X";
33 const char STR_FRSKYX2[]        ="FrSkyX2";
34 const char STR_ESKY[]           ="ESky";
35 const char STR_MT99XX[]         ="MT99XX";
36 const char STR_MT99XX2[]        ="MT99XX2";
37 const char STR_MJXQ[]           ="MJXq";
38 const char STR_SHENQI[]         ="Shenqi";
39 const char STR_FY326[]          ="FY326";
40 const char STR_FUTABA[]         ="Futaba";
41 const char STR_J6PRO[]          ="J6 Pro";
42 const char STR_JJRC345[]        ="JJRC345";
43 const char STR_JOYSWAY[]        ="JOYSWAY";
44 const char STR_FQ777[]          ="FQ777";
45 const char STR_ASSAN[]          ="Assan";
46 const char STR_FRSKYV[]         ="FrSky V";
47 const char STR_HONTAI[]         ="Hontai";
48 const char STR_AFHDS2A[]        ="FlSky2A";
49 const char STR_Q2X2[]           ="Q2x2";
50 const char STR_WK2x01[]         ="Walkera";
51 const char STR_Q303[]           ="Q303";
52 const char STR_Q90C[]           ="Q90C";
53 const char STR_GW008[]          ="GW008";
54 const char STR_DM002[]          ="DM002";
55 const char STR_CABELL[]         ="Cabell";
56 const char STR_ESKY150[]        ="Esky150";
57 const char STR_ESKY150V2[]      ="EskyV2";
58 const char STR_H8_3D[]          ="H8 3D";
59 const char STR_CORONA[]         ="Corona";
60 const char STR_CFLIE[]          ="CFlie";
61 const char STR_HITEC[]          ="Hitec";
62 const char STR_WFLY[]           ="WFLY";
63 const char STR_WFLY2[]          ="WFLY2";
64 const char STR_BUGS[]           ="Bugs";
65 const char STR_BUGSMINI[]       ="BugMini";
66 const char STR_TRAXXAS[]        ="Traxxas";
67 const char STR_NCC1701[]        ="NCC1701";
68 const char STR_E01X[]           ="E01X";
69 const char STR_V911S[]          ="V911S";
70 const char STR_GD00X[]          ="GD00x";
71 const char STR_V761[]           ="V761";
72 const char STR_KF606[]          ="KF606";
73 const char STR_REDPINE[]        ="Redpine";
74 const char STR_POTENSIC[]       ="Potensi";
75 const char STR_ZSX[]            ="ZSX";
76 const char STR_HEIGHT[]         ="Height";
77 const char STR_SCANNER[]        ="Scanner";
78 const char STR_FRSKY_RX[]       ="FrSkyRX";
79 const char STR_AFHDS2A_RX[]     ="FS2A_RX";
80 const char STR_HOTT[]           ="HoTT";
81 const char STR_FX[]                     ="FX";
82 const char STR_BAYANG_RX[]      ="BayanRX";
83 const char STR_PELIKAN[]        ="Pelikan";
84 const char STR_XK[]                     ="XK";
85 const char STR_XN297DUMP[]      ="XN297DP";
86 const char STR_FRSKYR9[]        ="FrSkyR9";
87 const char STR_PROPEL[]         ="Propel";
88 const char STR_SKYARTEC[]       ="Skyartc";
89 const char STR_KYOSHO[]         ="Kyosho";
90 const char STR_KYOSHO2[]        ="Kyosho2";
91 const char STR_RLINK[]          ="RadLink";
92 const char STR_REALACC[]        ="Realacc";
93 const char STR_OMP[]            ="OMP";
94 const char STR_MLINK[]          ="M-Link";
95 const char STR_TEST[]           ="Test";
96 const char STR_NANORF[]         ="NanoRF";
97 const char STR_E016HV2[]    ="E016Hv2";
98 const char STR_E010R5[]     ="E010r5";
99 const char STR_LOLI[]       ="LOLI";
100 const char STR_E129[]       ="E129";
101 const char STR_E016H[]      ="E016H";
102 const char STR_IKEAANSLUTA[]="Ansluta";
103 const char STR_CONFIG[]     ="Config";
104 const char STR_LOSI[]       ="Losi";
105 const char STR_MOULDKG[]    ="MouldKg";
106 const char STR_XERALL[]     ="Xerall";
107 const char STR_SCORPIO[]    ="Scorpio";
108 const char STR_BLUEFLY[]    ="BlueFly";
109 const char STR_BUMBLEB[]    ="BumbleB";
110 const char STR_SGF22[]      ="SGF22";
111 const char STR_EAZYRC[]     ="EazyRC";
112 const char STR_KYOSHO3[]    ="Kyosho3";
114 const char STR_SUBTYPE_FLYSKY[] =     "\x04""Std\0""V9x9""V6x6""V912""CX20";
115 const char STR_SUBTYPE_HUBSAN[] =     "\x04""H107""H301""H501";
116 const char STR_SUBTYPE_FRSKYD[] =     "\x06""D8\0   ""Cloned";
117 #ifndef MULTI_EU
118         const char STR_SUBTYPE_FRSKYX[] =     "\x07""D16\0   ""D16 8ch""LBT(EU)""LBT 8ch""Cloned\0""Clo 8ch";
119 #else
120         const char STR_SUBTYPE_FRSKYX[] =     "\x07""--->\0  ""--->\0  ""LBT(EU)""LBT 8ch""Cloned\0""Clo 8ch";
121 #endif
122 const char STR_SUBTYPE_HISKY[] =      "\x05""Std\0 ""HK310";
123 const char STR_SUBTYPE_V2X2[] =       "\x06""Std\0  ""JXD506""MR101\0";
124 #ifndef MULTI_EU
125         const char STR_SUBTYPE_DSM[] =        "\x04""2 1F""2 2F""X 1F""X 2F""Auto""R 1F""2SFC";
126 #else
127         const char STR_SUBTYPE_DSM[] =        "\x04""--->""--->""X 1F""X 2F""Auto""R 1F""----";
128 #endif
129 const char STR_SUBTYPE_DEVO[] =       "\x04""8ch\0""10ch""12ch""6ch\0""7ch\0";
130 const char STR_SUBTYPE_YD717[] =      "\x07""Std\0   ""SkyWlkr""Syma X4""XINXUN\0""NIHUI\0 ";
131 const char STR_SUBTYPE_KN[] =         "\x06""WLtoys""FeiLun";
132 const char STR_SUBTYPE_SYMAX[] =      "\x03""Std""X5C";
133 const char STR_SUBTYPE_SLT[] =        "\x06""V1_6ch""V2_8ch""Q100\0 ""Q200\0 ""MR100\0""V1_4ch";
134 const char STR_SUBTYPE_CX10[] =       "\x07""Green\0 ""Blue\0  ""DM007\0 ""-\0     ""JC3015a""JC3015b""MK33041";
135 const char STR_SUBTYPE_CG023[] =      "\x05""Std\0 ""YD829";
136 const char STR_SUBTYPE_BAYANG[] =     "\x07""Std\0   ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4\0""QX100\0 ";
137 const char STR_SUBTYPE_MT99[] =       "\x06""MT99\0 ""H7\0   ""YZ\0   ""LS\0   ""FY805\0""A180\0 ""Dragon""F949G\0";
138 const char STR_SUBTYPE_MT992[] =      "\x04""PA18";
139 const char STR_SUBTYPE_MJXQ[] =       "\x07""WLH08\0 ""X600\0  ""X800\0  ""H26D\0  ""E010\0  ""H26WH\0 ""Phoenix";
140 const char STR_SUBTYPE_FY326[] =      "\x05""Std\0 ""FY319";
141 const char STR_SUBTYPE_HONTAI[] =     "\x07""Std\0   ""JJRC X1""X5C1\0  ""FQ_951";
142 const char STR_SUBTYPE_AFHDS2A[] =    "\x08""PWM,IBUS""PPM,IBUS""PWM,SBUS""PPM,SBUS""PWM,IB16""PPM,IB16""PWM,SB16""PPM,SB16";
143 const char STR_SUBTYPE_Q2X2[] =       "\x04""Q222""Q242""Q282";
144 const char STR_SUBTYPE_WK2x01[] =     "\x06""WK2801""WK2401""W6_5_1""W6_6_1""W6_HeL""W6_HeI";
145 const char STR_SUBTYPE_Q303[] =       "\x06""Std\0  ""CX35\0 ""CX10D\0""CX10WD";
146 const char STR_SUBTYPE_CABELL[] =     "\x07""V3\0    ""V3 Telm""-\0     ""-\0     ""-\0     ""-\0     ""F-Safe\0""Unbind\0";
147 const char STR_SUBTYPE_H83D[] =       "\x07""Std\0   ""H20H\0  ""H20Mini""H30Mini";
148 const char STR_SUBTYPE_CORONA[] =     "\x05""V1\0  ""V2\0  ""FD V3";
149 const char STR_SUBTYPE_HITEC[] =      "\x07""Optima\0""Opt Hub""Minima\0";
150 const char STR_SUBTYPE_BUGS_MINI[] =  "\x06""Std\0  ""Bugs3H";
151 const char STR_SUBTYPE_TRAXXAS[] =    "\x03""TQ2""TQ1";
152 const char STR_SUBTYPE_E01X[] =       "\x05""E012\0""E015\0";
153 const char STR_SUBTYPE_GD00X[] =      "\x05""GD_V1""GD_V2";
154 const char STR_SUBTYPE_REDPINE[] =    "\x04""Fast""Slow";
155 const char STR_SUBTYPE_POTENSIC[] =   "\x03""A20";
156 const char STR_SUBTYPE_ZSX[] =        "\x07""280JJRC";
157 const char STR_SUBTYPE_HEIGHT[] =     "\x03""5ch""8ch";
158 const char STR_SUBTYPE_XN297DUMP[] =  "\x07""250Kbps""1Mbps\0 ""2Mbps\0 ""Auto\0  ""NRF\0   ""CC2500\0";
159 const char STR_SUBTYPE_ESKY150[] =    "\x03""4ch""7ch";
160 const char STR_SUBTYPE_ESKY150V2[] =  "\x05""150V2";
161 const char STR_SUBTYPE_V911S[] =      "\x05""V911S""E119\0";
162 const char STR_SUBTYPE_XK[] =         "\x04""X450""X420""Cars";
163 const char STR_SUBTYPE_FRSKYR9[] =    "\x07""915MHz\0""868MHz\0""915 8ch""868 8ch""FCC\0   ""--\0    ""FCC 8ch""-- 8ch\0";
164 const char STR_SUBTYPE_ESKY[] =       "\x03""Std""ET4";
165 const char STR_SUBTYPE_PROPEL[] =     "\x04""74-Z";
166 const char STR_SUBTYPE_FRSKYL[] =     "\x08""LR12\0   ""LR12 6ch";
167 const char STR_SUBTYPE_WFLY[] =       "\x05""WFR0x";
168 const char STR_SUBTYPE_WFLY2[] =      "\x05""RF20x";
169 const char STR_SUBTYPE_HOTT[] =       "\x07""Sync\0  ""No_Sync";
170 const char STR_SUBTYPE_PELIKAN[] =    "\x05""Pro\0 ""Lite\0""SCX24";
171 const char STR_SUBTYPE_V761[] =       "\x05""3ch\0 ""4ch\0 ""TOPRC";
172 const char STR_SUBTYPE_RLINK[] =      "\x07""Surface""Air\0   ""DumboRC""RC4G\0  ";
173 const char STR_SUBTYPE_KYOSHO[] =     "\x04""FHSS""Hype";
174 const char STR_SUBTYPE_KYOSHO2[] =    "\x05""KT-17";
175 const char STR_SUBTYPE_KYOSHO3[] =    "\x03""ASF";
176 const char STR_SUBTYPE_FUTABA[] =     "\x05""SFHSS";
177 const char STR_SUBTYPE_JJRC345[] =    "\x08""JJRC345\0""SkyTmblr";
178 const char STR_SUBTYPE_MOULDKG[] =    "\x06""Analog""Digit\0";
179 const char STR_SUBTYPE_KF606[] =      "\x06""KF606\0""MIG320""ZCZ50\0";
180 const char STR_SUBTYPE_E129[] =       "\x04""E129""C186";
181 const char STR_SUBTYPE_FX[] =         "\x04""816\0""620\0""9630";
182 #define NO_SUBTYPE              nullptr
184 #ifdef SEND_CPPM
185         const char STR_SUB_FRSKY_RX[] =   "\x07""Multi\0 ""CloneTX""EraseTX""CPPM\0  ";
186         const char STR_SUB_DSM_RX[] =   "\x07""Multi\0 ""CloneTX""EraseTX""CPPM\0  ";
187         #define FRCPPM   4
188         #define DSMCPPM   4
189         const char STR_CPPM[] =           "\x05""Multi""CPPM\0";
190         #define NBR_CPPM 2
191 #else
192         const char STR_SUB_FRSKY_RX[] =   "\x07""Multi\0 ""CloneTX""EraseTX";
193         const char STR_SUB_DSM_RX[] =   "\x07""Multi\0 ""CloneTX""EraseTX";
194         #define FRCPPM   3
195         #define DSMCPPM   3
196         #define STR_CPPM NO_SUBTYPE
197         #define NBR_CPPM 0
198 #endif
200 enum
202         OPTION_NONE,
203         OPTION_OPTION,
204         OPTION_RFTUNE,
205         OPTION_VIDFREQ,
206         OPTION_FIXEDID,
207         OPTION_TELEM,
208         OPTION_SRVFREQ,
209         OPTION_MAXTHR,
210         OPTION_RFCHAN,
211         OPTION_RFPOWER,
212         OPTION_WBUS,
215 const mm_protocol_definition multi_protocols[] = {
216 // Protocol number, Protocol String, Sub_protocol strings, Number of sub_protocols, Option type, Failsafe, ChMap, RF switch, Init, Callback
217         #if defined(MULTI_CONFIG_INO)
218                 {PROTO_CONFIG,     STR_CONFIG,    NO_SUBTYPE,            0, OPTION_NONE,    0, 0, 0,         CONFIG_init,     CONFIG_callback     },
219         #endif
220         #if defined(ASSAN_NRF24L01_INO)
221                 {PROTO_ASSAN,      STR_ASSAN,     NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    ASSAN_init,      ASSAN_callback      },
222         #endif
223         #if defined(BAYANG_NRF24L01_INO)
224                 {PROTO_BAYANG,     STR_BAYANG,    STR_SUBTYPE_BAYANG,    6, OPTION_TELEM,   0, 0, SW_NRF,    BAYANG_init,     BAYANG_callback     },
225         #endif
226         #if defined(BAYANG_RX_NRF24L01_INO)
227                 {PROTO_BAYANG_RX,  STR_BAYANG_RX, STR_CPPM,       NBR_CPPM, OPTION_NONE,    0, 0, SW_NRF,    BAYANG_RX_init,  BAYANG_RX_callback  },    
228         #endif
229         #if defined(BLUEFLY_CCNRF_INO)
230                 {PROTO_BLUEFLY,    STR_BLUEFLY,   NO_SUBTYPE,            0, OPTION_RFTUNE,  0, 0, SW_NRF,    BLUEFLY_init,    BLUEFLY_callback    },
231         #endif
232         #if defined(BUMBLEB_CCNRF_INO)
233                 {PROTO_BUMBLEB,    STR_BUMBLEB,   NO_SUBTYPE,            0, OPTION_RFTUNE,  0, 0, SW_NRF,    BUMBLEB_init,    BUMBLEB_callback    },
234         #endif
235         #if defined(BUGS_A7105_INO)
236                 {PROTO_BUGS,       STR_BUGS,      NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_A7105,  BUGS_init,       BUGS_callback       },
237         #endif
238         #if defined(BUGSMINI_NRF24L01_INO)
239                 {PROTO_BUGSMINI,   STR_BUGSMINI,  STR_SUBTYPE_BUGS_MINI, 2, OPTION_NONE,    0, 0, SW_NRF,    BUGSMINI_init,   BUGSMINI_callback   },
240         #endif
241         #if defined(CABELL_NRF24L01_INO)                           
242                 {PROTO_CABELL,     STR_CABELL,    STR_SUBTYPE_CABELL,    8, OPTION_OPTION,  0, 0, SW_NRF,    CABELL_init,     CABELL_callback     },
243         #endif
244         #if defined(CFLIE_NRF24L01_INO)
245                 {PROTO_CFLIE,      STR_CFLIE,     NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    CFLIE_init,      CFLIE_callback      }, // review protocol
246         #endif
247         #if defined(CG023_NRF24L01_INO)
248                 {PROTO_CG023,      STR_CG023,     STR_SUBTYPE_CG023,     2, OPTION_NONE,    0, 0, SW_NRF,    CG023_init,      CG023_callback      },
249         #endif
250         #if defined(CORONA_CC2500_INO)
251                 {PROTO_CORONA,     STR_CORONA,    STR_SUBTYPE_CORONA,    3, OPTION_RFTUNE,  0, 0, SW_CC2500, CORONA_init,     CORONA_callback     },
252         #endif
253         #if defined(CX10_NRF24L01_INO)
254                 {PROTO_CX10,       STR_CX10,      STR_SUBTYPE_CX10,      7, OPTION_NONE,    0, 0, SW_NRF,    CX10_init,       CX10_callback       },
255         #endif
256         #if defined(DEVO_CYRF6936_INO)
257                 {PROTO_DEVO,       STR_DEVO,      STR_SUBTYPE_DEVO,      5, OPTION_FIXEDID, 1, 1, SW_CYRF,   DEVO_init,       DEVO_callback       },
258         #endif
259         #if defined(DM002_NRF24L01_INO)
260                 {PROTO_DM002,      STR_DM002,     NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    DM002_init,      DM002_callback      },
261         #endif
262         #if defined(DSM_CYRF6936_INO)
263                 {PROTO_DSM,        STR_DSM,       STR_SUBTYPE_DSM,       7, OPTION_MAXTHR,  0, 1, SW_CYRF,   DSM_init,        DSM_callback        },
264         #endif
265         #if defined(DSM_RX_CYRF6936_INO)
266                 {PROTO_DSM_RX,     STR_DSM_RX,    STR_SUB_DSM_RX,  DSMCPPM, OPTION_NONE,    0, 1, SW_CYRF,   DSM_RX_init,     DSM_RX_callback     },
267         #endif
268         #if defined(E010R5_CYRF6936_INO)
269                 {PROTO_E010R5,     STR_E010R5,    NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_CYRF,   E010R5_init,     E010R5_callback     },
270         #endif
271         #if defined(E016H_NRF24L01_INO)
272                 {PROTO_E016H,      STR_E016H,     NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    E016H_init,      E016H_callback      },
273         #endif
274         #if defined(E016HV2_CC2500_INO)
275                 {PROTO_E016HV2,    STR_E016HV2,   NO_SUBTYPE,            0, OPTION_RFTUNE,  0, 0, SW_CC2500, E016HV2_init,    E016HV2_callback    },
276         #endif
277         #if defined(E01X_CYRF6936_INO)
278                 {PROTO_E01X,       STR_E01X,      STR_SUBTYPE_E01X,      2, OPTION_NONE,    0, 0, SW_CYRF,   E01X_init,       E01X_callback       },
279         #endif
280         #if defined(E129_CYRF6936_INO)
281                 {PROTO_E129,       STR_E129,      STR_SUBTYPE_E129,      2, OPTION_NONE,    0, 0, SW_CYRF,   E129_init,       E129_callback       },
282         #endif
283         #if defined(EAZYRC_NRF24L01_INO)
284                 {PROTO_EAZYRC,     STR_EAZYRC,    NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    EAZYRC_init,     EAZYRC_callback     },
285         #endif
286         #if defined(ESKY_NRF24L01_INO)
287                 {PROTO_ESKY,       STR_ESKY,      STR_SUBTYPE_ESKY,      2, OPTION_NONE,    0, 1, SW_NRF,    ESKY_init,       ESKY_callback       },
288         #endif
289         #if defined(ESKY150_NRF24L01_INO)
290                 {PROTO_ESKY150,    STR_ESKY150,   STR_SUBTYPE_ESKY150,   2, OPTION_NONE,    0, 0, SW_NRF,    ESKY150_init,    ESKY150_callback    },
291         #endif
292         #if defined(ESKY150V2_CC2500_INO)
293                 {PROTO_ESKY150V2,  STR_ESKY150V2, STR_SUBTYPE_ESKY150V2, 1, OPTION_RFTUNE,  0, 1, SW_CC2500, ESKY150V2_init,  ESKY150V2_callback  },
294         #endif
295         #if defined(FLYSKY_A7105_INO)
296                 {PROTO_FLYSKY,     STR_FLYSKY,    STR_SUBTYPE_FLYSKY,    5, OPTION_NONE,    0, 1, SW_A7105,  FLYSKY_init,     FLYSKY_callback     },
297         #endif
298         #if defined(AFHDS2A_A7105_INO)
299                 {PROTO_AFHDS2A,    STR_AFHDS2A,   STR_SUBTYPE_AFHDS2A,   8, OPTION_SRVFREQ, 1, 1, SW_A7105,  AFHDS2A_init,    AFHDS2A_callback    },
300         #endif
301         #if defined(AFHDS2A_RX_A7105_INO)
302                 {PROTO_AFHDS2A_RX, STR_AFHDS2A_RX,STR_CPPM,       NBR_CPPM, OPTION_NONE,    0, 0, SW_A7105,  AFHDS2A_RX_init, AFHDS2A_RX_callback },
303         #endif
304         #if defined(FQ777_NRF24L01_INO)
305                 {PROTO_FQ777,      STR_FQ777,     NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    FQ777_init,      FQ777_callback      },
306         #endif
307 //OpenTX 2.3.x issue: DO NOT CHANGE ORDER below
308         #if defined(FRSKY_RX_CC2500_INO)
309                 {PROTO_FRSKY_RX,   STR_FRSKY_RX,  STR_SUB_FRSKY_RX, FRCPPM, OPTION_RFTUNE,  0, 0, SW_CC2500, FRSKY_RX_init,   FRSKY_RX_callback   },
310         #endif
311         #if defined(FRSKYD_CC2500_INO)
312                 {PROTO_FRSKYD,     STR_FRSKYD,    STR_SUBTYPE_FRSKYD,    2, OPTION_RFTUNE,  0, 0, SW_CC2500, FRSKYD_init,     FRSKYD_callback     },
313         #endif
314         #if defined(FRSKYV_CC2500_INO)
315                 {PROTO_FRSKYV,      STR_FRSKYV,   NO_SUBTYPE,            0, OPTION_RFTUNE,  0, 0, SW_CC2500, FRSKYV_init,     FRSKYV_callback     },
316         #endif
317         #if defined(FRSKYX_CC2500_INO)
318                 {PROTO_FRSKYX,     STR_FRSKYX,    STR_SUBTYPE_FRSKYX,    6, OPTION_RFTUNE,  1, 0, SW_CC2500, FRSKYX_init,     FRSKYX_callback     },
319                 {PROTO_FRSKYX2,    STR_FRSKYX2,   STR_SUBTYPE_FRSKYX,    6, OPTION_RFTUNE,  1, 0, SW_CC2500, FRSKYX_init,     FRSKYX_callback     },
320         #endif
321 //OpenTX 2.3.x issue: DO NOT CHANGE ORDER above
322         #if defined(FRSKYL_CC2500_INO)
323                 {PROTO_FRSKYL,     STR_FRSKYL,    STR_SUBTYPE_FRSKYL,    2, OPTION_RFTUNE,  0, 0, SW_CC2500, FRSKYL_init,     FRSKYL_callback     },
324         #endif
325         #if defined(FRSKYR9_SX1276_INO)
326                 #if MULTI_5IN1_INTERNAL == T18
327                 {PROTO_FRSKY_R9,   STR_FRSKYR9,   STR_SUBTYPE_FRSKYR9,   8, OPTION_NONE,    1, 0, 0,         FRSKYR9_init,    FRSKYR9_callback    },
328                 #else   // DIY & T-Lite
329                 {PROTO_FRSKY_R9,   STR_FRSKYR9,   STR_SUBTYPE_FRSKYR9,   8, OPTION_RFPOWER, 1, 0, 0,         FRSKYR9_init,    FRSKYR9_callback    },
330                 #endif
331         #endif
332         #if defined(FUTABA_CC2500_INO)
333                 {PROTO_FUTABA,     STR_FUTABA,    STR_SUBTYPE_FUTABA,    1, OPTION_RFTUNE,  1, 1, SW_CC2500, SFHSS_init,      SFHSS_callback      },
334         #endif
335         #if defined(FX_NRF24L01_INO)
336                 {PROTO_FX,         STR_FX,        STR_SUBTYPE_FX,        3, OPTION_NONE,    0, 0, SW_NRF,    FX_init,         FX_callback         },
337         #endif
338         #if defined(FY326_NRF24L01_INO)
339                 {PROTO_FY326,      STR_FY326,     STR_SUBTYPE_FY326,     2, OPTION_NONE,    0, 0, SW_NRF,    FY326_init,      FY326_callback      },
340         #endif
341         #if defined(GD00X_CCNRF_INO)
342                 {PROTO_GD00X,      STR_GD00X,     STR_SUBTYPE_GD00X,     2, OPTION_RFTUNE,  0, 0, SW_NRF,    GD00X_init,      GD00X_callback      },
343         #endif
344         #if defined(GW008_NRF24L01_INO)
345                 {PROTO_GW008,      STR_GW008,     NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    GW008_init,      GW008_callback      },
346         #endif
347         #if defined(H8_3D_NRF24L01_INO)
348                 {PROTO_H8_3D,      STR_H8_3D,     STR_SUBTYPE_H83D,      4, OPTION_NONE,    0, 0, SW_NRF,    H8_3D_init,      H8_3D_callback      },
349         #endif
350         #if defined(HEIGHT_A7105_INO)
351                 {PROTO_HEIGHT,     STR_HEIGHT,    STR_SUBTYPE_HEIGHT,    2, OPTION_NONE,    0, 0, SW_A7105,  HEIGHT_init,     HEIGHT_callback     },
352         #endif
353         #if defined(HISKY_NRF24L01_INO)
354                 {PROTO_HISKY,      STR_HISKY,     STR_SUBTYPE_HISKY,     2, OPTION_NONE,    1, 1, SW_NRF,    HISKY_init,      HISKY_callback      },
355         #endif
356         #if defined(HITEC_CC2500_INO)
357                 {PROTO_HITEC,      STR_HITEC,     STR_SUBTYPE_HITEC,     3, OPTION_RFTUNE,  0, 0, SW_CC2500, HITEC_init,      HITEC_callback      },
358         #endif
359         #if defined(HONTAI_NRF24L01_INO)
360                 {PROTO_HONTAI,     STR_HONTAI,    STR_SUBTYPE_HONTAI,    4, OPTION_NONE,    0, 0, SW_NRF,    HONTAI_init,     HONTAI_callback     },
361         #endif
362         #if defined(HOTT_CC2500_INO)
363                 {PROTO_HOTT,       STR_HOTT,      STR_SUBTYPE_HOTT,      2, OPTION_RFTUNE,  1, 0, SW_CC2500, HOTT_init,       HOTT_callback       },
364         #endif
365         #if defined(HUBSAN_A7105_INO)
366                 {PROTO_HUBSAN,     STR_HUBSAN,    STR_SUBTYPE_HUBSAN,    3, OPTION_VIDFREQ, 0, 0, SW_A7105,  HUBSAN_init,     HUBSAN_callback     },
367         #endif
368         #if defined(IKEAANSLUTA_CC2500_INO)
369                 {PROTO_IKEAANSLUTA,STR_IKEAANSLUTA,NO_SUBTYPE,           0, OPTION_OPTION,  0, 0, SW_CC2500, IKEAANSLUTA_init,IKEAANSLUTA_callback },
370         #endif
371         #if defined(J6PRO_CYRF6936_INO)
372                 {PROTO_J6PRO,      STR_J6PRO,     NO_SUBTYPE,            0, OPTION_NONE,    0, 1, SW_CYRF,   J6PRO_init,      J6PRO_callback      },
373         #endif
374         #if defined(JJRC345_NRF24L01_INO)
375                 {PROTO_JJRC345,    STR_JJRC345,   STR_SUBTYPE_JJRC345,   2, OPTION_NONE,    0, 0, SW_NRF,    JJRC345_init,    JJRC345_callback    },
376         #endif
377         #if defined(JOYSWAY_A7105_INO)
378                 {PROTO_JOYSWAY,    STR_JOYSWAY,   NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_A7105,  JOYSWAY_init,    JOYSWAY_callback    },
379         #endif
380         #if defined(KF606_CCNRF_INO)
381                 {PROTO_KF606,      STR_KF606,     STR_SUBTYPE_KF606,     3, OPTION_RFTUNE,  0, 0, SW_NRF,    KF606_init,      KF606_callback      },
382         #endif
383         #if defined(KN_NRF24L01_INO)
384                 {PROTO_KN,         STR_KN,        STR_SUBTYPE_KN,        2, OPTION_NONE,    0, 0, SW_NRF,    KN_init,         KN_callback         },
385         #endif
386         #if defined(KYOSHO_A7105_INO)
387                 {PROTO_KYOSHO,     STR_KYOSHO,    STR_SUBTYPE_KYOSHO,    2, OPTION_NONE,    0, 1, SW_A7105,  KYOSHO_init,     KYOSHO_callback     },
388         #endif
389         #if defined(KYOSHO2_NRF24L01_INO)
390                 {PROTO_KYOSHO2,    STR_KYOSHO2,   STR_SUBTYPE_KYOSHO2,   1, OPTION_NONE,    0, 0, SW_NRF,    KYOSHO2_init,    KYOSHO2_callback    },
391         #endif
392         #if defined(KYOSHO3_CYRF6936_INO)
393                 {PROTO_KYOSHO3,    STR_KYOSHO3,   STR_SUBTYPE_KYOSHO3,   1, OPTION_NONE,    0, 0, SW_CYRF,   KYOSHO3_init,    KYOSHO3_callback    },
394         #endif
395         #if defined(LOLI_NRF24L01_INO)
396                 {PROTO_LOLI,       STR_LOLI,      NO_SUBTYPE,            0, OPTION_NONE,    1, 0, SW_NRF,    LOLI_init,       LOLI_callback       },
397         #endif
398         #if defined(LOSI_CYRF6936_INO)
399                 {PROTO_LOSI,       STR_LOSI,      NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_CYRF,   LOSI_init,       LOSI_callback       },
400         #endif
401         #if defined(MJXQ_CCNRF_INO)
402                 {PROTO_MJXQ,       STR_MJXQ,      STR_SUBTYPE_MJXQ,      7, OPTION_NONE,    0, 0, SW_NRF,    MJXQ_init,       MJXQ_callback       },
403         #endif
404         #if defined(MLINK_CYRF6936_INO)
405                 {PROTO_MLINK,      STR_MLINK,     NO_SUBTYPE,            0, OPTION_NONE,    1, 0, SW_CYRF,   MLINK_init,      MLINK_callback      },
406         #endif
407         #if defined(MOULDKG_NRF24L01_INO)
408                 {PROTO_MOULDKG,    STR_MOULDKG,   STR_SUBTYPE_MOULDKG,   2, OPTION_OPTION,  0, 0, SW_NRF,    MOULDKG_init,    MOULDKG_callback    },
409         #endif
410         #if defined(MT99XX_CCNRF_INO)
411                 {PROTO_MT99XX,     STR_MT99XX,    STR_SUBTYPE_MT99,      8, OPTION_NONE,    0, 0, SW_NRF,    MT99XX_init,     MT99XX_callback     },
412         #endif
413         #if defined(MT99XX_CCNRF_INO)
414                 {PROTO_MT99XX2,    STR_MT99XX2,   STR_SUBTYPE_MT992,     1, OPTION_NONE,    0, 0, SW_NRF,    MT99XX_init,     MT99XX_callback     },
415         #endif
416         #if defined(NCC1701_NRF24L01_INO)
417                 {PROTO_NCC1701,    STR_NCC1701,   NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    NCC_init,        NCC_callback        },
418         #endif
419         #if defined(OMP_CCNRF_INO)
420                 {PROTO_OMP,        STR_OMP,       NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    OMP_init,        OMP_callback        },
421         #endif
422         #if defined(PELIKAN_A7105_INO)
423                 {PROTO_PELIKAN,    STR_PELIKAN,   STR_SUBTYPE_PELIKAN,   3, OPTION_NONE,    0, 1, SW_A7105,  PELIKAN_init,    PELIKAN_callback    },
424         #endif
425         #if defined(POTENSIC_NRF24L01_INO)
426                 {PROTO_POTENSIC,   STR_POTENSIC,  STR_SUBTYPE_POTENSIC,  1, OPTION_NONE,    0, 0, SW_NRF,    POTENSIC_init,   POTENSIC_callback   },
427         #endif
428         #if defined(PROPEL_NRF24L01_INO)
429                 {PROTO_PROPEL,     STR_PROPEL,    STR_SUBTYPE_PROPEL,    1, OPTION_NONE,    0, 0, SW_NRF,    PROPEL_init,     PROPEL_callback     },
430         #endif
431         #if defined(CX10_NRF24L01_INO)
432                 {PROTO_Q2X2,       STR_Q2X2,      STR_SUBTYPE_Q2X2,      3, OPTION_NONE,    0, 0, SW_NRF,    CX10_init,       CX10_callback       },
433         #endif
434         #if defined(Q303_CCNRF_INO)
435                 {PROTO_Q303,       STR_Q303,      STR_SUBTYPE_Q303,      4, OPTION_NONE,    0, 0, SW_NRF,    Q303_init,       Q303_callback       },
436         #endif
437         #if defined(Q90C_CCNRF_INO)
438                 {PROTO_Q90C,       STR_Q90C,      NO_SUBTYPE,            0, OPTION_RFTUNE,  0, 0, SW_NRF,    Q90C_init,       Q90C_callback       },
439         #endif
440         #if defined(RLINK_CC2500_INO)
441                 {PROTO_RLINK,      STR_RLINK,     STR_SUBTYPE_RLINK,     4, OPTION_RFTUNE,  0, 0, SW_CC2500, RLINK_init,      RLINK_callback      },
442         #endif
443         #if defined(REALACC_NRF24L01_INO)
444                 {PROTO_REALACC,    STR_REALACC,   NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    REALACC_init,    REALACC_callback    },
445         #endif
446         #if defined(REDPINE_CC2500_INO)
447                 {PROTO_REDPINE,    STR_REDPINE,   STR_SUBTYPE_REDPINE,   2, OPTION_RFTUNE,  0, 0, SW_CC2500, REDPINE_init,    REDPINE_callback    },
448         #endif
449         #if defined(SCANNER_CC2500_INO)
450                 {PROTO_SCANNER,    STR_SCANNER,   NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_CC2500, SCANNER_init,    SCANNER_callback    },
451         #endif
452         #if defined(SCORPIO_CYRF6936_INO)
453                 {PROTO_SCORPIO,    STR_SCORPIO,   NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_CYRF,   SCORPIO_init,    SCORPIO_callback    },
454         #endif
455         #if defined(SGF22_NRF24L01_INO)
456                 {PROTO_SGF22,      STR_SGF22,     NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    SGF22_init,      SGF22_callback      },
457         #endif
458         #if defined(SHENQI_NRF24L01_INO)
459                 {PROTO_SHENQI,     STR_SHENQI,    NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    SHENQI_init,     SHENQI_callback     },
460         #endif
461         #if defined(SKYARTEC_CC2500_INO)
462                 {PROTO_SKYARTEC,   STR_SKYARTEC,  NO_SUBTYPE,            0, OPTION_RFTUNE,  0, 1, SW_CC2500, SKYARTEC_init,   SKYARTEC_callback   },
463         #endif
464         #if defined(SLT_CCNRF_INO)
465                 {PROTO_SLT,        STR_SLT,       STR_SUBTYPE_SLT,       6, OPTION_RFTUNE,  0, 1, SW_NRF,    SLT_init,        SLT_callback        },
466         #endif
467         #if defined(SYMAX_NRF24L01_INO)
468                 {PROTO_SYMAX,      STR_SYMAX,     STR_SUBTYPE_SYMAX,     2, OPTION_NONE,    0, 0, SW_NRF,    SYMAX_init,      SYMAX_callback      },
469         #endif
470         #if defined(TRAXXAS_CYRF6936_INO)
471                 {PROTO_TRAXXAS,    STR_TRAXXAS,   STR_SUBTYPE_TRAXXAS,   2, OPTION_NONE,    0, 0, SW_CYRF,   TRAXXAS_init,    TRAXXAS_callback    },
472         #endif
473         #if defined(V2X2_NRF24L01_INO)
474                 {PROTO_V2X2,       STR_V2X2,      STR_SUBTYPE_V2X2,      3, OPTION_NONE,    0, 0, SW_NRF,    V2X2_init,       V2X2_callback       },
475         #endif
476         #if defined(V761_NRF24L01_INO)
477                 {PROTO_V761,       STR_V761,      STR_SUBTYPE_V761,      3, OPTION_NONE,    0, 0, SW_NRF,    V761_init,       V761_callback       },
478         #endif
479         #if defined(V911S_CCNRF_INO)
480                 {PROTO_V911S,      STR_V911S,     STR_SUBTYPE_V911S,     2, OPTION_RFTUNE,  0, 0, SW_NRF,    V911S_init,      V911S_callback      },
481         #endif
482         #if defined(WK2x01_CYRF6936_INO)
483                 {PROTO_WK2x01,     STR_WK2x01,    STR_SUBTYPE_WK2x01,    6, OPTION_NONE,    1, 1, SW_CYRF,   WK_init,         WK_callback         },
484         #endif
485         #if defined(WFLY_CYRF6936_INO)
486                 {PROTO_WFLY,       STR_WFLY,      STR_SUBTYPE_WFLY,      1, OPTION_NONE,    1, 0, SW_CYRF,   WFLY_init,       WFLY_callback       },
487         #endif
488         #if defined(WFLY2_A7105_INO)
489                 {PROTO_WFLY2,      STR_WFLY2,     STR_SUBTYPE_WFLY2,     1, OPTION_OPTION,  1, 0, SW_A7105,  WFLY2_init,      WFLY2_callback      },
490 //              {PROTO_WFLY2,      STR_WFLY2,     STR_SUBTYPE_WFLY2,     1, OPTION_WBUS,    1, 0, SW_A7105,  WFLY2_init,      WFLY2_callback      },// crash OpenTX...
491         #endif
492         #if defined(XERALL_NRF24L01_INO)
493                 {PROTO_XERALL,     STR_XERALL,    NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    XERALL_init,     XERALL_callback     },    
494         #endif
495         #if defined(XK_CCNRF_INO)
496                 {PROTO_XK,         STR_XK,        STR_SUBTYPE_XK,        3, OPTION_RFTUNE,  0, 0, SW_NRF,    XK_init,         XK_callback         },    
497         #endif
498         #if defined(XN297DUMP_NRF24L01_INO)
499                 {PROTO_XN297DUMP,  STR_XN297DUMP, STR_SUBTYPE_XN297DUMP, 6, OPTION_RFCHAN,  0, 0, SW_NRF,    XN297Dump_init,  XN297Dump_callback  },
500         #endif
501         #if defined(YD717_NRF24L01_INO)
502                 {PROTO_YD717,      STR_YD717,     STR_SUBTYPE_YD717,     5, OPTION_NONE,    0, 0, SW_NRF,    YD717_init,      YD717_callback      },
503         #endif
504         #if defined(ZSX_NRF24L01_INO)
505                 {PROTO_ZSX,        STR_ZSX,       STR_SUBTYPE_ZSX,       1, OPTION_NONE,    0, 0, SW_NRF,    ZSX_init,        ZSX_callback        },
506         #endif
507         #if defined(TEST_CC2500_INO)
508                 {PROTO_TEST,       STR_TEST,      NO_SUBTYPE,            0, OPTION_RFTUNE,  0, 0, SW_NRF,    TEST_init,       TEST_callback       },
509         #endif
510         #if defined(NANORF_NRF24L01_INO)
511                 {PROTO_NANORF,     STR_NANORF,    NO_SUBTYPE,            0, OPTION_NONE,    0, 0, SW_NRF,    NANORF_init,     NANORF_callback     },
512         #endif
513                 {0xFF,             nullptr,       nullptr,               0, 0,              0, 0, 0,         nullptr,         nullptr             }
516 #ifdef MULTI_TELEMETRY
517 uint16_t PROTOLIST_callback()
519         if(option != prev_option)
520         {//Only send once
521                 /* Type 0x11 Protocol list export via telemetry. Used by the protocol PROTO_PROTOLIST=0, the list entry is given by the Option field.
522                    length: variable
523                    data[0]     = protocol number, 0xFF is an invalid list entry (Option value too large), Option == 0xFF -> number of protocols in the list
524                    data[1..n]  = protocol name null terminated
525                    data[n+1]   = flags
526                                                  flags>>4 Option text number to be displayed (check multi status for description)
527                                                  flags&0x01 failsafe supported
528                                                  flags&0x02 Channel Map Disabled supported
529                    data[n+2]   = number of sub protocols
530                    data[n+3]   = sub protocols text length, only sent if nbr_sub != 0
531                    data[n+4..] = sub protocol names, only sent if nbr_sub != 0
532                 */
533                 prev_option = option;
535                 if(option >= (sizeof(multi_protocols)/sizeof(mm_protocol_definition)) - 1)
536                 {//option is above the end of the list
537                         //Header
538                         multi_send_header(MULTI_TELEMETRY_PROTO, 1);
539                         if(option == 0xFF)
540                                 Serial_write((sizeof(multi_protocols)/sizeof(mm_protocol_definition)) - 1);     //Nbr proto
541                         else
542                                 Serial_write(0xFF);                                                                                                                     //Error
543                 }
544                 else
545                 {//valid option value
546                         uint8_t proto_len = strlen(multi_protocols[option].ProtoString) + 1;
547                         uint8_t nbr_sub = multi_protocols[option].nbrSubProto;
548                         uint8_t sub_len = 0;
549                         if(nbr_sub)
550                                 sub_len = multi_protocols[option].SubProtoString[0];
551                         
552                         //Header
553                         multi_send_header(MULTI_TELEMETRY_PROTO, 1 + proto_len + 1 + 1 + (nbr_sub?1:0) + (nbr_sub * sub_len));
554                         //Protocol number
555                         Serial_write(multi_protocols[option].protocol);
556                         //Protocol name
557                         for(uint8_t i=0;i<proto_len;i++)
558                                 Serial_write(multi_protocols[option].ProtoString[i]);
559                         //Flags
560                         uint8_t flags=0;
561                         #ifdef FAILSAFE_ENABLE
562                                 if(multi_protocols[option].failSafe)
563                                         flags |= 0x01;          //Failsafe supported
564                         #endif
565                         if(multi_protocols[option].chMap)
566                                 flags |= 0x02;                  //Disable_ch_mapping supported
567                         Serial_write( flags | (multi_protocols[option].optionType<<4)); // flags && option type
568                         //Number of sub protocols
569                         Serial_write(nbr_sub);
570                         
571                         if(nbr_sub !=0 )
572                         {//Sub protocols length and texts
573                                 for(uint8_t i=0;i<=nbr_sub*sub_len;i++)
574                                         Serial_write(multi_protocols[option].SubProtoString[i]);
575                         }
576                 }
577         }
578         return 1000;
580 #endif