diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt index 7f6bc62e..a48fc745 100644 --- a/Lua_scripts/MultiChan.txt +++ b/Lua_scripts/MultiChan.txt @@ -86,11 +86,13 @@ 55,1,FrSkyRX,CloneTX,0 55,2,FrSkyRX,EraseTX,0 55,3,FrSkyRX,CPPM,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 -58,0,FX,816,1 -58,1,FX,620,1 +58,0,FX,FX816,1 +58,1,FX,FX620,1 58,2,FX,9630,1,Rate,Gyro,TrimR,TrimA,TrimE 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 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 @@ -235,3 +237,4 @@ 104,0,KAMTOM,Std,0,ST_Tr,TH_Tr,TH_DR 105,0,Shenqi2,Std,1 106,0,WL91x,Std,0 +107,0,WPL,Std,0,Light,TH_DR,ST_DR diff --git a/Multiprotocol/FX_nrf24l01.ino b/Multiprotocol/FX_nrf24l01.ino index d1566a9e..556d81e1 100644 --- a/Multiprotocol/FX_nrf24l01.ino +++ b/Multiprotocol/FX_nrf24l01.ino @@ -42,6 +42,9 @@ Multiprotocol is distributed in the hope that it will be useful, #define FX_QF012_PACKET_PERIOD 12194 #define FX_QF012_RX_PAYLOAD_SIZE 3 +#define FX_BM26_BIND_CHANNEL 40 +#define FX_BM26_PACKET_PERIOD 14066 + //#define FORCE_FX620_ID //#define FORCE_FX9630_ID //#define FORCE_QIDI_ID @@ -85,11 +88,17 @@ static void __attribute__((unused)) FX_send_packet() //Channels uint8_t val; if (sub_protocol >= FX9630) - { // FX9630 & FX_Q560 & FX_QF012 + { // FX9630 & FX_Q560 & FX_QF012 & FX_BM26 packet[0] = convert_channel_8b(THROTTLE); packet[1] = convert_channel_8b(AILERON); packet[2] = 0xFF - convert_channel_8b(ELEVATOR); packet[3] = convert_channel_8b(RUDDER); + if ( sub_protocol == FX_BM26 ) // BM26 Ail, Elev, Rud range between 0x00-0x3F-0x7F + { + packet[1] >>= 1; + packet[2] >>= 1; + packet[3] >>= 1; + } val = trim_ch==0 ? 0x20 : (convert_channel_8b(trim_ch + CH6) >> 2); // no trim on Throttle packet[4] = val; // Trim for channel x 0C..20..34 packet[5] = (trim_ch << 4) // channel x << 4 @@ -99,10 +108,21 @@ static void __attribute__((unused)) FX_send_packet() // QF012=>0:beginner(6G), 1:mid(3D), 2:expert(Gyro off) | (Channel_data[CH6] < CHANNEL_MIN_COMMAND ? 0x00 : (Channel_data[CH6] > CHANNEL_MAX_COMMAND ? 0x04 : 0x02)); if(sub_protocol == FX_Q560) - packet[5] |= GET_FLAG(CH7_SW, 0x18); // Q560 LED flag 0x10 conflicting with trim_ch... Corrected on new boards using 0x08 instead + packet[5] |= GET_FLAG(CH7_SW, 0x18); // Q560 LED flag 0x10 conflicting with trim_ch... Corrected on new boards using 0x08 instead else if (sub_protocol == FX_QF012) - packet[5] |= GET_FLAG(CH7_SW, 0x40) // QF012 invert flight - | GET_FLAG(CH8_SW, 0x80); // QF012 Restore fine tunning midpoint + packet[5] |= GET_FLAG(CH7_SW, 0x40) // QF012 invert flight + | GET_FLAG(CH8_SW, 0x80); // QF012 Restore fine tunning midpoint + else if ( sub_protocol == FX_BM26 ) + { + packet[5] &= 0xC0; + packet[5] += 0x40; + // BM26 P51=>0:beginner(6G), 1:mid(3D), 2:expert(Gyro off) + packet[5] |= (Channel_data[CH6] < CHANNEL_MIN_COMMAND ? 0x08 : (Channel_data[CH6] > CHANNEL_MAX_COMMAND ? 0x0C : 0x0A)); + packet[6] = GET_FLAG( CH5_SW, 0x20) // 6G Roll + | GET_FLAG(!CH7_SW, 0x08) // Light control switch, default on + | GET_FLAG(!CH8_SW, 0x10) // Turn signal switch, default on + | GET_FLAG( CH9_SW, 0x01); // Gyro Calibration + } } else // FX816 & FX620 { @@ -142,7 +162,7 @@ static void __attribute__((unused)) FX_send_packet() packet[5] = 0xAB; // Is it based on ID?? } } - else // FX9630 & FX_Q560 & FX_QF012 + else // FX9630 & FX_Q560 & FX_QF012 & FX_BM26 { if(IS_BIND_IN_PROGRESS) { @@ -164,6 +184,8 @@ static void __attribute__((unused)) FX_send_packet() val = val ^ 0xFF; packet[last_packet_idx]=val; + if ( IS_BIND_IN_PROGRESS && sub_protocol == FX_BM26 ) packet[7] = packet[6]; + //Debug #if 0 for(uint8_t i=0;i A5 01 11 telemetry_link = 1; - v_lipo1 = packet_in[1] ? 60:81; // low voltage 3.7V + if ( sub_protocol == FX_BM26 ) + v_lipo1 = packet_in[0] < packet_in[2] ? 60:81; // packets: AA 00 55 -> 55 00 AA = low voltage 3.7V + else + v_lipo1 = packet_in[1] ? 60:81; // packets: A5 00 11 -> A5 01 11 = low voltage 3.7V #if 0 for(uint8_t i=0; i < FX_QF012_RX_PAYLOAD_SIZE; i++) debug(" %02X", packet_in[i]); diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 13983470..5836b420 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,816,620,9630,Q560,QF012 +58,FX,FX816,FX620,9630,Q560,QF012,BM26,FX818 59,Bayang_RX,Multi,CPPM 60,Pelikan,Pro,Lite,SCX24 61,EazyRC @@ -102,3 +102,4 @@ 104,KAMTOM 105,Shenqi2 106,WL91x +107,WPL diff --git a/Protocols_Details.md b/Protocols_Details.md index 31185909..367b8b83 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|FX818|||NRF24L01| +[FX](Protocols_Details.md#FX---58)||58|FX816|FX620|9630|Q560|QF012|BM26|FX818||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 @@ -1894,7 +1894,18 @@ Gyro: -100%=6G, 0%=3D+Gyro, +100%=3D Reset: Restore fine tunning midpoint -### Sub_protocol FX818 - *5* +### Sub_protocol BM26 - *5* +Model: BM26 P51 + +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. + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 +---|---|---|---|---|---|---|---|--- +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 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.