mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-02-09 22:28:12 +00:00
Radiolink/RC4G
1 ID / 1 set of frequency
This commit is contained in:
parent
dc1490b9b0
commit
50bd4850fa
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 },
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user