From d6da230369cac037a4e894db172502b65f0d93df Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Wed, 15 Jul 2020 23:58:41 +0200 Subject: [PATCH] Flysky AFHDS2A: 16 channels + LQI Use the 2 new sub protocols to extend the protocol to 16 channels on IBUS --- Lua_scripts/MultiChan.txt | 2 + Multiprotocol/AFHDS2A_Rx_a7105.ino | 2 +- Multiprotocol/AFHDS2A_a7105.ino | 105 +++++++++++++++++------------ Multiprotocol/Multi.txt | 2 +- Multiprotocol/Multi_Names.ino | 4 +- Multiprotocol/Multiprotocol.h | 6 +- Multiprotocol/_Config.h | 3 +- Protocols_Details.md | 26 +++++-- 8 files changed, 97 insertions(+), 53 deletions(-) diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt index 4a56ccf..156e19f 100644 --- a/Lua_scripts/MultiChan.txt +++ b/Lua_scripts/MultiChan.txt @@ -51,6 +51,8 @@ 28,1,Flysky_AFHDS2A,PPM_IBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 28,2,Flysky_AFHDS2A,PWM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 28,3,Flysky_AFHDS2A,PPM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +28,4,Flysky_AFHDS2A,PWM_IB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +28,5,Flysky_AFHDS2A,PPM_IB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 56,0,Flysky2A_RX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 53,0,Flyzone,FZ-410,0 25,0,FrSkyV,V8,0,CH5,CH6,CH7,CH8 diff --git a/Multiprotocol/AFHDS2A_Rx_a7105.ino b/Multiprotocol/AFHDS2A_Rx_a7105.ino index ea85c1b..c90c1d5 100644 --- a/Multiprotocol/AFHDS2A_Rx_a7105.ino +++ b/Multiprotocol/AFHDS2A_Rx_a7105.ino @@ -39,7 +39,7 @@ static void __attribute__((unused)) AFHDS2A_Rx_build_telemetry_packet() packet_in[idx++] = 14; // number of channels in packet // pack channels for (uint8_t i = 0; i < 14; i++) { - uint32_t val = packet[9+i*2] | (packet[10+i*2] << 8); + uint32_t val = packet[9+i*2] | ((packet[10+i*2] << 8)&0x0F); if (val < 860) val = 860; // convert ppm (860-2140) to Multi (0-2047) diff --git a/Multiprotocol/AFHDS2A_a7105.ino b/Multiprotocol/AFHDS2A_a7105.ino index e0e224a..1d8bed2 100644 --- a/Multiprotocol/AFHDS2A_a7105.ino +++ b/Multiprotocol/AFHDS2A_a7105.ino @@ -78,8 +78,6 @@ enum{ static void AFHDS2A_update_telemetry() { - if(packet[0]==0xAA && packet[9]==0xFD) - return; // ignore packets which contain the RX configuration: FD FF 32 00 01 00 FF FF FF 05 DC 05 DE FA FF FF FF FF FF FF FF FF FF FF FF FF FF FF // Read TX RSSI int16_t temp=256-(A7105_ReadReg(A7105_1D_RSSI_THOLD)*8)/5; // value from A7105 is between 8 for maximum signal strength to 160 or less if(temp<0) temp=0; @@ -183,37 +181,64 @@ static void AFHDS2A_build_packet(uint8_t type) { case AFHDS2A_PACKET_STICKS: packet[0] = 0x58; - for(uint8_t ch=0; ch<14; ch++) + //16 channels + RX_LQI on channel 17 + for(uint8_t ch=0; ch>8)&0xFF; + if(ch == 16 // CH17=RX_LQI + #ifdef AFHDS2A_LQI_CH + || ch == (AFHDS2A_LQI_CH-1) // override channel with LQI + #endif + ) + val = 2000 - 10*RX_LQI; + else + val = convert_channel_ppm(CH_AETR[ch]); + if(ch<14) + { + packet[9 + ch*2] = val; + packet[10 + ch*2] = (val>>8)&0x0F; + } + else + { + packet[10 + (ch-14)*6] |= (val)<<4; + packet[12 + (ch-14)*6] |= (val)&0xF0; + packet[14 + (ch-14)*6] |= (val>>4)&0xF0; + } } - #ifdef AFHDS2A_LQI_CH - // override channel with LQI - val = 2000 - 10*RX_LQI; - packet[9+((AFHDS2A_LQI_CH-1)*2)] = val & 0xff; - packet[10+((AFHDS2A_LQI_CH-1)*2)] = (val >> 8) & 0xff; - #endif break; case AFHDS2A_PACKET_FAILSAFE: packet[0] = 0x56; - for(uint8_t ch=0; ch<14; ch++) + for(uint8_t ch=0; ch>3)+860; - packet[9 + ch*2] = failsafeMicros & 0xff; - packet[10+ ch*2] = ( failsafeMicros >> 8) & 0xff; + val = (((val<<2)+val)>>3)+860; + if(ch<14) + { + packet[9 + ch*2] = val; + packet[10 + ch*2] = (val>>8)&0x0F; + } + else + { + packet[10 + (ch-14)*6] &= 0x0F; + packet[10 + (ch-14)*6] |= (val)<<4; + packet[12 + (ch-14)*6] &= 0x0F; + packet[12 + (ch-14)*6] |= (val)&0xF0; + packet[14 + (ch-14)*6] &= 0x0F; + packet[14 + (ch-14)*6] |= (val>>4)&0xF0; + } } else #endif - { // no values - packet[9 + ch*2] = 0xff; - packet[10+ ch*2] = 0xff; - } + if(ch<14) + { // no values + packet[9 + ch*2] = 0xff; + packet[10+ ch*2] = 0xff; + } } break; case AFHDS2A_PACKET_SETTINGS: @@ -224,17 +249,14 @@ static void AFHDS2A_build_packet(uint8_t type) if(val<50 || val>400) val=50; // default is 50Hz packet[11]= val; packet[12]= val >> 8; - if(sub_protocol == PPM_IBUS || sub_protocol == PPM_SBUS) - packet[13] = 0x01; // PPM output enabled - else - packet[13] = 0x00; + packet[13] = sub_protocol & 0x01; // 1 -> PPM output enabled packet[14]= 0x00; for(uint8_t i=15; i<37; i++) packet[i] = 0xff; packet[18] = 0x05; // ? packet[19] = 0xdc; // ? packet[20] = 0x05; // ? - if(sub_protocol == PWM_SBUS || sub_protocol == PPM_SBUS) + if(sub_protocol&2) packet[21] = 0xdd; // SBUS output enabled else packet[21] = 0xde; // IBUS @@ -352,24 +374,19 @@ uint16_t ReadAFHDS2A() if(packet[0] == 0xAA && packet[9] == 0xFC) packet_type=AFHDS2A_PACKET_SETTINGS; // RX is asking for settings else - if(packet[0] == 0xAA || packet[0] == 0xAC) - { + if((packet[0] == 0xAA && packet[9]!=0xFD) || packet[0] == 0xAC) + {// Normal telemetry packet, ignore packets which contain the RX configuration: AA FD FF 32 00 01 00 FF FF FF 05 DC 05 DE FA FF FF FF FF FF FF FF FF FF FF FF FF FF FF if(!memcmp(&packet[1], rx_tx_addr, 4)) { // TX address validated - #ifdef AFHDS2A_LQI_CH - if(packet[0]==0xAA && packet[9]!=0xFD) - {// Normal telemetry packet - for(uint8_t sensor=0; sensor<7; sensor++) - {//read LQI value for RX output - uint8_t index = 9+(4*sensor); - if(packet[index]==AFHDS2A_SENSOR_RX_ERR_RATE && packet[index+2]<=100) - { - RX_LQI=packet[index+2]; - break; - } - } + for(uint8_t sensor=0; sensor<7; sensor++) + {//read LQI value for RX output + uint8_t index = 9+(4*sensor); + if(packet[index]==AFHDS2A_SENSOR_RX_ERR_RATE && packet[index+2]<=100) + { + RX_LQI=packet[index+2]; + break; } - #endif + } #if defined(AFHDS2A_FW_TELEMETRY) || defined(AFHDS2A_HUB_TELEMETRY) AFHDS2A_update_telemetry(); #endif @@ -416,6 +433,10 @@ uint16_t initAFHDS2A() rx_id[i]=eeprom_read_byte((EE_ADDR)(addr+i)); } hopping_frequency_no = 0; + if(sub_protocol&0x04) + num_ch=17; + else + num_ch=14; return 50000; } #endif diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 5eec5d6..7424f37 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -25,7 +25,7 @@ 25,FrskyV 26,HONTAI,HONTAI,JJRCX1,X5C1,FQ777_951 27,OpnLrs -28,AFHDS2A,PWM_IBUS,PPM_IBUS,PWM_SBUS,PPM_SBUS +28,AFHDS2A,PWM_IBUS,PPM_IBUS,PWM_SBUS,PPM_SBUS,PWM_IB16,PPM_IB16 29,Q2X2,Q222,Q242,Q282 30,WK2x01,WK2801,WK2401,W6_5_1,W6_6_1,W6_HEL,W6_HEL_I 31,Q303,Q303,CX35,CX10D,CX10WD diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino index a5ba64b..a3b9919 100644 --- a/Multiprotocol/Multi_Names.ino +++ b/Multiprotocol/Multi_Names.ino @@ -109,7 +109,7 @@ const char STR_SUBTYPE_MT99[] = "\x06""MT99\0 ""H7\0 ""YZ\0 ""LS\0 " const char STR_SUBTYPE_MJXQ[] = "\x07""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix"; const char STR_SUBTYPE_FY326[] = "\x05""Std\0 ""FY319"; const char STR_SUBTYPE_HONTAI[] = "\x07""Std\0 ""JJRC X1""X5C1\0 ""FQ_951"; -const char STR_SUBTYPE_AFHDS2A[] = "\x08""PWM,IBUS""PPM,IBUS""PWM,SBUS""PPM,SBUS"; +const char STR_SUBTYPE_AFHDS2A[] = "\x08""PWM,IBUS""PPM,IBUS""PWM,SBUS""PPM,SBUS""PWM,IB16""PPM,IB16"; const char STR_SUBTYPE_Q2X2[] = "\x04""Q222""Q242""Q282"; const char STR_SUBTYPE_WK2x01[] = "\x06""WK2801""WK2401""W6_5_1""W6_6_1""W6_HeL""W6_HeI"; const char STR_SUBTYPE_Q303[] = "\x06""Std\0 ""CX35\0 ""CX10D\0""CX10WD"; @@ -217,7 +217,7 @@ const mm_protocol_definition multi_protocols[] = { {PROTO_FLYSKY, STR_FLYSKY, 5, STR_SUBTYPE_FLYSKY, OPTION_NONE }, #endif #if defined(AFHDS2A_A7105_INO) - {PROTO_AFHDS2A, STR_AFHDS2A, 4, STR_SUBTYPE_AFHDS2A, OPTION_SRVFREQ }, + {PROTO_AFHDS2A, STR_AFHDS2A, 6, STR_SUBTYPE_AFHDS2A, OPTION_SRVFREQ }, #endif #if defined(AFHDS2A_RX_A7105_INO) {PROTO_AFHDS2A_RX, STR_AFHDS2A_RX,0, NO_SUBTYPE, OPTION_NONE }, diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 6893d0f..aee5352 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 39 +#define VERSION_PATCH_LEVEL 40 //****************** // Protocols @@ -129,6 +129,8 @@ enum AFHDS2A PPM_IBUS = 1, PWM_SBUS = 2, PPM_SBUS = 3, + PWM_IB16 = 4, + PPM_IB16 = 5, }; enum Hisky { @@ -895,6 +897,8 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- PPM_IBUS 1 PWM_SBUS 2 PPM_SBUS 3 + PWM_IB16 4 + PPM_IB16 5 sub_protocol==V2X2 V2X2 0 JXD506 1 diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 5895dc4..38f152c 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -263,7 +263,6 @@ //When enabled (remove the "//"), the below setting makes LQI (Link Quality Indicator) available on one of the RX ouput channel (5-14). //#define AFHDS2A_LQI_CH 14 - /**************************/ /*** FAILSAFE SETTINGS ***/ /**************************/ @@ -508,6 +507,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { PPM_IBUS PWM_SBUS PPM_SBUS + PWM_IB16 + PPM_IB16 PROTO_AFHDS2A_RX NONE PROTO_ASSAN diff --git a/Protocols_Details.md b/Protocols_Details.md index ff3770d..bdcf605 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -85,7 +85,7 @@ CFlie|38|CFlie||||||||NRF24L01| [ESky150](Protocols_Details.md#ESKY150---35)|35|ESKY150||||||||NRF24L01| [ESky150V2](Protocols_Details.md#ESKY150V2---69)|69|ESky150V2||||||||CC2500|NRF24L01 [Flysky](Protocols_Details.md#FLYSKY---1)|1|Flysky|V9x9|V6x6|V912|CX20||||A7105| -[Flysky AFHDS2A](Protocols_Details.md#FLYSKY-AFHDS2A---28)|28|PWM_IBUS|PPM_IBUS|PWM_SBUS|PPM_SBUS|||||A7105| +[Flysky AFHDS2A](Protocols_Details.md#FLYSKY-AFHDS2A---28)|28|PWM_IBUS|PPM_IBUS|PWM_SBUS|PPM_SBUS|PWM_IBUS16|PPM_IBUS16|||A7105| [Flysky AFHDS2A RX](Protocols_Details.md#FLYSKY-AFHDS2A-RX---56)|56|RX||||||||A7105| [Flyzone](Protocols_Details.md#FLYZONE---53)|53|FZ410||||||||A7105| [FQ777](Protocols_Details.md#FQ777---23)|23|FQ777||||||||NRF24L01|SSV7241 @@ -195,15 +195,12 @@ Extended limits and failsafe supported Telemetry enabled protocol: - by defaut using FrSky Hub protocol (for example er9x): RX(A1), battery voltage FS-CVT01(A2) and RX&TX RSSI - if using erskyTX and OpenTX: full telemetry information available + - if telemetry is incomplete (missing RX RSSI for example), it means that you have to upgrade your RX firmware to version 1.6 or later. You can do it from an original Flysky TX or using a STLink like explained in [this tutorial](https://www.rcgroups.com/forums/showthread.php?2677694-How-to-upgrade-Flysky-Turnigy-iA6B-RX-to-firmware-1-6-with-a-ST-Link). Option is used to change the servo refresh rate. A value of 0 gives 50Hz (min), 70 gives 400Hz (max). Specific refresh rate value can be calculated like this option=(refresh_rate-50)/5. **RX_Num is used to give a number a given RX. You must use a different RX_Num per RX. A maximum of 64 AFHDS2A RXs are supported.** -OpenTX suggested RSSI alarm threshold settings (Telemetry tab): Low=15, Critical=12. - -If telemetry is incomplete (missing RX RSSI for example), it means that you have to upgrade your RX firmware to version 1.6 or later. You can do it from an original Flysky TX or using a STLink like explained in [this tutorial](https://www.rcgroups.com/forums/showthread.php?2677694-How-to-upgrade-Flysky-Turnigy-iA6B-RX-to-firmware-1-6-with-a-ST-Link). - AFHDS2A_LQI_CH is a feature which is disabled by defaut in the _config.h file. When enabled, it makes LQI (Link Quality Indicator) available on one of the RX ouput channel (5-14). CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14 @@ -216,6 +213,25 @@ Note that the RX ouput will be AETR whatever the input channel order is. ### Sub_protocol PPM_IBUS - *1* ### Sub_protocol PWM_SBUS - *2* ### Sub_protocol PPM_SBUS - *3* +### Sub_protocol PWM_IBUS16 - *4* + +3 additional channels + +CH15|CH16|CH17 +---|---|--- +CH15|CH16|LQI + +LQI: Link Quality Indicator + +### Sub_protocol PPM_IBUS16 - *5* + +3 additional channels + +CH15|CH16|CH17 +---|---|--- +CH15|CH16|LQI + +LQI: Link Quality Indicator ## FLYSKY AFHDS2A RX - *56* The Flysky AFHDS2A receiver protocol enables master/slave trainning, separate access from 2 different radios to the same model,...