diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt index bd337c6..279688d 100644 --- a/Lua_scripts/MultiChan.txt +++ b/Lua_scripts/MultiChan.txt @@ -123,6 +123,7 @@ 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,1,3D_6G 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 diff --git a/Multiprotocol/MT99xx_nrf24l01.ino b/Multiprotocol/MT99xx_nrf24l01.ino index 80a93e4..667c18b 100644 --- a/Multiprotocol/MT99xx_nrf24l01.ino +++ b/Multiprotocol/MT99xx_nrf24l01.ino @@ -19,19 +19,20 @@ #include "iface_nrf24l01.h" -#define MT99XX_BIND_COUNT 928 -#define MT99XX_PACKET_PERIOD_FY805 2460 -#define MT99XX_PACKET_PERIOD_MT 2625 -#define MT99XX_PACKET_PERIOD_YZ 3125 -#define MT99XX_INITIAL_WAIT 500 -#define MT99XX_PACKET_SIZE 9 +#define MT99XX_BIND_COUNT 928 +#define MT99XX_PACKET_PERIOD_FY805 2460 +#define MT99XX_PACKET_PERIOD_MT 2625 +#define MT99XX_PACKET_PERIOD_YZ 3125 +#define MT99XX_PACKET_PERIOD_A180 3300 +#define MT99XX_INITIAL_WAIT 500 +#define MT99XX_PACKET_SIZE 9 #define checksum_offset rf_ch_num #define channel_offset phase enum{ // flags going to packet[6] (MT99xx, H7) - FLAG_MT_RATE1 = 0x01, // (H7 high rate) + FLAG_MT_RATE1 = 0x01, // (H7 & A180 high rate) FLAG_MT_RATE2 = 0x02, // (MT9916 only) FLAG_MT_VIDEO = 0x10, FLAG_MT_SNAPSHOT= 0x20, @@ -53,6 +54,12 @@ enum{ FLAG_FY805_HEADLESS= 0x10, }; +enum{ + // flags going to packet[6] (A180) + FLAG_A180_3D6G = 0x01, + FLAG_A180_RATE = 0x02, +}; + enum { MT99XX_INIT = 0, MT99XX_BIND, @@ -64,89 +71,134 @@ const uint8_t h7_mys_byte[] = { 0x05, 0x15, 0x06, 0x16, 0x07, 0x17, 0x00, 0x10 }; -static const uint8_t ls_mys_byte[] = { +const uint8_t ls_mys_byte[] = { 0x05, 0x15, 0x25, 0x06, 0x16, 0x26, 0x07, 0x17, 0x27, 0x00, 0x10, 0x20, 0x01, 0x11, 0x21, 0x02, 0x12, 0x22, 0x03, 0x13, 0x23, 0x04, 0x14, 0x24 }; +const uint8_t yz_p4_seq[] = {0xa0, 0x20, 0x60}; + static void __attribute__((unused)) MT99XX_send_packet() { - const uint8_t yz_p4_seq[] = {0xa0, 0x20, 0x60}; - static uint8_t yz_seq_num=0; - static uint8_t ls_counter=0; + static uint8_t seq_num=0; - if(sub_protocol != YZ) - { // MT99XX & H7 & LS - packet[0] = convert_channel_16b_limit(THROTTLE,0xE1,0x00); // throttle - 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[6] = GET_FLAG( CH5_SW, FLAG_MT_FLIP ); - packet[7] = h7_mys_byte[hopping_frequency_no]; // next rf channel index ? + if(IS_BIND_IN_PROGRESS) + { + //Bind packet + packet[0] = 0x20; + switch(sub_protocol) + { + case A180: + packet_period = MT99XX_PACKET_PERIOD_A180; + default: // MT99 & H7 & A180 + packet[1] = 0x14; + packet[2] = 0x03; + packet[3] = 0x25; + break; + case YZ: + packet_period = MT99XX_PACKET_PERIOD_YZ; + packet[1] = 0x15; + packet[2] = 0x05; + packet[3] = 0x06; + break; + case LS: + packet[1] = 0x14; + packet[2] = 0x05; + packet[3] = 0x11; + break; + case FY805: + packet_period = MT99XX_PACKET_PERIOD_FY805; + packet[1] = 0x15; + packet[2] = 0x12; + packet[3] = 0x17; + break; + } + packet[4] = rx_tx_addr[0]; + packet[5] = rx_tx_addr[1]; + packet[6] = rx_tx_addr[2]; + packet[7] = checksum_offset; // checksum offset + packet[8] = 0xAA; // fixed + } + else + { + if(sub_protocol != YZ) + { // MT99XX & H7 & LS & FY805 & A180 + packet[0] = convert_channel_16b_limit(THROTTLE,0xE1,0x00); // throttle + 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[6] = GET_FLAG( CH5_SW, FLAG_MT_FLIP ); + packet[7] = h7_mys_byte[hopping_frequency_no]; // next rf channel index ? - if(sub_protocol==H7) - packet[6]|=FLAG_MT_RATE1; // max rate on H7 - else - if(sub_protocol==MT99) - packet[6] |= 0x40 | FLAG_MT_RATE2 - | GET_FLAG( CH7_SW, FLAG_MT_SNAPSHOT ) - | GET_FLAG( CH8_SW, FLAG_MT_VIDEO ); // max rate on MT99xx - else - if(sub_protocol==FY805) - { + switch(sub_protocol) + { + case MT99: + packet[6] |= 0x40 | FLAG_MT_RATE2 // max rate on MT99xx + | GET_FLAG( CH7_SW, FLAG_MT_SNAPSHOT ) + | GET_FLAG( CH8_SW, FLAG_MT_VIDEO ); + break; + case H7: + packet[6] |= FLAG_MT_RATE1; // max rate on H7 + break; + case LS: + packet[6] |= FLAG_LS_RATE // max rate + | GET_FLAG( CH6_SW, FLAG_LS_INVERT ) // invert + | GET_FLAG( CH7_SW, FLAG_LS_SNAPSHOT ) // snapshot + | GET_FLAG( CH8_SW, FLAG_LS_VIDEO ) // video + | GET_FLAG( CH9_SW, FLAG_LS_HEADLESS ); // Headless + packet[7] = ls_mys_byte[seq_num++]; + if(seq_num >= sizeof(ls_mys_byte)) + seq_num=0; + break; + case FY805: packet[6]=0x20; //Rate 0x01? //Flip ? packet[7]=0x01 |GET_FLAG( CH5_SW, FLAG_MT_FLIP ) - |GET_FLAG( CH9_SW, FLAG_FY805_HEADLESS ); //HEADLESS + |GET_FLAG( CH9_SW, FLAG_FY805_HEADLESS ); //HEADLESS checksum_offset=0; - } - else //LS - { - packet[6] |= FLAG_LS_RATE // max rate - | GET_FLAG( CH6_SW, FLAG_LS_INVERT ) //INVERT - | GET_FLAG( CH7_SW, FLAG_LS_SNAPSHOT ) //SNAPSHOT - | GET_FLAG( CH8_SW, FLAG_LS_VIDEO ) //VIDEO - | GET_FLAG( CH9_SW, FLAG_LS_HEADLESS ); //HEADLESS - packet[7] = ls_mys_byte[ls_counter++]; - if(ls_counter >= sizeof(ls_mys_byte)) - ls_counter=0; - } - - uint8_t result=checksum_offset; - for(uint8_t i=0; i<8; i++) - result += packet[i]; - packet[8] = result; - } - else - { // YZ - packet[0] = convert_channel_16b_limit(THROTTLE,0x00,0x64); // throttle - packet[1] = convert_channel_16b_limit(RUDDER ,0x64,0x00); // rudder - packet[2] = convert_channel_16b_limit(ELEVATOR,0x00,0x64); // elevator - packet[3] = convert_channel_16b_limit(AILERON ,0x64,0x00); // aileron - if(packet_count++ >= 23) - { - yz_seq_num ++; - if(yz_seq_num > 2) - yz_seq_num = 0; - packet_count=0; + break; + case A180: + packet[6] = FLAG_A180_RATE + | GET_FLAG( CH5_SW, FLAG_A180_3D6G ); + packet[7] = 0x00; + break; + } + uint8_t result=checksum_offset; + for(uint8_t i=0; i<8; i++) + result += packet[i]; + packet[8] = result; + } + else + { // YZ + packet[0] = convert_channel_16b_limit(THROTTLE,0x00,0x64); // throttle + packet[1] = convert_channel_16b_limit(RUDDER ,0x64,0x00); // rudder + packet[2] = convert_channel_16b_limit(ELEVATOR,0x00,0x64); // elevator + packet[3] = convert_channel_16b_limit(AILERON ,0x64,0x00); // aileron + if(packet_count++ >= 23) + { + seq_num ++; + if(seq_num > 2) + seq_num = 0; + packet_count=0; + } + packet[4] = yz_p4_seq[seq_num]; + packet[5] = 0x02 // expert ? (0=unarmed, 1=normal) + | GET_FLAG(CH8_SW, 0x10) //VIDEO + | GET_FLAG(CH5_SW, 0x80) //FLIP + | GET_FLAG(CH9_SW, 0x04) //HEADLESS + | GET_FLAG(CH7_SW, 0x20); //SNAPSHOT + packet[6] = GET_FLAG(CH6_SW, 0x80); //LED + packet[7] = packet[0]; + for(uint8_t idx = 1; idx < MT99XX_PACKET_SIZE-2; idx++) + packet[7] += packet[idx]; + packet[8] = 0xff; } - packet[4] = yz_p4_seq[yz_seq_num]; - packet[5] = 0x02 // expert ? (0=unarmed, 1=normal) - | GET_FLAG(CH8_SW, 0x10) //VIDEO - | GET_FLAG(CH5_SW, 0x80) //FLIP - | GET_FLAG(CH9_SW, 0x04) //HEADLESS - | GET_FLAG(CH7_SW, 0x20); //SNAPSHOT - packet[6] = GET_FLAG(CH6_SW, 0x80); //LED - packet[7] = packet[0]; - for(uint8_t idx = 1; idx < MT99XX_PACKET_SIZE-2; idx++) - packet[7] += packet[idx]; - packet[8] = 0xff; } if(sub_protocol == LS) @@ -154,14 +206,15 @@ static void __attribute__((unused)) MT99XX_send_packet() else if(sub_protocol==FY805) NRF24L01_WriteReg(NRF24L01_05_RF_CH, 0x4B); // FY805 always transmits on the same channel - else + else // MT99 & H7 & YZ & A180 NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no] + channel_offset); + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); NRF24L01_FlushTx(); XN297_WritePayload(packet, MT99XX_PACKET_SIZE); hopping_frequency_no++; - if(sub_protocol == YZ) + if(sub_protocol == YZ || sub_protocol == A180) hopping_frequency_no++; // skip every other channel if(hopping_frequency_no > 15) @@ -186,17 +239,16 @@ static void __attribute__((unused)) MT99XX_init() if(sub_protocol == YZ) NRF24L01_SetBitrate(NRF24L01_BR_250K); // 250Kbps (nRF24L01+ only) else - NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps + NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps NRF24L01_SetPower(); XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP) ); - } static void __attribute__((unused)) MT99XX_initialize_txid() { - rx_tx_addr[3] = 0xCC; - rx_tx_addr[4] = 0xCC; + rx_tx_addr[1] = rx_tx_addr[3]; // RX_Num + if(sub_protocol == YZ) { rx_tx_addr[0] = 0x53; // test (SB id) @@ -213,50 +265,33 @@ static void __attribute__((unused)) MT99XX_initialize_txid() else if(sub_protocol == LS) rx_tx_addr[0] = 0xCC; - else //MT99 & H7 + else //MT99 & H7 & A180 rx_tx_addr[2] = 0x00; + rx_tx_addr[3] = 0xCC; + rx_tx_addr[4] = 0xCC; + checksum_offset = rx_tx_addr[0] + rx_tx_addr[1] + rx_tx_addr[2]; channel_offset = (((checksum_offset & 0xf0)>>4) + (checksum_offset & 0x0f)) % 8; } uint16_t MT99XX_callback() { - if(IS_BIND_DONE) - { - #ifdef MULTI_SYNC - telemetry_set_input_sync(packet_period); - #endif - MT99XX_send_packet(); - } - else + if(bind_counter) { + bind_counter--; if (bind_counter == 0) { - // set tx address for data packets - XN297_SetTXAddr(rx_tx_addr, 5); + // set tx address for data packets + XN297_SetTXAddr(rx_tx_addr, 5); BIND_DONE; } - else - { - if(sub_protocol == LS) - NRF24L01_WriteReg(NRF24L01_05_RF_CH, 0x2D); // LS always transmits on the same channel - else - if(sub_protocol==FY805) - NRF24L01_WriteReg(NRF24L01_05_RF_CH, 0x4B); // FY805 always transmits on the same channel - else - NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no]); - NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); - NRF24L01_FlushTx(); - XN297_WritePayload(packet, MT99XX_PACKET_SIZE); // bind packet - hopping_frequency_no++; - if(sub_protocol == YZ) - hopping_frequency_no++; // skip every other channel - if(hopping_frequency_no > 15) - hopping_frequency_no = 0; - bind_counter--; - } } + #ifdef MULTI_SYNC + else + telemetry_set_input_sync(packet_period); + #endif + MT99XX_send_packet(); return packet_period; } @@ -271,39 +306,8 @@ uint16_t initMT99XX(void) MT99XX_initialize_txid(); MT99XX_init(); - packet[0] = 0x20; packet_period = MT99XX_PACKET_PERIOD_MT; - switch(sub_protocol) - { // MT99 & H7 - case MT99: - case H7: - packet[1] = 0x14; - packet[2] = 0x03; - packet[3] = 0x25; - break; - case YZ: - packet_period = MT99XX_PACKET_PERIOD_YZ; - packet[1] = 0x15; - packet[2] = 0x05; - packet[3] = 0x06; - break; - case LS: - packet[1] = 0x14; - packet[2] = 0x05; - packet[3] = 0x11; - break; - case FY805: - packet_period = MT99XX_PACKET_PERIOD_FY805; - packet[1] = 0x15; - packet[2] = 0x12; - packet[3] = 0x17; - break; - } - packet[4] = rx_tx_addr[0]; - packet[5] = rx_tx_addr[1]; - packet[6] = rx_tx_addr[2]; - packet[7] = checksum_offset; // checksum offset - packet[8] = 0xAA; // fixed + packet_count=0; return MT99XX_INITIAL_WAIT+MT99XX_PACKET_PERIOD_MT; } diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index d852589..b4d2193 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -14,7 +14,7 @@ 14,Bayang,Bayang,H8S3D,X16_AH,IRDRONE,DHD_D4,QX100 15,FrskyX,CH_16,CH_8,EU_16,EU_8,Cloned,Clon_8 16,ESky,Std,ET4 -17,MT99xx,MT,H7,YZ,LS,FY805 +17,MT99xx,MT,H7,YZ,LS,FY805,A180 18,MJXq,WLH08,X600,X800,H26D,E010,H26WH,PHOENIX 19,Shenqi 20,FY326,FY326,FY319 diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino index 101246d..5ebbf12 100644 --- a/Multiprotocol/Multi_Names.ino +++ b/Multiprotocol/Multi_Names.ino @@ -114,7 +114,7 @@ const char STR_SUBTYPE_SLT[] = "\x06""V1_6ch""V2_8ch""Q100\0 ""Q200\0 ""M 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"; +const char STR_SUBTYPE_MT99[] = "\x06""MT99\0 ""H7\0 ""YZ\0 ""LS\0 ""FY805""A180\0"; 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"; @@ -331,7 +331,7 @@ const mm_protocol_definition multi_protocols[] = { {PROTO_MLINK, STR_MLINK, 0, NO_SUBTYPE, OPTION_NONE }, #endif #if defined(MT99XX_NRF24L01_INO) - {PROTO_MT99XX, STR_MT99XX, 5, STR_SUBTYPE_MT99, OPTION_NONE }, + {PROTO_MT99XX, STR_MT99XX, 6, STR_SUBTYPE_MT99, OPTION_NONE }, #endif #if defined(NCC1701_NRF24L01_INO) {PROTO_NCC1701, STR_NCC1701, 0, NO_SUBTYPE, OPTION_NONE }, diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 7769a06..a8794f1 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 2 -#define VERSION_PATCH_LEVEL 16 +#define VERSION_PATCH_LEVEL 17 //****************** // Protocols @@ -219,6 +219,7 @@ enum MT99XX YZ = 2, LS = 3, FY805 = 4, + A180 = 5, }; enum MJXQ { diff --git a/Protocols_Details.md b/Protocols_Details.md index 3d4de70..9fef9e3 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -1376,6 +1376,13 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP||||HEADLESS +### Sub_protocol A180 - *5* +Model: XK A180 + +CH1|CH2|CH3|CH4|CH5 +---|---|---|---|--- +A|E|T|R|3D6G + ## NCC1701 - *44* Model: Air Hogs Star Trek USS Enterprise NCC-1701-A