diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt index cc638ba..6764ffa 100644 --- a/Lua_scripts/MultiChan.txt +++ b/Lua_scripts/MultiChan.txt @@ -191,6 +191,7 @@ 62,0,XK,X450,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video 62,1,XK,X420,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light 62,2,XK,Cars,0,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light +99,0,XK2,X4,0,Rate,Mode,Hover 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 diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 5c8ccd3..e28ef65 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -94,4 +94,5 @@ 95,BlueFly 96,BumbleB 97,SGF22 -98,Kyosho3 \ No newline at end of file +98,Kyosho3 +99,XK2 \ No newline at end of file diff --git a/Multiprotocol/Multi_Protos.ino b/Multiprotocol/Multi_Protos.ino index 27367df..fecf26f 100644 --- a/Multiprotocol/Multi_Protos.ino +++ b/Multiprotocol/Multi_Protos.ino @@ -82,6 +82,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"; @@ -495,6 +496,9 @@ const mm_protocol_definition multi_protocols[] = { #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, NO_SUBTYPE, 0, 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 }, #endif diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index dc302b7..3d41013 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -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 10 #define MODE_SERIAL 0 @@ -126,7 +126,7 @@ enum PROTOCOLS PROTO_BUMBLEB = 96, // =>CC2500 & NRF24L01 PROTO_SGF22 = 97, // =>NRF24L01 PROTO_KYOSHO3 = 98, // =>CYRF6936 - + PROTO_XK2 = 99, // =>CC2500 & NRF24L01 PROTO_NANORF = 126, // =>NRF24L01 PROTO_TEST = 127, // =>CC2500 diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index beffa13..0e29d1d 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -354,6 +354,7 @@ #undef SLT_CCNRF_INO #undef V911S_CCNRF_INO #undef XK_CCNRF_INO + #undef XK2_CCNRF_INO #endif #if not defined(DSM_CYRF6936_INO) #undef LOSI_CYRF6936_INO diff --git a/Multiprotocol/XK2_ccnrf.ino b/Multiprotocol/XK2_ccnrf.ino new file mode 100644 index 0000000..99492f6 --- /dev/null +++ b/Multiprotocol/XK2_ccnrf.ino @@ -0,0 +1,201 @@ +/* + 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 . + */ +// Compatible with XK TX X4 and model A160S. + +#if defined(XK2_CCNRF_INO) + +#include "iface_xn297.h" + +#define FORCE_XK2_ID + +#define XK2_RF_BIND_CHANNEL 71 +#define XK2_PAYLOAD_SIZE 9 +#define XK2_PACKET_PERIOD 4911 +#define XK2_RF_NUM_CHANNELS 4 + +enum { + XK2_BIND1, + XK2_BIND2, + XK2_DATA_PREP, + XK2_DATA +}; + +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; + //Checksum seed + packet[8] = 0xC0; //Constant? + } + 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(CH6_SW, 0x08) //Mode + | GET_FLAG(CH7_SW, 0x20); //Hover + //Telemetry not received=00, Telemetry received=01 but sometimes switch to 1 even if telemetry is not there... + packet[6] = 0x00; + //Unknown + packet[7] = 0x5A; //Constant? + //Checksum seed + packet[8] = 0x7F; //Constant? + } + //Checksum + for(uint8_t i=0; i