Compare commits

..

No commits in common. "565aaed0c73ebed2050f61dc308d725d9b05eccb" and "9e5e907f4aceae4a6989334b034c72ebc87b06f0" have entirely different histories.

9 changed files with 83 additions and 310 deletions

View File

@ -195,7 +195,6 @@
62,1,XK,X420,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light 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 62,2,XK,Cars,0,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light
99,0,XK2,X4,0,Rate,Mode,Hover,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,0,YD717,Std,1,Flip,Light,Pict,Video,HLess
8,1,YD717,SkyWlkr,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 8,2,YD717,Simax4,1,Flip,Light,Pict,Video,HLess
@ -228,6 +227,5 @@
61,0,EazyRC 61,0,EazyRC
98,0,Kyosho3,ASF,0 98,0,Kyosho3,ASF,0
100,0,YuXiang,Std,0,Lock,Rate,Land,Manual,Flip,Mode,Pitch 100,0,YuXiang,Std,0,Lock,Rate,Land,Manual,Flip,Mode,Pitch
102,0,JIABAILE,Std,0,Speed,Light,Flash 102,0,JIABAILE,Std,1,Speed,Light,Flash
102,1,JIABAILE,Gyro,0,Speed,Light,Flash,Tr_ST
103,0,H36,Std,1,Flip,HLess,RTH 103,0,H36,Std,1,Flip,HLess,RTH

View File

