diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt index c3baece..95caf80 100644 --- a/Lua_scripts/MultiChan.txt +++ b/Lua_scripts/MultiChan.txt @@ -172,6 +172,7 @@ 5,1,V2x2,JXD506,1,Flip,Light,Pict,Video,HLess,StaSto,Emerg,Cam_UD 48,0,V761,3CH,0,Gyro,Calib,Flip,RtnAct,Rtn 48,1,V761,4CH,0,Gyro,Calib,Flip,RtnAct,Rtn +48,2,V761,TOPRC,0,Gyro,Calib,Flip,RtnAct,Rtn 46,0,V911s,V911s,1,Calib,Rate 46,1,V911s,E119,1,Calib,Rate,6G_3D 22,0,WFLY,WFR0xS,0,CH5,CH6,CH7,CH8,CH9 diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index efc4bb6..a547ce5 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -45,7 +45,7 @@ 45,E01X,E012,E015 46,V911S,V911S,E119 47,GD00x,GD_V1,GD_V2 -48,V761,3CH,4CH +48,V761,3CH,4CH,TOPRC 49,KF606,KF606,MIG320 50,Redpine,Fast,Slow 51,Potensic,A20 @@ -89,4 +89,4 @@ 90,MouldKg,Analog,Digit 91,Xerall 92,MT99xx,PA18 -93,Kyosho2,KT-17 \ No newline at end of file +93,Kyosho2,KT-17 diff --git a/Multiprotocol/Multi_Protos.ino b/Multiprotocol/Multi_Protos.ino index 001d73d..1b1c729 100644 --- a/Multiprotocol/Multi_Protos.ino +++ b/Multiprotocol/Multi_Protos.ino @@ -155,7 +155,7 @@ const char STR_SUBTYPE_WFLY[] = "\x05""WFR0x"; const char STR_SUBTYPE_WFLY2[] = "\x05""RF20x"; const char STR_SUBTYPE_HOTT[] = "\x07""Sync\0 ""No_Sync"; const char STR_SUBTYPE_PELIKAN[] = "\x05""Pro\0 ""Lite\0""SCX24"; -const char STR_SUBTYPE_V761[] = "\x03""3ch""4ch"; +const char STR_SUBTYPE_V761[] = "\x05""3ch\0 ""4ch\0 ""TOPRC"; const char STR_SUBTYPE_RLINK[] = "\x07""Surface""Air\0 ""DumboRC"; const char STR_SUBTYPE_REALACC[] = "\x03""R11"; const char STR_SUBTYPE_KYOSHO[] = "\x04""FHSS""Hype"; @@ -442,7 +442,7 @@ const mm_protocol_definition multi_protocols[] = { {PROTO_V2X2, STR_V2X2, STR_SUBTYPE_V2X2, 3, OPTION_NONE, 0, 0, SW_NRF, V2X2_init, V2X2_callback }, #endif #if defined(V761_NRF24L01_INO) - {PROTO_V761, STR_V761, STR_SUBTYPE_V761, 2, OPTION_NONE, 0, 0, SW_NRF, V761_init, V761_callback }, + {PROTO_V761, STR_V761, STR_SUBTYPE_V761, 3, OPTION_NONE, 0, 0, SW_NRF, V761_init, V761_callback }, #endif #if defined(V911S_CCNRF_INO) {PROTO_V911S, STR_V911S, STR_SUBTYPE_V911S, 2, OPTION_RFTUNE, 0, 0, SW_NRF, V911S_init, V911S_callback }, diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index bf428e5..939800d 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 3 -#define VERSION_PATCH_LEVEL 19 +#define VERSION_PATCH_LEVEL 20 #define MODE_SERIAL 0 @@ -418,6 +418,7 @@ enum V761 { V761_3CH = 0, V761_4CH = 1, + V761_TOPRC = 2, }; enum HEIGHT { diff --git a/Multiprotocol/V761_nrf24l01.ino b/Multiprotocol/V761_nrf24l01.ino index 79f8fd1..ea168ef 100644 --- a/Multiprotocol/V761_nrf24l01.ino +++ b/Multiprotocol/V761_nrf24l01.ino @@ -25,13 +25,15 @@ Multiprotocol is distributed in the hope that it will be useful, #define V761_BIND_COUNT 200 #define V761_BIND_FREQ 0x28 #define V761_RF_NUM_CHANNELS 3 +#define TOPRC_BIND_FREQ 0x2A +#define TOPRC_PACKET_PERIOD 14120 // Timeout for callback in uSec enum - { +{ V761_BIND1 = 0, V761_BIND2, V761_DATA - }; +}; static void __attribute__((unused)) V761_set_checksum() { @@ -56,14 +58,11 @@ static void __attribute__((unused)) V761_send_packet() if(phase != V761_DATA) { - packet[0] = rx_tx_addr[0]; - packet[1] = rx_tx_addr[1]; - packet[2] = rx_tx_addr[2]; - packet[3] = rx_tx_addr[3]; + memcpy(packet, rx_tx_addr, 4); packet[4] = hopping_frequency[1]; packet[5] = hopping_frequency[2]; if(phase == V761_BIND2) - packet[6] = 0xf0; // ? + packet[6] = 0xF0; // ? } else { @@ -72,23 +71,22 @@ static void __attribute__((unused)) V761_send_packet() { hopping_frequency_no = 0; packet_count++; - if(packet_count >= 4) - packet_count = 0; + packet_count &= 0x03; } packet[0] = convert_channel_8b(THROTTLE); // Throttle packet[2] = convert_channel_8b(ELEVATOR)>>1; // Elevator - if(sub_protocol==V761_3CH) - { - packet[1] = convert_channel_8b(RUDDER)>>1; // Rudder - packet[3] = convert_channel_8b(AILERON)>>1; // Aileron - } - else + if(sub_protocol == V761_4CH || sub_protocol == V761_TOPRC) { packet[1] = convert_channel_8b(AILERON)>>1; // Aileron packet[3] = convert_channel_8b(RUDDER)>>1; // Rudder } + else + { + packet[1] = convert_channel_8b(RUDDER)>>1; // Rudder + packet[3] = convert_channel_8b(AILERON)>>1; // Aileron + } packet[5] = packet_count<<6; // 0X, 4X, 8X, CX packet[4] = 0x20; // Trims 00..20..40, 0X->20 4X->TrAil 8X->TrEle CX->TrRud @@ -112,7 +110,7 @@ static void __attribute__((unused)) V761_send_packet() packet[6] = GET_FLAG(CH7_SW, 0x20) // Flip |GET_FLAG(CH8_SW, 0x08) // RTH activation |GET_FLAG(CH9_SW, 0x10); // RTH on/off - if(sub_protocol==V761_3CH) + if(sub_protocol == V761_3CH) packet[6] |= 0x80; // Unknown, set on original V761-1 dump but not on eachine dumps, keeping for compatibility } V761_set_checksum(); @@ -137,28 +135,36 @@ static void __attribute__((unused)) V761_RF_init() static void __attribute__((unused)) V761_initialize_txid() { #ifdef V761_FORCE_ID - switch(RX_num%5) + if(sub_protocol == V761_TOPRC) + { //Dump from air on TopRCHobby TX + memcpy(rx_tx_addr,(uint8_t *)"\xD5\x01\x00\x00",4); + memcpy(hopping_frequency,(uint8_t *)"\x2E\x41",2); + } + else { - case 1: //Dump from air on Protonus TX - memcpy(rx_tx_addr,(uint8_t *)"\xE8\xE4\x45\x09",4); - memcpy(hopping_frequency,(uint8_t *)"\x0D\x21",2); - break; - case 2: //Dump from air on mshagg2 TX - memcpy(rx_tx_addr,(uint8_t *)"\xAE\xD1\x45\x09",4); - memcpy(hopping_frequency,(uint8_t *)"\x13\x1D",2); - break; - case 3: //Dump from air on MikeHRC Eachine TX - memcpy(rx_tx_addr,(uint8_t *)"\x08\x03\x00\xA0",4); - memcpy(hopping_frequency,(uint8_t *)"\x0D\x21",2); - break; - case 4: //Dump from air on Crashanium Eachine TX - memcpy(rx_tx_addr,(uint8_t *)"\x58\x08\x00\xA0",4); - memcpy(hopping_frequency,(uint8_t *)"\x0D\x31",2); - break; - default: //Dump from SPI - memcpy(rx_tx_addr,(uint8_t *)"\x6f\x2c\xb1\x93",4); - memcpy(hopping_frequency,(uint8_t *)"\x14\x1e",2); - break; + switch(RX_num%5) + { + case 1: //Dump from air on Protonus TX + memcpy(rx_tx_addr,(uint8_t *)"\xE8\xE4\x45\x09",4); + memcpy(hopping_frequency,(uint8_t *)"\x0D\x21",2); + break; + case 2: //Dump from air on mshagg2 TX + memcpy(rx_tx_addr,(uint8_t *)"\xAE\xD1\x45\x09",4); + memcpy(hopping_frequency,(uint8_t *)"\x13\x1D",2); + break; + case 3: //Dump from air on MikeHRC Eachine TX + memcpy(rx_tx_addr,(uint8_t *)"\x08\x03\x00\xA0",4); + memcpy(hopping_frequency,(uint8_t *)"\x0D\x21",2); + break; + case 4: //Dump from air on Crashanium Eachine TX + memcpy(rx_tx_addr,(uint8_t *)"\x58\x08\x00\xA0",4); + memcpy(hopping_frequency,(uint8_t *)"\x0D\x31",2); + break; + default: //Dump from SPI + memcpy(rx_tx_addr,(uint8_t *)"\x6f\x2c\xb1\x93",4); + memcpy(hopping_frequency,(uint8_t *)"\x14\x1e",2); + break; + } } #else //Tested with Eachine RX @@ -180,8 +186,8 @@ uint16_t V761_callback() if(bind_counter) bind_counter--; packet_count ++; - XN297_RFChannel(V761_BIND_FREQ); - XN297_SetTXAddr((uint8_t*)"\x34\x43\x10\x10", 4); + XN297_RFChannel(sub_protocol == V761_TOPRC ? TOPRC_BIND_FREQ : V761_BIND_FREQ); + XN297_SetTXAddr(rx_id, 4); V761_send_packet(); if(packet_count >= 20) { @@ -210,17 +216,28 @@ uint16_t V761_callback() return 15730; case V761_DATA: #ifdef MULTI_SYNC - telemetry_set_input_sync(V761_PACKET_PERIOD); + telemetry_set_input_sync(packet_period); #endif V761_send_packet(); break; } - return V761_PACKET_PERIOD; + return packet_period; } void V761_init(void) { V761_initialize_txid(); + if(sub_protocol == V761_TOPRC) + { + memcpy(rx_id,(uint8_t*)"\x20\x21\x05\x0A",4); + packet_period = TOPRC_PACKET_PERIOD; + } + else + { + memcpy(rx_id,(uint8_t*)"\x34\x43\x10\x10",4); + packet_period = V761_PACKET_PERIOD; + } + if(IS_BIND_IN_PROGRESS) { bind_counter = V761_BIND_COUNT; @@ -231,7 +248,7 @@ void V761_init(void) XN297_SetTXAddr(rx_tx_addr, 4); phase = V761_DATA; } - + V761_RF_init(); hopping_frequency_no = 0; packet_count = 0; diff --git a/Protocols_Details.md b/Protocols_Details.md index 21b836e..6df48a5 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -141,7 +141,7 @@ CFlie|38|CFlie||||||||NRF24L01| [Tiger](Protocols_Details.md#Tiger---61)|61|||||||||NRF24L01|XN297 [Traxxas](Protocols_Details.md#Traxxas---43)|43|6519 RX||||||||CYRF6936| [V2x2](Protocols_Details.md#V2X2---5)|5|V2x2|JXD506|MR101||||||NRF24L01| -[V761](Protocols_Details.md#V761---48)|48|3CH|4CH|||||||NRF24L01|XN297 +[V761](Protocols_Details.md#V761---48)|48|3CH|4CH|TOPRC||||||NRF24L01|XN297 [V911S](Protocols_Details.md#V911S---46)|46|V911S*|E119*|||||||NRF24L01|XN297 [WFLY](Protocols_Details.md#WFLY---40)|40|WFR0x||||||||CYRF6936| [WFLY2](Protocols_Details.md#WFLY2---79)|79|RF20x||||||||A7105| @@ -1951,14 +1951,21 @@ Flip: momentary switch: hold flip(+100%), indicate flip direction with Ele or Ai RTN_ACT and RTN: -100% disable, +100% enable ### Sub_protocol 3CH - *0* -Model: Volantex V761-1, V761-3 and may be others +Models: Volantex V761-1, V761-3 and may be others CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- -|E|T|R|GYRO|CALIB|FLIP|RTN_ACT|RTN ### Sub_protocol 4CH - *1* -Model: Volantex V761-4+ and Eachine P51-D, F4U, F22 and may be others +Models: Volantex V761-4+ and Eachine P51-D, F4U, F22 and may be others + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 +---|---|---|---|---|---|---|---|--- +A|E|T|R|GYRO|CALIB|FLIP|RTN_ACT|RTN + +### Sub_protocol TOPRC - *2* +Models: Top RC Hobby Spitfire, P51D, BF-109 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|---