diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt index a48fc745..4979af07 100644 --- a/Lua_scripts/MultiChan.txt +++ b/Lua_scripts/MultiChan.txt @@ -92,7 +92,7 @@ 58,3,FX,Q560,1,FLIP,Gyro,LEDs 58,4,FX,QF012,1,FLIP,Gyro,Invert,Reset 58,5,FX,BM26,1,FLIP,Gyro,LEDs,LED,CALIB -58,6,FX,FX818,1 +58,6,FX,A570,1,STOP,Rate,Color,LED,TrimR,TrimA,TrimE 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 diff --git a/Multiprotocol/FX_nrf24l01.ino b/Multiprotocol/FX_nrf24l01.ino index 5ee15274..18a9d759 100644 --- a/Multiprotocol/FX_nrf24l01.ino +++ b/Multiprotocol/FX_nrf24l01.ino @@ -45,9 +45,12 @@ Multiprotocol is distributed in the hope that it will be useful, #define FX_BM26_BIND_CHANNEL 40 #define FX_BM26_PACKET_PERIOD 14066 +#define FX_A570_PACKET_PERIOD 10270 + //#define FORCE_FX620_ID //#define FORCE_FX9630_ID //#define FORCE_QIDI_ID +//#define FORCE_FX_A570_ID enum { @@ -64,7 +67,7 @@ static void __attribute__((unused)) FX_send_packet() { XN297_Hopping(hopping_frequency_no++); if(sub_protocol >= FX9630) - { // FX9630 & FX_Q560 & FX_QF012 + { // FX9630 & FX_Q560 & FX_QF012 & FX_A570 if (hopping_frequency_no >= FX9630_NUM_CHANNELS) { hopping_frequency_no = 0; @@ -73,7 +76,7 @@ static void __attribute__((unused)) FX_send_packet() trim_ch++; trim_ch &= 3; } - else // FX_Q560 & FX_QF012 + else // FX_Q560 & FX_QF012 & FX_A570 trim_ch = 0; } } @@ -87,7 +90,36 @@ static void __attribute__((unused)) FX_send_packet() //Channels uint8_t val; - if (sub_protocol >= FX9630) + if (sub_protocol == FX816 || sub_protocol == FX620) + { + uint8_t offset=sub_protocol == FX816 ? FX816_CH_OFFSET:FX620_CH_OFFSET; + val=convert_channel_8b(AILERON); + if(val>127+FX_SWITCH) + packet[offset] = sub_protocol == FX816 ? 1:0xFF; + else if(val<127-FX_SWITCH) + packet[offset] = sub_protocol == FX816 ? 2:0x00; + else + packet[offset] = sub_protocol == FX816 ? 0:0x7F; + packet[offset+1] = convert_channel_16b_limit(THROTTLE,0,100); //FX816:0x00..0x63, FX620:0x00..0x5E but that should work + } + else if (sub_protocol == FX_A570) + { + packet[0] = convert_channel_16b_limit(THROTTLE,0x1C,0xE4); + packet[1] = convert_channel_16b_limit(AILERON,0xE4,0x1C); + packet[2] = convert_channel_16b_limit(ELEVATOR,0xE4,0x1C); + packet[3] = convert_channel_16b_limit(RUDDER,0x1C,0xE4); + // Trims - Ruddder L:01 R:02, Aileron L:03 R:04, Elevator Fwd:05 Back:06 + packet[4] = (Channel_data[CH10] < CHANNEL_MIN_COMMAND ? 0x01 : GET_FLAG(CH10_SW, 0x02)) // Rudder trim + | (Channel_data[CH11] < CHANNEL_MIN_COMMAND ? 0x03 : GET_FLAG(CH11_SW, 0x04)) // Aileron trim + | (Channel_data[CH12] < CHANNEL_MIN_COMMAND ? 0x06 : GET_FLAG(CH12_SW, 0x05)); // Elevator trim + packet[5] = GET_FLAG(CH5_SW, 0x40) // motors stop + // A570 flight modes = 0>vertical flight(3 axis mode):00, 1>flat flight(6G):02, 2>vertical flight(2 axis mode):04 + | (Channel_data[CH6] < CHANNEL_MIN_COMMAND ? 0x00 : (Channel_data[CH6] > CHANNEL_MAX_COMMAND ? 0x04 : 0x02)) + | GET_FLAG(CH7_SW, 0x01) // 0:low rate, 1:high rate + | GET_FLAG(CH8_SW, 0x08) // LED color change + | GET_FLAG(CH9_SW, 0x10); // LED off + } + else { // FX9630 & FX_Q560 & FX_QF012 & FX_BM26 packet[0] = convert_channel_8b(THROTTLE); packet[1] = convert_channel_8b(AILERON); @@ -124,18 +156,6 @@ static void __attribute__((unused)) FX_send_packet() | GET_FLAG( CH9_SW, 0x01); // Gyro Calibration } } - else // FX816 & FX620 - { - uint8_t offset=sub_protocol == FX816 ? FX816_CH_OFFSET:FX620_CH_OFFSET; - val=convert_channel_8b(AILERON); - if(val>127+FX_SWITCH) - packet[offset] = sub_protocol == FX816 ? 1:0xFF; - else if(val<127-FX_SWITCH) - packet[offset] = sub_protocol == FX816 ? 2:0x00; - else - packet[offset] = sub_protocol == FX816 ? 0:0x7F; - packet[offset+1] = convert_channel_16b_limit(THROTTLE,0,100); //FX816:0x00..0x63, FX620:0x00..0x5E but that should work - } //Bind and specifics if(sub_protocol == FX816) @@ -162,7 +182,7 @@ static void __attribute__((unused)) FX_send_packet() packet[5] = 0xAB; // Is it based on ID?? } } - else // FX9630 & FX_Q560 & FX_QF012 & FX_BM26 + else // FX9630 & FX_Q560 & FX_QF012 & FX_BM26 & FX_A570 { if(IS_BIND_IN_PROGRESS) { @@ -202,6 +222,7 @@ static void __attribute__((unused)) FX_send_packet() static void __attribute__((unused)) FX_RF_init() { XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M); + packet_length = FX9630_PAYLOAD_SIZE; // default if(sub_protocol == FX816) { XN297_SetTXAddr((uint8_t *)"\xcc\xcc\xcc\xcc\xcc", 5); @@ -221,14 +242,18 @@ static void __attribute__((unused)) FX_RF_init() XN297_SetTXAddr((uint8_t *)"\x12\x34\x10\x10", 4); XN297_RFChannel(FX_BM26_BIND_CHANNEL); packet_period = FX_BM26_PACKET_PERIOD; - packet_length = FX9630_PAYLOAD_SIZE; + } + else if(sub_protocol == FX_A570) + { + XN297_SetTXAddr((uint8_t *)"\x56\x78\x92\x13", 4); + XN297_RFChannel(FX9630_BIND_CHANNEL); + packet_period = FX_A570_PACKET_PERIOD; } else // FX9630 & FX_Q560 & FX_QF012 { XN297_SetTXAddr((uint8_t *)"\x56\x78\x90\x12", 4); XN297_RFChannel(FX9630_BIND_CHANNEL); packet_period = sub_protocol == FX_QF012 ? FX_QF012_PACKET_PERIOD : FX9630_PACKET_PERIOD; - packet_length = FX9630_PAYLOAD_SIZE; } } @@ -255,10 +280,11 @@ static void __attribute__((unused)) FX_initialize_txid() for(uint8_t i=1;i14=0x0E,31=0x1F,57=0x39 + #endif } } @@ -311,7 +341,7 @@ uint16_t FX_callback() } FX_send_packet(); #ifdef FX_HUB_TELEMETRY - if(sub_protocol < FX9630) + if (sub_protocol == FX816 || sub_protocol == FX620 || sub_protocol == FX_A570) break; if(rx) { diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 5836b420..8bc00a8d 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -55,7 +55,7 @@ 55,Frsky_RX,Multi,CloneTX,EraseTX,CPPM 56,AFHDS2A_RX,Multi,CPPM 57,HoTT,Sync,No_Sync -58,FX,FX816,FX620,9630,Q560,QF012,BM26,FX818 +58,FX,FX816,FX620,9630,Q560,QF012,BM26,A570 59,Bayang_RX,Multi,CPPM 60,Pelikan,Pro,Lite,SCX24 61,EazyRC diff --git a/Multiprotocol/Multi_Protos.ino b/Multiprotocol/Multi_Protos.ino index bbbc7782..b33dc5a2 100644 --- a/Multiprotocol/Multi_Protos.ino +++ b/Multiprotocol/Multi_Protos.ino @@ -188,7 +188,7 @@ const char STR_SUBTYPE_JJRC345[] = "\x08""JJRC345\0""SkyTmblr"; 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[] = "\x05""FX816""FX620""9630\0""Q560\0""QF012""BM26\0""FX818"; +const char STR_SUBTYPE_FX[] = "\x05""FX816""FX620""9630\0""Q560\0""QF012""BM26\0""A570\0"; 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 diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 1b382b88..c71ce3eb 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 55 +#define VERSION_PATCH_LEVEL 56 #define MODE_SERIAL 0 @@ -494,7 +494,7 @@ enum FX FX_Q560 = 3, FX_QF012 = 4, FX_BM26 = 5, - FX818 = 6, + FX_A570 = 6, }; enum SGF22 { diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 33b0e16f..17ccfdd3 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -700,7 +700,7 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { FX_Q560 FX_QF012 FX_BM26 - FX818 + FX_A570 PROTO_FY326 FY326 FY319 diff --git a/Protocols_Details.md b/Protocols_Details.md index 3e64ab57..3e427f80 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -99,7 +99,7 @@ CFlie|AIR|38|CFlie||||||||NRF24L01| [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)||58|FX816|FX620|9630|Q560|QF012|BM26|FX818||NRF24L01| +[FX](Protocols_Details.md#FX---58)||58|FX816|FX620|9630|Q560|QF012|BM26|A570||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 @@ -1906,14 +1906,24 @@ A|E|T|R|FLIP|GYRO|LEDs|Turning Light switch|Calib Gyro: -100%=6G, 0%=3D+Gyro, +100%=3D -### Sub_protocol FX818 - *6* -Model: FX818/FX820/FX822/FX823 +### Sub_protocol A570 - *6* +VTOL Model: Kootai A570, QIDI-570 -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. +This model has no telemetry. Low battery indicated by model LED's turning flashing red. -CH1|CH2|CH3|CH4 ----|---|---|--- -A|-|T|- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 +---|---|---|---|---|---|---|---|---|---|---|--- +A|E|T|R|STOP|MODE|Rate|Color|LED-Off|TrimR|TrimA|TrimE + + - STOP: -100% allows standard start / sticks moved down and center (Mode 2), +100% all motors stop + - MODE: -100%=Vertical hover, 0%=Flat flight, +100%=Vertical flight (Original TX will not allow motor start in Flat flight) + - Rate: -100%=Low Rate, +100%=High Rate + - Color: -100% / +100% toggles LED lights through color choices + - LED-Off: +100% switches lights OFF, -100% allows lights ON after a toggle of the color channel + - Trims: -100%=Rud-L,Ail-L,Ele-Back, +100%=Rud-R,Ail-R,Ele-Fwd, if used must be tied to momentary 3-pos switches + - (trim switches disabled in FM tab, added to trim channels 10,11,12 in mixes tab) + +Calibration: Same as original TX, model on level surface, TX bound, sticks lower left corners, LED's flashing ## FY326 - *20*