@ -17,14 +17,12 @@ Multiprotocol is distributed in the hope that it will be useful,
#include "iface_xn297.h" #include "iface_xn297.h"
//#define FORCE_JIABAILE_ORIGINAL_ID //#define FORCE_JIABAILE_ORIGINAL_ID
//#define FORCE_JIABAILE_GYRO_ORIGINAL_ID
#define JIABAILE_PAYLOAD_SIZE 8 #define JIABAILE_PAYLOAD_SIZE 8
#define JIABAILE_RX_PAYLOAD_SIZE 7 #define JIABAILE_RX_PAYLOAD_SIZE 7
#define JIABAILE_RF_NUM_CHANNELS 3 #define JIABAILE_RF_NUM_CHANNELS 3
#define JIABAILE_BIND_PACKET_PERIOD 12700 #define JIABAILE_BIND_PACKET_PERIOD 12700
#define JIABAILE_PACKET_PERIOD 2408 #define JIABAILE_PACKET_PERIOD 2408
#define JIABAILE_GYRO_PACKET_PERIOD 8205
#define JIABAILE_BIND_COUNT 160 //2 sec #define JIABAILE_BIND_COUNT 160 //2 sec
#define JIABAILE_WRITE_TIME 1000 #define JIABAILE_WRITE_TIME 1000
@ -53,98 +51,43 @@ static uint8_t __attribute__((unused)) JIABAILE_channel(uint8_t num)
static void __attribute__((unused)) JIABAILE_send_packet() 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++; hopping_frequency_no = 0;
if(hopping_frequency_no > 2) XN297_Hopping(hopping_frequency_no);
hopping_frequency_no = 0;
XN297_Hopping(hopping_frequency_no);
}
if(sub_protocol == JIABAILE_STD) memcpy(packet,rx_tx_addr,3);
{//Std memset(&packet[3], 0x00, 4);
memcpy(packet,rx_tx_addr,3); if(IS_BIND_DONE)
memset(&packet[3], 0x00, 4); {//Normal
if(IS_BIND_DONE) packet[4] = convert_channel_16b_limit(RUDDER,0,50)-25; //ST Trim
{//Normal packet[6] = JIABAILE_channel(AILERON); //ST
packet[4] = convert_channel_16b_limit(RUDDER,0,50)-25; //ST Trim packet[3] ^= 0x03; //Reverse ST channel
packet[6] = JIABAILE_channel(AILERON); //ST packet[3] <<= 2; //Move ST channel where it should be
packet[3] ^= 0x03; //Reverse ST channel packet[5] = JIABAILE_channel(ELEVATOR); //TH
packet[3] <<= 2; //Move ST channel where it should be packet[3] |= GET_FLAG(CH5_SW, 0x20) //Low speed
packet[5] = JIABAILE_channel(ELEVATOR); //TH |GET_FLAG(CH7_SW, 0x40) //Flash light
packet[3] |= GET_FLAG(CH5_SW, 0x20) //Low speed |GET_FLAG(!CH6_SW, 0x80); //Light
|GET_FLAG(CH7_SW, 0x40) //Flash light if(!CH5_SW && Channel_data[CH5] > CHANNEL_MIN_COMMAND)
|GET_FLAG(!CH6_SW, 0x80); //Light packet[3] |= 0x10; //Mid speed
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 else
{//Gyro {
if(bind_counter) bind_counter--;
if(!bind_counter)
{ {
bind_counter--; BIND_DONE;
if(!bind_counter) phase = JIABAILE_PREP_DATA;
{
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;
} }
packet[7] = 0x55 + hopping_frequency[hopping_frequency_no];
for(uint8_t i=0;i<JIABAILE_PAYLOAD_SIZE-1;i++)
packet[7] += packet[i];
// Send // Send
XN297_SetPower(); XN297_SetPower();
XN297_SetTxRxMode(TX_EN); XN297_SetTxRxMode(TX_EN);
XN297_WritePayload(packet, JIABAILE_PAYLOAD_SIZE); XN297_WritePayload(packet, JIABAILE_PAYLOAD_SIZE);
#if 0 #ifdef DEBUG_SERIAL
debug("B%d ",bind_counter);
debug("H%d RF%d",hopping_frequency_no,hopping_frequency[hopping_frequency_no]); debug("H%d RF%d",hopping_frequency_no,hopping_frequency[hopping_frequency_no]);
for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE; i++) for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE; i++)
debug(" %02X", packet[i]); debug(" %02X", packet[i]);
@ -154,56 +97,25 @@ static void __attribute__((unused)) JIABAILE_send_packet()
static void __attribute__((unused)) JIABAILE_initialize_txid() static void __attribute__((unused)) JIABAILE_initialize_txid()
{ {
if(sub_protocol == JIABAILE_STD) rx_tx_addr[0] = rx_tx_addr[3];
{//Std #ifdef FORCE_JIABAILE_ORIGINAL_ID
rx_tx_addr[0] = rx_tx_addr[3]; memcpy(rx_tx_addr,(uint8_t *)"\xCB\x03\xA5",3);
#ifdef FORCE_JIABAILE_ORIGINAL_ID //memcpy(rx_tx_addr,(uint8_t *)"\x3D\x08\xA2",3);
memcpy(rx_tx_addr,(uint8_t *)"\xCB\x03\xA5",3); //Normal frequencies are calculated from the car ID...
//memcpy(rx_tx_addr,(uint8_t *)"\x3D\x08\xA2",3); //memcpy(&hopping_frequency[3],(uint8_t *)"\x23\x2D\x4B",3); //35,45,75
//Normal frequencies are calculated from the car ID... memcpy(&hopping_frequency[3],(uint8_t *)"\x24\x43\x4C",3); //36,67,76
//memcpy(&hopping_frequency[3],(uint8_t *)"\x23\x2D\x4B",3); //35,45,75 #endif
memcpy(&hopping_frequency[3],(uint8_t *)"\x24\x43\x4C",3); //36,67,76 //Bind frequencies
#endif memcpy(hopping_frequency,(uint8_t *)"\x07\x27\x45",3); //7,39,69
//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() static void __attribute__((unused)) JIABAILE_RF_init()
{ {
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M); XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
//Bind address //Bind address
if(sub_protocol == JIABAILE_STD) memcpy(rx_id,(uint8_t*)"\xA7\x07\x57\xA7\x26", 5);
{//Std XN297_SetTXAddr(rx_id, 5);
memcpy(rx_id,(uint8_t*)"\xA7\x07\x57\xA7\x26", 5); XN297_SetRXAddr(rx_id, JIABAILE_RX_PAYLOAD_SIZE);
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() uint16_t JIABAILE_callback()
@ -304,35 +216,25 @@ uint16_t JIABAILE_callback()
phase++; phase++;
default: //JIABAILE_DATA default: //JIABAILE_DATA
#ifdef MULTI_SYNC #ifdef MULTI_SYNC
telemetry_set_input_sync(packet_period); telemetry_set_input_sync(JIABAILE_PACKET_PERIOD);
#endif #endif
JIABAILE_send_packet(); JIABAILE_send_packet();
break; break;
} }
return packet_period; return JIABAILE_PACKET_PERIOD;
} }
void JIABAILE_init() void JIABAILE_init()
{ {
JIABAILE_initialize_txid(); JIABAILE_initialize_txid();
JIABAILE_RF_init(); JIABAILE_RF_init();
if(sub_protocol == JIABAILE_STD) if(IS_BIND_IN_PROGRESS)
{//Std {
if(IS_BIND_IN_PROGRESS) phase = JIABAILE_BIND;
{ bind_counter = JIABAILE_BIND_COUNT;
phase = JIABAILE_BIND;
bind_counter = JIABAILE_BIND_COUNT;
}
else
phase = JIABAILE_PREP_DATA;
packet_period = JIABAILE_PACKET_PERIOD;
} }
else else
{//Gyro phase = JIABAILE_PREP_DATA;
phase = JIABAILE_DATA;
bind_counter = IS_BIND_IN_PROGRESS?JIABAILE_BIND_COUNT>>2:1;
packet_period = JIABAILE_GYRO_PACKET_PERIOD;
}
hopping_frequency_no = 0; hopping_frequency_no = 0;
} }

View File

@ -95,7 +95,7 @@
96,BumbleB 96,BumbleB
97,SGF22,F22,F22S,J20 97,SGF22,F22,F22S,J20
98,Kyosho3 98,Kyosho3
99,XK2,X4,P10 99,XK2
100,YuXiang 100,YuXiang
102,JIABAILE,STD,GYRO 102,JIABAILE
103,H36 103,H36

View File

@ -165,7 +165,6 @@ const char STR_SUBTYPE_ESKY150[] = "\x03""4ch""7ch";
const char STR_SUBTYPE_ESKY150V2[] = "\x05""150V2"; const char STR_SUBTYPE_ESKY150V2[] = "\x05""150V2";
const char STR_SUBTYPE_V911S[] = "\x05""V911S""E119\0"; const char STR_SUBTYPE_V911S[] = "\x05""V911S""E119\0";
const char STR_SUBTYPE_XK[] = "\x04""X450""X420""Cars"; 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_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_ESKY[] = "\x03""Std""ET4";
const char STR_SUBTYPE_PROPEL[] = "\x04""74-Z"; const char STR_SUBTYPE_PROPEL[] = "\x04""74-Z";
@ -186,7 +185,6 @@ const char STR_SUBTYPE_KF606[] = "\x06""KF606\0""MIG320""ZCZ50\0";
const char STR_SUBTYPE_E129[] = "\x04""E129""C186"; 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[] = "\x04""816\0""620\0""9630""Q560";
const char STR_SUBTYPE_SGF22[] = "\x04""F22\0""F22S""J20\0"; const char STR_SUBTYPE_SGF22[] = "\x04""F22\0""F22S""J20\0";
const char STR_SUBTYPE_JIABAILE[] = "\x04""Std\0""Gyro";
#define NO_SUBTYPE nullptr #define NO_SUBTYPE nullptr
#ifdef SEND_CPPM #ifdef SEND_CPPM
@ -383,7 +381,7 @@ const mm_protocol_definition multi_protocols[] = {
{PROTO_J6PRO, STR_J6PRO, NO_SUBTYPE, 0, OPTION_NONE, 0, 1, SW_CYRF, J6PRO_init, J6PRO_callback }, {PROTO_J6PRO, STR_J6PRO, NO_SUBTYPE, 0, OPTION_NONE, 0, 1, SW_CYRF, J6PRO_init, J6PRO_callback },
#endif #endif
#if defined(JIABAILE_NRF24L01_INO) #if defined(JIABAILE_NRF24L01_INO)
{PROTO_JIABAILE, STR_JIABAILE, STR_SUBTYPE_JIABAILE, 2, OPTION_NONE, 0, 0, SW_NRF, JIABAILE_init, JIABAILE_callback }, {PROTO_JIABAILE, STR_JIABAILE, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, JIABAILE_init, JIABAILE_callback },
#endif #endif
#if defined(JJRC345_NRF24L01_INO) #if defined(JJRC345_NRF24L01_INO)
{PROTO_JJRC345, STR_JJRC345, STR_SUBTYPE_JJRC345, 2, OPTION_NONE, 0, 0, SW_NRF, JJRC345_init, JJRC345_callback }, {PROTO_JJRC345, STR_JJRC345, STR_SUBTYPE_JJRC345, 2, OPTION_NONE, 0, 0, SW_NRF, JJRC345_init, JJRC345_callback },
@ -513,7 +511,7 @@ const mm_protocol_definition multi_protocols[] = {
{PROTO_XK, STR_XK, STR_SUBTYPE_XK, 3, OPTION_RFTUNE, 0, 0, SW_NRF, XK_init, XK_callback }, {PROTO_XK, STR_XK, STR_SUBTYPE_XK, 3, OPTION_RFTUNE, 0, 0, SW_NRF, XK_init, XK_callback },
#endif #endif
#if defined(XK2_CCNRF_INO) #if defined(XK2_CCNRF_INO)
{PROTO_XK2, STR_XK2, STR_SUBTYPE_XK2, 2, OPTION_RFTUNE, 0, 0, SW_NRF, XK2_init, XK2_callback }, {PROTO_XK2, STR_XK2, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, XK2_init, XK2_callback },
#endif #endif
#if defined(XN297DUMP_NRF24L01_INO) #if defined(XN297DUMP_NRF24L01_INO)
{PROTO_XN297DUMP, STR_XN297DUMP, STR_SUBTYPE_XN297DUMP, 7, 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 },

View File

@ -19,7 +19,7 @@
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 3 #define VERSION_MINOR 3
#define VERSION_REVISION 4 #define VERSION_REVISION 4
#define VERSION_PATCH_LEVEL 31 #define VERSION_PATCH_LEVEL 28
#define MODE_SERIAL 0 #define MODE_SERIAL 0
@ -495,16 +495,6 @@ enum SGF22
SGF22_F22S = 1, SGF22_F22S = 1,
SGF22_J20 = 2, SGF22_J20 = 2,
}; };
enum JIABAILE
{
JIABAILE_STD = 0,
JIABAILE_GYRO = 1,
};
enum XK2
{
XK2_X4 = 0,
XK2_P10 = 1,
};
#define NONE 0 #define NONE 0
#define P_HIGH 1 #define P_HIGH 1

View File

@ -19,10 +19,8 @@ Multiprotocol is distributed in the hope that it will be useful,
#include "iface_xn297.h" #include "iface_xn297.h"
//#define FORCE_XK2_ID //#define FORCE_XK2_ID
//#define FORCE_XK2_P10_ID
#define XK2_RF_BIND_CHANNEL 71 #define XK2_RF_BIND_CHANNEL 71
#define XK2_P10_RF_BIND_CHANNEL 69
#define XK2_PAYLOAD_SIZE 9 #define XK2_PAYLOAD_SIZE 9
#define XK2_PACKET_PERIOD 4911 #define XK2_PACKET_PERIOD 4911
#define XK2_RF_NUM_CHANNELS 4 #define XK2_RF_NUM_CHANNELS 4
@ -48,7 +46,7 @@ static void __attribute__((unused)) XK2_send_packet()
//Unknown //Unknown
packet[7] = 0x00; packet[7] = 0x00;
//Checksum seed //Checksum seed
packet[8] = 0xC0; packet[8] = 0xC0; //Constant?
} }
else else
{ {
@ -76,7 +74,7 @@ static void __attribute__((unused)) XK2_send_packet()
| GET_FLAG(CH8_SW, 0x40); //Light | GET_FLAG(CH8_SW, 0x40); //Light
//Telemetry not received=00, Telemetry received=01 but sometimes switch to 1 even if telemetry is not there... //Telemetry not received=00, Telemetry received=01 but sometimes switch to 1 even if telemetry is not there...
packet[6] = 0x00; packet[6] = 0x00;
//RXID checksum //Unknown
packet[7] = crc8; //Sum RX_ID[0..2] packet[7] = crc8; //Sum RX_ID[0..2]
//Checksum seed //Checksum seed
packet[8] = num_ch; //Based on TX ID packet[8] = num_ch; //Based on TX ID
@ -84,8 +82,6 @@ static void __attribute__((unused)) XK2_send_packet()
//Checksum //Checksum
for(uint8_t i=0; i<XK2_PAYLOAD_SIZE-1; i++) for(uint8_t i=0; i<XK2_PAYLOAD_SIZE-1; i++)
packet[8] += packet[i]; packet[8] += packet[i];
if(sub_protocol == XK2_P10)
packet[8] += 0x10;
// Send // Send
XN297_SetFreqOffset(); XN297_SetFreqOffset();
@ -108,22 +104,11 @@ static void __attribute__((unused)) XK2_RF_init()
XN297_SetRXAddr((uint8_t*)"\xcc\xcc\xcc\xcc\xcc", XK2_PAYLOAD_SIZE); XN297_SetRXAddr((uint8_t*)"\xcc\xcc\xcc\xcc\xcc", XK2_PAYLOAD_SIZE);
XN297_HoppingCalib(XK2_RF_NUM_CHANNELS); XN297_HoppingCalib(XK2_RF_NUM_CHANNELS);
XN297_RFChannel(sub_protocol==XK2_X4?XK2_RF_BIND_CHANNEL:XK2_P10_RF_BIND_CHANNEL); XN297_RFChannel(XK2_RF_BIND_CHANNEL);
} }
static void __attribute__((unused)) XK2_initialize_txid() 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 #ifdef FORCE_XK2_ID
if(rx_tx_addr[3]&1) if(rx_tx_addr[3]&1)
{//Pascal {//Pascal
@ -142,15 +127,13 @@ static void __attribute__((unused)) XK2_initialize_txid()
//hopping frequencies 65=0x41, 69=0x45, 73=0x49, 77=0x4D //hopping frequencies 65=0x41, 69=0x45, 73=0x49, 77=0x4D
} }
#endif #endif
#ifdef FORCE_XK2_P10_ID rx_tx_addr[0] = rx_tx_addr[3]; // Use RX_num
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; rx_tx_addr[3] = rx_tx_addr[4] = 0xCC;
num_ch = 0x21 + rx_tx_addr[0] - rx_tx_addr[1] + rx_tx_addr[2];
for(uint8_t i=0;i<XK2_RF_NUM_CHANNELS;i++) // Are these RF frequencies always the same? It looks like yes...
hopping_frequency[i] = 65 + i*4; //65=0x41, 69=0x45, 73=0x49, 77=0x4D
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]); 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]);
} }
@ -177,8 +160,6 @@ uint16_t XK2_callback()
crc8 = 0xBF; crc8 = 0xBF;
for(uint8_t i=0; i<XK2_PAYLOAD_SIZE-1; i++) for(uint8_t i=0; i<XK2_PAYLOAD_SIZE-1; i++)
crc8 += packet[i]; crc8 += packet[i];
if(sub_protocol == XK2_P10)
crc8 += 0x10;
if(crc8 != packet[8]) if(crc8 != packet[8])
{ {
phase = XK2_BIND1; phase = XK2_BIND1;
@ -311,8 +292,8 @@ P[5] = flags
08=6g/3d=short_press_right sequece also switches for a few packets to C1 if 8 C0 if 0 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 P[6] = 00 telemetry nok
01 telemetry ok but sometimes switch to 1 also when telemetry is nok... 01 telemetry ok but sometimes switch to 1 also when telemetry is nok...
P[7] = 5A -> sum RX_ID[0..2] P[7] = 5A -> ?? RX_ID checksum ?? => sum RX_ID[0..2]
P[8] = sum P[0..7] + TX_ID[0] - TX_ID[1] + TX_ID[2] + 21 P[8] = sum P[0..7] + 7F
Telemetry Telemetry
RX on channel: 69, Time: 3408us P: 66 4F 47 00 00 00 00 00 C8 RX on channel: 69, Time: 3408us P: 66 4F 47 00 00 00 00 00 C8
@ -332,49 +313,4 @@ RF
2477 151753 5769 2477 151753 5769
2465 155330 3577 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
*/ */

View File

@ -17,12 +17,12 @@ Multiprotocol is distributed in the hope that it will be useful,
#include "iface_xn297.h" #include "iface_xn297.h"
//#define YUXIANG_FORCE_ID #define YUXIANG_FORCE_ID
#define YUXIANG_PACKET_PERIOD 12422 #define YUXIANG_PACKET_PERIOD 12422
#define YUXIANG_PACKET_SIZE 9 #define YUXIANG_PACKET_SIZE 9
#define YUXIANG_BIND_COUNT 150 #define YUXIANG_BIND_COUNT 150
#define YUXIANG_BIND_FREQ 0x30 //48 #define YUXIANG_BIND_FREQ 0x30
#define YUXIANG_RF_NUM_CHANNELS 4 #define YUXIANG_RF_NUM_CHANNELS 4
#define YUXIANG_WRITE_TIME 1000 #define YUXIANG_WRITE_TIME 1000
@ -118,43 +118,23 @@ static void __attribute__((unused)) YUXIANG_RF_init()
static void __attribute__((unused)) YUXIANG_initialize_txid() 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 #ifdef YUXIANG_FORCE_ID
switch(RX_num) if(rx_tx_addr[3] & 0x01)
{ {//TX1
case 0://TX1 memcpy(rx_tx_addr,(uint8_t *)"\xB3\x13\x36\xDD",4); //rx_tx_addr[4]=0xD9
memcpy(rx_tx_addr,(uint8_t *)"\xB3\x13\x36\xDD",4); //rx_tx_addr[4]=0xD9 memcpy(hopping_frequency,(uint8_t *)"\x49\x32\x35\x42",4);
memcpy(hopping_frequency,(uint8_t *)"\x42\x49\x32\x35",4); //66,73,50,53 }
break; else
case 1://TX2 {//TX2
memcpy(rx_tx_addr,(uint8_t *)"\xEB\x13\x36\xAC",4); //rx_tx_addr[4]=0xE0 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 memcpy(hopping_frequency,(uint8_t *)"\x4D\x3A\x3E\x47",4);
break;
} }
#endif #endif
uint8_t sum=0; uint8_t sum=0;
for(uint8_t i=0; i<4; i++) for(uint8_t i=0; i<4; i++)
sum += rx_tx_addr[i]; sum += rx_tx_addr[i];
rx_tx_addr[4] = sum; 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]); debugln("ID: %02X %02X %02X %02X %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],hopping_frequency[0],hopping_frequency[1],hopping_frequency[2],hopping_frequency[3]);
} }
uint16_t YUXIANG_callback() uint16_t YUXIANG_callback()

