From 82fb5dd0da79fe8455343021728fbac1aeeec4ae Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Mon, 3 Sep 2018 16:02:43 +0200 Subject: [PATCH] SLT: added sub_protocols SLT (11) sub_protocols are now - V1 (0): original 6 channels - V2 (1): 6 channels, might be able to add channel 7 and 8 but need testing - Q200 (2): 5 channels + switches: CH9=FMODE, CH10=FLIP, CH11=VIDON, CH12=VIDOFF --- Multiprotocol/Multi.txt | 2 +- Multiprotocol/Multiprotocol.h | 29 ++++---- Multiprotocol/SLT_nrf24l01.ino | 115 +++++++++++++++++++++++++------- Multiprotocol/WFLY_cyrf6936.ino | 4 +- Multiprotocol/_Config.h | 4 ++ 5 files changed, 115 insertions(+), 39 deletions(-) diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index db4f455..402b378 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -8,7 +8,7 @@ 8,YD717,YD717,SKYWLKR,SYMAX4,XINXUN,NIHUI 9,KN,WLTOYS,FEILUN 10,SymaX,SYMAX,SYMAX5C -11,SLT,SLT,VISTA +11,SLT,SLT_V1,SLT_V2,Q200 12,CX10,GREEN,BLUE,DM007,---,J3015_1,J3015_2,MK33041 13,CG023,CG023,YD829 14,Bayang,Bayang,H8S3D,X16_AH,IRDRONE diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 9906167..763525b 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 2 #define VERSION_REVISION 0 -#define VERSION_PATCH_LEVEL 36 +#define VERSION_PATCH_LEVEL 38 //****************** // Protocols @@ -76,7 +76,7 @@ enum Flysky V9X9 = 1, V6X6 = 2, V912 = 3, - CX20 = 4 + CX20 = 4, }; enum Hubsan { @@ -94,7 +94,7 @@ enum AFHDS2A enum Hisky { Hisky = 0, - HK310 = 1 + HK310 = 1, }; enum DSM { @@ -102,7 +102,7 @@ enum DSM DSM2_11 = 1, DSMX_22 = 2, DSMX_11 = 3, - DSM_AUTO = 4 + DSM_AUTO = 4, }; enum YD717 { @@ -110,22 +110,23 @@ enum YD717 SKYWLKR = 1, SYMAX4 = 2, XINXUN = 3, - NIHUI = 4 + NIHUI = 4, }; enum KN { WLTOYS = 0, - FEILUN = 1 + FEILUN = 1, }; enum SYMAX { SYMAX = 0, - SYMAX5C = 1 + SYMAX5C = 1, }; enum SLT { - SLT = 0, - VISTA = 1 + SLT_V1 = 0, + SLT_V2 = 1, + Q200 = 2, }; enum CX10 { @@ -163,7 +164,7 @@ enum MT99XX H7 = 1, YZ = 2, LS = 3, - FY805 = 4 + FY805 = 4, }; enum MJXQ { @@ -185,8 +186,8 @@ enum HONTAI { HONTAI = 0, JJRCX1 = 1, - X5C1 = 2, - FQ777_951 =3 + X5C1 = 2, + FQ777_951 =3, }; enum V2X2 { @@ -698,6 +699,10 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- OPT_FW 0 OPT_HUB 1 MINIMA 2 + sub_protocol==SLT + SLT_V1 0 + SLT_V2 1 + Q200 2 Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; diff --git a/Multiprotocol/SLT_nrf24l01.ino b/Multiprotocol/SLT_nrf24l01.ino index 7e8affb..9850873 100644 --- a/Multiprotocol/SLT_nrf24l01.ino +++ b/Multiprotocol/SLT_nrf24l01.ino @@ -19,16 +19,26 @@ #include "iface_nrf24l01.h" // For code readability -#define SLT_PAYLOADSIZE 7 +#define SLT_PAYLOADSIZE_V1 7 +#define SLT_PAYLOADSIZE_V2 11 #define SLT_NFREQCHANNELS 15 #define SLT_TXID_SIZE 4 +enum{ + // flags going to packet[6] (Q200) + FLAG_Q200_FMODE = 0x20, + FLAG_Q200_VIDON = 0x10, + FLAG_Q200_FLIP = 0x08, + FLAG_Q200_VIDOFF= 0x04, +}; + enum { SLT_BUILD=0, SLT_DATA1, SLT_DATA2, SLT_DATA3, - SLT_BIND + SLT_BIND1, + SLT_BIND2 }; static void __attribute__((unused)) SLT_init() @@ -43,7 +53,10 @@ static void __attribute__((unused)) SLT_init() NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, 4); // bytes of data payload for pipe 1 NRF24L01_SetBitrate(NRF24L01_BR_250K); // 256kbps NRF24L01_SetPower(); - NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, (uint8_t*)"\xC3\xC3\xAA\x55", 4); + if(sub_protocol==SLT_V1) + NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, (uint8_t*)"\xC3\xC3\xAA\x55", 4); + else // V2 + NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, (uint8_t*)"\x7E\xB8\x63\xA9", 4); NRF24L01_FlushRx(); NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, SLT_TXID_SIZE); NRF24L01_FlushTx(); @@ -53,6 +66,9 @@ static void __attribute__((unused)) SLT_init() static void __attribute__((unused)) SLT_set_freq(void) { + // Use adress 1-3 for model match + for (uint8_t i = 0; i < SLT_TXID_SIZE; ++i) + rx_tx_addr[i]=rx_tx_addr[i+1]; // Frequency hopping sequence generation for (uint8_t i = 0; i < SLT_TXID_SIZE; ++i) { @@ -91,12 +107,12 @@ static void __attribute__((unused)) SLT_wait_radio() packet_sent = 0; } -static void __attribute__((unused)) SLT_send_data(uint8_t *data, uint8_t len) +static void __attribute__((unused)) SLT_send_packet(uint8_t len) { SLT_wait_radio(); NRF24L01_FlushTx(); NRF24L01_WriteReg(NRF24L01_07_STATUS, _BV(NRF24L01_07_TX_DS) | _BV(NRF24L01_07_RX_DR) | _BV(NRF24L01_07_MAX_RT)); - NRF24L01_WritePayload(data, len); + NRF24L01_WritePayload(packet, len); //NRF24L01_PulseCE(); packet_sent = 1; } @@ -108,7 +124,7 @@ static void __attribute__((unused)) SLT_build_packet() if (++hopping_frequency_no >= SLT_NFREQCHANNELS) hopping_frequency_no = 0; - // aileron, elevator, throttle, rudder, gear, pitch + // aileron, elevator, throttle, rudder, gear, pitch uint8_t e = 0; // byte where extension 2 bits for every 10-bit channel are packed for (uint8_t i = 0; i < 4; ++i) { @@ -121,6 +137,20 @@ static void __attribute__((unused)) SLT_build_packet() // 8-bit channels packet[5] = convert_channel_8b(CH5); packet[6] = convert_channel_8b(CH6); + if(sub_protocol!=SLT_V1) + { + if(sub_protocol==Q200) + { + packet[6] = GET_FLAG(CH9_SW, FLAG_Q200_FMODE) + |GET_FLAG(CH10_SW, FLAG_Q200_FLIP) + |GET_FLAG(CH11_SW, FLAG_Q200_VIDON) + |GET_FLAG(CH12_SW, FLAG_Q200_VIDOFF); + } + packet[7]=0x00; //unknown, ch7?? To try : = convert_channel_8b(CH7); + packet[8]=0x7F; //unknown, ch8?? To try : = convert_channel_8b(CH8); + packet[9]=0xAA; //unknown + packet[10]=0x00; //unknown + } } static void __attribute__((unused)) SLT_send_bind_packet() @@ -132,14 +162,25 @@ static void __attribute__((unused)) SLT_send_bind_packet() NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, (uint8_t *)"\x7E\xB8\x63\xA9", SLT_TXID_SIZE); NRF24L01_WriteReg(NRF24L01_05_RF_CH, 0x50); - SLT_send_data(rx_tx_addr, SLT_TXID_SIZE); + memcpy((void*)packet,(void*)rx_tx_addr,SLT_TXID_SIZE); + if(phase==SLT_BIND2) + SLT_send_packet(SLT_TXID_SIZE); + else // SLT_BIND1 + SLT_send_packet(SLT_PAYLOADSIZE_V2); SLT_wait_radio(); //Wait until the packet's sent before changing TX address! NRF24L01_SetPower(); //Change power back to normal level - NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, SLT_TXID_SIZE); + if(phase==SLT_BIND2) // after V1 bind and V2 second bind packet + NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, SLT_TXID_SIZE); } +#define SLT_TIMING_BUILD 1000 +#define SLT_V1_TIMING_PACKET 1000 +#define SLT_V2_TIMING_PACKET 2042 +#define SLT_V1_TIMING_BIND2 1000 +#define SLT_V2_TIMING_BIND1 6507 +#define SLT_V2_TIMING_BIND2 2112 uint16_t SLT_callback() { switch (phase) @@ -147,33 +188,59 @@ uint16_t SLT_callback() case SLT_BUILD: SLT_build_packet(); phase++; - return 1000; + return SLT_TIMING_BUILD; case SLT_DATA1: - SLT_send_data(packet, SLT_PAYLOADSIZE); - phase++; - return 1000; case SLT_DATA2: - SLT_send_data(packet, SLT_PAYLOADSIZE); phase++; - return 1000; - case SLT_DATA3: - SLT_send_data(packet, SLT_PAYLOADSIZE); - if (++packet_count >= 100) + if(sub_protocol==SLT_V1) { + SLT_send_packet(SLT_PAYLOADSIZE_V1); + return SLT_V1_TIMING_PACKET; + } + else //V2 + { + SLT_send_packet(SLT_PAYLOADSIZE_V2); + return SLT_V2_TIMING_PACKET; + } + case SLT_DATA3: + if(sub_protocol==SLT_V1) + SLT_send_packet(SLT_PAYLOADSIZE_V1); + else //V2 + SLT_send_packet(SLT_PAYLOADSIZE_V2); + if (++packet_count >= 100) + {// Send bind packet packet_count = 0; - phase++; - return 1000; + if(sub_protocol==SLT_V1) + { + phase=SLT_BIND2; + return SLT_V1_TIMING_BIND2; + } + else //V2 + { + phase=SLT_BIND1; + return SLT_V2_TIMING_BIND1; + } } else - { + {// Continue to send normal packets NRF24L01_SetPower(); // Set tx_power phase = SLT_BUILD; - return 19000; + if(sub_protocol==SLT_V1) + return 20000-SLT_TIMING_BUILD; + else //V2 + return 13730-SLT_TIMING_BUILD; } - case SLT_BIND: + case SLT_BIND1: + SLT_send_bind_packet(); + phase++; + return SLT_V2_TIMING_BIND2; + case SLT_BIND2: SLT_send_bind_packet(); phase = SLT_BUILD; - return 18000; + if(sub_protocol==SLT_V1) + return 20000-SLT_TIMING_BUILD-SLT_V1_TIMING_BIND2; + else //V2 + return 13730-SLT_TIMING_BUILD-SLT_V2_TIMING_BIND1-SLT_V2_TIMING_BIND2; } return 19000; } @@ -185,7 +252,7 @@ uint16_t initSLT() hopping_frequency_no = 0; SLT_set_freq(); SLT_init(); - phase = SLT_BIND; + phase = SLT_BUILD; return 50000; } diff --git a/Multiprotocol/WFLY_cyrf6936.ino b/Multiprotocol/WFLY_cyrf6936.ino index c4bf9e6..ddc59d2 100644 --- a/Multiprotocol/WFLY_cyrf6936.ino +++ b/Multiprotocol/WFLY_cyrf6936.ino @@ -57,7 +57,7 @@ const uint8_t PROGMEM WFLY_init_vals[][2] = { static void __attribute__((unused)) WFLY_cyrf_bind_config() { - for(uint8_t i = 0; i < sizeof(init_vals) / 2; i++) + for(uint8_t i = 0; i < sizeof(WFLY_init_vals) / 2; i++) CYRF_WriteRegister(pgm_read_byte_near(&WFLY_init_vals[i][0]), pgm_read_byte_near(&WFLY_init_vals[i][1])); CYRF_PROGMEM_ConfigSOPCode(WFLY_sop_bind); @@ -67,7 +67,7 @@ static void __attribute__((unused)) WFLY_cyrf_bind_config() static void __attribute__((unused)) WFLY_cyrf_data_config() { - for(uint8_t i = 0; i < (sizeof(init_vals) / 2)-3; i++) + for(uint8_t i = 0; i < (sizeof(WFLY_init_vals) / 2)-3; i++) CYRF_WriteRegister(pgm_read_byte_near(&WFLY_init_vals[i][0]), pgm_read_byte_near(&WFLY_init_vals[i][1])); //CYRF_WriteRegister(CYRF_1E_RX_OVERRIDE, 0x08); // Do not accept CRC with 0 seed but not needed since the RX is not sending any data... diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 10c10b6..2afee9a 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -562,6 +562,10 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { NONE PROTO_BUGS NONE + PROTO_SLT + SLT_V1 + SLT_V2 + Q200 */ // RX_Num is used for TX & RX match. Using different RX_Num values for each receiver will prevent starting a model with the false config loaded...