Radiolink/RC4G

1 ID / 1 set of frequency
This commit is contained in:
pascallanger 2024-02-16 18:03:32 +01:00
parent dc1490b9b0
commit 50bd4850fa
7 changed files with 125 additions and 24 deletions

View File

@ -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,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,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,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 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,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 50,1,Redpine,Slow,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16
@ -212,4 +213,4 @@
94,0,Scorpio 94,0,Scorpio
95,0,Bluefly,HP100,0,CH5,CH6,CH7,CH8 95,0,Bluefly,HP100,0,CH5,CH6,CH7,CH8
96,0,BumbleB 96,0,BumbleB
97,0,SGF22,Std,1,Mode,Flip,LED,Pict 97,0,SGF22,Std,1,Mode,Flip,LED,Pict,Video

View File

@ -71,7 +71,7 @@
71,JJRC345,JJRC345,SkyTmblr 71,JJRC345,JJRC345,SkyTmblr
72,Q90C 72,Q90C
73,Kyosho,FHSS,Hype 73,Kyosho,FHSS,Hype
74,RadioLink,Surface,Air,DumboRC 74,RadioLink,Surface,Air,DumboRC,RC4G
75,--- 75,---
76,Realacc,R11 76,Realacc,R11
77,OMP 77,OMP

View File

@ -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_HOTT[] = "\x07""Sync\0 ""No_Sync";
const char STR_SUBTYPE_PELIKAN[] = "\x05""Pro\0 ""Lite\0""SCX24"; 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_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_REALACC[] = "\x03""R11";
const char STR_SUBTYPE_KYOSHO[] = "\x04""FHSS""Hype"; const char STR_SUBTYPE_KYOSHO[] = "\x04""FHSS""Hype";
const char STR_SUBTYPE_KYOSHO2[] = "\x05""KT-17"; 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 }, {PROTO_Q90C, STR_Q90C, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, Q90C_init, Q90C_callback },
#endif #endif
#if defined(RLINK_CC2500_INO) #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 #endif
#if defined(REALACC_NRF24L01_INO) #if defined(REALACC_NRF24L01_INO)
{PROTO_REALACC, STR_REALACC, STR_SUBTYPE_REALACC, 1, OPTION_NONE, 0, 0, SW_NRF, REALACC_init, REALACC_callback }, {PROTO_REALACC, STR_REALACC, STR_SUBTYPE_REALACC, 1, OPTION_NONE, 0, 0, SW_NRF, REALACC_init, REALACC_callback },

View File

