mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-11-25 13:29:40 +00:00
Compare commits
126 Commits
54ae77ed7f
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bf38415420 | ||
|
|
5ce6c6f544 | ||
|
|
35f284763a | ||
|
|
e35c4d3ce8 | ||
|
|
ba59605b16 | ||
|
|
b88f4d40f4 | ||
|
|
5ade6bc312 | ||
|
|
9e099bc486 | ||
|
|
48b7430e75 | ||
|
|
6385e822c2 | ||
|
|
66f8906273 | ||
|
|
dcbc557bf7 | ||
|
|
e556f5cc40 | ||
|
|
9ef2415178 | ||
|
|
bc1a809325 | ||
|
|
082e96e381 | ||
|
|
abd26ee113 | ||
|
|
98518b3c92 | ||
|
|
d19de99172 | ||
|
|
13024e3816 | ||
|
|
90fb2d745f | ||
|
|
fa13b67f3a | ||
|
|
10be906bec | ||
|
|
f538884d48 | ||
|
|
d3e5acf704 | ||
|
|
2ac4745c62 | ||
|
|
889e01c7c6 | ||
|
|
db5f1f8899 | ||
|
|
d091c57e10 | ||
|
|
0fcb4b7f1a | ||
|
|
432e2e08a4 | ||
|
|
77efe467ad | ||
|
|
b9c828c878 | ||
|
|
99cd4d34d4 | ||
|
|
a9be2a8644 | ||
|
|
835facd2c3 | ||
|
|
9e20e47c5a | ||
|
|
a916275f0d | ||
|
|
9beade33de | ||
|
|
5ba70c3571 | ||
|
|
168aa89c57 | ||
|
|
fa055e991c | ||
|
|
5437d88642 | ||
|
|
d800f2c333 | ||
|
|
78f6af6448 | ||
|
|
b04d4a54f7 | ||
|
|
ed65c81add | ||
|
|
9bdc24c42a | ||
|
|
7107d46d29 | ||
|
|
825f560cbb | ||
|
|
ccaec304d5 | ||
|
|
22d45349cc | ||
|
|
5f26d624ad | ||
|
|
496c07943f | ||
|
|
af87b0f6d1 | ||
|
|
2918e63fb4 | ||
|
|
ed63ef7efe | ||
|
|
36d25c7773 | ||
|
|
a3ef2b94d4 | ||
|
|
ad8b45773d | ||
|
|
b2dec9b331 | ||
|
|
565aaed0c7 | ||
|
|
2f520f2e91 | ||
|
|
f1470a80dd | ||
|
|
b6f78e93a0 | ||
|
|
58bfd3b8b0 | ||
|
|
9e5e907f4a | ||
|
|
4b68443c8f | ||
|
|
f092e137c7 | ||
|
|
7b9941e537 | ||
|
|
d03a8787d1 | ||
|
|
75f79095ae | ||
|
|
b901bedad6 | ||
|
|
dbbef9181a | ||
|
|
98a54300e0 | ||
|
|
56fa7e788b | ||
|
|
7af23017ff | ||
|
|
a07c23b25f | ||
|
|
b5b2dc37d4 | ||
|
|
756af87ec1 | ||
|
|
e5810a2978 | ||
|
|
eaf71c2f49 | ||
|
|
546a962d96 | ||
|
|
fd150fa109 | ||
|
|
9b66711052 | ||
|
|
550754c7f9 | ||
|
|
729fdd4719 | ||
|
|
2713b18099 | ||
|
|
5b5e95066a | ||
|
|
b1f8560509 | ||
|
|
50c18311c9 | ||
|
|
95746f80a1 | ||
|
|
bb7685e7a5 | ||
|
|
a44126583e | ||
|
|
7fbca99bf3 | ||
|
|
8db90fb6fc | ||
|
|
406f5feca5 | ||
|
|
0e5834a457 | ||
|
|
75445ee4a7 | ||
|
|
e724d6970e | ||
|
|
190ebaefd4 | ||
|
|
3fdf417ac9 | ||
|
|
e05bc7c447 | ||
|
|
e2876c7e8c | ||
|
|
7acfebc30e | ||
|
|
af12b21899 | ||
|
|
68a4285b2a | ||
|
|
f58f7800d2 | ||
|
|
10b230d2dd | ||
|
|
58b19a2130 | ||
|
|
1b79d7f80f | ||
|
|
e0299f6c7d | ||
|
|
64ea7111ac | ||
|
|
edaee63f16 | ||
|
|
b449212c34 | ||
|
|
edaad73290 | ||
|
|
3d5e43da3b | ||
|
|
b8c5929521 | ||
|
|
8685fcae7f | ||
|
|
6edd2a14a7 | ||
|
|
600ffe87d7 | ||
|
|
c6ff0e27d9 | ||
|
|
7a7b4b2e74 | ||
|
|
8a30bf1c0a | ||
|
|
dd82cbec63 | ||
|
|
be4595fe67 |
4
.github/workflows/main.yml
vendored
4
.github/workflows/main.yml
vendored
@@ -68,7 +68,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install Arduino CLI
|
||||
uses: arduino/setup-arduino-cli@v1.1.2
|
||||
uses: arduino/setup-arduino-cli@v2
|
||||
with:
|
||||
version: "0.32.2"
|
||||
|
||||
@@ -257,7 +257,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install Arduino CLI
|
||||
uses: arduino/setup-arduino-cli@v1.1.2
|
||||
uses: arduino/setup-arduino-cli@v2
|
||||
with:
|
||||
version: "0.32.2"
|
||||
|
||||
|
||||
@@ -54,10 +54,9 @@
|
||||
28,1,Flysky_AFHDS2A,PPM_IBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
|
||||
28,2,Flysky_AFHDS2A,PWM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
|
||||
28,3,Flysky_AFHDS2A,PPM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
|
||||
28,4,Flysky_AFHDS2A,PWM_IB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
|
||||
28,5,Flysky_AFHDS2A,PPM_IB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
|
||||
28,6,Flysky_AFHDS2A,PWM_SB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
|
||||
28,7,Flysky_AFHDS2A,PPM_SB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
|
||||
28,4,Flysky_AFHDS2A,Gyro_Off,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,ST_Ga,TH_Ga,Prio,Calib
|
||||
28,5,Flysky_AFHDS2A,Gyro_On,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,ST_Ga,TH_Ga,Prio,Calib
|
||||
28,6,Flysky_AFHDS2A,G_On_Rev,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,ST_Ga,TH_Ga,Prio,Calib
|
||||
56,0,Flysky2A_RX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
|
||||
56,1,Flysky2A_RX,CPPM,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
|
||||
53,0,Height,5ch,0,Gear
|
||||
@@ -91,6 +90,7 @@
|
||||
58,1,FX,620,1
|
||||
58,2,FX,9630,1,Rate,Gyro,TrimR,TrimA,TrimE
|
||||
58,3,FX,Q560,1,FLIP,Gyro,LEDs
|
||||
58,4,FX,QF012,1,FLIP,Gyro,Invert,Reset
|
||||
20,0,FY326,FY326,1,Flip,RTH,HLess,Expert,Calib
|
||||
20,1,FY326,FY319,1,Flip,RTH,HLess,Expert,Calib
|
||||
23,0,FY326,FY326,1,Flip,RTH,HLess,Expert
|
||||
@@ -110,6 +110,7 @@
|
||||
26,1,Hontai,JJRCX1,1,Flip,Arm,Pict,Video,HLess,RTH,Calib
|
||||
26,2,Hontai,X5C1,1,Flip,Arm,Pict,Video,HLess,RTH,Calib
|
||||
26,3,Hontai,FQ777_951,1,Flip,Arm,Pict,Video,HLess,RTH,Calib
|
||||
26,4,Hontai,XKK170,1,Rate,Emerg,TakLan,Calib,TrimA,TrimE
|
||||
57,0,HoTT,Sync,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
|
||||
57,1,HoTT,No_Sync,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
|
||||
2,0,Hubsan,H107,1,Flip,Light,Pict,Video,HLess
|
||||
@@ -132,14 +133,16 @@
|
||||
18,4,MJXQ,E010,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate
|
||||
18,5,MJXQ,H26WH,1,Flip,Arm,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate
|
||||
18,6,MJXQ,Phoenix,1,Flip,Arm,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate
|
||||
17,0,MT99XX,Std,1,Flip,LED,Pict,Video,HLess
|
||||
17,1,MT99XX,H7,1,Flip,LED,Pict,Video,HLess
|
||||
17,2,MT99XX,YZ,1,Flip,LED,Pict,Video,HLess
|
||||
17,3,MT99XX,LS,1,Flip,Invert,Pict,Video,HLess
|
||||
17,4,MT99XX,FY805,1,Flip,n-a,n-a,n-a,HLess
|
||||
17,5,MT99XX,A180,0,3D_6G
|
||||
17,6,MT99XX,Dragon,0,Mode,RTH
|
||||
17,7,MT99XX,F949G,0,6G_3D,Light
|
||||
17,0,MT99XX,Std,1,Flip,LED,Pict,Video,HLess,Atrim,Etrim
|
||||
17,1,MT99XX,H7,1,Flip,LED,Pict,Video,HLess,Atrim,Etrim
|
||||
17,2,MT99XX,YZ,1,Flip,LED,Pict,Video,HLess,Atrim,Etrim
|
||||
17,3,MT99XX,LS,1,Flip,Invert,Pict,Video,HLess,Atrim,Etrim
|
||||
17,4,MT99XX,FY805,1,Flip,n-a,n-a,n-a,HLess,Atrim,Etrim
|
||||
17,5,MT99XX,A180,0,3D_6G,Rate,3D_6G,n-a,n-a,Atrim,Etrim
|
||||
17,6,MT99XX,Dragon,0,Mode,RTH,n-a,n-a,n-a,Atrim,Etrim
|
||||
17,7,MT99XX,F949G,0,6G_3D,Light,Rates,Unk1,Unk2,Atrim,Etrim
|
||||
92,0,MT99xx2,PA18,0,MODE,FLIP,RTH,n-a,n-a,Atrim,Etrim
|
||||
92,1,MT99xx2,SU35,0,Mode,LED,LED_FH,Invert,Rate,Atrim,Etrim
|
||||
44,0,NCC1701,Std,1,Warp
|
||||
77,0,OMP,M2,0,THold,IdleUp,6G_3D
|
||||
60,0,Pelikan,PRO_V4,0,CH5,CH6,CH7,CH8
|
||||
@@ -171,13 +174,15 @@
|
||||
11,3,SLT,Q200,0,Rates,n-a,CH7,CH8,Mode,VidOn,VidOff,Calib
|
||||
11,4,SLT,MR100,0,Rates,n-a,CH7,CH8,Mode,Flip,Video,Pict
|
||||
11,5,SLT,V1_4CH,0
|
||||
11,6,SLT,RF_SIM,0,CH5,CH6,CH7,CH8,CH9,CH10
|
||||
10,0,Symax,Std,1,Flip,Rates,Pict,Video,HLess
|
||||
10,1,Symax,X5C,1,Flip,Rates,Pict,Video,HLess
|
||||
43,0,Traxxas,TQ,0
|
||||
43,0,Traxxas,TQ2,0
|
||||
43,1,Traxxas,TQ1,0
|
||||
5,0,V2x2,Std,1,Flip,Light,Pict,Video,HLess,CalX,CalY
|
||||
5,1,V2x2,JXD506,1,Flip,Light,Pict,Video,HLess,StaSto,Emerg,Cam_UD
|
||||
48,0,V761,3CH,0,Gyro,Calib,Flip,RtnAct,Rtn
|
||||
48,1,V761,4CH,0,Gyro,Calib,Flip,RtnAct,Rtn
|
||||
48,0,V761,3CH,0,Gyro,Calib,Flip,RtnAct,Rtn,Beep
|
||||
48,1,V761,4CH,0,Gyro,Calib,Flip,RtnAct,Rtn,Beep
|
||||
48,2,V761,TOPRC,0,Gyro,Calib,Flip,RtnAct,Rtn
|
||||
46,0,V911s,V911s,1,Calib,Rate
|
||||
46,1,V911s,E119,1,Calib,Rate,6G_3D
|
||||
@@ -191,6 +196,8 @@
|
||||
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
|
||||
99,0,XK2,X4,0,Rate,Mode,Hover,Light
|
||||
99,1,XK2,P10,0,Rate,Mode,Hover,Light
|
||||
8,0,YD717,Std,1,Flip,Light,Pict,Video,HLess
|
||||
8,1,YD717,SkyWlkr,1,Flip,Light,Pict,Video,HLess
|
||||
8,2,YD717,Simax4,1,Flip,Light,Pict,Video,HLess
|
||||
@@ -203,19 +210,28 @@
|
||||
81,0,E010r5,E010r5,1,Flip,LED,CALIB,HLess,RTH,GLIDE
|
||||
82,0,LOLI,Std,0,CH5,CH6,CH7,CH8,1SwSePpPw,2SwSePw,3SwSe,4SwSe,5SwSeSb,6SwSe,7SwSePw,8SwSe
|
||||
83,0,E129,E129,1,TakLan,EmStop,TrimA,TrimE,TrimR
|
||||
83,1,E129,C186,1,TakLan,EmStop,TrimA,TrimE,TrimR,Loop,Flip
|
||||
83,1,E129,C186,1,TakLan,EmStop,TrimA,TrimE,TrimR,Loop,Flip,Debug
|
||||
84,0,JOYSWAY,Std,0
|
||||
85,0,E016H,Std,1,Stop,Flip,n-a,HLess,RTH
|
||||
87,0,IKEA
|
||||
89,0,LOSI
|
||||
90,0,MouldKg,Analog,0
|
||||
90,1,MouldKg,Digit,0
|
||||
90,0,MouldKg,A4444,0
|
||||
90,1,MouldKg,D4444,0
|
||||
90,2,MouldKg,A664,0
|
||||
91,0,Xerall,Tank,0,FlTa,TakLan,Rate,HLess,Photo,Video,TrimR,TrimE,TrimA
|
||||
92,0,MT99xx2,PA18,0,MODE,FLIP,RTH
|
||||
93,0,Kyosho2,KT-17,0
|
||||
94,0,Scorpio
|
||||
95,0,Bluefly,HP100,0,CH5,CH6,CH7,CH8
|
||||
96,0,BumbleB
|
||||
97,0,SGF22,Std,1,Mode,Flip,LED,Pict,Video,TrRes
|
||||
61,1,EazyRC
|
||||
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
|
||||
61,0,EazyRC
|
||||
98,0,Kyosho3,ASF,0
|
||||
100,0,YuXiang,Std,0,Lock,Rate,Land,Manual,Flip,Mode,Pitch
|
||||
102,0,JIABAILE,Std,0,Speed,Light,Flash
|
||||
102,1,JIABAILE,Gyro,0,Speed,Light,Flash,ST_Tr
|
||||
103,0,H36,Std,1,Flip,HLess,RTH
|
||||
104,0,KAMTOM,Std,0,ST_Tr,TH_Tr,TH_DR
|
||||
105,0,Shenqi2,Std,1
|
||||
106,0,WL91x,Std,0
|
||||
|
||||
@@ -183,8 +183,18 @@ uint16_t AFHDS2A_RX_callback()
|
||||
case AFHDS2A_RX_DATA:
|
||||
if (AFHDS2A_RX_data_ready()) {
|
||||
A7105_ReadData(AFHDS2A_RX_TXPACKET_SIZE);
|
||||
if (memcmp(&packet[1], rx_id, 4) == 0 && memcmp(&packet[5], rx_tx_addr, 4) == 0) {
|
||||
if (packet[0] == 0x58 && packet[37] == 0x00 && (telemetry_link&0x7F) == 0) { // standard packet, send channels to TX
|
||||
if (memcmp(&packet[1], rx_id, 4) == 0 && memcmp(&packet[5], rx_tx_addr, 4) == 0)
|
||||
{
|
||||
#if 0
|
||||
//if(packet[0] == 0xAA)
|
||||
{
|
||||
for(uint8_t i=0;i<AFHDS2A_RX_TXPACKET_SIZE;i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln("");
|
||||
}
|
||||
#endif
|
||||
if (packet[0] == 0x58 && packet[37] == 0x00 && (telemetry_link&0x7F) == 0)
|
||||
{ // standard packet, send channels to TX
|
||||
int rssi = min(A7105_ReadReg(A7105_1D_RSSI_THOLD),160);
|
||||
RX_RSSI = map16b(rssi, 160, 8, 0, 128);
|
||||
AFHDS2A_RX_build_telemetry_packet();
|
||||
|
||||
@@ -93,15 +93,16 @@ static void AFHDS2A_update_telemetry()
|
||||
if (option & 0x80)
|
||||
{// forward 0xAA and 0xAC telemetry to TX, skip rx and tx id to save space
|
||||
packet_in[0]= TX_RSSI;
|
||||
debug("T(%02X)=",packet[0]);
|
||||
#if 0
|
||||
debug("T(%02X)=",packet[0]);
|
||||
for(uint8_t i=9;i < AFHDS2A_RXPACKET_SIZE; i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln("");
|
||||
#endif
|
||||
for(uint8_t i=9;i < AFHDS2A_RXPACKET_SIZE; i++)
|
||||
{
|
||||
packet_in[i-8]=packet[i];
|
||||
debug(" %02X",packet[i]);
|
||||
}
|
||||
packet_in[29]=packet[0]; // 0xAA Normal telemetry, 0xAC Extended telemetry
|
||||
telemetry_link=2;
|
||||
debugln("");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
@@ -186,16 +187,40 @@ static void AFHDS2A_build_packet(uint8_t type)
|
||||
case AFHDS2A_PACKET_STICKS:
|
||||
packet[0] = 0x58;
|
||||
//16 channels + RX_LQI on channel 17
|
||||
for(uint8_t ch=0; ch<num_ch; ch++)
|
||||
for(uint8_t ch=0; ch<17; ch++)
|
||||
{
|
||||
if(ch == 16 // CH17=RX_LQI
|
||||
#ifdef AFHDS2A_LQI_CH
|
||||
|| ch == (AFHDS2A_LQI_CH-1) // override channel with LQI
|
||||
#endif
|
||||
)
|
||||
val = 2000 - 10*RX_LQI;
|
||||
val = convert_channel_ppm(sub_protocol<AFHDS2A_GYRO_OFF?CH_AETR[ch]:ch); // No remapping for BS receivers
|
||||
if(ch<14)
|
||||
{
|
||||
packet[9 + ch*2] = val;
|
||||
packet[10 + ch*2] = (val>>8)&0x0F;
|
||||
}
|
||||
else
|
||||
val = convert_channel_ppm(CH_AETR[ch]);
|
||||
{
|
||||
if(ch == 16) //CH17=RX_LQI
|
||||
val = 2000 - 10*RX_LQI;
|
||||
packet[10 + (ch-14)*6] |= (val)<<4;
|
||||
packet[12 + (ch-14)*6] |= (val)&0xF0;
|
||||
packet[14 + (ch-14)*6] |= (val>>4)&0xF0;
|
||||
}
|
||||
}
|
||||
{
|
||||
uint8_t next_hop = (hopping_frequency_no+1)&0x0F;
|
||||
packet[34] |= next_hop<<4;
|
||||
packet[36] |= next_hop?0x80:0x90;
|
||||
}
|
||||
break;
|
||||
case AFHDS2A_PACKET_FAILSAFE:
|
||||
packet[0] = 0x56;
|
||||
for(uint8_t ch=0; ch<16; ch++)
|
||||
{ // Failsafe values
|
||||
#ifdef FAILSAFE_ENABLE
|
||||
val = Failsafe_data[protocol==PROTO_AFHDS2A?CH_AETR[ch]:ch]; // No remapping for BS receivers
|
||||
if(val!=FAILSAFE_CHANNEL_HOLD && val!=FAILSAFE_CHANNEL_NOPULSES)
|
||||
val = (((val<<2)+val)>>3)+860;
|
||||
else
|
||||
#endif
|
||||
val = 0x0FFF;
|
||||
if(ch<14)
|
||||
{
|
||||
packet[9 + ch*2] = val;
|
||||
@@ -209,42 +234,6 @@ static void AFHDS2A_build_packet(uint8_t type)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case AFHDS2A_PACKET_FAILSAFE:
|
||||
packet[0] = 0x56;
|
||||
for(uint8_t ch=0; ch<num_ch; ch++)
|
||||
{
|
||||
#ifdef FAILSAFE_ENABLE
|
||||
if(ch<16)
|
||||
val = Failsafe_data[CH_AETR[ch]];
|
||||
else
|
||||
val = FAILSAFE_CHANNEL_NOPULSES;
|
||||
if(val!=FAILSAFE_CHANNEL_HOLD && val!=FAILSAFE_CHANNEL_NOPULSES)
|
||||
{ // Failsafe values
|
||||
val = (((val<<2)+val)>>3)+860;
|
||||
if(ch<14)
|
||||
{
|
||||
packet[9 + ch*2] = val;
|
||||
packet[10 + ch*2] = (val>>8)&0x0F;
|
||||
}
|
||||
else
|
||||
{
|
||||
packet[10 + (ch-14)*6] &= 0x0F;
|
||||
packet[10 + (ch-14)*6] |= (val)<<4;
|
||||
packet[12 + (ch-14)*6] &= 0x0F;
|
||||
packet[12 + (ch-14)*6] |= (val)&0xF0;
|
||||
packet[14 + (ch-14)*6] &= 0x0F;
|
||||
packet[14 + (ch-14)*6] |= (val>>4)&0xF0;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if(ch<14)
|
||||
{ // no values
|
||||
packet[9 + ch*2] = 0xff;
|
||||
packet[10+ ch*2] = 0xff;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case AFHDS2A_PACKET_SETTINGS:
|
||||
packet[0] = 0xaa;
|
||||
packet[9] = 0xfd;
|
||||
@@ -253,17 +242,43 @@ static void AFHDS2A_build_packet(uint8_t type)
|
||||
if(val<50 || val>400) val=50; // default is 50Hz
|
||||
packet[11]= val;
|
||||
packet[12]= val >> 8;
|
||||
packet[13] = sub_protocol & 0x01; // 1 -> PPM output enabled
|
||||
packet[14]= 0x00;
|
||||
for(uint8_t i=15; i<37; i++)
|
||||
packet[i] = 0xff;
|
||||
packet[18] = 0x05; // ?
|
||||
packet[19] = 0xdc; // ?
|
||||
packet[20] = 0x05; // ?
|
||||
if(sub_protocol&2)
|
||||
packet[21] = 0xdd; // SBUS output enabled
|
||||
memset(&packet[15],0xFF,22);
|
||||
#ifndef MULTI_AIR
|
||||
if(sub_protocol < AFHDS2A_GYRO_OFF)
|
||||
{
|
||||
#endif
|
||||
packet[13] = sub_protocol & 0x01; // 1 -> PPM output enabled
|
||||
packet[14] = 0x00; // ?
|
||||
packet[18] = 0x05; // ?
|
||||
packet[19] = 0xdc; // ?
|
||||
packet[20] = 0x05; // ?
|
||||
if(sub_protocol&2)
|
||||
packet[21] = 0xdd; // SBUS output enabled
|
||||
else
|
||||
packet[21] = 0xde; // IBUS
|
||||
#ifndef MULTI_AIR
|
||||
}
|
||||
else
|
||||
packet[21] = 0xde; // IBUS
|
||||
{//BS receivers
|
||||
if(sub_protocol == AFHDS2A_GYRO_OFF)
|
||||
{
|
||||
memset(&packet[15],0x00,4);
|
||||
packet[22] = 0xFC; // ?
|
||||
}
|
||||
else
|
||||
{//AFHDS2A_GYRO_ON & AFHDS2A_GYRO_ON_REV
|
||||
packet[15] = convert_channel_16b_limit(CH13,0,100); // ST Gain
|
||||
packet[16] = convert_channel_16b_limit(CH14,0,100); // TH Gain
|
||||
packet[17] = convert_channel_16b_limit(CH15,0,100); // Priority
|
||||
if(sub_protocol == AFHDS2A_GYRO_ON_REV)
|
||||
packet[17] |= 0x80; // Reverse
|
||||
packet[18] = CH16_SW?(0x32|0x80):0x32; // Calib|50?
|
||||
packet[19] = 0x64; // 100?
|
||||
packet[20] = 0x64; // 100?
|
||||
packet[22] = 0xFE; // ?
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
packet[37] = 0x00;
|
||||
@@ -283,6 +298,9 @@ uint16_t AFHDS2A_callback()
|
||||
static uint16_t packet_counter;
|
||||
uint8_t data_rx=0;
|
||||
uint16_t start;
|
||||
#ifndef MULTI_AIR
|
||||
static uint16_t Prev_Channel[4] = { 0,0,0,0 };
|
||||
#endif
|
||||
#ifndef FORCE_AFHDS2A_TUNING
|
||||
A7105_AdjustLOBaseFreq(1);
|
||||
#endif
|
||||
@@ -367,10 +385,39 @@ uint16_t AFHDS2A_callback()
|
||||
AFHDS2A_build_packet(packet_type);
|
||||
data_rx=A7105_ReadReg(A7105_00_MODE); // Check if something has been received...
|
||||
A7105_WriteData(AFHDS2A_TXPACKET_SIZE, hopping_frequency[hopping_frequency_no++]);
|
||||
if(hopping_frequency_no >= AFHDS2A_NUMFREQ)
|
||||
hopping_frequency_no = 0;
|
||||
hopping_frequency_no &= 0x0F; // AFHDS2A_NUMFREQ
|
||||
#if 0
|
||||
for(uint8_t i=0; i<AFHDS2A_TXPACKET_SIZE; i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln("");
|
||||
#endif
|
||||
#ifndef MULTI_AIR
|
||||
if(sub_protocol > AFHDS2A_GYRO_OFF)
|
||||
{//Gyro is on
|
||||
//Check if gyro settings have changed
|
||||
uint16_t val;
|
||||
for(uint8_t i=0;i<4;i++)
|
||||
{
|
||||
val = Channel_data[CH13+i] - Prev_Channel[i];
|
||||
if(val&0x8000) val ^= 0xFFFF;
|
||||
if(val > 10)
|
||||
{//This setting has significantly changed
|
||||
Prev_Channel[i] = Channel_data[CH13+i];
|
||||
packet_sent = 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(packet_sent && (packet_counter%5)==0)
|
||||
{//Inform the RX of the change
|
||||
packet_type = AFHDS2A_PACKET_SETTINGS;
|
||||
packet_sent--;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if(!(packet_counter % 1313))
|
||||
{//Send settings every 5s
|
||||
packet_type = AFHDS2A_PACKET_SETTINGS;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef FAILSAFE_ENABLE
|
||||
@@ -448,9 +495,6 @@ void AFHDS2A_init()
|
||||
rx_id[i]=eeprom_read_byte((EE_ADDR)(addr+i));
|
||||
}
|
||||
hopping_frequency_no = 0;
|
||||
if(sub_protocol&0x04)
|
||||
num_ch=17;
|
||||
else
|
||||
num_ch=14;
|
||||
packet_sent = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -292,13 +292,14 @@ uint16_t DSM_callback()
|
||||
#define DSM_CH1_CH2_DELAY 4010 // Time between write of channel 1 and channel 2
|
||||
#ifdef STM32_BOARD
|
||||
#define DSM_WRITE_DELAY 1600 // Time after write to verify write complete
|
||||
#define DSM_READ_DELAY 300 // Time before write to check read phase, and switch channels.
|
||||
#else
|
||||
#define DSM_WRITE_DELAY 1950 // Time after write to verify write complete
|
||||
#define DSM_READ_DELAY 600 // Time before write to check read phase, and switch channels.
|
||||
#endif
|
||||
#define DSM_READ_DELAY 600 // Time before write to check read phase, and switch channels. Was 400 but 600 seems what the 328p needs to read a packet
|
||||
#if defined DSM_TELEMETRY
|
||||
uint8_t rx_phase;
|
||||
uint8_t len;
|
||||
uint8_t length;
|
||||
#endif
|
||||
uint8_t start;
|
||||
//debugln("P=%d",phase);
|
||||
@@ -461,7 +462,7 @@ uint16_t DSM_callback()
|
||||
else
|
||||
return DSM2_SFC_PERIOD - DSM_CH1_CH2_DELAY - DSM_WRITE_DELAY - DSM_READ_DELAY;
|
||||
}
|
||||
return 11000 - DSM_WRITE_DELAY - DSM_READ_DELAY;
|
||||
return 10900 - DSM_WRITE_DELAY - DSM_READ_DELAY; //Was 11000 but the SR6200A needs 10900 to report telemetry correctly
|
||||
}
|
||||
#endif
|
||||
return 11000 - DSM_CH1_CH2_DELAY - DSM_WRITE_DELAY - DSM_READ_DELAY;
|
||||
@@ -469,27 +470,33 @@ uint16_t DSM_callback()
|
||||
case DSM_CH2_READ_B:
|
||||
//Read telemetry
|
||||
rx_phase = CYRF_ReadRegister(CYRF_07_RX_IRQ_STATUS);
|
||||
//debug("ST1:%02X ",rx_phase);
|
||||
if((rx_phase & 0x03) == 0x02) // RXC=1, RXE=0 then 2nd check is required (debouncing)
|
||||
rx_phase |= CYRF_ReadRegister(CYRF_07_RX_IRQ_STATUS);
|
||||
//debug("ST2:%02X ",rx_phase);
|
||||
if((rx_phase & 0x07) == 0x02)
|
||||
{ // good data (complete with no errors)
|
||||
CYRF_WriteRegister(CYRF_07_RX_IRQ_STATUS, 0x80); // need to set RXOW before data read
|
||||
len=CYRF_ReadRegister(CYRF_09_RX_COUNT);
|
||||
if(len>TELEMETRY_BUFFER_SIZE-2)
|
||||
len=TELEMETRY_BUFFER_SIZE-2;
|
||||
CYRF_ReadDataPacketLen(packet_in+1, len);
|
||||
length=CYRF_ReadRegister(CYRF_09_RX_COUNT);
|
||||
//debug("RX(%d)",length);
|
||||
if(length>TELEMETRY_BUFFER_SIZE-2)
|
||||
length=TELEMETRY_BUFFER_SIZE-2;
|
||||
CYRF_ReadDataPacketLen(packet_in+1, length);
|
||||
#ifdef DSM_DEBUG_FWD_PGM
|
||||
//debug(" %02X", packet_in[1]);
|
||||
if(packet_in[1]==9)
|
||||
{
|
||||
for(uint8_t i=0;i<len;i++)
|
||||
for(uint8_t i=0;i<length;i++)
|
||||
debug(" %02X", packet_in[i+1]);
|
||||
debugln("");
|
||||
}
|
||||
#endif
|
||||
packet_in[0]=CYRF_ReadRegister(CYRF_13_RSSI)&0x1F;// store RSSI of the received telemetry signal
|
||||
//for(uint8_t i=0;i<length+1;i++)
|
||||
// debug(" %02X", packet_in[i]);
|
||||
telemetry_link=1;
|
||||
}
|
||||
//debugln("");
|
||||
CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x20); // Abort RX operation
|
||||
if (phase == DSM_CH2_READ_A && (sub_protocol==DSM2_1F || sub_protocol==DSMX_1F) && num_ch < 8) // 22ms mode
|
||||
{
|
||||
@@ -612,10 +619,10 @@ void DSM_init()
|
||||
{
|
||||
//SUB_PROTO_VALID;
|
||||
CYRF_GetMfgData(cyrfmfg_id);
|
||||
//Model match
|
||||
cyrfmfg_id[3]^=RX_num;
|
||||
}
|
||||
}
|
||||
//Model match
|
||||
cyrfmfg_id[3]^=RX_num;
|
||||
|
||||
//Calc sop_col
|
||||
sop_col = (cyrfmfg_id[0] + cyrfmfg_id[1] + cyrfmfg_id[2] + 2) & 0x07;
|
||||
|
||||
@@ -41,7 +41,8 @@ static void __attribute__((unused)) E129_build_data_packet()
|
||||
}
|
||||
else
|
||||
{
|
||||
packet[ 1] = 0xA6;
|
||||
packet[ 1] = 0xA6; // Set to A5 every few packets??
|
||||
|
||||
//Flags
|
||||
if(sub_protocol == E129_E129)
|
||||
packet[ 2] = 0xF7; // High rate 0xF7, low 0xF4
|
||||
@@ -53,11 +54,18 @@ static void __attribute__((unused)) E129_build_data_packet()
|
||||
packet[15] = bit_reverse(rx_tx_addr[0]);
|
||||
packet[16] = bit_reverse(rx_tx_addr[1]);
|
||||
}
|
||||
packet[ 3] = GET_FLAG(CH10_SW, 0x40) // C159 loop flight 0x40, flag 0x04 is also set on this heli
|
||||
| GET_FLAG(CH11_SW, 0x08); // C129V2 flip
|
||||
// Other flags in packet[3] => E129 Mode: short press=0x20->0x00->0x20->..., long press=0x10->0x30->0x10->... => C186 throttle trim is doing the same:up=short press and down=long press
|
||||
packet[ 3] = GET_FLAG(CH10_SW, 0x40) // C159: loop flight 0x40
|
||||
| GET_FLAG(CH11_SW, 0x08); // C129V2: flip
|
||||
//Other flags seen in packet[3]
|
||||
// Flag 0x04 is set on some helis (C159/C190)
|
||||
// E129 Mode: short press=0x20->0x00->0x20->..., long press=0x10->0x30->0x10->... => C186 throttle trim is doing the same:up=short press and down=long press
|
||||
packet[ 4] = GET_FLAG(CH5_SW, 0x20) // Take off/Land 0x20
|
||||
| GET_FLAG(CH6_SW, 0x04); // Emergency stop 0x04
|
||||
| GET_FLAG(CH6_SW, 0x04) // Emergency stop 0x04
|
||||
| GET_FLAG(CH12_SW, 0x80); // C190: debug mode->remote THR trim down sets 0x80
|
||||
//Other flags seen in packet[4]
|
||||
// C190 remote LANDING sets 0x10
|
||||
// C190 remote THR trim down sets 0x80
|
||||
|
||||
//Channels and trims
|
||||
uint16_t val = convert_channel_10b(AILERON,false);
|
||||
uint8_t trim = convert_channel_8b(CH7) & 0xFC;
|
||||
|
||||
@@ -34,15 +34,24 @@ Multiprotocol is distributed in the hope that it will be useful,
|
||||
#define FX620_CH_OFFSET 1
|
||||
|
||||
#define FX9630_PACKET_PERIOD 8124 //8156 on QIDI-560
|
||||
#define FX9630_BIND_PACKET_PERIOD 8124
|
||||
#define FX9630_BIND_CHANNEL 51
|
||||
#define FX9630_PAYLOAD_SIZE 8
|
||||
#define FX9630_NUM_CHANNELS 3
|
||||
#define FX9630_WRITE_TIME 500
|
||||
|
||||
#define FX_QF012_PACKET_PERIOD 12194
|
||||
#define FX_QF012_RX_PAYLOAD_SIZE 3
|
||||
|
||||
//#define FORCE_FX620_ID
|
||||
//#define FORCE_FX9630_ID
|
||||
//#define FORCE_QIDI_ID
|
||||
|
||||
enum
|
||||
{
|
||||
FX_DATA=0,
|
||||
FX_RX,
|
||||
};
|
||||
|
||||
static void __attribute__((unused)) FX_send_packet()
|
||||
{
|
||||
static uint8_t trim_ch = 0;
|
||||
@@ -52,21 +61,20 @@ static void __attribute__((unused)) FX_send_packet()
|
||||
{
|
||||
XN297_Hopping(hopping_frequency_no++);
|
||||
if(sub_protocol >= FX9630)
|
||||
{ // FX9630 & FX_Q560
|
||||
XN297_SetTXAddr(rx_tx_addr, 4);
|
||||
{ // FX9630 & FX_Q560 & FX_QF012
|
||||
if (hopping_frequency_no >= FX9630_NUM_CHANNELS)
|
||||
{
|
||||
hopping_frequency_no = 0;
|
||||
if(sub_protocol == FX9630)
|
||||
{
|
||||
trim_ch++;
|
||||
if(trim_ch > 3) trim_ch = 0;
|
||||
trim_ch &= 3;
|
||||
}
|
||||
else // FX_Q560
|
||||
else // FX_Q560 & FX_QF012
|
||||
trim_ch = 0;
|
||||
}
|
||||
}
|
||||
else // FX816 and FX620
|
||||
else // FX816 & FX620
|
||||
{
|
||||
hopping_frequency_no &= 0x03;
|
||||
}
|
||||
@@ -77,7 +85,7 @@ static void __attribute__((unused)) FX_send_packet()
|
||||
//Channels
|
||||
uint8_t val;
|
||||
if (sub_protocol >= FX9630)
|
||||
{ // FX9630 & FX_Q560
|
||||
{ // FX9630 & FX_Q560 & FX_QF012
|
||||
packet[0] = convert_channel_8b(THROTTLE);
|
||||
packet[1] = convert_channel_8b(AILERON);
|
||||
packet[2] = 0xFF - convert_channel_8b(ELEVATOR);
|
||||
@@ -85,14 +93,18 @@ static void __attribute__((unused)) FX_send_packet()
|
||||
val = trim_ch==0 ? 0x20 : (convert_channel_8b(trim_ch + CH6) >> 2); // no trim on Throttle
|
||||
packet[4] = val; // Trim for channel x 0C..20..34
|
||||
packet[5] = (trim_ch << 4) // channel x << 4
|
||||
| GET_FLAG(CH5_SW, 0x01) // DR toggle swich: 0 small throw, 1 large throw
|
||||
| GET_FLAG(CH5_SW, (sub_protocol == FX_QF012 ? 0x08 : 0x01)) // DR toggle swich: 0 small throw, 1 large throw / Q560 acrobatic / QF012 Special effects
|
||||
// FX9630 =>0:6G small throw, 1:6G large throw, 2:3D
|
||||
// QIDI-550=>0:3D, 1:6G, 2:Torque
|
||||
// QF012=>0:beginner(6G), 1:mid(3D), 2:expert(Gyro off)
|
||||
| (Channel_data[CH6] < CHANNEL_MIN_COMMAND ? 0x00 : (Channel_data[CH6] > CHANNEL_MAX_COMMAND ? 0x04 : 0x02));
|
||||
if(sub_protocol == FX_Q560)
|
||||
packet[5] |= GET_FLAG(CH7_SW, 0x10);
|
||||
packet[5] |= GET_FLAG(CH7_SW, 0x18); // Q560 LED flag 0x10 conflicting with trim_ch... Corrected on new boards using 0x08 instead
|
||||
else if (sub_protocol == FX_QF012)
|
||||
packet[5] |= GET_FLAG(CH7_SW, 0x40) // QF012 invert flight
|
||||
| GET_FLAG(CH8_SW, 0x80); // QF012 Restore fine tunning midpoint
|
||||
}
|
||||
else // FX816 and FX620
|
||||
else // FX816 & FX620
|
||||
{
|
||||
uint8_t offset=sub_protocol == FX816 ? FX816_CH_OFFSET:FX620_CH_OFFSET;
|
||||
val=convert_channel_8b(AILERON);
|
||||
@@ -130,7 +142,7 @@ static void __attribute__((unused)) FX_send_packet()
|
||||
packet[5] = 0xAB; // Is it based on ID??
|
||||
}
|
||||
}
|
||||
else // FX9630 & FX_Q560
|
||||
else // FX9630 & FX_Q560 & FX_QF012
|
||||
{
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
{
|
||||
@@ -143,12 +155,12 @@ static void __attribute__((unused)) FX_send_packet()
|
||||
|
||||
//Check
|
||||
uint8_t last_packet_idx = packet_length-1;
|
||||
if (sub_protocol == FX9630 && IS_BIND_IN_PROGRESS)
|
||||
if (sub_protocol >= FX9630 && IS_BIND_IN_PROGRESS)
|
||||
last_packet_idx--;
|
||||
val=0;
|
||||
for(uint8_t i=0;i<last_packet_idx;i++)
|
||||
val+=packet[i];
|
||||
if (sub_protocol == FX9630)
|
||||
if (sub_protocol >= FX9630)
|
||||
val = val ^ 0xFF;
|
||||
packet[last_packet_idx]=val;
|
||||
|
||||
@@ -182,11 +194,11 @@ static void __attribute__((unused)) FX_RF_init()
|
||||
packet_period = FX620_BIND_PACKET_PERIOD;
|
||||
packet_length = FX620_PAYLOAD_SIZE;
|
||||
}
|
||||
else // FX9630 & FX_Q560
|
||||
else // FX9630 & FX_Q560 & FX_QF012
|
||||
{
|
||||
XN297_SetTXAddr((uint8_t *)"\x56\x78\x90\x12", 4);
|
||||
XN297_RFChannel(FX9630_BIND_CHANNEL);
|
||||
packet_period = FX9630_BIND_PACKET_PERIOD;
|
||||
packet_period = sub_protocol == FX_QF012 ? FX_QF012_PACKET_PERIOD : FX9630_PACKET_PERIOD;
|
||||
packet_length = FX9630_PAYLOAD_SIZE;
|
||||
}
|
||||
}
|
||||
@@ -214,15 +226,16 @@ static void __attribute__((unused)) FX_initialize_txid()
|
||||
for(uint8_t i=1;i<FX_NUM_CHANNELS;i++)
|
||||
hopping_frequency[i] = i*10 + hopping_frequency[0];
|
||||
}
|
||||
else // FX9630 & FX_Q560
|
||||
else // FX9630 & FX_Q560 & FX_QF012
|
||||
{
|
||||
//??? Need to find out how the first RF channel is calculated ???
|
||||
hopping_frequency[0] = 0x13;
|
||||
//Other 2 RF channels are sent during the bind phase so they can be whatever
|
||||
hopping_frequency[1] = RX_num & 0x0F + 0x1A;
|
||||
hopping_frequency[2] = rx_tx_addr[3] & 0x0F + 0x38;
|
||||
#ifdef FORCE_FX9630_ID
|
||||
memcpy(rx_tx_addr,(uint8_t*)"\xCE\x31\x9B\x73", 4);
|
||||
memcpy(hopping_frequency,"\x13\x1A\x38", FX9630_NUM_CHANNELS); //Original dump=>19=0x13,26=0x1A,56=0x38
|
||||
#else
|
||||
hopping_frequency[0] = 0x13; // constant???
|
||||
hopping_frequency[1] = RX_num & 0x0F + 0x1A;
|
||||
hopping_frequency[2] = rx_tx_addr[3] & 0x0F + 0x38;
|
||||
#endif
|
||||
#ifdef FORCE_QIDI_ID
|
||||
memcpy(rx_tx_addr,(uint8_t*)"\x23\xDC\x76\xA2", 4);
|
||||
@@ -232,26 +245,79 @@ static void __attribute__((unused)) FX_initialize_txid()
|
||||
//memcpy(rx_tx_addr,(uint8_t*)"\x38\xC7\x6D\x8D", 4);
|
||||
//memcpy(hopping_frequency,"\x0D\x20\x3A", FX9630_NUM_CHANNELS);
|
||||
#endif
|
||||
//??? Need to find out how the first RF channel is calculated ???
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t FX_callback()
|
||||
{
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(packet_period);
|
||||
#endif
|
||||
if(bind_counter)
|
||||
if(--bind_counter==0)
|
||||
#ifdef FX_HUB_TELEMETRY
|
||||
bool rx=false;
|
||||
|
||||
switch(phase)
|
||||
{
|
||||
BIND_DONE;
|
||||
if(sub_protocol == FX620)
|
||||
{
|
||||
XN297_SetTXAddr(rx_tx_addr, 3);
|
||||
packet_period = FX620_PACKET_PERIOD;
|
||||
}
|
||||
case FX_DATA:
|
||||
rx = XN297_IsRX();
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
#endif
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(packet_period);
|
||||
#endif
|
||||
if(bind_counter)
|
||||
if(--bind_counter==0)
|
||||
{
|
||||
BIND_DONE;
|
||||
if(sub_protocol == FX620)
|
||||
{
|
||||
XN297_SetTXAddr(rx_tx_addr, 3);
|
||||
packet_period = FX620_PACKET_PERIOD;
|
||||
}
|
||||
else if(sub_protocol >= FX9630)
|
||||
{ // FX9630 & FX_Q560 & FX_QF012
|
||||
XN297_SetTXAddr(rx_tx_addr, 4);
|
||||
#ifdef FX_HUB_TELEMETRY
|
||||
XN297_SetRXAddr(rx_tx_addr, FX_QF012_RX_PAYLOAD_SIZE);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
FX_send_packet();
|
||||
#ifdef FX_HUB_TELEMETRY
|
||||
if(sub_protocol < FX9630)
|
||||
break;
|
||||
if(rx)
|
||||
{
|
||||
debug("RX");
|
||||
if(XN297_ReadPayload(packet_in, FX_QF012_RX_PAYLOAD_SIZE))
|
||||
{//Good CRC
|
||||
//packets: A5 00 11 -> A5 01 11
|
||||
telemetry_link = 1;
|
||||
v_lipo1 = packet_in[1] ? 60:81; // low voltage 3.7V
|
||||
#if 0
|
||||
for(uint8_t i=0; i < FX_QF012_RX_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X", packet_in[i]);
|
||||
#endif
|
||||
}
|
||||
debugln();
|
||||
}
|
||||
phase++;
|
||||
return FX9630_WRITE_TIME;
|
||||
default: //FX_RX
|
||||
/* { // Wait for packet to be sent before switching to receive mode
|
||||
uint16_t start=(uint16_t)micros(), count=0;
|
||||
while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 500)
|
||||
{
|
||||
if(XN297_IsPacketSent())
|
||||
break;
|
||||
count++;
|
||||
}
|
||||
debug("%d",count);
|
||||
} */
|
||||
//Switch to RX
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
phase = FX_DATA;
|
||||
return packet_period - FX9630_WRITE_TIME;
|
||||
}
|
||||
FX_send_packet();
|
||||
#endif
|
||||
return packet_period;
|
||||
}
|
||||
|
||||
@@ -262,6 +328,10 @@ void FX_init()
|
||||
FX_RF_init();
|
||||
hopping_frequency_no = 0;
|
||||
bind_counter=FX_BIND_COUNT;
|
||||
#ifdef FX_HUB_TELEMETRY
|
||||
RX_RSSI = 100; // Dummy value
|
||||
phase = FX_DATA;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
132
Multiprotocol/H36_nrf24l01.ino
Normal file
132
Multiprotocol/H36_nrf24l01.ino
Normal file
@@ -0,0 +1,132 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#if defined(H36_NRF24L01_INO)
|
||||
|
||||
#include "iface_xn297.h"
|
||||
|
||||
//#define FORCE_H36_ORIGINAL_ID
|
||||
|
||||
#define H36_PAYLOAD_SIZE 13
|
||||
#define H36_RF_NUM_CHANNELS 4
|
||||
#define H36_BIND_PACKET_PERIOD 10285
|
||||
#define H36_BIND_COUNT 648 //3sec
|
||||
|
||||
enum {
|
||||
H36_DATA1=0,
|
||||
H36_DATA2,
|
||||
H36_DATA3,
|
||||
H36_DATA4,
|
||||
};
|
||||
|
||||
static void __attribute__((unused)) H36_send_packet()
|
||||
{
|
||||
if(IS_BIND_DONE && phase == H36_DATA1)
|
||||
{
|
||||
hopping_frequency_no++;
|
||||
hopping_frequency_no&=3;
|
||||
XN297_Hopping(hopping_frequency_no);
|
||||
}
|
||||
|
||||
packet[0] = 0x2E; // constant?
|
||||
memcpy(&packet[2],rx_tx_addr,3);
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
{//Bind
|
||||
memcpy(&packet[5],hopping_frequency,4);
|
||||
memset(&packet[9], 0x00, 3);
|
||||
packet[12] = 0xED; // constant?
|
||||
bind_counter--;
|
||||
if(bind_counter == 0)
|
||||
BIND_DONE;
|
||||
}
|
||||
else
|
||||
{//Normal
|
||||
packet[5] = convert_channel_8b(THROTTLE);
|
||||
packet[6] = convert_channel_8b(RUDDER);
|
||||
packet[7] = convert_channel_8b(ELEVATOR);
|
||||
packet[8] = convert_channel_8b(AILERON);
|
||||
packet[9] = GET_FLAG(CH6_SW, 0x02) //Headless
|
||||
|GET_FLAG(CH7_SW, 0x04); //RTH(temporary)
|
||||
packet[10] = 0x20; //Trim A centered(0x20)
|
||||
packet[11] = CH5_SW?0x60:0x20; //Flip(0x40)|Trim E centered(0x20)
|
||||
packet[12] = 0xA0; //High(0x80)/Low(0x40) rates|Trim R centered(0x20)?
|
||||
}
|
||||
//crc
|
||||
packet[1]=0xAA;
|
||||
for(uint8_t i=5;i<12;i++)
|
||||
packet[1] ^= packet[i];
|
||||
//Send
|
||||
XN297_SetPower();
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
XN297_WritePayload(packet, H36_PAYLOAD_SIZE);
|
||||
#ifdef DEBUG_SERIAL
|
||||
debug("H%d P",hopping_frequency_no);
|
||||
for(uint8_t i=0; i < H36_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X", packet[i]);
|
||||
debugln();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) H36_initialize_txid()
|
||||
{
|
||||
rx_tx_addr[0] = rx_tx_addr[3];
|
||||
calc_fh_channels(4);
|
||||
#ifdef FORCE_H36_ORIGINAL_ID
|
||||
if(!RX_num)
|
||||
{
|
||||
memcpy(rx_tx_addr,(uint8_t *)"\x00\x11\x00",3);
|
||||
memcpy(hopping_frequency,(uint8_t *)"\x36\x3A\x31\x2B",4); //54, 58, 49, 43
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) H36_RF_init()
|
||||
{
|
||||
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
|
||||
XN297_SetTXAddr((uint8_t*)"\xCC\x6C\x47\x90\x53", 5);
|
||||
XN297_RFChannel(50); //Bind channel
|
||||
}
|
||||
|
||||
uint16_t H36_callback()
|
||||
{
|
||||
H36_send_packet();
|
||||
switch(phase)
|
||||
{
|
||||
case H36_DATA1:
|
||||
phase++;
|
||||
return 1830;
|
||||
case H36_DATA2:
|
||||
case H36_DATA3:
|
||||
phase++;
|
||||
return 3085;
|
||||
default://DATA4
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(18500);
|
||||
#endif
|
||||
phase = H36_DATA1;
|
||||
break;
|
||||
}
|
||||
return 10500;
|
||||
}
|
||||
|
||||
void H36_init()
|
||||
{
|
||||
BIND_IN_PROGRESS; // Autobind protocol
|
||||
H36_initialize_txid();
|
||||
H36_RF_init();
|
||||
phase = H36_DATA1;
|
||||
hopping_frequency_no = 0;
|
||||
bind_counter = H36_BIND_COUNT;
|
||||
}
|
||||
#endif
|
||||
@@ -17,21 +17,25 @@
|
||||
|
||||
#include "iface_xn297.h" // mix of nrf and xn297 at 1Mb...
|
||||
|
||||
#define HONTAI_BIND_COUNT 80
|
||||
#define HONTAI_PACKET_PERIOD 13500
|
||||
#define FQ777_951_PACKET_PERIOD 10000
|
||||
#define HONTAI_INITIAL_WAIT 500
|
||||
#define HONTAI_BIND_PACKET_SIZE 10
|
||||
#define HONTAI_PACKET_SIZE 12
|
||||
#define HONTAI_RF_BIND_CHANNEL 0
|
||||
#define HONTAI_BIND_COUNT 80
|
||||
#define HONTAI_PACKET_PERIOD 13500
|
||||
#define FQ777_951_PACKET_PERIOD 10000
|
||||
#define HONTAI_INITIAL_WAIT 500
|
||||
#define HONTAI_BIND_PACKET_SIZE 10
|
||||
#define HONTAI_PACKET_SIZE 12
|
||||
#define HONTAI_RF_BIND_CHANNEL 0
|
||||
#define HONTAI_XKK170_RF_BIND_CHANNEL 20
|
||||
#define HONTAI_XKK170_PACKET_PERIOD 8085
|
||||
|
||||
//#define FORCE_HONTAI_XKK170_ORIGINAL_ID
|
||||
|
||||
enum{
|
||||
HONTAI_FLAG_FLIP = 0x01,
|
||||
HONTAI_FLAG_PICTURE = 0x02,
|
||||
HONTAI_FLAG_VIDEO = 0x04,
|
||||
HONTAI_FLAG_HEADLESS = 0x08,
|
||||
HONTAI_FLAG_RTH = 0x10,
|
||||
HONTAI_FLAG_CALIBRATE = 0x20,
|
||||
HONTAI_FLAG_FLIP = 0x01,
|
||||
HONTAI_FLAG_PICTURE = 0x02,
|
||||
HONTAI_FLAG_VIDEO = 0x04,
|
||||
HONTAI_FLAG_HEADLESS = 0x08,
|
||||
HONTAI_FLAG_RTH = 0x10,
|
||||
HONTAI_FLAG_CALIBRATE = 0x20,
|
||||
};
|
||||
|
||||
static void __attribute__((unused)) HONTAI_send_packet()
|
||||
@@ -40,6 +44,8 @@ static void __attribute__((unused)) HONTAI_send_packet()
|
||||
{
|
||||
memcpy(packet, rx_tx_addr, 5);
|
||||
memset(&packet[5], 0, 3);
|
||||
//if(sub_protocol == HONTAI_XKK170)
|
||||
// packet[6] = 0xD2;
|
||||
packet_length = HONTAI_BIND_PACKET_SIZE;
|
||||
}
|
||||
else
|
||||
@@ -50,58 +56,87 @@ static void __attribute__((unused)) HONTAI_send_packet()
|
||||
XN297_Hopping(hopping_frequency_no++);
|
||||
hopping_frequency_no %= 3;
|
||||
memset(packet,0,HONTAI_PACKET_SIZE);
|
||||
packet[3] = convert_channel_16b_limit(THROTTLE, 0, 127) << 1; // Throttle
|
||||
packet[4] = convert_channel_16b_limit(AILERON, 63, 0); // Aileron
|
||||
packet[5] = convert_channel_16b_limit(ELEVATOR, 0, 63); // Elevator
|
||||
packet[6] = convert_channel_16b_limit(RUDDER, 0, 63); // Rudder
|
||||
if(sub_protocol == X5C1)
|
||||
packet[7] = convert_channel_16b_limit(AILERON, 0, 63)-31; // Aileron trim
|
||||
for(uint8_t i=0; i<4; i++)
|
||||
packet[i+3] = convert_channel_8b(CH_TAER[i]);
|
||||
if(sub_protocol != HONTAI_XKK170)
|
||||
{
|
||||
//Drive trims
|
||||
packet[7] = (packet[4]>>3)-16;
|
||||
packet[8] = (packet[6]>>3)-16;
|
||||
packet[9] = (packet[5]>>3)-16;
|
||||
//Reverse aileron
|
||||
packet[4] ^= 0xFF;
|
||||
//Limit range
|
||||
for(uint8_t i=3; i<7; i++)
|
||||
packet[i] >>= 2; //00..63
|
||||
}
|
||||
else
|
||||
packet[7] = convert_channel_16b_limit(AILERON, 0, 32)-16; // Aileron trim
|
||||
packet[8] = convert_channel_16b_limit(RUDDER, 0, 32)-16; // Rudder trim
|
||||
if (sub_protocol == X5C1)
|
||||
packet[9] = convert_channel_16b_limit(ELEVATOR, 0, 63)-31; // Elevator trim
|
||||
else
|
||||
packet[9] = convert_channel_16b_limit(ELEVATOR, 0, 32)-16; // Elevator trim
|
||||
{//K170
|
||||
//packet[2] = 0xAB; //This value keeps changing when touching any button... Left over from debug?
|
||||
//Sticks
|
||||
for(uint8_t i=1; i<4; i++)
|
||||
packet[i+3] = convert_channel_16b_limit(CH_TAER[i],0x28,0xD8);
|
||||
packet[6] ^= 0xFF; //Reverse rudder
|
||||
//flags
|
||||
packet[1] = GET_FLAG(CH8_SW, 0x04); //Gyro calibration (momentary)
|
||||
// |GET_FLAG(CH_SW, 0x08) //Unk long press second top right button (momentary)
|
||||
// |GET_FLAG(CH_SW, 0x10) //Unk short press second top right button (toggle)
|
||||
// |GET_FLAG(CH_SW, 0x40) //Unk short press second top left button (momentary)
|
||||
// |GET_FLAG(CH_SW, 0x80); //Unk long press second top left button (momentary)
|
||||
uint8_t rate = 0x80; //Mid rate
|
||||
if(CH5_SW)
|
||||
rate = 0xC0; //High rate
|
||||
else if(Channel_data[CH5] < CHANNEL_MIN_COMMAND)
|
||||
rate = 0x40; //Low rate
|
||||
packet[8] = rate
|
||||
|GET_FLAG(CH7_SW, 0x04) //Take-off/Landing (momentary)
|
||||
|GET_FLAG(CH6_SW, 0x10); //Emergency (momentary)
|
||||
//Trims
|
||||
packet[7] = ((convert_channel_8b(CH9)^0xFF)>>2)-31; // Trim Aileron
|
||||
packet[9] = ( convert_channel_8b(CH10) >>2)-32; // Trim Elevator
|
||||
}
|
||||
|
||||
switch(sub_protocol)
|
||||
{
|
||||
case HONTAI:
|
||||
packet[0] = 0x0B;
|
||||
packet[3] |= GET_FLAG(CH7_SW, 0x01); // Picture
|
||||
packet[4] |= GET_FLAG(CH10_SW, 0x80) // RTH
|
||||
packet[4] |= GET_FLAG(CH10_SW, 0x80) // RTH
|
||||
| GET_FLAG(CH9_SW, 0x40); // Headless
|
||||
packet[5] |= GET_FLAG(CH11_SW, 0x80) // Calibrate
|
||||
packet[5] |= GET_FLAG(CH11_SW, 0x80) // Calibrate
|
||||
| GET_FLAG(CH5_SW, 0x40); // Flip
|
||||
packet[6] |= GET_FLAG(CH8_SW, 0x80); // Video
|
||||
break;
|
||||
case JJRCX1:
|
||||
packet[0] = GET_FLAG(CH6_SW, 0x02); // Arm
|
||||
packet[3] |= GET_FLAG(CH7_SW, 0x01); // Picture
|
||||
packet[4] |= 0x80; // unknown
|
||||
packet[5] |= GET_FLAG(CH11_SW, 0x80) // Calibrate
|
||||
packet[4] |= 0x80; // unknown
|
||||
packet[5] |= GET_FLAG(CH11_SW, 0x80) // Calibrate
|
||||
| GET_FLAG(CH5_SW, 0x40); // Flip
|
||||
packet[6] |= GET_FLAG(CH8_SW, 0x80); // Video
|
||||
packet[8] = 0xC0 // high rate, no rudder trim
|
||||
| GET_FLAG(CH10_SW, 0x02) // RTH
|
||||
packet[8] = 0xC0 // high rate, no rudder trim
|
||||
| GET_FLAG(CH10_SW, 0x02) // RTH
|
||||
| GET_FLAG(CH9_SW, 0x01); // Headless
|
||||
break;
|
||||
case X5C1:
|
||||
packet[0] = 0x0B;
|
||||
packet[3] |= GET_FLAG(CH7_SW, 0x01); // Picture
|
||||
packet[4] = 0x80 // unknown
|
||||
packet[4] = 0x80 // unknown
|
||||
| GET_FLAG(CH6_SW, 0x40); // Lights
|
||||
packet[5] |= GET_FLAG(CH11_SW, 0x80) // Calibrate
|
||||
packet[5] |= GET_FLAG(CH11_SW, 0x80) // Calibrate
|
||||
| GET_FLAG(CH5_SW, 0x40); // Flip
|
||||
packet[6] |= GET_FLAG(CH8_SW, 0x80); // Video
|
||||
packet[8] = 0xC0 // high rate, no rudder trim
|
||||
| GET_FLAG(CH10_SW, 0x02) // RTH
|
||||
packet[7] <<= 1; // Aileron trim
|
||||
packet[8] = 0xC0 // high rate, no rudder trim
|
||||
| GET_FLAG(CH10_SW, 0x02) // RTH
|
||||
| GET_FLAG(CH9_SW, 0x01); // Headless
|
||||
packet[9] <<= 1; // Elevator trim
|
||||
break;
|
||||
case FQ777_951:
|
||||
packet[0] = GET_FLAG(CH7_SW, 0x01) // Picture
|
||||
| GET_FLAG(CH8_SW, 0x02); // Video
|
||||
packet[3] |= GET_FLAG(CH5_SW, 0x01); // Flip
|
||||
packet[4] |= 0xC0; // High rate (mid=0xa0, low=0x60)
|
||||
packet[4] |= 0xC0; // High rate (mid=0xa0, low=0x60)
|
||||
packet[5] |= GET_FLAG(CH11_SW, 0x80); // Calibrate
|
||||
packet[6] |= GET_FLAG(CH9_SW, 0x40); // Headless
|
||||
break;
|
||||
@@ -109,13 +144,18 @@ static void __attribute__((unused)) HONTAI_send_packet()
|
||||
packet_length = HONTAI_PACKET_SIZE;
|
||||
}
|
||||
|
||||
// CRC 16 bits reflected in and out
|
||||
crc=0xFFFF;
|
||||
for(uint8_t i=0; i< packet_length-2; i++)
|
||||
crc16_update(bit_reverse(packet[i]),8);
|
||||
crc ^= 0xFFFF;
|
||||
packet[packet_length-2]=bit_reverse(crc>>8);
|
||||
packet[packet_length-1]=bit_reverse(crc);
|
||||
if(sub_protocol != HONTAI_XKK170)
|
||||
{
|
||||
// CRC 16 bits reflected in and out
|
||||
crc=0xFFFF;
|
||||
for(uint8_t i=0; i< packet_length-2; i++)
|
||||
crc16_update(bit_reverse(packet[i]),8);
|
||||
crc ^= 0xFFFF;
|
||||
packet[packet_length-2]=bit_reverse(crc>>8);
|
||||
packet[packet_length-1]=bit_reverse(crc);
|
||||
}
|
||||
else
|
||||
memset(&packet[packet_length-2], 0xAA, 2);
|
||||
|
||||
// Power on, TX mode, 2byte CRC
|
||||
/*if(sub_protocol == JJRCX1)
|
||||
@@ -135,6 +175,11 @@ static void __attribute__((unused)) HONTAI_send_packet()
|
||||
NRF24L01_WritePayload(packet, packet_length);
|
||||
else
|
||||
XN297_WritePayload(packet, packet_length);
|
||||
#ifdef DEBUG_SERIAL
|
||||
for(uint8_t i=0; i < packet_length; i++)
|
||||
debug("%02X ", packet[i]);
|
||||
debugln();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) HONTAI_RF_init()
|
||||
@@ -152,15 +197,16 @@ static void __attribute__((unused)) HONTAI_RF_init()
|
||||
}
|
||||
else
|
||||
{
|
||||
XN297_SetTXAddr((const uint8_t*)"\xd2\xb5\x99\xb3\x4a", 5);
|
||||
memcpy(rx_id,(const uint8_t*)"\xD2\xB5\x99\xB3\x41",5);
|
||||
if(sub_protocol == HONTAI_XKK170)
|
||||
rx_id[4] = 0x4A;
|
||||
XN297_SetTXAddr(rx_id, 5);
|
||||
//XN297_HoppingCalib(3);
|
||||
}
|
||||
XN297_RFChannel(HONTAI_RF_BIND_CHANNEL);
|
||||
XN297_RFChannel(sub_protocol==HONTAI_XKK170?HONTAI_XKK170_RF_BIND_CHANNEL:HONTAI_RF_BIND_CHANNEL);
|
||||
}
|
||||
|
||||
const uint8_t PROGMEM HONTAI_hopping_frequency_nonels[][3] = {
|
||||
{0x05, 0x19, 0x28}, // Hontai
|
||||
{0x0a, 0x1e, 0x2d}}; // JJRC X1
|
||||
const uint8_t PROGMEM HONTAI_hopping_frequency[3] = { 0x05, 0x19, 0x28 };
|
||||
|
||||
const uint8_t PROGMEM HONTAI_addr_vals[4][16] = {
|
||||
{0x24, 0x26, 0x2a, 0x2c, 0x32, 0x34, 0x36, 0x4a, 0x4c, 0x4e, 0x54, 0x56, 0x5a, 0x64, 0x66, 0x6a},
|
||||
@@ -178,32 +224,69 @@ static void __attribute__((unused)) HONTAI_init2()
|
||||
data_tx_addr[2] = pgm_read_byte_near( &HONTAI_addr_vals[2][ rx_tx_addr[4] & 0x0f]);
|
||||
data_tx_addr[3] = pgm_read_byte_near( &HONTAI_addr_vals[3][(rx_tx_addr[4] >> 4) & 0x0f]);
|
||||
data_tx_addr[4] = 0x24;
|
||||
#ifdef DEBUG_SERIAL
|
||||
debug("A N");
|
||||
for(uint8_t i=0; i < 5; i++)
|
||||
debug(" %02X", data_tx_addr[i]);
|
||||
debugln();
|
||||
#endif
|
||||
if(sub_protocol == JJRCX1)
|
||||
NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, data_tx_addr, 5);
|
||||
else
|
||||
XN297_SetTXAddr(data_tx_addr, 5);
|
||||
|
||||
//Hopping frequency table
|
||||
uint8_t val;
|
||||
for(uint8_t i=0;i<3;i++)
|
||||
hopping_frequency[i]=pgm_read_byte_near( &HONTAI_hopping_frequency_nonels[sub_protocol == JJRCX1?1:0][i] );
|
||||
{
|
||||
if(sub_protocol==HONTAI_XKK170)
|
||||
val = 60+10*i;
|
||||
else
|
||||
{
|
||||
val = pgm_read_byte_near( &HONTAI_hopping_frequency[i] );
|
||||
if(sub_protocol == JJRCX1)
|
||||
val += 5;
|
||||
}
|
||||
hopping_frequency[i] = val;
|
||||
}
|
||||
hopping_frequency_no=0;
|
||||
#ifdef DEBUG_SERIAL
|
||||
debug("H");
|
||||
for(uint8_t i=0; i < 3; i++)
|
||||
debug(" %d(%02X)", hopping_frequency[i], hopping_frequency[i]);
|
||||
debugln();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) HONTAI_initialize_txid()
|
||||
{
|
||||
rx_tx_addr[4] = rx_tx_addr[2];
|
||||
if(sub_protocol == HONTAI || sub_protocol == FQ777_951)
|
||||
{
|
||||
rx_tx_addr[0] = 0x4c; // first three bytes some kind of model id? - set same as stock tx
|
||||
rx_tx_addr[1] = 0x4b;
|
||||
rx_tx_addr[2] = 0x3a;
|
||||
// First three bytes some kind of model id? - set same as stock tx
|
||||
if(sub_protocol == JJRCX1 || sub_protocol == X5C1)
|
||||
{//JJRCX1 & X5C1
|
||||
rx_tx_addr[0] = 0x4B;
|
||||
rx_tx_addr[1] = 0x59;
|
||||
rx_tx_addr[2] = 0x3A;
|
||||
}
|
||||
else
|
||||
{
|
||||
rx_tx_addr[0] = 0x4b; // JJRC X1
|
||||
rx_tx_addr[1] = 0x59;
|
||||
rx_tx_addr[2] = 0x3a;
|
||||
{//HONTAI, FQ777_951, HONTAI_XKK170
|
||||
rx_tx_addr[0] = 0x4C;
|
||||
rx_tx_addr[1] = 0x4B;
|
||||
rx_tx_addr[2] = 0x3A;
|
||||
#ifdef FORCE_HONTAI_XKK170_ORIGINAL_ID
|
||||
if(sub_protocol == HONTAI_XKK170)
|
||||
{
|
||||
rx_tx_addr[3] = 0x5A;
|
||||
rx_tx_addr[4] = 0x06;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#ifdef DEBUG_SERIAL
|
||||
debug("A B");
|
||||
for(uint8_t i=0; i < 5; i++)
|
||||
debug(" %02X", rx_tx_addr[i]);
|
||||
debugln();
|
||||
#endif
|
||||
}
|
||||
|
||||
uint16_t HONTAI_callback()
|
||||
@@ -228,8 +311,14 @@ void HONTAI_init()
|
||||
{
|
||||
BIND_IN_PROGRESS; // autobind protocol
|
||||
bind_counter = HONTAI_BIND_COUNT;
|
||||
HONTAI_initialize_txid();
|
||||
HONTAI_RF_init();
|
||||
packet_period = sub_protocol == FQ777_951 ? FQ777_951_PACKET_PERIOD : HONTAI_PACKET_PERIOD;
|
||||
HONTAI_initialize_txid();
|
||||
if(sub_protocol == FQ777_951)
|
||||
packet_period = FQ777_951_PACKET_PERIOD;
|
||||
else if(sub_protocol == HONTAI_XKK170)
|
||||
packet_period = HONTAI_XKK170_PACKET_PERIOD;
|
||||
else
|
||||
packet_period = HONTAI_PACKET_PERIOD;
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
450
Multiprotocol/JIABAILE_nrf24l01.ino
Normal file
450
Multiprotocol/JIABAILE_nrf24l01.ino
Normal file
@@ -0,0 +1,450 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#if defined(JIABAILE_NRF24L01_INO)
|
||||
|
||||
#include "iface_xn297.h"
|
||||
|
||||
//#define FORCE_JIABAILE_ORIGINAL_ID
|
||||
//#define FORCE_JIABAILE_GYRO_ORIGINAL_ID
|
||||
|
||||
#define JIABAILE_PAYLOAD_SIZE 8
|
||||
#define JIABAILE_RX_PAYLOAD_SIZE 7
|
||||
#define JIABAILE_RF_NUM_CHANNELS 3
|
||||
#define JIABAILE_BIND_PACKET_PERIOD 12700
|
||||
#define JIABAILE_PACKET_PERIOD 2408
|
||||
#define JIABAILE_GYRO_PACKET_PERIOD 8205
|
||||
#define JIABAILE_BIND_COUNT 160 //2 sec
|
||||
#define JIABAILE_WRITE_TIME 1000
|
||||
|
||||
enum {
|
||||
JIABAILE_BIND=0,
|
||||
JIABAILE_RX,
|
||||
JIABAILE_PREP_DATA,
|
||||
JIABAILE_DATA,
|
||||
};
|
||||
|
||||
static uint8_t __attribute__((unused)) JIABAILE_channel(uint8_t num)
|
||||
{
|
||||
uint8_t val=convert_channel_16b_limit(num,0,100);
|
||||
if(val > 50+num)
|
||||
{
|
||||
packet[3] |= 0x01;
|
||||
return val-50;
|
||||
}
|
||||
if(val < 50-num)
|
||||
{
|
||||
packet[3] |= 0x02;
|
||||
return 50-val;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) JIABAILE_send_packet()
|
||||
{
|
||||
if(!(sub_protocol == JIABAILE_GYRO && IS_BIND_IN_PROGRESS))
|
||||
{
|
||||
hopping_frequency_no++;
|
||||
if(hopping_frequency_no > 2)
|
||||
hopping_frequency_no = 0;
|
||||
XN297_Hopping(hopping_frequency_no);
|
||||
}
|
||||
|
||||
if(sub_protocol == JIABAILE_STD)
|
||||
{//Std
|
||||
memcpy(packet,rx_tx_addr,3);
|
||||
memset(&packet[3], 0x00, 4);
|
||||
if(IS_BIND_DONE)
|
||||
{//Normal
|
||||
packet[4] = convert_channel_16b_limit(RUDDER,0,50)-25; //ST Trim
|
||||
packet[6] = JIABAILE_channel(AILERON); //ST
|
||||
packet[3] ^= 0x03; //Reverse ST channel
|
||||
packet[3] <<= 2; //Move ST channel where it should be
|
||||
packet[5] = JIABAILE_channel(ELEVATOR); //TH
|
||||
packet[3] |= GET_FLAG(CH5_SW, 0x20) //Low speed
|
||||
|GET_FLAG(CH7_SW, 0x40) //Flash light
|
||||
|GET_FLAG(!CH6_SW, 0x80); //Light
|
||||
if(!CH5_SW && Channel_data[CH5] > CHANNEL_MIN_COMMAND)
|
||||
packet[3] |= 0x10; //Mid speed
|
||||
}
|
||||
else
|
||||
{
|
||||
bind_counter--;
|
||||
if(!bind_counter)
|
||||
{
|
||||
BIND_DONE;
|
||||
phase = JIABAILE_PREP_DATA;
|
||||
}
|
||||
}
|
||||
packet[7] = 0x55 + hopping_frequency[hopping_frequency_no];
|
||||
for(uint8_t i=0;i<JIABAILE_PAYLOAD_SIZE-1;i++)
|
||||
packet[7] += packet[i];
|
||||
}
|
||||
else
|
||||
{//Gyro
|
||||
if(bind_counter)
|
||||
{
|
||||
bind_counter--;
|
||||
if(!bind_counter)
|
||||
{
|
||||
BIND_DONE;
|
||||
XN297_SetTXAddr(rx_tx_addr, 4);
|
||||
}
|
||||
}
|
||||
uint8_t crc_pos;
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
{
|
||||
memcpy(packet,rx_tx_addr,4);
|
||||
packet[4] = hopping_frequency[1];
|
||||
packet[5] = hopping_frequency[2];
|
||||
crc_pos = 6;
|
||||
packet[7] = 0x55;
|
||||
}
|
||||
else
|
||||
{
|
||||
packet[0] = convert_channel_16b_limit(CH2,0x60,0xA0); //Throttle
|
||||
packet[1] = convert_channel_16b_limit(CH1,0x40,0xC0); //Steering
|
||||
if(Channel_data[CH5] < CHANNEL_MIN_COMMAND)
|
||||
packet[2] = 0x02; //High speed
|
||||
else if(CH5_SW)
|
||||
packet[2] = 0x00; //Low speed
|
||||
else
|
||||
packet[2] = 0x01; //Mid speed
|
||||
packet[3] = convert_channel_8b(CH3) ^0xFF; //Gyro
|
||||
uint8_t val = GET_FLAG(CH6_SW, 0x04) //Light
|
||||
|GET_FLAG(CH7_SW, 0x08); //Flash
|
||||
if(Channel_data[CH4] > CHANNEL_MAX_COMMAND)
|
||||
val |= 0x01; //Trim right
|
||||
else if(Channel_data[CH4] < CHANNEL_MIN_COMMAND)
|
||||
val |= 0x02; //Trim left
|
||||
packet[4] = val;
|
||||
packet[5] = packet[6] = 0x00; //?
|
||||
crc_pos = 7;
|
||||
}
|
||||
uint8_t sum=0;
|
||||
for(uint8_t i=0; i<crc_pos; i++)
|
||||
sum += packet[i];
|
||||
sum ^= 0xFF;
|
||||
packet[crc_pos] = sum;
|
||||
}
|
||||
|
||||
// Send
|
||||
XN297_SetPower();
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
XN297_WritePayload(packet, JIABAILE_PAYLOAD_SIZE);
|
||||
#if 0
|
||||
debug("B%d ",bind_counter);
|
||||
debug("H%d RF%d",hopping_frequency_no,hopping_frequency[hopping_frequency_no]);
|
||||
for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X", packet[i]);
|
||||
debugln();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) JIABAILE_initialize_txid()
|
||||
{
|
||||
if(sub_protocol == JIABAILE_STD)
|
||||
{//Std
|
||||
rx_tx_addr[0] = rx_tx_addr[3];
|
||||
#ifdef FORCE_JIABAILE_ORIGINAL_ID
|
||||
memcpy(rx_tx_addr,(uint8_t *)"\xCB\x03\xA5",3);
|
||||
//memcpy(rx_tx_addr,(uint8_t *)"\x3D\x08\xA2",3);
|
||||
//Normal frequencies are calculated from the car ID...
|
||||
//memcpy(&hopping_frequency[3],(uint8_t *)"\x23\x2D\x4B",3); //35,45,75
|
||||
memcpy(&hopping_frequency[3],(uint8_t *)"\x24\x43\x4C",3); //36,67,76
|
||||
#endif
|
||||
//Bind frequencies
|
||||
memcpy(hopping_frequency,(uint8_t *)"\x07\x27\x45",3); //7,39,69
|
||||
}
|
||||
else
|
||||
{//Gyro
|
||||
rx_tx_addr[0] += RX_num;
|
||||
uint8_t val = (rx_tx_addr[0] & 0x0F) + 5; //5..20
|
||||
for(uint8_t i=0; i<3; i++)
|
||||
hopping_frequency[i] = val+ 20*i; //hopping_frequency[1,2] could be whatever but...
|
||||
#ifdef FORCE_JIABAILE_GYRO_ORIGINAL_ID
|
||||
if(RX_num)
|
||||
{
|
||||
memcpy(rx_tx_addr,(uint8_t *)"\x7D\x82\x28\xC2",4);
|
||||
memcpy(hopping_frequency,(uint8_t *)"\x12\x1B\x35",3); //18,27,53
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(rx_tx_addr,(uint8_t *)"\x0C\xF3\x59\xB3",4);
|
||||
memcpy(hopping_frequency,(uint8_t *)"\x11\x1C\x36",3); //17,28,54
|
||||
}
|
||||
#endif
|
||||
debugln("ID: %02X %02X %02X %02X, HOP: %2d %2d %2d",rx_tx_addr[0],rx_tx_addr[1],rx_tx_addr[2],rx_tx_addr[3],hopping_frequency[0],hopping_frequency[1],hopping_frequency[2]);
|
||||
}
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) JIABAILE_RF_init()
|
||||
{
|
||||
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
|
||||
//Bind address
|
||||
if(sub_protocol == JIABAILE_STD)
|
||||
{//Std
|
||||
memcpy(rx_id,(uint8_t*)"\xA7\x07\x57\xA7\x26", 5);
|
||||
XN297_SetTXAddr(rx_id, 5);
|
||||
XN297_SetRXAddr(rx_id, JIABAILE_RX_PAYLOAD_SIZE);
|
||||
}
|
||||
else
|
||||
{//Gyro
|
||||
XN297_SetTXAddr((uint8_t*)"\x14\x41\x11\x13", 4);
|
||||
XN297_RFChannel(0x29); //41
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t JIABAILE_callback()
|
||||
{
|
||||
uint8_t sum;
|
||||
uint16_t addr;
|
||||
|
||||
switch(phase)
|
||||
{
|
||||
case JIABAILE_BIND:
|
||||
phase++; // JIABAILE_RX but is overwritten if RX or bind timeout
|
||||
if(XN297_IsRX())
|
||||
{
|
||||
if(XN297_ReadPayload(packet_in, JIABAILE_RX_PAYLOAD_SIZE))
|
||||
{//CRC OK
|
||||
#ifdef DEBUG_SERIAL
|
||||
debug("RX");
|
||||
for(uint8_t i=0; i < JIABAILE_RX_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X", packet_in[i]);
|
||||
debugln();
|
||||
#endif
|
||||
//RX: CB 03 A5 9D 05 A2 68
|
||||
if(memcmp(packet_in,rx_tx_addr,3)==0)
|
||||
{//TX ID match
|
||||
//Check packet
|
||||
sum=0xAA + hopping_frequency[hopping_frequency_no];
|
||||
for(uint8_t i=0; i < JIABAILE_RX_PAYLOAD_SIZE-1; i++)
|
||||
sum+=packet_in[i];
|
||||
if(sum==packet_in[6])
|
||||
{
|
||||
//Write the RXID
|
||||
#ifdef DEBUG_SERIAL
|
||||
debug("RXID ");
|
||||
for(uint8_t i=0; i < 3; i++)
|
||||
debug(" %02X", packet_in[3+i]);
|
||||
debugln();
|
||||
#endif
|
||||
addr=JIABAILE_EEPROM_OFFSET+RX_num*3;
|
||||
for(uint8_t i=0;i<3;i++)
|
||||
eeprom_write_byte((EE_ADDR)(addr+i),packet_in[3+i]);
|
||||
//Switch to normal mode
|
||||
BIND_DONE;
|
||||
phase = JIABAILE_PREP_DATA;
|
||||
}
|
||||
#ifdef DEBUG_SERIAL
|
||||
else
|
||||
debug("Wrong Sum");
|
||||
}
|
||||
else
|
||||
debug("Wrong TX ID");
|
||||
}
|
||||
else
|
||||
debug("Bad CRC");
|
||||
debugln("");
|
||||
#else
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
JIABAILE_send_packet();
|
||||
return JIABAILE_WRITE_TIME;
|
||||
case JIABAILE_RX:
|
||||
//Wait for the packet transmission to finish
|
||||
while(XN297_IsPacketSent()==false);
|
||||
//Switch to RX
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
phase = JIABAILE_BIND;
|
||||
return JIABAILE_BIND_PACKET_PERIOD - JIABAILE_WRITE_TIME;
|
||||
case JIABAILE_PREP_DATA:
|
||||
//Read the RXID
|
||||
addr=JIABAILE_EEPROM_OFFSET+RX_num*3;
|
||||
for(uint8_t i=0;i<3;i++)
|
||||
rx_id[i+1] = eeprom_read_byte((EE_ADDR)(addr+i));
|
||||
#ifdef DEBUG_SERIAL
|
||||
debug("RXID ");
|
||||
for(uint8_t i=0; i < 3; i++)
|
||||
debug(" %02X", rx_id[i+1]);
|
||||
#endif
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTXAddr(rx_id, 5);
|
||||
//Set the normal frequencies
|
||||
sum=rx_id[1]&0x07;
|
||||
hopping_frequency[0] = (sum>4?30:8) + sum;
|
||||
if(sum==4 || sum ==7)
|
||||
hopping_frequency[0]++;
|
||||
hopping_frequency[1] = 40 + sum;
|
||||
if((sum & 0x06) == 0x06)
|
||||
hopping_frequency[1] += 21;
|
||||
hopping_frequency[2] = 70 + sum;
|
||||
#ifdef DEBUG_SERIAL
|
||||
debug(" RF");
|
||||
for(uint8_t i=0; i < 3; i++)
|
||||
debug(" %d", hopping_frequency[i]);
|
||||
debugln();
|
||||
#endif
|
||||
phase++;
|
||||
default: //JIABAILE_DATA
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(packet_period);
|
||||
#endif
|
||||
JIABAILE_send_packet();
|
||||
break;
|
||||
}
|
||||
return packet_period;
|
||||
}
|
||||
|
||||
void JIABAILE_init()
|
||||
{
|
||||
JIABAILE_initialize_txid();
|
||||
JIABAILE_RF_init();
|
||||
if(sub_protocol == JIABAILE_STD)
|
||||
{//Std
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
{
|
||||
phase = JIABAILE_BIND;
|
||||
bind_counter = JIABAILE_BIND_COUNT;
|
||||
}
|
||||
else
|
||||
phase = JIABAILE_PREP_DATA;
|
||||
packet_period = JIABAILE_PACKET_PERIOD;
|
||||
}
|
||||
else
|
||||
{//Gyro
|
||||
phase = JIABAILE_DATA;
|
||||
bind_counter = IS_BIND_IN_PROGRESS?JIABAILE_BIND_COUNT>>2:1;
|
||||
packet_period = JIABAILE_GYRO_PACKET_PERIOD;
|
||||
}
|
||||
hopping_frequency_no = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
/*
|
||||
// CAR RX debug code
|
||||
|
||||
static void __attribute__((unused)) JIABAILE_RF_init()
|
||||
{
|
||||
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
|
||||
//Bind address
|
||||
memcpy(rx_id,(uint8_t*)"\xA7\x07\x57\xA7\x26", 5);
|
||||
XN297_SetTXAddr(rx_id, 5);
|
||||
XN297_SetRXAddr(rx_id, JIABAILE_PAYLOAD_SIZE);
|
||||
XN297_RFChannel(7);
|
||||
rx_tx_addr[0] = 0x00;
|
||||
rx_tx_addr[1] = RX_num;
|
||||
rx_tx_addr[2] = 0x00;
|
||||
}
|
||||
|
||||
uint16_t JIABAILE_callback()
|
||||
{
|
||||
switch(phase)
|
||||
{
|
||||
case JIABAILE_BIND:
|
||||
if(XN297_IsRX())
|
||||
{
|
||||
if(XN297_ReadPayload(packet_in, JIABAILE_PAYLOAD_SIZE))
|
||||
{//CRC OK
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
#ifdef DEBUG_SERIAL
|
||||
debug("RX Bind");
|
||||
for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X", packet_in[i]);
|
||||
debugln();
|
||||
#endif
|
||||
memcpy(packet,packet_in,3);
|
||||
memcpy(&packet[3],rx_tx_addr,3);
|
||||
packet[6]=0xAA + 7;
|
||||
for(uint8_t i=0; i < JIABAILE_RX_PAYLOAD_SIZE-1; i++)
|
||||
packet[6]+=packet[i];
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
memcpy(&rx_id[1],rx_tx_addr,3);
|
||||
bind_counter = 10;
|
||||
phase = JIABAILE_RX;
|
||||
}
|
||||
}
|
||||
return JIABAILE_WRITE_TIME;
|
||||
case JIABAILE_RX:
|
||||
if(bind_counter)
|
||||
{
|
||||
bind_counter--;
|
||||
XN297_WritePayload(packet, JIABAILE_RX_PAYLOAD_SIZE);
|
||||
#ifdef DEBUG_SERIAL
|
||||
debug("TX Bind");
|
||||
for(uint8_t i=0; i < JIABAILE_RX_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X", packet[i]);
|
||||
debugln();
|
||||
#endif
|
||||
return JIABAILE_PACKET_PERIOD;
|
||||
}
|
||||
//Wait for the packet transmission to finish
|
||||
//while(XN297_IsPacketSent()==false);
|
||||
//Switch to RX
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetRXAddr(rx_id, JIABAILE_PAYLOAD_SIZE);
|
||||
hopping_frequency_no++;
|
||||
if(hopping_frequency_no>84)
|
||||
hopping_frequency_no = 0;
|
||||
debug(".");
|
||||
XN297_RFChannel(hopping_frequency_no);
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
phase = JIABAILE_DATA;
|
||||
return JIABAILE_BIND_PACKET_PERIOD;
|
||||
case JIABAILE_DATA:
|
||||
if(XN297_IsRX())
|
||||
{
|
||||
debugln("");
|
||||
if(XN297_ReadPayload(packet_in, JIABAILE_PAYLOAD_SIZE))
|
||||
{//CRC OK
|
||||
#ifdef DEBUG_SERIAL
|
||||
debug("CH=%d=%02X P:",hopping_frequency_no,hopping_frequency_no);
|
||||
for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X", packet_in[i]);
|
||||
#endif
|
||||
//Check packet
|
||||
uint8_t sum=0x55 + hopping_frequency_no;
|
||||
for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE-1; i++)
|
||||
sum+=packet_in[i];
|
||||
if(sum==packet_in[7])
|
||||
{
|
||||
debug("Good channel");
|
||||
}
|
||||
else
|
||||
debug("Wrong Sum");
|
||||
}
|
||||
else
|
||||
debug("Bad CRC");
|
||||
debugln("");
|
||||
}
|
||||
phase = JIABAILE_RX;
|
||||
break;
|
||||
}
|
||||
return JIABAILE_PACKET_PERIOD;
|
||||
}
|
||||
|
||||
void JIABAILE_init()
|
||||
{
|
||||
JIABAILE_RF_init();
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
phase = JIABAILE_BIND;
|
||||
hopping_frequency_no = 7;
|
||||
}
|
||||
*/
|
||||
185
Multiprotocol/Kamtom_nrf24l01.ino
Normal file
185
Multiprotocol/Kamtom_nrf24l01.ino
Normal file
@@ -0,0 +1,185 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#if defined(KAMTOM_NRF24L01_INO)
|
||||
|
||||
#include "iface_xn297.h"
|
||||
|
||||
//#define FORCE_KAMTOM_ORIGINAL_ID
|
||||
|
||||
#define KAMTOM_PAYLOAD_SIZE 16
|
||||
#define KAMTOM_RF_NUM_CHANNELS 4
|
||||
#define KAMTOM_BIND_COUNT 2000
|
||||
#define KAMTOM_WRITE_TIME 650
|
||||
#define KAMTOM_BIND_CHANNEL 0x28 //40
|
||||
#define KAMTOM_PACKET_PERIOD 3585
|
||||
|
||||
|
||||
enum {
|
||||
KAMTOM_DATA,
|
||||
KAMTOM_RX,
|
||||
};
|
||||
|
||||
static void __attribute__((unused)) KAMTOM_send_packet()
|
||||
{
|
||||
if(bind_counter)
|
||||
{
|
||||
bind_counter--;
|
||||
if(!bind_counter)
|
||||
BIND_DONE;
|
||||
}
|
||||
|
||||
memset(packet, 0x00, 16);
|
||||
|
||||
if(IS_BIND_DONE)
|
||||
{//Normal
|
||||
XN297_Hopping(hopping_frequency_no);
|
||||
hopping_frequency_no++;
|
||||
hopping_frequency_no &= 3;
|
||||
|
||||
//RXID
|
||||
packet[0] = rx_tx_addr[0];
|
||||
packet[2] = rx_tx_addr[1];
|
||||
//Next RF channel
|
||||
packet[1] = hopping_frequency[hopping_frequency_no];
|
||||
//Channels and trims
|
||||
for(uint8_t i=0; i<6; i++)
|
||||
{
|
||||
packet[4+i] = convert_channel_s8b(CH_TAER[i]);
|
||||
if(i>3) //ST_TR and TH_TR
|
||||
packet[4+i] >>= 2;
|
||||
}
|
||||
//packet[11] = 0x00; //??
|
||||
//TH_DR
|
||||
packet[12] = convert_channel_16b_limit(CH7,0x25,0x64);
|
||||
}
|
||||
else
|
||||
{
|
||||
packet[1] = KAMTOM_BIND_CHANNEL;
|
||||
memcpy(&packet[4],hopping_frequency,4);
|
||||
packet[12] = 0xA5;
|
||||
}
|
||||
packet[10] = 0x40; //??
|
||||
//Checksum
|
||||
uint16_t sum = packet[1];
|
||||
for(uint8_t i=4;i<13;i++)
|
||||
sum += packet[i];
|
||||
packet[13] = sum;
|
||||
packet[3] = (sum>>6) & 0xFC;
|
||||
//TXID
|
||||
packet[14] = rx_tx_addr[2];
|
||||
packet[15] = rx_tx_addr[3];
|
||||
// Send
|
||||
XN297_SetPower();
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
XN297_WriteEnhancedPayload(packet, KAMTOM_PAYLOAD_SIZE,false);
|
||||
#if 0
|
||||
//def DEBUG_SERIAL
|
||||
for(uint8_t i=0; i < KAMTOM_PAYLOAD_SIZE; i++)
|
||||
debug("%02X ", packet[i]);
|
||||
debugln();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) KAMTOM_initialize_txid()
|
||||
{
|
||||
calc_fh_channels(4);
|
||||
#ifdef FORCE_KAMTOM_ORIGINAL_ID
|
||||
rx_tx_addr[0] = 0xC7;
|
||||
rx_tx_addr[1] = 0x78;
|
||||
rx_tx_addr[2] = 0x2C;
|
||||
rx_tx_addr[3] = 0x25;
|
||||
hopping_frequency[0] = 59;
|
||||
hopping_frequency[1] = 59;
|
||||
hopping_frequency[2] = 71;
|
||||
hopping_frequency[3] = 65;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) KAMTOM_RF_init()
|
||||
{
|
||||
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
|
||||
//Address
|
||||
XN297_SetTXAddr((uint8_t*)"\xCC\xDD\xEE\xDD", 4);
|
||||
XN297_SetRXAddr((uint8_t*)"\xCC\xDD\xEE\xDD", KAMTOM_PAYLOAD_SIZE);
|
||||
XN297_RFChannel(KAMTOM_BIND_CHANNEL);
|
||||
}
|
||||
|
||||
uint16_t KAMTOM_callback()
|
||||
{
|
||||
static bool rx=false;
|
||||
|
||||
switch(phase)
|
||||
{
|
||||
case KAMTOM_DATA:
|
||||
rx = XN297_IsRX();
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(KAMTOM_PACKET_PERIOD);
|
||||
#endif
|
||||
KAMTOM_send_packet();
|
||||
if(rx)
|
||||
{
|
||||
uint8_t val=XN297_ReadEnhancedPayload(packet_in, KAMTOM_PAYLOAD_SIZE);
|
||||
if(val==KAMTOM_PAYLOAD_SIZE)
|
||||
{
|
||||
BIND_DONE;
|
||||
if(packet_in[0] == 0xA0 && packet_in[14] == rx_tx_addr[2] && packet_in[15] == rx_tx_addr[3])
|
||||
{//Good packet with our TXID
|
||||
rx_tx_addr[0] = packet_in[9];
|
||||
rx_tx_addr[1] = packet_in[10];
|
||||
#ifdef KAMTOM_HUB_TELEMETRY
|
||||
v_lipo1 = packet_in[1] == 0x03 ? 0x00:0xFF; // low voltage
|
||||
telemetry_link = 1;
|
||||
#endif
|
||||
}
|
||||
#if 0
|
||||
for(uint8_t i=0; i < KAMTOM_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X", packet_in[i]);
|
||||
debugln();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
phase++;
|
||||
return KAMTOM_WRITE_TIME;
|
||||
default: //KAMTOM_RX
|
||||
//{ // Wait for packet to be sent before switching to receive mode
|
||||
// uint16_t start=(uint16_t)micros();
|
||||
// while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 500)
|
||||
// if(XN297_IsPacketSent())
|
||||
// break;
|
||||
//}
|
||||
//Switch to RX
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
phase = KAMTOM_DATA;
|
||||
return KAMTOM_PACKET_PERIOD - KAMTOM_WRITE_TIME;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void KAMTOM_init()
|
||||
{
|
||||
KAMTOM_initialize_txid();
|
||||
KAMTOM_RF_init();
|
||||
|
||||
bind_counter = KAMTOM_BIND_COUNT;
|
||||
phase = KAMTOM_DATA;
|
||||
hopping_frequency_no = 0;
|
||||
#ifdef KAMTOM_HUB_TELEMETRY
|
||||
RX_RSSI = 100; // Dummy value
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -112,7 +112,10 @@ void KYOSHO3_init()
|
||||
debugln("RF CH: %02X",hopping_frequency[0]);
|
||||
#endif
|
||||
|
||||
CYRF_ConfigRFChannel(hopping_frequency[0]);
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
CYRF_ConfigRFChannel(0x04);
|
||||
else
|
||||
CYRF_ConfigRFChannel(hopping_frequency[0]);
|
||||
|
||||
bind_counter = 8217;
|
||||
phase = 0;
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
// compatible with MT99xx, Eachine H7, Yi Zhan i6S and LS114/124
|
||||
// compatible with MT99xx, Eachine H7, Yi Zhan i6S, LS114/124, QF009 Su35
|
||||
// Last sync with Goebish mt99xx_nrf24l01.c dated 2016-01-29
|
||||
|
||||
#if defined(MT99XX_CCNRF_INO)
|
||||
@@ -96,6 +96,16 @@ enum{
|
||||
FLAG_PA18_FLIP = 0x80,
|
||||
};
|
||||
|
||||
enum{
|
||||
// flags going to packet[6] (QF009 Su35)
|
||||
FLAG_SU35_6G = 0x00,
|
||||
FLAG_SU35_3D = 0x40,
|
||||
FLAG_SU35_HIRATE = 0x01,
|
||||
FLAG_SU35_LED = 0x02,
|
||||
FLAG_SU35_FLASH = 0x04,
|
||||
FLAG_SU35_INVERT = 0x08,
|
||||
};
|
||||
|
||||
const uint8_t h7_mys_byte[] = {
|
||||
0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 0x04, 0x14,
|
||||
0x05, 0x15, 0x06, 0x16, 0x07, 0x17, 0x00, 0x10
|
||||
@@ -179,8 +189,8 @@ static void __attribute__((unused)) MT99XX_send_packet()
|
||||
packet[1] = convert_channel_16b_limit(RUDDER ,0x00,0xE1); // rudder
|
||||
packet[2] = convert_channel_16b_limit(AILERON ,0xE1,0x00); // aileron
|
||||
packet[3] = convert_channel_16b_limit(ELEVATOR,0x00,0xE1); // elevator
|
||||
packet[4] = 0x20; // pitch trim (0x3f-0x20-0x00)
|
||||
packet[5] = 0x20; // roll trim (0x00-0x20-0x3f)
|
||||
packet[4] = (convert_channel_8b(CH10) ^ 0xFF) >> 2; // aileron trim (3F..20..00)
|
||||
packet[5] = convert_channel_8b(CH11) >> 2; // elevator trim (00..20..3F)
|
||||
packet[6] = GET_FLAG( CH5_SW, FLAG_MT_FLIP );
|
||||
if(sub_protocol != PA18+8)
|
||||
packet[7] = h7_mys_byte[hopping_frequency_no]; // next rf channel index ?
|
||||
@@ -271,6 +281,14 @@ static void __attribute__((unused)) MT99XX_send_packet()
|
||||
if(hopping_frequency_no == 0)
|
||||
packet[7] ^= 0x40;
|
||||
break;
|
||||
case SU35+8:
|
||||
packet[6] = FLAG_SU35_6G
|
||||
| GET_FLAG( CH5_SW, FLAG_SU35_3D )
|
||||
| GET_FLAG( !CH6_SW, FLAG_SU35_LED )
|
||||
| GET_FLAG( CH7_SW, FLAG_SU35_FLASH )
|
||||
| GET_FLAG( CH8_SW, FLAG_SU35_INVERT )
|
||||
| GET_FLAG( CH9_SW, FLAG_SU35_HIRATE );
|
||||
break;
|
||||
}
|
||||
uint8_t result=crc8;
|
||||
for(uint8_t i=0; i<8; i++)
|
||||
@@ -319,7 +337,7 @@ static void __attribute__((unused)) MT99XX_send_packet()
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
XN297_WritePayload(packet, MT99XX_PACKET_SIZE);
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
for(uint8_t i=0; i<MT99XX_PACKET_SIZE; i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln();
|
||||
@@ -512,7 +530,7 @@ void MT99XX_init(void)
|
||||
bind_counter = MT99XX_BIND_COUNT;
|
||||
if(IS_BIND_DONE)
|
||||
{
|
||||
if(sub_protocol != A180 && sub_protocol != DRAGON && sub_protocol != F949G && sub_protocol != PA18+8)
|
||||
if(sub_protocol != A180 && sub_protocol != DRAGON && sub_protocol != F949G && sub_protocol != PA18+8 && sub_protocol != SU35+8)
|
||||
BIND_IN_PROGRESS; // autobind protocol
|
||||
else
|
||||
bind_counter = 1;
|
||||
|
||||
@@ -50,12 +50,19 @@ static void __attribute__((unused)) MOULDKG_send_packet()
|
||||
else
|
||||
{
|
||||
uint8_t n = num_ch<<2;
|
||||
if(sub_protocol == MOULDKG_ANALOG)
|
||||
if(sub_protocol == MOULDKG_ANALOG4 || sub_protocol == MOULDKG_ANALOG6 )
|
||||
{
|
||||
packet[0] = 0x36;
|
||||
uint8_t ch[]={ 1,0,2,3 };
|
||||
for(uint8_t i=0;i<4;i++)
|
||||
packet[i+4] = convert_channel_8b(ch[i]+n);
|
||||
const uint8_t ch[]={ 1,0,2,3,5,4 };
|
||||
if(sub_protocol == MOULDKG_ANALOG6)
|
||||
n += num_ch<<1;
|
||||
for(uint8_t i=0;i<6;i++)
|
||||
{
|
||||
if( (i > 3 && sub_protocol == MOULDKG_ANALOG4) || i + n > 15)
|
||||
packet[i+4] = 0x80; //Centered channel
|
||||
else
|
||||
packet[i+4] = convert_channel_8b(ch[i]+n);
|
||||
}
|
||||
len = MOULDKG_PAYLOAD_SIZE_ANALOG;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
8,YD717,YD717,SKYWLKR,SYMAX4,XINXUN,NIHUI
|
||||
9,KN,WLTOYS,FEILUN
|
||||
10,SymaX,SYMAX,SYMAX5C
|
||||
11,SLT,SLT_V1,SLT_V2,Q100,Q200,MR100,V1_4CH
|
||||
11,SLT,SLT_V1,SLT_V2,Q100,Q200,MR100,V1_4CH,RF_SIM
|
||||
12,CX10,GREEN,BLUE,DM007,---,J3015_1,J3015_2,MK33041
|
||||
13,CG023,CG023,YD829
|
||||
14,Bayang,Bayang,H8S3D,X16_AH,IRDRONE,DHD_D4,QX100
|
||||
@@ -23,9 +23,9 @@
|
||||
23,FQ777
|
||||
24,ASSAN
|
||||
25,FrskyV
|
||||
26,HONTAI,HONTAI,JJRCX1,X5C1,FQ777_951
|
||||
26,HONTAI,HONTAI,JJRCX1,X5C1,FQ777_951,XKK170
|
||||
27,OpnLrs
|
||||
28,AFHDS2A,PWM_IBUS,PPM_IBUS,PWM_SBUS,PPM_SBUS,PWM_IB16,PPM_IB16,PWM_SB16,PPM_SB16
|
||||
28,AFHDS2A,PWM_IBUS,PPM_IBUS,PWM_SBUS,PPM_SBUS,Gyro_Off,Gyro_On,G_On_Rev
|
||||
29,Q2X2,Q222,Q242,Q282
|
||||
30,WK2x01,WK2801,WK2401,W6_5_1,W6_6_1,W6_HEL,W6_HEL_I
|
||||
31,Q303,Q303,CX35,CX10D,CX10WD
|
||||
@@ -55,7 +55,7 @@
|
||||
55,Frsky_RX,Multi,CloneTX,EraseTX,CPPM
|
||||
56,AFHDS2A_RX,Multi,CPPM
|
||||
57,HoTT,Sync,No_Sync
|
||||
58,FX,816,620,9630,Q560
|
||||
58,FX,816,620,9630,Q560,QF012
|
||||
59,Bayang_RX,Multi,CPPM
|
||||
60,Pelikan,Pro,Lite,SCX24
|
||||
61,EazyRC
|
||||
@@ -86,12 +86,19 @@
|
||||
87,IKEA
|
||||
88,WILLIFM
|
||||
89,Losi
|
||||
90,MouldKg,Analog,Digit
|
||||
90,MouldKg,A4444,D4444,A664
|
||||
91,Xerall
|
||||
92,MT99xx,PA18
|
||||
92,MT99xx,PA18,SU35
|
||||
93,Kyosho2,KT-17
|
||||
94,Scorpio
|
||||
95,BlueFly
|
||||
96,BumbleB
|
||||
97,SGF22
|
||||
98,Kyosho3
|
||||
97,SGF22,F22,F22S,J20
|
||||
98,Kyosho3
|
||||
99,XK2,X4,P10
|
||||
100,YuXiang
|
||||
102,JIABAILE,STD,GYRO
|
||||
103,H36
|
||||
104,KAMTOM
|
||||
105,Shenqi2
|
||||
106,WL91x
|
||||
|
||||
@@ -36,6 +36,7 @@ const char STR_MT99XX[] ="MT99XX";
|
||||
const char STR_MT99XX2[] ="MT99XX2";
|
||||
const char STR_MJXQ[] ="MJXq";
|
||||
const char STR_SHENQI[] ="Shenqi";
|
||||
const char STR_SHENQI2[] ="Shenqi2";
|
||||
const char STR_FY326[] ="FY326";
|
||||
const char STR_FUTABA[] ="Futaba";
|
||||
const char STR_J6PRO[] ="J6 Pro";
|
||||
@@ -55,6 +56,7 @@ const char STR_DM002[] ="DM002";
|
||||
const char STR_CABELL[] ="Cabell";
|
||||
const char STR_ESKY150[] ="Esky150";
|
||||
const char STR_ESKY150V2[] ="EskyV2";
|
||||
const char STR_H36[] ="H36";
|
||||
const char STR_H8_3D[] ="H8 3D";
|
||||
const char STR_CORONA[] ="Corona";
|
||||
const char STR_CFLIE[] ="CFlie";
|
||||
@@ -82,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_XK2[] ="XK2";
|
||||
const char STR_XN297DUMP[] ="XN297DP";
|
||||
const char STR_FRSKYR9[] ="FrSkyR9";
|
||||
const char STR_PROPEL[] ="Propel";
|
||||
@@ -110,6 +113,12 @@ const char STR_BUMBLEB[] ="BumbleB";
|
||||
const char STR_SGF22[] ="SGF22";
|
||||
const char STR_EAZYRC[] ="EazyRC";
|
||||
const char STR_KYOSHO3[] ="Kyosho3";
|
||||
const char STR_YUXIANG[] ="YuXiang";
|
||||
const char STR_UDIRC[] ="UDIRC";
|
||||
const char STR_JIABAILE[] ="JIABAILE";
|
||||
const char STR_KAMTOM[] ="KAMTOM";
|
||||
const char STR_WL91X[] ="WL91x";
|
||||
const char STR_WPL[] ="WPL";
|
||||
|
||||
const char STR_SUBTYPE_FLYSKY[] = "\x04""Std\0""V9x9""V6x6""V912""CX20";
|
||||
const char STR_SUBTYPE_HUBSAN[] = "\x04""H107""H301""H501";
|
||||
@@ -130,16 +139,16 @@ const char STR_SUBTYPE_DEVO[] = "\x04""8ch\0""10ch""12ch""6ch\0""7ch\0";
|
||||
const char STR_SUBTYPE_YD717[] = "\x07""Std\0 ""SkyWlkr""Syma X4""XINXUN\0""NIHUI\0 ";
|
||||
const char STR_SUBTYPE_KN[] = "\x06""WLtoys""FeiLun";
|
||||
const char STR_SUBTYPE_SYMAX[] = "\x03""Std""X5C";
|
||||
const char STR_SUBTYPE_SLT[] = "\x06""V1_6ch""V2_8ch""Q100\0 ""Q200\0 ""MR100\0""V1_4ch";
|
||||
const char STR_SUBTYPE_SLT[] = "\x06""V1_6ch""V2_8ch""Q100\0 ""Q200\0 ""MR100\0""V1_4ch""RF_SIM";
|
||||
const char STR_SUBTYPE_CX10[] = "\x07""Green\0 ""Blue\0 ""DM007\0 ""-\0 ""JC3015a""JC3015b""MK33041";
|
||||
const char STR_SUBTYPE_CG023[] = "\x05""Std\0 ""YD829";
|
||||
const char STR_SUBTYPE_BAYANG[] = "\x07""Std\0 ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4\0""QX100\0 ";
|
||||
const char STR_SUBTYPE_MT99[] = "\x06""MT99\0 ""H7\0 ""YZ\0 ""LS\0 ""FY805\0""A180\0 ""Dragon""F949G\0";
|
||||
const char STR_SUBTYPE_MT992[] = "\x04""PA18";
|
||||
const char STR_SUBTYPE_MT992[] = "\x04""PA18""SU35";
|
||||
const char STR_SUBTYPE_MJXQ[] = "\x07""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix";
|
||||
const char STR_SUBTYPE_FY326[] = "\x05""Std\0 ""FY319";
|
||||
const char STR_SUBTYPE_HONTAI[] = "\x07""Std\0 ""JJRC X1""X5C1\0 ""FQ_951";
|
||||
const char STR_SUBTYPE_AFHDS2A[] = "\x08""PWM,IBUS""PPM,IBUS""PWM,SBUS""PPM,SBUS""PWM,IB16""PPM,IB16""PWM,SB16""PPM,SB16";
|
||||
const char STR_SUBTYPE_HONTAI[] = "\x06""Std\0 ""JJRCX1""X5C1\0 ""FQ_951""XKK170";
|
||||
const char STR_SUBTYPE_AFHDS2A[] = "\x08""PWM,IBUS""PPM,IBUS""PWM,SBUS""PPM,SBUS""Gyro_Off""Gyro_On\0""G_On_Rev";
|
||||
const char STR_SUBTYPE_Q2X2[] = "\x04""Q222""Q242""Q282";
|
||||
const char STR_SUBTYPE_WK2x01[] = "\x06""WK2801""WK2401""W6_5_1""W6_6_1""W6_HeL""W6_HeI";
|
||||
const char STR_SUBTYPE_Q303[] = "\x06""Std\0 ""CX35\0 ""CX10D\0""CX10WD";
|
||||
@@ -155,11 +164,12 @@ const char STR_SUBTYPE_REDPINE[] = "\x04""Fast""Slow";
|
||||
const char STR_SUBTYPE_POTENSIC[] = "\x03""A20";
|
||||
const char STR_SUBTYPE_ZSX[] = "\x07""280JJRC";
|
||||
const char STR_SUBTYPE_HEIGHT[] = "\x03""5ch""8ch";
|
||||
const char STR_SUBTYPE_XN297DUMP[] = "\x07""250Kbps""1Mbps\0 ""2Mbps\0 ""Auto\0 ""NRF\0 ""CC2500\0";
|
||||
const char STR_SUBTYPE_XN297DUMP[] = "\x07""250Kbps""1Mbps\0 ""2Mbps\0 ""Auto\0 ""NRF\0 ""CC2500\0""XN297\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_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";
|
||||
const char STR_SUBTYPE_PROPEL[] = "\x04""74-Z";
|
||||
@@ -175,10 +185,12 @@ const char STR_SUBTYPE_KYOSHO2[] = "\x05""KT-17";
|
||||
const char STR_SUBTYPE_KYOSHO3[] = "\x03""ASF";
|
||||
const char STR_SUBTYPE_FUTABA[] = "\x05""SFHSS";
|
||||
const char STR_SUBTYPE_JJRC345[] = "\x08""JJRC345\0""SkyTmblr";
|
||||
const char STR_SUBTYPE_MOULDKG[] = "\x06""Analog""Digit\0";
|
||||
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[] = "\x04""816\0""620\0""9630""Q560";
|
||||
const char STR_SUBTYPE_FX[] = "\x05""816\0 ""620\0 ""9630\0""Q560\0""QF012";
|
||||
const char STR_SUBTYPE_SGF22[] = "\x04""F22\0""F22S""J20\0""CX10";
|
||||
const char STR_SUBTYPE_JIABAILE[] = "\x04""Std\0""Gyro";
|
||||
#define NO_SUBTYPE nullptr
|
||||
|
||||
#ifdef SEND_CPPM
|
||||
@@ -296,7 +308,7 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
{PROTO_FLYSKY, STR_FLYSKY, STR_SUBTYPE_FLYSKY, 5, OPTION_NONE, 0, 1, SW_A7105, FLYSKY_init, FLYSKY_callback },
|
||||
#endif
|
||||
#if defined(AFHDS2A_A7105_INO)
|
||||
{PROTO_AFHDS2A, STR_AFHDS2A, STR_SUBTYPE_AFHDS2A, 8, OPTION_SRVFREQ, 1, 1, SW_A7105, AFHDS2A_init, AFHDS2A_callback },
|
||||
{PROTO_AFHDS2A, STR_AFHDS2A, STR_SUBTYPE_AFHDS2A, 7, OPTION_SRVFREQ, 1, 1, SW_A7105, AFHDS2A_init, AFHDS2A_callback },
|
||||
#endif
|
||||
#if defined(AFHDS2A_RX_A7105_INO)
|
||||
{PROTO_AFHDS2A_RX, STR_AFHDS2A_RX,STR_CPPM, NBR_CPPM, OPTION_NONE, 0, 0, SW_A7105, AFHDS2A_RX_init, AFHDS2A_RX_callback },
|
||||
@@ -333,7 +345,7 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
{PROTO_FUTABA, STR_FUTABA, STR_SUBTYPE_FUTABA, 1, OPTION_RFTUNE, 1, 1, SW_CC2500, SFHSS_init, SFHSS_callback },
|
||||
#endif
|
||||
#if defined(FX_NRF24L01_INO)
|
||||
{PROTO_FX, STR_FX, STR_SUBTYPE_FX, 4, OPTION_NONE, 0, 0, SW_NRF, FX_init, FX_callback },
|
||||
{PROTO_FX, STR_FX, STR_SUBTYPE_FX, 5, OPTION_NONE, 0, 0, SW_NRF, FX_init, FX_callback },
|
||||
#endif
|
||||
#if defined(FY326_NRF24L01_INO)
|
||||
{PROTO_FY326, STR_FY326, STR_SUBTYPE_FY326, 2, OPTION_NONE, 0, 0, SW_NRF, FY326_init, FY326_callback },
|
||||
@@ -344,6 +356,9 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
#if defined(GW008_NRF24L01_INO)
|
||||
{PROTO_GW008, STR_GW008, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, GW008_init, GW008_callback },
|
||||
#endif
|
||||
#if defined(H36_NRF24L01_INO)
|
||||
{PROTO_H36, STR_H36, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, H36_init, H36_callback },
|
||||
#endif
|
||||
#if defined(H8_3D_NRF24L01_INO)
|
||||
{PROTO_H8_3D, STR_H8_3D, STR_SUBTYPE_H83D, 4, OPTION_NONE, 0, 0, SW_NRF, H8_3D_init, H8_3D_callback },
|
||||
#endif
|
||||
@@ -357,7 +372,7 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
{PROTO_HITEC, STR_HITEC, STR_SUBTYPE_HITEC, 3, OPTION_RFTUNE, 0, 0, SW_CC2500, HITEC_init, HITEC_callback },
|
||||
#endif
|
||||
#if defined(HONTAI_NRF24L01_INO)
|
||||
{PROTO_HONTAI, STR_HONTAI, STR_SUBTYPE_HONTAI, 4, OPTION_NONE, 0, 0, SW_NRF, HONTAI_init, HONTAI_callback },
|
||||
{PROTO_HONTAI, STR_HONTAI, STR_SUBTYPE_HONTAI, 5, OPTION_NONE, 0, 0, SW_NRF, HONTAI_init, HONTAI_callback },
|
||||
#endif
|
||||
#if defined(HOTT_CC2500_INO)
|
||||
{PROTO_HOTT, STR_HOTT, STR_SUBTYPE_HOTT, 2, OPTION_RFTUNE, 1, 0, SW_CC2500, HOTT_init, HOTT_callback },
|
||||
@@ -371,12 +386,18 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
#if defined(J6PRO_CYRF6936_INO)
|
||||
{PROTO_J6PRO, STR_J6PRO, NO_SUBTYPE, 0, OPTION_NONE, 0, 1, SW_CYRF, J6PRO_init, J6PRO_callback },
|
||||
#endif
|
||||
#if defined(JIABAILE_NRF24L01_INO)
|
||||
{PROTO_JIABAILE, STR_JIABAILE, STR_SUBTYPE_JIABAILE, 2, OPTION_NONE, 0, 0, SW_NRF, JIABAILE_init, JIABAILE_callback },
|
||||
#endif
|
||||
#if defined(JJRC345_NRF24L01_INO)
|
||||
{PROTO_JJRC345, STR_JJRC345, STR_SUBTYPE_JJRC345, 2, OPTION_NONE, 0, 0, SW_NRF, JJRC345_init, JJRC345_callback },
|
||||
#endif
|
||||
#if defined(JOYSWAY_A7105_INO)
|
||||
{PROTO_JOYSWAY, STR_JOYSWAY, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_A7105, JOYSWAY_init, JOYSWAY_callback },
|
||||
#endif
|
||||
#if defined(KAMTOM_NRF24L01_INO)
|
||||
{PROTO_KAMTOM, STR_KAMTOM, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, KAMTOM_init, KAMTOM_callback },
|
||||
#endif
|
||||
#if defined(KF606_CCNRF_INO)
|
||||
{PROTO_KF606, STR_KF606, STR_SUBTYPE_KF606, 3, OPTION_RFTUNE, 0, 0, SW_NRF, KF606_init, KF606_callback },
|
||||
#endif
|
||||
@@ -405,13 +426,13 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
{PROTO_MLINK, STR_MLINK, NO_SUBTYPE, 0, OPTION_NONE, 1, 0, SW_CYRF, MLINK_init, MLINK_callback },
|
||||
#endif
|
||||
#if defined(MOULDKG_NRF24L01_INO)
|
||||
{PROTO_MOULDKG, STR_MOULDKG, STR_SUBTYPE_MOULDKG, 2, OPTION_OPTION, 0, 0, SW_NRF, MOULDKG_init, MOULDKG_callback },
|
||||
{PROTO_MOULDKG, STR_MOULDKG, STR_SUBTYPE_MOULDKG, 3, OPTION_OPTION, 0, 0, SW_NRF, MOULDKG_init, MOULDKG_callback },
|
||||
#endif
|
||||
#if defined(MT99XX_CCNRF_INO)
|
||||
{PROTO_MT99XX, STR_MT99XX, STR_SUBTYPE_MT99, 8, OPTION_NONE, 0, 0, SW_NRF, MT99XX_init, MT99XX_callback },
|
||||
#endif
|
||||
#if defined(MT99XX_CCNRF_INO)
|
||||
{PROTO_MT99XX2, STR_MT99XX2, STR_SUBTYPE_MT992, 1, OPTION_NONE, 0, 0, SW_NRF, MT99XX_init, MT99XX_callback },
|
||||
{PROTO_MT99XX2, STR_MT99XX2, STR_SUBTYPE_MT992, 2, OPTION_NONE, 0, 0, SW_NRF, MT99XX_init, MT99XX_callback },
|
||||
#endif
|
||||
#if defined(NCC1701_NRF24L01_INO)
|
||||
{PROTO_NCC1701, STR_NCC1701, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, NCC_init, NCC_callback },
|
||||
@@ -453,16 +474,19 @@ 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, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, SGF22_init, SGF22_callback },
|
||||
{PROTO_SGF22, STR_SGF22, STR_SUBTYPE_SGF22, 4, 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 },
|
||||
#endif
|
||||
#if defined(SHENQI2_NRF24L01_INO)
|
||||
{PROTO_SHENQI2, STR_SHENQI2, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, SHENQI2_init, SHENQI2_callback },
|
||||
#endif
|
||||
#if defined(SKYARTEC_CC2500_INO)
|
||||
{PROTO_SKYARTEC, STR_SKYARTEC, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 1, SW_CC2500, SKYARTEC_init, SKYARTEC_callback },
|
||||
#endif
|
||||
#if defined(SLT_CCNRF_INO)
|
||||
{PROTO_SLT, STR_SLT, STR_SUBTYPE_SLT, 6, OPTION_RFTUNE, 0, 1, SW_NRF, SLT_init, SLT_callback },
|
||||
{PROTO_SLT, STR_SLT, STR_SUBTYPE_SLT, 7, OPTION_RFTUNE, 0, 1, SW_NRF, SLT_init, SLT_callback },
|
||||
#endif
|
||||
#if defined(SYMAX_NRF24L01_INO)
|
||||
{PROTO_SYMAX, STR_SYMAX, STR_SUBTYPE_SYMAX, 2, OPTION_NONE, 0, 0, SW_NRF, SYMAX_init, SYMAX_callback },
|
||||
@@ -470,6 +494,9 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
#if defined(TRAXXAS_CYRF6936_INO)
|
||||
{PROTO_TRAXXAS, STR_TRAXXAS, STR_SUBTYPE_TRAXXAS, 2, OPTION_NONE, 0, 0, SW_CYRF, TRAXXAS_init, TRAXXAS_callback },
|
||||
#endif
|
||||
#if defined(UDIRC_CCNRF_INO)
|
||||
{PROTO_UDIRC, STR_UDIRC, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, UDIRC_init, UDIRC_callback },
|
||||
#endif
|
||||
#if defined(V2X2_NRF24L01_INO)
|
||||
{PROTO_V2X2, STR_V2X2, STR_SUBTYPE_V2X2, 3, OPTION_NONE, 0, 0, SW_NRF, V2X2_init, V2X2_callback },
|
||||
#endif
|
||||
@@ -479,9 +506,6 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
#if defined(V911S_CCNRF_INO)
|
||||
{PROTO_V911S, STR_V911S, STR_SUBTYPE_V911S, 2, OPTION_RFTUNE, 0, 0, SW_NRF, V911S_init, V911S_callback },
|
||||
#endif
|
||||
#if defined(WK2x01_CYRF6936_INO)
|
||||
{PROTO_WK2x01, STR_WK2x01, STR_SUBTYPE_WK2x01, 6, OPTION_NONE, 1, 1, SW_CYRF, WK_init, WK_callback },
|
||||
#endif
|
||||
#if defined(WFLY_CYRF6936_INO)
|
||||
{PROTO_WFLY, STR_WFLY, STR_SUBTYPE_WFLY, 1, OPTION_NONE, 1, 0, SW_CYRF, WFLY_init, WFLY_callback },
|
||||
#endif
|
||||
@@ -489,18 +513,33 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
{PROTO_WFLY2, STR_WFLY2, STR_SUBTYPE_WFLY2, 1, OPTION_OPTION, 1, 0, SW_A7105, WFLY2_init, WFLY2_callback },
|
||||
// {PROTO_WFLY2, STR_WFLY2, STR_SUBTYPE_WFLY2, 1, OPTION_WBUS, 1, 0, SW_A7105, WFLY2_init, WFLY2_callback },// crash OpenTX...
|
||||
#endif
|
||||
#if defined(WK2x01_CYRF6936_INO)
|
||||
{PROTO_WK2x01, STR_WK2x01, STR_SUBTYPE_WK2x01, 6, OPTION_NONE, 1, 1, SW_CYRF, WK_init, WK_callback },
|
||||
#endif
|
||||
#if defined(WL91X_CCNRF_INO)
|
||||
{PROTO_WL91X, STR_WL91X, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, WL91X_init, WL91X_callback },
|
||||
#endif
|
||||
#if defined(WPL_NRF24L01_INO)
|
||||
{PROTO_WPL, STR_WPL, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, WPL_init, WPL_callback },
|
||||
#endif
|
||||
#if defined(XERALL_NRF24L01_INO)
|
||||
{PROTO_XERALL, STR_XERALL, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, XERALL_init, XERALL_callback },
|
||||
#endif
|
||||
#if defined(XK_CCNRF_INO)
|
||||
{PROTO_XK, STR_XK, STR_SUBTYPE_XK, 3, OPTION_RFTUNE, 0, 0, SW_NRF, XK_init, XK_callback },
|
||||
#endif
|
||||
#if defined(XK2_CCNRF_INO)
|
||||
{PROTO_XK2, STR_XK2, STR_SUBTYPE_XK2, 2, OPTION_RFTUNE, 0, 0, SW_NRF, XK2_init, XK2_callback },
|
||||
#endif
|
||||
#if defined(XN297DUMP_NRF24L01_INO)
|
||||
{PROTO_XN297DUMP, STR_XN297DUMP, STR_SUBTYPE_XN297DUMP, 6, OPTION_RFCHAN, 0, 0, SW_NRF, XN297Dump_init, XN297Dump_callback },
|
||||
{PROTO_XN297DUMP, STR_XN297DUMP, STR_SUBTYPE_XN297DUMP, 7, OPTION_RFCHAN, 0, 0, SW_NRF, XN297Dump_init, XN297Dump_callback },
|
||||
#endif
|
||||
#if defined(YD717_NRF24L01_INO)
|
||||
{PROTO_YD717, STR_YD717, STR_SUBTYPE_YD717, 5, OPTION_NONE, 0, 0, SW_NRF, YD717_init, YD717_callback },
|
||||
#endif
|
||||
#if defined(YUXIANG_NRF24L01_INO)
|
||||
{PROTO_YUXIANG, STR_YUXIANG, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, YUXIANG_init, YUXIANG_callback },
|
||||
#endif
|
||||
#if defined(ZSX_NRF24L01_INO)
|
||||
{PROTO_ZSX, STR_ZSX, STR_SUBTYPE_ZSX, 1, OPTION_NONE, 0, 0, SW_NRF, ZSX_init, ZSX_callback },
|
||||
#endif
|
||||
@@ -555,7 +594,10 @@ uint16_t PROTOLIST_callback()
|
||||
Serial_write(multi_protocols[option].protocol);
|
||||
//Protocol name
|
||||
for(uint8_t i=0;i<proto_len;i++)
|
||||
{
|
||||
Serial_write(multi_protocols[option].ProtoString[i]);
|
||||
//debug("%c",multi_protocols[option].ProtoString[i]);
|
||||
}
|
||||
//Flags
|
||||
uint8_t flags=0;
|
||||
#ifdef FAILSAFE_ENABLE
|
||||
@@ -565,16 +607,21 @@ uint16_t PROTOLIST_callback()
|
||||
if(multi_protocols[option].chMap)
|
||||
flags |= 0x02; //Disable_ch_mapping supported
|
||||
Serial_write( flags | (multi_protocols[option].optionType<<4)); // flags && option type
|
||||
//debug(" Flag=%02X",flags | (multi_protocols[option].optionType<<4));
|
||||
//Number of sub protocols
|
||||
Serial_write(nbr_sub);
|
||||
|
||||
//debug(" NSub=%02X ",nbr_sub);
|
||||
if(nbr_sub !=0 )
|
||||
{//Sub protocols length and texts
|
||||
for(uint8_t i=0;i<=nbr_sub*sub_len;i++)
|
||||
{
|
||||
Serial_write(multi_protocols[option].SubProtoString[i]);
|
||||
//debug("%c",multi_protocols[option].SubProtoString[i]);
|
||||
}
|
||||
}
|
||||
//debugln("");
|
||||
}
|
||||
}
|
||||
return 1000;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#define VERSION_MAJOR 1
|
||||
#define VERSION_MINOR 3
|
||||
#define VERSION_REVISION 4
|
||||
#define VERSION_PATCH_LEVEL 9
|
||||
#define VERSION_PATCH_LEVEL 52
|
||||
|
||||
#define MODE_SERIAL 0
|
||||
|
||||
@@ -75,7 +75,7 @@ enum PROTOCOLS
|
||||
PROTO_NCC1701 = 44, // =>NRF24L01
|
||||
PROTO_E01X = 45, // =>CYRF6936
|
||||
PROTO_V911S = 46, // =>NRF24L01
|
||||
PROTO_GD00X = 47, // =>NRF24L01
|
||||
PROTO_GD00X = 47, // =>CC2500 & NRF24L01
|
||||
PROTO_V761 = 48, // =>NRF24L01
|
||||
PROTO_KF606 = 49, // =>NRF24L01
|
||||
PROTO_REDPINE = 50, // =>CC2500
|
||||
@@ -126,7 +126,15 @@ enum PROTOCOLS
|
||||
PROTO_BUMBLEB = 96, // =>CC2500 & NRF24L01
|
||||
PROTO_SGF22 = 97, // =>NRF24L01
|
||||
PROTO_KYOSHO3 = 98, // =>CYRF6936
|
||||
|
||||
PROTO_XK2 = 99, // =>CC2500 & NRF24L01
|
||||
PROTO_YUXIANG = 100, // =>NRF24L01
|
||||
PROTO_UDIRC = 101, // =>CC2500 & NRF24L01
|
||||
PROTO_JIABAILE = 102, // =>NRF24L01
|
||||
PROTO_H36 = 103, // =>NRF24L01
|
||||
PROTO_KAMTOM = 104, // =>NRF24L01
|
||||
PROTO_SHENQI2 = 105, // =>NRF24L01
|
||||
PROTO_WL91X = 106, // =>CC2500 & NRF24L01
|
||||
PROTO_WPL = 107, // =>NRF24L01
|
||||
|
||||
PROTO_NANORF = 126, // =>NRF24L01
|
||||
PROTO_TEST = 127, // =>CC2500
|
||||
@@ -152,14 +160,13 @@ enum Hubsan
|
||||
};
|
||||
enum AFHDS2A
|
||||
{
|
||||
PWM_IBUS = 0,
|
||||
PPM_IBUS = 1,
|
||||
PWM_SBUS = 2,
|
||||
PPM_SBUS = 3,
|
||||
PWM_IB16 = 4,
|
||||
PPM_IB16 = 5,
|
||||
PWM_SB16 = 6,
|
||||
PPM_SB16 = 7,
|
||||
PWM_IBUS = 0,
|
||||
PPM_IBUS = 1,
|
||||
PWM_SBUS = 2,
|
||||
PPM_SBUS = 3,
|
||||
AFHDS2A_GYRO_OFF = 4,
|
||||
AFHDS2A_GYRO_ON = 5,
|
||||
AFHDS2A_GYRO_ON_REV = 6,
|
||||
};
|
||||
enum Hisky
|
||||
{
|
||||
@@ -208,6 +215,7 @@ enum SLT
|
||||
Q200 = 3,
|
||||
MR100 = 4,
|
||||
SLT_V1_4 = 5,
|
||||
RF_SIM = 6,
|
||||
};
|
||||
enum CX10
|
||||
{
|
||||
@@ -254,7 +262,8 @@ enum MT99XX
|
||||
};
|
||||
enum MT99XX2
|
||||
{
|
||||
PA18 = 0,
|
||||
PA18 = 0,
|
||||
SU35 = 1,
|
||||
};
|
||||
enum MJXQ
|
||||
{
|
||||
@@ -282,10 +291,11 @@ enum FRSKYX
|
||||
};
|
||||
enum HONTAI
|
||||
{
|
||||
HONTAI = 0,
|
||||
JJRCX1 = 1,
|
||||
X5C1 = 2,
|
||||
FQ777_951 =3,
|
||||
HONTAI = 0,
|
||||
JJRCX1 = 1,
|
||||
X5C1 = 2,
|
||||
FQ777_951 = 3,
|
||||
HONTAI_XKK170 = 4,
|
||||
};
|
||||
enum V2X2
|
||||
{
|
||||
@@ -390,6 +400,7 @@ enum XN297DUMP
|
||||
XN297DUMP_AUTO = 3,
|
||||
XN297DUMP_NRF = 4,
|
||||
XN297DUMP_CC2500 = 5,
|
||||
XN297DUMP_XN297 = 6,
|
||||
};
|
||||
enum FRSKY_R9
|
||||
{
|
||||
@@ -460,8 +471,9 @@ enum RLINK
|
||||
};
|
||||
enum MOULDKG
|
||||
{
|
||||
MOULDKG_ANALOG = 0,
|
||||
MOULDKG_DIGIT = 1,
|
||||
MOULDKG_ANALOG4 = 0,
|
||||
MOULDKG_DIGIT4 = 1,
|
||||
MOULDKG_ANALOG6 = 2,
|
||||
};
|
||||
enum KF606
|
||||
{
|
||||
@@ -480,6 +492,24 @@ enum FX
|
||||
FX620 = 1,
|
||||
FX9630 = 2,
|
||||
FX_Q560 = 3,
|
||||
FX_QF012 = 4,
|
||||
};
|
||||
enum SGF22
|
||||
{
|
||||
SGF22_F22 = 0,
|
||||
SGF22_F22S = 1,
|
||||
SGF22_J20 = 2,
|
||||
SGF22_CX10 = 3,
|
||||
};
|
||||
enum JIABAILE
|
||||
{
|
||||
JIABAILE_STD = 0,
|
||||
JIABAILE_GYRO = 1,
|
||||
};
|
||||
enum XK2
|
||||
{
|
||||
XK2_X4 = 0,
|
||||
XK2_P10 = 1,
|
||||
};
|
||||
|
||||
#define NONE 0
|
||||
@@ -842,7 +872,9 @@ enum {
|
||||
#define MOULDKG_EEPROM_OFFSET 882 // RX ID, 3 bytes per model, end is 882+64*3=1074
|
||||
#define DSM_CLONE_EEPROM_OFFSET 1074 // (4) TX ID, (1) Initialized, end is 1079
|
||||
#define TRAXXAS_EEPROM_OFFSET 1079 // RX ID and SOP index, 3 bytes per model id, end is 1079+192=1271
|
||||
//#define CONFIG_EEPROM_OFFSET 1271 // Current configuration of the multimodule
|
||||
#define XK2_EEPROM_OFFSET 1271 // RX ID checksum, 1 byte per model, end is 1271+64=1335
|
||||
#define JIABAILE_EEPROM_OFFSET 1335 // RX ID, 3 bytes per model, end is 1335+64*3=1527
|
||||
//#define CONFIG_EEPROM_OFFSET 1527 // Current configuration of the multimodule
|
||||
|
||||
/* STM32 Flash Size */
|
||||
#ifndef DISABLE_FLASH_SIZE_CHECK
|
||||
@@ -1101,6 +1133,8 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
|
||||
Q100 2
|
||||
Q200 3
|
||||
MR100 4
|
||||
SLT_V1_4CH 5
|
||||
RF_SIM 6
|
||||
sub_protocol==E01X
|
||||
E012 0
|
||||
E015 1
|
||||
|
||||
@@ -232,7 +232,7 @@ static void __attribute__((unused)) RLINK_send_packet()
|
||||
packet[1] |= 0x21; //air 0x21 on dump but it looks to support telemetry at least RSSI
|
||||
break;
|
||||
case RLINK_DUMBORC:
|
||||
packet[1] = 0x00; //always 0x00 on dump
|
||||
packet[1] |= 0x01; //always 0x00 on dump but does appear to support telemtry on newer transmitters
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -384,8 +384,9 @@ uint16_t RLINK_callback()
|
||||
debug("Telem:");
|
||||
#endif
|
||||
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]==packet[1])
|
||||
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]==packet[1] || sub_protocol == RLINK_DUMBORC))
|
||||
{//Correct telemetry received: length, CRC, ID and type
|
||||
//packet_in[6] is 0x00 on almost all DumboRC RX so assume it is always valid
|
||||
#ifdef RLINK_DEBUG_TELEM
|
||||
for(uint8_t i=0;i<len;i++)
|
||||
debug(" %02X",packet_in[i]);
|
||||
|
||||
@@ -12,30 +12,52 @@ Multiprotocol is distributed in the hope that it will be useful,
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
// Compatible with SGF22 R11
|
||||
// Compatible with SGF22, ParkTen F22S, KF700 J20
|
||||
|
||||
#if defined(SGF22_NRF24L01_INO)
|
||||
|
||||
#include "iface_xn297.h"
|
||||
|
||||
//#define FORCE_SGF22_ORIGINAL_ID
|
||||
#define FORCE_SGF22_CX10_ORIGINAL_ID
|
||||
|
||||
#define SGF22_PACKET_PERIOD 11950 //10240
|
||||
#define SGF22_BIND_RF_CHANNEL 78
|
||||
#define SGF22_PAYLOAD_SIZE 12
|
||||
#define SGF22_BIND_COUNT 50
|
||||
#define SGF22_RF_NUM_CHANNELS 4
|
||||
#define SGF22_PACKET_PERIOD 11950 //10240
|
||||
#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
|
||||
|
||||
//packet[8]
|
||||
#define SGF22_FLAG_3D 0x00
|
||||
#define SGF22_FLAG_ROLL 0x08
|
||||
#define SGF22_FLAG_LIGHT 0x04
|
||||
#define SGF22_FLAG_VIDEO 0x10
|
||||
#define SGF22_FLAG_6G 0x40
|
||||
#define SGF22_FLAG_VERTICAL 0xC0
|
||||
#define SGF22_FLAG_3D 0x00
|
||||
#define SGF22_FLAG_LIGHT 0x04
|
||||
#define SGF22_FLAG_ROLL 0x08
|
||||
#define SGF22_FLAG_VIDEO 0x10
|
||||
#define SGF22_FLAG_6G 0x40
|
||||
#define SGF22_FLAG_VERTICAL 0xC0
|
||||
|
||||
#define SGF22_J20_FLAG_HORIZONTAL 0x80
|
||||
//#define SGF22_J20_FLAG_SPEED 0x01 // Up/Down trim, not implemented
|
||||
|
||||
#define SGF22_FX922_FLAG_BALANCEHIGH 0x01
|
||||
#define SGF22_FX922_FLAG_BALANCE 0x02
|
||||
|
||||
|
||||
//packet[9]
|
||||
#define SGF22_FLAG_PHOTO 0x40
|
||||
#define SGF22_FLAG_TRIMRESET 0x04
|
||||
#define SGF22_FLAG_TRIMRESET 0x04
|
||||
#define SGF22_FLAG_PHOTO 0x40 // #define SGF22_J20_FLAG_INVERT 0x40
|
||||
#define SGF22_J20_FLAG_FIXHEIGHT 0x80
|
||||
|
||||
#define SGF22_WRITE_TIME 1000
|
||||
|
||||
enum {
|
||||
SGF22_DATA1,
|
||||
SGF22_DATA2,
|
||||
SGF22_DATA3,
|
||||
SGF22_RX,
|
||||
};
|
||||
|
||||
static void __attribute__((unused)) SGF22_send_packet()
|
||||
{
|
||||
@@ -59,20 +81,43 @@ static void __attribute__((unused)) SGF22_send_packet()
|
||||
packet_sent = 0;
|
||||
//packet
|
||||
packet[0] = 0x1B;
|
||||
packet[8] = SGF22_FLAG_3D // default
|
||||
| GET_FLAG(CH6_SW, SGF22_FLAG_ROLL) // roll
|
||||
| GET_FLAG(CH7_SW, SGF22_FLAG_LIGHT) // push up throttle trim for light
|
||||
| GET_FLAG(CH9_SW, SGF22_FLAG_VIDEO); // push down throttle trim for video
|
||||
if(Channel_data[CH5] > CHANNEL_MIN_COMMAND)
|
||||
packet[8] |= SGF22_FLAG_6G; // mode 1 - 6g
|
||||
if(Channel_data[CH5] > CHANNEL_MAX_COMMAND)
|
||||
packet[8] |= SGF22_FLAG_VERTICAL; // mode 0 - vertical
|
||||
packet[9] = GET_FLAG(CH8_SW, SGF22_FLAG_PHOTO) // press in throttle trim for photo
|
||||
| GET_FLAG(CH10_SW, SGF22_FLAG_TRIMRESET); // Both sticks down inwards
|
||||
packet[10] = 0x42; // no fine tune
|
||||
packet[11] = 0x10; // no fine tune
|
||||
if (sub_protocol != SGF22_CX10)
|
||||
{//SGF22_F22,SGF22_F22S,SGF22_J20
|
||||
packet[8] = SGF22_FLAG_3D // CH5 -100%, F22 & F22S - 3D mode, J20 - Gyro off
|
||||
| GET_FLAG(CH6_SW, SGF22_FLAG_ROLL) // roll
|
||||
| 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);
|
||||
if(Channel_data[CH5] > CHANNEL_MAX_COMMAND)
|
||||
packet[8] |= 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
|
||||
}
|
||||
else //SGF22_CX10 114548
|
||||
{
|
||||
if(CH6_SW)
|
||||
flags = 0x06; // high rate
|
||||
else
|
||||
if(Channel_data[CH6] < CHANNEL_MIN_COMMAND)
|
||||
flags = 0x04; // low rate
|
||||
else
|
||||
flags = 0x05; // mid rate
|
||||
packet[8] = flags
|
||||
| GET_FLAG(CH5_SW, 0x08); // flip
|
||||
}
|
||||
packet[9] = GET_FLAG(CH8_SW, SGF22_FLAG_PHOTO) // F22: photo, press in throttle trim in the stock TX, J20: invert flight
|
||||
| GET_FLAG(CH10_SW, ( sub_protocol == SGF22_J20 ? SGF22_J20_FLAG_FIXHEIGHT : SGF22_FLAG_TRIMRESET )) ; // F22: Both sticks down inwards in the stock TX, J20: Altitude hold
|
||||
packet[10] = 0x42; // no fine tune
|
||||
packet[11] = 0x10; // no fine tune
|
||||
}
|
||||
packet[1] = packet_count; // sequence
|
||||
if(sub_protocol == SGF22_F22S)
|
||||
packet[0] += 6;
|
||||
else if (sub_protocol == SGF22_J20)
|
||||
packet[0] += 3;
|
||||
else if (sub_protocol == SGF22_CX10)
|
||||
packet[0] += 0x6A;
|
||||
packet[1] = packet_count; // sequence
|
||||
packet[2] = rx_tx_addr[2];
|
||||
packet[3] = rx_tx_addr[3];
|
||||
packet[4] = convert_channel_8b(THROTTLE);
|
||||
@@ -82,7 +127,10 @@ static void __attribute__((unused)) SGF22_send_packet()
|
||||
|
||||
XN297_SetPower();
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
XN297_WriteEnhancedPayload(packet, SGF22_PAYLOAD_SIZE,0);
|
||||
if (sub_protocol != SGF22_CX10)
|
||||
XN297_WriteEnhancedPayload(packet, SGF22_PAYLOAD_SIZE,0);
|
||||
else
|
||||
XN297_WritePayload(packet, SGF22_PAYLOAD_SIZE);
|
||||
#if 0
|
||||
debug_time("");
|
||||
for(uint8_t i=0; i<SGF22_PAYLOAD_SIZE; i++)
|
||||
@@ -106,7 +154,7 @@ static void __attribute__((unused)) SGF22_initialize_txid()
|
||||
{ 0x18, 0x37, 0x27, 0x47 } };
|
||||
memcpy(hopping_frequency, &hop[val], SGF22_RF_NUM_CHANNELS);
|
||||
|
||||
/*//Same code sze...
|
||||
/*//Same code size...
|
||||
hopping_frequency[0] = 0x0C + 3 * val;
|
||||
hopping_frequency[1] = hopping_frequency[0] + 0x1E;
|
||||
if(val > 1) hopping_frequency[1]++;
|
||||
@@ -119,6 +167,23 @@ static void __attribute__((unused)) SGF22_initialize_txid()
|
||||
rx_tx_addr[3] = 0x61; // TX2:51 TX3:0C
|
||||
memcpy(hopping_frequency,"\x15\x34\x24\x44", SGF22_RF_NUM_CHANNELS); //Original dump=>21=0x15,52=0x34,36=0x24,68=0x44
|
||||
#endif
|
||||
#ifdef FORCE_SGF22_CX10_ORIGINAL_ID
|
||||
if(sub_protocol == SGF22_CX10)
|
||||
{
|
||||
if(rx_tx_addr[3] & 1)
|
||||
{
|
||||
rx_tx_addr[2] = 0x4C;
|
||||
rx_tx_addr[3] = 0xD7;
|
||||
memcpy(hopping_frequency, "\x37\x42\x47\x3c", SGF22_RF_NUM_CHANNELS);
|
||||
}
|
||||
else
|
||||
{
|
||||
rx_tx_addr[2] = 0x50;
|
||||
rx_tx_addr[3] = 0xE1;
|
||||
memcpy(hopping_frequency, "\x3b\x4b\x46\x41", SGF22_RF_NUM_CHANNELS);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if 0
|
||||
debug("ID: %02X %02X, C: ",rx_tx_addr[2],rx_tx_addr[3]);
|
||||
for(uint8_t i=0; i<SGF22_RF_NUM_CHANNELS; i++)
|
||||
@@ -131,33 +196,97 @@ static void __attribute__((unused)) SGF22_RF_init()
|
||||
{
|
||||
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
|
||||
XN297_SetTXAddr((uint8_t*)"\xC7\x95\x3C\xBB\xA5", 5);
|
||||
XN297_RFChannel(SGF22_BIND_RF_CHANNEL); // Set bind channel
|
||||
#ifdef SGF22_HUB_TELEMETRY
|
||||
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};
|
||||
XN297_RFChannel(bind_chan[sub_protocol]); // Set bind channel
|
||||
}
|
||||
|
||||
uint16_t SGF22_callback()
|
||||
{
|
||||
if(phase == 0)
|
||||
#ifdef SGF22_HUB_TELEMETRY
|
||||
bool rx = false;
|
||||
static uint8_t telem_count = 0;
|
||||
#endif
|
||||
|
||||
switch(phase)
|
||||
{
|
||||
phase++;
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(SGF22_PACKET_PERIOD);
|
||||
#endif
|
||||
SGF22_send_packet();
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
{
|
||||
if(--bind_counter==0)
|
||||
BIND_DONE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{//send 3 times in total the same packet
|
||||
NRF24L01_Strobe(REUSE_TX_PL);
|
||||
phase++;
|
||||
if(phase > 2)
|
||||
{
|
||||
phase = 0;
|
||||
return SGF22_PACKET_PERIOD - 2*1550;
|
||||
}
|
||||
case SGF22_DATA1:
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(SGF22_PACKET_PERIOD);
|
||||
#endif
|
||||
#ifdef SGF22_HUB_TELEMETRY
|
||||
rx = XN297_IsRX();
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
#endif
|
||||
SGF22_send_packet();
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
{
|
||||
if(--bind_counter==0)
|
||||
BIND_DONE;
|
||||
}
|
||||
#ifdef SGF22_HUB_TELEMETRY
|
||||
if(rx)
|
||||
{
|
||||
uint8_t p_len = XN297_ReadEnhancedPayload(packet_in, SGF22_PAYLOAD_SIZE);
|
||||
if(p_len == 3 && packet_in[0] == rx_tx_addr[2] && packet_in[1] == rx_tx_addr[3])
|
||||
{//packets: 00 0B 00 -> 00 0B 01
|
||||
telemetry_link = 1;
|
||||
v_lipo1 = packet_in[2] ? 0 : 255; //2.9V for 1S, 7.0V for 2S
|
||||
telemetry_lost = 0;
|
||||
telem_count = 0;
|
||||
}
|
||||
#if 0
|
||||
debug("L %d ",p_len);
|
||||
debug("RX");
|
||||
for(uint8_t i=0; i<SGF22_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X",packet_in[i]);
|
||||
debugln("");
|
||||
#endif
|
||||
}
|
||||
if(telem_count > 4*63) // Around 3.5sec with no telemetry
|
||||
telemetry_lost = 1;
|
||||
else
|
||||
{
|
||||
telem_count++;
|
||||
if(!telemetry_lost && (telem_count & 0x3F) == 0)
|
||||
{// Should have received a telem packet but... Send telem to the radio to keep it alive
|
||||
telemetry_link = 1;
|
||||
#if 0
|
||||
debugln("Miss");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
phase++;
|
||||
break;
|
||||
case SGF22_DATA2:
|
||||
case SGF22_DATA3:
|
||||
//send 3 times in total the same packet
|
||||
XN297_ReSendPayload();
|
||||
phase++;
|
||||
break;
|
||||
default: //SGF22_RX
|
||||
#ifdef SGF22_HUB_TELEMETRY
|
||||
/*{ // Wait for packet to be sent before switching to receive mode
|
||||
uint16_t start=(uint16_t)micros(), count=0;
|
||||
while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 500)
|
||||
{
|
||||
if(XN297_IsPacketSent())
|
||||
break;
|
||||
count++;
|
||||
}
|
||||
debugln("%d",count);
|
||||
}*/
|
||||
//Switch to RX
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
#endif
|
||||
phase = SGF22_DATA1;
|
||||
return SGF22_PACKET_PERIOD - 3*1550;
|
||||
}
|
||||
return 1550;
|
||||
}
|
||||
@@ -169,7 +298,11 @@ void SGF22_init()
|
||||
SGF22_RF_init();
|
||||
bind_counter=SGF22_BIND_COUNT;
|
||||
packet_sent = packet_count = 0x26; // TX2:26 TX3:26
|
||||
phase = 0;
|
||||
phase = SGF22_DATA1;
|
||||
#ifdef SGF22_HUB_TELEMETRY
|
||||
RX_RSSI = 100; // Dummy value
|
||||
telemetry_lost = 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
232
Multiprotocol/SHENQI2_nrf24l01.ino
Normal file
232
Multiprotocol/SHENQI2_nrf24l01.ino
Normal file
@@ -0,0 +1,232 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#if defined(SHENQI2_NRF24L01_INO)
|
||||
|
||||
#include "iface_xn297.h"
|
||||
|
||||
//#define FORCE_SHENQI2_ORIGINAL_ID
|
||||
|
||||
#define SHENQI2_PAYLOAD_SIZE 8
|
||||
#define SHENQI2_RF_NUM_CHANNELS 16
|
||||
#define SHENQI2_BIND_COUNT 2000
|
||||
#define SHENQI2_WRITE_TIME 650
|
||||
#define SHENQI2_BIND_CHANNEL 44
|
||||
#define SHENQI2_PACKET_PERIOD 8210
|
||||
|
||||
|
||||
enum {
|
||||
SHENQI2_BIND = 0,
|
||||
SHENQI2_BIND_RX,
|
||||
SHENQI2_DATA,
|
||||
};
|
||||
|
||||
static void __attribute__((unused)) SHENQI2_send_packet()
|
||||
{
|
||||
if(bind_counter)
|
||||
{
|
||||
bind_counter--;
|
||||
if(!bind_counter)
|
||||
BIND_DONE;
|
||||
}
|
||||
|
||||
memset(packet, 0x00, SHENQI2_PAYLOAD_SIZE);
|
||||
|
||||
packet_count &= 0x0F;
|
||||
packet[0] = packet_count;
|
||||
|
||||
memcpy(&packet[1],rx_tx_addr,5);
|
||||
|
||||
if(IS_BIND_DONE)
|
||||
{//Normal
|
||||
uint8_t val = convert_channel_8b(CH2);
|
||||
if(val < 0x70)
|
||||
val = 0x30;
|
||||
else if(val < 0x80)
|
||||
val = 0x00;
|
||||
else
|
||||
{
|
||||
val &= 0x7F;
|
||||
val >>= 2;
|
||||
}
|
||||
if(Channel_data[CH1] > 1024+50)
|
||||
val |= 0x40;
|
||||
else if(Channel_data[CH1] < 1024-50)
|
||||
val |= 0x80;
|
||||
packet[6] = val;
|
||||
//packet[7] = 0x00; // ??
|
||||
}
|
||||
else
|
||||
packet[0] |= 0x30;
|
||||
|
||||
// Send
|
||||
XN297_SetPower();
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
XN297_WriteEnhancedPayload(packet, SHENQI2_PAYLOAD_SIZE, false);
|
||||
#ifdef DEBUG_SERIAL
|
||||
for(uint8_t i=0; i < SHENQI2_PAYLOAD_SIZE; i++)
|
||||
debug("%02X ", packet[i]);
|
||||
debugln();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) SHENQI2_initialize_txid()
|
||||
{
|
||||
#ifdef FORCE_SHENQI2_ORIGINAL_ID
|
||||
//TXID
|
||||
rx_tx_addr[0] = 0x51;
|
||||
rx_tx_addr[1] = 0x70;
|
||||
rx_tx_addr[2] = 0x02;
|
||||
//RXID
|
||||
rx_tx_addr[3] = 0x46;
|
||||
rx_tx_addr[4] = 0xBE;
|
||||
#endif
|
||||
rx_tx_addr[3] = 0x00;
|
||||
rx_tx_addr[4] = 0x00;
|
||||
//Freq
|
||||
memcpy(hopping_frequency,(uint8_t*)"\x05\x09\x0E\x0F\x17\x1C\x21\x27\x2A\x2C\x33\x39\x3D\x42\x48\x4C",16);
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) SHENQI2_RF_init()
|
||||
{
|
||||
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
|
||||
//Address
|
||||
XN297_SetTXAddr((uint8_t*)"\x74\xD1\x3A\xF5\x6C", 5);
|
||||
XN297_SetRXAddr((uint8_t*)"\x74\xD1\x3A\xF5\x6C", SHENQI2_PAYLOAD_SIZE);
|
||||
XN297_RFChannel(SHENQI2_BIND_CHANNEL);
|
||||
}
|
||||
|
||||
uint16_t SHENQI2_callback()
|
||||
{
|
||||
static bool rx=false;
|
||||
|
||||
switch(phase)
|
||||
{
|
||||
case SHENQI2_BIND:
|
||||
rx = XN297_IsRX();
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
SHENQI2_send_packet();
|
||||
packet_count++;
|
||||
if(rx)
|
||||
{
|
||||
uint8_t val=XN297_ReadEnhancedPayload(packet_in, SHENQI2_PAYLOAD_SIZE);
|
||||
if(val == SHENQI2_PAYLOAD_SIZE)
|
||||
{
|
||||
if(memcmp(rx_tx_addr, packet_in, 3) == 0)
|
||||
{//Good packet with our TXID
|
||||
BIND_DONE;
|
||||
rx_tx_addr[3] = packet_in[3];
|
||||
rx_tx_addr[4] = packet_in[4];
|
||||
packet_count = 0;
|
||||
phase = SHENQI2_DATA;
|
||||
}
|
||||
#ifdef DEBUG_SERIAL
|
||||
for(uint8_t i=0; i < SHENQI2_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X", packet_in[i]);
|
||||
debugln();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
phase++;
|
||||
return SHENQI2_WRITE_TIME;
|
||||
case SHENQI2_BIND_RX:
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
phase = SHENQI2_BIND;
|
||||
return SHENQI2_PACKET_PERIOD - SHENQI2_WRITE_TIME;
|
||||
default: //SHENQI2_DATA
|
||||
//Since I don't know the order of the channels, I'm hopping on all the channels quickly
|
||||
//Refresh rate from the motorcycle perspective is 32ms instead of 8ms...
|
||||
XN297_Hopping(hopping_frequency_no);
|
||||
hopping_frequency_no++;
|
||||
hopping_frequency_no &= 0x0F;
|
||||
SHENQI2_send_packet();
|
||||
if(hopping_frequency_no%4 == 0)
|
||||
packet_count++;
|
||||
return SHENQI2_PACKET_PERIOD/4;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SHENQI2_init()
|
||||
{
|
||||
BIND_IN_PROGRESS;
|
||||
SHENQI2_initialize_txid();
|
||||
SHENQI2_RF_init();
|
||||
|
||||
bind_counter = SHENQI2_BIND_COUNT;
|
||||
phase = SHENQI2_BIND;
|
||||
hopping_frequency_no = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
/*
|
||||
XN297 1Mb Enhanced,Acked,Scrambled
|
||||
|
||||
Bind
|
||||
---
|
||||
RX on channel: 44, Time: 2890us P: 34 51 70 02 00 00 00 00
|
||||
RX on channel: 44, Time: 1780us P: 34 51 70 02 00 00 00 00
|
||||
RX on channel: 44, Time: 1773us P: 34 51 70 02 00 00 00 00
|
||||
RX on channel: 44, Time: 1772us P: 34 51 70 02 00 00 00 00
|
||||
RX on channel: 44, Time: 2889us P: 35 51 70 02 00 00 00 00
|
||||
RX on channel: 44, Time: 1769us P: 35 51 70 02 00 00 00 00
|
||||
RX on channel: 44, Time: 1774us P: 35 51 70 02 00 00 00 00
|
||||
RX on channel: 44, Time: 1771us P: 35 51 70 02 00 00 00 00
|
||||
RX on channel: 44, Time: 2894us P: 36 51 70 02 00 00 00 00
|
||||
|
||||
A= 74 D1 3A F5 6C
|
||||
RF:44
|
||||
Timing: 1772µs between the same 4 packets, 2892µs to the next packet, 8208µs between 2 packets
|
||||
Request ack, if no ack repeat the packet 4 times
|
||||
|
||||
P[0] = counter 00..0F | 30 bind
|
||||
P[1] = TXID[0]
|
||||
P[2] = TXID[1]
|
||||
P[3] = TXID[2]
|
||||
P[4] = RXID[0]
|
||||
P[5] = RXID[1]
|
||||
P[6] = TH 00..1F, Break 30, 40 ST_right, 80 ST_left
|
||||
P[7] = 00?
|
||||
|
||||
Answer from motorcycle:
|
||||
P: 51 70 02 46 BE 00 00 00
|
||||
P[0] = TXID[0]
|
||||
P[1] = TXID[1]
|
||||
P[2] = TXID[2]
|
||||
P[3] = RXID[0]
|
||||
P[4] = RXID[1]
|
||||
P[5] = 00
|
||||
P[6] = 00
|
||||
P[7] = 00
|
||||
|
||||
Normal packets
|
||||
---
|
||||
A= 74 D1 3A F5 6C
|
||||
RF:5,9,14,15,23,28,33,39,42,44,51,57,61,66,72,76
|
||||
RF:\x05\x09\x0E\x0F\x17\x1C\x21\x27\x2A\x2C\x33\x39\x3D\x42\x48\x4C
|
||||
- order of the channels is unknown and vary over time
|
||||
- send 16 times on each channel and switch (counter 00..0F)
|
||||
Timing:1772µs between the same 4 packets, 2892µs to the next packet, 8208µs between 2 packets
|
||||
Timing:8208 between packets if acked
|
||||
P: 00 51 70 02 46 BE 00 00
|
||||
P[0] = counter 00..0F
|
||||
P[1] = TXID[0]
|
||||
P[2] = TXID[1]
|
||||
P[3] = TXID[2]
|
||||
P[4] = RXID[0]
|
||||
P[5] = RXID[1]
|
||||
P[6] = TH 00..1F, Break 30, 40 ST_right, 80 ST_left
|
||||
P[7] = 00?
|
||||
*/
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "iface_nrf250k.h"
|
||||
|
||||
//#define SLT_Q200_FORCE_ID
|
||||
//#define SLT_V1_4_FORCE_ID
|
||||
|
||||
// For code readability
|
||||
#define SLT_PAYLOADSIZE_V1 7
|
||||
@@ -73,12 +74,12 @@ static void __attribute__((unused)) SLT_set_freq(void)
|
||||
}
|
||||
|
||||
// Unique freq
|
||||
uint8_t max_freq=0x50; //V1 and V2
|
||||
if(sub_protocol==Q200)
|
||||
uint8_t max_freq = 0x50; //V1 and V2
|
||||
if(sub_protocol == Q200)
|
||||
max_freq=45;
|
||||
for (uint8_t i = 0; i < SLT_NFREQCHANNELS; ++i)
|
||||
{
|
||||
if(sub_protocol==Q200 && hopping_frequency[i] >= max_freq)
|
||||
if(sub_protocol == Q200 && hopping_frequency[i] >= max_freq)
|
||||
hopping_frequency[i] = hopping_frequency[i] - max_freq + 0x03;
|
||||
uint8_t done = 0;
|
||||
while (!done)
|
||||
@@ -94,15 +95,15 @@ static void __attribute__((unused)) SLT_set_freq(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
#ifdef DEBUG_SERIAL
|
||||
debug("CH:");
|
||||
for (uint8_t i = 0; i < SLT_NFREQCHANNELS; ++i)
|
||||
debug(" %02X", hopping_frequency[i]);
|
||||
debug(" %02X(%d)", hopping_frequency[i], hopping_frequency[i]);
|
||||
debugln();
|
||||
#endif
|
||||
|
||||
//Bind channel
|
||||
hopping_frequency[SLT_NFREQCHANNELS]=SLT_BIND_CHANNEL;
|
||||
hopping_frequency[SLT_NFREQCHANNELS] = SLT_BIND_CHANNEL;
|
||||
|
||||
//Calib all channels
|
||||
NRF250K_HoppingCalib(SLT_NFREQCHANNELS+1);
|
||||
@@ -137,7 +138,7 @@ static void __attribute__((unused)) SLT_build_packet()
|
||||
for (uint8_t i = 0; i < 4; ++i)
|
||||
{
|
||||
uint16_t v = convert_channel_10b(sub_protocol != SLT_V1_4 ? CH_AETR[i] : i, false);
|
||||
if(sub_protocol>SLT_V2 && (i==CH2 || i==CH3) && sub_protocol != SLT_V1_4)
|
||||
if(sub_protocol>SLT_V2 && (i==CH2 || i==CH3) && sub_protocol != SLT_V1_4 && sub_protocol != RF_SIM)
|
||||
v=1023-v; // reverse throttle and elevator channels for Q100/Q200/MR100 protocols
|
||||
packet[i] = v;
|
||||
e = (e >> 2) | (uint8_t) ((v >> 2) & 0xC0);
|
||||
@@ -153,30 +154,38 @@ static void __attribute__((unused)) SLT_build_packet()
|
||||
|
||||
//->V1 stops here
|
||||
|
||||
if(sub_protocol==Q200)
|
||||
if(sub_protocol == Q200)
|
||||
packet[6] = GET_FLAG(CH9_SW , FLAG_Q200_FMODE)
|
||||
|GET_FLAG(CH10_SW, FLAG_Q200_FLIP)
|
||||
|GET_FLAG(CH11_SW, FLAG_Q200_VIDON)
|
||||
|GET_FLAG(CH12_SW, FLAG_Q200_VIDOFF);
|
||||
else if(sub_protocol==MR100 || sub_protocol==Q100)
|
||||
else if(sub_protocol == MR100 || sub_protocol == Q100)
|
||||
packet[6] = GET_FLAG(CH9_SW , FLAG_MR100_FMODE)
|
||||
|GET_FLAG(CH10_SW, FLAG_MR100_FLIP)
|
||||
|GET_FLAG(CH11_SW, FLAG_MR100_VIDEO) // Does not exist on the Q100 but...
|
||||
|GET_FLAG(CH12_SW, FLAG_MR100_PICTURE); // Does not exist on the Q100 but...
|
||||
packet[7]=convert_channel_8b(CH7);
|
||||
packet[8]=convert_channel_8b(CH8);
|
||||
packet[9]=0xAA; //normal mode for Q100/Q200, unknown for V2/MR100
|
||||
packet[10]=0x00; //normal mode for Q100/Q200, unknown for V2/MR100
|
||||
if((sub_protocol==Q100 || sub_protocol==Q200) && CH13_SW)
|
||||
{//Calibrate
|
||||
packet[9]=0x77; //enter calibration
|
||||
if(calib_counter>=20 && calib_counter<=25) // 7 packets for Q100 / 3 packets for Q200
|
||||
packet[10]=0x20; //launch calibration
|
||||
calib_counter++;
|
||||
if(calib_counter>250) calib_counter=250;
|
||||
packet[7] = convert_channel_8b(CH7);
|
||||
packet[8] = convert_channel_8b(CH8);
|
||||
if(sub_protocol == RF_SIM)
|
||||
{
|
||||
packet[9] = convert_channel_8b(CH9);
|
||||
packet[10] = convert_channel_8b(CH10);
|
||||
}
|
||||
else
|
||||
calib_counter=0;
|
||||
{
|
||||
packet[9] = 0xAA; //normal mode for Q100/Q200, unknown for V2/MR100
|
||||
packet[10] = 0x00; //normal mode for Q100/Q200, unknown for V2/MR100
|
||||
}
|
||||
if((sub_protocol == Q100 || sub_protocol == Q200) && CH13_SW)
|
||||
{//Calibrate
|
||||
packet[9] = 0x77; //enter calibration
|
||||
if(calib_counter >= 20 && calib_counter <= 25) // 7 packets for Q100 / 3 packets for Q200
|
||||
packet[10] = 0x20; //launch calibration
|
||||
calib_counter++;
|
||||
if(calib_counter > 250) calib_counter = 250;
|
||||
}
|
||||
else
|
||||
calib_counter = 0;
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) SLT_send_bind_packet()
|
||||
@@ -187,8 +196,8 @@ static void __attribute__((unused)) SLT_send_bind_packet()
|
||||
NRF250K_SetPower();
|
||||
BIND_DONE;
|
||||
NRF250K_SetTXAddr((uint8_t *)"\x7E\xB8\x63\xA9", SLT_TXID_SIZE);
|
||||
memcpy((void*)packet,(void*)rx_tx_addr,SLT_TXID_SIZE);
|
||||
if(phase==SLT_BIND2)
|
||||
memcpy((void*)packet, (void*)rx_tx_addr, SLT_TXID_SIZE);
|
||||
if(phase == SLT_BIND2)
|
||||
SLT_send_packet(SLT_TXID_SIZE);
|
||||
else // SLT_BIND1
|
||||
SLT_send_packet(SLT_PAYLOADSIZE_V2);
|
||||
@@ -219,9 +228,9 @@ uint16_t SLT_callback()
|
||||
case SLT_DATA2:
|
||||
phase++;
|
||||
SLT_send_packet(packet_length);
|
||||
if(sub_protocol==SLT_V1)
|
||||
if(sub_protocol == SLT_V1)
|
||||
return SLT_V1_TIMING_PACKET;
|
||||
if(sub_protocol==SLT_V1_4)
|
||||
if(sub_protocol == SLT_V1_4)
|
||||
{
|
||||
phase++; //Packets are sent two times only
|
||||
return SLT_V1_4_TIMING_PACKET;
|
||||
@@ -233,24 +242,24 @@ uint16_t SLT_callback()
|
||||
if (++packet_count >= 100)
|
||||
{// Send bind packet
|
||||
packet_count = 0;
|
||||
if(sub_protocol==SLT_V1||sub_protocol==SLT_V1_4)
|
||||
if(sub_protocol == SLT_V1 || sub_protocol == SLT_V1_4)
|
||||
{
|
||||
phase=SLT_BIND2;
|
||||
phase = SLT_BIND2;
|
||||
return SLT_V1_TIMING_BIND2;
|
||||
}
|
||||
//V2
|
||||
phase=SLT_BIND1;
|
||||
phase = SLT_BIND1;
|
||||
return SLT_V2_TIMING_BIND1;
|
||||
}
|
||||
else
|
||||
{// Continue to send normal packets
|
||||
phase = SLT_BUILD;
|
||||
if(sub_protocol==SLT_V1)
|
||||
return 20000-SLT_TIMING_BUILD;
|
||||
if(sub_protocol == SLT_V1)
|
||||
return 20000 - SLT_TIMING_BUILD;
|
||||
if(sub_protocol==SLT_V1_4)
|
||||
return 18000-SLT_TIMING_BUILD-SLT_V1_4_TIMING_PACKET;
|
||||
return 18000 - SLT_TIMING_BUILD - SLT_V1_4_TIMING_PACKET;
|
||||
//V2
|
||||
return 13730-SLT_TIMING_BUILD;
|
||||
return 13730 - SLT_TIMING_BUILD;
|
||||
}
|
||||
case SLT_BIND1:
|
||||
SLT_send_bind_packet();
|
||||
@@ -259,12 +268,12 @@ uint16_t SLT_callback()
|
||||
case SLT_BIND2:
|
||||
SLT_send_bind_packet();
|
||||
phase = SLT_BUILD;
|
||||
if(sub_protocol==SLT_V1)
|
||||
return 20000-SLT_TIMING_BUILD-SLT_V1_TIMING_BIND2;
|
||||
if(sub_protocol==SLT_V1_4)
|
||||
return 18000-SLT_TIMING_BUILD-SLT_V1_TIMING_BIND2-SLT_V1_4_TIMING_PACKET;
|
||||
if(sub_protocol == SLT_V1)
|
||||
return 20000 - SLT_TIMING_BUILD - SLT_V1_TIMING_BIND2;
|
||||
if(sub_protocol == SLT_V1_4)
|
||||
return 18000 - SLT_TIMING_BUILD - SLT_V1_TIMING_BIND2 - SLT_V1_4_TIMING_PACKET;
|
||||
//V2
|
||||
return 13730-SLT_TIMING_BUILD-SLT_V2_TIMING_BIND1-SLT_V2_TIMING_BIND2;
|
||||
return 13730 - SLT_TIMING_BUILD - SLT_V2_TIMING_BIND1 - SLT_V2_TIMING_BIND2;
|
||||
}
|
||||
return 19000;
|
||||
}
|
||||
@@ -275,35 +284,26 @@ void SLT_init()
|
||||
packet_count = 0;
|
||||
packet_sent = 0;
|
||||
hopping_frequency_no = 0;
|
||||
if(sub_protocol==Q200)
|
||||
{ //Q200: Force high part of the ID otherwise it won't bind
|
||||
rx_tx_addr[0]=0x01;
|
||||
rx_tx_addr[1]=0x02;
|
||||
#ifdef SLT_Q200_FORCE_ID // ID taken from TX dumps
|
||||
rx_tx_addr[0]=0x01;rx_tx_addr[1]=0x02;rx_tx_addr[2]=0x6A;rx_tx_addr[3]=0x31;
|
||||
/* rx_tx_addr[0]=0x01;rx_tx_addr[1]=0x02;rx_tx_addr[2]=0x0B;rx_tx_addr[3]=0x57;*/
|
||||
#endif
|
||||
}
|
||||
SLT_RF_init();
|
||||
SLT_set_freq();
|
||||
phase = SLT_BUILD;
|
||||
if(sub_protocol==SLT_V1)
|
||||
|
||||
if(sub_protocol == SLT_V1)
|
||||
{
|
||||
packet_length = SLT_PAYLOADSIZE_V1;
|
||||
#ifdef MULTI_SYNC
|
||||
packet_period = 20000+2*SLT_V1_TIMING_PACKET; //22ms
|
||||
#endif
|
||||
}
|
||||
else if(sub_protocol==SLT_V1_4)
|
||||
else if(sub_protocol == SLT_V1_4)
|
||||
{
|
||||
packet_length = SLT_PAYLOADSIZE_V1_4;
|
||||
#ifdef MULTI_SYNC
|
||||
packet_period = 18000; //18ms
|
||||
#endif
|
||||
//Test IDs
|
||||
MProtocol_id = MProtocol_id_master ^ (1<<RX_num);
|
||||
set_rx_tx_addr(MProtocol_id);
|
||||
debugln("Try ID: %lx", MProtocol_id);
|
||||
//Force high part of the ID otherwise the RF frequencies do not match, only tested the 2 last bytes...
|
||||
rx_tx_addr[0]=0xF4;
|
||||
rx_tx_addr[1]=0x71;
|
||||
#ifdef SLT_V1_4_FORCE_ID // ID taken from TX dumps
|
||||
memcpy(rx_tx_addr,"\xF4\x71\x8D\x01",SLT_TXID_SIZE);
|
||||
#endif
|
||||
}
|
||||
else //V2
|
||||
{
|
||||
@@ -312,6 +312,21 @@ void SLT_init()
|
||||
packet_period = 13730+2*SLT_V2_TIMING_PACKET; //~18ms
|
||||
#endif
|
||||
}
|
||||
|
||||
if(sub_protocol == Q200)
|
||||
{ //Q200: Force high part of the ID otherwise it won't bind
|
||||
rx_tx_addr[0]=0x01;
|
||||
rx_tx_addr[1]=0x02;
|
||||
#ifdef SLT_Q200_FORCE_ID // ID taken from TX dumps
|
||||
rx_tx_addr[0]=0x01;rx_tx_addr[1]=0x02;rx_tx_addr[2]=0x6A;rx_tx_addr[3]=0x31;
|
||||
/* rx_tx_addr[0]=0x01;rx_tx_addr[1]=0x02;rx_tx_addr[2]=0x0B;rx_tx_addr[3]=0x57;*/
|
||||
#endif
|
||||
}
|
||||
|
||||
SLT_RF_init();
|
||||
SLT_set_freq();
|
||||
|
||||
phase = SLT_BUILD;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
184
Multiprotocol/UDIRC_ccnrf.ino
Normal file
184
Multiprotocol/UDIRC_ccnrf.ino
Normal file
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
//Models: UDIRC UD160x(PRO), Pinecone Models SG-160x, Eachine EAT15
|
||||
|
||||
#if defined(UDIRC_CCNRF_INO)
|
||||
|
||||
#include "iface_xn297.h"
|
||||
|
||||
#define FORCE_UDIRC_ORIGINAL_ID
|
||||
|
||||
#define UDIRC_PAYLOAD_SIZE 15
|
||||
#define UDIRC_RF_NUM_CHANNELS 4
|
||||
#define UDIRC_PACKET_PERIOD 21000
|
||||
#define UDIRC_BIND_COUNT 2000
|
||||
#define UDIRC_P1_P2_TIME 5000
|
||||
#define UDIRC_WRITE_TIME 1500
|
||||
|
||||
enum {
|
||||
UDIRC_DATA1=0,
|
||||
UDIRC_DATA2,
|
||||
UDIRC_DATA3,
|
||||
UDIRC_RX,
|
||||
};
|
||||
|
||||
static void __attribute__((unused)) UDIRC_send_packet()
|
||||
{
|
||||
if(rf_ch_num==0)
|
||||
{
|
||||
XN297_Hopping(hopping_frequency_no);
|
||||
debug("H %d ",hopping_frequency_no);
|
||||
hopping_frequency_no++;
|
||||
hopping_frequency_no &= 3;
|
||||
}
|
||||
|
||||
memset(&packet[3], 0x00, 12);
|
||||
if(bind_counter)
|
||||
{//Bind in progress
|
||||
bind_counter--;
|
||||
if(bind_counter)
|
||||
{//Bind
|
||||
packet[0] = 0x01;
|
||||
memcpy(&packet[1],rx_tx_addr,5);
|
||||
}
|
||||
else
|
||||
{//Switch to normal
|
||||
rf_ch_num = 1;
|
||||
BIND_DONE;
|
||||
XN297_SetTXAddr(rx_tx_addr, 5);
|
||||
XN297_SetRXAddr(rx_tx_addr, UDIRC_PAYLOAD_SIZE);
|
||||
}
|
||||
}
|
||||
if(!bind_counter)
|
||||
{//Normal
|
||||
packet[0] = 0x08;
|
||||
//Channels SG-16xx: ST/TH/CH4 /CH3 /UNK/UNK/UNK/UNK/GYRO/ST_TRIM/ST_DR
|
||||
//Channels EAT15 : ST/TH/RATE/LIGHT/UNK/UNK/UNK/UNK/GYRO/ST_TRIM/ST_DR
|
||||
for(uint8_t i=0; i<12; i++)
|
||||
packet[i+1] = convert_channel_16b_limit(i,0,200);
|
||||
//Just for now let's set the additional channels to 0
|
||||
packet[5] = packet[6] = packet[7] = packet[8] = 0;
|
||||
}
|
||||
packet[12] = GET_FLAG(CH12_SW, 0x40) //TH.REV
|
||||
|GET_FLAG(CH13_SW, 0x80); //ST.REV
|
||||
//packet[13] = 00; //Unknown, future flags?
|
||||
for(uint8_t i=0;i<UDIRC_PAYLOAD_SIZE-1;i++)
|
||||
packet[14] += packet[i];
|
||||
// Send
|
||||
XN297_SetFreqOffset();
|
||||
XN297_SetPower();
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
XN297_WriteEnhancedPayload(packet, UDIRC_PAYLOAD_SIZE,false);
|
||||
#ifdef DEBUG_SERIAL
|
||||
for(uint8_t i=0; i < UDIRC_PAYLOAD_SIZE; i++)
|
||||
debug("%02X ", packet[i]);
|
||||
debugln();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) UDIRC_initialize_txid()
|
||||
{
|
||||
#ifdef FORCE_UDIRC_ORIGINAL_ID
|
||||
if(RX_num)
|
||||
{
|
||||
rx_tx_addr[0] = 0xD0;
|
||||
rx_tx_addr[1] = 0x06;
|
||||
rx_tx_addr[2] = 0x00;
|
||||
rx_tx_addr[3] = 0x00;
|
||||
rx_tx_addr[4] = 0x81;
|
||||
}
|
||||
else
|
||||
{
|
||||
rx_tx_addr[0] = 0xF6;
|
||||
rx_tx_addr[1] = 0x96;
|
||||
rx_tx_addr[2] = 0x01;
|
||||
rx_tx_addr[3] = 0x00;
|
||||
rx_tx_addr[4] = 0x81;
|
||||
}
|
||||
hopping_frequency[0] = 45;
|
||||
hopping_frequency[1] = 59;
|
||||
hopping_frequency[2] = 52;
|
||||
hopping_frequency[3] = 67;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) UDIRC_RF_init()
|
||||
{
|
||||
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_250K);
|
||||
//Bind address
|
||||
XN297_SetTXAddr((uint8_t*)"\x01\x03\x05\x07\x09", 5);
|
||||
XN297_SetRXAddr((uint8_t*)"\x01\x03\x05\x07\x09", UDIRC_PAYLOAD_SIZE);
|
||||
XN297_HoppingCalib(UDIRC_RF_NUM_CHANNELS);
|
||||
}
|
||||
|
||||
uint16_t UDIRC_callback()
|
||||
{
|
||||
bool rx;
|
||||
switch(phase)
|
||||
{
|
||||
case UDIRC_DATA1:
|
||||
rx = XN297_IsRX();
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(UDIRC_PACKET_PERIOD);
|
||||
#endif
|
||||
UDIRC_send_packet();
|
||||
if(rx)
|
||||
{
|
||||
uint8_t val=XN297_ReadEnhancedPayload(packet_in, UDIRC_PAYLOAD_SIZE);
|
||||
debug("RX(%d):",val);
|
||||
if(val != 255)
|
||||
{
|
||||
rf_ch_num = 1;
|
||||
if(bind_counter)
|
||||
bind_counter=1;
|
||||
#ifdef DEBUG_SERIAL
|
||||
for(uint8_t i=0; i < UDIRC_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X", packet_in[i]);
|
||||
#endif
|
||||
}
|
||||
debugln("");
|
||||
}
|
||||
phase++;
|
||||
return UDIRC_P1_P2_TIME;
|
||||
case UDIRC_DATA2:
|
||||
//Resend packet
|
||||
XN297_ReSendPayload();
|
||||
phase++;
|
||||
return UDIRC_WRITE_TIME;
|
||||
default: //UDIRC_RX
|
||||
//Wait for the packet transmission to finish
|
||||
while(XN297_IsPacketSent()==false);
|
||||
//Switch to RX
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
phase = UDIRC_DATA1;
|
||||
return UDIRC_PACKET_PERIOD - UDIRC_P1_P2_TIME - UDIRC_WRITE_TIME;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void UDIRC_init()
|
||||
{
|
||||
UDIRC_initialize_txid();
|
||||
UDIRC_RF_init();
|
||||
|
||||
bind_counter = IS_BIND_IN_PROGRESS ? UDIRC_BIND_COUNT : 1;
|
||||
phase = UDIRC_DATA1;
|
||||
hopping_frequency_no = 0;
|
||||
rf_ch_num = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -118,9 +118,10 @@ static void __attribute__((unused)) V761_send_packet()
|
||||
|
||||
packet[5] |= flags;
|
||||
|
||||
packet[6] = GET_FLAG(CH7_SW, 0x20) // Flip
|
||||
|GET_FLAG(CH8_SW, 0x08) // RTH activation
|
||||
|GET_FLAG(CH9_SW, 0x10); // RTH on/off
|
||||
packet[6] = GET_FLAG(CH7_SW, 0x20) // Flip
|
||||
|GET_FLAG(CH8_SW, 0x08) // RTH activation
|
||||
|GET_FLAG(CH9_SW, 0x10) // RTH on/off
|
||||
|GET_FLAG(CH10_SW, 0x40); // Beeper on/off
|
||||
if(sub_protocol == V761_3CH)
|
||||
packet[6] |= 0x80; // Unknown, set on original V761-1 dump but not on eachine dumps, keeping for compatibility
|
||||
}
|
||||
@@ -243,7 +244,7 @@ uint16_t V761_callback()
|
||||
else
|
||||
{
|
||||
packet_count++;
|
||||
if(!telemetry_lost && !rx && (packet_count%64) == 0)
|
||||
if(!telemetry_lost && !rx && (packet_count & 0x3F) == 0)
|
||||
{// Should have received a telem packet but... Send telem to the radio to keep it alive
|
||||
telemetry_link = 1;
|
||||
#ifdef V761_TELEM_DEBUG
|
||||
|
||||
@@ -321,9 +321,12 @@
|
||||
#undef FY326_NRF24L01_INO
|
||||
#undef GW008_NRF24L01_INO
|
||||
#undef H8_3D_NRF24L01_INO
|
||||
#undef H36_NRF24L01_INO
|
||||
#undef HISKY_NRF24L01_INO
|
||||
#undef HONTAI_NRF24L01_INO
|
||||
#undef JIABAILE_NRF24L01_INO
|
||||
#undef JJRC345_NRF24L01_INO
|
||||
#undef KAMTOM_NRF24L01_INO
|
||||
#undef KN_NRF24L01_INO
|
||||
#undef KYOSHO2_NRF24L01_INO
|
||||
#undef LOLI_NRF24L01_INO
|
||||
@@ -334,11 +337,14 @@
|
||||
#undef REALACC_NRF24L01_INO
|
||||
#undef SGF22_NRF24L01_INO
|
||||
#undef SHENQI_NRF24L01_INO
|
||||
#undef SHENQI2_NRF24L01_INO
|
||||
#undef SYMAX_NRF24L01_INO
|
||||
#undef V2X2_NRF24L01_INO
|
||||
#undef V761_NRF24L01_INO
|
||||
#undef WPL_NRF24L01_INO
|
||||
#undef XERALL_NRF24L01_INO
|
||||
#undef YD717_NRF24L01_INO
|
||||
#undef YUXIANG_NRF24L01_INO
|
||||
#undef ZSX_NRF24L01_INO
|
||||
#endif
|
||||
#if ( not defined(CC2500_INSTALLED) && not defined(NRF24L01_INSTALLED) ) || defined MULTI_EU
|
||||
@@ -352,8 +358,16 @@
|
||||
#undef Q303_CCNRF_INO
|
||||
#undef Q90C_CCNRF_INO
|
||||
#undef SLT_CCNRF_INO
|
||||
#undef UDIRC_CCNRF_INO
|
||||
#undef V911S_CCNRF_INO
|
||||
#undef WL91X_CCNRF_INO
|
||||
#undef XK_CCNRF_INO
|
||||
#undef XK2_CCNRF_INO
|
||||
#endif
|
||||
#if defined(MCU_STM32F103C8) // Save flash space...
|
||||
#undef BUMBLEB_CCNRF_INO
|
||||
#undef Q303_CCNRF_INO
|
||||
#undef Q90C_CCNRF_INO
|
||||
#endif
|
||||
#if not defined(DSM_CYRF6936_INO)
|
||||
#undef LOSI_CYRF6936_INO
|
||||
@@ -377,10 +391,19 @@
|
||||
#undef LOSI_CYRF6936_INO //Need DSM to be enabled
|
||||
#undef TRAXXAS_CYRF6936_INO
|
||||
#undef EAZYRC_NRF24L01_INO
|
||||
#undef KYOSHO2_NRF24L01_INO
|
||||
//#undef KYOSHO2_NRF24L01_INO
|
||||
#undef KYOSHO3_CYRF6936_INO
|
||||
#undef MOULDKG_NRF24L01_INO
|
||||
#undef SHENQI_NRF24L01_INO
|
||||
#undef SHENQI2_NRF24L01_INO
|
||||
#undef JIABAILE_NRF24L01_INO
|
||||
#undef UDIRC_CCNRF_INO
|
||||
#undef KAMTOM_NRF24L01_INO
|
||||
#undef WL91X_CCNRF_INO
|
||||
#undef WPL_NRF24L01_INO
|
||||
//Save flash space...
|
||||
#undef CABELL_NRF24L01_INO
|
||||
#undef REDPINE_CC2500_INO
|
||||
#endif
|
||||
|
||||
#ifdef MULTI_SURFACE
|
||||
@@ -414,6 +437,7 @@
|
||||
#undef GW008_NRF24L01_INO
|
||||
#undef HONTAI_NRF24L01_INO
|
||||
#undef H8_3D_NRF24L01_INO
|
||||
#undef H36_NRF24L01_INO
|
||||
#undef JJRC345_NRF24L01_INO
|
||||
#undef KN_NRF24L01_INO
|
||||
#undef LOLI_NRF24L01_INO
|
||||
@@ -435,6 +459,8 @@
|
||||
#undef Q303_CCNRF_INO
|
||||
#undef Q90C_CCNRF_INO
|
||||
#undef V911S_CCNRF_INO
|
||||
#undef SGF22_NRF24L01_INO
|
||||
#undef YUXIANG_NRF24L01_INO
|
||||
#endif
|
||||
|
||||
//OpenTX 2.3.x issue
|
||||
@@ -473,6 +499,11 @@
|
||||
#undef PROPEL_HUB_TELEMETRY
|
||||
#undef OMP_HUB_TELEMETRY
|
||||
#undef V761_HUB_TELEMETRY
|
||||
#undef FX_HUB_TELEMETRY
|
||||
#undef XK2_HUB_TELEMETRY
|
||||
#undef SGF22_HUB_TELEMETRY
|
||||
#undef KAMTOM_HUB_TELEMETRY
|
||||
#undef YUXIANG_HUB_TELEMETRY
|
||||
#undef RLINK_HUB_TELEMETRY
|
||||
#undef DSM_RX_CYRF6936_INO
|
||||
#undef DSM_FWD_PGM
|
||||
@@ -511,6 +542,21 @@
|
||||
#if not defined(V761_NRF24L01_INO)
|
||||
#undef V761_HUB_TELEMETRY
|
||||
#endif
|
||||
#if not defined(FX_NRF24L01_INO)
|
||||
#undef FX_HUB_TELEMETRY
|
||||
#endif
|
||||
#if not defined(XK2_CCNRF_INO)
|
||||
#undef XK2_HUB_TELEMETRY
|
||||
#endif
|
||||
#if not defined(SGF22_NRF24L01_INO)
|
||||
#undef SGF22_HUB_TELEMETRY
|
||||
#endif
|
||||
#if not defined(KAMTOM_NRF24L01_INO)
|
||||
#undef KAMTOM_HUB_TELEMETRY
|
||||
#endif
|
||||
#if not defined(YUXIANG_NRF24L01_INO)
|
||||
#undef YUXIANG_HUB_TELEMETRY
|
||||
#endif
|
||||
#if not defined(PROPEL_NRF24L01_INO)
|
||||
#undef PROPEL_HUB_TELEMETRY
|
||||
#endif
|
||||
@@ -568,7 +614,7 @@
|
||||
//protocols using FRSKYD user frames
|
||||
#undef HUB_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(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) && not defined(OMP_HUB_TELEMETRY) && not defined(V761_HUB_TELEMETRY) && not defined(WFLY2_HUB_TELEMETRY) && not defined(LOLI_HUB_TELEMETRY) && not defined(MLINK_HUB_TELEMETRY) && not defined(MLINK_FW_TELEMETRY) && not defined(MT99XX_HUB_TELEMETRY) && not defined(MULTI_CONFIG_INO)
|
||||
#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) && not defined(OMP_HUB_TELEMETRY) && not defined(V761_HUB_TELEMETRY) && not defined(SGF22_HUB_TELEMETRY) && not defined(XK2_HUB_TELEMETRY) && not defined(FX_HUB_TELEMETRY) && not defined(KAMTOM_HUB_TELEMETRY) && not defined(YUXIANG_HUB_TELEMETRY) && not defined(WFLY2_HUB_TELEMETRY) && not defined(LOLI_HUB_TELEMETRY) && not defined(MLINK_HUB_TELEMETRY) && not defined(MLINK_FW_TELEMETRY) && not defined(MT99XX_HUB_TELEMETRY) && not defined(MULTI_CONFIG_INO)
|
||||
#undef TELEMETRY
|
||||
#undef INVERT_TELEMETRY
|
||||
#undef MULTI_TELEMETRY
|
||||
|
||||
96
Multiprotocol/WL91X_ccnrf.ino
Normal file
96
Multiprotocol/WL91X_ccnrf.ino
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#if defined(WL91X_CCNRF_INO)
|
||||
|
||||
#include "iface_xn297.h"
|
||||
|
||||
//#define FORCE_WL91X_ORIGINAL_ID
|
||||
|
||||
#define WL91X_PAYLOAD_SIZE 9
|
||||
#define WL91X_RF_NUM_CHANNELS 3
|
||||
#define WL91X_PACKET_PERIOD 2594
|
||||
|
||||
static void __attribute__((unused)) WL91X_send_packet()
|
||||
{
|
||||
uint8_t val;
|
||||
|
||||
//RF freq
|
||||
XN297_Hopping(hopping_frequency_no++);
|
||||
hopping_frequency_no %= WL91X_RF_NUM_CHANNELS;
|
||||
|
||||
//Sticks
|
||||
val = convert_channel_16b_limit(CH2,0x21,0xE0); //THR forward 00..5F, backward 80..DF
|
||||
if(val < 128) val = 127 - val;
|
||||
packet[0] = val - 0x80;
|
||||
val = convert_channel_s8b(CH1); //ST right 00..7F, left 80..FF
|
||||
packet[1] = val - 0x80;
|
||||
//Trims
|
||||
val = convert_channel_s8b(CH3); //ST_Trim centered=80, increment/decrement=4, right 04..7C, left 84..FC
|
||||
packet[2] = val - 0x80;
|
||||
packet[3] = convert_channel_16b_limit(CH4,0x00,0x70); //TH_Trim increment/decrement=3, 00..39..6F
|
||||
//TX_ID
|
||||
memcpy(&packet[4], rx_tx_addr, 4);
|
||||
//Checksum
|
||||
val = 0;
|
||||
for(uint8_t i=0; i<WL91X_PAYLOAD_SIZE-1; i++)
|
||||
val += packet[i];
|
||||
packet[8] = val;
|
||||
|
||||
//Send
|
||||
XN297_SetPower();
|
||||
XN297_SetFreqOffset();
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
XN297_WritePayload(packet, WL91X_PAYLOAD_SIZE);
|
||||
#ifdef DEBUG_SERIAL
|
||||
for(uint8_t i=0; i < WL91X_PAYLOAD_SIZE; i++)
|
||||
debug("%02X ", packet[i]);
|
||||
debugln();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) WL91X_RF_init()
|
||||
{
|
||||
XN297_Configure(XN297_CRCEN, XN297_UNSCRAMBLED, XN297_250K);
|
||||
XN297_HoppingCalib(WL91X_RF_NUM_CHANNELS);
|
||||
XN297_SetTXAddr((uint8_t*)"\x46\x14\x7B\x08", 4);
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) WL91X_initialize_txid()
|
||||
{
|
||||
#ifdef FORCE_WL91X_ORIGINAL_ID
|
||||
memcpy(rx_tx_addr, (uint8_t*)"\x00\x1E\x33\x02",4);
|
||||
#endif
|
||||
memcpy(hopping_frequency, (uint8_t*)"\x1A\x3B\x3B",3); //26,59,59
|
||||
}
|
||||
|
||||
uint16_t WL91X_callback()
|
||||
{
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(WL91X_PACKET_PERIOD);
|
||||
#endif
|
||||
WL91X_send_packet();
|
||||
return WL91X_PACKET_PERIOD;
|
||||
}
|
||||
|
||||
void WL91X_init()
|
||||
{
|
||||
BIND_DONE; //No bind for this protocol
|
||||
WL91X_initialize_txid();
|
||||
WL91X_RF_init();
|
||||
hopping_frequency_no = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
158
Multiprotocol/WPL_nrf24l01.ino
Normal file
158
Multiprotocol/WPL_nrf24l01.ino
Normal file
@@ -0,0 +1,158 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
// Compatible with WPL "Basic" TX models D12, D12KM, D22, D32, D42, D14
|
||||
|
||||
#if defined(WPL_NRF24L01_INO)
|
||||
|
||||
#include "iface_xn297.h"
|
||||
|
||||
#define FORCE_WPL_ORIGINAL_ID
|
||||
|
||||
#define WPL_PACKET_PERIOD 9875
|
||||
#define WPL_RF_NUM_CHANNELS 4
|
||||
#define WPL_PAYLOAD_SIZE 16
|
||||
#define WPL_BIND_COUNT 303 //3sec
|
||||
|
||||
static void __attribute__((unused)) WPL_send_packet()
|
||||
{
|
||||
#if 0
|
||||
debug("no:%d, rf:%d, ",hopping_frequency_no + (IS_BIND_IN_PROGRESS?0:4),hopping_frequency[hopping_frequency_no + (IS_BIND_IN_PROGRESS?0:4)]);
|
||||
#endif
|
||||
XN297_Hopping(hopping_frequency_no + (IS_BIND_IN_PROGRESS?0:4) );
|
||||
hopping_frequency_no++;
|
||||
hopping_frequency_no &= WPL_RF_NUM_CHANNELS-1; // 4 RF channels
|
||||
|
||||
memset(&packet[8],0,7);
|
||||
packet[0] = 0x94; //??
|
||||
packet[1] = 0x16; //??
|
||||
packet[2] = 0xCC; //??
|
||||
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
{
|
||||
memcpy(&packet[3],rx_tx_addr,5);
|
||||
packet[9] = 0x08; // ?? Not bound + Headlights on
|
||||
}
|
||||
else
|
||||
{
|
||||
packet[3 ] = convert_channel_s8b(CH1); // Throttle
|
||||
packet[4 ] = convert_channel_s8b(CH2); // Steering
|
||||
packet[5 ] = convert_channel_16b_limit(CH3,0x22,0x5E); // Steering trim
|
||||
packet[6 ] = rx_tx_addr[3]; // 0x32??
|
||||
packet[7 ] = convert_channel_s8b(CH4); // Aux
|
||||
packet[9 ] = 0x80 // ?? Bound
|
||||
| GET_FLAG(CH5_SW, 0x08) // Headlights 100%=on
|
||||
| GET_FLAG(CH6_SW, 0x04) // Throttle rate 100%=high
|
||||
| GET_FLAG(CH7_SW, 0x02); // Steering rate 100%=high
|
||||
}
|
||||
uint8_t sum = 0x66;
|
||||
for(uint8_t i=0;i<WPL_PAYLOAD_SIZE-1;i++)
|
||||
sum += packet[i];
|
||||
packet[WPL_PAYLOAD_SIZE-1] = sum;
|
||||
// Send
|
||||
XN297_SetPower();
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
XN297_WritePayload(packet, WPL_PAYLOAD_SIZE);
|
||||
#if 0
|
||||
for(uint8_t i=0; i<WPL_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln("");
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) WPL_RF_init()
|
||||
{
|
||||
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
|
||||
XN297_SetTXAddr((uint8_t*)"\x69\xA5\x37\x4D\x8B", 5);
|
||||
XN297_HoppingCalib(WPL_RF_NUM_CHANNELS*2); // Calibrate bind and normal channels
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) WPL_initialize_txid()
|
||||
{
|
||||
//Bind frequencies
|
||||
memcpy(hopping_frequency ,"\x17\x25\x46\x36", WPL_RF_NUM_CHANNELS); //23=17, 37=25, 70=46, 54=36
|
||||
#ifdef FORCE_WPL_ORIGINAL_ID
|
||||
//Original ID
|
||||
memcpy(rx_tx_addr,"\x96\x2A\xA9\x32\xB4",5);
|
||||
//Normal frequencies
|
||||
memcpy(hopping_frequency+4,"\x0C\x2A\x3D\x1D", WPL_RF_NUM_CHANNELS); //12=0C, 42=2A, 61=3D, 29=1D
|
||||
#endif
|
||||
}
|
||||
|
||||
uint16_t WPL_callback()
|
||||
{
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(WPL_PACKET_PERIOD);
|
||||
#endif
|
||||
if(bind_counter)
|
||||
if(--bind_counter==0)
|
||||
{
|
||||
BIND_DONE;
|
||||
XN297_SetTXAddr(rx_tx_addr, 5);
|
||||
}
|
||||
WPL_send_packet();
|
||||
return WPL_PACKET_PERIOD;
|
||||
}
|
||||
|
||||
void WPL_init()
|
||||
{
|
||||
BIND_IN_PROGRESS; // autobind protocol
|
||||
WPL_initialize_txid();
|
||||
WPL_RF_init();
|
||||
hopping_frequency_no = 0;
|
||||
bind_counter=WPL_BIND_COUNT;
|
||||
}
|
||||
|
||||
#endif
|
||||
/* https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/issues/1120
|
||||
Bind packet
|
||||
-----------
|
||||
XN297 1Mb Scrambled
|
||||
Bind address: 69 A5 37 4D 8B
|
||||
RF channels: 23, 37, 70, 54
|
||||
Timing: 9875µs
|
||||
Payload 16 bytes: 94 16 CC 96 2A A9 32 B4 00 08 00 00 00 00 00 33
|
||||
|
||||
P[0] = 94 ??
|
||||
P[1] = 16 ??
|
||||
P[2] = CC ??
|
||||
P[3..7] = Normal address
|
||||
P[8] = 00 ??
|
||||
P[9] = 08 ?? not bound?, Throttle and Steering rate low, Headlights on
|
||||
P[10..14] = 00 ??
|
||||
P[15] = sum(P[0..14])+66 why 66...
|
||||
|
||||
Normal packet
|
||||
-----------
|
||||
XN297 1Mb Scrambled
|
||||
Normal address: 96 2A A9 32 B4
|
||||
RF channels: 12=0C, 42=2A, 61=3D, 29=1D -> no idea where they come from...
|
||||
Timing: 9875µs
|
||||
Payload 16 bytes: 94 16 CC 80 80 38 32 80 00 88 00 00 00 00 00 4E
|
||||
P[0] = 94 ??
|
||||
P[1] = 16 ??
|
||||
P[2] = CC ??
|
||||
P[3] = Throttle, not enough data on dumps... Same coding as Steering?
|
||||
P[4] = Steering, not enough data on dumps, looks like one side goes from 7F to 00 and the other 80 to FF which would be s8b
|
||||
P[5] = Steering trim 22..5E, mid gives 40 not 38... Was the trim centered on the other dumps with value 38?
|
||||
P[6] = 32 ?? Left over from the bind packet TX_ADDR[3]?
|
||||
P[7] = 80 ?? Additional channel? It moves at the same time as the trim but my guess is that it is an unconnected channel.
|
||||
P[8] = 00 ??
|
||||
P[9] = 80 ?? bound?, Throttle and Steering rate low, Headlights off
|
||||
|02 -> Steering rate high
|
||||
|04 -> Throttle rate high
|
||||
|08 -> Headlights on
|
||||
P[10..14] = 00 ??
|
||||
P[15] = sum(P[0..14])+66 why 66...
|
||||
*/
|
||||
431
Multiprotocol/XK2_ccnrf.ino
Normal file
431
Multiprotocol/XK2_ccnrf.ino
Normal file
@@ -0,0 +1,431 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
// Compatible with XK TX X4 and model A160S.
|
||||
|
||||
#if defined(XK2_CCNRF_INO)
|
||||
|
||||
#include "iface_xn297.h"
|
||||
|
||||
//#define FORCE_XK2_ID
|
||||
//#define FORCE_XK2_P10_ID
|
||||
|
||||
#define XK2_RF_BIND_CHANNEL 71
|
||||
#define XK2_P10_RF_BIND_CHANNEL 69
|
||||
#define XK2_PAYLOAD_SIZE 9
|
||||
#define XK2_PACKET_PERIOD 4911
|
||||
#define XK2_RF_NUM_CHANNELS 4
|
||||
#define XK2_WRITE_TIME 1000
|
||||
|
||||
enum {
|
||||
XK2_BIND1,
|
||||
XK2_BIND2,
|
||||
XK2_DATA_PREP,
|
||||
XK2_DATA,
|
||||
XK2_RX,
|
||||
};
|
||||
|
||||
static uint8_t __attribute__((unused)) XK2_checksum(uint8_t init)
|
||||
{
|
||||
for(uint8_t i=0; i<XK2_PAYLOAD_SIZE-1; i++)
|
||||
init += packet[i];
|
||||
if(sub_protocol == XK2_P10)
|
||||
init += 0x10;
|
||||
return init;
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) XK2_send_packet()
|
||||
{
|
||||
static uint8_t trim_ch=0;
|
||||
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
{
|
||||
packet[0] = 0x9D;
|
||||
//TXID
|
||||
memcpy(&packet[1], rx_tx_addr, 3);
|
||||
//RXID
|
||||
//memcpy(&packet[4], rx_id , 3);
|
||||
//Unknown
|
||||
packet[7] = 0x00;
|
||||
}
|
||||
else
|
||||
{
|
||||
XN297_Hopping(hopping_frequency_no);
|
||||
hopping_frequency_no++;
|
||||
hopping_frequency_no &= 0x03;
|
||||
//Channels
|
||||
packet[0] = convert_channel_16b_limit(AILERON ,0x00,0x64); //Aileron
|
||||
packet[1] = convert_channel_16b_limit(ELEVATOR,0x00,0x64); //Elevator
|
||||
packet[2] = convert_channel_16b_limit(THROTTLE,0x00,0x64); //Throttle
|
||||
packet[3] = convert_channel_16b_limit(RUDDER ,0x00,0x64); //Rudder
|
||||
//Center the trims
|
||||
trim_ch++;
|
||||
if(trim_ch > 2) trim_ch = 0;
|
||||
packet[4] = 0x20 + 0x40 * trim_ch; //Trims are A=01..20..3F/E=41..60..7F/R=81..A0..BF, E0 appears when telemetry is received, C1 when p[6] changes from 00->08, C0 when p[6] changes from 08->00
|
||||
if(trim_ch == 2) //Drive rudder trim since otherwise there is no control...
|
||||
{
|
||||
packet[4] = 0x80 + (convert_channel_8b(RUDDER)>>2);
|
||||
if(packet[4] <= 0x81) packet[4] = 0x81;
|
||||
}
|
||||
//Flags
|
||||
packet[5] = GET_FLAG(CH5_SW, 0x01) //Rate
|
||||
| GET_FLAG(CH7_SW, 0x20) //Hover
|
||||
| GET_FLAG(CH8_SW, 0x40); //Light
|
||||
if(CH6_SW)
|
||||
packet[5] |= 0x10; //Gyro off (senior mode)
|
||||
else if(Channel_data[CH6] > CHANNEL_MIN_COMMAND)
|
||||
packet[5] |= 0x08; //3D
|
||||
//Requiest telemetry flag
|
||||
packet[6] = 0x01;
|
||||
//RXID checksum
|
||||
packet[7] = crc8; //Sum RX_ID[0..2]
|
||||
}
|
||||
//Checksum
|
||||
packet[8] = XK2_checksum(IS_BIND_IN_PROGRESS ? 0xC0 : num_ch);
|
||||
|
||||
// Send
|
||||
XN297_SetFreqOffset();
|
||||
XN297_SetPower();
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
XN297_WritePayload(packet, XK2_PAYLOAD_SIZE);
|
||||
#if 0
|
||||
debug("P");
|
||||
for(uint8_t i=0; i<XK2_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) XK2_RF_init()
|
||||
{
|
||||
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_250K);
|
||||
|
||||
XN297_SetTXAddr((uint8_t*)"\xcc\xcc\xcc\xcc\xcc", 5);
|
||||
XN297_SetRXAddr((uint8_t*)"\xcc\xcc\xcc\xcc\xcc", XK2_PAYLOAD_SIZE);
|
||||
|
||||
XN297_HoppingCalib(XK2_RF_NUM_CHANNELS);
|
||||
XN297_RFChannel(sub_protocol==XK2_X4?XK2_RF_BIND_CHANNEL:XK2_P10_RF_BIND_CHANNEL);
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) XK2_initialize_txid()
|
||||
{
|
||||
rx_tx_addr[0] = rx_tx_addr[3]; // Use RX_num
|
||||
|
||||
num_ch = 0x21 + rx_tx_addr[0] - rx_tx_addr[1] + rx_tx_addr[2];
|
||||
|
||||
//RF frequencies for X4: 65=0x41, 69=0x45, 73=0x49, 77=0x4D
|
||||
//RF frequencies for P10: 67, unknown
|
||||
uint8_t start = 65;
|
||||
if(sub_protocol == XK2_P10) start += 2;
|
||||
for(uint8_t i=0;i<XK2_RF_NUM_CHANNELS;i++)
|
||||
hopping_frequency[i] = start + i*4;
|
||||
|
||||
#ifdef FORCE_XK2_ID
|
||||
if(rx_tx_addr[3]&1)
|
||||
{//Pascal
|
||||
rx_tx_addr[0] = 0x66;
|
||||
rx_tx_addr[1] = 0x4F;
|
||||
rx_tx_addr[2] = 0x47;
|
||||
num_ch = 0x7F;
|
||||
//hopping frequencies 65=0x41, 69=0x45, 73=0x49, 77=0x4D
|
||||
}
|
||||
else
|
||||
{//Marc
|
||||
rx_tx_addr[0] = 0x36;
|
||||
rx_tx_addr[1] = 0x49;
|
||||
rx_tx_addr[2] = 0x6B;
|
||||
num_ch = 0x79;
|
||||
//hopping frequencies 65=0x41, 69=0x45, 73=0x49, 77=0x4D
|
||||
}
|
||||
#endif
|
||||
#ifdef FORCE_XK2_P10_ID
|
||||
rx_tx_addr[0] = 0xE8;
|
||||
rx_tx_addr[1] = 0x25;
|
||||
rx_tx_addr[2] = 0x3B;
|
||||
num_ch = 0x1F;
|
||||
//hopping frequencies 67=0x43, =0x, =0x, =0x
|
||||
#endif
|
||||
|
||||
rx_tx_addr[3] = rx_tx_addr[4] = 0xCC;
|
||||
debugln("ID: %02X %02X %02X %02X %02X, OFFSET: %02X, HOP: %02X %02X %02X %02X",rx_tx_addr[0],rx_tx_addr[1],rx_tx_addr[2],rx_tx_addr[3],rx_tx_addr[4],num_ch,hopping_frequency[0],hopping_frequency[1],hopping_frequency[2],hopping_frequency[3]);
|
||||
}
|
||||
|
||||
uint16_t XK2_callback()
|
||||
{
|
||||
static bool rx = false;
|
||||
|
||||
switch(phase)
|
||||
{
|
||||
case XK2_BIND1:
|
||||
// switch to RX mode
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
phase++;
|
||||
return 5000;
|
||||
case XK2_BIND2:
|
||||
if(XN297_IsRX())
|
||||
{
|
||||
XN297_ReadPayload(packet, XK2_PAYLOAD_SIZE);
|
||||
#if 0
|
||||
debug("RX");
|
||||
for(uint8_t i=0; i<XK2_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln("");
|
||||
#endif
|
||||
if(XK2_checksum(0xBF) != packet[8])
|
||||
{//Wrong checksum
|
||||
phase = XK2_BIND1;
|
||||
return 1000;
|
||||
}
|
||||
if(packet[0] == 0x9B)
|
||||
phase++;
|
||||
else
|
||||
{
|
||||
//checksum of RX_ID
|
||||
crc8 = packet[4] + packet[5] + packet[6];
|
||||
debugln("W:RX_ID=%02X",crc8);
|
||||
eeprom_write_byte((EE_ADDR)(XK2_EEPROM_OFFSET+RX_num),crc8);
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
bind_counter = 10; //send 10 bind end packets
|
||||
phase = XK2_DATA;
|
||||
}
|
||||
}
|
||||
return 1000;
|
||||
case XK2_DATA_PREP:
|
||||
crc8 = eeprom_read_byte((EE_ADDR)(XK2_EEPROM_OFFSET+RX_num));
|
||||
debugln("R:RX_ID=%02X",crc8);
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
XN297_SetTXAddr(rx_tx_addr, 5);
|
||||
#ifdef XK2_HUB_TELEMETRY
|
||||
XN297_SetRXAddr(rx_tx_addr, XK2_PAYLOAD_SIZE);
|
||||
#endif
|
||||
BIND_DONE;
|
||||
phase++;
|
||||
case XK2_DATA:
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(XK2_PACKET_PERIOD);
|
||||
#endif
|
||||
#ifdef XK2_HUB_TELEMETRY
|
||||
rx = XN297_IsRX();
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
#endif
|
||||
XK2_send_packet();
|
||||
#ifdef XK2_HUB_TELEMETRY
|
||||
if(rx)
|
||||
{
|
||||
XN297_ReadPayload(packet, XK2_PAYLOAD_SIZE);
|
||||
#if 0
|
||||
debug("RX");
|
||||
for(uint8_t i=0; i<XK2_PAYLOAD_SIZE; i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln("");
|
||||
#endif
|
||||
if(XK2_checksum(0xCC) == packet[8] && memcmp(packet, rx_tx_addr, 3) == 0)
|
||||
{//Good checksum and TXID
|
||||
//packets: E5 20 F2 00 00 00 00 00 C3 -> E5 20 F2 80 00 00 00 00 43
|
||||
telemetry_link = 1;
|
||||
v_lipo1 = packet[3] ? 137:162; // low voltage 7.1V
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if(bind_counter)
|
||||
{
|
||||
bind_counter--;
|
||||
if(bind_counter == 0)
|
||||
phase = XK2_DATA_PREP;
|
||||
break;
|
||||
}
|
||||
#ifndef XK2_HUB_TELEMETRY
|
||||
break;
|
||||
#else
|
||||
phase++;
|
||||
return XK2_WRITE_TIME;
|
||||
default: //XK2_RX
|
||||
/*{ // Wait for packet to be sent before switching to receive mode
|
||||
uint16_t start=(uint16_t)micros(), count=0;
|
||||
while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 500)
|
||||
{
|
||||
if(XN297_IsPacketSent())
|
||||
break;
|
||||
count++;
|
||||
}
|
||||
debugln("%d",count);
|
||||
}*/
|
||||
//Switch to RX
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
phase = XK2_DATA;
|
||||
return XK2_PACKET_PERIOD-XK2_WRITE_TIME;
|
||||
#endif
|
||||
}
|
||||
return XK2_PACKET_PERIOD;
|
||||
}
|
||||
|
||||
void XK2_init()
|
||||
{
|
||||
//BIND_IN_PROGRESS; // autobind protocol
|
||||
XK2_initialize_txid();
|
||||
XK2_RF_init();
|
||||
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
phase = XK2_BIND1;
|
||||
else
|
||||
phase = XK2_DATA_PREP;
|
||||
bind_counter = 0;
|
||||
hopping_frequency_no = 0;
|
||||
#ifdef XK2_HUB_TELEMETRY
|
||||
RX_RSSI = 100; // Dummy value
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
XK A160 Piper CUB
|
||||
|
||||
Bind
|
||||
----
|
||||
Plane sends these packets:
|
||||
RX: 0us C=71 S=Y A= CC CC CC CC CC P(9)= 9C BB CC DD 38 12 10 00 19
|
||||
P[0] = 9C bind phase 1
|
||||
P[1] = Dummy TX_ID
|
||||
P[2] = Dummy TX_ID
|
||||
P[3] = Dummy TX_ID
|
||||
P[4] = RX_ID[0]
|
||||
P[5] = RX_ID[1]
|
||||
P[6] = RX_ID[2]
|
||||
P[7] = 00
|
||||
P[8] = sum P[0..7] + BF
|
||||
|
||||
TX responds to plane:
|
||||
RX 9D 66 4F 47 38 12 10 00 B3
|
||||
P[0] = 9D bind phase 2
|
||||
P[1] = TX_ID[0]
|
||||
P[2] = TX_ID[1]
|
||||
P[3] = TX_ID[2]
|
||||
P[4] = RX_ID[0]
|
||||
P[5] = RX_ID[1]
|
||||
P[6] = RX_ID[2]
|
||||
P[7] = 00
|
||||
P[8] = sum P[0..7] + C0
|
||||
|
||||
Planes ack:
|
||||
RX: 4299us C=71 S=Y A= CC CC CC CC CC P(9)= 9B 66 4F 47 38 12 10 00 B0
|
||||
RX: 26222us C=71 S=Y A= CC CC CC CC CC P(9)= 9B 66 4F 47 38 12 10 00 B0
|
||||
RX: 8743us C=71 S=Y A= CC CC CC CC CC P(9)= 9B 66 4F 47 38 12 10 00 B0
|
||||
P[0] = 9B bind phase 3
|
||||
P[1] = TX_ID[0]
|
||||
P[2] = TX_ID[1]
|
||||
P[3] = TX_ID[2]
|
||||
P[4] = RX_ID[0]
|
||||
P[5] = RX_ID[1]
|
||||
P[6] = RX_ID[2]
|
||||
P[7] = 00
|
||||
P[8] = sum P[0..7] + BF
|
||||
|
||||
Normal
|
||||
------
|
||||
TX sends
|
||||
C=65,69,73,77 -> only one channel when telemetry is working
|
||||
250K C=69 S=Y A= 66 4F 47 CC CC P(9)= 32 32 00 32 E0 00 01 5A 50
|
||||
P[0] = A 00..32..64
|
||||
P[1] = E 00..32..64
|
||||
P[2] = T 00..64
|
||||
P[3] = R 00..32..64
|
||||
P[4] = alternates 20,60,A0,E0
|
||||
trims
|
||||
A 01..20..3F
|
||||
E 41..60..7F
|
||||
R 81..A0..BF
|
||||
telemetry
|
||||
E0 present when the telemetry works
|
||||
6g/3d
|
||||
C1 few times if P[6] flag 00->08
|
||||
C0 few times if P[6] = flag 08->00
|
||||
P[5] = flags
|
||||
01=high rate
|
||||
20=hover=long_press_left
|
||||
40=light -> temporary
|
||||
08=6g/3d=short_press_right sequece also switches for a few packets to C1 if 8 C0 if 0
|
||||
P[6] = 00 telemetry nok
|
||||
01 telemetry ok but sometimes switch to 1 also when telemetry is nok...
|
||||
P[7] = 5A -> sum RX_ID[0..2]
|
||||
P[8] = sum P[0..7] + TX_ID[0] - TX_ID[1] + TX_ID[2] + 21
|
||||
|
||||
Telemetry
|
||||
RX on channel: 69, Time: 3408us P: 66 4F 47 00 00 00 00 00 C8
|
||||
P[0] = TX_ID[0]
|
||||
P[1] = TX_ID[1]
|
||||
P[2] = TX_ID[2]
|
||||
P[8] = sum P[0..7] + CC
|
||||
|
||||
Timing when plane is not detected:
|
||||
RF
|
||||
2469 110713 0
|
||||
2473 114560 3847
|
||||
2477 120291 5731
|
||||
2465 135684 15393
|
||||
2469 142138 6454
|
||||
2473 145984 3846
|
||||
2477 151753 5769
|
||||
2465 155330 3577
|
||||
|
||||
*/
|
||||
/* P10 Piper CUB
|
||||
Bind
|
||||
----
|
||||
Phase 1
|
||||
Plane sends these packets:
|
||||
250K C=69 S=Y A= CC CC CC CC CC P(9)= 9C BB CC DD 84 24 20 00 97
|
||||
P[0] = 9C bind phase 1
|
||||
P[1] = Dummy TX_ID
|
||||
P[2] = Dummy TX_ID
|
||||
P[3] = Dummy TX_ID
|
||||
P[4] = RX_ID[0]
|
||||
P[5] = RX_ID[1]
|
||||
P[6] = RX_ID[2]
|
||||
P[7] = 00
|
||||
P[8] = sum P[0..7] + BF + 10
|
||||
|
||||
Normal
|
||||
------
|
||||
TX sends
|
||||
C=67 -> only one channel when telemetry is working
|
||||
A= E8 25 3B CC CC P(9)= 32 32 00 32 A0 40 01 C8 6E
|
||||
P[0] = A 00..32..64
|
||||
P[1] = E 00..32..64
|
||||
P[2] = T 00..64
|
||||
P[3] = R 00..32..64
|
||||
P[4] = alternates 20,60,A0,E0
|
||||
trims
|
||||
A 01..20..3F
|
||||
E 41..60..7F
|
||||
R 81..A0..BF
|
||||
telemetry
|
||||
E0 present when the telemetry works
|
||||
6g/3d
|
||||
C1 few times if P[6] flag 00->08
|
||||
C0 few times if P[6] = flag 08->00
|
||||
P[5] = flags
|
||||
01=high rate
|
||||
20=hover=long_press_left
|
||||
40=light -> temporary
|
||||
08=6g/3d=short_press_right sequece also switches for a few packets to C1 if 8 C0 if 0
|
||||
P[6] = 00 telemetry nok
|
||||
01 telemetry ok but sometimes switch to 1 also when telemetry is nok...
|
||||
P[7] = C8 -> sum RX_ID[0..2]
|
||||
P[8] = sum P[0..7] + TX_ID[0] - TX_ID[1] + TX_ID[2] + 21 +10
|
||||
*/
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
// Parameters which can be modified
|
||||
#define XN297DUMP_PERIOD_SCAN 50000 // 25000
|
||||
#define XN297DUMP_MAX_RF_CHANNEL 127 // Default 84
|
||||
#define XN297DUMP_MAX_RF_CHANNEL 84 // Default 84
|
||||
|
||||
// Do not touch from there
|
||||
#define XN297DUMP_INITIAL_WAIT 500
|
||||
@@ -186,6 +186,7 @@ static void __attribute__((unused)) XN297Dump_overflow()
|
||||
static uint16_t XN297Dump_callback()
|
||||
{
|
||||
static uint32_t time=0,*time_rf;
|
||||
static uint8_t *nbr_rf,compare_channel;
|
||||
|
||||
//!!!Blocking mode protocol!!!
|
||||
TX_MAIN_PAUSE_off;
|
||||
@@ -370,8 +371,14 @@ static uint16_t XN297Dump_callback()
|
||||
hopping_frequency_no=0;
|
||||
rf_ch_num=0;
|
||||
packet_count=0;
|
||||
nbr_rf=(uint8_t*)malloc(XN297DUMP_MAX_RF_CHANNEL*sizeof(uint8_t));
|
||||
if(nbr_rf==NULL)
|
||||
{
|
||||
debugln("\r\nCan't allocate memory for next phase!!!");
|
||||
phase=0;
|
||||
break;
|
||||
}
|
||||
debug("Trying RF channel: 0");
|
||||
|
||||
XN297_SetTXAddr(rx_tx_addr,address_length);
|
||||
XN297_SetRXAddr(rx_tx_addr,packet_length);
|
||||
XN297_RFChannel(0);
|
||||
@@ -391,9 +398,34 @@ static uint16_t XN297Dump_callback()
|
||||
packet_count=0;
|
||||
if(hopping_frequency_no>XN297DUMP_MAX_RF_CHANNEL)
|
||||
{
|
||||
uint8_t nbr_max=0,j=0;
|
||||
debug("\r\n\r\n%d RF channels identified:",rf_ch_num);
|
||||
compare_channel=0;
|
||||
for(uint8_t i=0;i<rf_ch_num;i++)
|
||||
debug(" %d",hopping_frequency[i]);
|
||||
{
|
||||
debug(" %d[%d]",hopping_frequency[i],nbr_rf[i]);
|
||||
if(nbr_rf[i]>nbr_max)
|
||||
{
|
||||
nbr_max=nbr_rf[i];
|
||||
compare_channel=i;
|
||||
}
|
||||
}
|
||||
nbr_max = (nbr_max*2)/3;
|
||||
debug("\r\nKeeping only RF channels with more than %d packets:", nbr_max);
|
||||
for(uint8_t i=0;i<rf_ch_num;i++)
|
||||
if(nbr_rf[i]>=nbr_max)
|
||||
{
|
||||
hopping_frequency[j]=hopping_frequency[i];
|
||||
debug(" %d",hopping_frequency[j]);
|
||||
if(compare_channel==i)
|
||||
{
|
||||
compare_channel=j;
|
||||
debug("*");
|
||||
}
|
||||
j++;
|
||||
}
|
||||
rf_ch_num = j;
|
||||
free(nbr_rf);
|
||||
time_rf=(uint32_t*)malloc(rf_ch_num*sizeof(time));
|
||||
if(time_rf==NULL)
|
||||
{
|
||||
@@ -403,13 +435,13 @@ static uint16_t XN297Dump_callback()
|
||||
}
|
||||
debugln("\r\n--------------------------------");
|
||||
debugln("Identifying RF channels order.");
|
||||
hopping_frequency_no=1;
|
||||
hopping_frequency_no=0;
|
||||
phase=3;
|
||||
packet_count=0;
|
||||
bind_counter=0;
|
||||
debugln("Time between CH:%d and CH:%d",hopping_frequency[0],hopping_frequency[hopping_frequency_no]);
|
||||
debugln("Time between CH:%d and CH:%d",hopping_frequency[compare_channel],hopping_frequency[hopping_frequency_no]);
|
||||
time_rf[hopping_frequency_no]=0xFFFFFFFF;
|
||||
XN297_RFChannel(hopping_frequency[0]);
|
||||
XN297_RFChannel(hopping_frequency[compare_channel]);
|
||||
uint16_t timeL=TCNT1;
|
||||
if(TIMER2_BASE->SR & TIMER_SR_UIF)
|
||||
{//timer just rolled over...
|
||||
@@ -430,7 +462,7 @@ static uint16_t XN297Dump_callback()
|
||||
}
|
||||
if( XN297_IsRX() )
|
||||
{ // RX fifo data ready
|
||||
// if(NRF24L01_ReadReg(NRF24L01_09_CD))
|
||||
if(NRF24L01_ReadReg(NRF24L01_09_CD))
|
||||
{
|
||||
uint8_t res;
|
||||
if(enhanced)
|
||||
@@ -462,6 +494,7 @@ static uint16_t XN297Dump_callback()
|
||||
for(uint8_t i=0;i<packet_length;i++)
|
||||
debug(" %02X",packet[i]);
|
||||
packet_count++;
|
||||
nbr_rf[rf_ch_num-1]=packet_count;
|
||||
if(packet_count>20)
|
||||
{//change channel
|
||||
bind_counter=XN297DUMP_PERIOD_SCAN+1;
|
||||
@@ -484,15 +517,15 @@ static uint16_t XN297Dump_callback()
|
||||
{
|
||||
uint8_t next=0;
|
||||
debugln("\r\n\r\nChannel order:");
|
||||
debugln("%d: 0us",hopping_frequency[0]);
|
||||
uint8_t i=1;
|
||||
debugln("%d: 0us",hopping_frequency[compare_channel]);
|
||||
uint8_t i=0;
|
||||
do
|
||||
{
|
||||
time=time_rf[i];
|
||||
if(time!=0xFFFFFFFF)
|
||||
{
|
||||
next=i;
|
||||
for(uint8_t j=2;j<rf_ch_num;j++)
|
||||
for(uint8_t j=1;j<rf_ch_num;j++)
|
||||
if(time>time_rf[j])
|
||||
{
|
||||
next=j;
|
||||
@@ -512,9 +545,9 @@ static uint16_t XN297Dump_callback()
|
||||
hopping_frequency_no=0;
|
||||
break;
|
||||
}
|
||||
debugln("Time between CH:%d and CH:%d",hopping_frequency[0],hopping_frequency[hopping_frequency_no]);
|
||||
debugln("Time between CH:%d and CH:%d",hopping_frequency[compare_channel],hopping_frequency[hopping_frequency_no]);
|
||||
time_rf[hopping_frequency_no]=-1;
|
||||
XN297_RFChannel(hopping_frequency[0]);
|
||||
XN297_RFChannel(hopping_frequency[compare_channel]);
|
||||
uint16_t timeL=TCNT1;
|
||||
if(TIMER2_BASE->SR & TIMER_SR_UIF)
|
||||
{//timer just rolled over...
|
||||
@@ -528,7 +561,7 @@ static uint16_t XN297Dump_callback()
|
||||
}
|
||||
if( XN297_IsRX() )
|
||||
{ // RX fifo data ready
|
||||
//if(NRF24L01_ReadReg(NRF24L01_09_CD))
|
||||
if(NRF24L01_ReadReg(NRF24L01_09_CD))
|
||||
{
|
||||
uint8_t res;
|
||||
if(enhanced)
|
||||
@@ -553,7 +586,7 @@ static uint16_t XN297Dump_callback()
|
||||
if(time_rf[hopping_frequency_no] > (time>>1))
|
||||
time_rf[hopping_frequency_no]=time>>1;
|
||||
debugln("Time: %5luus", time>>1);
|
||||
XN297_RFChannel(hopping_frequency[0]);
|
||||
XN297_RFChannel(hopping_frequency[compare_channel]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -610,11 +643,11 @@ static uint16_t XN297Dump_callback()
|
||||
{
|
||||
if(phase==0)
|
||||
{
|
||||
address_length=4;
|
||||
memcpy(rx_tx_addr, (uint8_t *)"\xF4\x71\x8D\x01", address_length); // bind \x7E\xB8\x63\xA9
|
||||
address_length=5;
|
||||
memcpy(rx_tx_addr, (uint8_t *)"\xCC\xCC\xCC\xCC\xCC", address_length); // bind \x7E\xB8\x63\xA9
|
||||
bitrate=XN297DUMP_250K;
|
||||
packet_length=7;
|
||||
hopping_frequency_no=0x50; //bind 0x50, normal ??
|
||||
packet_length=9;
|
||||
hopping_frequency_no=71; //bind 71, normal ??
|
||||
|
||||
NRF24L01_Initialize();
|
||||
NRF24L01_SetTxRxMode(TXRX_OFF);
|
||||
@@ -851,6 +884,63 @@ static uint16_t XN297Dump_callback()
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else if(sub_protocol == XN297DUMP_XN297)
|
||||
{
|
||||
if(phase==0)
|
||||
{
|
||||
address_length=5;
|
||||
memcpy(rx_tx_addr, (uint8_t *)"\x00\x00\x00\x00\x00", address_length); // bind \x7E\xB8\x63\xA9
|
||||
packet_length=9;
|
||||
hopping_frequency_no=0x30;
|
||||
|
||||
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297_SetTXAddr(rx_tx_addr, address_length);
|
||||
XN297_SetRXAddr(rx_tx_addr, packet_length);
|
||||
XN297_Hopping(option);
|
||||
old_option = option;
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
|
||||
debugln("XN297 dump, len=%d, rf=%d, address length=%d",packet_length,option,address_length); //hopping_frequency_no,address_length);
|
||||
phase = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool rx = XN297_IsRX(); // Needed for the NRF24L01 since otherwise the bit gets cleared
|
||||
if(rx)
|
||||
{ // RX fifo data ready
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
XN297Dump_overflow();
|
||||
uint16_t timeL=TCNT1;
|
||||
if(TIMER2_BASE->SR & TIMER_SR_UIF)
|
||||
{//timer just rolled over...
|
||||
XN297Dump_overflow();
|
||||
timeL=0;
|
||||
}
|
||||
time=(timeH<<16)+timeL-time;
|
||||
debug("RX: %5luus ", time>>1);
|
||||
time=(timeH<<16)+timeL;
|
||||
if(XN297_ReadPayload(packet_in, packet_length))
|
||||
{
|
||||
debug("OK:");
|
||||
for(uint8_t i=0;i<packet_length;i++)
|
||||
debug(" %02X",packet_in[i]);
|
||||
}
|
||||
else // Bad packet
|
||||
debug(" NOK");
|
||||
debugln("");
|
||||
// restart RX mode
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
}
|
||||
XN297Dump_overflow();
|
||||
if(old_option != option)
|
||||
{
|
||||
debugln("C=%d(%02X)",option,option);
|
||||
XN297_Hopping(option);
|
||||
old_option = option;
|
||||
}
|
||||
}
|
||||
}
|
||||
bind_counter++;
|
||||
if(IS_RX_FLAG_on) // Let the radio update the protocol
|
||||
{
|
||||
|
||||
@@ -207,6 +207,27 @@ static void __attribute__((unused)) XN297_SetTxRxMode(enum TXRX_State mode)
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CC2500_INSTALLED
|
||||
uint8_t XN297_Buffer[32];
|
||||
uint8_t XN297_Buffer_Len = 0;
|
||||
|
||||
static void __attribute__((unused)) XN297_SendCC2500Payload()
|
||||
{
|
||||
// stop TX/RX
|
||||
CC2500_Strobe(CC2500_SIDLE);
|
||||
// flush tx FIFO
|
||||
CC2500_Strobe(CC2500_SFTX);
|
||||
// packet length
|
||||
CC2500_WriteReg(CC2500_06_PKTLEN, XN297_Buffer_Len + 4); // Packet len, fix packet len
|
||||
// xn297L preamble
|
||||
CC2500_WriteRegisterMulti(CC2500_3F_TXFIFO, (uint8_t*)"\x0C\x71\x0F\x55", 4);
|
||||
// xn297 packet
|
||||
CC2500_WriteRegisterMulti(CC2500_3F_TXFIFO, XN297_Buffer, XN297_Buffer_Len);
|
||||
// transmit
|
||||
CC2500_Strobe(CC2500_STX);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void __attribute__((unused)) XN297_SendPayload(uint8_t* msg, uint8_t len)
|
||||
{
|
||||
#ifdef NRF24L01_INSTALLED
|
||||
@@ -220,22 +241,25 @@ static void __attribute__((unused)) XN297_SendPayload(uint8_t* msg, uint8_t len)
|
||||
#ifdef CC2500_INSTALLED
|
||||
if(xn297_rf == XN297_CC2500)
|
||||
{
|
||||
// stop TX/RX
|
||||
CC2500_Strobe(CC2500_SIDLE);
|
||||
// flush tx FIFO
|
||||
CC2500_Strobe(CC2500_SFTX);
|
||||
// packet length
|
||||
CC2500_WriteReg(CC2500_06_PKTLEN, len + 4); // Packet len, fix packet len
|
||||
// xn297L preamble
|
||||
CC2500_WriteRegisterMulti(CC2500_3F_TXFIFO, (uint8_t*)"\x0C\x71\x0F\x55", 4);
|
||||
// xn297 packet
|
||||
CC2500_WriteRegisterMulti(CC2500_3F_TXFIFO, msg, len);
|
||||
// transmit
|
||||
CC2500_Strobe(CC2500_STX);
|
||||
memcpy(XN297_Buffer, msg, len);
|
||||
XN297_Buffer_Len = len;
|
||||
XN297_SendCC2500Payload();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) XN297_ReSendPayload()
|
||||
{
|
||||
#ifdef NRF24L01_INSTALLED
|
||||
if(xn297_rf == XN297_NRF)
|
||||
NRF24L01_Strobe(NRF24L01_E3_REUSE_TX_PL);
|
||||
#endif
|
||||
#ifdef CC2500_INSTALLED
|
||||
if(xn297_rf == XN297_CC2500)
|
||||
XN297_SendCC2500Payload();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) XN297_WritePayload(uint8_t* msg, uint8_t len)
|
||||
{
|
||||
uint8_t buf[32];
|
||||
@@ -329,9 +353,9 @@ static void __attribute__((unused)) XN297_WriteEnhancedPayload(uint8_t* msg, uin
|
||||
|
||||
last++;
|
||||
buf[last] = bit_reverse(msg[len-1]) << 6; // last 2 bit of payload
|
||||
if(xn297_scramble_enabled)
|
||||
buf[last] ^= xn297_scramble[scramble_index++] & 0xc0;
|
||||
}
|
||||
if(xn297_scramble_enabled)
|
||||
buf[last] ^= xn297_scramble[scramble_index++] & 0xc0;
|
||||
|
||||
// crc
|
||||
if (xn297_crc)
|
||||
@@ -351,8 +375,7 @@ static void __attribute__((unused)) XN297_WriteEnhancedPayload(uint8_t* msg, uin
|
||||
buf[last++] = (crc & 0xff) << 6;
|
||||
}
|
||||
pid++;
|
||||
if(pid>3)
|
||||
pid=0;
|
||||
pid &= 0x03;
|
||||
|
||||
// send packet
|
||||
XN297_SendPayload(buf, last);
|
||||
@@ -440,7 +463,6 @@ static uint8_t __attribute__((unused)) XN297_ReadEnhancedPayload(uint8_t* msg, u
|
||||
|
||||
// Read payload
|
||||
XN297_ReceivePayload(buffer, len+2); // Read pcf + payload + CRC
|
||||
|
||||
// Decode payload
|
||||
pcf_size = buffer[0];
|
||||
if(xn297_scramble_enabled)
|
||||
|
||||
261
Multiprotocol/Yuxiang_nrf24l01.ino
Normal file
261
Multiprotocol/Yuxiang_nrf24l01.ino
Normal file
@@ -0,0 +1,261 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
Thanks to Goebish ,Ported from his deviation firmware
|
||||
*/
|
||||
|
||||
#if defined(YUXIANG_NRF24L01_INO)
|
||||
|
||||
#include "iface_xn297.h"
|
||||
|
||||
//#define YUXIANG_FORCE_ID
|
||||
|
||||
#define YUXIANG_PACKET_PERIOD 12422
|
||||
#define YUXIANG_PACKET_SIZE 9
|
||||
#define YUXIANG_BIND_COUNT 150
|
||||
#define YUXIANG_BIND_FREQ 0x30 //48
|
||||
#define YUXIANG_RF_NUM_CHANNELS 4
|
||||
|
||||
#define YUXIANG_WRITE_TIME 1000
|
||||
//#define YUXIANG_TELEM_DEBUG
|
||||
|
||||
enum
|
||||
{
|
||||
YUXIANG_DATA = 0,
|
||||
YUXIANG_RX
|
||||
};
|
||||
|
||||
static void __attribute__((unused)) YUXIANG_send_packet()
|
||||
{
|
||||
if(bind_counter && packet_sent < 5 && (hopping_frequency_no & 0x07) == 0)
|
||||
{
|
||||
bind_counter--;
|
||||
if(!bind_counter)
|
||||
BIND_DONE;
|
||||
#if 0
|
||||
debug("B C:%d, ",YUXIANG_BIND_FREQ);
|
||||
#endif
|
||||
XN297_RFChannel(YUXIANG_BIND_FREQ);
|
||||
XN297_SetTXAddr((uint8_t*)"\x00\x00\x00\x00\x00", 5);
|
||||
bind_phase = 1;
|
||||
packet_sent++;
|
||||
}
|
||||
else
|
||||
{//Normal operation
|
||||
XN297_Hopping(hopping_frequency_no & 0x03);
|
||||
#if 0
|
||||
debug("C:%d, ",hopping_frequency[hopping_frequency_no & 0x03]);
|
||||
#endif
|
||||
hopping_frequency_no++;
|
||||
if(bind_phase)
|
||||
{
|
||||
XN297_SetTXAddr(rx_tx_addr, 5);
|
||||
XN297_SetRXAddr(rx_tx_addr, YUXIANG_PACKET_SIZE);
|
||||
bind_phase = 0;
|
||||
packet_sent = 0;
|
||||
}
|
||||
}
|
||||
|
||||
packet[0] = GET_FLAG(!bind_phase, 0x80) // Bind packet
|
||||
| GET_FLAG(telemetry_lost, 0x20) // No telem
|
||||
| GET_FLAG(!CH5_SW, 0x10) // Lock
|
||||
| GET_FLAG(CH6_SW, 0x08) // High
|
||||
| GET_FLAG(CH11_SW, 0x01); // Screw pitch -> temporary
|
||||
|
||||
packet[1] = GET_FLAG(CH7_SW, 0x08) // Land only when unlock
|
||||
| GET_FLAG(CH10_SW, 0x20); // Mode
|
||||
|
||||
packet[2] = GET_FLAG(CH5_SW, 0x02) // Altitude hold set when unlock
|
||||
| GET_FLAG(CH8_SW, 0x01) // Manual
|
||||
| GET_FLAG(CH9_SW, 0x40); // Flip
|
||||
|
||||
uint16_t value = convert_channel_16b_limit(AILERON,0,1000);
|
||||
packet[3] = value;
|
||||
packet[7] = value >> 8;
|
||||
value = convert_channel_16b_limit(ELEVATOR,0,1000);
|
||||
packet[4] = value;
|
||||
packet[7] |= (value >> 6) & 0x0C;
|
||||
value = convert_channel_16b_limit(THROTTLE,0,1000);
|
||||
packet[5] = value;
|
||||
packet[7] |= (value >> 4) & 0x30;
|
||||
value = convert_channel_16b_limit(RUDDER,0,1000);
|
||||
packet[6] = value;
|
||||
packet[7] |= (value >> 2) & 0xC0;
|
||||
|
||||
if(bind_phase)
|
||||
memcpy(&packet[3], rx_tx_addr, 4);
|
||||
|
||||
uint8_t checksum = 0;
|
||||
for(uint8_t i=0; i<YUXIANG_PACKET_SIZE-1; i++)
|
||||
checksum += packet[i];
|
||||
packet[8] = checksum;
|
||||
|
||||
#if 0
|
||||
debug("P:");
|
||||
for(uint8_t i=0;i<YUXIANG_PACKET_SIZE;i++)
|
||||
debug(" %02X",packet[i]);
|
||||
debugln("");
|
||||
#endif
|
||||
// Send
|
||||
XN297_SetPower();
|
||||
XN297_SetTxRxMode(TX_EN);
|
||||
XN297_WritePayload(packet, YUXIANG_PACKET_SIZE);
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) YUXIANG_RF_init()
|
||||
{
|
||||
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
|
||||
}
|
||||
|
||||
static void __attribute__((unused)) YUXIANG_initialize_txid()
|
||||
{
|
||||
//Modify address to influence hop
|
||||
rx_tx_addr[0] += RX_num;
|
||||
//Calc hop
|
||||
uint8_t val;
|
||||
for(uint8_t i=0; i<4; i++)
|
||||
{
|
||||
val = i*0x06;
|
||||
if(i) val |= 0x01;
|
||||
val += rx_tx_addr[0];
|
||||
val &= 0x1F;
|
||||
val += 47;
|
||||
if(val < 50)
|
||||
val = 50;
|
||||
if(val > 62 && val < 66)
|
||||
val = 62;
|
||||
hopping_frequency[i] = val;
|
||||
}
|
||||
|
||||
#ifdef YUXIANG_FORCE_ID
|
||||
switch(RX_num)
|
||||
{
|
||||
case 0://TX1
|
||||
memcpy(rx_tx_addr,(uint8_t *)"\xB3\x13\x36\xDD",4); //rx_tx_addr[4]=0xD9
|
||||
memcpy(hopping_frequency,(uint8_t *)"\x42\x49\x32\x35",4); //66,73,50,53
|
||||
break;
|
||||
case 1://TX2
|
||||
memcpy(rx_tx_addr,(uint8_t *)"\xEB\x13\x36\xAC",4); //rx_tx_addr[4]=0xE0
|
||||
memcpy(hopping_frequency,(uint8_t *)"\x47\x4D\x3A\x3E",4); //58,62,71,77
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
uint8_t sum=0;
|
||||
for(uint8_t i=0; i<4; i++)
|
||||
sum += rx_tx_addr[i];
|
||||
rx_tx_addr[4] = sum;
|
||||
debugln("ID: %02X %02X %02X %02X %02X , HOP: %2d %2d %2d %2d",rx_tx_addr[0],rx_tx_addr[1],rx_tx_addr[2],rx_tx_addr[3],rx_tx_addr[4],hopping_frequency[0],hopping_frequency[1],hopping_frequency[2],hopping_frequency[3]);
|
||||
}
|
||||
|
||||
uint16_t YUXIANG_callback()
|
||||
{
|
||||
bool rx = false;
|
||||
|
||||
switch(phase)
|
||||
{
|
||||
case YUXIANG_DATA:
|
||||
rx = XN297_IsRX(); // Needed for the NRF24L01 since otherwise the bit gets cleared
|
||||
XN297_SetTxRxMode(TXRX_OFF);
|
||||
#ifdef YUXIANG_HUB_TELEMETRY
|
||||
if(packet_count > 240) // Around 3sec with no telemetry
|
||||
telemetry_lost = 1;
|
||||
else
|
||||
packet_count++;
|
||||
#endif
|
||||
#ifdef MULTI_SYNC
|
||||
telemetry_set_input_sync(YUXIANG_PACKET_PERIOD);
|
||||
#endif
|
||||
YUXIANG_send_packet();
|
||||
if(rx)
|
||||
{ // Check if a packet has been received
|
||||
#ifdef YUXIANG_TELEM_DEBUG
|
||||
debug("RX ");
|
||||
#endif
|
||||
if(XN297_ReadPayload(packet_in, YUXIANG_PACKET_SIZE))
|
||||
{ // packet with good CRC and length
|
||||
uint8_t checksum = 0;
|
||||
for(uint8_t i=0; i<YUXIANG_PACKET_SIZE-1; i++)
|
||||
checksum += packet_in[i];
|
||||
if(packet_in[8] == checksum)
|
||||
{
|
||||
#ifdef YUXIANG_HUB_TELEMETRY
|
||||
if(packet_in[0]==0x78)
|
||||
{
|
||||
#ifdef YUXIANG_TELEM_DEBUG
|
||||
debug("OK:");
|
||||
for(uint8_t i=0;i<YUXIANG_PACKET_SIZE;i++)
|
||||
debug(" %02X",packet_in[i]);
|
||||
#endif
|
||||
v_lipo1 = packet_in[4];
|
||||
v_lipo2 = packet_in[6];
|
||||
}
|
||||
telemetry_link = 1;
|
||||
#endif
|
||||
telemetry_lost = 0;
|
||||
packet_count = 0;
|
||||
bind_counter = 0; // Stop bind
|
||||
BIND_DONE;
|
||||
}
|
||||
#ifdef YUXIANG_TELEM_DEBUG
|
||||
else // Bad packet
|
||||
debug(" NOK");
|
||||
#endif
|
||||
}
|
||||
#ifdef YUXIANG_TELEM_DEBUG
|
||||
else // Bad packet
|
||||
debug("NOK");
|
||||
debugln("");
|
||||
#endif
|
||||
rx = false;
|
||||
}
|
||||
phase++;
|
||||
return YUXIANG_WRITE_TIME;
|
||||
default:
|
||||
// RX
|
||||
{ // Wait for packet to be sent before switching to receive mode
|
||||
uint16_t start=(uint16_t)micros();
|
||||
while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 500)
|
||||
if(XN297_IsPacketSent())
|
||||
break;
|
||||
}
|
||||
//if(bind_phase)
|
||||
// XN297_Hopping(3);
|
||||
XN297_SetTxRxMode(RX_EN);
|
||||
phase = YUXIANG_DATA;
|
||||
return YUXIANG_PACKET_PERIOD - YUXIANG_WRITE_TIME;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void YUXIANG_init(void)
|
||||
{
|
||||
YUXIANG_initialize_txid();
|
||||
YUXIANG_RF_init();
|
||||
|
||||
if(IS_BIND_IN_PROGRESS)
|
||||
bind_counter = YUXIANG_BIND_COUNT;
|
||||
else
|
||||
bind_counter = 0;
|
||||
|
||||
phase = YUXIANG_DATA;
|
||||
hopping_frequency_no = 0;
|
||||
bind_phase = 1;
|
||||
packet_sent = 8;
|
||||
#ifdef YUXIANG_HUB_TELEMETRY
|
||||
packet_count = 0;
|
||||
telemetry_lost = 1;
|
||||
RX_RSSI = 100; // Dummy value
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -211,7 +211,7 @@
|
||||
#define FRSKYL_CC2500_INO
|
||||
#define FRSKYD_CC2500_INO
|
||||
#define FRSKYV_CC2500_INO
|
||||
#define FRSKYX_CC2500_INO
|
||||
#define FRSKYX_CC2500_INO //Include FRSKYX2 protocol
|
||||
#define FRSKY_RX_CC2500_INO
|
||||
#define HITEC_CC2500_INO
|
||||
#define HOTT_CC2500_INO
|
||||
@@ -240,10 +240,13 @@
|
||||
#define FX_NRF24L01_INO
|
||||
#define FY326_NRF24L01_INO
|
||||
#define GW008_NRF24L01_INO
|
||||
#define H36_NRF24L01_INO
|
||||
#define H8_3D_NRF24L01_INO
|
||||
#define HISKY_NRF24L01_INO
|
||||
#define HONTAI_NRF24L01_INO
|
||||
#define H8_3D_NRF24L01_INO
|
||||
#define JIABAILE_NRF24L01_INO
|
||||
#define JJRC345_NRF24L01_INO
|
||||
#define KAMTOM_NRF24L01_INO
|
||||
#define KN_NRF24L01_INO
|
||||
#define KYOSHO2_NRF24L01_INO
|
||||
#define LOLI_NRF24L01_INO
|
||||
@@ -254,11 +257,14 @@
|
||||
#define REALACC_NRF24L01_INO
|
||||
#define SGF22_NRF24L01_INO
|
||||
#define SHENQI_NRF24L01_INO
|
||||
#define SHENQI2_NRF24L01_INO
|
||||
#define SYMAX_NRF24L01_INO
|
||||
#define V2X2_NRF24L01_INO
|
||||
#define V761_NRF24L01_INO
|
||||
#define WPL_NRF24L01_INO
|
||||
#define XERALL_NRF24L01_INO
|
||||
#define YD717_NRF24L01_INO
|
||||
#define YUXIANG_NRF24L01_INO
|
||||
#define ZSX_NRF24L01_INO
|
||||
|
||||
//The protocols below need either a CC2500 or NRF24L01 to be installed
|
||||
@@ -270,8 +276,11 @@
|
||||
#define Q303_CCNRF_INO
|
||||
#define Q90C_CCNRF_INO
|
||||
#define SLT_CCNRF_INO
|
||||
#define UDIRC_CCNRF_INO
|
||||
#define V911S_CCNRF_INO
|
||||
#define WL91X_CCNRF_INO
|
||||
#define XK_CCNRF_INO
|
||||
#define XK2_CCNRF_INO
|
||||
|
||||
//The protocols below need a SX1276 to be installed
|
||||
#define FRSKYR9_SX1276_INO
|
||||
@@ -294,11 +303,6 @@
|
||||
//Enable DSM Forward Programming
|
||||
#define DSM_FWD_PGM
|
||||
|
||||
//AFHDS2A specific settings
|
||||
//-------------------------
|
||||
//When enabled (remove the "//"), the below setting makes LQI (Link Quality Indicator) available on one of the RX ouput channel (5-14).
|
||||
//#define AFHDS2A_LQI_CH 14
|
||||
|
||||
/**************************/
|
||||
/*** FAILSAFE SETTINGS ***/
|
||||
/**************************/
|
||||
@@ -345,13 +349,18 @@
|
||||
#define NCC1701_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define OMP_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define V761_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define KAMTOM_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define FX_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define XK2_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define SGF22_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define YUXIANG_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 WFLY2_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define LOLI_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define MT99XX_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
//#define MLINK_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
//#define MLINK_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX
|
||||
#define MLINK_FW_TELEMETRY // Forward received telemetry packet directly to TX to be decoded by erskyTX and OpenTX
|
||||
//#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
|
||||
@@ -557,10 +566,9 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
PPM_IBUS
|
||||
PWM_SBUS
|
||||
PPM_SBUS
|
||||
PWM_IB16
|
||||
PPM_IB16
|
||||
PWM_SB16
|
||||
PPM_SB16
|
||||
AFHDS2A_GYRO_OFF
|
||||
AFHDS2A_GYRO_ON
|
||||
AFHDS2A_GYRO_ON_REV
|
||||
PROTO_AFHDS2A_RX
|
||||
NONE
|
||||
PROTO_ASSAN
|
||||
@@ -690,6 +698,7 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
FX620
|
||||
FX9630
|
||||
Q560
|
||||
QF012
|
||||
PROTO_FY326
|
||||
FY326
|
||||
FY319
|
||||
@@ -698,6 +707,7 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
GD_V2
|
||||
PROTO_GW008
|
||||
NONE
|
||||
PROTO_H36
|
||||
PROTO_H8_3D
|
||||
H8_3D
|
||||
H20H
|
||||
@@ -718,6 +728,7 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
JJRCX1
|
||||
X5C1
|
||||
FQ777_951
|
||||
HONTAI_XKK170
|
||||
PROTO_HOTT
|
||||
HOTT_SYNC
|
||||
HOTT_NO_SYNC
|
||||
@@ -729,11 +740,16 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
NONE
|
||||
PROTO_J6PRO
|
||||
NONE
|
||||
PROTO_JIABAILE
|
||||
JIABAILE_STD
|
||||
JIABAILE_GYRO
|
||||
PROTO_JJRC345
|
||||
JJRC345
|
||||
SKYTMBLR
|
||||
PROTO_JOYSWAY
|
||||
NONE
|
||||
PROTO_KAMTOM
|
||||
NONE
|
||||
PROTO_KF606
|
||||
KF606_KF606
|
||||
KF606_MIG320
|
||||
@@ -763,8 +779,9 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
PROTO_MLINK
|
||||
NONE
|
||||
PROTO_MOULDKG
|
||||
MOULDKG_ANALOG
|
||||
MOULDKG_DIGIT
|
||||
MOULDKG_ANALOG4
|
||||
MOULDKG_DIGIT4
|
||||
MOULDKG_ANALOG6
|
||||
PROTO_MT99XX
|
||||
MT99
|
||||
H7
|
||||
@@ -776,6 +793,7 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
F949G
|
||||
PROTO_MT99XX2
|
||||
PA18
|
||||
SU35
|
||||
PROTO_NCC1701
|
||||
NONE
|
||||
PROTO_OMP
|
||||
@@ -814,9 +832,14 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
PROTO_SCORPIO
|
||||
NONE
|
||||
PROTO_SGF22
|
||||
NONE
|
||||
SGF22
|
||||
F22S
|
||||
J20
|
||||
CX10
|
||||
PROTO_SHENQI
|
||||
NONE
|
||||
PROTO_SHENQI2
|
||||
NONE
|
||||
PROTO_SKYARTEC
|
||||
NONE
|
||||
PROTO_SLT
|
||||
@@ -825,11 +848,15 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
Q100
|
||||
Q200
|
||||
MR100
|
||||
V1_4CH
|
||||
RF_SIM
|
||||
PROTO_SYMAX
|
||||
SYMAX
|
||||
SYMAX5C
|
||||
PROTO_TRAXXAS
|
||||
NONE
|
||||
PROTO_UDIRC
|
||||
NONE
|
||||
PROTO_V2X2
|
||||
V2X2
|
||||
JXD506
|
||||
@@ -851,18 +878,25 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
||||
W6_6_1
|
||||
W6_HEL
|
||||
W6_HEL_I
|
||||
PROTO_WPL
|
||||
NONE
|
||||
PROTO_XERALL
|
||||
NONE
|
||||
PROTO_XK
|
||||
X450
|
||||
X420
|
||||
XK_CARS
|
||||
PROTO_XK2
|
||||
XK2_X4
|
||||
XK2_P10
|
||||
PROTO_YD717
|
||||
YD717
|
||||
SKYWLKR
|
||||
SYMAX4
|
||||
XINXUN
|
||||
NIHUI
|
||||
PROTO_YUXIANG
|
||||
NONE
|
||||
PROTO_ZSX
|
||||
NONE
|
||||
*/
|
||||
|
||||
@@ -28,6 +28,7 @@ static void __attribute__((unused)) XN297_SetTXAddr(const uint8_t*, uint8_t);
|
||||
static void __attribute__((unused)) XN297_SetRXAddr(const uint8_t*, uint8_t);
|
||||
static void __attribute__((unused)) XN297_SetTxRxMode(enum TXRX_State);
|
||||
static void __attribute__((unused)) XN297_SendPayload(uint8_t*, uint8_t);
|
||||
static void __attribute__((unused)) XN297_ReSendPayload();
|
||||
static void __attribute__((unused)) XN297_WritePayload(uint8_t*, uint8_t);
|
||||
static void __attribute__((unused)) XN297_WriteEnhancedPayload(uint8_t*, uint8_t, uint8_t);
|
||||
static bool __attribute__((unused)) XN297_IsRX();
|
||||
|
||||
@@ -6,6 +6,7 @@ Here are detailed descriptions of every supported protocols (sorted by RF module
|
||||
The Deviation project (on which this project was based) have a useful list of models and protocols [here](http://www.deviationtx.com/wiki/supported_models).
|
||||
|
||||
## Useful notes and definitions
|
||||
- **Surface and air protocols** - As the list of supported protocols grows even the STM32 ARM microcontroller cannot hold all of the protocols. Firmware available from the [Multi-Module](https://downloads.multi-module.org) website has been split into two groups, surface "SFC" and air "AIR". You can check which protocols are included in each of these groups in the [Validate.h](Multiprotocol/Validate.h) source file.
|
||||
- **Channel Order** - The channel order assumed in all the documentation is AETR. You can change this in the compilation settings or by using a precompiled firmware. The module will take whatever input channel order you have choosen and will rearrange them to match the output channel order required by the selected protocol.
|
||||
- **Channel ranges** - A radio output of -100%..0%..+100% will match on the selected protocol -100%,0%,+100%. No convertion needs to be done.
|
||||
- **Extended limits supported** - A channel range of -125%..+125% will be transmitted. Otherwise it will be truncated to -100%..+100%.
|
||||
@@ -60,100 +61,108 @@ You've upgraded the module but the radio does not display the name of the protoc
|
||||
|
||||
# Available Protocol Table of Contents (Listed Alphabetically)
|
||||
|
||||
Protocol Name|Protocol Number|Sub_Proto 0|Sub_Proto 1|Sub_Proto 2|Sub_Proto 3|Sub_Proto 4|Sub_Proto 5|Sub_Proto 6|Sub_Proto 7|RF Module|Emulation
|
||||
---|---|---|---|---|---|---|---|---|---|---|---
|
||||
[Assan](Protocols_Details.md#ASSAN---24)|24|||||||||NRF24L01|
|
||||
[Bayang](Protocols_Details.md#BAYANG---14)|14|Bayang|H8S3D|X16_AH|IRDRONE|DHD_D4|QX100|||NRF24L01|XN297
|
||||
[Bayang RX](Protocols_Details.md#BAYANG-RX---59)|59|Multi|CPPM|||||||NRF24L01|XN297
|
||||
[BlueFly](Protocols_Details.md#BLUEFLY---95)|95|||||||||NRF24L01|
|
||||
[Bugs](Protocols_Details.md#BUGS---41)|41|||||||||A7105|
|
||||
[BugsMini](Protocols_Details.md#BUGSMINI---42)|42|BUGSMINI|BUGS3H|||||||NRF24L01|XN297
|
||||
[Cabell](Protocols_Details.md#Cabell---34)|34|Cabell_V3|C_TELEM|-|-|-|-|F_SAFE|UNBIND|NRF24L01|
|
||||
CFlie|38|CFlie||||||||NRF24L01|
|
||||
[CG023](Protocols_Details.md#CG023---13)|13|CG023|YD829|||||||NRF24L01|XN297
|
||||
[Corona](Protocols_Details.md#CORONA---37)|37|COR_V1|COR_V2|FD_V3||||||CC2500|
|
||||
[CX10](Protocols_Details.md#CX10---12)|12|GREEN|BLUE|DM007|-|J3015_1|J3015_2|MK33041||NRF24L01|XN297
|
||||
[Devo](Protocols_Details.md#DEVO---7)|7|Devo|8CH|10CH|12CH|6CH|7CH|||CYRF6936|
|
||||
[DM002](Protocols_Details.md#DM002---33)|33|||||||||NRF24L01|XN297
|
||||
[DSM](Protocols_Details.md#DSM---6)|6|DSM2_1F|DSM2_2F|DSMX_1F|DSMX_2F|AUTO|DSMR_1F|DSM2SFC||CYRF6936|
|
||||
[DSM_RX](Protocols_Details.md#DSM_RX---70)|70|Multi|CPPM|||||||CYRF6936|
|
||||
[E010R5](Protocols_Details.md#E010R5---81)|81|||||||||CYRF6936|RF2500
|
||||
[E016H](Protocols_Details.md#E016H---85)|85|||||||||NRF24L01|XN297
|
||||
[E016HV2](Protocols_Details.md#E016HV2---80)|80|||||||||CC2500/NRF24L01|unknown
|
||||
[E01X](Protocols_Details.md#E01X---45)|45|E012|E015|||||||CYRF6936|HS6200
|
||||
[E129](Protocols_Details.md#E129---83)|83|E129|C186|||||||CYRF6936|RF2500
|
||||
[EazyRC](Protocols_Details.md#EazyRC---61)|61|||||||||NRF24L01|XN297L
|
||||
[ESky](Protocols_Details.md#ESKY---16)|16|ESky|ET4|||||||NRF24L01|
|
||||
[ESky150](Protocols_Details.md#ESKY150---35)|35|||||||||NRF24L01|
|
||||
[ESky150V2](Protocols_Details.md#ESKY150V2---69)|69|||||||||CC2500|NRF51822
|
||||
[Flysky](Protocols_Details.md#FLYSKY---1)|1|Flysky|V9x9|V6x6|V912|CX20||||A7105|
|
||||
[Flysky AFHDS2A](Protocols_Details.md#FLYSKY-AFHDS2A---28)|28|PWM_IBUS|PPM_IBUS|PWM_SBUS|PPM_SBUS|PWM_IBUS16|PPM_IBUS16|PWM_SBUS16|PPM_SBUS16|A7105|
|
||||
[Flysky AFHDS2A RX](Protocols_Details.md#FLYSKY-AFHDS2A-RX---56)|56|Multi|CPPM|||||||A7105|
|
||||
[FQ777](Protocols_Details.md#FQ777---23)|23|||||||||NRF24L01|SSV7241
|
||||
[FrskyD](Protocols_Details.md#FRSKYD---3)|3|D8|Cloned|||||||CC2500|
|
||||
[FrskyL](Protocols_Details.md#FRSKYL---67)|67|LR12|LR12 6CH|||||||CC2500|
|
||||
[FrskyR9](Protocols_Details.md#FRSKYR9---65)|65|FrskyR9|R9_915|R9_868||||||SX1276|
|
||||
[FrskyV](Protocols_Details.md#FRSKYV---25)|25|||||||||CC2500|
|
||||
[FrskyX](Protocols_Details.md#FRSKYX---15)|15|CH_16|CH_8|EU_16|EU_8|Cloned|Cloned_8|||CC2500|
|
||||
[FrskyX2](Protocols_Details.md#FRSKYX2---64)|64|CH_16|CH_8|EU_16|EU_8|Cloned|Cloned_8|||CC2500|
|
||||
[Frsky_RX](Protocols_Details.md#FRSKY_RX---55)|55|Multi|CloneTX|EraseTX|CPPM|||||CC2500|
|
||||
[Futaba/SFHSS](Protocols_Details.md#Futaba---21)|21|SFHSS||||||||CC2500|
|
||||
[FX](Protocols_Details.md#FX---58)|28|816|620|9630||||||NRF24L01|
|
||||
[FY326](Protocols_Details.md#FY326---20)|20|FY326|FY319|||||||NRF24L01|
|
||||
[GD00X](Protocols_Details.md#GD00X---47)|47|GD_V1*|GD_V2*|||||||NRF24L01|XN297L
|
||||
[GW008](Protocols_Details.md#GW008---32)|32|||||||||NRF24L01|XN297
|
||||
[H8_3D](Protocols_Details.md#H8_3D---36)|36|H8_3D|H20H|H20Mini|H30Mini|||||NRF24L01|XN297
|
||||
[Height](Protocols_Details.md#HEIGHT---53)|53|5ch|8ch|||||||A7105|
|
||||
[Hisky](Protocols_Details.md#HISKY---4)|4|Hisky|HK310|||||||NRF24L01|
|
||||
[Hitec](Protocols_Details.md#HITEC---39)|39|OPT_FW|OPT_HUB|MINIMA||||||CC2500|
|
||||
[Hontai](Protocols_Details.md#HONTAI---26)|26|HONTAI|JJRCX1|X5C1|FQ777_951|||||NRF24L01|XN297
|
||||
[HoTT](Protocols_Details.md#HoTT---57)|57|Sync|No_Sync|||||||CC2500|
|
||||
[Hubsan](Protocols_Details.md#HUBSAN---2)|2|H107|H301|H501||||||A7105|
|
||||
[J6Pro](Protocols_Details.md#J6Pro---22)|22|||||||||CYRF6936|
|
||||
[JJRC345](Protocols_Details.md#JJRC345---71)|71|JJRC345|SkyTmblr|||||||NRF24L01|XN297
|
||||
[JOYSWAY](Protocols_Details.md#JOYSWAY---84)|84|||||||||NRF24L01|XN297
|
||||
[KF606](Protocols_Details.md#KF606---49)|49|KF606|MIG320|ZCZ50||||||NRF24L01|XN297
|
||||
[KN](Protocols_Details.md#KN---9)|9|WLTOYS|FEILUN|||||||NRF24L01|
|
||||
[Kyosho](Protocols_Details.md#Kyosho---73)|73|FHSS|Hype|||||||A7105|
|
||||
[Kyosho2](Protocols_Details.md#Kyosho2---93)|93|KT-17||||||||NRF24L01|
|
||||
[Kyosho3](Protocols_Details.md#Kyosho3---98)|98|ASF||||||||CYRF6936|
|
||||
[LOLI](Protocols_Details.md#LOLI---82)|82|||||||||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|
|
||||
[MouldKg](Protocols_Details.md#mouldkg---90)|90|Analog|Digit|||||||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||||||||NRF24L01|XN297
|
||||
[NCC1701](Protocols_Details.md#NCC1701---44)|44|||||||||NRF24L01|
|
||||
[OMP](Protocols_Details.md#OMP---77)|77|||||||||CC2500&NRF24L01|XN297L
|
||||
[OpenLRS](Protocols_Details.md#OpenLRS---27)|27|||||||||None|
|
||||
[Pelikan](Protocols_Details.md#Pelikan---60)|60|Pro|Lite|SCX24||||||A7105|
|
||||
[Potensic](Protocols_Details.md#Potensic---51)|51|A20||||||||NRF24L01|XN297
|
||||
[PROPEL](Protocols_Details.md#PROPEL---66)|66|74-Z||||||||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|Air|DumboRC|RC4G|||||CC2500|
|
||||
[Realacc](Protocols_Details.md#Realacc---76)|76|R11||||||||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|SGF22||||||||NRF24L01|XN297
|
||||
[Shenqi](Protocols_Details.md#Shenqi---19)|19|Shenqi||||||||NRF24L01|LT8900
|
||||
[Skyartec](Protocols_Details.md#Skyartec---68)|68|||||||||CC2500|CC2500
|
||||
[SLT](Protocols_Details.md#SLT---11)|11|SLT_V1|SLT_V2|Q100|Q200|MR100|V1_4CH|||NRF24L01|CC2500
|
||||
[SymaX](Protocols_Details.md#Symax---10)|10|SYMAX|SYMAX5C|||||||NRF24L01|
|
||||
[Traxxas](Protocols_Details.md#Traxxas---43)|43|TQ||||||||CYRF6936|
|
||||
[V2x2](Protocols_Details.md#V2X2---5)|5|V2x2|JXD506|MR101||||||NRF24L01|
|
||||
[V761](Protocols_Details.md#V761---48)|48|3CH|4CH|TOPRC||||||NRF24L01|XN297
|
||||
[V911S](Protocols_Details.md#V911S---46)|46|V911S*|E119*|||||||NRF24L01|XN297
|
||||
[WFLY](Protocols_Details.md#WFLY---40)|40|WFR0x||||||||CYRF6936|
|
||||
[WFLY2](Protocols_Details.md#WFLY2---79)|79|RF20x||||||||A7105|
|
||||
[WK2x01](Protocols_Details.md#WK2X01---30)|30|WK2801|WK2401|W6_5_1|W6_6_1|W6_HEL|W6_HEL_I|||CYRF6936|
|
||||
[XERALL](Protocols_Details.md#XERALL---91)|91|Tank||||||||NRF24L01|XN297
|
||||
[XK](Protocols_Details.md#XK---62)|62|X450|X420|Cars||||||NRF24L01|XN297
|
||||
[YD717](Protocols_Details.md#YD717---8)|8|YD717|SKYWLKR|SYMAX4|XINXUN|NIHUI||||NRF24L01|
|
||||
[ZSX](Protocols_Details.md#ZSX---52)|52|280||||||||NRF24L01|XN297
|
||||
Protocol Name|Build|Protocol Number|Sub_Proto 0|Sub_Proto 1|Sub_Proto 2|Sub_Proto 3|Sub_Proto 4|Sub_Proto 5|Sub_Proto 6|Sub_Proto 7|RF Module|Emulation
|
||||
---|---|---|---|---|---|---|---|---|---|---|---|---
|
||||
[Assan](Protocols_Details.md#ASSAN---24)|AIR/SFC|24|||||||||NRF24L01|
|
||||
[Bayang](Protocols_Details.md#BAYANG---14)|AIR/SFC|14|Bayang|H8S3D|X16_AH|IRDRONE|DHD_D4|QX100|||NRF24L01|XN297
|
||||
[Bayang RX](Protocols_Details.md#BAYANG-RX---59)|AIR/SFC|59|Multi|CPPM|||||||NRF24L01|XN297
|
||||
[BlueFly](Protocols_Details.md#BLUEFLY---95)||95|||||||||NRF24L01|
|
||||
[Bugs](Protocols_Details.md#BUGS---41)|AIR|41|||||||||A7105|
|
||||
[BugsMini](Protocols_Details.md#BUGSMINI---42)|AIR|42|BUGSMINI|BUGS3H|||||||NRF24L01|XN297
|
||||
[Cabell](Protocols_Details.md#Cabell---34)||34|Cabell_V3|C_TELEM|-|-|-|-|F_SAFE|UNBIND|NRF24L01|
|
||||
CFlie|AIR|38|CFlie||||||||NRF24L01|
|
||||
[CG023](Protocols_Details.md#CG023---13)|AIR|13|CG023|YD829|||||||NRF24L01|XN297
|
||||
[Corona](Protocols_Details.md#CORONA---37)|AIR/SFC|37|COR_V1|COR_V2|FD_V3||||||CC2500|
|
||||
[CX10](Protocols_Details.md#CX10---12)|AIR|12|GREEN|BLUE|DM007|-|J3015_1|J3015_2|MK33041||NRF24L01|XN297
|
||||
[Devo](Protocols_Details.md#DEVO---7)|AIR/SFC|7|Devo|8CH|10CH|12CH|6CH|7CH|||CYRF6936|
|
||||
[DM002](Protocols_Details.md#DM002---33)|AIR|33|||||||||NRF24L01|XN297
|
||||
[DSM](Protocols_Details.md#DSM---6)|AIR/SFC|6|DSM2_1F|DSM2_2F|DSMX_1F|DSMX_2F|AUTO|DSMR_1F|DSM2SFC||CYRF6936|
|
||||
[DSM_RX](Protocols_Details.md#DSM_RX---70)|AIR/SFC|70|Multi|CPPM|||||||CYRF6936|
|
||||
[E010R5](Protocols_Details.md#E010R5---81)|AIR|81|||||||||CYRF6936|RF2500
|
||||
[E016H](Protocols_Details.md#E016H---85)||85|||||||||NRF24L01|XN297
|
||||
[E016HV2](Protocols_Details.md#E016HV2---80)||80|||||||||CC2500/NRF24L01|unknown
|
||||
[E01X](Protocols_Details.md#E01X---45)||45|E012|E015|||||||CYRF6936|HS6200
|
||||
[E129](Protocols_Details.md#E129---83)||83|E129|C186|||||||CYRF6936|RF2500
|
||||
[EazyRC](Protocols_Details.md#EazyRC---61)||61|||||||||NRF24L01|XN297L
|
||||
[ESky](Protocols_Details.md#ESKY---16)||16|ESky|ET4|||||||NRF24L01|
|
||||
[ESky150](Protocols_Details.md#ESKY150---35)||35|||||||||NRF24L01|
|
||||
[ESky150V2](Protocols_Details.md#ESKY150V2---69)||69|||||||||CC2500|NRF51822
|
||||
[Flysky](Protocols_Details.md#FLYSKY---1)||1|Flysky|V9x9|V6x6|V912|CX20||||A7105|
|
||||
[Flysky AFHDS2A](Protocols_Details.md#FLYSKY-AFHDS2A---28)||28|PWM_IBUS|PPM_IBUS|PWM_SBUS|PPM_SBUS|Gyro_Off|Gyro_On|Gyro_On_Rev||A7105|
|
||||
[Flysky AFHDS2A RX](Protocols_Details.md#FLYSKY-AFHDS2A-RX---56)||56|Multi|CPPM|||||||A7105|
|
||||
[FQ777](Protocols_Details.md#FQ777---23)||23|||||||||NRF24L01|SSV7241
|
||||
[FrskyD](Protocols_Details.md#FRSKYD---3)||3|D8|Cloned|||||||CC2500|
|
||||
[FrskyL](Protocols_Details.md#FRSKYL---67)||67|LR12|LR12 6CH|||||||CC2500|
|
||||
[FrskyR9](Protocols_Details.md#FRSKYR9---65)||65|FrskyR9|R9_915|R9_868||||||SX1276|
|
||||
[FrskyV](Protocols_Details.md#FRSKYV---25)||25|||||||||CC2500|
|
||||
[FrskyX](Protocols_Details.md#FRSKYX---15)||15|CH_16|CH_8|EU_16|EU_8|Cloned|Cloned_8|||CC2500|
|
||||
[FrskyX2](Protocols_Details.md#FRSKYX2---64)||64|CH_16|CH_8|EU_16|EU_8|Cloned|Cloned_8|||CC2500|
|
||||
[Frsky_RX](Protocols_Details.md#FRSKY_RX---55)||55|Multi|CloneTX|EraseTX|CPPM|||||CC2500|
|
||||
[Futaba/SFHSS](Protocols_Details.md#Futaba---21)||21|SFHSS||||||||CC2500|
|
||||
[FX](Protocols_Details.md#FX---58)||28|816|620|9630|Q560|QF012||||NRF24L01|
|
||||
[FY326](Protocols_Details.md#FY326---20)||20|FY326|FY319|||||||NRF24L01|
|
||||
[GD00X](Protocols_Details.md#GD00X---47)||47|GD_V1*|GD_V2*|||||||NRF24L01|XN297L
|
||||
[GW008](Protocols_Details.md#GW008---32)||32|||||||||NRF24L01|XN297
|
||||
[H36](Protocols_Details.md#H36---103)||H36|||||||||NRF24L01|XN297
|
||||
[H8_3D](Protocols_Details.md#H8_3D---36)||36|H8_3D|H20H|H20Mini|H30Mini|||||NRF24L01|XN297
|
||||
[Height](Protocols_Details.md#HEIGHT---53)||53|5ch|8ch|||||||A7105|
|
||||
[Hisky](Protocols_Details.md#HISKY---4)||4|Hisky|HK310|||||||NRF24L01|
|
||||
[Hitec](Protocols_Details.md#HITEC---39)||39|OPT_FW|OPT_HUB|MINIMA||||||CC2500|
|
||||
[Hontai](Protocols_Details.md#HONTAI---26)||26|HONTAI|JJRCX1|X5C1|FQ777_951|XKK170||||NRF24L01|XN297
|
||||
[HoTT](Protocols_Details.md#HoTT---57)||57|Sync|No_Sync|||||||CC2500|
|
||||
[Hubsan](Protocols_Details.md#HUBSAN---2)||2|H107|H301|H501||||||A7105|
|
||||
[J6Pro](Protocols_Details.md#J6Pro---22)||22|||||||||CYRF6936|
|
||||
[JIABAILE](Protocols_Details.md#JIABAILE---102)||102|Std|Gyro|||||||NRF24L01|XN297
|
||||
[JJRC345](Protocols_Details.md#JJRC345---71)||71|JJRC345|SkyTmblr|||||||NRF24L01|XN297
|
||||
[JOYSWAY](Protocols_Details.md#JOYSWAY---84)||84|||||||||NRF24L01|XN297
|
||||
[KAMTOM](Protocols_Details.md#KAMTOM---104)||104|||||||||NRF24L01|XN297
|
||||
[KF606](Protocols_Details.md#KF606---49)||49|KF606|MIG320|ZCZ50||||||NRF24L01|XN297
|
||||
[KN](Protocols_Details.md#KN---9)||9|WLTOYS|FEILUN|||||||NRF24L01|
|
||||
[Kyosho](Protocols_Details.md#Kyosho---73)||73|FHSS|Hype|||||||A7105|
|
||||
[Kyosho2](Protocols_Details.md#Kyosho2---93)||93|KT-17||||||||NRF24L01|
|
||||
[Kyosho3](Protocols_Details.md#Kyosho3---98)||98|ASF||||||||CYRF6936|
|
||||
[LOLI](Protocols_Details.md#LOLI---82)||82|||||||||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|
|
||||
[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
|
||||
[NCC1701](Protocols_Details.md#NCC1701---44)||44|||||||||NRF24L01|
|
||||
[OMP](Protocols_Details.md#OMP---77)||77|||||||||CC2500&NRF24L01|XN297L
|
||||
[OpenLRS](Protocols_Details.md#OpenLRS---27)||27|||||||||None|
|
||||
[Pelikan](Protocols_Details.md#Pelikan---60)||60|Pro|Lite|SCX24||||||A7105|
|
||||
[Potensic](Protocols_Details.md#Potensic---51)||51|A20||||||||NRF24L01|XN297
|
||||
[PROPEL](Protocols_Details.md#PROPEL---66)||66|74-Z||||||||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|Air|DumboRC|RC4G|||||CC2500|
|
||||
[Realacc](Protocols_Details.md#Realacc---76)||76|R11||||||||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
|
||||
[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
|
||||
[SLT](Protocols_Details.md#SLT---11)||11|SLT_V1|SLT_V2|Q100|Q200|MR100|V1_4CH|RF_SIM||NRF24L01|CC2500
|
||||
[SymaX](Protocols_Details.md#Symax---10)||10|SYMAX|SYMAX5C|||||||NRF24L01|
|
||||
[Traxxas](Protocols_Details.md#Traxxas---43)||43|TQ2|TQ1|||||||CYRF6936|
|
||||
[V2x2](Protocols_Details.md#V2X2---5)||5|V2x2|JXD506|MR101||||||NRF24L01|
|
||||
[V761](Protocols_Details.md#V761---48)||48|3CH|4CH|TOPRC||||||NRF24L01|XN297
|
||||
[V911S](Protocols_Details.md#V911S---46)||46|V911S*|E119*|||||||NRF24L01|XN297
|
||||
[WFLY](Protocols_Details.md#WFLY---40)||40|WFR0x||||||||CYRF6936|
|
||||
[WFLY2](Protocols_Details.md#WFLY2---79)||79|RF20x||||||||A7105|
|
||||
[WK2x01](Protocols_Details.md#WK2X01---30)||30|WK2801|WK2401|W6_5_1|W6_6_1|W6_HEL|W6_HEL_I|||CYRF6936|
|
||||
[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
|
||||
[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
|
||||
[ZSX](Protocols_Details.md#ZSX---52)||52|280||||||||NRF24L01|XN297
|
||||
* "*" Sub Protocols designated by * suffix are using a XN297L@250kbps which will be emulated by default with the NRF24L01. If option (freq tune) is diffrent from 0, the CC2500 module (if installed) will be used instead. Each specific sub protocol has a more detailed explanation.
|
||||
|
||||
# A7105 RF Module
|
||||
@@ -219,36 +228,59 @@ Telemetry enabled protocol:
|
||||
- if using erskyTX and OpenTX: full telemetry information available
|
||||
- if telemetry is incomplete (missing RX RSSI for example), it means that you have to upgrade your RX firmware to version 1.6 or later. You can do it from an original Flysky TX or using a STLink like explained in [this tutorial](https://www.rcgroups.com/forums/showthread.php?2677694-How-to-upgrade-Flysky-Turnigy-iA6B-RX-to-firmware-1-6-with-a-ST-Link).
|
||||
|
||||
LQI: Link Quality Indicator which is sent back to the RX on CH17
|
||||
|
||||
Option is used to change the servo refresh rate. A value of 0 gives 50Hz (min), 70 gives 400Hz (max). Specific refresh rate value can be calculated like this option=(refresh_rate-50)/5.
|
||||
|
||||
**RX_Num is used to give a number a given RX. You must use a different RX_Num per RX. A maximum of 64 AFHDS2A RXs are supported.**
|
||||
|
||||
AFHDS2A_LQI_CH is a feature which is disabled by defaut in the _config.h file. When enabled, it makes LQI (Link Quality Indicator) available on one of the RX ouput channel (5-14).
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14
|
||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14
|
||||
|
||||
RX output will match the Flysky standard AETR independently of the input configuration AETR, RETA... unless on OpenTX 2.3.3+ you use the "Disable channel mapping" feature on the GUI.
|
||||
|
||||
### 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
|
||||
|
||||
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
|
||||
|
||||
RX output will match the Flysky standard AETR.
|
||||
|
||||
### Sub_protocol PWM_SBUS - *2*
|
||||
### Sub_protocol PPM_SBUS - *3*
|
||||
As stated above.
|
||||
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
|
||||
|
||||
### Sub_protocol PWM_IBUS16 - *4*
|
||||
### Sub_protocol PPM_IBUS16 - *5*
|
||||
### Sub_protocol PWM_SBUS16 - *6*
|
||||
### Sub_protocol PPM_SBUS16 - *7*
|
||||
RX output will match the Flysky standard AETR.
|
||||
|
||||
3 additional channels. Need recent or updated RXs.
|
||||
### Sub_protocol Gyro_Off - *3*
|
||||
RXs: FS-BS6, FS-BS4
|
||||
|
||||
CH15|CH16|CH17
|
||||
---|---|---
|
||||
CH15|CH16|LQI
|
||||
Gyro is off
|
||||
|
||||
LQI: Link Quality Indicator
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|CH17
|
||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|-|-|-|-|LQI
|
||||
|
||||
### Sub_protocol Gyro_On - *4*
|
||||
RXs: FS-BS6, FS-BS4
|
||||
|
||||
Gyro is on
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|CH17
|
||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|ST_Gain|TH_Gain|Priority|Calib|LQI
|
||||
|
||||
### Sub_protocol Gyro_On_Rev - *5*
|
||||
RXs: FS-BS6, FS-BS4
|
||||
|
||||
Gyro is on and reversed
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|CH17
|
||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|ST_Gain|TH_Gain|Priority|Calib|LQI
|
||||
|
||||
## FLYSKY AFHDS2A RX - *56*
|
||||
The Flysky AFHDS2A receiver protocol enables master/slave trainning, separate access from 2 different radios to the same model,...
|
||||
@@ -634,16 +666,18 @@ Models: Eachine E129/E130 and Twister Ninja 250
|
||||
### Sub_protocol C186 - *1*
|
||||
Models: RC ERA C186/E120, C127/E110, K127, C159, C189, C129v2
|
||||
|
||||
The FC of the heli seems to store the trims Trim A/E/R=CH7..9. If you use these trims, make sure to center them after powering off the heli or they will be added to the previous trims and over correct.
|
||||
The FC of the heli store the trims Trim A/E/R=CH7..9. If you use these trims, make sure to reset them to 0 after powering off the heli or they will be added to the previous trims therefore over correctting.
|
||||
|
||||
CH10|CH11
|
||||
---|---
|
||||
Loop|Flip
|
||||
CH10|CH11|CH12
|
||||
---|---|---
|
||||
Loop|Flip|Debug
|
||||
|
||||
Loop: circular flight on the C159 (others?)
|
||||
|
||||
Flip: flip/aerobatic on the C129v2 (others?)
|
||||
|
||||
Debug: you must know what you are doing!!! The new values are stored at power off. The rudder trim is used to change the pitch value (relative to the previously stored value). Ail end Ele trims are used to better trim the FC.
|
||||
|
||||
## J6Pro - *22*
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12
|
||||
@@ -693,6 +727,10 @@ CH1|CH2|CH3|CH4
|
||||
A|E|T|R
|
||||
|
||||
## Traxxas - *43*
|
||||
|
||||
You must assign a different RX number for each receiver/car. Otherwise the new receiver/car ID will overwrite the previous one.
|
||||
|
||||
### Sub_protocol TQ2 - *0*
|
||||
Transmitter TQ, Receivers: 6519, 2218(X), ECM-2.5
|
||||
|
||||
Extended limits supported
|
||||
@@ -703,6 +741,9 @@ CH1|CH2|CH3|CH4|CH5|CH6
|
||||
|
||||
Warning from v1.3.4.7 channels order have changed
|
||||
|
||||
### Sub_protocol TQ1 - *1*
|
||||
Transmitter 2228 TX and a 2217 RX
|
||||
|
||||
## WFLY - *40*
|
||||
Receivers: WFR04S, WFR07S, WFR09S
|
||||
|
||||
@@ -1168,16 +1209,22 @@ If only a NRF24L01 is installed then this sub protocol might be problematic beca
|
||||
## MT99XX - *17*
|
||||
Autobind protocol
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
|
||||
---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS
|
||||
|
||||
CC2500: only YZ is supported.
|
||||
CC2500: only YZ and F949G are supported.
|
||||
|
||||
### Sub_protocol MT99 - *0*
|
||||
Models: MT99xx
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS|ATrim|ETrim
|
||||
|
||||
### Sub_protocol H7 - *1*
|
||||
Models: Eachine H7, Cheerson CX023
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS|ATrim|ETrim
|
||||
|
||||
### Sub_protocol YZ - *2*
|
||||
Model: Yi Zhan i6S
|
||||
|
||||
@@ -1187,77 +1234,94 @@ 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.
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS|ATrim|ETrim
|
||||
|
||||
### Sub_protocol LS - *3*
|
||||
Models: LS114, 124, 215
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
|
||||
---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|FLIP|INVERT|PICTURE|VIDEO|HEADLESS
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|FLIP|INVERT|PICTURE|VIDEO|HEADLESS|ATrim|ETrim
|
||||
|
||||
### Sub_protocol FY805 - *4*
|
||||
Model: FY805
|
||||
|
||||
**Only 1 ID available**
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
|
||||
---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|FLIP||||HEADLESS
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|FLIP||||HEADLESS|ATrim|ETrim
|
||||
|
||||
### Sub_protocol A180 - *5*
|
||||
Model: XK A180, A120, F949S, F959
|
||||
|
||||
A180:
|
||||
CH1|CH2|CH3|CH4|CH5|CH6
|
||||
---|---|---|---|---|---
|
||||
A|E|T|R|3D6G|RATE
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|3D6G|RATE||||ATrim|ETrim
|
||||
|
||||
A120:
|
||||
CH1|CH2|CH3|CH4|CH5|CH6
|
||||
---|---|---|---|---|---
|
||||
A|E|T|R|RATE|LED
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|RATE|LED||||ATrim|ETrim
|
||||
|
||||
F949S:
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7
|
||||
---|---|---|---|---|---|---
|
||||
A|E|T|R|RATE|RXLED|3D6G
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|RATE|RXLED|3D6G|||ATrim|ETrim
|
||||
|
||||
### Sub_protocol DRAGON - *6*
|
||||
Model: Eachine Mini Wing Dragon, Eachine Mini Cessna
|
||||
|
||||
Telemetry is supported: A1 = battery voltage with a Ratio of 25.5, A2=battery low flag (0=off,>0=on) and RSSI = dummy value of 100
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6
|
||||
---|---|---|---|---|---
|
||||
A|E|T|R|MODE|RTH
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|MODE|RTH||||ATrim|ETrim
|
||||
|
||||
MODE: -100%=Beginner, 0%=Intermediate, +100%=Advanced
|
||||
|
||||
### Sub_protocol F949G - *7*
|
||||
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.
|
||||
|
||||
Model: F949G
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6
|
||||
---|---|---|---|---|---
|
||||
A|E|T|R|6G3D|Light
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|6G3D|Light||||ATrim|ETrim
|
||||
|
||||
Model: KFPLAN Z61 BF109
|
||||
Model: KFPLAN Z-Series like Z61 BF109, Z54 A380,...
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
|
||||
---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|-|Rate|Light|Unk1|Unk2
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R||Rate|Light|Unk1|Unk2|ATrim|ETrim
|
||||
|
||||
Unk1&2: long press right/left
|
||||
|
||||
## MT99XX2 - *92*
|
||||
|
||||
### Sub_protocol PA18 - *92*
|
||||
### Sub_protocol PA18 - *0*
|
||||
Model: PA18 mini
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7
|
||||
---|---|---|---|---|---|---
|
||||
A|E|T|R|MODE|FLIP|RTH
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|MODE|FLIP|RTH|||ATrim|ETrim
|
||||
|
||||
MODE: -100% beginner, 0% intermediate, +100% Expert
|
||||
|
||||
### Sub_protocol SU35 - *1*
|
||||
Model: QF009 SU35
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|MODE|LED|LED_FLASH|INVERT|RATE|ATrim|ETrim
|
||||
|
||||
MODE: -100% 6G, +100% 3D
|
||||
|
||||
## OMP - *77*
|
||||
Model: OMPHOBBY M1 & M2 Helis, T720 RC Glider
|
||||
|
||||
@@ -1414,11 +1478,31 @@ FLIP: sets model into flip mode for approx 5 seconds at each throw of switch (re
|
||||
MODE: -100% level, +100% acro
|
||||
|
||||
### Sub_protocol V1_4CH - *5*
|
||||
Transmitters: SLT2 and SLT2 DLC, Receivers: SPMXSE2825RX, SPMXSBER1025G, SPMXSE4510RX, ...
|
||||
|
||||
CH1|CH2|CH3|CH4
|
||||
---|---|---|---
|
||||
CH1|CH2|CH3|CH4
|
||||
|
||||
CH4 is used for DSC settings: -35% off to +15% full
|
||||
|
||||
### Sub_protocol RF_SIM - *6*
|
||||
Models: the SLT-dongle included in RealFlight 7.5
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10
|
||||
---|---|---|---|---|---|---|---|---|----
|
||||
A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10
|
||||
|
||||
Output 10 channels to use with RealFlight simulator.
|
||||
The RealFlight "reset" button found on the RealFlight USB-transmitter, can now be CH9 or CH10.
|
||||
|
||||
RealFlight 8 crashes when trying to save file with reset-button defined.
|
||||
|
||||
Please save radio-profile with a new name without setting reset-button in RF8. Then edit the radio-profile definition in ~\Documents\RealFlight8\RadioProfiles\ in an ordinary fileeditor.
|
||||
|
||||
Find the [Reset21] section and change Input=INT:-1 to Input=INT:9
|
||||
|
||||
|
||||
## V911S - *46*
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6
|
||||
@@ -1431,7 +1515,7 @@ Rate: -100% High, +100% Low
|
||||
Models: WLtoys V911S, XK A110
|
||||
|
||||
### Sub_protocol E119 - *1*
|
||||
Models: Eachine E119, JJRC W01-J3, XK A220 P-40, XK A800 R2, F959S R2, A160 R2, A280
|
||||
Models: Eachine E119, JJRC W01-J3, XK A220 P-40, (TX X4-A800) A800 R2, F959S R2, (TX X4-A800) A160 R2, A280
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
|
||||
---|---|---|---|---|---|---|---|---
|
||||
@@ -1439,6 +1523,14 @@ A|E|T|R|CALIB|RATE|6G_3D|6GSENIOR|LIGHT
|
||||
|
||||
A280 -> 6GSENIOR: -100% - 6G, +100% - Senior mode (turn off gyro), LIGHT: cycle the light through on-flash-off when the CH9 value is changed from -100% to 100%
|
||||
|
||||
## WL91X - *106*
|
||||
|
||||
Models: WLtoys WL911, WL913, WL915 and may be others...
|
||||
|
||||
CH1|CH2|CH3|CH4
|
||||
---|---|---|---
|
||||
ST|TH|ST_TR|TH_TR
|
||||
|
||||
## XK - *62*
|
||||
|
||||
CC2500: only X450 is supported.
|
||||
@@ -1474,6 +1566,31 @@ A|E|T|R|FLIP|LIGHT
|
||||
### Sub_protocol Cars - *2*
|
||||
Models: WLtoys cars 284131/284161/284010/124016/124017/144010 and Eachine EAT14
|
||||
|
||||
## XK2 - *99*
|
||||
|
||||
You must assign a different RX number for each receiver/plane. Otherwise the new receiver/plane ID will overwrite the previous one.
|
||||
|
||||
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
|
||||
---|---|---|---|---|---|---|---
|
||||
A|E|T|R|Rate|Mode|Hover|Light
|
||||
|
||||
The plane does not need to be bound each time if it is powered on **after** the radio/protocol is on.
|
||||
|
||||
Telemetry is supported. The plane sends a battery status of good->empty which is visible in A1 (good=8.4V->empty=7.1V) and RSSI gets a dummy value of 100.
|
||||
|
||||
The rudder trim is driven from the rudder channel to increase the range (Original TX rudder has no range once the motor has been turned on...).
|
||||
|
||||
Mode: -100%=6G, 0%=3D, +100%=Gyro off (Senior mode)
|
||||
|
||||
### Sub_protocol X4 - *0*
|
||||
Transmitter: XK X4-A160, X5S, model: XK A160S, XK A280, XK A300
|
||||
|
||||
### Sub_protocol P10 - *1*
|
||||
Model: Park10 J3-CUB
|
||||
|
||||
***
|
||||
# NRF24L01 RF Module
|
||||
@@ -1722,18 +1839,22 @@ FMODE and AUX7 have 4 positions: -100%..-50%=>0, -50%..5%=>1, 5%..50%=>2, 50%..1
|
||||
## FX - *58*
|
||||
FEI XIONG
|
||||
|
||||
CH1|CH2|CH3|CH4
|
||||
---|---|---|---
|
||||
A|-|T|-
|
||||
|
||||
### Sub_protocol 816 - *0*
|
||||
Model: FX816 P38, B17
|
||||
|
||||
Only 8 TX IDs available
|
||||
|
||||
CH1|CH2|CH3|CH4
|
||||
---|---|---|---
|
||||
A|-|T|-
|
||||
|
||||
### Sub_protocol 620 - *1*
|
||||
Model: FX620 SU35
|
||||
|
||||
CH1|CH2|CH3|CH4
|
||||
---|---|---|---
|
||||
A|-|T|-
|
||||
|
||||
### Sub_protocol 9630 - *2*
|
||||
Model: FX9630, FX9603, QIDI-550
|
||||
|
||||
@@ -1745,14 +1866,29 @@ 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 - *2*
|
||||
### Sub_protocol Q560 - *3*
|
||||
Model: QIDI-560
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7
|
||||
---|---|---|---|---|---|---
|
||||
A|E|T|R|FLIP|GYRO|LEDs
|
||||
|
||||
FLIP and LEDs are toggle channels meaning that -100% to +100% is a command and +100% to -100% is also a command
|
||||
FLIP is a toggle channel meaning that -100% to +100% is a command and +100% to -100% is also a command
|
||||
|
||||
Gyro: -100%=6G, 0%=3D+Gyro, +100%=3D
|
||||
|
||||
### Sub_protocol QF012 - *4*
|
||||
Model: QF012 SBD Dauntless
|
||||
|
||||
Telemetry supported. The plane sends a battery status of good->empty which is visible in A1 (good=4.2V->empty=3.1V) and RSSI gets a dummy value of 100.
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8
|
||||
---|---|---|---|---|---|---|---
|
||||
A|E|T|R|FLIP|GYRO|Invert|Reset
|
||||
|
||||
Gyro: -100%=6G, 0%=3D+Gyro, +100%=3D
|
||||
|
||||
Reset: Restore fine tunning midpoint
|
||||
|
||||
## FY326 - *20*
|
||||
|
||||
@@ -1782,15 +1918,24 @@ CH1|CH2|CH3|CH4|CH5
|
||||
---|---|---|---|---
|
||||
A|E|T|R|FLIP
|
||||
|
||||
## H36 - *103*
|
||||
Autobind protocol
|
||||
|
||||
Model: JJRC H36 (JR-NH010R9 board)
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7
|
||||
---|---|---|---|---|---|---
|
||||
A|E|T|R|FLIP|HEADLESS|RTH
|
||||
|
||||
## H8_3D - *36*
|
||||
Autobind protocol
|
||||
|
||||
### Sub_protocol H8_3D - *0*
|
||||
Models: Eachine H8 mini 3D,Eachine E10, JJRC H20/H22/H11D
|
||||
|
||||
CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13
|
||||
---|---|---|---|---|---|---|---|---
|
||||
FLIP|LIGTH|PICTURE|VIDEO|OPT1|OPT2|CAL1|CAL2|GIMBAL
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13
|
||||
---|---|---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|FLIP|LIGTH|PICTURE|VIDEO|OPT1|OPT2|CAL1|CAL2|GIMBAL
|
||||
|
||||
JJRC H20: OPT1=Headless, OPT2=RTH
|
||||
|
||||
@@ -1856,6 +2001,43 @@ ARM|
|
||||
|
||||
### Sub_protocol FQ777_951 - *3*
|
||||
|
||||
### Sub_protocol XKK170 - *3*
|
||||
|
||||
Model: XK K170 UH-60L Black hawk
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10
|
||||
---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|RATE|EMERGENCY|TAKE_OFF/LANDING|CALIB|TrimA|TrimE
|
||||
|
||||
RATE: -100% Low, 0% Mid, +100% High
|
||||
|
||||
## JIABAILE - *102*
|
||||
|
||||
### Sub_protocol Std - *0*
|
||||
Models: JBL-430x 1:43 car without gyro
|
||||
|
||||
You must assign a different RX number for each car. Otherwise the new car ID will overwrite the previous one.
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7
|
||||
---|---|---|---|---|---|---
|
||||
ST|TH|-|ST_TRIM|SPEED|LIGHT|FLASH
|
||||
|
||||
- Extended Steering comparing to original
|
||||
- SPEED: -100% High, 0% Mid, +100% Low
|
||||
- ST_TRIM: value between -100% and +100% but using the radio steering trim looks better
|
||||
|
||||
### Sub_protocol Gyro - *1*
|
||||
Models: JBL-430x 1:43 car with gyro
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7
|
||||
---|---|---|---|---|---|---
|
||||
ST|TH|GYRO|ST_TRIM|SPEED|LIGHT|FLASH
|
||||
|
||||
- Extended Steering comparing to original
|
||||
- SPEED: -100% High, 0% Mid, +100% Low
|
||||
- GYRO: -100% Off..+100% Max
|
||||
- ST_TRIM: momentary switch, -100% Trim left, 0% Idle, +100% Trim right. Configure the radio steering trim has buttons (ST- and ST+) and assign them to that channel. Don't forget to disable the steering trim in the driving modes.
|
||||
|
||||
## JJRC345 - *71*
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
@@ -1870,6 +2052,15 @@ Model: DF-Models SkyTumbler
|
||||
|
||||
RTH not supported
|
||||
|
||||
## KAMTOM - *104*
|
||||
Models: KAMTOM RC Racing KM24xx (KM32xx?), Pinecone SG-24xx
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7
|
||||
---|---|---|---|---|---|---
|
||||
ST|TH|UNK1|UNK2|ST_TR|TH_TR|TH_DR
|
||||
|
||||
Low battery telemetry in A1 with 0 = low batt
|
||||
|
||||
## KYOSHO2 - *93*
|
||||
Model: TX KT-17, Minium Edge 540, Minium Citabria
|
||||
|
||||
@@ -1906,6 +2097,9 @@ CH16| CH8 | -100% | 0% | - | - | -
|
||||
## MouldKg - *90*
|
||||
Mould King 2.4GHz TX: Technic Brick models
|
||||
|
||||
### Sub_protocol A4444 - *0*
|
||||
Model: 4 analog ports brick
|
||||
|
||||
Up to 4 bricks can be controlled at the same time.
|
||||
|
||||
Option field | Value
|
||||
@@ -1921,17 +2115,52 @@ To associate a brick to a RX number (RX_num above), set this RX number under the
|
||||
Example: I want to control 2 bricks. I select RX number 1, set option to 1 and launch a bind on the first brick. I select RX number 2, set option to 1 and launch a bind on the second brick. Now to control both bricks I set RX number to 1 and option to 2. Therefore brick1 will react to channels CH1 to CH4 and brick2 to channel CH5 to CH8.
|
||||
On another model I can control 4 other bricks, bind each brick to RX number 3 to 6 and then finaly set RX number to 3 and option to 4 to contol the 4 bricks with CH1 to CH16.
|
||||
|
||||
### Sub_protocol Analog - *0*
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16
|
||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
|
||||
Brick1_A|Brick1_B|Brick1_C|Brick1_D|Brick2_A|Brick2_B|Brick2_C|Brick2_D|Brick3_A|Brick3_B|Brick3_C|Brick3_D|Brick4_A|Brick4_B|Brick4_C|Brick4_D
|
||||
|
||||
### Sub_protocol D4444 - *1*
|
||||
Model: 4 digital ports brick and Integrated power module
|
||||
|
||||
Up to 4 bricks can be controlled at the same time.
|
||||
|
||||
Option field | Value
|
||||
-------------|------
|
||||
0|The module will act like the original radio which will bind every time and attach to the first brick in bind mode
|
||||
1|The module will control the brick number RX_num
|
||||
2|The module will control the brick number RX_num and RX_num+1
|
||||
3|The module will control the brick number RX_num, RX_num+1 and RX_num+2
|
||||
4|The module will control the brick number RX_num, RX_num+1, RX_num+2 and RX_num+3
|
||||
|
||||
To associate a brick to a RX number (RX_num above), set this RX number under the protocol, set option to 1, launch a bind and power on the brick you want to control. Repeat this for every brick using a different RX number each time and then indicate the number of bricks to be controlled using the Option field.
|
||||
|
||||
Example: I want to control 2 bricks. I select RX number 1, set option to 1 and launch a bind on the first brick. I select RX number 2, set option to 1 and launch a bind on the second brick. Now to control both bricks I set RX number to 1 and option to 2. Therefore brick1 will react to channels CH1 to CH4 and brick2 to channel CH5 to CH8.
|
||||
On another model I can control 4 other bricks, bind each brick to RX number 3 to 6 and then finaly set RX number to 3 and option to 4 to contol the 4 bricks with CH1 to CH16.
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16
|
||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
|
||||
Brick1_A|Brick1_B|Brick1_C|Brick1_D|Brick2_A|Brick2_B|Brick2_C|Brick2_D|Brick3_A|Brick3_B|Brick3_C|Brick3_D|Brick4_A|Brick4_B|Brick4_C|Brick4_D
|
||||
|
||||
### Sub_protocol Digit - *1*
|
||||
### Sub_protocol A664 - *2*
|
||||
Model: 4/6 analog ports brick
|
||||
|
||||
Up to 3 bricks can be controlled at the same time. The bricks can be either 4 or 6 ports but only the 2 first bricks will be sent 6 channels, the last brick will only be sent 4 channels.
|
||||
|
||||
Option field | Value
|
||||
-------------|------
|
||||
0|The module will act like the original radio which will bind every time and attach to the first brick in bind mode
|
||||
1|The module will control the brick number RX_num
|
||||
2|The module will control the brick number RX_num and RX_num+1
|
||||
3|The module will control the brick number RX_num, RX_num+1 and RX_num+2
|
||||
|
||||
To associate a brick to a RX number (RX_num above), set this RX number under the protocol, set option to 1, launch a bind and power on the brick you want to control. Repeat this for every brick using a different RX number each time and then indicate the number of bricks to be controlled using the Option field.
|
||||
|
||||
Example: I want to control 2 bricks. I select RX number 1, set option to 1 and launch a bind on the first brick. I select RX number 2, set option to 1 and launch a bind on the second brick. Now to control both bricks I set RX number to 1 and option to 2. Therefore brick1 will react to channels CH1 to CH4 and brick2 to channel CH5 to CH8.
|
||||
On another model I can control 3 other bricks, bind each brick to RX number 3 to 5 and then finaly set RX number to 3 and option to 3 to contol the 4 bricks with CH1 to CH16.
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16
|
||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
|
||||
Brick1_A|Brick1_B|Brick1_C|Brick1_D|Brick2_A|Brick2_B|Brick2_C|Brick2_D|Brick3_A|Brick3_B|Brick3_C|Brick3_D|Brick4_A|Brick4_B|Brick4_C|Brick4_D
|
||||
Brick1_A|Brick1_B|Brick1_C|Brick1_D|Brick1_E|Brick1_F|Brick2_A|Brick2_B|Brick2_C|Brick2_D|Brick2_E|Brick2_F|Brick3_A|Brick3_B|Brick3_C|Brick3_D
|
||||
|
||||
## NCC1701 - *44*
|
||||
Model: Air Hogs Star Trek USS Enterprise NCC-1701-A
|
||||
@@ -2006,11 +2235,37 @@ A|E|T|R|FLIP|LIGHT|CALIB|HLESS|RTH|THR_CUT|ROTATE
|
||||
## SGF22 - *97*
|
||||
Autobind protocol
|
||||
|
||||
Model: SGF22
|
||||
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
|
||||
---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|MODE|FLIP|LIGHT|PHOTO|VIDEO|TRIMRESET
|
||||
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.
|
||||
|
||||
### Sub_protocol F22
|
||||
Model: SG F22
|
||||
|
||||
Mode: -100% = 3D, 0% = 6G, 100% = Vertical
|
||||
|
||||
Model: FlyBear FX922
|
||||
|
||||
Manual CH11=-100% & CH12=-100%, Balance CH11=+100% & CH12=-100%, Large Angle Balance CH11=-100% & CH12=+100%
|
||||
|
||||
### Sub_protocol F22S
|
||||
Model: ParkTen F22S
|
||||
|
||||
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)
|
||||
|
||||
### 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
|
||||
|
||||
## Shenqi - *19*
|
||||
Autobind protocol
|
||||
@@ -2023,6 +2278,15 @@ CH1|CH2|CH3|CH4
|
||||
|
||||
Throttle +100%=full forward,0%=stop,-100%=full backward.
|
||||
|
||||
## Shenqi2 - *105*
|
||||
Autobind protocol
|
||||
|
||||
Model: Shenqiwei 1/20 Mini Motorcycle
|
||||
|
||||
CH1|CH2
|
||||
---|---
|
||||
ST|TH
|
||||
|
||||
## Symax - *10*
|
||||
Autobind protocol
|
||||
|
||||
@@ -2087,18 +2351,18 @@ RTN_ACT and RTN: -100% disable, +100% enable
|
||||
### Sub_protocol 3CH - *0*
|
||||
Models: Volantex V761-1, V761-3 and may be others
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
|
||||
---|---|---|---|---|---|---|---|---
|
||||
-|E|T|R|GYRO|CALIB|FLIP|RTN_ACT|RTN
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10
|
||||
---|---|---|---|---|---|---|---|---|---
|
||||
-|E|T|R|GYRO|CALIB|FLIP|RTN_ACT|RTN|BEEP
|
||||
|
||||
### Sub_protocol 4CH - *1*
|
||||
Models: Volantex V761-4+ and Eachine P51-D, F4U, F22 and may be others
|
||||
|
||||
If the model (761-11 and above) sends telemetry then the battery status ok/empty is in A1 (4.4V -> 2.2V) and RSSI gets a dummy value of 100.
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
|
||||
---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|GYRO|CALIB|FLIP|RTN_ACT|RTN
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10
|
||||
---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|GYRO|CALIB|FLIP|RTN_ACT|RTN|BEEP
|
||||
|
||||
### Sub_protocol TOPRC - *2*
|
||||
Models: Top RC Hobby Spitfire, P51D, BF-109
|
||||
@@ -2107,6 +2371,19 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
|
||||
---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|GYRO|CALIB|FLIP|RTN_ACT|RTN
|
||||
|
||||
## WPL - *107*
|
||||
TX: "Basic", Models: D12 / D12KM / D22 / D32 / D42 / D14
|
||||
|
||||
**Only 1 ID** available. If you have a TX contact me on GitHub or RCGroups.
|
||||
|
||||
Autobind protocol
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7
|
||||
---|---|---|---|---|---|---
|
||||
TH|ST|ST_Trim|Aux|Light|TH_Rate|ST_Rate
|
||||
|
||||
Light: -100%=Off, +100%=On, Rate: -100%=Low, +100%=High
|
||||
|
||||
## XERALL - *91*
|
||||
Model: Xerall TankCopter
|
||||
|
||||
@@ -2144,6 +2421,16 @@ A|E|T|R|FLIP|LIGHT|PICTURE|VIDEO|HEADLESS
|
||||
### Sub_protocol NIHUI - *4*
|
||||
Same channels assignement as above.
|
||||
|
||||
## YuXiang - *100*
|
||||
|
||||
Models: E190 F07 UH-1D, E186 F08 Bell-206
|
||||
|
||||
Telemetry A1=Batt voltage with a Ratio 3.5 and Offset 7, A2=Low batt with 0=OK, everything else=BAD
|
||||
|
||||
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11
|
||||
---|---|---|---|---|---|---|---|---|---|---
|
||||
A|E|T|R|LOCK|RATE|LAND|MANUAL|FLIP|MODE|PITCH
|
||||
|
||||
## ZSX - *52*
|
||||
Model: JJRC ZSX-280
|
||||
|
||||
|
||||
@@ -100,9 +100,9 @@ For example, if you have no interest in binding your Tx to an model with and FrS
|
||||
|
||||
## **Choice 3:** Which protocols to upload to the MULTI-Module
|
||||
|
||||
In the case of the ATmega328, the memory required by all the possible protocols exceeds the 32KB flash limit considerably. This means that you will need to make a choice of which protocols you will compile into your firmware. Fortunately, the process of selecting and compiling is not too difficult and it is fully documented on the [Compiling and Programming](docs/Compiling.md) page.
|
||||
As the list of supported protocols grows even the STM32 ARM microcontroller cannot hold all of the protocols. You can select the protocols you need and complie your own firmware. Fortunately, the process of selecting and compiling is not too difficult and it is fully documented on the [Compiling and Programming](docs/Compiling.md) page. You can also download firmware from the [Multi-Module](https://downloads.multi-module.org) website. These firmware files have been split into two groups, surface "SFC" and air "AIR". You can check which protocols are included in each of these groups in the [Validate.h](Multiprotocol/Validate.h) source file.
|
||||
|
||||
An alternative is to use a STM32 ARM microcontroller based module which can hold all the protocols.
|
||||
In the case of the ATmega328, the memory required by all the possible protocols exceeds the 32KB flash limit considerably. This means that you will need to make a choice of which protocols you will compile into your firmware.
|
||||
|
||||
## **Choice 4:** Choosing the type of interface between the MULTI-Module and your radio (PPM or Serial)
|
||||
|
||||
|
||||
@@ -5,8 +5,7 @@ exitcode=0;
|
||||
|
||||
# CC2500-only 64Kb FCC builds
|
||||
printf "\e[33;1mBuilding mm-stm-cc2500-64-aetr-v$MULTI_VERSION.bin\e[0m\n";
|
||||
#opt_enable $ALL_PROTOCOLS;
|
||||
#opt_disable IKEAANSLUTA_CC2500_INO;
|
||||
opt_disable SCANNER_CC2500_INO;
|
||||
opt_disable ENABLE_PPM;
|
||||
opt_disable A7105_INSTALLED;
|
||||
opt_disable CYRF6936_INSTALLED;
|
||||
|
||||
@@ -108,7 +108,7 @@ The images below indicate the pin layout and the location of the ground pin on t
|
||||
|:---:|:---:|:---:|
|
||||
<img src="images/V2b_ISP.jpeg" width="189" height="200" /> | <img src="images/MPTM_PCB_2.3d_ISP.png" width="486" height="201" /> | <img src="images/ProMini_ISP.png" width="195" height="200" /> |
|
||||
|
||||
You are now ready to plug in the USB programmer to the computer. If you are looking for a good working USBasp Windows driver, [use this one](http://www.protostack.com/download/USBasp-win-driver-x86-x64-v3.0.7.zip).
|
||||
You are now ready to plug in the USB programmer to the computer. If you are looking for a good working USBasp Windows driver, [use this one](https://protostack.com.au/download/USBasp-win-driver-x86-x64-v3.0.7.zip).
|
||||
|
||||
### Burn bootloader and set fuses
|
||||
The bootloader only needs to be burned once, unless you decide to switch from one option to the other (or it is accidentally erased). If you have already burned the bootloader / set the fuses you can skip this step.
|
||||
|
||||
Reference in New Issue
Block a user