Skip to content

Commit a07c23b

Browse files
committed
New car protocol JIABAILE
1 parent b5b2dc3 commit a07c23b

8 files changed

+337
-1
lines changed

Lua_scripts/MultiChan.txt

+1
Original file line numberDiff line numberDiff line change
@@ -226,3 +226,4 @@
226226
61,0,EazyRC
227227
98,0,Kyosho3,ASF,0
228228
100,0,YuXiang,Std,0,Lock,Rate,Land,Manual,Flip,Mode,Pitch
229+
102,0,JIABAILE,Std,1,Speed,Light,Flash

Multiprotocol/JIABAILE_nrf24l01.ino

+315
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,315 @@
1+
/*
2+
This project is free software: you can redistribute it and/or modify
3+
it under the terms of the GNU General Public License as published by
4+
the Free Software Foundation, either version 3 of the License, or
5+
(at your option) any later version.
6+
7+
Multiprotocol is distributed in the hope that it will be useful,
8+
but WITHOUT ANY WARRANTY; without even the implied warranty of
9+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10+
GNU General Public License for more details.
11+
12+
You should have received a copy of the GNU General Public License
13+
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
14+
*/
15+
#if defined(JIABAILE_NRF24L01_INO)
16+
17+
#include "iface_xn297.h"
18+
19+
//#define FORCE_JIABAILE_ORIGINAL_ID
20+
21+
#define JIABAILE_PAYLOAD_SIZE 8
22+
#define JIABAILE_RX_PAYLOAD_SIZE 7
23+
#define JIABAILE_RF_NUM_CHANNELS 3
24+
#define JIABAILE_BIND_PACKET_PERIOD 12700
25+
#define JIABAILE_PACKET_PERIOD 2408
26+
#define JIABAILE_BIND_COUNT 2000
27+
#define JIABAILE_WRITE_TIME 1000
28+
29+
enum {
30+
JIABAILE_BIND=0,
31+
JIABAILE_RX,
32+
JIABAILE_DATA,
33+
};
34+
35+
static uint8_t __attribute__((unused)) JIABAILE_channel(uint8_t num)
36+
{
37+
uint8_t val=convert_channel_16b_limit(num,0,100);
38+
if(val>50)
39+
{
40+
packet[3] |= 0x01;
41+
return val-50;
42+
}
43+
if(val<50)
44+
{
45+
packet[3] |= 0x02;
46+
return 50-val;
47+
}
48+
return 0;
49+
}
50+
51+
static void __attribute__((unused)) JIABAILE_send_packet()
52+
{
53+
hopping_frequency_no++;
54+
if(hopping_frequency_no > 2)
55+
hopping_frequency_no = 0;
56+
XN297_Hopping(hopping_frequency_no);
57+
58+
memcpy(packet,rx_tx_addr,3);
59+
memset(&packet[3], 0x00, 4);
60+
if(IS_BIND_DONE)
61+
{//Normal
62+
packet[4] = convert_channel_16b_limit(RUDDER,0,50)-25; //ST Trim
63+
packet[6] = JIABAILE_channel(AILERON); //ST
64+
packet[3] ^= 0x03; //Reverse ST channel
65+
packet[3] <<= 2; //Move ST channel where it should be
66+
packet[5] = JIABAILE_channel(ELEVATOR); //TH
67+
packet[3] |= GET_FLAG(CH5_SW, 0x20) //Low speed
68+
|GET_FLAG(CH7_SW, 0x40) //Flash light
69+
|GET_FLAG(!CH6_SW, 0x80); //Light
70+
if(!CH5_SW && Channel_data[CH5] > CHANNEL_MIN_COMMAND)
71+
packet[3] |= 0x10; //Mid speed
72+
}
73+
packet[7] = 0x55 + hopping_frequency[hopping_frequency_no];
74+
for(uint8_t i=0;i<JIABAILE_PAYLOAD_SIZE-1;i++)
75+
packet[7] += packet[i];
76+
// Send
77+
XN297_SetPower();
78+
XN297_SetTxRxMode(TX_EN);
79+
XN297_WritePayload(packet, JIABAILE_PAYLOAD_SIZE);
80+
#ifdef ADEBUG_SERIAL
81+
debug("H%d RF%d",hopping_frequency_no,hopping_frequency[hopping_frequency_no]);
82+
for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE; i++)
83+
debug(" %02X", packet[i]);
84+
debugln();
85+
#endif
86+
}
87+
88+
static void __attribute__((unused)) JIABAILE_initialize_txid()
89+
{
90+
rx_tx_addr[0] = rx_tx_addr[3];
91+
#ifdef FORCE_JIABAILE_ORIGINAL_ID
92+
memcpy(rx_tx_addr,(uint8_t *)"\xCB\x03\xA5",3);
93+
//memcpy(rx_tx_addr,(uint8_t *)"\x3D\x08\xA2",3);
94+
//Normal frequencies are calculated from the car ID...
95+
//memcpy(&hopping_frequency[3],(uint8_t *)"\x23\x2D\x4B",3); //35,45,75
96+
memcpy(&hopping_frequency[3],(uint8_t *)"\x24\x43\x4C",3); //36,67,76
97+
#endif
98+
//Bind frequencies
99+
memcpy(hopping_frequency,(uint8_t *)"\x07\x27\x45",3); //7,39,69
100+
}
101+
102+
static void __attribute__((unused)) JIABAILE_RF_init()
103+
{
104+
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
105+
//Bind address
106+
memcpy(rx_id,(uint8_t*)"\xA7\x07\x57\xA7\x26", 5);
107+
XN297_SetTXAddr(rx_id, 5);
108+
XN297_SetRXAddr(rx_id, JIABAILE_RX_PAYLOAD_SIZE);
109+
}
110+
111+
uint16_t JIABAILE_callback()
112+
{
113+
switch(phase)
114+
{
115+
case JIABAILE_BIND:
116+
if(XN297_IsRX())
117+
{
118+
if(XN297_ReadPayload(packet_in, JIABAILE_RX_PAYLOAD_SIZE))
119+
{//CRC OK
120+
#ifdef DEBUG_SERIAL
121+
debug("RX");
122+
for(uint8_t i=0; i < JIABAILE_RX_PAYLOAD_SIZE; i++)
123+
debug(" %02X", packet_in[i]);
124+
debugln();
125+
#endif
126+
//RX: CB 03 A5 9D 05 A2 68
127+
if(memcmp(packet_in,rx_tx_addr,3)==0)
128+
{//TX ID match
129+
//Check packet
130+
uint8_t sum=0xAA + hopping_frequency[hopping_frequency_no];
131+
for(uint8_t i=0; i < JIABAILE_RX_PAYLOAD_SIZE-1; i++)
132+
sum+=packet_in[i];
133+
if(sum==packet_in[6])
134+
{
135+
//Write the RXID in the address
136+
memcpy(&rx_id[1],&packet_in[3],3);
137+
XN297_SetTxRxMode(TXRX_OFF);
138+
XN297_SetTXAddr(rx_id, 5);
139+
//Set the normal frequencies
140+
sum=packet_in[3]&0x07;
141+
hopping_frequency[0] = (sum>4?30:8) + sum;
142+
if(sum==4 || sum ==7)
143+
hopping_frequency[0]++;
144+
hopping_frequency[1] = 40 + sum;
145+
if((sum & 0x06) == 0x06)
146+
hopping_frequency[1] += 21;
147+
hopping_frequency[2] = 70 + sum;
148+
#ifdef DEBUG_SERIAL
149+
debug("RF");
150+
for(uint8_t i=0; i < 3; i++)
151+
debug(" %d", hopping_frequency[i]);
152+
debugln();
153+
#endif
154+
//Switch to normal mode
155+
BIND_DONE;
156+
phase = JIABAILE_DATA;
157+
}
158+
#ifdef DEBUG_SERIAL
159+
else
160+
debug("Wrong Sum");
161+
}
162+
else
163+
debug("Wrong TX ID");
164+
}
165+
else
166+
debug("Bad CRC");
167+
debugln("");
168+
#else
169+
}
170+
}
171+
#endif
172+
}
173+
XN297_SetTxRxMode(TXRX_OFF);
174+
JIABAILE_send_packet();
175+
phase++;
176+
return JIABAILE_WRITE_TIME;
177+
case JIABAILE_RX:
178+
//Wait for the packet transmission to finish
179+
while(XN297_IsPacketSent()==false);
180+
//Switch to RX
181+
XN297_SetTxRxMode(TXRX_OFF);
182+
XN297_SetTxRxMode(RX_EN);
183+
phase = JIABAILE_BIND;
184+
return JIABAILE_BIND_PACKET_PERIOD - JIABAILE_WRITE_TIME;
185+
default: //JIABAILE_DATA
186+
#ifdef MULTI_SYNC
187+
telemetry_set_input_sync(JIABAILE_PACKET_PERIOD);
188+
#endif
189+
JIABAILE_send_packet();
190+
break;
191+
}
192+
return JIABAILE_PACKET_PERIOD;
193+
}
194+
195+
void JIABAILE_init()
196+
{
197+
BIND_IN_PROGRESS; // Autobind protocol
198+
JIABAILE_initialize_txid();
199+
JIABAILE_RF_init();
200+
phase = JIABAILE_BIND;
201+
hopping_frequency_no = 0;
202+
}
203+
204+
#endif
205+
/*
206+
// CAR RX debug code
207+
208+
static void __attribute__((unused)) JIABAILE_RF_init()
209+
{
210+
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
211+
//Bind address
212+
memcpy(rx_id,(uint8_t*)"\xA7\x07\x57\xA7\x26", 5);
213+
XN297_SetTXAddr(rx_id, 5);
214+
XN297_SetRXAddr(rx_id, JIABAILE_PAYLOAD_SIZE);
215+
XN297_RFChannel(7);
216+
rx_tx_addr[0] = 0x00;
217+
rx_tx_addr[1] = RX_num;
218+
rx_tx_addr[2] = 0x00;
219+
}
220+
221+
uint16_t JIABAILE_callback()
222+
{
223+
switch(phase)
224+
{
225+
case JIABAILE_BIND:
226+
if(XN297_IsRX())
227+
{
228+
if(XN297_ReadPayload(packet_in, JIABAILE_PAYLOAD_SIZE))
229+
{//CRC OK
230+
XN297_SetTxRxMode(TXRX_OFF);
231+
#ifdef DEBUG_SERIAL
232+
debug("RX Bind");
233+
for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE; i++)
234+
debug(" %02X", packet_in[i]);
235+
debugln();
236+
#endif
237+
memcpy(packet,packet_in,3);
238+
memcpy(&packet[3],rx_tx_addr,3);
239+
packet[6]=0xAA + 7;
240+
for(uint8_t i=0; i < JIABAILE_RX_PAYLOAD_SIZE-1; i++)
241+
packet[6]+=packet[i];
242+
XN297_SetTxRxMode(TX_EN);
243+
memcpy(&rx_id[1],rx_tx_addr,3);
244+
bind_counter = 10;
245+
phase = JIABAILE_RX;
246+
}
247+
}
248+
return JIABAILE_WRITE_TIME;
249+
case JIABAILE_RX:
250+
if(bind_counter)
251+
{
252+
bind_counter--;
253+
XN297_WritePayload(packet, JIABAILE_RX_PAYLOAD_SIZE);
254+
#ifdef DEBUG_SERIAL
255+
debug("TX Bind");
256+
for(uint8_t i=0; i < JIABAILE_RX_PAYLOAD_SIZE; i++)
257+
debug(" %02X", packet[i]);
258+
debugln();
259+
#endif
260+
return JIABAILE_PACKET_PERIOD;
261+
}
262+
//Wait for the packet transmission to finish
263+
//while(XN297_IsPacketSent()==false);
264+
//Switch to RX
265+
XN297_SetTxRxMode(TXRX_OFF);
266+
XN297_SetRXAddr(rx_id, JIABAILE_PAYLOAD_SIZE);
267+
hopping_frequency_no++;
268+
if(hopping_frequency_no>84)
269+
hopping_frequency_no = 0;
270+
debug(".");
271+
XN297_RFChannel(hopping_frequency_no);
272+
XN297_SetTxRxMode(RX_EN);
273+
phase = JIABAILE_DATA;
274+
return JIABAILE_BIND_PACKET_PERIOD;
275+
case JIABAILE_DATA:
276+
if(XN297_IsRX())
277+
{
278+
debugln("");
279+
if(XN297_ReadPayload(packet_in, JIABAILE_PAYLOAD_SIZE))
280+
{//CRC OK
281+
#ifdef DEBUG_SERIAL
282+
debug("CH=%d=%02X P:",hopping_frequency_no,hopping_frequency_no);
283+
for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE; i++)
284+
debug(" %02X", packet_in[i]);
285+
#endif
286+
//Check packet
287+
uint8_t sum=0x55 + hopping_frequency_no;
288+
for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE-1; i++)
289+
sum+=packet_in[i];
290+
if(sum==packet_in[7])
291+
{
292+
debug("Good channel");
293+
}
294+
else
295+
debug("Wrong Sum");
296+
}
297+
else
298+
debug("Bad CRC");
299+
debugln("");
300+
}
301+
phase = JIABAILE_RX;
302+
break;
303+
}
304+
return JIABAILE_PACKET_PERIOD;
305+
}
306+
307+
void JIABAILE_init()
308+
{
309+
JIABAILE_RF_init();
310+
XN297_SetTxRxMode(TXRX_OFF);
311+
XN297_SetTxRxMode(RX_EN);
312+
phase = JIABAILE_BIND;
313+
hopping_frequency_no = 7;
314+
}
315+
*/