@ -451,6 +451,7 @@ enum RLINK
RLINK_SURFACE = 0, RLINK_SURFACE = 0,
RLINK_AIR = 1, RLINK_AIR = 1,
RLINK_DUMBORC = 2, RLINK_DUMBORC = 2,
RLINK_RC4G = 3,
}; };
enum MOULDKG enum MOULDKG
{ {

View File

@ -18,7 +18,11 @@
#include "iface_cc2500.h" #include "iface_cc2500.h"
//#define RLINK_DEBUG
//#define RLINK_DEBUG_TELEM
//#define RLINK_FORCE_ID //#define RLINK_FORCE_ID
#define RLINK_RC4G_FORCE_ID
#define RLINK_TX_PACKET_LEN 33 #define RLINK_TX_PACKET_LEN 33
#define RLINK_RX_PACKET_LEN 15 #define RLINK_RX_PACKET_LEN 15
@ -97,16 +101,37 @@ static void __attribute__((unused)) RLINK_hop()
static void __attribute__((unused)) RLINK_TXID_init() 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 #ifdef RLINK_FORCE_ID
//surface RC6GS if(sub_protocol==RLINK_SURFACE)
memcpy(rx_tx_addr,"\x3A\x99\x22\x3A",RLINK_TX_ID_LEN); memcpy(rx_tx_addr,"\x3A\x99\x22\x3A",RLINK_TX_ID_LEN); //surface RC6GS
//air T8FB else
//memcpy(rx_tx_addr,"\xFC\x11\x0D\x20",RLINK_TX_ID_LEN); memcpy(rx_tx_addr,"\xFC\x11\x0D\x20",RLINK_TX_ID_LEN); //air T8FB
#endif #endif
// channels order depend on ID // 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:"); debug("ID:");
for(uint8_t i=0;i<RLINK_TX_ID_LEN;i++) for(uint8_t i=0;i<RLINK_TX_ID_LEN;i++)
debug(" 0x%02X",rx_tx_addr[i]); debug(" 0x%02X",rx_tx_addr[i]);
@ -138,7 +163,9 @@ static void __attribute__((unused)) RLINK_rf_init()
CC2500_WriteReg(4, 0xBA); CC2500_WriteReg(4, 0xBA);
CC2500_WriteReg(5, 0xDC); CC2500_WriteReg(5, 0xDC);
} }
else if(sub_protocol==RLINK_RC4G)
CC2500_WriteReg(5, 0xA5);
CC2500_WriteReg(CC2500_0C_FSCTRL0, option); CC2500_WriteReg(CC2500_0C_FSCTRL0, option);
CC2500_SetTxRxMode(TX_EN); CC2500_SetTxRxMode(TX_EN);
@ -219,18 +246,71 @@ static void __attribute__((unused)) RLINK_send_packet()
packet_count++; packet_count++;
if(packet_count>5) packet_count=0; if(packet_count>5) packet_count=0;
//debugln("C= 0x%02X",hopping_frequency[pseudo & 0x0F]); #ifdef RLINK_DEBUG
//debug("P="); debugln("C= 0x%02X",hopping_frequency[pseudo & 0x0F]);
//for(uint8_t i=1;i<RLINK_TX_PACKET_LEN+1;i++) debug("P=");
// debug(" 0x%02X",packet[i]); for(uint8_t i=1;i<RLINK_TX_PACKET_LEN+1;i++)
//debugln(""); debug(" 0x%02X",packet[i]);
debugln("");
#endif
}
static void __attribute__((unused)) RLINK_RC4G_send_packet()
{
uint32_t val;
//hop
CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[packet_count>>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_PROTO 20000-100 // -100 for compatibility with R8EF
#define RLINK_TIMING_RFSEND 10500 #define RLINK_TIMING_RFSEND 10500
#define RLINK_TIMING_CHECK 2000 #define RLINK_TIMING_CHECK 2000
#define RLINK_RC4G_TIMING_PROTO 14460
uint16_t RLINK_callback() 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) switch(phase)
{ {
case RLINK_DATA: case RLINK_DATA:
@ -259,13 +339,16 @@ uint16_t RLINK_callback()
len = CC2500_ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; 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 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); 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]) 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 {//Correct telemetry received: length, CRC, ID and type
//Debug #ifdef RLINK_DEBUG_TELEM
//for(uint8_t i=0;i<len;i++) for(uint8_t i=0;i<len;i++)
// debug(" %02X",packet_in[i]); debug(" %02X",packet_in[i]);
#endif
TX_RSSI = packet_in[len-2]; TX_RSSI = packet_in[len-2];
if(TX_RSSI >=128) if(TX_RSSI >=128)
TX_RSSI -= 128; TX_RSSI -= 128;
@ -278,7 +361,9 @@ uint16_t RLINK_callback()
pps_counter++; pps_counter++;
packet_count=0; packet_count=0;
} }
//debugln(""); #ifdef RLINK_DEBUG_TELEM
debugln("");
#endif
} }
if (millis() - pps_timer >= 2000) if (millis() - pps_timer >= 2000)
{//1 telemetry packet every 100ms {//1 telemetry packet every 100ms

View File

@ -796,10 +796,13 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
RLINK_SURFACE RLINK_SURFACE
RLINK_AIR RLINK_AIR
RLINK_DUMBORC RLINK_DUMBORC
RLINK_RC4G
PROTO_SCANNER PROTO_SCANNER
NONE NONE
PROTO_SCORPIO PROTO_SCORPIO
NONE NONE
PROTO_SGF22
NONE
PROTO_SHENQI PROTO_SHENQI
NONE NONE
PROTO_SKYARTEC PROTO_SKYARTEC

View File

@ -1001,6 +1001,17 @@ Telemetry: RX_RSSI (for the original value add -256), TX_RSSI, TX_QLY (0..100%)
### Sub_protocol DumboRC - *2* ### Sub_protocol DumboRC - *2*
Compatible RXs: X6/X6F/X6FG 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* ## Futaba - *21*
Also called SFHSS depending on radio version. Also called SFHSS depending on radio version.
@ -1942,9 +1953,9 @@ Only 1 ID !!! Need more TX dumps.
Model: SGF22 Model: SGF22
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9
---|---|---|---|---|---|---|--- ---|---|---|---|---|---|---|---|---
A|E|T|R|MODE|FLIP|LIGHT|PHOTO A|E|T|R|MODE|FLIP|LIGHT|PHOTO|VIDEO
## Shenqi - *19* ## Shenqi - *19*
Autobind protocol Autobind protocol