Compare commits

..

16 Commits

Author SHA1 Message Date
pascallanger
7fadec2d4f Update Protocols_Details.md 2026-08-19 15:12:40 +02:00
pascallanger
0c20c17c7d SGF22/T28: Invert flag
Feature not advertised by the manufacturer
2026-08-19 14:48:42 +02:00
pascallanger
d8c3013bf4 MoFly protocol 2026-08-19 12:57:37 +02:00
Haochen2022
b5e140bd23 Fix MoFly sub-protocol mode, rate and aux switch encoding (#1185) 2026-08-18 12:27:08 +02:00
pascallanger
90dcf034ba MoFly try 1 for Rate 2026-08-16 19:10:59 +02:00
pascallanger
c223fb17b5 Add Protronik 2026-08-16 16:35:52 +02:00
pascallanger
03921d36b9 Update Validate.h 2026-08-16 16:17:49 +02:00
pascallanger
780b4d9bcb XK/MoFly: New sub protocol 2026-08-16 16:12:11 +02:00
pascallanger
d6a969ee28 Update SGF22_nrf24l01.ino 2026-08-16 11:43:27 +02:00
pascallanger
9354abe5fd SGF22/T28: Add features 2026-08-16 11:30:22 +02:00
pascallanger
5984216fbd Update Protocols_Details.md 2026-08-14 14:27:51 +02:00
pascallanger
1fa5452c89 SGF22/T28 new protocol 2026-08-14 14:19:30 +02:00
MRC3742
0f8aceb79f Few updates
Thanks @MRC3742
2026-08-13 20:20:53 +02:00
pascallanger
3bf4ffa764 MT99X/PA18:new try 2026-08-12 11:10:59 +02:00
pascallanger
d750e3b303 Update README.md
Fix code status
2026-08-05 01:13:09 +02:00
pascallanger
79b09468ac WLV8TX small changes and save few bytes 2026-08-05 00:48:46 +02:00
14 changed files with 180 additions and 106 deletions

View File

@@ -167,7 +167,7 @@
74,3,RadioLink,RC4G,0,CH5,FS_CH1,FS_CH2,FS_CH3,FS_CH4
74,4,RadioLink,Dumbo_P,0,CH5,CH6,CH7,CH8GY,CH9,CH10,n-a,n-a,n-a,n-a,n-a,n-a
76,0,Realacc,R11,1,Flip,Light,Calib,HLess,RTH,ThCut,Rotat
76,1,Realacc,WLV8Tx,0,ST_Tr
76,1,Realacc,WLV8TX,0,ST_Tr
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
21,0,Futaba,SFHSS,0,CH5,CH6,CH7,CH8
@@ -201,6 +201,7 @@
62,0,XK,X450,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video
62,1,XK,X420,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light
62,2,XK,Cars,0,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light
109,0,MoFly,Std,0,FMode,Rate,BFlip,LRoll,RRoll,Invert
99,0,XK2,X4,0,Rate,Mode,Hover,Light,Stunt
99,1,XK2,P10,0,Rate,Mode,Hover,Light,Stunt
8,0,YD717,Std,1,Flip,Light,Pict,Video,HLess
@@ -231,6 +232,8 @@
97,0,SGF22,F22,1,Mode,Flip,LED,Pict,Video,TrRes,Bal,HiBal
97,1,SGF22,F22S,1,Mode,Flip,LED,Pict,Video,TrRes
97,2,SGF22,J20,1,Mode,Flip,LED,Pict,Video
97,3,SGF22,CX10,1,Mode,Flip,LED,Pict,Video
97,4,SGF22,T28,1,Mode,Stunt,LED,Invert,RTH,-,-,-,RTH_SET
61,0,EazyRC
98,0,Kyosho3,ASF,0
100,0,YuXiang,Std,0,Lock,Rate,Land,Manual,Flip,Mode,Pitch

View File

@@ -54,7 +54,7 @@ static void __attribute__((unused)) KF606_send_packet()
packet[len-2] = convert_channel_8b_limit_deadband(AILERON,0x00,0x80,0xFF,40); // Aileron: High rate:2B..80..DA
uint8_t p3;
p3 = convert_channel_8b(CH5)>>3; // Aileron trim must be on a separated channel 01..10..1F
p3 += (packet[2]-0x80)>>3; // Drive trims for more aileron authority
p3 += (packet[len-2]-0x80)>>3; // Drive trims for more aileron authority
if(p3 > 0x80)
p3 = 0x01;
else if(p3 > 0x1F)

View File

@@ -129,13 +129,18 @@ static void __attribute__((unused)) MT99XX_send_packet()
static uint8_t seq_num=0;
//Set RF freq
if(sub_protocol == LS)
XN297_RFChannel(0x2D); // LS always transmits on the same channel
if(IS_BIND_IN_PROGRESS && sub_protocol == PA18+8)
XN297_RFChannel(0x02);
else
if(sub_protocol==FY805)
XN297_RFChannel(0x4B); // FY805 always transmits on the same channel
else // MT99 & H7 & YZ & A180 & DRAGON & F949G & PA18
XN297_Hopping(hopping_frequency_no);
{
if(sub_protocol == LS)
XN297_RFChannel(0x2D); // LS always transmits on the same channel
else
if(sub_protocol==FY805)
XN297_RFChannel(0x4B); // FY805 always transmits on the same channel
else // MT99 & H7 & YZ & A180 & DRAGON & F949G & PA18
XN297_Hopping(hopping_frequency_no);
}
if(IS_BIND_IN_PROGRESS)
{

View File

@@ -73,7 +73,7 @@
73,Kyosho,FHSS,Hype
74,RadioLink,Surface,Air,DumboRC,RC4G,Dumbo_P
75,---
76,Realacc,R11,WL-V8Tx
76,Realacc,R11,WLV8TX
77,OMP
78,M-Link
79,WFLY,RF20x
@@ -93,7 +93,7 @@
94,Scorpio
95,BlueFly
96,BumbleB
97,SGF22,F22,F22S,J20
97,SGF22,F22,F22S,J20,CX10,T28
98,Kyosho3
99,XK2,X4,P10
100,YuXiang
@@ -103,4 +103,5 @@
105,Shenqi2
106,WL91x
107,WPL
108,0,Ares
108,Ares
109,MoFly

View File

@@ -84,6 +84,7 @@ const char STR_FX[] ="FX";
const char STR_BAYANG_RX[] ="BayanRX";
const char STR_PELIKAN[] ="Pelikan";
const char STR_XK[] ="XK";
const char STR_MOFLY[] ="MoFly";
const char STR_XK2[] ="XK2";
const char STR_XN297DUMP[] ="XN297DP";
const char STR_FRSKYR9[] ="FrSkyR9";
@@ -170,7 +171,7 @@ const char STR_SUBTYPE_XN297DUMP[] = "\x07""250Kbps""1Mbps\0 ""2Mbps\0 ""Auto\0
const char STR_SUBTYPE_ESKY150[] = "\x03""4ch""7ch";
const char STR_SUBTYPE_ESKY150V2[] = "\x05""150V2";
const char STR_SUBTYPE_V911S[] = "\x05""V911S""E119\0";
const char STR_SUBTYPE_XK[] = "\x04""X450""X420""Cars";
const char STR_SUBTYPE_XK[] = "\x05""X450\0""X420\0""Cars\0";
const char STR_SUBTYPE_XK2[] = "\x03""X4\0""P10";
const char STR_SUBTYPE_FRSKYR9[] = "\x07""915MHz\0""868MHz\0""915 8ch""868 8ch""FCC\0 ""--\0 ""FCC 8ch""-- 8ch\0";
const char STR_SUBTYPE_ESKY[] = "\x03""Std""ET4";
@@ -182,7 +183,7 @@ const char STR_SUBTYPE_HOTT[] = "\x07""Sync\0 ""No_Sync";
const char STR_SUBTYPE_PELIKAN[] = "\x05""Pro\0 ""Lite\0""SCX24";
const char STR_SUBTYPE_V761[] = "\x05""3ch\0 ""4ch\0 ""TOPRC";
const char STR_SUBTYPE_RLINK[] = "\x07""Surface""Air\0 ""DumboRC""RC4G\0 ""Dumbo_P";
const char STR_SUBTYPE_REALACC[] = "\x07""R11\0 ""WL-V8Tx";
const char STR_SUBTYPE_REALACC[] = "\x06""R11\0 ""WLV8TX";
const char STR_SUBTYPE_KYOSHO[] = "\x04""FHSS""Hype";
const char STR_SUBTYPE_KYOSHO2[] = "\x05""KT-17";
const char STR_SUBTYPE_KYOSHO3[] = "\x03""ASF";
@@ -192,7 +193,7 @@ const char STR_SUBTYPE_MOULDKG[] = "\x05""A4444""D4444""A664\0";
const char STR_SUBTYPE_KF606[] = "\x06""KF606\0""MIG320""ZCZ50\0";
const char STR_SUBTYPE_E129[] = "\x04""E129""C186";
const char STR_SUBTYPE_FX[] = "\x05""FX816""FX620""9630\0""Q560\0""QF012""BM26\0""A570\0";
const char STR_SUBTYPE_SGF22[] = "\x04""F22\0""F22S""J20\0""CX10";
const char STR_SUBTYPE_SGF22[] = "\x04""F22\0""F22S""J20\0""CX10""T28\0";
const char STR_SUBTYPE_JIABAILE[] = "\x04""Std\0""Gyro";
#define NO_SUBTYPE nullptr
@@ -431,6 +432,9 @@ const mm_protocol_definition multi_protocols[] = {
#if defined(MLINK_CYRF6936_INO)
{PROTO_MLINK, STR_MLINK, NO_SUBTYPE, 0, OPTION_NONE, 1, 0, SW_CYRF, MLINK_init, MLINK_callback },
#endif
#if defined(XK_CCNRF_INO)
{PROTO_MOFLY, STR_MOFLY, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, XK_init, XK_callback },
#endif
#if defined(MOULDKG_NRF24L01_INO)
{PROTO_MOULDKG, STR_MOULDKG, STR_SUBTYPE_MOULDKG, 3, OPTION_OPTION, 0, 0, SW_NRF, MOULDKG_init, MOULDKG_callback },
#endif
@@ -480,7 +484,7 @@ const mm_protocol_definition multi_protocols[] = {
{PROTO_SCORPIO, STR_SCORPIO, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_CYRF, SCORPIO_init, SCORPIO_callback },
#endif
#if defined(SGF22_NRF24L01_INO)
{PROTO_SGF22, STR_SGF22, STR_SUBTYPE_SGF22, 4, OPTION_NONE, 0, 0, SW_NRF, SGF22_init, SGF22_callback },
{PROTO_SGF22, STR_SGF22, STR_SUBTYPE_SGF22, 5, OPTION_NONE, 0, 0, SW_NRF, SGF22_init, SGF22_callback },
#endif
#if defined(SHENQI_NRF24L01_INO)
{PROTO_SHENQI, STR_SHENQI, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, SHENQI_init, SHENQI_callback },

View File

@@ -19,7 +19,7 @@
#define VERSION_MAJOR 1
#define VERSION_MINOR 3
#define VERSION_REVISION 4
#define VERSION_PATCH_LEVEL 63
#define VERSION_PATCH_LEVEL 69
#define MODE_SERIAL 0
@@ -136,6 +136,7 @@ enum PROTOCOLS
PROTO_WL91X = 106, // =>CC2500 & NRF24L01
PROTO_WPL = 107, // =>NRF24L01
PROTO_ARES = 108, // =>CC2500
PROTO_MOFLY = 109, // =>CC2500 & NRF24L01
PROTO_NANORF = 126, // =>NRF24L01
PROTO_TEST = 127, // =>CC2500
@@ -515,6 +516,7 @@ enum SGF22
SGF22_F22S = 1,
SGF22_J20 = 2,
SGF22_CX10 = 3,
SGF22_T28 = 4,
};
enum JIABAILE
{
@@ -1172,6 +1174,8 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
sub_protocol==XK
X450 0
X420 1
Cars 2
MoFly 3
sub_protocol==FRSKY_R9
R9_915 0
R9_868 1

View File

@@ -639,7 +639,8 @@ void setup()
if (protocol==PROTO_ARES)
option = FORCE_ARES_TUNING; // Use config-defined tuning value for ARES
else
#endif option = (uint8_t)PPM_prot_line->option; // Use radio-defined option value
#endif
option = (uint8_t)PPM_prot_line->option; // Use radio-defined option value
if(PPM_prot_line->power) POWER_FLAG_on;
if(PPM_prot_line->autobind)

View File

@@ -42,8 +42,6 @@ enum
REALACC_WLV8TX_DATA
};
static uint8_t realacc_phase;
static bool realacc_wlv8tx_rx_b3;
#endif
static uint8_t realacc_bind_packet[REALACC_BIND_PAYLOAD_SIZE];
@@ -100,7 +98,7 @@ static void __attribute__((unused)) REALACC_send_packet()
static void __attribute__((unused)) REALACC_send_bind_packet()
{
#ifndef MULTI_AIR
if(sub_protocol == REALACC_WLV8TX && realacc_wlv8tx_rx_b3)
if(sub_protocol == REALACC_WLV8TX && rx_id[0])
{ // WLV8TX bind sent after RX packet B3 acknowledged
packet[0] = 0xB4;
packet[1] = rx_id[1];
@@ -187,21 +185,21 @@ static void __attribute__((unused)) REALACC_wlv8tx_process_rx()
if(len != 3)
return;
if(packet_in[0] == 0xB3 && !realacc_wlv8tx_rx_b3)
if(packet_in[0] == 0xB3 && !rx_id[0])
{
realacc_wlv8tx_rx_b3 = true;
rx_id[0] = 0x01;
rx_id[1] = packet_in[1];
rx_id[2] = packet_in[2];
rx_tx_addr[2] ^= packet_in[1];
rx_tx_addr[3] ^= packet_in[2];
rx_tx_addr[3] |= 0x80;
}
else if(packet_in[0] == 0xB5 && realacc_wlv8tx_rx_b3)
else if(packet_in[0] == 0xB5 && rx_id[0])
{
BIND_DONE;
XN297_SetTXAddr(rx_tx_addr, 4);
XN297_SetTxRxMode(TXRX_OFF);
realacc_phase = REALACC_WLV8TX_DATA;
BIND_DONE;
XN297_SetTXAddr(rx_tx_addr, 4);
XN297_SetTxRxMode(TXRX_OFF);
bind_phase = REALACC_WLV8TX_DATA;
}
}
#endif
@@ -222,34 +220,34 @@ uint16_t REALACC_callback()
#else
if(sub_protocol == REALACC_WLV8TX)
{
if(realacc_phase == REALACC_WLV8TX_DATA)
if(bind_phase == REALACC_WLV8TX_DATA)
{
XN297_SetTxRxMode(TX_EN);
REALACC_send_packet();
return WLV8TX_PACKET_PERIOD;
}
if(realacc_phase == REALACC_WLV8TX_BIND_RX_SETUP)
if(bind_phase == REALACC_WLV8TX_BIND_RX_SETUP)
{
XN297_SetTxRxMode(TXRX_OFF);
XN297_SetTxRxMode(RX_EN);
realacc_phase = REALACC_WLV8TX_BIND_RX_CHECK;
bind_phase = REALACC_WLV8TX_BIND_RX_CHECK;
return WLV8TX_PACKET_PERIOD/3;
}
if(realacc_phase == REALACC_WLV8TX_BIND_RX_CHECK)
if(bind_phase == REALACC_WLV8TX_BIND_RX_CHECK)
{
REALACC_wlv8tx_process_rx();
if(realacc_phase == REALACC_WLV8TX_DATA)
if(bind_phase == REALACC_WLV8TX_DATA)
return WLV8TX_PACKET_PERIOD;
realacc_phase = REALACC_WLV8TX_BIND_TX;
bind_phase = REALACC_WLV8TX_BIND_TX;
return WLV8TX_PACKET_PERIOD/3;
}
//Bind Phase
XN297_SetTxRxMode(TXRX_OFF);
XN297_SetTxRxMode(TX_EN);
REALACC_send_bind_packet();
realacc_phase = REALACC_WLV8TX_BIND_RX_SETUP;
bind_phase = REALACC_WLV8TX_BIND_RX_SETUP;
return WLV8TX_PACKET_PERIOD/3;
}
#endif
@@ -277,10 +275,10 @@ void REALACC_init()
#ifndef MULTI_AIR
if(sub_protocol == REALACC_WLV8TX)
{
rx_id[0] = 0; // realacc_wlv8tx_rx_b3
rx_id[1] = 0;
rx_id[2] = 0;
realacc_wlv8tx_rx_b3 = false;
realacc_phase = REALACC_WLV8TX_BIND_TX;
bind_phase = REALACC_WLV8TX_BIND_TX;
memcpy(packet, realacc_bind_packet, 4);
packet[3] |= 0x80;
XN297_SetRXAddr(packet, 4);

View File

@@ -25,10 +25,12 @@ Multiprotocol is distributed in the hope that it will be useful,
#define SGF22_PAYLOAD_SIZE 12
#define SGF22_BIND_COUNT 50
#define SGF22_RF_NUM_CHANNELS 4
#define SGF22_BIND_RF_CHANNEL 78
#define SGF22_F22S_BIND_RF_CHANNEL 10
#define SGF22_J20_BIND_RF_CHANNEL 28
#define SGF22_CX10_BIND_RF_CHANNEL 48
#define SGF22_T28_BIND_RF_CHANNEL 28
//packet[8]
#define SGF22_FLAG_3D 0x00
@@ -44,6 +46,8 @@ Multiprotocol is distributed in the hope that it will be useful,
#define SGF22_FX922_FLAG_BALANCEHIGH 0x01
#define SGF22_FX922_FLAG_BALANCE 0x02
#define SGF22_T28_RTH_SET 0x20
#define SGF22_T28_FLAG_OPTIMIZED 0x80
//packet[9]
#define SGF22_FLAG_TRIMRESET 0x04
@@ -88,11 +92,12 @@ static void __attribute__((unused)) SGF22_send_packet()
| GET_FLAG(CH7_SW, SGF22_FLAG_LIGHT) // push up throttle trim for light in the stock TX
| GET_FLAG(CH9_SW, SGF22_FLAG_VIDEO) // push down throttle trim for video in the stock TX
| GET_FLAG(CH11_SW, SGF22_FX922_FLAG_BALANCE)
| GET_FLAG(CH12_SW, SGF22_FX922_FLAG_BALANCEHIGH);
| GET_FLAG(CH12_SW, SGF22_FX922_FLAG_BALANCEHIGH)
| GET_FLAG(CH13_SW, SGF22_T28_RTH_SET);
if(Channel_data[CH5] > CHANNEL_MAX_COMMAND)
packet[8] |= SGF22_FLAG_VERTICAL; // CH5 100%, vertical mode (torque)
packet[8] |= ( sub_protocol == SGF22_T28 ? SGF22_T28_FLAG_OPTIMIZED : SGF22_FLAG_VERTICAL); // CH5 100%, vertical mode (torque)
else if(Channel_data[CH5] > CHANNEL_MIN_COMMAND )
packet[8] |= ( sub_protocol == SGF22_J20 ? SGF22_J20_FLAG_HORIZONTAL : SGF22_FLAG_6G ); // CH5 0%, F22 & F22S - 6G mode, J20 - Horizontal mode
packet[8] |= ( sub_protocol == SGF22_J20 ? SGF22_J20_FLAG_HORIZONTAL : SGF22_FLAG_6G ); // CH5 0%, F22 & F22S - 6G mode, J20 - Horizontal mode
}
else //SGF22_CX10 114548
{
@@ -111,7 +116,7 @@ static void __attribute__((unused)) SGF22_send_packet()
packet[10] = 0x42; // no fine tune
packet[11] = 0x10; // no fine tune
}
if(sub_protocol == SGF22_F22S)
if(sub_protocol == SGF22_F22S || sub_protocol == SGF22_T28)
packet[0] += 6;
else if (sub_protocol == SGF22_J20)
packet[0] += 3;
@@ -200,7 +205,7 @@ static void __attribute__((unused)) SGF22_RF_init()
XN297_SetRXAddr((uint8_t*)"\xC7\x95\x3C\xBB\xA5", SGF22_PAYLOAD_SIZE);
#endif
const uint8_t bind_chan[] = {SGF22_BIND_RF_CHANNEL, SGF22_F22S_BIND_RF_CHANNEL, SGF22_J20_BIND_RF_CHANNEL, SGF22_CX10_BIND_RF_CHANNEL};
const uint8_t bind_chan[] = {SGF22_BIND_RF_CHANNEL, SGF22_F22S_BIND_RF_CHANNEL, SGF22_J20_BIND_RF_CHANNEL, SGF22_CX10_BIND_RF_CHANNEL, SGF22_T28_BIND_RF_CHANNEL};
XN297_RFChannel(bind_chan[sub_protocol]); // Set bind channel
}

View File

@@ -387,12 +387,9 @@
#ifdef MULTI_AIR
#undef JOYSWAY_A7105_INO
//#undef KYOSHO_A7105_INO
//#undef PELIKAN_A7105_INO
#undef LOSI_CYRF6936_INO //Need DSM to be enabled
#undef TRAXXAS_CYRF6936_INO
#undef EAZYRC_NRF24L01_INO
//#undef KYOSHO2_NRF24L01_INO
#undef KYOSHO3_CYRF6936_INO
#undef MOULDKG_NRF24L01_INO
#undef SHENQI_NRF24L01_INO
@@ -406,6 +403,7 @@
#if defined(MULTI_AIR) || defined(MCU_STM32F103C8)
// Save flash space...
#undef ARES_CC2500_INO
#undef BUMBLEB_CCNRF_INO
#undef CABELL_NRF24L01_INO
#undef FQ777_NRF24L01_INO

View File

@@ -68,43 +68,65 @@ static void __attribute__((unused)) XK_send_packet()
memset(packet,0x00,7);
memset(&packet[10],0x00,5);
packet[12]=0x40;
packet[13]=0x40;
if(IS_BIND_IN_PROGRESS)
packet[14] = 0xC0;
if(protocol != PROTO_MOFLY)
{
packet[12]=0x40;
packet[13]=0x40;
if(IS_BIND_IN_PROGRESS)
packet[14] = 0xC0;
else
{
uint16_t val=convert_channel_10b(THROTTLE, false);
packet[0] = val>>2; // 0..255
packet[12] |= val & 2;
val=XK_convert_channel(RUDDER);
packet[1] = val>>2;
packet[12] |= (val & 2)<<2;
val=XK_convert_channel(ELEVATOR);
packet[2] = val>>2;
packet[13] |= val & 2;
val=XK_convert_channel(AILERON);
packet[3] = val>>2;
packet[13] |= (val & 2)<<2;
memset(&packet[4],0x40,3); // Trims
if(CH5_SW)
packet[10] = 0x10; // V-Mode
else
if(Channel_data[CH5] > CHANNEL_MIN_COMMAND)
packet[10] = 0x04; // 6G-Mode
//0x00 default M-Mode
packet[10] |= GET_FLAG(CH7_SW ,0x80); // Emergency stop momentary switch
packet[11] = GET_FLAG(CH8_SW ,0x03) // 3D/6G momentary switch
|GET_FLAG(CH6_SW ,0x40); // Take off momentary switch
packet[14] = GET_FLAG(CH9_SW ,0x01) // Photo momentary switch
|GET_FLAG(CH10_SW,0x02) // Video momentary switch
|GET_FLAG(CH11_SW,0x04) // Flip
|GET_FLAG(CH12_SW,0x10); // Light
//debugln("P1:%02X,P12:%02X",packet[1],packet[12]);
}
}
else
{
uint16_t val=convert_channel_10b(THROTTLE, false);
packet[0] = val>>2; // 0..255
packet[12] |= val & 2;
val=XK_convert_channel(RUDDER);
packet[1] = val>>2;
packet[12] |= (val & 2)<<2;
val=XK_convert_channel(ELEVATOR);
packet[2] = val>>2;
packet[13] |= val & 2;
val=XK_convert_channel(AILERON);
packet[3] = val>>2;
packet[13] |= (val & 2)<<2;
memset(&packet[4],0x40,3); // Trims
if(Channel_data[CH5] > CHANNEL_MAX_COMMAND)
packet[10] = 0x10; // V-Mode
packet[0] = convert_channel_8b(THROTTLE);
packet[1] = convert_channel_s8b(RUDDER);
packet[2] = convert_channel_s8b(ELEVATOR);
packet[3] = convert_channel_s8b(AILERON);
memset(&packet[4],0x40,3); // Trims centered
//0x00 default MM Mode
if(CH5_SW)
packet[10] = 0x01; // 6G Mode
else
if(Channel_data[CH5] > CHANNEL_MIN_COMMAND)
packet[10] = 0x04; // 6G-Mode
//0x00 default M-Mode
packet[10] |= GET_FLAG(CH7_SW ,0x80); // Emergency stop momentary switch
packet[11] = GET_FLAG(CH8_SW ,0x03) // 3D/6G momentary switch
|GET_FLAG(CH6_SW ,0x40); // Take off momentary switch
packet[14] = GET_FLAG(CH9_SW ,0x01) // Photo momentary switch
|GET_FLAG(CH10_SW,0x02) // Video momentary switch
|GET_FLAG(CH11_SW,0x04) // Flip
|GET_FLAG(CH12_SW,0x10); // Light
//debugln("P1:%02X,P12:%02X",packet[1],packet[12]);
packet[10] = 0x02; // 3D-Mode
packet[10] |= GET_FLAG(CH6_SW ,0x04); // Low/High rate
packet[11] = GET_FLAG(CH7_SW ,0x10) // Back Flip - momentary switch
|GET_FLAG(CH8_SW ,0x20) // Left Roll - momentary switch
|GET_FLAG(CH9_SW ,0x04) // Right Roll - momentary switch
|GET_FLAG(CH10_SW,0x08); // Inverted Flight - latching switch
}
crc=packet[0];
@@ -112,10 +134,10 @@ static void __attribute__((unused)) XK_send_packet()
crc+=packet[i];
packet[15]=crc;
// debug("C: %02X, P:",hopping_frequency[rf_ch_num]);
// for(uint8_t i=0; i<XK_PAYLOAD_SIZE; i++)
// debug(" %02X",packet[i]);
// debugln("");
debug("C: %02X, P:",hopping_frequency[rf_ch_num]);
for(uint8_t i=0; i<XK_PAYLOAD_SIZE; i++)
debug(" %02X",packet[i]);
debugln("");
// Send
XN297_SetPower(); // Set tx_power
@@ -128,7 +150,7 @@ const uint8_t PROGMEM XK_bind_hop[XK_RF_BIND_NUM_CHANNELS]= { 0x07, 0x24, 0x3E,
const uint8_t PROGMEM XK_tx_addr[]= { 0xB3, 0x67, 0xE9, 0x98, 0x3A, 0xEC, 0xA6, 0x59, 0xB2, 0x94, 0x2B, 0xA5, 0x37, 0xC5, 0x4A, 0xD3,
0x49, 0xA6, 0x83, 0xEB, 0x4B, 0xC9, 0x59, 0xD2, 0x65, 0x34, 0x6A, 0xD3, 0x2C, 0x96, 0x2A, 0xA9,
0x32, 0xB2, 0xB4, 0x49, 0xD3, 0x37, 0xE9 };
0x32, 0xB2, 0xB4, 0x49, 0xD3, 0x37, 0xE9 }; // last one in the table is 0x68 but not reachable
const uint8_t PROGMEM XK_hop[]= { 0x47, 0x3A, 0x4C, 0x39, 0x4D, 0x34, 0x4A, 0x3F, 0x45, 0x3E, 0x4B, 0x3D, 0x3B, 0x48, 0x40, 0x49,
0x46, 0x3C, 0x43, 0x38, 0x35, 0x42, 0x33, 0x44, 0x4E, 0x37, 0x44, 0x35, 0x37, 0x4E, 0x36, 0x41 };
@@ -196,7 +218,7 @@ static void __attribute__((unused)) XK_initialize_txid()
static void __attribute__((unused)) XK_RF_init()
{
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, sub_protocol==X450 ? XN297_250K : XN297_1M );
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, sub_protocol==X450 ? XN297_250K : XN297_1M ); //MoFly equals to X450 here
XN297_SetTXAddr((uint8_t*)"\x68\x94\xA6\xD5\xC3", 5); // Bind address
XN297_HoppingCalib(XK_RF_BIND_NUM_CHANNELS+XK_RF_NUM_CHANNELS); // Calibrate all channels
}
@@ -218,7 +240,7 @@ uint16_t XK_callback()
void XK_init()
{
if(sub_protocol != XK_CARS)
if(sub_protocol != XK_CARS && protocol != PROTO_MOFLY)
BIND_IN_PROGRESS; // Autobind protocol
XK_initialize_txid();
XK_RF_init();

View File

@@ -281,7 +281,7 @@
#define UDIRC_CCNRF_INO
#define V911S_CCNRF_INO
#define WL91X_CCNRF_INO
#define XK_CCNRF_INO
#define XK_CCNRF_INO //Include MoFly protocol
#define XK2_CCNRF_INO
//The protocols below need a SX1276 to be installed
@@ -789,6 +789,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
PHOENIX
PROTO_MLINK
NONE
PROTO_MOFLY
NONE
PROTO_MOULDKG
MOULDKG_ANALOG4
MOULDKG_DIGIT4
@@ -829,7 +831,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
PROTO_Q90C
NONE
PROTO_REALACC
NONE
REALACC_R11
REALACC_WLV8TX
PROTO_REDPINE
RED_FAST
RED_SLOW
@@ -844,10 +847,11 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
PROTO_SCORPIO
NONE
PROTO_SGF22
SGF22
F22S
J20
CX10
SGF22_F22
SGF22_F22S
SGF22_J20
SGF22_CX10
SGF22_T28
PROTO_SHENQI
NONE
PROTO_SHENQI2

View File

@@ -126,6 +126,7 @@ CFlie|AIR|38|CFlie||||||||NRF24L01|
[Losi](Protocols_Details.md#Losi---89)||89|||||||||CYRF6936|
[MJXq](Protocols_Details.md#MJXQ---18)||18|WLH08|X600|X800|H26D|E010*|H26WH|PHOENIX*||NRF24L01|XN297
[MLINK](Protocols_Details.md#MLINK---78)||78|||||||||CYRF6936|
[MoFly](Protocols_Details.md#MoFly---109)||109|||||||||NRF24L01&CC2500|XN297
[MouldKg](Protocols_Details.md#mouldkg---90)||90|A4444|D4444|A664||||||NRF24L01|XN297
[MT99xx](Protocols_Details.md#MT99XX---17)||17|MT|H7|YZ|LS|FY805|A180|DRAGON|F949G|NRF24L01|XN297
[MT99xx2](Protocols_Details.md#MT99XX2---92)||92|PA18|SU35|||||||NRF24L01|XN297
@@ -139,11 +140,11 @@ CFlie|AIR|38|CFlie||||||||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|Air|DumboRC|RC4G|Dumbo_P||||CC2500|
[Realacc](Protocols_Details.md#Realacc---76)||76|R11|WL-V8Tx|||||||NRF24L01|
[Realacc](Protocols_Details.md#Realacc---76)||76|R11|WLV8TX|||||||NRF24L01|
[Redpine](Protocols_Details.md#Redpine---50)||50|FAST|SLOW|||||||NRF24L01|XN297
[Scanner](Protocols_Details.md#Scanner---54)||54|||||||||CC2500|
[Scorpio](Protocols_Details.md#Scorpio---94)||94|||||||||CYRF6936|
[SGF22](Protocols_Details.md#SGF22---97)||97|F22|F22S|J20|CX10|||||NRF24L01|XN297
[SGF22](Protocols_Details.md#SGF22---97)||97|F22|F22S|J20|CX10|T28||||NRF24L01|XN297
[Shenqi](Protocols_Details.md#Shenqi---19)||19|Shenqi||||||||NRF24L01|LT8900
[Shenqi2](Protocols_Details.md#Shenqi2---105)||105|Shenqi2||||||||NRF24L01|XN297
[Skyartec](Protocols_Details.md#Skyartec---68)||68|||||||||CC2500|CC2500
@@ -159,7 +160,7 @@ CFlie|AIR|38|CFlie||||||||NRF24L01|
[WL91X](Protocols_Details.md#WL91X---106)||106|||||||||NRF24L01&CC2500|XN297
[WPL](Protocols_Details.md#WPL---107)||107|||||||||NRF24L01|XN297
[XERALL](Protocols_Details.md#XERALL---91)||91|Tank||||||||NRF24L01|XN297
[XK](Protocols_Details.md#XK---62)||62|X450|X420|Cars||||||NRF24L01&CC2500|XN297
[XK](Protocols_Details.md#XK---62)||62|X450|X420|Cars|MoFly|||||NRF24L01&CC2500|XN297
[XK2](Protocols_Details.md#XK2---99)||99|X4|P10|||||||NRF24L01&CC2500|XN297
[YD717](Protocols_Details.md#YD717---8)||8|YD717|SKYWLKR|SYMAX4|XINXUN|NIHUI||||NRF24L01|
[YuXiang](Protocols_Details.md#YuXiang---100)||100|||||||||NRF24L01|XN297
@@ -238,21 +239,21 @@ Option is used to change the servo refresh rate. A value of 0 gives 50Hz (min),
### Sub_protocol PWM_IBUS - *0*
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|CH17
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14CH15|CH16|LQI
A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|LQI
RX output will match the Flysky standard AETR.
### Sub_protocol PPM_IBUS - *1*
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|CH17
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14CH15|CH16|LQI
A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|LQI
RX output will match the Flysky standard AETR.
### Sub_protocol PWM_SBUS - *2*
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|CH17
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14CH15|CH16|LQI
A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|LQI
RX output will match the Flysky standard AETR.
@@ -811,6 +812,8 @@ To bind V2 RXs you must follow the below procedure (original):
### Sub_protocol FD_V3 - *2*
FlyDream RXs like IS-4R and IS-4R0
Protronik (PTR-6A) RXs like R8X: you need to initiate binding on the receiver, then on the transmitter, and finally press the bind button on the receiver.
## E016HV2 - *80*
Models: E016H v2
@@ -1255,6 +1258,19 @@ If a CC2500 is installed it will be used for this sub protocol. Option in this c
If only a NRF24L01 is installed then this sub protocol might be problematic because it is using the xn297L emulation with a transmission speed of 250kbps which doesn't work very well with every NRF24L01, this is an hardware issue with the authenticity and accuracy of the components.
## MoFly - *109*
Models: MoFly planes MF-X7, P-51D, MF-A84 and Ki-84
If a CC2500 is installed it will be used for this sub protocol. Option in this case is used for fine frequency tuning like any CC2500 protocols so check the [Frequency Tuning page](/docs/Frequency_Tuning.md).
If only a NRF24L01 is installed then this sub protocol might be problematic because it is using the xn297L emulation with a transmission speed of 250kbps which doesn't work very well with every NRF24L01, this is an hardware issue with the authenticity and accuracy of the components.
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10
---|---|---|---|---|---|---|---|---|----
A|E|T|R|Flight_modes|Rate_L/H|Back_Flip|Left_Roll|Right_Roll|Inverted
Flight_modes: -100%=MM-Mode, 0%=3D-Mode, +100%=6G-Mode. CH7-CH9 are momentary switches. CH10 is a toggle switch.
## MT99XX - *17*
Autobind protocol
@@ -1605,7 +1621,7 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10
---|---|---|---|---|---|---|---|---|----
A|E|T|R|Flight_modes|Take_off|Emerg stop|3D/6G|Picture|Video
Flight_modes: -100%=M-Mode, 0%=6G-Mode, +100%=V-Mode. CH6-CH10 are mementary switches.
Flight_modes: -100%=M-Mode, 0%=6G-Mode, +100%=V-Mode. CH6-CH10 are momentary switches.
### Sub_protocol X420 - *1*
Models: XK X420/X520 (TX=X4)
@@ -1614,7 +1630,7 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10
---|---|---|---|---|---|---|---|---|----
A|E|T|R|Flight_modes|Take_off|Emerg stop|3D/6G|Picture|Video
Flight_modes: -100%=M-Mode, 0%=6G-Mode, +100%=V-Mode. CH6-CH10 are mementary switches.
Flight_modes: -100%=M-Mode, 0%=6G-Mode, +100%=V-Mode. CH6-CH10 are momentary switches.
Model: Tiger Drone 1400782
@@ -1930,7 +1946,7 @@ FX9630 and FX9603 Gyro: -100%=6G small throw, 0%=6G large throw, +100%=3D
QIDI-550 Gyro: -100%=3D, 0%=6G, +100%=Torque
### Sub_protocol Q560 - *3*
Model: QIDI-560, QIDI-580 (Cirrus SR22)
Model: QIDI-560, QIDI-580, QIDI-590
CH1|CH2|CH3|CH4|CH5|CH6|CH7
---|---|---|---|---|---|---
@@ -2342,7 +2358,7 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
---|---|---|---|---|---|---|---|---|----|----
A|E|T|R|FLIP|LIGHT|CALIB|HLESS|RTH|THR_CUT|ROTATE
### Sub_protocol WL-V8Tx - *1*
### Sub_protocol WLV8TX - *1*
Models: WLtoys 284019A, 284191, Cars using V8 Transmitter
@@ -2365,9 +2381,9 @@ ST TRIM: -100% Left, +100% Right, variable/shouldn't be needed? CH1 trim on stee
## SGF22 - *97*
Autobind protocol
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12
---|---|---|---|---|---|---|---|---|---|---|---
A|E|T|R|MODE|FLIP|LIGHT|PHOTO|VIDEO|TRIMRESET|BAL|BALHIG
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13
---|---|---|---|---|---|---|---|---|---|---|---|---
A|E|T|R|MODE|FLIP|LIGHT|PHOTO|VIDEO|TRIMRESET|BAL|BALHIG|RTH_SET
Telemetry is supported. The plane sends a battery status of good->empty which is visible in A1 (good=13.2V->empty=0V) and RSSI gets a dummy value of 100.
@@ -2388,14 +2404,27 @@ Mode -100% = 3D, 0% = 6G
### Sub_protocol J20
Model: KF700 J20
Mode -100% = Gyro off, 0% = Horizontal, 100% = Vertical. CH8 - Invert, CH10 - Fix Height (Altitude hold)
Mode: -100% = Gyro off, 0% = Horizontal, 100% = Vertical. CH8 - Invert, CH10 - Fix Height (Altitude hold)
### Sub_protocol CX10
Model: Cheerson CX-10 with red PCB
**Only 2 IDs available**, use RX num to cycle through them.
Mode -100% = Low, 0% = Medium, 100% = High
Mode: -100% = Low, 0% = Medium, 100% = High
### Sub_protocol T28
Model: FMS T28
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13
---|---|---|---|---|---|---|---|---|---|---|---|---
A|E|T|R|MODE|STUNT|LIGHT|INVERT|RTH|-|-|-|RTH_SET
Mode: -100% = Gyro off, 0% = Stabilized, 100% = Optimized
Notes:
- CH6/CH9/CH13 (STUNT, RTH, RTH Set) are NOT required to be bound, or used to fly the plane.
- CH9 (RTH) WILL function without CH13 (RTH Set) bound/used.
## Shenqi - *19*
Autobind protocol

View File

@@ -21,7 +21,7 @@ If you like this project and want to support further development please consider
Multiprotocol downloads: <img src=https://img.shields.io/github/downloads/pascallanger/DIY-Multiprotocol-TX-Module/total.svg>
Current Multiprotocol code check status: [<img src=https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/workflows/CI/badge.svg>](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/actions). Download the latest **test** build [here](https://downloads.multi-module.org/latest-test/).
Current Multiprotocol code check status: [![MULTI Test, Build, Deploy, Release](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/actions/workflows/main.yml/badge.svg)](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/actions). Download the latest **test** build [here](https://downloads.multi-module.org/latest-test/).
Current Multiprotocol boards check status: [![Travis Build Status for Multi Boards](https://api.travis-ci.com/pascallanger/DIY-Multiprotocol-TX-Module-Boards.svg?branch=master)](https://travis-ci.com/pascallanger/DIY-Multiprotocol-TX-Module-Boards)