diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt index 7f203a9..bab4fae 100644 --- a/Lua_scripts/MultiChan.txt +++ b/Lua_scripts/MultiChan.txt @@ -54,10 +54,9 @@ 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 -28,6,Flysky_AFHDS2A,PWM_SB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 -28,7,Flysky_AFHDS2A,PPM_SB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +28,4,Flysky_AFHDS2A,Gyro_Off,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,ST_Ga,TH_Ga,Prio,Calib +28,5,Flysky_AFHDS2A,Gyro_On,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,ST_Ga,TH_Ga,Prio,Calib +28,6,Flysky_AFHDS2A,G_On_Rev,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,ST_Ga,TH_Ga,Prio,Calib 56,0,Flysky2A_RX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 56,1,Flysky2A_RX,CPPM,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 53,0,Height,5ch,0,Gear diff --git a/Multiprotocol/AFHDS2A_Rx_a7105.ino b/Multiprotocol/AFHDS2A_Rx_a7105.ino index ef78265..d91b97c 100644 --- a/Multiprotocol/AFHDS2A_Rx_a7105.ino +++ b/Multiprotocol/AFHDS2A_Rx_a7105.ino @@ -183,8 +183,18 @@ uint16_t AFHDS2A_RX_callback() case AFHDS2A_RX_DATA: if (AFHDS2A_RX_data_ready()) { A7105_ReadData(AFHDS2A_RX_TXPACKET_SIZE); - if (memcmp(&packet[1], rx_id, 4) == 0 && memcmp(&packet[5], rx_tx_addr, 4) == 0) { - if (packet[0] == 0x58 && packet[37] == 0x00 && (telemetry_link&0x7F) == 0) { // standard packet, send channels to TX + if (memcmp(&packet[1], rx_id, 4) == 0 && memcmp(&packet[5], rx_tx_addr, 4) == 0) + { + #if 0 + //if(packet[0] == 0xAA) + { + for(uint8_t i=0;i>8)&0x0F; + } else - val = convert_channel_ppm(CH_AETR[ch]); + { + if(ch == 16) //CH17=RX_LQI + val = 2000 - 10*RX_LQI; + packet[10 + (ch-14)*6] |= (val)<<4; + packet[12 + (ch-14)*6] |= (val)&0xF0; + packet[14 + (ch-14)*6] |= (val>>4)&0xF0; + } + } + { + uint8_t next_hop = (hopping_frequency_no+1)&0x0F; + packet[34] |= next_hop<<4; + packet[36] |= next_hop?0x80:0x90; + } + break; + case AFHDS2A_PACKET_FAILSAFE: + packet[0] = 0x56; + for(uint8_t ch=0; ch<16; ch++) + { // Failsafe values + #ifdef FAILSAFE_ENABLE + val = Failsafe_data[protocol==PROTO_AFHDS2A?CH_AETR[ch]:ch]; // No remapping for BS receivers + if(val!=FAILSAFE_CHANNEL_HOLD && val!=FAILSAFE_CHANNEL_NOPULSES) + val = (((val<<2)+val)>>3)+860; + else + #endif + val = 0x0FFF; if(ch<14) { packet[9 + ch*2] = val; @@ -209,42 +235,6 @@ static void AFHDS2A_build_packet(uint8_t type) } } break; - case AFHDS2A_PACKET_FAILSAFE: - packet[0] = 0x56; - for(uint8_t ch=0; ch>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 - if(ch<14) - { // no values - packet[9 + ch*2] = 0xff; - packet[10+ ch*2] = 0xff; - } - } - break; case AFHDS2A_PACKET_SETTINGS: packet[0] = 0xaa; packet[9] = 0xfd; @@ -253,17 +243,43 @@ 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; - 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&2) - packet[21] = 0xdd; // SBUS output enabled + memset(&packet[15],0xFF,22); +#ifndef MULTI_AIR + if(sub_protocol < AFHDS2A_GYRO_OFF) + { +#endif + packet[13] = sub_protocol & 0x01; // 1 -> PPM output enabled + packet[14] = 0x00; // ? + packet[18] = 0x05; // ? + packet[19] = 0xdc; // ? + packet[20] = 0x05; // ? + if(sub_protocol&2) + packet[21] = 0xdd; // SBUS output enabled + else + packet[21] = 0xde; // IBUS +#ifndef MULTI_AIR + } else - packet[21] = 0xde; // IBUS + {//BS receivers + if(sub_protocol == AFHDS2A_GYRO_OFF) + { + memset(&packet[15],0x00,4); + packet[22] = 0xFC; // ? + } + else + {//AFHDS2A_GYRO_ON & AFHDS2A_GYRO_ON_REV + packet[15] = convert_channel_16b_limit(CH13,0,100); // ST Gain + packet[16] = convert_channel_16b_limit(CH14,0,100); // TH Gain + packet[17] = convert_channel_16b_limit(CH15,0,100); // Priority + if(sub_protocol == AFHDS2A_GYRO_ON_REV) + packet[17] |= 0x80; // Reverse + packet[18] = CH16_SW?(0x32|0x80):0x32; // Calib|50? + packet[19] = 0x64; // 100? + packet[20] = 0x64; // 100? + packet[22] = 0xFE; // ? + } + } +#endif break; } packet[37] = 0x00; @@ -283,6 +299,9 @@ uint16_t AFHDS2A_callback() static uint16_t packet_counter; uint8_t data_rx=0; uint16_t start; + #ifndef MULTI_AIR + static uint16_t Prev_Channel[4] = { 0,0,0,0 }; + #endif #ifndef FORCE_AFHDS2A_TUNING A7105_AdjustLOBaseFreq(1); #endif @@ -367,10 +386,39 @@ uint16_t AFHDS2A_callback() AFHDS2A_build_packet(packet_type); data_rx=A7105_ReadReg(A7105_00_MODE); // Check if something has been received... A7105_WriteData(AFHDS2A_TXPACKET_SIZE, hopping_frequency[hopping_frequency_no++]); - if(hopping_frequency_no >= AFHDS2A_NUMFREQ) - hopping_frequency_no = 0; + hopping_frequency_no &= 0x0F; // AFHDS2A_NUMFREQ + #if 0 + for(uint8_t i=0; i AFHDS2A_GYRO_OFF) + {//Gyro is on + //Check if gyro settings have changed + uint16_t val; + for(uint8_t i=0;i<4;i++) + { + val = Channel_data[CH13+i] - Prev_Channel[i]; + if(val&0x8000) val ^= 0xFFFF; + if(val > 10) + {//This setting has significantly changed + Prev_Channel[i] = Channel_data[CH13+i]; + packet_sent = 5; + } + } + } + if(packet_sent && (packet_counter%5)==0) + {//Inform the RX of the change + packet_type = AFHDS2A_PACKET_SETTINGS; + packet_sent--; + } + else + #endif if(!(packet_counter % 1313)) + {//Send settings every 5s packet_type = AFHDS2A_PACKET_SETTINGS; + } else { #ifdef FAILSAFE_ENABLE @@ -448,9 +496,6 @@ void AFHDS2A_init() 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; + packet_sent = 0; } #endif diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index cb684de..1398347 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -25,7 +25,7 @@ 25,FrskyV 26,HONTAI,HONTAI,JJRCX1,X5C1,FQ777_951,XKK170 27,OpnLrs -28,AFHDS2A,PWM_IBUS,PPM_IBUS,PWM_SBUS,PPM_SBUS,PWM_IB16,PPM_IB16,PWM_SB16,PPM_SB16 +28,AFHDS2A,PWM_IBUS,PPM_IBUS,PWM_SBUS,PPM_SBUS,Gyro_Off,Gyro_On,G_On_Rev 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_Protos.ino b/Multiprotocol/Multi_Protos.ino index 2e04a90..527059b 100644 --- a/Multiprotocol/Multi_Protos.ino +++ b/Multiprotocol/Multi_Protos.ino @@ -147,7 +147,7 @@ const char STR_SUBTYPE_MT992[] = "\x04""PA18""SU35"; 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[] = "\x06""Std\0 ""JJRCX1""X5C1\0 ""FQ_951""XKK170"; -const char STR_SUBTYPE_AFHDS2A[] = "\x08""PWM,IBUS""PPM,IBUS""PWM,SBUS""PPM,SBUS""PWM,IB16""PPM,IB16""PWM,SB16""PPM,SB16"; +const char STR_SUBTYPE_AFHDS2A[] = "\x08""PWM,IBUS""PPM,IBUS""PWM,SBUS""PPM,SBUS""Gyro_Off""Gyro_On\0""G_On_Rev"; 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"; @@ -307,7 +307,7 @@ const mm_protocol_definition multi_protocols[] = { {PROTO_FLYSKY, STR_FLYSKY, STR_SUBTYPE_FLYSKY, 5, OPTION_NONE, 0, 1, SW_A7105, FLYSKY_init, FLYSKY_callback }, #endif #if defined(AFHDS2A_A7105_INO) - {PROTO_AFHDS2A, STR_AFHDS2A, STR_SUBTYPE_AFHDS2A, 8, OPTION_SRVFREQ, 1, 1, SW_A7105, AFHDS2A_init, AFHDS2A_callback }, + {PROTO_AFHDS2A, STR_AFHDS2A, STR_SUBTYPE_AFHDS2A, 7, OPTION_SRVFREQ, 1, 1, SW_A7105, AFHDS2A_init, AFHDS2A_callback }, #endif #if defined(AFHDS2A_RX_A7105_INO) {PROTO_AFHDS2A_RX, STR_AFHDS2A_RX,STR_CPPM, NBR_CPPM, OPTION_NONE, 0, 0, SW_A7105, AFHDS2A_RX_init, AFHDS2A_RX_callback }, diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index ecac878..6bce16f 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 4 -#define VERSION_PATCH_LEVEL 46 +#define VERSION_PATCH_LEVEL 47 #define MODE_SERIAL 0 @@ -159,14 +159,13 @@ enum Hubsan }; enum AFHDS2A { - PWM_IBUS = 0, - PPM_IBUS = 1, - PWM_SBUS = 2, - PPM_SBUS = 3, - PWM_IB16 = 4, - PPM_IB16 = 5, - PWM_SB16 = 6, - PPM_SB16 = 7, + PWM_IBUS = 0, + PPM_IBUS = 1, + PWM_SBUS = 2, + PPM_SBUS = 3, + AFHDS2A_GYRO_OFF = 4, + AFHDS2A_GYRO_ON = 5, + AFHDS2A_GYRO_ON_REV = 6, }; enum Hisky { diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 1e29725..9f4d65b 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -211,7 +211,7 @@ #define FRSKYL_CC2500_INO #define FRSKYD_CC2500_INO #define FRSKYV_CC2500_INO -#define FRSKYX_CC2500_INO +#define FRSKYX_CC2500_INO //Include FRSKYX2 protocol #define FRSKY_RX_CC2500_INO #define HITEC_CC2500_INO #define HOTT_CC2500_INO @@ -302,11 +302,6 @@ //Enable DSM Forward Programming #define DSM_FWD_PGM -//AFHDS2A specific settings -//------------------------- -//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 ***/ /**************************/ @@ -568,10 +563,9 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { PPM_IBUS PWM_SBUS PPM_SBUS - PWM_IB16 - PPM_IB16 - PWM_SB16 - PPM_SB16 + AFHDS2A_GYRO_OFF + AFHDS2A_GYRO_ON + AFHDS2A_GYRO_ON_REV PROTO_AFHDS2A_RX NONE PROTO_ASSAN diff --git a/Protocols_Details.md b/Protocols_Details.md index e9c6f18..80ccf2f 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -88,7 +88,7 @@ CFlie|38|CFlie||||||||NRF24L01| [ESky150](Protocols_Details.md#ESKY150---35)|35|||||||||NRF24L01| [ESky150V2](Protocols_Details.md#ESKY150V2---69)|69|||||||||CC2500|NRF51822 [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|PWM_IBUS16|PPM_IBUS16|PWM_SBUS16|PPM_SBUS16|A7105| +[Flysky AFHDS2A](Protocols_Details.md#FLYSKY-AFHDS2A---28)|28|PWM_IBUS|PPM_IBUS|PWM_SBUS|PPM_SBUS|Gyro_Off|Gyro_On|Gyro_On_Rev||A7105| [Flysky AFHDS2A RX](Protocols_Details.md#FLYSKY-AFHDS2A-RX---56)|56|Multi|CPPM|||||||A7105| [FQ777](Protocols_Details.md#FQ777---23)|23|||||||||NRF24L01|SSV7241 [FrskyD](Protocols_Details.md#FRSKYD---3)|3|D8|Cloned|||||||CC2500| @@ -227,36 +227,59 @@ Telemetry enabled protocol: - 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). +LQI: Link Quality Indicator which is sent back to the RX on CH17 + 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.** -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 ----|---|---|---|---|---|---|---|---|---|---|---|---|--- -A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14 - -RX output will match the Flysky standard AETR independently of the input configuration AETR, RETA... unless on OpenTX 2.3.3+ you use the "Disable channel mapping" feature on the GUI. - ### Sub_protocol PWM_IBUS - *0* +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|CH17 +---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|--- +A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14CH15|CH16|LQI + +RX output will match the Flysky standard AETR. + ### Sub_protocol PPM_IBUS - *1* +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|CH17 +---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|--- +A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14CH15|CH16|LQI + +RX output will match the Flysky standard AETR. + ### Sub_protocol PWM_SBUS - *2* -### Sub_protocol PPM_SBUS - *3* -As stated above. +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|CH17 +---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|--- +A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14CH15|CH16|LQI -### Sub_protocol PWM_IBUS16 - *4* -### Sub_protocol PPM_IBUS16 - *5* -### Sub_protocol PWM_SBUS16 - *6* -### Sub_protocol PPM_SBUS16 - *7* +RX output will match the Flysky standard AETR. -3 additional channels. Need recent or updated RXs. +### Sub_protocol Gyro_Off - *3* +RXs: FS-BS6, FS-BS4 -CH15|CH16|CH17 ----|---|--- -CH15|CH16|LQI +Gyro is off -LQI: Link Quality Indicator +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|CH17 +---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|-|-|-|-|LQI + +### Sub_protocol Gyro_On - *4* +RXs: FS-BS6, FS-BS4 + +Gyro is on + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|CH17 +---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|ST_Gain|TH_Gain|Priority|Calib|LQI + +### Sub_protocol Gyro_On_Rev - *5* +RXs: FS-BS6, FS-BS4 + +Gyro is on and reversed + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16|CH17 +---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|ST_Gain|TH_Gain|Priority|Calib|LQI ## FLYSKY AFHDS2A RX - *56* The Flysky AFHDS2A receiver protocol enables master/slave trainning, separate access from 2 different radios to the same model,...