Multiprotocol/Multi.txt

+1
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,4 @@
9797
98,Kyosho3
9898
99,XK2
9999
100,YuXiang
100+
102,JIABAILE

Multiprotocol/Multi_Protos.ino

+4
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ const char STR_EAZYRC[] ="EazyRC";
113113
const char STR_KYOSHO3[] ="Kyosho3";
114114
const char STR_YUXIANG[] ="YuXiang";
115115
const char STR_PINECONE[] ="PineCone";
116+
const char STR_JIABAILE[] ="JIABAILE";
116117

117118
const char STR_SUBTYPE_FLYSKY[] = "\x04""Std\0""V9x9""V6x6""V912""CX20";
118119
const char STR_SUBTYPE_HUBSAN[] = "\x04""H107""H301""H501";
@@ -375,6 +376,9 @@ const mm_protocol_definition multi_protocols[] = {
375376
#if defined(J6PRO_CYRF6936_INO)
376377
{PROTO_J6PRO, STR_J6PRO, NO_SUBTYPE, 0, OPTION_NONE, 0, 1, SW_CYRF, J6PRO_init, J6PRO_callback },
377378
#endif
379+
#if defined(JIABAILE_NRF24L01_INO)
380+
{PROTO_JIABAILE, STR_JIABAILE, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, JIABAILE_init, JIABAILE_callback },
381+
#endif
378382
#if defined(JJRC345_NRF24L01_INO)
379383
{PROTO_JJRC345, STR_JJRC345, STR_SUBTYPE_JJRC345, 2, OPTION_NONE, 0, 0, SW_NRF, JJRC345_init, JJRC345_callback },
380384
#endif

Multiprotocol/Multiprotocol.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#define VERSION_MAJOR 1
2020
#define VERSION_MINOR 3
2121
#define VERSION_REVISION 4
22-
#define VERSION_PATCH_LEVEL 23
22+
#define VERSION_PATCH_LEVEL 24
2323

2424
#define MODE_SERIAL 0
2525

@@ -129,6 +129,7 @@ enum PROTOCOLS
129129
PROTO_XK2 = 99, // =>CC2500 & NRF24L01
130130
PROTO_YUXIANG = 100, // =>NRF24L01
131131
PROTO_PINECONE = 101, // =>CC2500 & NRF24L01
132+
PROTO_JIABAILE = 102, // =>NRF24L01
132133

133134
PROTO_NANORF = 126, // =>NRF24L01
134135
PROTO_TEST = 127, // =>CC2500

Multiprotocol/Validate.h

+2
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@
323323
#undef H8_3D_NRF24L01_INO
324324
#undef HISKY_NRF24L01_INO
325325
#undef HONTAI_NRF24L01_INO
326+
#undef JIABAILE_NRF24L01_INO
326327
#undef JJRC345_NRF24L01_INO
327328
#undef KN_NRF24L01_INO
328329
#undef KYOSHO2_NRF24L01_INO
@@ -388,6 +389,7 @@
388389
#undef KYOSHO3_CYRF6936_INO
389390
#undef MOULDKG_NRF24L01_INO
390391
#undef SHENQI_NRF24L01_INO
392+
#undef JIABAILE_NRF24L01_INO
391393
#endif
392394

393395
#ifdef MULTI_SURFACE

Multiprotocol/_Config.h

+3
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@
243243
#define HISKY_NRF24L01_INO
244244
#define HONTAI_NRF24L01_INO
245245
#define H8_3D_NRF24L01_INO
246+
#define JIABAILE_NRF24L01_INO
246247
#define JJRC345_NRF24L01_INO
247248
#define KN_NRF24L01_INO
248249
#define KYOSHO2_NRF24L01_INO
@@ -732,6 +733,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
732733
NONE
733734
PROTO_J6PRO
734735
NONE
736+
PROTO_JIABAILE
737+
NONE
735738
PROTO_JJRC345
736739
JJRC345
737740
SKYTMBLR

0 commit comments

Comments
 (0)