From 6d080d5d5f71db84de94b0344b2eb4c96f061ba1 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Sat, 9 Jan 2021 18:39:31 +0100 Subject: [PATCH] New LOLI protocol --- Lua_scripts/MultiChan.txt | 2 + Multiprotocol/Bayang_nrf24l01.ino | 8 +- Multiprotocol/Convert.ino | 10 +- Multiprotocol/E010R5_cyrf6936.ino | 10 +- Multiprotocol/J6Pro_cyrf6936.ino | 2 +- Multiprotocol/KN_nrf24l01.ino | 8 +- Multiprotocol/LOLI_nrf24l01.ino | 274 ++++++++++++++++++++++++++++++ Multiprotocol/Multi.txt | 2 + Multiprotocol/Multi_Names.ino | 4 + Multiprotocol/Multiprotocol.h | 8 +- Multiprotocol/Multiprotocol.ino | 22 ++- Multiprotocol/SLT_nrf24l01.ino | 2 +- Multiprotocol/Telemetry.ino | 2 +- Multiprotocol/Validate.h | 7 +- Multiprotocol/XK_nrf24l01.ino | 4 +- Multiprotocol/_Config.h | 4 + Protocols_Details.md | 18 +- 17 files changed, 360 insertions(+), 27 deletions(-) create mode 100644 Multiprotocol/LOLI_nrf24l01.ino diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt index 8276744..85ecba3 100644 --- a/Lua_scripts/MultiChan.txt +++ b/Lua_scripts/MultiChan.txt @@ -179,3 +179,5 @@ 78,0,M-Link,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 79,0,WFLY2,RF20x,0,CH5,CH6,CH7,CH8,CH9,CH10 80,0,E016Hv2,E016Hv2,1,TakLan,EmStop,Flip,Calib,HLess,RTH +81,0,E010r5,E010r5,1,Flip,HLess,RTH +82,0,LOLI,0,CH5,CH6,CH7,CH8 diff --git a/Multiprotocol/Bayang_nrf24l01.ino b/Multiprotocol/Bayang_nrf24l01.ino index 71953a4..2b02cca 100644 --- a/Multiprotocol/Bayang_nrf24l01.ino +++ b/Multiprotocol/Bayang_nrf24l01.ino @@ -143,19 +143,19 @@ static void __attribute__((unused)) BAYANG_send_packet() if(CH13_SW) packet[3] |= BAYANG_FLAG_EMG_STOP; //Aileron - val = convert_channel_10b(AILERON); + val = convert_channel_10b(AILERON, false); packet[4] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C); packet[5] = val & 0xFF; //Elevator - val = convert_channel_10b(ELEVATOR); + val = convert_channel_10b(ELEVATOR, false); packet[6] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C); packet[7] = val & 0xFF; //Throttle - val = convert_channel_10b(THROTTLE); + val = convert_channel_10b(THROTTLE, false); packet[8] = (val>>8) + 0x7C; packet[9] = val & 0xFF; //Rudder - val = convert_channel_10b(RUDDER); + val = convert_channel_10b(RUDDER, false); packet[10] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C); packet[11] = val & 0xFF; } diff --git a/Multiprotocol/Convert.ino b/Multiprotocol/Convert.ino index 488321f..551b669 100644 --- a/Multiprotocol/Convert.ino +++ b/Multiprotocol/Convert.ino @@ -32,9 +32,15 @@ uint16_t convert_channel_ppm(uint8_t num) } // Channel value 100% is converted to 10bit values 0<->1023 -uint16_t convert_channel_10b(uint8_t num) +uint16_t convert_channel_10b(uint8_t num, bool failsafe) { - uint16_t val=Channel_data[num]; + uint16_t val; + #ifdef FAILSAFE_ENABLE + if(failsafe) + val=Failsafe_data[num]; // 0<->2047 + else + #endif + val=Channel_data[num]; val=((val<<2)+val)>>3; if(val<=128) return 0; if(val>=1152) return 1023; diff --git a/Multiprotocol/E010R5_cyrf6936.ino b/Multiprotocol/E010R5_cyrf6936.ino index d66de85..ec774a3 100644 --- a/Multiprotocol/E010R5_cyrf6936.ino +++ b/Multiprotocol/E010R5_cyrf6936.ino @@ -172,7 +172,7 @@ uint16_t ReadE010R5() hopping_frequency_no++; hopping_frequency_no &= 3; if(IS_BIND_IN_PROGRESS) - rf_ch_num = 48 + (hopping_frequency_no<<3); + rf_ch_num = 0x30 + (hopping_frequency_no<<3); else rf_ch_num = hopping_frequency[hopping_frequency_no]; CYRF_ConfigRFChannel(rf_ch_num); @@ -193,10 +193,10 @@ uint16_t initE010R5() E010R5_cyrf_init(); #ifdef E010R5_FORCE_ID - hopping_frequency[0]=48; - hopping_frequency[1]=69; - hopping_frequency[2]=64; - hopping_frequency[3]=53; + hopping_frequency[0]=0x30; //48 + hopping_frequency[1]=0x45; //69 + hopping_frequency[2]=0x40; //64 + hopping_frequency[3]=0x35; //53 rx_tx_addr[0]=0x00; rx_tx_addr[1]=0x45; rx_tx_addr[2]=0x46; diff --git a/Multiprotocol/J6Pro_cyrf6936.ino b/Multiprotocol/J6Pro_cyrf6936.ino index f8e5e5c..b24748c 100644 --- a/Multiprotocol/J6Pro_cyrf6936.ino +++ b/Multiprotocol/J6Pro_cyrf6936.ino @@ -59,7 +59,7 @@ static void __attribute__((unused)) j6pro_build_data_packet() packet[0] = 0xaa; //FIXME what is this? for (i = 0; i < 12; i++) { - value = convert_channel_10b(CH_AETR[i]); + value = convert_channel_10b(CH_AETR[i], false); packet[i+1] = value & 0xff; upperbits |= (value >> 8) << (i * 2); } diff --git a/Multiprotocol/KN_nrf24l01.ino b/Multiprotocol/KN_nrf24l01.ino index 0a60173..54d26da 100644 --- a/Multiprotocol/KN_nrf24l01.ino +++ b/Multiprotocol/KN_nrf24l01.ino @@ -125,16 +125,16 @@ static void __attribute__((unused)) kn_bind_init() static void __attribute__((unused)) kn_update_packet_control_data() { uint16_t value; - value = convert_channel_10b(THROTTLE); + value = convert_channel_10b(THROTTLE, false); packet[0] = (value >> 8) & 0xFF; packet[1] = value & 0xFF; - value = convert_channel_10b(AILERON); + value = convert_channel_10b(AILERON, false); packet[2] = (value >> 8) & 0xFF; packet[3] = value & 0xFF; - value = convert_channel_10b(ELEVATOR); + value = convert_channel_10b(ELEVATOR, false); packet[4] = (value >> 8) & 0xFF; packet[5] = value & 0xFF; - value = convert_channel_10b(RUDDER); + value = convert_channel_10b(RUDDER, false); packet[6] = (value >> 8) & 0xFF; packet[7] = value & 0xFF; // Trims, middle is 0x64 (100) range 0-200 diff --git a/Multiprotocol/LOLI_nrf24l01.ino b/Multiprotocol/LOLI_nrf24l01.ino new file mode 100644 index 0000000..d384631 --- /dev/null +++ b/Multiprotocol/LOLI_nrf24l01.ino @@ -0,0 +1,274 @@ +/* + This project is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +Multiprotocol is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Multiprotocol. If not, see . + */ + +#if defined(LOLI_NRF24L01_INO) + +#include "iface_nrf24l01.h" + +#define LOLI_BIND_CHANNEL 33 +#define LOLI_PACKET_SIZE 11 +#define LOLI_NUM_CHANNELS 5 + +static void __attribute__((unused)) LOLI_init() +{ + NRF24L01_Initialize(); + NRF24L01_FlushTx(); + NRF24L01_FlushRx(); + NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowldgement on all data pipes + NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 only + NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-bytes RX/TX address + NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, (uint8_t*)"LOVE!", 5); + NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, (uint8_t*)"LOVE!", 5); + NRF24L01_WriteReg(NRF24L01_04_SETUP_RETR, 0x00); // No retransmits + NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, LOLI_PACKET_SIZE); // RX FIFO size + NRF24L01_SetBitrate(NRF24L01_BR_250K); // 250Kbps + + NRF24L01_SetPower(); + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit + NRF24L01_SetTxRxMode(TX_EN); +} + +// flags going to packet[1] for packet type 0xa2 (Rx config) +#define LOLI_FLAG_PWM7 0x02 +#define LOLI_FLAG_PWM2 0x04 +#define LOLI_FLAG_PWM1 0x08 +#define LOLI_FLAG_SBUS 0x40 +#define LOLI_FLAG_PPM 0x80 + +// flags going to packet[2] for packet type 0xa2 (Rx config) +#define LOLI_FLAG_SW8 0x01 +#define LOLI_FLAG_SW7 0x02 +#define LOLI_FLAG_SW6 0x04 +#define LOLI_FLAG_SW5 0x08 +#define LOLI_FLAG_SW4 0x10 +#define LOLI_FLAG_SW3 0x20 +#define LOLI_FLAG_SW2 0x40 +#define LOLI_FLAG_SW1 0x80 + +static void __attribute__((unused)) LOLI_send_packet() +{ + if(IS_BIND_IN_PROGRESS) + { + packet[0] = 0xa0; + memcpy(&packet[1], hopping_frequency, LOLI_NUM_CHANNELS); + memcpy(&packet[6], rx_tx_addr, 5); + rf_ch_num = LOLI_BIND_CHANNEL; + } + else + { + if(LOLI_SerialRX) + {// RX config + packet[0] = 0xa2; + packet[1] = LOLI_P1; // CH1:LOLI_FLAG_PPM || LOLI_FLAG_PWM1, CH2:LOLI_FLAG_PWM2, CH5:LOLI_FLAG_SBUS, CH7:LOLI_FLAG_PWM7 + packet[2] = LOLI_P2; // CHx switch bit(8-x)=1 + LOLI_SerialRX=false; + } + else + {// Normal packet + #ifdef FAILSAFE_ENABLE + packet[0] = IS_FAILSAFE_VALUES_on ? 0xa0 : 0xa1; + #else + packet[0] = 0xa1; + #endif + + //Build channels + uint8_t ch=0, offset=1; + uint16_t val; + for(uint8_t i=0;i<2;i++) + { + val = convert_channel_10b(ch++, IS_FAILSAFE_VALUES_on); + packet[offset++] = val >> 2; + packet[offset ] = val << 6; + val = convert_channel_10b(ch++, IS_FAILSAFE_VALUES_on); + packet[offset++]|= val >> 4; + packet[offset ] = val << 4; + val = convert_channel_10b(ch++, IS_FAILSAFE_VALUES_on); + packet[offset++]|= val >> 6; + packet[offset ] = val << 2; + val = convert_channel_10b(ch++, IS_FAILSAFE_VALUES_on); + packet[offset++]|= val >> 8; + packet[offset++] = val & 0xff; + } + FAILSAFE_VALUES_off; // Failsafe values are sent if they were available + } + + if (++hopping_frequency_no > LOLI_NUM_CHANNELS-1) + hopping_frequency_no = 0; + rf_ch_num = hopping_frequency[hopping_frequency_no]; + } + + #if 0 + debug("P(%02X):",rf_ch_num); + for(uint8_t i=0; i 50) + phase = LOLI_BIND1; + return 1000; + + case LOLI_PREP_DATA: + BIND_DONE; + NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rx_tx_addr, 5); + NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, 5); + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); + NRF24L01_FlushRx(); + packet_count = 0; + phase++; + + case LOLI_DATA1: + #ifdef LOLI_HUB_TELEMETRY + // Check telemetry + if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR)) + { // RX fifo data ready + NRF24L01_ReadPayload(packet, LOLI_PACKET_SIZE); + #if 0 + debug("T:"); + for(uint8_t i=0; i=100) + { + packet_count=0; + TX_LQI=telemetry_counter; + if(telemetry_counter==0) + telemetry_lost = 1; + telemetry_counter = 0; + } + #endif + + // Send data packet + LOLI_send_packet(); + + #ifdef LOLI_HUB_TELEMETRY + phase ++; + return 2000; + case LOLI_DATA2: + // Switch to RX mode + NRF24L01_SetTxRxMode(TXRX_OFF); + NRF24L01_FlushRx(); + NRF24L01_SetTxRxMode(RX_EN); + NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x3b); // 8bit CRC, RX + phase = LOLI_DATA1; + return 18000; + #else + break; + #endif + } + return 20000; +} + +uint16_t initLOLI() +{ + rx_tx_addr[1] %= 0x30; + calc_fh_channels(LOLI_NUM_CHANNELS); + for (uint8_t i=0; i < LOLI_NUM_CHANNELS; i++) + if (hopping_frequency[i] == LOLI_BIND_CHANNEL) + hopping_frequency[i]++; + + if (IS_BIND_IN_PROGRESS) + { + bind_counter=250; + phase = LOLI_BIND1; + } + else + phase = LOLI_PREP_DATA; + + LOLI_init(); + + return 500; +} + +#endif diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 8db8b9e..ba76208 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -78,3 +78,5 @@ 78,M-Link 79,WFLY,RF20x 80,E016H,E016Hv2 +81,E010r5 +82,LOLI \ No newline at end of file diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino index f74ba58..f1c8a91 100644 --- a/Multiprotocol/Multi_Names.ino +++ b/Multiprotocol/Multi_Names.ino @@ -96,6 +96,7 @@ const char STR_TEST[] ="Test"; const char STR_NANORF[] ="NanoRF"; const char STR_E016HV2[] ="E016Hv2"; const char STR_E010R5[] ="E010r5"; +const char STR_LOLI[] ="LOLI"; const char STR_SUBTYPE_FLYSKY[] = "\x04""Std\0""V9x9""V6x6""V912""CX20"; const char STR_SUBTYPE_HUBSAN[] = "\x04""H107""H301""H501"; @@ -316,6 +317,9 @@ const mm_protocol_definition multi_protocols[] = { #if defined(KYOSHO_A7105_INO) {PROTO_KYOSHO, STR_KYOSHO, 2, STR_SUBTYPE_KYOSHO, OPTION_NONE }, #endif + #if defined(LOLI_NRF24L01_INO) + {PROTO_LOLI, STR_LOLI, 0, NO_SUBTYPE, OPTION_NONE }, + #endif #if defined(MJXQ_NRF24L01_INO) {PROTO_MJXQ, STR_MJXQ, 7, STR_SUBTYPE_MJXQ, OPTION_RFTUNE }, #endif diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index c8732d3..a74f353 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 1 -#define VERSION_PATCH_LEVEL 96 +#define VERSION_PATCH_LEVEL 97 //****************** // Protocols @@ -47,7 +47,7 @@ enum PROTOCOLS PROTO_MJXQ = 18, // =>NRF24L01 PROTO_SHENQI = 19, // =>NRF24L01 PROTO_FY326 = 20, // =>NRF24L01 - PROTO_FUTABA = 21, // =>CC2500 + PROTO_FUTABA = 21, // =>CC2500 PROTO_J6PRO = 22, // =>CYRF6936 PROTO_FQ777 = 23, // =>NRF24L01 PROTO_ASSAN = 24, // =>NRF24L01 @@ -107,6 +107,7 @@ enum PROTOCOLS PROTO_WFLY2 = 79, // =>A7105 PROTO_E016HV2 = 80, // =>CC2500 & NRF24L01 PROTO_E010R5 = 81, // =>CYRF6936 + PROTO_LOLI = 82, // =>NRF24L01 PROTO_NANORF = 126, // =>NRF24L01 PROTO_TEST = 127, // =>CC2500 @@ -463,7 +464,7 @@ enum MultiPacketTypes //*************** //*** Tests *** //*************** -#define IS_FAILSAFE_PROTOCOL ( (protocol==PROTO_HISKY && sub_protocol==HK310) || protocol==PROTO_AFHDS2A || protocol==PROTO_DEVO || protocol==PROTO_FUTABA || protocol==PROTO_WK2x01 || protocol== PROTO_HOTT || protocol==PROTO_FRSKYX || protocol==PROTO_FRSKYX2 || protocol==PROTO_FRSKY_R9 || protocol==PROTO_WFLY2) +#define IS_FAILSAFE_PROTOCOL ( (protocol==PROTO_HISKY && sub_protocol==HK310) || protocol==PROTO_AFHDS2A || protocol==PROTO_DEVO || protocol==PROTO_FUTABA || protocol==PROTO_WK2x01 || protocol== PROTO_HOTT || protocol==PROTO_FRSKYX || protocol==PROTO_FRSKYX2 || protocol==PROTO_FRSKY_R9 || protocol==PROTO_WFLY2 || protocol==PROTO_LOLI) #define IS_CHMAP_PROTOCOL ( (protocol==PROTO_HISKY && sub_protocol==HK310) || protocol==PROTO_AFHDS2A || protocol==PROTO_DEVO || protocol==PROTO_FUTABA || protocol==PROTO_WK2x01 || protocol== PROTO_DSM || protocol==PROTO_SLT || protocol==PROTO_FLYSKY || (protocol==PROTO_KYOSHO && sub_protocol==KYOSHO_HYPE) || protocol==PROTO_ESKY || protocol==PROTO_J6PRO || protocol==PROTO_PELIKAN || protocol==PROTO_SKYARTEC || protocol==PROTO_ESKY150V2 || protocol==PROTO_DSM_RX) //*************** @@ -849,6 +850,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- WFLY2 79 E016HV2 80 E010R5 81 + LOLI 82 BindBit=> 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 8fb6d3b..2b0186b 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -261,6 +261,10 @@ uint8_t packet_in[TELEMETRY_BUFFER_SIZE];//telemetry receiving packets bool DSM_SerialRX=false; #endif #endif // TELEMETRY +#ifdef LOLI_NRF24L01_INO + bool LOLI_SerialRX=false; + uint8_t LOLI_P1=0, LOLI_P2=0; +#endif // Callback typedef uint16_t (*void_function_t) (void);//pointer to a function with no parameters which return an uint16_t integer @@ -821,7 +825,7 @@ bool Update_All() update_led_status(); #if defined(TELEMETRY) #if ( !( defined(MULTI_TELEMETRY) || defined(MULTI_STATUS) ) ) - if((protocol == PROTO_BAYANG_RX) || (protocol == PROTO_AFHDS2A_RX) || (protocol == PROTO_FRSKY_RX) || (protocol == PROTO_SCANNER) || (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_NCC1701) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_HOTT) || (protocol==PROTO_PROPEL) || (protocol==PROTO_OMP) || (protocol==PROTO_DEVO) || (protocol==PROTO_DSM_RX) || (protocol==PROTO_FRSKY_R9) || (protocol==PROTO_RLINK) || (protocol==PROTO_WFLY2)) + if((protocol == PROTO_BAYANG_RX) || (protocol == PROTO_AFHDS2A_RX) || (protocol == PROTO_FRSKY_RX) || (protocol == PROTO_SCANNER) || (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_NCC1701) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_HOTT) || (protocol==PROTO_PROPEL) || (protocol==PROTO_OMP) || (protocol==PROTO_DEVO) || (protocol==PROTO_DSM_RX) || (protocol==PROTO_FRSKY_R9) || (protocol==PROTO_RLINK) || (protocol==PROTO_WFLY2) || (protocol==PROTO_LOLI)) #endif if(IS_DISABLE_TELEM_off) TelemetryUpdate(); @@ -1495,6 +1499,12 @@ static void protocol_init() remote_callback = MT99XX_callback; break; #endif + #if defined(LOLI_NRF24L01_INO) + case PROTO_LOLI: + next_callback=initLOLI(); + remote_callback = LOLI_callback; + break; + #endif #if defined(MJXQ_NRF24L01_INO) case PROTO_MJXQ: next_callback=initMJXQ(); @@ -2061,6 +2071,14 @@ void update_serial_data() DSM_SerialRX=true; } #endif + #ifdef LOLI_NRF24L01_INO + if(protocol==PROTO_LOLI && rx_len==27+2) + {//Protocol waiting for 2 bytes + LOLI_SerialRX=true; + LOLI_P1=rx_ok_buff[27]; + LOLI_P2=rx_ok_buff[28]; + } + #endif } RX_DONOTUPDATE_off; @@ -2305,7 +2323,7 @@ void pollBoot() #if defined(TELEMETRY) void PPM_Telemetry_serial_init() { - if( (protocol==PROTO_FRSKYD) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_BAYANG)|| (protocol==PROTO_NCC1701) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_PROPEL) || (protocol==PROTO_OMP) || (protocol==PROTO_RLINK) || (protocol==PROTO_WFLY2) + if( (protocol==PROTO_FRSKYD) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_BAYANG)|| (protocol==PROTO_NCC1701) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_PROPEL) || (protocol==PROTO_OMP) || (protocol==PROTO_RLINK) || (protocol==PROTO_WFLY2) || (protocol==PROTO_LOLI) #ifdef TELEMETRY_FRSKYX_TO_FRSKYD || (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2) #endif diff --git a/Multiprotocol/SLT_nrf24l01.ino b/Multiprotocol/SLT_nrf24l01.ino index b5f62e6..2926592 100644 --- a/Multiprotocol/SLT_nrf24l01.ino +++ b/Multiprotocol/SLT_nrf24l01.ino @@ -129,7 +129,7 @@ static void __attribute__((unused)) SLT_build_packet() uint8_t e = 0; // byte where extension 2 bits for every 10-bit channel are packed for (uint8_t i = 0; i < 4; ++i) { - uint16_t v = convert_channel_10b(CH_AETR[i]); + uint16_t v = convert_channel_10b(CH_AETR[i], false); if(sub_protocol>SLT_V2 && (i==CH2 || i==CH3) ) v=1023-v; // reverse throttle and elevator channels for Q100/Q200/MR100 protocols packet[i] = v; diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index 1a9603f..43387bf 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -531,7 +531,7 @@ void frsky_link_frame() telemetry_link |= 2 ; // Send hub if available } else - {//PROTO_HUBSAN, PROTO_AFHDS2A, PROTO_BAYANG, PROTO_NCC1701, PROTO_CABELL, PROTO_HITEC, PROTO_BUGS, PROTO_BUGSMINI, PROTO_FRSKYX, PROTO_FRSKYX2, PROTO_PROPEL, PROTO_DEVO, PROTO_RLINK, PROTO_OMP, PROTO_WFLY2 + {//PROTO_HUBSAN, PROTO_AFHDS2A, PROTO_BAYANG, PROTO_NCC1701, PROTO_CABELL, PROTO_HITEC, PROTO_BUGS, PROTO_BUGSMINI, PROTO_FRSKYX, PROTO_FRSKYX2, PROTO_PROPEL, PROTO_DEVO, PROTO_RLINK, PROTO_OMP, PROTO_WFLY2, PROTO_LOLI frame[1] = v_lipo1; frame[2] = v_lipo2; frame[3] = RX_RSSI; diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index 831f9f0..e44babf 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -292,6 +292,7 @@ #undef JJRC345_NRF24L01_INO #undef KF606_NRF24L01_INO #undef KN_NRF24L01_INO + #undef LOLI_NRF24L01_INO #undef MJXQ_NRF24L01_INO #undef MT99XX_NRF24L01_INO #undef NCC1701_NRF24L01_INO @@ -360,6 +361,7 @@ #undef DSM_RX_CYRF6936_INO #undef DSM_FWD_PGM #undef WFLY2_HUB_TELEMETRY + #undef LOLI_HUB_TELEMETRY #else #if defined(MULTI_TELEMETRY) && defined(MULTI_STATUS) #error You should choose either MULTI_TELEMETRY or MULTI_STATUS but not both. @@ -434,7 +436,10 @@ #if not defined(WFLY2_A7105_INO) #undef WFLY2_HUB_TELEMETRY #endif - #if not defined(HOTT_FW_TELEMETRY) && not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BUGS_HUB_TELEMETRY) && not defined(NCC1701_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(RLINK_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) && not defined(HITEC_HUB_TELEMETRY) && not defined(HITEC_FW_TELEMETRY) && not defined(SCANNER_TELEMETRY) && not defined(FRSKY_RX_TELEMETRY) && not defined(AFHDS2A_RX_TELEMETRY) && not defined(BAYANG_RX_TELEMETRY) && not defined(DEVO_HUB_TELEMETRY) && not defined(PROPEL_HUB_TELEMETRY) && not defined(OMP_HUB_TELEMETRY) && not defined(WFLY2_HUB_TELEMETRY) + #if not defined(LOLI_NRF24L01_INO) + #undef LOLI_HUB_TELEMETRY + #endif + #if not defined(HOTT_FW_TELEMETRY) && not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BUGS_HUB_TELEMETRY) && not defined(NCC1701_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(RLINK_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) && not defined(HITEC_HUB_TELEMETRY) && not defined(HITEC_FW_TELEMETRY) && not defined(SCANNER_TELEMETRY) && not defined(FRSKY_RX_TELEMETRY) && not defined(AFHDS2A_RX_TELEMETRY) && not defined(BAYANG_RX_TELEMETRY) && not defined(DEVO_HUB_TELEMETRY) && not defined(PROPEL_HUB_TELEMETRY) && not defined(OMP_HUB_TELEMETRY) && not defined(WFLY2_HUB_TELEMETRY) && not defined(LOLI_HUB_TELEMETRY) #undef TELEMETRY #undef INVERT_TELEMETRY #undef MULTI_TELEMETRY diff --git a/Multiprotocol/XK_nrf24l01.ino b/Multiprotocol/XK_nrf24l01.ino index 5b21608..af98d7e 100644 --- a/Multiprotocol/XK_nrf24l01.ino +++ b/Multiprotocol/XK_nrf24l01.ino @@ -37,7 +37,7 @@ static uint16_t __attribute__((unused)) XK_convert_channel(uint8_t num) //debugln(",%d",val); } else - val=convert_channel_10b(num); + val=convert_channel_10b(num, false); // 1FF..01=left, 00=center, 200..3FF=right if(val==0x200) @@ -65,7 +65,7 @@ static void __attribute__((unused)) XK_send_packet() packet[14] = 0xC0; else { - uint16_t val=convert_channel_10b(THROTTLE); + uint16_t val=convert_channel_10b(THROTTLE, false); packet[0] = val>>2; // 0..255 packet[12] |= val & 2; val=XK_convert_channel(RUDDER); diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index c373d91..d1d8ef7 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -229,6 +229,7 @@ #define JJRC345_NRF24L01_INO #define KF606_NRF24L01_INO #define KN_NRF24L01_INO +#define LOLI_NRF24L01_INO #define MJXQ_NRF24L01_INO #define MT99XX_NRF24L01_INO #define NCC1701_NRF24L01_INO @@ -327,6 +328,7 @@ #define CABELL_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define RLINK_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define WFLY2_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX +#define LOLI_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define HITEC_HUB_TELEMETRY // Use FrSkyD Hub format to send basic telemetry to the radios which can decode it like er9x, erskyTX and OpenTX #define HITEC_FW_TELEMETRY // Forward received telemetry packets to be decoded by erskyTX and OpenTX #define SCANNER_TELEMETRY // Forward spectrum scanner data to TX @@ -683,6 +685,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { PROTO_KYOSHO KYOSHO_FHSS KYOSHO_HYPE + PROTO_LOLI + NONE PROTO_MJXQ WLH08 X600 diff --git a/Protocols_Details.md b/Protocols_Details.md index f550271..f2dc91a 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -110,6 +110,7 @@ CFlie|38|CFlie||||||||NRF24L01| [KF606](Protocols_Details.md#KF606---49)|49|KF606*||||||||NRF24L01|XN297 [KN](Protocols_Details.md#KN---9)|9|WLTOYS|FEILUN|||||||NRF24L01| [Kyosho](Protocols_Details.md#Kyosho---73)|73|FHSS|Hype|||||||A7105| +[LOLI](Protocols_Details.md#LOLI---82)|82|||||||||NRF24L01| [MJXq](Protocols_Details.md#MJXQ---18)|18|WLH08|X600|X800|H26D|E010*|H26WH|PHOENIX*||NRF24L01|XN297 [MT99xx](Protocols_Details.md#MT99XX---17)|17|MT|H7|YZ|LS|FY805||||NRF24L01|XN297 [NCC1701](Protocols_Details.md#NCC1701---44)|44|NCC1701||||||||NRF24L01| @@ -834,7 +835,7 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 ## E010R5 - *81* -Models: E010 R5, JJRC H36 +Models: E010 R5 red boards, JJRC H36 **Only 1 ID available** @@ -1284,6 +1285,21 @@ CH1|CH2|CH3|CH4|CH5 ---|---|---|---|--- A||T||TRIM +## LOLI - *82* +LOLI receivers. + +Failsafe supported. Once failsafe values for the 8 channels have been configured in Custom mode, wait for the RX to learn them, then set Failsafe to Receiver. + +Telemetry supported: RX RSSI, TX LQI (percentage of received packets), A1 and A2. + +Extended limits supported. + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 +---|---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 + +Assigning functions to outputs is not supported yet. + ## MJXQ - *18* Autobind protocol