From 50bd4850fad774ba98aba231d981105638dd5625 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Fri, 16 Feb 2024 18:03:32 +0100 Subject: [PATCH] Radiolink/RC4G 1 ID / 1 set of frequency --- Lua_scripts/MultiChan.txt | 3 +- Multiprotocol/Multi.txt | 2 +- Multiprotocol/Multi_Protos.ino | 4 +- Multiprotocol/Multiprotocol.h | 1 + Multiprotocol/RadioLink_cc2500.ino | 119 ++++++++++++++++++++++++----- Multiprotocol/_Config.h | 3 + Protocols_Details.md | 17 ++++- 7 files changed, 125 insertions(+), 24 deletions(-) diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt index 3303ca5..883727b 100644 --- a/Lua_scripts/MultiChan.txt +++ b/Lua_scripts/MultiChan.txt @@ -156,6 +156,7 @@ 74,0,RadioLink,Surface,0,CH5,CH6,CH7,CH8,FS_CH1,FS_CH2,FS_CH3,FS_CH4,FS_CH5,FS_CH6,FS_CH7,FS_CH8 74,1,RadioLink,Air,0,CH5,CH6,CH7,CH8,FS_CH1,FS_CH2,FS_CH3,FS_CH4,FS_CH5,FS_CH6,FS_CH7,FS_CH8 74,2,RadioLink,DumboRC,0,CH5,CH6,CH7,CH8,FS_CH1,FS_CH2,FS_CH3,FS_CH4,FS_CH5,FS_CH6,FS_CH7,FS_CH8 +74,3,RadioLink,RC4G,0,CH5,FS_CH1,FS_CH2,FS_CH3,FS_CH4 76,0,Realacc,R11,1,Flip,Light,Calib,HLess,RTH,UNK 50,0,Redpine,Fast,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16 50,1,Redpine,Slow,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16 @@ -212,4 +213,4 @@ 94,0,Scorpio 95,0,Bluefly,HP100,0,CH5,CH6,CH7,CH8 96,0,BumbleB -97,0,SGF22,Std,1,Mode,Flip,LED,Pict +97,0,SGF22,Std,1,Mode,Flip,LED,Pict,Video diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index c7244bf..7d87c33 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -71,7 +71,7 @@ 71,JJRC345,JJRC345,SkyTmblr 72,Q90C 73,Kyosho,FHSS,Hype -74,RadioLink,Surface,Air,DumboRC +74,RadioLink,Surface,Air,DumboRC,RC4G 75,--- 76,Realacc,R11 77,OMP diff --git a/Multiprotocol/Multi_Protos.ino b/Multiprotocol/Multi_Protos.ino index 3ffc349..3f62ef0 100644 --- a/Multiprotocol/Multi_Protos.ino +++ b/Multiprotocol/Multi_Protos.ino @@ -168,7 +168,7 @@ 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[] = "\x05""3ch\0 ""4ch\0 ""TOPRC"; -const char STR_SUBTYPE_RLINK[] = "\x07""Surface""Air\0 ""DumboRC"; +const char STR_SUBTYPE_RLINK[] = "\x07""Surface""Air\0 ""DumboRC""RC4G\0 "; const char STR_SUBTYPE_REALACC[] = "\x03""R11"; const char STR_SUBTYPE_KYOSHO[] = "\x04""FHSS""Hype"; const char STR_SUBTYPE_KYOSHO2[] = "\x05""KT-17"; @@ -431,7 +431,7 @@ const mm_protocol_definition multi_protocols[] = { {PROTO_Q90C, STR_Q90C, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, Q90C_init, Q90C_callback }, #endif #if defined(RLINK_CC2500_INO) - {PROTO_RLINK, STR_RLINK, STR_SUBTYPE_RLINK, 3, OPTION_RFTUNE, 0, 0, SW_CC2500, RLINK_init, RLINK_callback }, + {PROTO_RLINK, STR_RLINK, STR_SUBTYPE_RLINK, 4, OPTION_RFTUNE, 0, 0, SW_CC2500, RLINK_init, RLINK_callback }, #endif #if defined(REALACC_NRF24L01_INO) {PROTO_REALACC, STR_REALACC, STR_SUBTYPE_REALACC, 1, OPTION_NONE, 0, 0, SW_NRF, REALACC_init, REALACC_callback }, diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 47c6b8e..a584030 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -451,6 +451,7 @@ enum RLINK RLINK_SURFACE = 0, RLINK_AIR = 1, RLINK_DUMBORC = 2, + RLINK_RC4G = 3, }; enum MOULDKG { diff --git a/Multiprotocol/RadioLink_cc2500.ino b/Multiprotocol/RadioLink_cc2500.ino index 45611a9..6b845a6 100644 --- a/Multiprotocol/RadioLink_cc2500.ino +++ b/Multiprotocol/RadioLink_cc2500.ino @@ -18,7 +18,11 @@ #include "iface_cc2500.h" +//#define RLINK_DEBUG +//#define RLINK_DEBUG_TELEM + //#define RLINK_FORCE_ID +#define RLINK_RC4G_FORCE_ID #define RLINK_TX_PACKET_LEN 33 #define RLINK_RX_PACKET_LEN 15 @@ -97,16 +101,37 @@ static void __attribute__((unused)) RLINK_hop() static void __attribute__((unused)) RLINK_TXID_init() { + #ifdef RLINK_RC4G_FORCE_ID + //TODO: test any ID + if(sub_protocol==RLINK_RC4G) + { + rx_tx_addr[1]=0x77; + rx_tx_addr[2]=0x00; + rx_tx_addr[3]=0x00; + } + #endif #ifdef RLINK_FORCE_ID - //surface RC6GS - memcpy(rx_tx_addr,"\x3A\x99\x22\x3A",RLINK_TX_ID_LEN); - //air T8FB - //memcpy(rx_tx_addr,"\xFC\x11\x0D\x20",RLINK_TX_ID_LEN); + if(sub_protocol==RLINK_SURFACE) + memcpy(rx_tx_addr,"\x3A\x99\x22\x3A",RLINK_TX_ID_LEN); //surface RC6GS + else + memcpy(rx_tx_addr,"\xFC\x11\x0D\x20",RLINK_TX_ID_LEN); //air T8FB #endif // channels order depend on ID - RLINK_hop(); + if(sub_protocol!=RLINK_RC4G) + RLINK_hop(); + else + { + // Find 2 unused channels + // first channel is a multiple of 3 between 00 and 5D + // second channel is a multiple of 3 between 63 and BD + //TODO: find 2 unused channels + #ifdef RLINK_RC4G_FORCE_ID + hopping_frequency[0] = 0x03; + hopping_frequency[1] = 0x6F; + #endif + } - #if 0 + #ifdef RLINK_DEBUG debug("ID:"); for(uint8_t i=0;i5) packet_count=0; - //debugln("C= 0x%02X",hopping_frequency[pseudo & 0x0F]); - //debug("P="); - //for(uint8_t i=1;i>1]); + #ifdef RLINK_DEBUG + debug("C= 0x%02X ",hopping_frequency[packet_count>>1]); + #endif + // packet length + packet[0] = 0x0F; + //address + memcpy(&packet[1], &rx_tx_addr[1], 3); + //channels + for(uint i=0;i<2;i++) + { + val = Channel_data[2*i ] +400 -24; + packet[4+i*2] = val; + packet[8+i ] = val>>8; + val = Channel_data[2*i+1] +400 -24; + packet[5+i*2] = val; + packet[8+i ] |= (val>>4) & 0xF0; + } + //special channel which is linked to gyro on the orginal TX but allocating it on CH5 here + packet[10] = convert_channel_16b_limit(CH5,0,100); + //failsafe + for(uint8_t i=0;i<4;i++) + packet[11+i] = convert_channel_16b_limit(CH6+i,0,200); + //next hop + packet_count++; + packet_count &= 0x03; + packet[15] = hopping_frequency[packet_count>>1]; + // send packet + CC2500_WriteData(packet, 16); + + #ifdef RLINK_DEBUG + debug("P="); + for(uint8_t i=1;i<16;i++) + debug(" 0x%02X",packet[i]); + debugln(""); + #endif } #define RLINK_TIMING_PROTO 20000-100 // -100 for compatibility with R8EF #define RLINK_TIMING_RFSEND 10500 #define RLINK_TIMING_CHECK 2000 +#define RLINK_RC4G_TIMING_PROTO 14460 uint16_t RLINK_callback() { + if(sub_protocol == RLINK_RC4G) + { + #ifdef MULTI_SYNC + telemetry_set_input_sync(RLINK_RC4G_TIMING_PROTO); + #endif + RLINK_RC4G_send_packet(); + return RLINK_RC4G_TIMING_PROTO; + } switch(phase) { case RLINK_DATA: @@ -259,13 +339,16 @@ uint16_t RLINK_callback() len = CC2500_ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; if (len == RLINK_RX_PACKET_LEN + 1 + 2) //Telemetry frame is 15 bytes + 1 byte for length + 2 bytes for RSSI&LQI&CRC { - //debug("Telem:"); + #ifdef RLINK_DEBUG_TELEM + debug("Telem:"); + #endif CC2500_ReadData(packet_in, len); if(packet_in[0]==RLINK_RX_PACKET_LEN && (packet_in[len-1] & 0x80) && memcmp(&packet[2],rx_tx_addr,RLINK_TX_ID_LEN)==0 && packet_in[6]==packet[1]) {//Correct telemetry received: length, CRC, ID and type - //Debug - //for(uint8_t i=0;i=128) TX_RSSI -= 128; @@ -278,7 +361,9 @@ uint16_t RLINK_callback() pps_counter++; packet_count=0; } - //debugln(""); + #ifdef RLINK_DEBUG_TELEM + debugln(""); + #endif } if (millis() - pps_timer >= 2000) {//1 telemetry packet every 100ms diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index a88b650..0495cd9 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -796,10 +796,13 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { RLINK_SURFACE RLINK_AIR RLINK_DUMBORC + RLINK_RC4G PROTO_SCANNER NONE PROTO_SCORPIO NONE + PROTO_SGF22 + NONE PROTO_SHENQI NONE PROTO_SKYARTEC diff --git a/Protocols_Details.md b/Protocols_Details.md index ce7dc8c..6a4f8b2 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -1001,6 +1001,17 @@ Telemetry: RX_RSSI (for the original value add -256), TX_RSSI, TX_QLY (0..100%) ### Sub_protocol DumboRC - *2* Compatible RXs: X6/X6F/X6FG +### Sub_protocol RC4G - *3* +Compatible RXs: R4EH-G(/R4EH-H) + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 +---|---|---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|CH5|FS_CH1|FS_CH2|FS_CH3|FS_CH4 + +FS=FailSafe + +CH5 is driven by CH3 on the original TX, gyro sensibility? + ## Futaba - *21* Also called SFHSS depending on radio version. @@ -1942,9 +1953,9 @@ Only 1 ID !!! Need more TX dumps. Model: SGF22 -CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ----|---|---|---|---|---|---|--- -A|E|T|R|MODE|FLIP|LIGHT|PHOTO +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 +---|---|---|---|---|---|---|---|--- +A|E|T|R|MODE|FLIP|LIGHT|PHOTO|VIDEO ## Shenqi - *19* Autobind protocol