View File

@ -737,8 +737,7 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
PROTO_J6PRO PROTO_J6PRO
NONE NONE
PROTO_JIABAILE PROTO_JIABAILE
JIABAILE_STD NONE
JIABAILE_GYRO
PROTO_JJRC345 PROTO_JJRC345
JJRC345 JJRC345
SKYTMBLR SKYTMBLR
@ -873,8 +872,7 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
X420 X420
XK_CARS XK_CARS
PROTO_XK2 PROTO_XK2
XK2_X4 NONE
XK2_P10
PROTO_YD717 PROTO_YD717
YD717 YD717
SKYWLKR SKYWLKR

View File

@ -112,7 +112,7 @@ CFlie|38|CFlie||||||||NRF24L01|
[HoTT](Protocols_Details.md#HoTT---57)|57|Sync|No_Sync|||||||CC2500| [HoTT](Protocols_Details.md#HoTT---57)|57|Sync|No_Sync|||||||CC2500|
[Hubsan](Protocols_Details.md#HUBSAN---2)|2|H107|H301|H501||||||A7105| [Hubsan](Protocols_Details.md#HUBSAN---2)|2|H107|H301|H501||||||A7105|
[J6Pro](Protocols_Details.md#J6Pro---22)|22|||||||||CYRF6936| [J6Pro](Protocols_Details.md#J6Pro---22)|22|||||||||CYRF6936|
[JIABAILE](Protocols_Details.md#JIABAILE---102)|102|Std|Gyro|||||||NRF24L01|XN297 [JIABAILE](Protocols_Details.md#JIABAILE---102)|102|||||||||NRF24L01|XN297
[JJRC345](Protocols_Details.md#JJRC345---71)|71|JJRC345|SkyTmblr|||||||NRF24L01|XN297 [JJRC345](Protocols_Details.md#JJRC345---71)|71|JJRC345|SkyTmblr|||||||NRF24L01|XN297
[JOYSWAY](Protocols_Details.md#JOYSWAY---84)|84|||||||||NRF24L01|XN297 [JOYSWAY](Protocols_Details.md#JOYSWAY---84)|84|||||||||NRF24L01|XN297
[KF606](Protocols_Details.md#KF606---49)|49|KF606|MIG320|ZCZ50||||||NRF24L01|XN297 [KF606](Protocols_Details.md#KF606---49)|49|KF606|MIG320|ZCZ50||||||NRF24L01|XN297
@ -155,7 +155,7 @@ CFlie|38|CFlie||||||||NRF24L01|
[WK2x01](Protocols_Details.md#WK2X01---30)|30|WK2801|WK2401|W6_5_1|W6_6_1|W6_HEL|W6_HEL_I|||CYRF6936| [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 [XERALL](Protocols_Details.md#XERALL---91)|91|Tank||||||||NRF24L01|XN297
[XK](Protocols_Details.md#XK---62)|62|X450|X420|Cars||||||NRF24L011&CC2500|XN297 [XK](Protocols_Details.md#XK---62)|62|X450|X420|Cars||||||NRF24L011&CC2500|XN297
[XK2](Protocols_Details.md#XK2---99)|99|X4|P10|||||||NRF24L01&CC2500|XN297 [XK2](Protocols_Details.md#XK2---99)|99|X4||||||||NRF24L01&CC2500|XN297
[YD717](Protocols_Details.md#YD717---8)|8|YD717|SKYWLKR|SYMAX4|XINXUN|NIHUI||||NRF24L01| [YD717](Protocols_Details.md#YD717---8)|8|YD717|SKYWLKR|SYMAX4|XINXUN|NIHUI||||NRF24L01|
[YuXiang](Protocols_Details.md#YuXiang---100)|100|||||||||NRF24L01|XN297 [YuXiang](Protocols_Details.md#YuXiang---100)|100|||||||||NRF24L01|XN297
[ZSX](Protocols_Details.md#ZSX---52)|52|280||||||||NRF24L01|XN297 [ZSX](Protocols_Details.md#ZSX---52)|52|280||||||||NRF24L01|XN297
@ -1535,21 +1535,6 @@ The plane does not need to be bound each time if it is powered on **after** the
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...). 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...).
### Sub_protocol P10 - *1*
Model: Park10 J3-CUB
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.
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...).
*** ***
# NRF24L01 RF Module # NRF24L01 RF Module
@ -1954,7 +1939,6 @@ RATE: -100% Low, 0% Mid, +100% High
## JIABAILE - *102* ## JIABAILE - *102*
### Sub_protocol Std - *0*
Models: JBL-430x 1:43 car without gyro 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. You must assign a different RX number for each car. Otherwise the new car ID will overwrite the previous one.
@ -1963,21 +1947,7 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7
---|---|---|---|---|---|--- ---|---|---|---|---|---|---
ST|TH|-|ST_TRIM|SPEED|LIGHT|FLASH ST|TH|-|ST_TRIM|SPEED|LIGHT|FLASH
- Extended Steering comparing to original SPEED: -100% High, 0% Mid, +100% Low
- 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* ## JJRC345 - *71*
@ -2286,8 +2256,9 @@ Same channels assignement as above.
## YuXiang - *100* ## YuXiang - *100*
Models: E190 F07 UH-1D, E186 F08 Bell-206 Models: E190, F07 UH-1D
**Only 2 TX ID, use the RX number to switch**.
Telemetry A1=Batt voltage with a Ratio 3.5 and Offset 7, A2=Low batt with 0=OK, everything else=BAD 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 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11