From 5572c47c79a8757a95fb1071c56c12ce0ca305c9 Mon Sep 17 00:00:00 2001 From: tipouic Date: Sat, 31 Dec 2016 08:15:48 +0100 Subject: [PATCH] Ajout LUA + CX35 + Suivit + ... --- Multiprotocol/ASSAN_nrf24l01.ino | 10 +- Multiprotocol/Build_orangetx.cmd | 4 +- Multiprotocol/{Convert.ino => Common.ino} | 15 + Multiprotocol/FrSkyD_cc2500.ino | 25 +- Multiprotocol/FrSkyX_cc2500.ino | 44 +- Multiprotocol/MJXQ_nrf24l01.ino | 21 +- Multiprotocol/Multi.txt | 29 + Multiprotocol/Multiprotocol.ino | 27 +- Multiprotocol/Nrf24l01_q303.ino | 228 +++- Multiprotocol/README.md | 8 + Multiprotocol/Telemetry.ino | 181 ++- Multiprotocol/Validate.h | 1 + Multiprotocol/_Config.h | 7 +- Multiprotocol/generate_hoptable.py | 38 + Multiprotocol/inter.lua | 1243 +++++++++++++++++++++ Multiprotocol/multiprotocol.h | 113 +- Multiprotocol/sync.ffs_db | Bin 1132 -> 1189 bytes 17 files changed, 1812 insertions(+), 182 deletions(-) rename Multiprotocol/{Convert.ino => Common.ino} (83%) create mode 100644 Multiprotocol/Multi.txt create mode 100644 Multiprotocol/generate_hoptable.py create mode 100644 Multiprotocol/inter.lua diff --git a/Multiprotocol/ASSAN_nrf24l01.ino b/Multiprotocol/ASSAN_nrf24l01.ino index 1a94d74..0130026 100644 --- a/Multiprotocol/ASSAN_nrf24l01.ino +++ b/Multiprotocol/ASSAN_nrf24l01.ino @@ -51,12 +51,14 @@ void ASSAN_init() void ASSAN_send_packet() { uint16_t temp; - for(uint8_t i=0;i<10;i++) + for(uint8_t i=0;i<8;i++) { temp=Servo_data[i]<<3; packet[2*i]=temp>>8; packet[2*i+1]=temp; } + for(uint8_t i=0;i118) || (freq247?0:channel; + channel=(channel+channel_spacing) % 0xEB; + if((channel==0x00) || (channel==0x5A) || (channel==0xDC)) + channel++; + } +} diff --git a/Multiprotocol/FrSkyD_cc2500.ino b/Multiprotocol/FrSkyD_cc2500.ino index 9bc2ff5..04b4057 100644 --- a/Multiprotocol/FrSkyD_cc2500.ino +++ b/Multiprotocol/FrSkyD_cc2500.ino @@ -50,16 +50,6 @@ static void __attribute__((unused)) frsky2way_init(uint8_t bind) //#######END INIT######## } -static uint8_t __attribute__((unused)) get_chan_num(uint16_t idx) -{ - uint8_t ret = (idx * 0x1e) % 0xeb; - if(idx == 3 || idx == 23 || idx == 47) - ret++; - if(idx > 47) - return 0; - return ret; -} - static void __attribute__((unused)) frsky2way_build_bind_packet() { //11 03 01 d7 2d 00 00 1e 3c 5b 78 00 00 00 00 00 00 01 @@ -71,11 +61,11 @@ static void __attribute__((unused)) frsky2way_build_bind_packet() packet[4] = rx_tx_addr[2]; uint16_t idx = ((state -FRSKY_BIND) % 10) * 5; packet[5] = idx; - packet[6] = get_chan_num(idx++); - packet[7] = get_chan_num(idx++); - packet[8] = get_chan_num(idx++); - packet[9] = get_chan_num(idx++); - packet[10] = get_chan_num(idx++); + packet[6] = hopping_frequency[idx++]; + packet[7] = hopping_frequency[idx++]; + packet[8] = hopping_frequency[idx++]; + packet[9] = hopping_frequency[idx++]; + packet[10] = hopping_frequency[idx++]; packet[11] = 0x00; packet[12] = 0x00; packet[13] = 0x00; @@ -124,6 +114,7 @@ static void __attribute__((unused)) frsky2way_data_frame() uint16_t initFrSky_2way() { + Frsky_init_hop(); if(IS_AUTOBIND_FLAG_on) { frsky2way_init(1); @@ -169,7 +160,7 @@ uint16_t ReadFrSky_2way() { //telemetry receive CC2500_SetTxRxMode(RX_EN); CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteReg(CC2500_0A_CHANNR, get_chan_num(counter % 47)); + CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[counter % 47]); CC2500_WriteReg(CC2500_23_FSCAL3, 0x89); state++; return 1300; @@ -191,7 +182,7 @@ uint16_t ReadFrSky_2way() CC2500_SetPower(); // Set tx_power } CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteReg(CC2500_0A_CHANNR, get_chan_num(counter % 47)); + CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[counter % 47]); if ( prev_option != option ) { CC2500_WriteReg(CC2500_0C_FSCTRL0,option); // Frequency offset hack diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index 474f190..b88143d 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -26,29 +26,11 @@ uint8_t ctr; uint8_t seq_last_sent; uint8_t seq_last_rcvd; -const PROGMEM uint8_t hop_data[]={ - 0x02, 0xD4, 0xBB, 0xA2, 0x89, - 0x70, 0x57, 0x3E, 0x25, 0x0C, - 0xDE, 0xC5, 0xAC, 0x93, 0x7A, - 0x61, 0x48, 0x2F, 0x16, 0xE8, - 0xCF, 0xB6, 0x9D, 0x84, 0x6B, - 0x52, 0x39, 0x20, 0x07, 0xD9, - 0xC0, 0xA7, 0x8E, 0x75, 0x5C, - 0x43, 0x2A, 0x11, 0xE3, 0xCA, - 0xB1, 0x98, 0x7F, 0x66, 0x4D, - 0x34, 0x1B, 0x00, 0x1D, 0x03 -}; - -static uint8_t __attribute__((unused)) hop(uint8_t byte) -{ - return pgm_read_byte_near(&hop_data[byte]); -} - static void __attribute__((unused)) set_start(uint8_t ch ) { CC2500_Strobe(CC2500_SIDLE); CC2500_WriteReg(CC2500_25_FSCAL1, calData[ch]); - CC2500_WriteReg(CC2500_0A_CHANNR, ch==47? 0:hop(ch)); + CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[ch]); } static void __attribute__((unused)) frskyX_init() @@ -87,19 +69,14 @@ static void __attribute__((unused)) frskyX_init() CC2500_WriteReg(CC2500_0C_FSCTRL0, option); CC2500_Strobe(CC2500_SIDLE); // - for(uint8_t c=0;c < 47;c++) + for(uint8_t c=0;c < 48;c++) {//calibrate hop channels CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteReg(CC2500_0A_CHANNR,hop(c)); + CC2500_WriteReg(CC2500_0A_CHANNR,hopping_frequency[c]); CC2500_Strobe(CC2500_SCAL); delayMicroseconds(900);// calData[c] = CC2500_ReadReg(CC2500_25_FSCAL1); } - CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteReg(CC2500_0A_CHANNR,0x00); - CC2500_Strobe(CC2500_SCAL); - delayMicroseconds(900); - calData[47] = CC2500_ReadReg(CC2500_25_FSCAL1); //#######END INIT######## } @@ -148,11 +125,11 @@ static void __attribute__((unused)) frskyX_build_bind_packet() packet[4] = rx_tx_addr[2]; int idx = ((state -FRSKY_BIND) % 10) * 5; packet[5] = idx; - packet[6] = hop(idx++); - packet[7] = hop(idx++); - packet[8] = hop(idx++); - packet[9] = hop(idx++); - packet[10] = hop(idx++); + packet[6] = hopping_frequency[idx++]; + packet[7] = hopping_frequency[idx++]; + packet[8] = hopping_frequency[idx++]; + packet[9] = hopping_frequency[idx++]; + packet[10] = hopping_frequency[idx++]; packet[11] = 0x02; packet[12] = RX_num; // @@ -307,16 +284,19 @@ uint16_t ReadFrSkyX() uint16_t initFrSkyX() { + set_rx_tx_addr(MProtocol_id_master); + Frsky_init_hop(); while(!chanskip) chanskip=random(0xfefefefe)%47; while((chanskip-ctr)%4) ctr=(ctr+1)%4; - counter_rst=(chanskip-ctr)>>2; + //for test*************** //rx_tx_addr[3]=0xB3; //rx_tx_addr[2]=0xFD; //************************ + hopping_frequency[47]=0; frskyX_init(); CC2500_SetTxRxMode(TX_EN); // diff --git a/Multiprotocol/MJXQ_nrf24l01.ino b/Multiprotocol/MJXQ_nrf24l01.ino index 3da90ff..71a23cf 100644 --- a/Multiprotocol/MJXQ_nrf24l01.ino +++ b/Multiprotocol/MJXQ_nrf24l01.ino @@ -51,9 +51,9 @@ const uint8_t PROGMEM E010_map_txid[][2] = { {0xC0, 0x44}, {0x2A, 0xFE}, {0xD7, 0x6E}, - {0x3C, 0xCD} // for this ID rx_tx_addr[2]=0x01 + {0x3C, 0xCD}, // for this ID rx_tx_addr[2]=0x01 + {0xF5, 0x2B} // for this ID rx_tx_addr[2]=0x02 }; - const uint8_t PROGMEM E010_map_rfchan[][2] = { {0x3A, 0x35}, {0x2E, 0x36}, @@ -65,11 +65,13 @@ const uint8_t PROGMEM E010_map_rfchan[][2] = { {0x34, 0x3E}, {0x34, 0x2F}, {0x39, 0x3E}, + {0x2E, 0x38}, {0x2E, 0x36}, - {0x2E, 0x36}, - {0x2E, 0x36}, + {0x2E, 0x38}, {0x3A, 0x41}, - {0x32, 0x3E} }; + {0x32, 0x3E}, + {0x33, 0x3F} + }; #define MJXQ_PAN_TILT_COUNT 16 // for H26D - match stock tx timing #define MJXQ_PAN_DOWN 0x08 @@ -254,7 +256,7 @@ static void __attribute__((unused)) MJXQ_init2() case E010: for(uint8_t i=0;i<2;i++) { - hopping_frequency[i]=pgm_read_byte_near( &E010_map_rfchan[rx_tx_addr[3]%15][i] ); + hopping_frequency[i]=pgm_read_byte_near( &E010_map_rfchan[rx_tx_addr[3]&0x0F][i] ); hopping_frequency[i+2]=hopping_frequency[i]+0x10; } break; @@ -277,8 +279,11 @@ static void __attribute__((unused)) MJXQ_initialize_txid() break; case E010: for(uint8_t i=0;i<2;i++) - rx_tx_addr[i]=pgm_read_byte_near( &E010_map_txid[rx_tx_addr[3]%15][i] ); - rx_tx_addr[2]=(rx_tx_addr[3]%15 == 14)?1:0; + rx_tx_addr[i]=pgm_read_byte_near( &E010_map_txid[rx_tx_addr[3]&0x0F][i] ); + if((rx_tx_addr[3]&0x0E) == 0x0E) + rx_tx_addr[2]=(rx_tx_addr[3]&0x01)+1; + else + rx_tx_addr[2]=0; break; case WLH08: rx_tx_addr[0]&=0xF8; diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt new file mode 100644 index 0000000..bc26f36 --- /dev/null +++ b/Multiprotocol/Multi.txt @@ -0,0 +1,29 @@ +1,Flysky,Flysky,V9x9,V6x6,V912,CX20 +2,Hubsan +3,FrskyD +4,Hisky,Hisky,HK310 +5,V2x2,V2x2,JXD506 +6,DSM,DSM2-22,DSM2-11,DSMX-22,DSMX-11,AUTO +7,Devo +8,YD717,YD717,SKYWLKR,SYMAX4,XINXUN,NIHUI +9,KN,WLTOYS,FEILUN +10,SymaX,SYMAX,SYMAX5C +11,SLT,SLT,VISTA +12,CX10,GREEN,BLUE,DM007,---,J3015_1,J3015_2,MK33041 +13,CG023,CG023,YD829,H8_3D +14,Bayang,Bayang,H8S3D +15,FrskyX,CH_16,CH_8 +16,ESky +17,MT99xx,MT,H7,YZ,LS,FY805 +18,MJXq,WLH08,X600,X800,H26D,E010,H26WH +19,Shenqi +20,FY326,FY326,FY319 +21,SFHSS +22,J6PRO +23,FQ777 +24,ASSAN +25,FrskyV +26,HONTAI,HONTAI,JJRCX1,X5C1,FQ777_951 +27,OpnLrs +28,AFHD2SA,PWM_IBUS,PPM_IBUS,PWM_SBUS,PPM_SBUS +29,Q2X2,Q222,Q242,Q282 diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 44facad..4211b78 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -80,7 +80,7 @@ uint16_t packet_period; uint8_t packet_count; uint8_t packet_sent; uint8_t packet_length; -uint8_t hopping_frequency[23]; +uint8_t hopping_frequency[50]; uint8_t *hopping_frequency_ptr; uint8_t hopping_frequency_no=0; uint8_t rf_ch_num; @@ -493,7 +493,9 @@ void Update_All() #endif //ENABLE_PPM update_channels_aux(); #if defined(TELEMETRY) - if((protocol==MODE_FRSKYD) || (protocol==MODE_BAYANG) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM) ) + #if !defined(MULTI_TELEMETRY) + if((protocol==MODE_FRSKYD) || (protocol==MODE_BAYANG) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM) ) + #endif TelemetryUpdate(); #endif update_led_status(); @@ -1093,12 +1095,21 @@ void Mprotocol_serial_init() #if defined(TELEMETRY) void PPM_Telemetry_serial_init() { - if( (protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A) || (protocol==MODE_BAYANG) ) - initTXSerial( SPEED_9600 ) ; - if(protocol==MODE_FRSKYX) - initTXSerial( SPEED_57600 ) ; - if(protocol==MODE_DSM) - initTXSerial( SPEED_125K ) ; + #ifdef MULTI_TELEMETRY + Mprotocol_serial_init(); + #ifndef ORANGE_TX + #ifndef STM32_BOARD + UCSR0B &= ~(_BV(RXEN0)|_BV(RXCIE0));//rx disable and interrupt + #endif + #endif + #else + if( (protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A) || (protocol==MODE_BAYANG) ) + initTXSerial( SPEED_9600 ) ; + if(protocol==MODE_FRSKYX) + initTXSerial( SPEED_57600 ) ; + if(protocol==MODE_DSM) + initTXSerial( SPEED_125K ) ; + #endif } #endif diff --git a/Multiprotocol/Nrf24l01_q303.ino b/Multiprotocol/Nrf24l01_q303.ino index 6d9c90d..d48d438 100644 --- a/Multiprotocol/Nrf24l01_q303.ino +++ b/Multiprotocol/Nrf24l01_q303.ino @@ -6,38 +6,28 @@ #define Q303_PACKET_SIZE 10 #define Q303_PACKET_PERIOD 1500 // Timeout for callback in uSec +#define CX35_PACKET_PERIOD 3000 #define Q303_INITIAL_WAIT 500 #define Q303_RF_BIND_CHANNEL 0x02 #define Q303_NUM_RF_CHANNELS 4 + + static uint8_t tx_addr[5]; static uint8_t current_chan; -/* -static const struct { - u8 txid[sizeof(txid)]; - u8 rfchan[NUM_RF_CHANNELS]; -} q303_tx_rf_map[] = { - {{0xb8, 0x69, 0x64, 0x67}, {0x48, 0x4a, 0x4c, 0x46}}, // tx2 - {{0xAE, 0x89, 0x97, 0x87}, {0x4A, 0x4C, 0x4E, 0x48}} -}; // tx1 -*/ -uint8_t txid[4] = {0xAE, 0x89, 0x97, 0x87}; -static uint8_t rf_chans[4] = {0x4A, 0x4C, 0x4E, 0x48}; - -// haven't figured out txid<-->rf channel mapping yet -// static const struct { uint8_t txid[sizeof(txid)]; uint8_t rfchan[Q303_NUM_RF_CHANNELS]; } q303_tx_rf_map[] = {{{0xAE, 0x89, 0x97, 0x87}, {0x4A, 0x4C, 0x4E, 0x48}}}; enum { Q303_BIND, Q303_DATA }; -// flags going to packet[8] + +// flags going to packet[8] (Q303) #define Q303_FLAG_HIGHRATE 0x03 #define Q303_FLAG_AHOLD 0x40 #define Q303_FLAG_RTH 0x80 -// flags going to packet[9] +// flags going to packet[9] (Q303) #define Q303_FLAG_GIMBAL_DN 0x04 #define Q303_FLAG_GIMBAL_UP 0x20 #define Q303_FLAG_HEADLESS 0x08 @@ -45,6 +35,99 @@ enum { #define Q303_FLAG_SNAPSHOT 0x10 #define Q303_FLAG_VIDEO 0x01 +static u8 cx35_lastButton() +{ + #define CX35_BTN_TAKEOFF 1 + #define CX35_BTN_DESCEND 2 + #define CX35_BTN_SNAPSHOT 4 + #define CX35_BTN_VIDEO 8 + #define CX35_BTN_RTH 16 + + #define CX35_CMD_RATE 0x09 + #define CX35_CMD_TAKEOFF 0x0e + #define CX35_CMD_DESCEND 0x0f + #define CX35_CMD_SNAPSHOT 0x0b + #define CX35_CMD_VIDEO 0x0c + #define CX35_CMD_RTH 0x11 + + static uint8_t cx35_btn_state; + static uint8_t command; + // simulate 2 keypress on rate button just after bind + if(packet_counter < 50) { + cx35_btn_state = 0; + packet_counter++; + command = 0x00; // startup + } + else if(packet_counter < 150) { + packet_counter++; + command = CX35_CMD_RATE; // 1st keypress + } + else if(packet_counter < 250) { + packet_counter++; + command |= 0x20; // 2nd keypress + } + + // descend + else if(!(GET_FLAG(CHANNEL_ARM, 1)) && !(cx35_btn_state & CX35_BTN_DESCEND)) { + cx35_btn_state |= CX35_BTN_DESCEND; + cx35_btn_state &= ~CX35_BTN_TAKEOFF; + command = CX35_CMD_DESCEND; + } + + // take off + else if(GET_FLAG(CHANNEL_ARM,1) && !(cx35_btn_state & CX35_BTN_TAKEOFF)) { + cx35_btn_state |= CX35_BTN_TAKEOFF; + cx35_btn_state &= ~CX35_BTN_DESCEND; + command = CX35_CMD_TAKEOFF; + } + + // RTH + else if(GET_FLAG(CHANNEL_RTH,1) && !(cx35_btn_state & CX35_BTN_RTH)) { + cx35_btn_state |= CX35_BTN_RTH; + if(command == CX35_CMD_RTH) + command |= 0x20; + else + command = CX35_CMD_RTH; + } + else if(!(GET_FLAG(CHANNEL_RTH,1)) && (cx35_btn_state & CX35_BTN_RTH)) { + cx35_btn_state &= ~CX35_BTN_RTH; + if(command == CX35_CMD_RTH) + command |= 0x20; + else + command = CX35_CMD_RTH; + } + + // video + else if(GET_FLAG(CHANNEL_VIDEO,1) && !(cx35_btn_state & CX35_BTN_VIDEO)) { + cx35_btn_state |= CX35_BTN_VIDEO; + if(command == CX35_CMD_VIDEO) + command |= 0x20; + else + command = CX35_CMD_VIDEO; + } + else if(!(GET_FLAG(CHANNEL_VIDEO,1)) && (cx35_btn_state & CX35_BTN_VIDEO)) { + cx35_btn_state &= ~CX35_BTN_VIDEO; + if(command == CX35_CMD_VIDEO) + command |= 0x20; + else + command = CX35_CMD_VIDEO; + } + + // snapshot + else if(GET_FLAG(CHANNEL_SNAPSHOT,1) && !(cx35_btn_state & CX35_BTN_SNAPSHOT)) { + cx35_btn_state |= CX35_BTN_SNAPSHOT; + if(command == CX35_CMD_SNAPSHOT) + command |= 0x20; + else + command = CX35_CMD_SNAPSHOT; + } + + if(!(GET_FLAG(CHANNEL_SNAPSHOT,1))) + cx35_btn_state &= ~CX35_BTN_SNAPSHOT; + + return command; +} + static void send_packet(uint8_t bind) { if(bind) { @@ -53,10 +136,10 @@ static void send_packet(uint8_t bind) memset(&packet[5], 0, 5); } else { - aileron = 1000 - map(Servo_data[AILERON], 1000, 2000, 0, 1000); - elevator = 1000 - map(Servo_data[ELEVATOR], 1000, 2000, 0, 1000); - throttle = map(Servo_data[THROTTLE], 1000, 2000, 0, 1000); - rudder = map(Servo_data[RUDDER], 1000, 2000, 0, 1000); + aileron = 1000 - map(Servo_data[AILERON], 1000, 2000, 1000, 0); + elevator = 1000 - map(Servo_data[ELEVATOR], 1000, 2000, 1000, 0); + throttle = map(Servo_data[THROTTLE], 1000, 2000, 0, 1000); + rudder = map(Servo_data[RUDDER], 1000, 2000, 0, 1000); packet[0] = 0x55; packet[1] = aileron >> 2 ; // 8 bits @@ -67,40 +150,56 @@ static void send_packet(uint8_t bind) packet[4] = (throttle & 0x3f) << 2 // 6 bits | (rudder >> 8); // 2 bits packet[5] = rudder & 0xff; // 8 bits - packet[6] = 0x10; // trim(s) ? - packet[7] = 0x10; // trim(s) ? - packet[8] = 0x03 // high rate (0-3) - | GET_FLAG(Servo_AUX1, Q303_FLAG_AHOLD) - | GET_FLAG(Servo_AUX6, Q303_FLAG_RTH); - packet[9] = 0x40 // always set - | GET_FLAG(Servo_AUX5, Q303_FLAG_HEADLESS) - | GET_FLAG(Servo_AUX2, Q303_FLAG_FLIP) - | GET_FLAG(Servo_AUX3, Q303_FLAG_SNAPSHOT) - | GET_FLAG(Servo_AUX4, Q303_FLAG_VIDEO); - if(Servo_data[AUX7] < (servo_max_100-PPM_SWITCH)) - packet[9] |= Q303_FLAG_GIMBAL_DN; - else if(Servo_data[AUX7] > PPM_SWITCH) - packet[9] |= Q303_FLAG_GIMBAL_UP; - // set low rate for first packets - if(bind_counter != 0) { - packet[8] &= ~0x03; - bind_counter--; + + switch(sub_protocol) { + case FORMAT_Q303: + packet[6] = 0x10; // trim(s) ? + packet[7] = 0x10; // trim(s) ? + packet[8] = 0x03 // high rate (0-3) + | GET_FLAG(Servo_AUX1, Q303_FLAG_AHOLD) + | GET_FLAG(Servo_AUX6, Q303_FLAG_RTH); + packet[9] = 0x40 // always set + | GET_FLAG(Servo_AUX5, Q303_FLAG_HEADLESS) + | GET_FLAG(Servo_AUX2, Q303_FLAG_FLIP) + | GET_FLAG(Servo_AUX3, Q303_FLAG_SNAPSHOT) + | GET_FLAG(Servo_AUX4, Q303_FLAG_VIDEO); + if(Servo_data[AUX7] < (servo_max_100-PPM_SWITCH)) + packet[9] |= Q303_FLAG_GIMBAL_DN; + else if(Servo_data[AUX7] > PPM_SWITCH) + packet[9] |= Q303_FLAG_GIMBAL_UP; + break; + case FORMAT_CX35: + slider = map(Servo_data[AUX7], 1000, 2000, 731, 342); // GIMBAL + packet[6] = slider >> 2; + packet[7] = ((slider & 3) << 6) + | 0x3e; // ?? 6 bit left (always 111110 ?) + + packet[8] = 0x80; // always set + packet[9] = cx35_lastButton(); + break; } } // Power on, TX mode, CRC enabled - XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); - if (bind) { - NRF24L01_WriteReg(NRF24L01_05_RF_CH, Q303_RF_BIND_CHANNEL); - } else { - NRF24L01_WriteReg(NRF24L01_05_RF_CH, rf_chans[current_chan++]); - current_chan %= Q303_NUM_RF_CHANNELS; - } + XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP)); - NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); - NRF24L01_FlushTx(); + NRF24L01_WriteReg(NRF24L01_05_RF_CH, bind ? Q303_RF_BIND_CHANNEL : hopping_frequency[current_chan++]); + current_chan %= Q303_NUM_RF_CHANNELS; - XN297_WritePayload(packet, Q303_PACKET_SIZE); + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); + NRF24L01_FlushTx(); + + XN297_WritePayload(packet, Q303_PACKET_SIZE); + + // Check and adjust transmission power. We do this after + // transmission to not bother with timeout after power + // settings change - we have plenty of time until next + // packet. + if (tx_power != Model.tx_power) { + //Keep transmit power updated + tx_power = Model.tx_power; + NRF24L01_SetPower(tx_power); + } } static uint16_t q303_callback() @@ -112,7 +211,7 @@ static uint16_t q303_callback() memcpy(&tx_addr[1], txid, 4); XN297_SetTXAddr(tx_addr, 5); phase = Q303_DATA; - bind_counter = Q303_BIND_COUNT; + packet_counter = 0; BIND_DONE; } else { send_packet(1); @@ -123,20 +222,34 @@ static uint16_t q303_callback() send_packet(0); break; } - return Q303_PACKET_PERIOD; + return packet_period; } static uint16_t q303_init() { -// memcpy(txid, q303_tx_rf_map[MProtocol_id % (sizeof(q303_tx_rf_map)/sizeof(q303_tx_rf_map[0]))].txid, sizeof(txid)); -// memcpy(rf_chans, q303_tx_rf_map[MProtocol_id % (sizeof(q303_tx_rf_map)/sizeof(q303_tx_rf_map[0]))].rfchan, sizeof(rf_chans)); + offset = txid[0] & 3; + if(sub_protocol == FORMAT_CX35) { + for(i=0; i0) - { - crc_s += p[i]; //0-1FF - crc_s += crc_s >> 8; //0-100 - crc_s &= 0x00ff; + if (i == 8) + p[i] = 0xff - crc_s; + Serial_write(p[i]); + + if (i>0) + { + crc_s += p[i]; //0-1FF + crc_s += crc_s >> 8; //0-100 + crc_s &= 0x00ff; + } } } -} +#else + void sportSend(uint8_t *p) + { + uint16_t crc_s = 0; + Serial_write(START_STOP);//+9 + Serial_write(p[0]) ; + for (uint8_t i = 1; i < 9; i++) + { + if (i == 8) + p[i] = 0xff - crc_s; + + if ((p[i] == START_STOP) || (p[i] == BYTESTUFF)) + { + Serial_write(BYTESTUFF);//stuff again + Serial_write(STUFF_MASK ^ p[i]); + } + else + Serial_write(p[i]); + + if (i>0) + { + crc_s += p[i]; //0-1FF + crc_s += crc_s >> 8; //0-100 + crc_s &= 0x00ff; + } + } + } +#endif void sportIdle() { - Serial_write(START_STOP); + #if !defined MULTI_TELEMETRY + Serial_write(START_STOP); + #endif } void sportSendFrame() @@ -468,6 +565,16 @@ void TelemetryUpdate() return ; } #endif + #if defined MULTI_TELEMETRY + { + uint32_t now = millis(); + if ((now - lastMulti) > MULTI_TIME) { + multi_send_status(); + lastMulti = now; + return; + } + } + #endif #if defined SPORT_TELEMETRY if (protocol==MODE_FRSKYX) diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index 74852e6..28a6362 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -92,6 +92,7 @@ #undef HUB_TELEMETRY #undef SPORT_TELEMETRY #undef DSM_TELEMETRY + #undef MULTI_TELEMETRY #else #if not defined(BAYANG_NRF24L01_INO) #undef BAYANG_HUB_TELEMETRY diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 73b18e2..a0a6e09 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -80,8 +80,8 @@ //The protocols below need a CC2500 to be installed #define SKYARTEC_CC2500_INO - #define FRSKYD_CC2500_INO #define FRSKYV_CC2500_INO + #define FRSKYD_CC2500_INO #define FRSKYX_CC2500_INO #define SFHSS_CC2500_INO @@ -128,6 +128,10 @@ //For ER9X and ERSKY9X it must be commented. For OpenTX it must be uncommented. //#define INVERT_TELEMETRY +//Uncomment to send also Multi status and wrap other telemetry to allow TX to autodetect the format +//Only for newest OpenTX version +//#define MULTI_TELEMETRY + //Comment a line to disable a protocol telemetry #define DSM_TELEMETRY // Forward received telemetry packet directly to TX to be decoded #define SPORT_TELEMETRY // Use FrSkyX SPORT format to send telemetry to TX @@ -297,6 +301,7 @@ const PPM_Parameters PPM_prot[15]= { X800 H26D E010 + H26WH MODE_SHENQI NONE MODE_FY326 diff --git a/Multiprotocol/generate_hoptable.py b/Multiprotocol/generate_hoptable.py new file mode 100644 index 0000000..c3e835f --- /dev/null +++ b/Multiprotocol/generate_hoptable.py @@ -0,0 +1,38 @@ +#!/usr/bin/python +# +# this will generate a random frsky compatible +# hop table and a random txid +# +import random + +random.seed() + +#get a random number for the txid +txid = random.randint(513, 65000) + +#get random numbers for the hoptable calculation +channel_start = random.randint(0, 7) +channel_spacing = random.randint(64, 255-64) + +#generate hoptable +hoptable = [] +hop = channel_start +for i in range(47): + hoptable.append(hop) + hop = (hop + channel_spacing) % 235 + if (hop == 0) or (hop == 0x5A) or (hop == 0xDC): + hop = hop + 1 + +hoptable_s = (",".join("0x{:02X} ".format(val) for val in hoptable)) + +print("#ifndef __HOPTABLE_H__") +print("#define __HOPTABLE_H__") +print("") +print("#define FRSKY_DEFAULT_FSCAL_VALUE 0x00") +print("") +print("#define FRSYK_TXID (0x%04X)" % (txid)) +print("") +print("//hoptable was generated with start=%d, spacing=%d" % (channel_start, channel_spacing)) +print("#define FRSKY_HOPTABLE { %s }" % (hoptable_s)) +print("") +print("#endif // __HOPTABLE_H__") diff --git a/Multiprotocol/inter.lua b/Multiprotocol/inter.lua new file mode 100644 index 0000000..67ef810 --- /dev/null +++ b/Multiprotocol/inter.lua @@ -0,0 +1,1243 @@ +-- Protocol Selected +local PROTO_PAGE = 0 +local CONFIRMATION_PAGE = 1 + +-- Navigation variables +local page = PROTO_PAGE +local dirty = true +local edit = false +local field = 0 +local fieldsMax = 0 + +-- Model settings +local ProtoId = 01 +local ProtoSub = 0 +local ProtoSubNb = 0 + +-- Common functions +local lastBlink = 0 +local function blinkChanged() + local time = getTime() % 128 + local blink = (time - time % 64) / 64 + if blink ~= lastBlink then + lastBlink = blink + return true + else + return false + end +end + +local function fieldIncDec(event, value, max, force) + if edit or force==true then + if event == EVT_PLUS_BREAK then + value = (value + max) + dirty = true + elseif event == EVT_MINUS_BREAK then + value = (value + max + 2) + dirty = true + end + value = (value % (max+1)) + end + return value +end + +local function valueIncDec(event, value, min, max) + if edit then + if event == EVT_PLUS_FIRST or event == EVT_PLUS_REPT then + if value < max then + value = (value + 1) + dirty = true + end + elseif event == EVT_MINUS_FIRST or event == EVT_MINUS_REPT then + if value > min then + value = (value - 1) + dirty = true + end + end + end + return value +end + +local function navigate(event, fieldMax, prevPage, nextPage) + if event == EVT_ENTER_BREAK then + edit = not edit + dirty = true + elseif edit then + if event == EVT_EXIT_BREAK then + edit = false + dirty = true + elseif not dirty then + dirty = blinkChanged() + end + else + if event == EVT_PAGE_BREAK then + page = nextPage + field = 0 + dirty = true + elseif event == EVT_PAGE_LONG then + page = prevPage + field = 0 + killEvents(event); + dirty = true + else + field = fieldIncDec(event, field, fieldMax, true) + end + end +end + +local function getFieldFlags(position) + flags = 0 + if field == position then + flags = INVERS + if edit then + flags = INVERS + BLINK + end + end + return flags +end + +local function channelIncDec(event, value) + if not edit and event==EVT_MENU_BREAK then + servoPage = value + dirty = true + else + value = valueIncDec(event, value, 0, 15) + end + return value +end + +-- Init function +local function init() +end + +-- Protocol Menu +local ProtoItems = {,"4""FLYSKY","HUBSAN","FRSKYD","HISKY","V2X2","DSM","DEVO","YD717","KN","SYMAX","SLT","CX10","CG023","BAYANG","FRSKYX","ESKY","MT99XX","MJXQ","SHENQI","FY326","SFHSS","J6PRO","FQ777","ASSAN","FRSKYV","HONTAI","OPENLRS","AFHDS2A","Q2X2","HM830","JOYSWAY","WK2X01","SKYARTEC","CFLIE","H377","ESKY150","BLUEFLY","NE260","INAV","Q303","FBL100","UDI"} +local SubProtoItemsA = {"FLYSKY","V9X9","V6X6","V912","CX20"} +local SubProtoItemsB = {"H107","H301","H501"} +local SubProtoItemsC = {"HISKY","HK310"} +local SubProtoItemsD = {"V2X2","JXD506"} +local SubProtoItemsE = {"DSM2_22","DSM2_11","DSMX_22","DSMX_11","AUTO"} +local SubProtoItemsF = {"YD717","SKYWLKR","SYMAX4","XINXUN","NIHUI"} +local SubProtoItemsG = {"WLTOYS","FEILUN"} +local SubProtoItemsH = {"SYMAX","SYMAX5C"} +local SubProtoItemsI = {"GREEN","BLUE","DM007","JC3015_1","JC3015_2","MK33041"} +local SubProtoItemsJ = {"CG023","YD829","H8_3D"} +local SubProtoItemsK = {"BAYANG","H8S3D"} +local SubProtoItemsL = {"CH_16","CH_8"} +local SubProtoItemsM = {"MT99","H7","YZ","LS","FY805"} +local SubProtoItemsN = {"WLH08","X600","X800","H26D","H26WH","E010"} +local SubProtoItemsO = {"FY326","FY319"} +local SubProtoItemsP = {"HONTAI","JJRCX1","FQ777_951","X5C1"} +local SubProtoItemsQ = {"PWM_IBUS","PPM_IBUS","PWM_SBUS","PPM_SBUS"} +local SubProtoItemsR = {"Q2X2","Q242","Q282","Q222"} +local SubProtoItemsS = {"WK2801","WK2401","WK2601"} +local SubProtoItemsT = {"FBL100","HP100"} +local SubProtoItemsU = {"U816_V1","U816_V2","U839_2014"} + +local function drawEngineMenu() + lcd.clear() + lcd.drawText(1, 0, "What do you want ?", 0) + lcd.drawFilledRectangle(0, 0, LCD_W, 8, GREY_DEFAULT+FILL_WHITE) + lcd.drawNumber(12, 10, ProtoId, getFieldFlags(0)) + lcd.drawLine(LCD_W/2-10, 8, LCD_W/2-10, LCD_H, DOTTED, 0) + lcd.drawText(17, 10, ProtoItems[ProtoId+1], 0) + + elseif ProtoId == 179999999999 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + if ProtoId == 0 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 4 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsA[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsA + elseif ProtoId == 1 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 2 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsB[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsB + elseif ProtoId == 2 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 3 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 1 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsC[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsC + elseif ProtoId == 4 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 1 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsD[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsD + elseif ProtoId == 5 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 4 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsE[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsE + elseif ProtoId == 6 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 7 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 4 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsF[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsF + elseif ProtoId == 8 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 1 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsG[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsG + elseif ProtoId == 9 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 1 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsH[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsH + elseif ProtoId == 10 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 11 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 5 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsI[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsI + elseif ProtoId == 12 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 2 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsJ[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsJ + elseif ProtoId == 13 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 1 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsK[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsK + elseif ProtoId == 14 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 1 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsL[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsL + elseif ProtoId == 15 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 16 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 4 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsM[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsM + elseif ProtoId == 17 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 5 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsN[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsN + elseif ProtoId == 18 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 19 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 1 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsO[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsO + elseif ProtoId == 20 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 21 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 22 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 23 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 24 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 25 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 3 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsP[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsP + elseif ProtoId == 26 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 27 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 3 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsQ[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsQ + elseif ProtoId == 28 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 3 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsR[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsR + elseif ProtoId == 39 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 47 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 48 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 2 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsS[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsS + elseif ProtoId == 49 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 50 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 51 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 52 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 53 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 54 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 56 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 57 then + ProtoSub = 0 + fieldsMax = 0 + ProtoSubNb = 0 + SubProtoItems = {""} + elseif ProtoId == 58 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 1 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsT[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsT + elseif ProtoId == 59 then + ProtoSub = 0 + fieldsMax = 1 + ProtoSubNb = 2 + lcd.drawNumber(12, 20, ProtoSub, getFieldFlags(1)) + lcd.drawText(17, 20, SubProtoItemsU[ProtoSub+1], getFieldFlags(1)) + SubProtoItems = SubProtoItemsU + end +end +local function engineMenu(event) + if dirty then + dirty = false + drawEngineMenu() + end + + navigate(event, fieldsMax, page, page+1) + + if field==0 then + ProtoId = fieldIncDec(event, ProtoId, 41) + elseif field==1 then + ProtoSub = fieldIncDec(event, ProtoSub, ProtoSubNb) + end +end + + +-- Confirmation Menu +local function drawNextLine(x, y, label, channel) + lcd.drawText(x, y, label, 0); + if channel ~= nil then + lcd.drawSource(x+52, y, MIXSRC_CH1+channel, 0) + end + y = y + 8 + if y > 50 then + y = 12 + x = 120 + end + return x, y +end +local function drawConfirmationMenu() + local x = 22 + local y = 12 + lcd.clear() + lcd.drawText(48, 1, "Install switch?", 0); + lcd.drawFilledRectangle(0, 0, LCD_W, 9, 0) + x, y = drawNextLine(x, y, "Protocol: "..ProtoItems[ProtoId+1], nil) + x, y = drawNextLine(x, y, "Sub-Protocol: "..SubProtoItems[ProtoSub+1], nil) + lcd.drawText(48, LCD_H-8, "[Enter Long] to confirm", 0); + fieldsMax = 0 +end + +local function applySettings() +-- model.defaultInputs() +-- model.deleteMixes() + if ProtoId == 0 then + if ProtoSub == 0 then --proto FLYSKY + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto V9X9 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LIGHT", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 2 then --proto V6X6 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LIGHT", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="XCAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="YCAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 3 then --proto V912 + model.insertMix(4, model.getMixesCount(4), { name="BTMBTN", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="TOPBTN", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 4 then --proto CX20 + model.insertMix(4, model.getMixesCount(4), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 1 then + if ProtoSub == 0 then --proto H107 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LIGHT", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto H301 + model.insertMix(4, model.getMixesCount(4), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="STAB", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 2 then --proto H501 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LIGHT", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="GPS_HOLD", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="ALT_HOLD", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="SNAPSHOT", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="", source=92, weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="Reset/Bind", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 2 then + if ProtoSub == 0 then --proto FRSKYD + model.insertMix(4, model.getMixesCount(4), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="---", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 3 then + if ProtoSub == 0 then --proto HISKY + end + if ProtoSub == 1 then --proto HK310 + end + elseif ProtoId == 4 then + if ProtoSub == 0 then --proto V2X2 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LIGHT", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="MAG_CAL_X", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="MAG_CAL_Y", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto JXD506 + model.insertMix(4, model.getMixesCount(4), { name="", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 5 then + if ProtoSub == 0 then --proto DSM2_22 + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="CH9", source=defaultChannel(8), weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="CH10", source=defaultChannel(9), weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="CH11", source=defaultChannel(10), weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="CH12", source=defaultChannel(11), weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto DSM2_11 + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="CH9", source=defaultChannel(8), weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="CH10", source=defaultChannel(9), weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="CH11", source=defaultChannel(10), weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="CH12", source=defaultChannel(11), weight=100, multiplex=ADD }) + end + if ProtoSub == 2 then --proto DSMX_22 + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="CH9", source=defaultChannel(8), weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="CH10", source=defaultChannel(9), weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="CH11", source=defaultChannel(10), weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="CH12", source=defaultChannel(11), weight=100, multiplex=ADD }) + end + if ProtoSub == 3 then --proto DSMX_11 + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="CH9", source=defaultChannel(8), weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="CH10", source=defaultChannel(9), weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="CH11", source=defaultChannel(10), weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="CH12", source=defaultChannel(11), weight=100, multiplex=ADD }) + end + if ProtoSub == 4 then --proto AUTO + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="CH9", source=defaultChannel(8), weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="CH10", source=defaultChannel(9), weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="CH11", source=defaultChannel(10), weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="CH12", source=defaultChannel(11), weight=100, multiplex=ADD }) + end + elseif ProtoId == 6 then + if ProtoSub == 0 then --proto DEVO + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 7 then + if ProtoSub == 0 then --proto YD717 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LIGHT", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto SKYWLKR + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LIGHT", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 2 then --proto SYMAX4 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LIGHT", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 3 then --proto XINXUN + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LIGHT", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 4 then --proto NIHUI + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LIGHT", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 8 then + if ProtoSub == 0 then --proto WLTOYS + model.insertMix(4, model.getMixesCount(4), { name="DR", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="THOLD", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="IDLEUP", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="GYRO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="Ttrim", source=92, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="Atrim", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="Etrim", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto FEILUN + model.insertMix(4, model.getMixesCount(4), { name="DR", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="THOLD", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="IDLEUP", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="GYRO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="Ttrim", source=92, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="Atrim", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="Etrim", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 9 then + if ProtoSub == 0 then --proto SYMAX + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto SYMAX5C + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 10 then + if ProtoSub == 0 then --proto SLT + model.insertMix(4, model.getMixesCount(4), { name="GEAR", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="PITCH", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto VISTA + end + elseif ProtoId == 11 then + if ProtoSub == 0 then --proto GREEN + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="RATE", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto BLUE + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="RATE", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 2 then --proto DM007 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="MODE", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 4 then --proto JC3015_1 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="MODE", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 5 then --proto JC3015_2 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="MODE", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="DFLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 6 then --proto MK33041 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="MODE", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 12 then + if ProtoSub == 0 then --proto CG023 + end + if ProtoSub == 1 then --proto YD829 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 2 then --proto H8_3D + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LIGTH", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="OPT1", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="OPT2", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="CAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="SNAPSHOT", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="CAL2", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="GIMBAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="Reset/Bind", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 13 then + if ProtoSub == 0 then --proto BAYANG + end + if ProtoSub == 1 then --proto H8S3D + end + elseif ProtoId == 14 then + if ProtoSub == 0 then --proto CH_16 + model.insertMix(4, model.getMixesCount(4), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="----", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="----", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="----", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="----", source=92, weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="----", source=92, weight=100, multiplex=ADD }) + model.insertMix(14, model.getMixesCount(14), { name="----", source=92, weight=100, multiplex=ADD }) + model.insertMix(15, model.getMixesCount(15), { name="----", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto CH_8 + model.insertMix(4, model.getMixesCount(4), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="---", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 15 then + if ProtoSub == 0 then --proto ESKY + model.insertMix(4, model.getMixesCount(4), { name="GYRO", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="PITCH", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 16 then + if ProtoSub == 0 then --proto MT99 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto H7 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 2 then --proto YZ + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 3 then --proto LS + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="INVERT", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 4 then --proto FY805 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 17 then + if ProtoSub == 0 then --proto WLH08 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="AUTOFLIP", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="PAN", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="TILT", source=92, weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="Reset/Bind", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto X600 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="AUTOFLIP", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="PAN", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="TILT", source=92, weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="Reset/Bind", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 2 then --proto X800 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="AUTOFLIP", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="PAN", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="TILT", source=92, weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="Reset/Bind", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 3 then --proto H26D + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="AUTOFLIP", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="PAN", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="TILT", source=92, weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="Reset/Bind", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 4 then --proto E010 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="AUTOFLIP", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="PAN", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="TILT", source=92, weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="Reset/Bind", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 5 then --proto H26WH + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="AUTOFLIP", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="PAN", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="TILT", source=92, weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="Reset/Bind", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 18 then + if ProtoSub == 0 then --proto SHENQI + model.insertMix(4, model.getMixesCount(4), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 19 then + if ProtoSub == 0 then --proto FY326 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="Calibrate", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="Expert", source=92, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto FY319 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="Calibrate", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="Expert", source=92, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 20 then + if ProtoSub == 0 then --proto SFHSS + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 21 then + if ProtoSub == 0 then --proto J6PRO + model.insertMix(4, model.getMixesCount(4), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 22 then + if ProtoSub == 0 then --proto FQ777 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="SNAPSHOT", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 23 then + if ProtoSub == 0 then --proto ASSAN + model.insertMix(4, model.getMixesCount(4), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 24 then + if ProtoSub == 0 then --proto FRSKYV + end + elseif ProtoId == 25 then + if ProtoSub == 0 then --proto HONTAI + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="CAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto JJRCX1 + model.insertMix(4, model.getMixesCount(4), { name="", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="ARM", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 2 then --proto X5C1 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="CAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 3 then --proto FQ777_951 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="CAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 26 then + if ProtoSub == 0 then --proto OPENLRS + end + elseif ProtoId == 27 then + if ProtoSub == 0 then --proto PWM_IBUS + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="CH9", source=defaultChannel(8), weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="CH10", source=defaultChannel(9), weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="CH11", source=defaultChannel(10), weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="CH12", source=defaultChannel(11), weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="CH13", source=defaultChannel(12), weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="Reset/Bind", source=92, weight=100, multiplex=ADD }) + model.insertMix(14, model.getMixesCount(14), { name="Failsave T", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto PPM_IBUS + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="CH9", source=defaultChannel(8), weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="CH10", source=defaultChannel(9), weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="CH11", source=defaultChannel(10), weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="CH12", source=defaultChannel(11), weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="CH13", source=defaultChannel(12), weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="Reset/Bind", source=92, weight=100, multiplex=ADD }) + model.insertMix(14, model.getMixesCount(14), { name="Failsave T", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 2 then --proto PWM_SBUS + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="CH9", source=defaultChannel(8), weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="CH10", source=defaultChannel(9), weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="CH11", source=defaultChannel(10), weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="CH12", source=defaultChannel(11), weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="CH13", source=defaultChannel(12), weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="Reset/Bind", source=92, weight=100, multiplex=ADD }) + model.insertMix(14, model.getMixesCount(14), { name="Failsave T", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 3 then --proto PPM_SBUS + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="CH9", source=defaultChannel(8), weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="CH10", source=defaultChannel(9), weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="CH11", source=defaultChannel(10), weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="CH12", source=defaultChannel(11), weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="CH13", source=defaultChannel(12), weight=100, multiplex=ADD }) + model.insertMix(13, model.getMixesCount(13), { name="Reset/Bind", source=92, weight=100, multiplex=ADD }) + model.insertMix(14, model.getMixesCount(14), { name="Failsave T", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 28 then + if ProtoSub == 0 then --proto Q2X2 + end + if ProtoSub == 10 then --proto Q282 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="XCAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="YCAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 8 then --proto Q222 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="MODULE2", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="MODULE1", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="XCAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="YCAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 9 then --proto Q242 + model.insertMix(4, model.getMixesCount(4), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="PICTURE", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="XCAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="YCAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(12, model.getMixesCount(12), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 39 then + if ProtoSub == 0 then --proto HM830 + model.insertMix(4, model.getMixesCount(4), { name="Bouton", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 47 then + if ProtoSub == 0 then --proto JOYSWAY + model.insertMix(4, model.getMixesCount(4), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 48 then + if ProtoSub == 0 then --proto WK2801 + model.insertMix(4, model.getMixesCount(4), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto WK2601 + model.insertMix(4, model.getMixesCount(4), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 2 then --proto WK2401 + model.insertMix(4, model.getMixesCount(4), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 49 then + if ProtoSub == 0 then --proto SKYARTEC + model.insertMix(4, model.getMixesCount(4), { name=" ? ", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name=" ? ", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name=" ?", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 50 then + if ProtoSub == 0 then --proto CFLIE + model.insertMix(4, model.getMixesCount(4), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 51 then + if ProtoSub == 0 then --proto H377 + model.insertMix(4, model.getMixesCount(4), { name="CH5", source=defaultChannel(4), weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="CH6", source=defaultChannel(5), weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="CH7", source=defaultChannel(6), weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="CH8", source=defaultChannel(7), weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 52 then + if ProtoSub == 0 then --proto ESKY150 + model.insertMix(4, model.getMixesCount(4), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 53 then + if ProtoSub == 0 then --proto BLUEFLY + model.insertMix(4, model.getMixesCount(4), { name="GEAR", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="PITCH", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 54 then + if ProtoSub == 0 then --proto NE260 + model.insertMix(4, model.getMixesCount(4), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 56 then + if ProtoSub == 0 then --proto INAV + end + elseif ProtoId == 57 then + if ProtoSub == 0 then --proto Q303 + model.insertMix(4, model.getMixesCount(4), { name="AHOLD", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="SNAPSHOT", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="HEADLESS", source=91, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="RTH", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="GIMBAL", source=92, weight=100, multiplex=ADD }) + model.insertMix(11, model.getMixesCount(11), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 58 then + if ProtoSub == 0 then --proto FBL100 + model.insertMix(4, model.getMixesCount(4), { name=" ? ", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name=" ? ", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name=" ? ", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name=" ?", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto HP100 + model.insertMix(4, model.getMixesCount(4), { name=" ? ", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name=" ? ", source=92, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name=" ? ", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name=" ?", source=92, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="", source=92, weight=100, multiplex=ADD }) + end + elseif ProtoId == 59 then + if ProtoSub == 0 then --proto U816_V1 + model.insertMix(4, model.getMixesCount(4), { name="FLIP 360", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="MODE 2", source=92, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 1 then --proto U816_V2 + model.insertMix(4, model.getMixesCount(4), { name="FLIP 360", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="MODE 2", source=92, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="", source=92, weight=100, multiplex=ADD }) + end + if ProtoSub == 2 then --proto U839_2014 + model.insertMix(4, model.getMixesCount(4), { name="FLIP 360", source=92, weight=100, multiplex=ADD }) + model.insertMix(5, model.getMixesCount(5), { name="FLIP", source=97, weight=100, multiplex=ADD }) + model.insertMix(6, model.getMixesCount(6), { name="VIDEO", source=92, weight=100, multiplex=ADD }) + model.insertMix(7, model.getMixesCount(7), { name="LED", source=95, weight=100, multiplex=ADD }) + model.insertMix(8, model.getMixesCount(8), { name="MODE 2", source=92, weight=100, multiplex=ADD }) + model.insertMix(9, model.getMixesCount(9), { name="---", source=92, weight=100, multiplex=ADD }) + model.insertMix(10, model.getMixesCount(10), { name="", source=92, weight=100, multiplex=ADD }) + end + end + +end + +local function confirmationMenu(event) + if dirty then + dirty = false + drawConfirmationMenu() + end + + navigate(event, fieldsMax, PROTO_PAGE, page) + + if event == EVT_EXIT_BREAK then + return 2 + elseif event == EVT_ENTER_LONG then + killEvents(event) + applySettings() + return 2 + else + return 0 + end +end + +-- Main +local function run(event) + if event == nil then + error("Cannot be run as a model script!") + end + lcd.lock() + if page == PROTO_PAGE then + engineMenu(event) + elseif page == CONFIRMATION_PAGE then + return confirmationMenu(event) + end + return 0 +end + +return { init=init, run=run } diff --git a/Multiprotocol/multiprotocol.h b/Multiprotocol/multiprotocol.h index 9e53f5f..c164e87 100644 --- a/Multiprotocol/multiprotocol.h +++ b/Multiprotocol/multiprotocol.h @@ -13,19 +13,27 @@ along with Multiprotocol. If not, see . */ +//****************** +// Version +//****************** +#define VERSION_MAJOR 1 +#define VERSION_MINOR 1 +#define VERSION_REVISION 6 +#define VERSION_PATCH_LEVEL 3 + //****************** // Protocols max 31 x2 //****************** enum PROTOCOLS { - MODE_JOYSWAY = 40, // =>A7105 - MODE_WK2x01 = 41, // =>CYRF6936 - MODE_SKYARTEC = 42, // =>CC2500 + MODE_JOYSWAY = 48, // =>A7105 + MODE_WK2x01 = 49, // =>CYRF6936 + MODE_SKYARTEC = 50, // =>CC2500 - MODE_UDI = 44, // =>NRF24L01 - MODE_FBL100 = 45, // =>NRF24L01 + MODE_FBL100 = 59, // =>NRF24L01 + MODE_UDI = 60, // =>NRF24L01 - MODE_HM830 = 50, // =>NRF24L01 + MODE_HM830 = 40, // =>NRF24L01 MODE_CFLIE = 51, // =>NRF24L01 MODE_H377 = 52, // =>NRF24L01 MODE_ESKY150 = 53, // =>NRF24L01 @@ -158,7 +166,7 @@ enum MJXQ X800 = 2, H26D = 3, E010 = 4, - H26WH = 5 + H26WH = 5, }; enum FRSKYX { @@ -177,6 +185,11 @@ enum V2X2 V2X2 = 0, JXD506 = 1, }; +enum FY326 +{ + FY326 = 0, + FY319 = 1, +}; enum HUBSAN { @@ -184,15 +197,6 @@ enum HUBSAN H301 = 1, H501 = 2 }; -enum FY326 -{ - FY326 = 0, - FY319 = 1 -}; -enum V2X2 { - FORMAT_V202 = 0, - FORMAT_JXD506 = 1, -}; enum WK2X01 { WK2801 = 0, @@ -211,6 +215,11 @@ enum FBL100 FBL100 = 0, HP100 = 1 }; +enum Q303 +{ + FORMAT_Q303 = 0, + FORMAT_CX35 = 1 +}; #define NONE 0 #define P_HIGH 1 @@ -228,6 +237,18 @@ struct PPM_Parameters uint8_t option; }; +// Telemetry + +enum MultiPacketTypes { + MULTI_TELEMETRY_STATUS = 1, + MULTI_TELEMETRY_SPORT = 2, + MULTI_TELEMETRY_HUB = 3, + MULTI_TELEMETRY_DSM = 4, + MULTI_TELEMETRY_DSMBIND = 5, + MULTI_TELEMETRY_AFHDS2A = 6, +}; + + // Macros #define NOP() __asm__ __volatile__("nop") @@ -538,6 +559,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- X800 2 H26D 3 E010 4 + H26WH 5 sub_protocol==FRSKYX CH_16 0 CH_8 1 @@ -570,4 +592,63 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- 2047 +125% Channels bits are concatenated to fit in 22 bytes like in SBUS protocol */ +/* + Multiprotocol telemetry definition + Serial: 100000 Baud 8e2 (same as input) + + TLV Protocol (type, length, value), allows a TX to ignore unknown messages + + Format: header (4 byte) + data (variable) + + [0] = 'M' (0x4d) + [1] = 'P' (0x50) + + + The first byte is deliberatly chosen to be different from other telemetry protocols + (e.g. 0xAA for DSM/Multi, 0xAA for FlySky and 0x7e for Frsky) to allow a TX to detect + the telemetry format of older versions + + [2] Type (see below) + [3] Length (excluding the 4 header bytes) + + [4-xx] data + + +Type = 0x01 Multimodule Status: + [4] Flags + 0x01 = Input signal detected + 0x02 = Serial mode enabled + 0x04 = protocol is valid + 0x08 = module is in binding mode + [5] major + [6] minor + [7-8] patchlevel + version of multi code, should be displayed as major.minor.patchlevel + + + more information can be added by specifing a longer length of the type, the TX will just ignore these bytes + + +Type 0x02 Frksy S.port telemetry +Type 0x03 Frsky Hub telemetry + + *No* usual frsky byte stuffing and without start/stop byte (0x7e) + + +Type 0x04 Spektrum telemetry data + data[0] RSSI + data[1-15] telemetry data + +Type 0x05 DSM bind data + data[0-16] DSM bind data + + technically DSM bind data is only 10 bytes but multi send 16 + like with telemtry, check length field) + +Type 0x06 Flysky AFHDS2 telemetry data + length: 29 + data[0] = RSSI value + data[1-28] telemetry data + +*/ diff --git a/Multiprotocol/sync.ffs_db b/Multiprotocol/sync.ffs_db index 40a7d882772c9500b64e5f1a0b928bf4e7762184..d5f08c2ffcffd2f0034c2d8ef986d748cc5c1521 100644 GIT binary patch delta 1180 zcmV;N1Y`T`2&D;-8Gk@=5!x3AMRAoutR|XICSQ0200062000060ssI20002!GID@J zL6*q~y>mK|W+?B52*0~)5|8IK!XGmn`qpxM>`8Wj0N8hi4jN3se4*iqZFZKm*yEF(a1SornRUq)BuHOgg7w3~31}>-uwr}xO^N>2vKrctYVzg-_V=x#C;x`yo?gMxO&-GoywX?Ex z!x{ke>dBUmP!vwNu(~y(K(ZolTt$k?@c#SMO~+ui&`;f?1nA{D+qin$4zOv*OaCu6 zGLZ3@W0vq#9$9 zbo=L(*vl5SLdPU52VLV5w=aJ{!ohMOmiUKVW=!I$l2f?Ee3nW;0qf0b^h%|7t#UDi z^PC19i`)NLrT8}TX;{vXmg@Bx`Yk+!jfSdgmF8T9H-FW0HmuNX&B{z!tw{9Q`j2G< zV$rHKO`F(eYwR*mLakP*FU<*^Je?Y4ZDCo!H`t>36eN<@{$%RK*1|p#M}+SXATDDY z_p$HAO|`s8ue%+>X1?1Pki6 z54!0lD1rhllma0LiardQSm;gNm_?eXE7F24x_>BAFC;Wf0^9!Y5juZS7|4&qdCv3f z{P*Z(Swb>@zRYK3zGkw!$;kZYmdff{;zd!<4h;{hZHwOzr&)M>z4A8Hqu9-fBgF^ z`FGtr?R)1bDaX<3(UA{we1K3OFLGY3CyL<=bW6JW+ zR`O58oILTsPT~RR_3tZ)oT0xz$iD$x?@!~pUVBGr^ssm3D9v59oIWg`=I_hG{Zlvj zZXe)(C7*lc^v4k2wL|28PQ6D%u7*z$A5{Jxv0w9h`G}l-JNTV8V{Tz7^9Z;y{sca^s}GXTFnHGj|6cWj>pl_qU;o1WkE{M~k%85{ u31TNfn+H_|gdXZ3aGt9o**u=>Gv(!Pg)@W delta 1122 zcmV-o1fBb(3G4`v8GroYaEA2COPZE%FP$K1b?A7>Ckj$N(u~;u*sF)P+c6=}JOwXB-rQhrwfc}1X^gR@XQGVL|Fs6VfaWtkP z#iq9NsSS<6^z6;vB?M^jIz1eXwi9B@NzUijw7J39gkxHcjal3Ld+{AAIO^eCKAE9D zET{WTRIIj><9}l|P2Gk1B$TdFEGBb!foP0n((TVFNtC1Xv>TJKU9`(2?)>}?2^Y(S zMB;#MW=!H&C95!r`_vC8V7;lv7fSk6RIZT_G0r>VNvgxwAz#11am(N`0*+H0*q8 zF!hyn0pFv?&M}bS7xR_W<*JYRNSp+AA^>q6JGhSnKWVDt)C9PK)>}pyTf~M#=;Y`D z_c!F0ETnUpRu~-FK#tvsMw~1?NZo~-8Vb6?%-sgdqX+tDt6a>9SHZXRG6AEF=(@D* zZ6dz?1Akcxe>03qrO{l~SaCK9l00t#Fm|&WJpup#s0IK400000cwTjsO-NK>6o$_o zuQLuzL5M9v%%nidM8QQSVl%^xmgCIT!U<<1?%Ybh8#jUAP7V7*2!q1E!VxRofi3-LKsU$AffHOxP#&GQ8FtatLcUMo+YylIQmJj<%yl##j| z;(v!@4lhk#qj}EM+NpTt=HnpM_bIKjD8S-eC% z|-=og8KZozCZ?24GK9j#6Iq13lz?>CU1Npxx?v;a^A>!{9_lTA6CmuxK zp4pqnPKypReSp2iNzZ0erZ|BL9loAFtfm zJx_eka`rhrz&U(?r>B7Lm-F5Y3G|*N&sBAg4Dpxny?cwk!%3cJ2k&L*2;Z+J^err9 z9tSs%F;9T&9?OL{gNKs8DbE)0*i1g1>mvBOGVXf`d~UUp>R%!seGh-SoVOJo{agE! zRNNi{{BIzCeSaFUhdLjJ=U!Dc`DelVw)i_U0j_)E@auck)$HuU)ZQub oKXu9H7xHv5t&8~^|S