Merge pull request #1 from pascallanger/master

Merge from original sources
This commit is contained in:
richardclli 2020-08-16 07:30:00 +08:00 committed by GitHub
commit f86b0c4c37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 756 additions and 157 deletions

View File

@ -49,10 +49,10 @@ before_install:
exitcode=$((exitcode+$?)); exitcode=$((exitcode+$?));
mv build/Multiprotocol.ino.bin ./binaries/multi-orangerx-aetr-blue-inv-v$MULTI_VERSION.bin; mv build/Multiprotocol.ino.bin ./binaries/multi-orangerx-aetr-blue-inv-v$MULTI_VERSION.bin;
cp Multiprotocol/Multi.txt ./binaries/Multi.txt; cp Multiprotocol/Multi.txt ./binaries/Multi.txt;
mkdir -p TOOLS/SCRIPTS; mkdir -p SCRIPTS/TOOLS;
cp Lua_scripts/*.lua TOOLS/SCRIPTS/; cp Lua_scripts/*.lua SCRIPTS/TOOLS/;
cp Lua_scripts/*.txt TOOLS/SCRIPTS/; cp Lua_scripts/*.txt SCRIPTS/TOOLS/;
zip ./binaries/MultiLuaScripts.zip TOOLS/SCRIPTS/*; zip ./binaries/MultiLuaScripts.zip SCRIPTS/TOOLS/*;
return $exitcode; }; return $exitcode; };
elif [[ "$BOARD" == "multi4in1:avr:multiatmega328p:bootloader=none" ]]; then elif [[ "$BOARD" == "multi4in1:avr:multiatmega328p:bootloader=none" ]]; then
buildReleaseFiles(){ buildReleaseFiles(){

View File

@ -54,7 +54,8 @@
28,4,Flysky_AFHDS2A,PWM_IB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 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,5,Flysky_AFHDS2A,PPM_IB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
56,0,Flysky2A_RX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 56,0,Flysky2A_RX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
53,0,Flyzone,FZ-410,0 53,0,Height,5ch,0,Gear
53,1,Height,8ch,0,Gear,Gyro,Flap,Light
25,0,FrSkyV,V8,0,CH5,CH6,CH7,CH8 25,0,FrSkyV,V8,0,CH5,CH6,CH7,CH8
3,0,FrSkyD,D8,0,CH5,CH6,CH7,CH8 3,0,FrSkyD,D8,0,CH5,CH6,CH7,CH8
3,0,FrSkyD,D8Cloned,0,CH5,CH6,CH7,CH8 3,0,FrSkyD,D8Cloned,0,CH5,CH6,CH7,CH8
@ -134,9 +135,11 @@
31,2,Q303,CX10D,1,Arm,Flip 31,2,Q303,CX10D,1,Arm,Flip
31,3,Q303,CX10WD,1,Arm,Flip 31,3,Q303,CX10WD,1,Arm,Flip
72,0,Q90C,Std,0,FMode,VTX+ 72,0,Q90C,Std,0,FMode,VTX+
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
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
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
21,0,SFHSS,Std,0,CH5,CH6,CH7,CH8 21,0,SFHSS,Std,0,CH5,CH6,CH7,CH8
19,0,Shenqi,Cycle,1 19,0,Shenqi,Cycle,1
68,0,Skyartec,Std,0,CH5,CH6,CH7 68,0,Skyartec,Std,0,CH5,CH6,CH7

View File

@ -192,9 +192,9 @@ void A7105_AdjustLOBaseFreq(uint8_t cmd)
offset=(int16_t)FORCE_FLYSKY_TUNING; offset=(int16_t)FORCE_FLYSKY_TUNING;
#endif #endif
break; break;
case PROTO_FLYZONE: case PROTO_HEIGHT:
#ifdef FORCE_FLYZONE_TUNING #ifdef FORCE_HEIGHT_TUNING
offset=(int16_t)FORCE_FLYZONE_TUNING; offset=(int16_t)FORCE_HEIGHT_TUNING;
#endif #endif
break; break;
case PROTO_PELIKAN: case PROTO_PELIKAN:
@ -287,8 +287,8 @@ const uint8_t PROGMEM FLYSKY_A7105_regs[] = {
0x01, 0x0f // 30 - 31 0x01, 0x0f // 30 - 31
}; };
#endif #endif
#ifdef FLYZONE_A7105_INO #ifdef HEIGHT_A7105_INO
const uint8_t PROGMEM FLYZONE_A7105_regs[] = { const uint8_t PROGMEM HEIGHT_A7105_regs[] = {
0xff, 0x42, 0x00, 0x07, 0x00, 0xff, 0xff ,0x00, 0x00, 0x00, 0x00, 0x01, 0x21, 0x05, 0x01, 0x50, // 00 - 0f 0xff, 0x42, 0x00, 0x07, 0x00, 0xff, 0xff ,0x00, 0x00, 0x00, 0x00, 0x01, 0x21, 0x05, 0x01, 0x50, // 00 - 0f
0x9e, 0x4b, 0x00, 0x02, 0x16, 0x2b, 0x12, 0x00, 0x62, 0x80, 0x80, 0x00, 0x0a, 0x32, 0xc3, 0x1f, // 10 - 1f 0x9e, 0x4b, 0x00, 0x02, 0x16, 0x2b, 0x12, 0x00, 0x62, 0x80, 0x80, 0x00, 0x0a, 0x32, 0xc3, 0x1f, // 10 - 1f
0x12, 0x00, 0x00, 0xff, 0x00, 0x00, 0x3a, 0x00, 0x3f, 0x47, 0x80, 0x03, 0x01, 0x45, 0x18, 0x00, // 20 - 2f 0x12, 0x00, 0x00, 0xff, 0x00, 0x00, 0x3a, 0x00, 0x3f, 0x47, 0x80, 0x03, 0x01, 0x45, 0x18, 0x00, // 20 - 2f
@ -327,10 +327,10 @@ void A7105_Init(void)
uint8_t *A7105_Regs=0; uint8_t *A7105_Regs=0;
uint8_t vco_calibration0, vco_calibration1; uint8_t vco_calibration0, vco_calibration1;
#ifdef FLYZONE_A7105_INO #ifdef HEIGHT_A7105_INO
if(protocol==PROTO_FLYZONE) if(protocol==PROTO_HEIGHT)
{ {
A7105_Regs=(uint8_t*)FLYZONE_A7105_regs; A7105_Regs=(uint8_t*)HEIGHT_A7105_regs;
A7105_WriteID(0x25A53C45); A7105_WriteID(0x25A53C45);
} }
else else
@ -383,6 +383,10 @@ void A7105_Init(void)
if(i==0x20) val=0x1E; if(i==0x20) val=0x1E;
} }
#endif #endif
#ifdef HEIGHT_A7105_INO
if(protocol==PROTO_HEIGHT && sub_protocol==HEIGHT_8CH)
if(i==0x03) val=0x0A;
#endif
if( val != 0xFF) if( val != 0xFF)
A7105_WriteReg(i, val); A7105_WriteReg(i, val);
} }
@ -437,7 +441,7 @@ void A7105_Init(void)
case PROTO_FLYSKY: case PROTO_FLYSKY:
vco_calibration1=0x08; vco_calibration1=0x08;
break; break;
case PROTO_FLYZONE: case PROTO_HEIGHT:
vco_calibration1=0x02; vco_calibration1=0x02;
break; break;
case PROTO_PELIKAN: case PROTO_PELIKAN:

View File

@ -104,6 +104,7 @@ uint16_t AFHDS2A_Rx_callback()
switch(phase) { switch(phase) {
case AFHDS2A_RX_BIND1: case AFHDS2A_RX_BIND1:
if(IS_BIND_DONE) return initAFHDS2A_Rx(); // Abort bind
if (AFHDS2A_Rx_data_ready()) { if (AFHDS2A_Rx_data_ready()) {
A7105_ReadData(AFHDS2A_RX_TXPACKET_SIZE); A7105_ReadData(AFHDS2A_RX_TXPACKET_SIZE);
if ((packet[0] == 0xbb && packet[9] == 0x01) || (packet[0] == 0xbc && packet[9] <= 0x02)) { if ((packet[0] == 0xbb && packet[9] == 0x01) || (packet[0] == 0xbc && packet[9] <= 0x02)) {
@ -118,6 +119,7 @@ uint16_t AFHDS2A_Rx_callback()
return 10000; return 10000;
case AFHDS2A_RX_BIND2: case AFHDS2A_RX_BIND2:
if(IS_BIND_DONE) return initAFHDS2A_Rx(); // Abort bind
// got 2nd bind packet from tx ? // got 2nd bind packet from tx ?
if (AFHDS2A_Rx_data_ready()) { if (AFHDS2A_Rx_data_ready()) {
A7105_ReadData(AFHDS2A_RX_TXPACKET_SIZE); A7105_ReadData(AFHDS2A_RX_TXPACKET_SIZE);
@ -143,6 +145,7 @@ uint16_t AFHDS2A_Rx_callback()
packet[9] = 0x01; packet[9] = 0x01;
packet[10] = 0x00; packet[10] = 0x00;
memset(&packet[11], 0xFF, 26); memset(&packet[11], 0xFF, 26);
A7105_SetTxRxMode(TX_EN);
A7105_WriteData(AFHDS2A_RX_RXPACKET_SIZE, packet_count++ & 1 ? 0x0D : 0x8C); A7105_WriteData(AFHDS2A_RX_RXPACKET_SIZE, packet_count++ & 1 ? 0x0D : 0x8C);
phase |= AFHDS2A_RX_WAIT_WRITE; phase |= AFHDS2A_RX_WAIT_WRITE;
return 1700; return 1700;
@ -153,6 +156,7 @@ uint16_t AFHDS2A_Rx_callback()
while (micros() - pps_timer < 700) // Wait max 700µs, using serial+telemetry exit in about 120µs while (micros() - pps_timer < 700) // Wait max 700µs, using serial+telemetry exit in about 120µs
if (!(A7105_ReadReg(A7105_00_MODE) & 0x01)) if (!(A7105_ReadReg(A7105_00_MODE) & 0x01))
break; break;
A7105_SetTxRxMode(RX_EN);
A7105_Strobe(A7105_RX); A7105_Strobe(A7105_RX);
phase &= ~AFHDS2A_RX_WAIT_WRITE; phase &= ~AFHDS2A_RX_WAIT_WRITE;
return 10000; return 10000;

View File

@ -129,6 +129,7 @@ uint16_t Bayang_Rx_callback()
switch (phase) { switch (phase) {
case BAYANG_RX_BIND: case BAYANG_RX_BIND:
if(IS_BIND_DONE) return initBayang_Rx(); // Abort bind
if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR)) { if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR)) {
// data received from TX // data received from TX
if (XN297_ReadPayload(packet, BAYANG_RX_PACKET_SIZE) && ( packet[0] == 0xA4 || packet[0] == 0xA2 ) && Bayang_Rx_check_validity()) { if (XN297_ReadPayload(packet, BAYANG_RX_PACKET_SIZE) && ( packet[0] == 0xA4 || packet[0] == 0xA2 ) && Bayang_Rx_check_validity()) {

View File

@ -102,6 +102,61 @@ static void __attribute__((unused)) FrSkyR9_build_packet()
packet[25] = crc >> 8; // high byte packet[25] = crc >> 8; // high byte
} }
static uint8_t __attribute__((unused)) FrSkyR9_CRC8(uint8_t *p, uint8_t l)
{
uint8_t crc = 0xFF;
for (uint8_t i = 0; i < l; i++)
{
crc = crc ^ p[i];
for ( uint8_t j = 0; j < 8; j++ )
if ( crc & 0x80 )
{
crc <<= 1;
crc ^= 0x07;
}
else
crc <<= 1;
}
return crc;
}
static void __attribute__((unused)) FrSkyR9_build_EU_packet()
{
//ID
packet[0] = rx_tx_addr[1];
packet[1] = rx_tx_addr[2];
packet[2] = rx_tx_addr[3];
//Hopping
packet[3] = FrSkyX_chanskip; // step size and last 2 channels start index
//RX number
packet[4] = RX_num; // receiver number from OpenTX
//Channels
//TODO FrSkyX_channels(5,4); // Set packet[5]=failsafe and packet[6..11]=4 channels data
//Bind
if(IS_BIND_IN_PROGRESS)
{
packet[5] = 0x01; // bind indicator
if((sub_protocol & 2) == 0)
packet[5] |= 0x10; // 16CH
// if(sub_protocol & 1)
// packet[5] |= 0x20; // 868
if(binding_idx&0x01)
packet[5] |= 0x40; // telem OFF
if(binding_idx&0x02)
packet[5] |= 0x80; // ch9-16
}
//Sequence and send SPort
packet[12] = (FrSkyX_RX_Seq << 4)|0x08; //TX=8 at startup
//CRC
packet[13] = FrSkyR9_CRC8(packet, 13);
}
uint16_t initFrSkyR9() uint16_t initFrSkyR9()
{ {
//Check frequencies //Check frequencies
@ -127,6 +182,12 @@ uint16_t initFrSkyR9()
FrSkyFormat=1; // 8 channels FrSkyFormat=1; // 8 channels
debugln("%dCH", FrSkyFormat&1 ? 8:16); debugln("%dCH", FrSkyFormat&1 ? 8:16);
//EU packet length
if( (sub_protocol & 0xFD) == R9_EU )
packet_length=14;
else
packet_length=26;
//SX1276 Init //SX1276 Init
SX1276_SetMode(true, false, SX1276_OPMODE_SLEEP); SX1276_SetMode(true, false, SX1276_OPMODE_SLEEP);
SX1276_SetMode(true, false, SX1276_OPMODE_STDBY); SX1276_SetMode(true, false, SX1276_OPMODE_STDBY);
@ -146,7 +207,8 @@ uint16_t initFrSkyR9()
SX1276_SetHopPeriod(0); // 0 = disabled, we hop frequencies manually SX1276_SetHopPeriod(0); // 0 = disabled, we hop frequencies manually
SX1276_SetPaDac(true); SX1276_SetPaDac(true);
SX1276_SetTxRxMode(TX_EN); // Set RF switch to TX SX1276_SetTxRxMode(TX_EN); // Set RF switch to TX
//Enable all IRQ flags
SX1276_WriteReg(SX1276_11_IRQFLAGSMASK,0x00);
FrSkyX_telem_init(); FrSkyX_telem_init();
hopping_frequency_no=0; hopping_frequency_no=0;
@ -168,14 +230,17 @@ uint16_t FrSkyR9_callback()
// output_power: 2 dBm (17-(15-OutputPower) (if pa_boost_pin == true)) // output_power: 2 dBm (17-(15-OutputPower) (if pa_boost_pin == true))
SX1276_SetPaConfig(true, 7, 0); // Lowest power for the T18 SX1276_SetPaConfig(true, 7, 0); // Lowest power for the T18
//Build packet //Build packet
if( packet_length == 26 )
FrSkyR9_build_packet(); FrSkyR9_build_packet();
else
FrSkyR9_build_EU_packet();
phase++; phase++;
return 460; // Frequency settle time return 460; // Frequency settle time
case FRSKYR9_DATA: case FRSKYR9_DATA:
//Set RF switch to TX //Set RF switch to TX
SX1276_SetTxRxMode(TX_EN); SX1276_SetTxRxMode(TX_EN);
//Send packet //Send packet
SX1276_WritePayloadToFifo(packet, 26); SX1276_WritePayloadToFifo(packet, packet_length);
SX1276_SetMode(true, false, SX1276_OPMODE_TX); SX1276_SetMode(true, false, SX1276_OPMODE_TX);
#if not defined TELEMETRY #if not defined TELEMETRY
phase=FRSKYR9_FREQ; phase=FRSKYR9_FREQ;
@ -192,6 +257,8 @@ uint16_t FrSkyR9_callback()
SX1276_WriteReg(SX1276_0D_FIFOADDRPTR, 0x00); SX1276_WriteReg(SX1276_0D_FIFOADDRPTR, 0x00);
//Set RF switch to RX //Set RF switch to RX
SX1276_SetTxRxMode(RX_EN); SX1276_SetTxRxMode(RX_EN);
//Clear all IRQ flags
SX1276_WriteReg(SX1276_12_REGIRQFLAGS,0xFF);
//Switch to RX //Switch to RX
SX1276_WriteReg(SX1276_01_OPMODE, 0x85); SX1276_WriteReg(SX1276_01_OPMODE, 0x85);
phase++; phase++;
@ -230,8 +297,6 @@ uint16_t FrSkyR9_callback()
FrSkyX_telem_init(); // Reset telemetry FrSkyX_telem_init(); // Reset telemetry
else else
telemetry_link=1; // Send telemetry out anyway telemetry_link=1; // Send telemetry out anyway
//Clear all flags
SX1276_WriteReg(SX1276_12_REGIRQFLAGS,0xFF);
phase=FRSKYR9_FREQ; phase=FRSKYR9_FREQ;
break; break;
#endif #endif

View File

@ -358,7 +358,6 @@ static void __attribute__((unused)) frsky_rx_data()
uint16_t initFrSky_Rx() uint16_t initFrSky_Rx()
{ {
state = 0;
frsky_rx_chanskip = 1; frsky_rx_chanskip = 1;
hopping_frequency_no = 0; hopping_frequency_no = 0;
rx_data_started = false; rx_data_started = false;
@ -383,6 +382,8 @@ uint16_t FrSky_Rx_callback()
static int8_t tune_low, tune_high; static int8_t tune_low, tune_high;
uint8_t len, ch; uint8_t len, ch;
if(IS_BIND_DONE && phase != FRSKY_RX_DATA) return initFrSky_Rx(); // Abort bind
if ((prev_option != option) && (phase >= FRSKY_RX_DATA)) if ((prev_option != option) && (phase >= FRSKY_RX_DATA))
{ {
if (option == 0) if (option == 0)
@ -412,6 +413,7 @@ uint16_t FrSky_Rx_callback()
phase = FRSKY_RX_TUNE_LOW; phase = FRSKY_RX_TUNE_LOW;
debugln("FRSKY_RX_TUNE_LOW"); debugln("FRSKY_RX_TUNE_LOW");
frsky_rx_strobe_rx(); frsky_rx_strobe_rx();
state = 0;
return 1000; return 1000;
} }
} }
@ -483,7 +485,7 @@ uint16_t FrSky_Rx_callback()
} }
} }
else else
state=0x3FF; //No hop table for D16v2 state = 0x3FF; //No hop table for D16v2
if (state == 0x3FF) if (state == 0x3FF)
{ {
debugln("Bind complete"); debugln("Bind complete");

View File

@ -14,16 +14,16 @@
*/ */
// Compatible with FZ-410 TX // Compatible with FZ-410 TX
#if defined(FLYZONE_A7105_INO) #if defined(HEIGHT_A7105_INO)
#include "iface_a7105.h" #include "iface_a7105.h"
//#define FLYZONE_FORCEID //#define HEIGHT_FORCEID
#define FLYZONE_BIND_COUNT 220 // 5 sec #define HEIGHT_BIND_COUNT 220 // 5 sec
#define FLYZONE_BIND_CH 0x18 // TX, RX for bind end is 0x17 #define HEIGHT_BIND_CH 0x18 // TX, RX for bind end is 0x17
static void __attribute__((unused)) flyzone_build_packet() static void __attribute__((unused)) HEIGHT_build_packet()
{ {
packet[0] = 0xA5; packet[0] = 0xA5;
packet[1] = rx_tx_addr[2]; packet[1] = rx_tx_addr[2];
@ -33,11 +33,17 @@ static void __attribute__((unused)) flyzone_build_packet()
packet[5] = convert_channel_8b(THROTTLE); //00..FF packet[5] = convert_channel_8b(THROTTLE); //00..FF
packet[6] = convert_channel_8b(RUDDER); //00..80..FF packet[6] = convert_channel_8b(RUDDER); //00..80..FF
packet[7] = convert_channel_8b(CH5); //00..80..FF packet[7] = convert_channel_8b(CH5); //00..80..FF
if(sub_protocol == HEIGHT_8CH)
{
packet[8] = convert_channel_8b(CH6); //00..80..FF
packet[9] = convert_channel_8b(CH7); //00..80..FF
packet[10] = convert_channel_8b(CH8); //00..80..FF
}
} }
uint16_t ReadFlyzone() uint16_t ReadHeight()
{ {
#ifndef FORCE_FLYZONE_TUNING #ifndef FORCE_HEIGHT_TUNING
A7105_AdjustLOBaseFreq(1); A7105_AdjustLOBaseFreq(1);
#endif #endif
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
@ -45,7 +51,7 @@ uint16_t ReadFlyzone()
packet[0] = 0x1B; packet[0] = 0x1B;
packet[1] = rx_tx_addr[2]; packet[1] = rx_tx_addr[2];
packet[2] = rx_tx_addr[3]; packet[2] = rx_tx_addr[3];
A7105_WriteData(3, FLYZONE_BIND_CH); A7105_WriteData(3, HEIGHT_BIND_CH);
if (bind_counter--==0) if (bind_counter--==0)
BIND_DONE; BIND_DONE;
return 22700; return 22700;
@ -58,8 +64,8 @@ uint16_t ReadFlyzone()
#ifdef MULTI_SYNC #ifdef MULTI_SYNC
telemetry_set_input_sync(20*1500); telemetry_set_input_sync(20*1500);
#endif #endif
flyzone_build_packet(); HEIGHT_build_packet();
A7105_WriteData(8, hopping_frequency[0]); A7105_WriteData(sub_protocol?11:8, hopping_frequency[0]);
A7105_SetPower(); A7105_SetPower();
} }
else else
@ -72,14 +78,14 @@ uint16_t ReadFlyzone()
return 1500; return 1500;
} }
uint16_t initFlyzone() uint16_t initHeight()
{ {
A7105_Init(); A7105_Init();
hopping_frequency[0]=((random(0xfefefefe) & 0x0F)+2)<<2; hopping_frequency[0]=((random(0xfefefefe) & 0x0F)+2)<<2;
hopping_frequency[1]=hopping_frequency[0]+0x50; hopping_frequency[1]=hopping_frequency[0]+0x50;
#ifdef FLYZONE_FORCEID #ifdef HEIGHT_FORCEID
rx_tx_addr[2]=0x35; rx_tx_addr[2]=0x35;
rx_tx_addr[3]=0xD0; rx_tx_addr[3]=0xD0;
hopping_frequency[0]=0x18; hopping_frequency[0]=0x18;
@ -87,7 +93,7 @@ uint16_t initFlyzone()
#endif #endif
phase=255; phase=255;
bind_counter = FLYZONE_BIND_COUNT; bind_counter = HEIGHT_BIND_COUNT;
return 2400; return 2400;
} }
#endif #endif

View File

@ -50,7 +50,7 @@
50,Redpine,Fast,Slow 50,Redpine,Fast,Slow
51,Potensic,A20 51,Potensic,A20
52,ZSX,280 52,ZSX,280
53,Flyzone,FZ-410 53,Height,5ch,8ch
54,Scanner 54,Scanner
55,Frsky_RX,RX,CloneTX 55,Frsky_RX,RX,CloneTX
56,AFHDS2A_RX 56,AFHDS2A_RX
@ -72,3 +72,5 @@
72,Q90C 72,Q90C
73,Kyosho 73,Kyosho
74,RadioLink,Surface 74,RadioLink,Surface
76,Realacc,R11
77,OMP

View File

@ -72,7 +72,7 @@ const char STR_KF606[] ="KF606";
const char STR_REDPINE[] ="Redpine"; const char STR_REDPINE[] ="Redpine";
const char STR_POTENSIC[] ="Potensi"; const char STR_POTENSIC[] ="Potensi";
const char STR_ZSX[] ="ZSX"; const char STR_ZSX[] ="ZSX";
const char STR_FLYZONE[] ="FlyZone"; const char STR_HEIGHT[] ="Height";
const char STR_SCANNER[] ="Scanner"; const char STR_SCANNER[] ="Scanner";
const char STR_FRSKY_RX[] ="FrSkyRX"; const char STR_FRSKY_RX[] ="FrSkyRX";
const char STR_AFHDS2A_RX[] ="FS2A_RX"; const char STR_AFHDS2A_RX[] ="FS2A_RX";
@ -88,6 +88,8 @@ const char STR_PROPEL[] ="Propel";
const char STR_SKYARTEC[] ="Skyartc"; const char STR_SKYARTEC[] ="Skyartc";
const char STR_KYOSHO[] ="Kyosho"; const char STR_KYOSHO[] ="Kyosho";
const char STR_RLINK[] ="RadLink"; const char STR_RLINK[] ="RadLink";
const char STR_REALACC[] ="Realacc";
const char STR_OMP[] ="OMP";
const char STR_TEST[] ="Test"; const char STR_TEST[] ="Test";
const char STR_FAKE[] ="Fake"; const char STR_FAKE[] ="Fake";
@ -125,7 +127,7 @@ const char STR_SUBTYPE_GD00X[] = "\x05""GD_V1""GD_V2";
const char STR_SUBTYPE_REDPINE[] = "\x04""Fast""Slow"; const char STR_SUBTYPE_REDPINE[] = "\x04""Fast""Slow";
const char STR_SUBTYPE_POTENSIC[] = "\x03""A20"; const char STR_SUBTYPE_POTENSIC[] = "\x03""A20";
const char STR_SUBTYPE_ZSX[] = "\x07""280JJRC"; const char STR_SUBTYPE_ZSX[] = "\x07""280JJRC";
const char STR_SUBTYPE_FLYZONE[] = "\x05""FZ410"; const char STR_SUBTYPE_HEIGHT[] = "\x03""5ch""8ch";
const char STR_SUBTYPE_FX816[] = "\x03""P38"; const char STR_SUBTYPE_FX816[] = "\x03""P38";
const char STR_SUBTYPE_XN297DUMP[] = "\x07""250Kbps""1Mbps\0 ""2Mbps\0 ""Auto\0 ""NRF\0 "; const char STR_SUBTYPE_XN297DUMP[] = "\x07""250Kbps""1Mbps\0 ""2Mbps\0 ""Auto\0 ""NRF\0 ";
const char STR_SUBTYPE_ESKY150[] = "\x03""4ch""7ch"; const char STR_SUBTYPE_ESKY150[] = "\x03""4ch""7ch";
@ -140,8 +142,9 @@ const char STR_SUBTYPE_FRSKYL[] = "\x08""LR12\0 ""LR12 6ch";
const char STR_SUBTYPE_WFLY[] = "\x06""WFR0xS"; const char STR_SUBTYPE_WFLY[] = "\x06""WFR0xS";
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[] = "\x04""Pro\0""Lite"; const char STR_SUBTYPE_PELIKAN[] = "\x04""Pro\0""Lite";
const char STR_SUBTYPE_V761[] = "\x03""3CH""4CH"; const char STR_SUBTYPE_V761[] = "\x03""3ch""4ch";
const char STR_SUBTYPE_RLINK[] = "\x07""Surface"; const char STR_SUBTYPE_RLINK[] = "\x07""Surface""Air\0 ";
const char STR_SUBTYPE_REALACC[] = "\x03""R11";
enum enum
{ {
@ -224,8 +227,8 @@ const mm_protocol_definition multi_protocols[] = {
#if defined(AFHDS2A_RX_A7105_INO) #if defined(AFHDS2A_RX_A7105_INO)
{PROTO_AFHDS2A_RX, STR_AFHDS2A_RX,0, NO_SUBTYPE, OPTION_NONE }, {PROTO_AFHDS2A_RX, STR_AFHDS2A_RX,0, NO_SUBTYPE, OPTION_NONE },
#endif #endif
#if defined(FLYZONE_A7105_INO) #if defined(HEIGHT_A7105_INO)
{PROTO_FLYZONE, STR_FLYZONE, 1, STR_SUBTYPE_FLYZONE, OPTION_NONE }, {PROTO_HEIGHT, STR_HEIGHT, 2, STR_SUBTYPE_HEIGHT, OPTION_NONE },
#endif #endif
#if defined(FQ777_NRF24L01_INO) #if defined(FQ777_NRF24L01_INO)
{PROTO_FQ777, STR_FQ777, 0, NO_SUBTYPE, OPTION_NONE }, {PROTO_FQ777, STR_FQ777, 0, NO_SUBTYPE, OPTION_NONE },
@ -305,6 +308,9 @@ const mm_protocol_definition multi_protocols[] = {
#if defined(NCC1701_NRF24L01_INO) #if defined(NCC1701_NRF24L01_INO)
{PROTO_NCC1701, STR_NCC1701, 0, NO_SUBTYPE, OPTION_NONE }, {PROTO_NCC1701, STR_NCC1701, 0, NO_SUBTYPE, OPTION_NONE },
#endif #endif
#if defined(OMP_NRF24L01_INO)
{PROTO_OMP, STR_OMP, 0, NO_SUBTYPE, OPTION_RFTUNE },
#endif
#if defined(PELIKAN_A7105_INO) #if defined(PELIKAN_A7105_INO)
{PROTO_PELIKAN, STR_PELIKAN , 2, STR_SUBTYPE_PELIKAN, OPTION_NONE }, {PROTO_PELIKAN, STR_PELIKAN , 2, STR_SUBTYPE_PELIKAN, OPTION_NONE },
#endif #endif
@ -323,12 +329,15 @@ const mm_protocol_definition multi_protocols[] = {
#if defined(Q90C_NRF24L01_INO) #if defined(Q90C_NRF24L01_INO)
{PROTO_Q90C, STR_Q90C, 0, NO_SUBTYPE, OPTION_RFTUNE }, {PROTO_Q90C, STR_Q90C, 0, NO_SUBTYPE, OPTION_RFTUNE },
#endif #endif
#if defined(RLINK_CC2500_INO)
{PROTO_RLINK, STR_RLINK, 2, STR_SUBTYPE_RLINK, OPTION_RFTUNE },
#endif
#if defined(REALACC_NRF24L01_INO)
{PROTO_REALACC, STR_REALACC, 1, STR_SUBTYPE_REALACC, OPTION_NONE },
#endif
#if defined(REDPINE_CC2500_INO) #if defined(REDPINE_CC2500_INO)
{PROTO_REDPINE, STR_REDPINE, 2, STR_SUBTYPE_REDPINE, OPTION_RFTUNE }, {PROTO_REDPINE, STR_REDPINE, 2, STR_SUBTYPE_REDPINE, OPTION_RFTUNE },
#endif #endif
#if defined(RLINK_CC2500_INO)
{PROTO_RLINK, STR_RLINK, 1, STR_SUBTYPE_RLINK, OPTION_RFTUNE },
#endif
#if defined(SCANNER_CC2500_INO) #if defined(SCANNER_CC2500_INO)
// {PROTO_SCANNER, STR_SCANNER, 0, NO_SUBTYPE, OPTION_NONE }, // {PROTO_SCANNER, STR_SCANNER, 0, NO_SUBTYPE, OPTION_NONE },
#endif #endif

View File

@ -19,7 +19,7 @@
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 3 #define VERSION_MINOR 3
#define VERSION_REVISION 1 #define VERSION_REVISION 1
#define VERSION_PATCH_LEVEL 45 #define VERSION_PATCH_LEVEL 56
//****************** //******************
// Protocols // Protocols
@ -79,7 +79,7 @@ enum PROTOCOLS
PROTO_REDPINE = 50, // =>CC2500 PROTO_REDPINE = 50, // =>CC2500
PROTO_POTENSIC = 51, // =>NRF24L01 PROTO_POTENSIC = 51, // =>NRF24L01
PROTO_ZSX = 52, // =>NRF24L01 PROTO_ZSX = 52, // =>NRF24L01
PROTO_FLYZONE = 53, // =>A7105 PROTO_HEIGHT = 53, // =>A7105
PROTO_SCANNER = 54, // =>CC2500 PROTO_SCANNER = 54, // =>CC2500
PROTO_FRSKY_RX = 55, // =>CC2500 PROTO_FRSKY_RX = 55, // =>CC2500
PROTO_AFHDS2A_RX= 56, // =>A7105 PROTO_AFHDS2A_RX= 56, // =>A7105
@ -101,6 +101,8 @@ enum PROTOCOLS
PROTO_Q90C = 72, // =>NRF24L01 or CC2500 PROTO_Q90C = 72, // =>NRF24L01 or CC2500
PROTO_KYOSHO = 73, // =>A7105 PROTO_KYOSHO = 73, // =>A7105
PROTO_RLINK = 74, // =>CC2500 PROTO_RLINK = 74, // =>CC2500
PROTO_REALACC = 76, // =>NRF24L01
PROTO_OMP = 77, // =>NRF24L01
PROTO_FAKE = 126, // =>CC2500+NRF24L01 PROTO_FAKE = 126, // =>CC2500+NRF24L01
PROTO_TEST = 127, // =>CC2500 PROTO_TEST = 127, // =>CC2500
@ -114,7 +116,7 @@ enum Flysky
V912 = 3, V912 = 3,
CX20 = 4, CX20 = 4,
}; };
enum Flyzone enum Height
{ {
FZ410 = 0, FZ410 = 0,
}; };
@ -390,6 +392,12 @@ enum V761
V761_4CH = 1, V761_4CH = 1,
}; };
enum HEIGHT
{
HEIGHT_5CH = 0,
HEIGHT_8CH = 1,
};
#define NONE 0 #define NONE 0
#define P_HIGH 1 #define P_HIGH 1
#define P_LOW 0 #define P_LOW 0
@ -596,17 +604,17 @@ enum {
}; };
// A7105 power // A7105 power
// Power amp is ~+16dBm so: // The numbers do not take into account any outside amplifier
enum A7105_POWER enum A7105_POWER
{ {
A7105_POWER_0 = 0x00<<3 | 0x00, // TXPOWER_100uW = -23dBm == PAC=0 TBG=0 A7105_POWER_0 = 0x00<<3 | 0x00, // -23dBm == PAC=0 TBG=0
A7105_POWER_1 = 0x00<<3 | 0x01, // TXPOWER_300uW = -20dBm == PAC=0 TBG=1 A7105_POWER_1 = 0x00<<3 | 0x01, // -20dBm == PAC=0 TBG=1
A7105_POWER_2 = 0x00<<3 | 0x02, // TXPOWER_1mW = -16dBm == PAC=0 TBG=2 A7105_POWER_2 = 0x00<<3 | 0x02, // -16dBm == PAC=0 TBG=2
A7105_POWER_3 = 0x00<<3 | 0x04, // TXPOWER_3mW = -11dBm == PAC=0 TBG=4 A7105_POWER_3 = 0x00<<3 | 0x04, // -11dBm == PAC=0 TBG=4
A7105_POWER_4 = 0x01<<3 | 0x05, // TXPOWER_10mW = -6dBm == PAC=1 TBG=5 A7105_POWER_4 = 0x01<<3 | 0x05, // -6dBm == PAC=1 TBG=5
A7105_POWER_5 = 0x02<<3 | 0x07, // TXPOWER_30mW = 0dBm == PAC=2 TBG=7 A7105_POWER_5 = 0x02<<3 | 0x07, // 0dBm == PAC=2 TBG=7
A7105_POWER_6 = 0x03<<3 | 0x07, // TXPOWER_100mW = 1dBm == PAC=3 TBG=7 A7105_POWER_6 = 0x03<<3 | 0x07, // +1dBm == PAC=3 TBG=7
A7105_POWER_7 = 0x03<<3 | 0x07 // TXPOWER_150mW = 1dBm == PAC=3 TBG=7 A7105_POWER_7 = 0x03<<3 | 0x07 // +1dBm == PAC=3 TBG=7
}; };
#define A7105_HIGH_POWER A7105_POWER_7 #define A7105_HIGH_POWER A7105_POWER_7
#define A7105_LOW_POWER A7105_POWER_3 #define A7105_LOW_POWER A7105_POWER_3
@ -614,14 +622,13 @@ enum A7105_POWER
#define A7105_BIND_POWER A7105_POWER_0 #define A7105_BIND_POWER A7105_POWER_0
// NRF Power // NRF Power
// Power setting is 0..3 for nRF24L01 // The numbers do not take into account any outside amplifier
// Claimed power amp for nRF24L01 from eBay is 20dBm.
enum NRF_POWER enum NRF_POWER
{ // Raw w 20dBm PA {
NRF_POWER_0 = 0x00, // 0 : -18dBm (16uW) 2dBm (1.6mW) NRF_POWER_0 = 0x00, // -18dBm
NRF_POWER_1 = 0x01, // 1 : -12dBm (60uW) 8dBm (6mW) NRF_POWER_1 = 0x01, // -12dBm
NRF_POWER_2 = 0x02, // 2 : -6dBm (250uW) 14dBm (25mW) NRF_POWER_2 = 0x02, // -6dBm
NRF_POWER_3 = 0x03 // 3 : 0dBm (1mW) 20dBm (100mW) NRF_POWER_3 = 0x03 // 0dBm
}; };
#define NRF_HIGH_POWER NRF_POWER_3 #define NRF_HIGH_POWER NRF_POWER_3
#define NRF_LOW_POWER NRF_POWER_1 #define NRF_LOW_POWER NRF_POWER_1
@ -658,6 +665,7 @@ enum CC2500_POWER
#define CC2500_BIND_POWER CC2500_POWER_1 #define CC2500_BIND_POWER CC2500_POWER_1
// CYRF power // CYRF power
// The numbers do not take into account any outside amplifier
enum CYRF_POWER enum CYRF_POWER
{ {
CYRF_POWER_0 = 0x00, // -35dbm CYRF_POWER_0 = 0x00, // -35dbm
@ -781,7 +789,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
REDPINE 50 REDPINE 50
POTENSIC 51 POTENSIC 51
ZSX 52 ZSX 52
FLYZONE 53 HEIGHT 53
SCANNER 54 SCANNER 54
FRSKY_RX 55 FRSKY_RX 55
AFHDS2A_RX 56 AFHDS2A_RX 56
@ -803,6 +811,8 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
Q90C 72 Q90C 72
KYOSHO 73 KYOSHO 73
RLINK 74 RLINK 74
REALACC 76
OMP 77
BindBit=> 0x80 1=Bind/0=No BindBit=> 0x80 1=Bind/0=No
AutoBindBit=> 0x40 1=Yes /0=No AutoBindBit=> 0x40 1=Yes /0=No
RangeCheck=> 0x20 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No
@ -993,6 +1003,9 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
sub_protocol==V761 sub_protocol==V761
V761_3CH 0 V761_3CH 0
V761_4CH 1 V761_4CH 1
sub_protocol==HEIGHT
HEIGHT_5CH 0
HEIGHT_8CH 1
Power value => 0x80 0=High/1=Low Power value => 0x80 0=High/1=Low
Stream[3] = option_protocol; Stream[3] = option_protocol;

View File

@ -560,6 +560,11 @@ void setup()
option = FORCE_REDPINE_TUNING; // Use config-defined tuning value for REDPINE option = FORCE_REDPINE_TUNING; // Use config-defined tuning value for REDPINE
else else
#endif #endif
#if defined(FORCE_RADIOLINK_TUNING) && defined(RADIOLINK_CC2500_INO)
if (protocol==PROTO_RADIOLINK)
option = FORCE_RADIOLINK_TUNING; // Use config-defined tuning value for RADIOLINK
else
#endif
#if defined(FORCE_HITEC_TUNING) && defined(HITEC_CC2500_INO) #if defined(FORCE_HITEC_TUNING) && defined(HITEC_CC2500_INO)
if (protocol==PROTO_HITEC) if (protocol==PROTO_HITEC)
option = FORCE_HITEC_TUNING; // Use config-defined tuning value for HITEC option = FORCE_HITEC_TUNING; // Use config-defined tuning value for HITEC
@ -1115,11 +1120,11 @@ static void protocol_init()
remote_callback = ReadBUGS; remote_callback = ReadBUGS;
break; break;
#endif #endif
#if defined(FLYZONE_A7105_INO) #if defined(HEIGHT_A7105_INO)
case PROTO_FLYZONE: case PROTO_HEIGHT:
PE1_off; //antenna RF1 PE1_off; //antenna RF1
next_callback = initFlyzone(); next_callback = initHeight();
remote_callback = ReadFlyzone; remote_callback = ReadHeight;
break; break;
#endif #endif
#if defined(AFHDS2A_RX_A7105_INO) #if defined(AFHDS2A_RX_A7105_INO)
@ -1593,6 +1598,18 @@ static void protocol_init()
remote_callback = Q90C_callback; remote_callback = Q90C_callback;
break; break;
#endif #endif
#if defined(REALACC_NRF24L01_INO)
case PROTO_REALACC:
next_callback=initREALACC();
remote_callback = REALACC_callback;
break;
#endif
#if defined(OMP_NRF24L01_INO)
case PROTO_OMP:
next_callback=initOMP();
remote_callback = OMP_callback;
break;
#endif
#if defined(TEST_CC2500_INO) #if defined(TEST_CC2500_INO)
case PROTO_TEST: case PROTO_TEST:
next_callback=initTEST(); next_callback=initTEST();
@ -1751,6 +1768,11 @@ void update_serial_data()
option=FORCE_REDPINE_TUNING; // Use config-defined tuning value for REDPINE option=FORCE_REDPINE_TUNING; // Use config-defined tuning value for REDPINE
else else
#endif #endif
#if defined(FORCE_RADIOLINK_TUNING) && defined(RADIOLINK_CC2500_INO)
if (protocol==PROTO_RADIOLINK)
option = FORCE_RADIOLINK_TUNING; // Use config-defined tuning value for RADIOLINK
else
#endif
#if defined(FORCE_HITEC_TUNING) && defined(HITEC_CC2500_INO) #if defined(FORCE_HITEC_TUNING) && defined(HITEC_CC2500_INO)
if (protocol==PROTO_HITEC) if (protocol==PROTO_HITEC)
option=FORCE_HITEC_TUNING; // Use config-defined tuning value for HITEC option=FORCE_HITEC_TUNING; // Use config-defined tuning value for HITEC
@ -1905,7 +1927,7 @@ void update_serial_data()
} }
#endif #endif
#ifdef SPORT_SEND #ifdef SPORT_SEND
if((protocol==PROTO_FRSKYX || protocol==PROTO_FRSKYX2 || PROTO_FRSKY_R9) && rx_len==35) if((protocol==PROTO_FRSKYX || protocol==PROTO_FRSKYX2 || protocol==PROTO_FRSKY_R9) && rx_len==35)
{//Protocol waiting for 8 bytes {//Protocol waiting for 8 bytes
#define BYTE_STUFF 0x7D #define BYTE_STUFF 0x7D
#define STUFF_MASK 0x20 #define STUFF_MASK 0x20

View File

@ -0,0 +1,135 @@
/*
This project is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Multiprotocol is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
*/
#if defined(OMP_NRF24L01_INO)
#include "iface_nrf250k.h"
#define FORCE_OMP_ORIGINAL_ID
#define OMP_INITIAL_WAIT 500
#define OMP_PACKET_PERIOD 5000
#define OMP_RF_BIND_CHANNEL 35
#define OMP_RF_NUM_CHANNELS 8
#define OMP_PAYLOAD_SIZE 16
#define OMP_BIND_COUNT 600 //3sec
static void __attribute__((unused)) OMP_send_packet()
{
if(IS_BIND_IN_PROGRESS)
{
memcpy(packet,"BND",3);
memcpy(&packet[3],rx_tx_addr,5);
memcpy(&packet[8],hopping_frequency,8);
}
else
{
memset(packet,0x00,OMP_PAYLOAD_SIZE);
//hopping frequency
packet[0 ] = hopping_frequency_no; // |0x40 to request RX telemetry
XN297L_Hopping(hopping_frequency_no);
hopping_frequency_no++;
hopping_frequency_no &= OMP_RF_NUM_CHANNELS-1; // 8 RF channels
//flags
packet[1 ] = 0x08 //unknown
| GET_FLAG(CH5_SW, 0x20); // HOLD
packet[2 ] = 0x40; //unknown
if(Channel_data[CH6] > CHANNEL_MAX_COMMAND)
packet[2 ] |= 0x20; // IDLE2
else if(Channel_data[CH6] > CHANNEL_MIN_COMMAND)
packet[1 ] |= 0x40; // IDLE1
if(Channel_data[CH7] > CHANNEL_MAX_COMMAND)
packet[2 ] |= 0x08; // 3D
else if(Channel_data[CH7] > CHANNEL_MIN_COMMAND)
packet[2 ] |= 0x04; // ATTITUDE
//trims??
//packet[3..6]
//channels TAER packed 11bits
uint16_t channel=convert_channel_16b_limit(THROTTLE,0,2047);
packet[7 ] = channel;
packet[8 ] = channel>>8;
channel=convert_channel_16b_limit(AILERON,0,2047);
packet[8 ] |= channel<<3;
packet[9 ] = channel>>5;
channel=convert_channel_16b_limit(ELEVATOR,0,2047);
packet[10] |= channel<<6;
packet[11] = channel>>2;
packet[12] = channel>>10;
channel=convert_channel_16b_limit(RUDDER,0,2047);
packet[12] |= channel<<1;
packet[13] = channel>>8;
//unknown
//packet[13] = 0x00;
//packet[14] = 0x00;
packet[15] = 0x04;
}
XN297L_SetPower(); // Set tx_power
XN297L_SetFreqOffset(); // Set frequency offset
XN297L_WriteEnhancedPayload(packet, OMP_PAYLOAD_SIZE, IS_BIND_IN_PROGRESS);
}
static void __attribute__((unused)) OMP_init()
{
XN297L_Init();
XN297L_SetTXAddr((uint8_t*)"FLPBD", 5);
XN297L_HoppingCalib(OMP_RF_NUM_CHANNELS); // Calibrate all channels
XN297L_RFChannel(OMP_RF_BIND_CHANNEL); // Set bind channel
}
static void __attribute__((unused)) OMP_initialize_txid()
{
calc_fh_channels(OMP_RF_NUM_CHANNELS);
#ifdef FORCE_OMP_ORIGINAL_ID
rx_tx_addr[0]=0x4E;
rx_tx_addr[1]=0x72;
rx_tx_addr[2]=0x8E;
rx_tx_addr[3]=0x70;
rx_tx_addr[4]=0x62;
for(uint8_t i=0; i<OMP_RF_NUM_CHANNELS;i++)
hopping_frequency[i]=(i+3)*5;
#endif
}
uint16_t OMP_callback()
{
if(IS_BIND_IN_PROGRESS)
if(--bind_counter==0)
BIND_DONE;
OMP_send_packet();
#ifdef MULTI_SYNC
telemetry_set_input_sync(OMP_PACKET_PERIOD);
#endif
return OMP_PACKET_PERIOD;
}
uint16_t initOMP()
{
OMP_initialize_txid();
OMP_init();
hopping_frequency_no = 0;
bind_counter=OMP_BIND_COUNT;
return OMP_INITIAL_WAIT;
}
#endif

View File

@ -127,7 +127,7 @@ uint16_t ReadPelikan()
if(sub_protocol==PELIKAN_PRO) if(sub_protocol==PELIKAN_PRO)
A7105_WriteReg(A7105_03_FIFOI,0x28); A7105_WriteReg(A7105_03_FIFOI,0x28);
else//PELIKAN_LITE else//PELIKAN_LITE
A7105_WriteID((rx_tx_addr[0]<<24)|(rx_tx_addr[1]<<16)|(rx_tx_addr[2]<<8)|(rx_tx_addr[3])); A7105_WriteID(MProtocol_id);
} }
} }
#ifdef MULTI_SYNC #ifdef MULTI_SYNC
@ -281,8 +281,9 @@ uint16_t initPelikan()
} }
#endif #endif
MProtocol_id=((uint32_t)rx_tx_addr[0]<<24)|((uint32_t)rx_tx_addr[1]<<16)|((uint32_t)rx_tx_addr[2]<<8)|(rx_tx_addr[3]);
if(sub_protocol==PELIKAN_LITE && IS_BIND_DONE) if(sub_protocol==PELIKAN_LITE && IS_BIND_DONE)
A7105_WriteID((rx_tx_addr[0]<<24)|(rx_tx_addr[1]<<16)|(rx_tx_addr[2]<<8)|(rx_tx_addr[3])); A7105_WriteID(MProtocol_id);
hopping_frequency_no=PELIKAN_NUM_RF_CHAN; hopping_frequency_no=PELIKAN_NUM_RF_CHAN;
packet_count=5; packet_count=5;

View File

@ -0,0 +1,157 @@
/*
This project is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Multiprotocol is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
*/
// Compatible with Realacc R11
#if defined(REALACC_NRF24L01_INO)
#include "iface_nrf24l01.h"
#define FORCE_REALACC_ORIGINAL_ID
#define REALACC_INITIAL_WAIT 500
#define REALACC_PACKET_PERIOD 2268
#define REALACC_BIND_RF_CHANNEL 80
#define REALACC_BIND_PAYLOAD_SIZE 10
#define REALACC_PAYLOAD_SIZE 13
#define REALACC_BIND_COUNT 50
#define REALACC_RF_NUM_CHANNELS 5
static void __attribute__((unused)) REALACC_send_packet()
{
packet[ 0]= 0xDC;
packet[ 1]= convert_channel_8b(AILERON); // 00..80..FF
packet[ 2]= convert_channel_8b(ELEVATOR); // 00..80..FF
packet[ 3]= convert_channel_8b(THROTTLE); // 00..FF
packet[ 4]= convert_channel_8b(RUDDER); // 00..80..FF
packet[ 5]= 0x20; // Trim
packet[ 6]= 0x20; // Trim
packet[ 7]= 0x20; // Trim
packet[ 8]= 0x20; // Trim
packet[ 9]= num_ch; // Change at each power up
packet[10]= 0x04 // Flag1
| 0x02 // Rate1=0, Rate2=1, Rate3=2
| GET_FLAG(CH8_SW, 0x20); // Headless
packet[11]= 0x00 // Flag2
| GET_FLAG(CH7_SW, 0x01) // Calib
| GET_FLAG(CH9_SW, 0x20) // Return
| GET_FLAG(CH10_SW,0x80); // Unknown
packet[12]= 0x00 // Flag3
| GET_FLAG(CH5_SW, 0x01) // Flip
| GET_FLAG(CH6_SW, 0x80); // Light
NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency_no);
hopping_frequency_no++;
hopping_frequency_no %= REALACC_RF_NUM_CHANNELS;
XN297_WriteEnhancedPayload(packet, REALACC_PAYLOAD_SIZE,0);
}
static void __attribute__((unused)) REALACC_send_bind_packet()
{
packet[0] = 0xB1;
memcpy(&packet[1],rx_tx_addr,4);
memcpy(&packet[5],hopping_frequency,5);
XN297_WriteEnhancedPayload(packet, REALACC_BIND_PAYLOAD_SIZE,1);
}
static void __attribute__((unused)) REALACC_initialize_txid()
{
calc_fh_channels(REALACC_RF_NUM_CHANNELS);
num_ch=random(0xfefefefe); // 00..FF
#ifdef FORCE_REALACC_ORIGINAL_ID
//Dump
rx_tx_addr[0]=0x99;
rx_tx_addr[1]=0x06;
rx_tx_addr[2]=0x00;
rx_tx_addr[3]=0x00;
hopping_frequency[0]=0x55;
hopping_frequency[1]=0x59;
hopping_frequency[2]=0x5A;
hopping_frequency[3]=0x5A;
hopping_frequency[4]=0x62;
num_ch=0xC5; // Value in dumps: C5 A2 77 F0 84 58
#endif
}
static void __attribute__((unused)) REALACC_init()
{
NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN);
NRF24L01_FlushTx();
NRF24L01_FlushRx();
NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowldgement on all data pipes
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 only
NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps
NRF24L01_SetPower();
XN297_SetTXAddr((uint8_t*)"MAIN", 4);
NRF24L01_WriteReg(NRF24L01_05_RF_CH, REALACC_BIND_RF_CHANNEL); // Set bind channel
}
uint16_t REALACC_callback()
{
#ifdef MULTI_SYNC
telemetry_set_input_sync(REALACC_PACKET_PERIOD);
#endif
XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP));
NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70);
NRF24L01_FlushTx();
NRF24L01_SetPower();
if(IS_BIND_IN_PROGRESS)
{
REALACC_send_bind_packet();
if(--bind_counter==0)
{
BIND_DONE;
XN297_SetTXAddr(rx_tx_addr, 4);
}
}
else
REALACC_send_packet();
return REALACC_PACKET_PERIOD;
}
uint16_t initREALACC()
{
BIND_IN_PROGRESS; // autobind protocol
REALACC_initialize_txid();
REALACC_init();
bind_counter=REALACC_BIND_COUNT;
hopping_frequency_no=0;
return REALACC_INITIAL_WAIT;
}
#endif
// XN297 speed 1Mb, scrambled, enhanced
// Bind
// Address = 4D 41 49 4E = 'MAIN'
// Channel = 80 (most likely from dump)
// P(10) = B1 99 06 00 00 55 59 5A 5A 62
// B1 indicates bind packet
// 99 06 00 00 = ID = address of normal packets
// 55 59 5A 5A 62 = 85, 89, 90, 90, 98 = RF channels to be used (kind of match previous dumps)// Normal
// Normal
// Address = 99 06 00 00
// Channels = 84, 89, 90, 90, 98 (guess from bind)
// P(13)= DC 80 80 32 80 20 20 20 20 58 04 00 00
// DC = normal packet
// 80 80 32 80 : AETR 00..80..FF
// 20 20 20 20 : Trims
// 58 : changing every time the TX restart
// 04 : |0x20=headless, |0x01=rate2, |0x02=rate3
// 00 : |0x01=calib, |0x20=return, |0x80=unknown
// 00 : |0x80=light, |0x01=flip

View File

@ -18,11 +18,12 @@
#include "iface_cc2500.h" #include "iface_cc2500.h"
#define RLINK_FORCE_ID //#define RLINK_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
#define RLINK_TX_ID_LEN 4 #define RLINK_TX_ID_LEN 4
#define RLINK_HOP 16
enum { enum {
RLINK_DATA = 0x00, RLINK_DATA = 0x00,
@ -30,6 +31,122 @@ enum {
RLINK_RX2 = 0x02, RLINK_RX2 = 0x02,
}; };
const PROGMEM uint8_t RLINK_hopping[][8] = {
/* 4C494E4B */ { 0xBC, 0x5A, 0x70, 0x4E, 0xDF, 0x32, 0x16, 0x89 },
/* 4D494E4B */ { 0x4C, 0xF3, 0xEA, 0x5B, 0x62, 0x9D, 0x01, 0x87 },
/* 4E494E4B */ { 0x86, 0xEA, 0xD0, 0xC9, 0x2B, 0x53, 0x7F, 0x41 },
/* 4F494E4B */ { 0xAC, 0x91, 0x7D, 0x48, 0xE0, 0xB5, 0x32, 0xF6 },
/* 50494E4B */ { 0xD6, 0x7C, 0xA4, 0x93, 0x5F, 0xE1, 0x02, 0xB8 },
/* 51494E4B */ { 0xED, 0x04, 0x73, 0xC8, 0x56, 0xB9, 0x1F, 0xA2 },
/* 52494E4B */ { 0xA7, 0xF0, 0x36, 0xB2, 0x95, 0x4E, 0x1C, 0xD8 },
/* 53494E4B */ { 0x76, 0x8B, 0xA0, 0x3E, 0x51, 0x4C, 0x9D, 0x2F },
/* 54494E4B */ { 0x07, 0x23, 0x16, 0xFD, 0xC9, 0x5B, 0x84, 0xAE },
/* 55494E4B */ { 0xD3, 0xA0, 0x69, 0xBF, 0x12, 0x8C, 0x4E, 0x57 },
/* 56494E4B */ { 0xA6, 0xBE, 0x91, 0xD3, 0x7C, 0x4F, 0x82, 0x50 },
/* 57494E4B */ { 0x91, 0xDA, 0xBC, 0x75, 0x82, 0x36, 0x4E, 0xF0 },
/* 58494E4B */ { 0x9A, 0x27, 0x5C, 0xF4, 0xD8, 0xB0, 0x36, 0xE1 },
/* 59494E4B */ { 0x92, 0xF1, 0x34, 0xA7, 0x5B, 0x0C, 0xED, 0x86 },
/* 5A494E4B */ { 0x8C, 0x2B, 0x51, 0xF9, 0x3E, 0x4A, 0x67, 0xD0 },
/* 5B494E4B */ { 0x5E, 0x3D, 0x67, 0x9B, 0xA2, 0x84, 0xFC, 0x01 },
/* 5C494E4B */ { 0xF9, 0x35, 0xBD, 0x78, 0x26, 0x1C, 0x0E, 0xA4 },
/* 5D494E4B */ { 0xD9, 0x7B, 0x48, 0x0E, 0x2A, 0xCF, 0x13, 0x65 },
/* 5E494E4B */ { 0x07, 0xE4, 0xF9, 0x8A, 0x3C, 0x21, 0xB5, 0xD6 },
/* 5F494E4B */ { 0xEB, 0xFA, 0x29, 0xD1, 0x54, 0x3C, 0x07, 0x86 },
/* 60494E4B */ { 0xDF, 0xCE, 0x0A, 0x32, 0x71, 0x5B, 0x96, 0x48 },
/* 61494E4B */ { 0x19, 0x86, 0xF5, 0x3A, 0x27, 0xDC, 0x0E, 0xB4 },
/* 62494E4B */ { 0xF8, 0x47, 0x9C, 0xE0, 0x2D, 0xBA, 0x15, 0x36 },
/* 63494E4B */ { 0xED, 0x78, 0x01, 0xA3, 0x2B, 0x6C, 0x45, 0xF9 },
/* 64494E4B */ { 0xE0, 0xA2, 0xD4, 0x6B, 0xF5, 0x18, 0x3C, 0x79 },
/* 65494E4B */ { 0x26, 0x90, 0x8B, 0x5D, 0x31, 0xCF, 0xE7, 0x4A },
/* 66494E4B */ { 0x7B, 0x12, 0xA8, 0x4F, 0xC0, 0x65, 0xD9, 0x3E },
/* 67494E4B */ { 0x35, 0xA2, 0x14, 0xBE, 0x06, 0x7D, 0x98, 0xFC },
/* 68494E4B */ { 0xD2, 0xA9, 0x7E, 0x40, 0x6F, 0x83, 0x5C, 0xB1 },
/* 69494E4B */ { 0xE5, 0xB9, 0xC1, 0x04, 0x83, 0x27, 0xA6, 0xFD },
/* 6A494E4B */ { 0x8E, 0x0C, 0x4A, 0x51, 0xFB, 0x63, 0x92, 0x7D },
/* 6B494E4B */ { 0xC7, 0x1D, 0x02, 0x93, 0x45, 0xF8, 0xA6, 0xBE },
/* 6C494E4B */ { 0xC1, 0x64, 0x59, 0x0A, 0x7D, 0x3F, 0x28, 0xEB },
/* 6D494E4B */ { 0xEF, 0x75, 0xAB, 0x94, 0xD2, 0x83, 0x1C, 0x60 },
/* 6E494E4B */ { 0xA1, 0x20, 0x54, 0x68, 0x9E, 0x7B, 0x3D, 0xFC },
/* 6F494E4B */ { 0x3E, 0x60, 0x28, 0xFC, 0xDA, 0x45, 0x9B, 0x71 },
/* 70494E4B */ { 0xB7, 0x0E, 0xA8, 0x23, 0xFC, 0x65, 0x4D, 0x91 },
/* 71494E4B */ { 0x29, 0x34, 0x51, 0x7C, 0xB8, 0xFD, 0x0E, 0x6A },
/* 72494E4B */ { 0x1B, 0x06, 0x3C, 0x89, 0xF5, 0x2A, 0x7E, 0xD4 },
/* 73494E4B */ { 0xF2, 0xC9, 0x63, 0x57, 0x0A, 0xB1, 0x48, 0xDE },
/* 74494E4B */ { 0x24, 0xAE, 0x0C, 0x19, 0x53, 0x7B, 0xF6, 0x8D },
/* 75494E4B */ { 0xEC, 0xD8, 0xF2, 0x4B, 0xA3, 0x51, 0x09, 0x76 },
/* 76494E4B */ { 0x98, 0x71, 0x5E, 0xAD, 0xFC, 0x04, 0x3B, 0x62 },
/* 77494E4B */ { 0xAE, 0xF6, 0xB7, 0x01, 0x52, 0x34, 0x9D, 0x8C },
/* 78494E4B */ { 0x69, 0x48, 0xF1, 0x3C, 0xDB, 0x0E, 0x25, 0xA7 },
/* 79494E4B */ { 0xCF, 0x60, 0x94, 0xAD, 0xB1, 0x82, 0x73, 0xE5 },
/* 7A494E4B */ { 0xFA, 0xC1, 0xD7, 0xB0, 0x53, 0x92, 0x6E, 0x48 },
/* 7B494E4B */ { 0xAC, 0x7D, 0xE5, 0x8B, 0x41, 0x96, 0x2F, 0x30 },
/* 7C494E4B */ { 0xFD, 0xC1, 0xB9, 0x02, 0xE4, 0x87, 0x56, 0x3A },
/* 7D494E4B */ { 0x30, 0xDA, 0x4F, 0x8E, 0x5C, 0xB9, 0x26, 0x71 },
/* 7E494E4B */ { 0xDC, 0xF9, 0x57, 0x30, 0x82, 0x1E, 0x6A, 0x4B },
/* 7F494E4B */ { 0x84, 0x1D, 0x7E, 0x29, 0x3C, 0x65, 0xA0, 0xBF },
/* 80494E4B */ { 0x01, 0xA3, 0xF6, 0xE2, 0x4C, 0x8B, 0x5D, 0x79 },
/* 81494E4B */ { 0xA1, 0x32, 0xE7, 0x08, 0x4D, 0x5B, 0x9F, 0x6C },
/* 82494E4B */ { 0x31, 0x40, 0x67, 0x8F, 0xBA, 0x95, 0x2C, 0xED },
/* 83494E4B */ { 0x91, 0x76, 0xFA, 0x83, 0x20, 0x4B, 0xEC, 0x5D },
/* 84494E4B */ { 0xDB, 0x54, 0xC2, 0x61, 0xF0, 0xA9, 0x87, 0x3E },
/* 85494E4B */ { 0xC0, 0xB4, 0x61, 0xD3, 0x7A, 0x5F, 0x82, 0x9E },
/* 86494E4B */ { 0xD6, 0xCF, 0x9B, 0x75, 0xE1, 0x42, 0x3A, 0x80 },
/* 87494E4B */ { 0xFE, 0xA2, 0xB4, 0x9C, 0x10, 0x7D, 0x56, 0x83 },
/* 88494E4B */ { 0xD2, 0x79, 0x54, 0xEF, 0xC8, 0x0B, 0x36, 0xA1 },
/* 89494E4B */ { 0x8D, 0xCF, 0x23, 0x64, 0xE5, 0x0B, 0x1A, 0x97 },
/* 8A494E4B */ { 0x07, 0xC4, 0xEF, 0x9A, 0x61, 0xD8, 0xB3, 0x52 },
/* 8B494E4B */ { 0x45, 0x6E, 0xBF, 0x8C, 0x9A, 0x2D, 0x31, 0x70 },
#ifdef RLINK_FORCE_ID
/* 3A99223A */ { 0x1F, 0x89, 0x25, 0x06, 0x4E, 0xBD, 0x3A, 0xC7 },
/* FC110D20 */ { 0xBC, 0xFE, 0x59, 0x84, 0x37, 0xA1, 0xD0, 0x62 }
#endif
};
static void __attribute__((unused)) RLINK_load_hopp(uint8_t num)
{
uint8_t inc=3*(rx_tx_addr[0]&3);
for (uint8_t i = 0; i < RLINK_HOP>>1; i++)
{
uint8_t val=pgm_read_byte_near(&RLINK_hopping[num][i]);
hopping_frequency[ i<<1 ]=12*(val>>4 )+inc;
hopping_frequency[(i<<1)+1]=12*(val&0x0F)+inc;
}
// replace one of the channel randomely
rf_ch_num=random(0xfefefefe)%0x11; // 0x00..0x10
if(inc==9) inc=6; // frequency exception
hopping_frequency[rf_ch_num]=12*16+inc;
}
static void __attribute__((unused)) RLINK_init()
{
// channels order depend on ID and currently unknown so using a table of 64 entries...
uint8_t id=rx_tx_addr[3]&0x3F;
memcpy(rx_tx_addr,"\x4C\x49\x4E\x4B",RLINK_TX_ID_LEN);
rx_tx_addr[0] += id;
RLINK_load_hopp(id);
#ifdef RLINK_FORCE_ID
//surface RC6GS
memcpy(rx_tx_addr,"\x3A\x99\x22\x3A",RLINK_TX_ID_LEN);
RLINK_load_hopp(64);
//air T8FB
//memcpy(rx_tx_addr,"\xFC\x11\x0D\x20",RLINK_TX_ID_LEN);
//RLINK_load_hopp(65);
#endif
/* debug("ID:");
for(uint8_t i=0;i<RLINK_TX_ID_LEN;i++)
debug(" 0x%02X",rx_tx_addr[i]);
debugln("");
debug("Hop(%d):", rf_ch_num);
for(uint8_t i=0;i<RLINK_HOP;i++)
debug(" 0x%02X",hopping_frequency[i]);
debugln("");
*/
}
const PROGMEM uint8_t RLINK_init_values[] = { const PROGMEM uint8_t RLINK_init_values[] = {
/* 00 */ 0x5B, 0x06, 0x5C, 0x07, 0xAB, 0xCD, 0x40, 0x04, /* 00 */ 0x5B, 0x06, 0x5C, 0x07, 0xAB, 0xCD, 0x40, 0x04,
/* 08 */ 0x45, 0x00, 0x00, 0x06, 0x00, 0x5C, 0x62, 0x76, /* 08 */ 0x45, 0x00, 0x00, 0x06, 0x00, 0x5C, 0x62, 0x76,
@ -38,19 +155,6 @@ const PROGMEM uint8_t RLINK_init_values[] = {
/* 20 */ 0xF8, 0x56, 0x10, 0xA9, 0x0A, 0x00, 0x11 /* 20 */ 0xF8, 0x56, 0x10, 0xA9, 0x0A, 0x00, 0x11
}; };
static void __attribute__((unused)) RLINK_init()
{
#ifdef RLINK_FORCE_ID
memcpy(rx_tx_addr,"\x3A\x99\x22\x3A",RLINK_TX_ID_LEN);
#endif
// channels order depend on ID and currently unknown...
memcpy(hopping_frequency,"\x12\xBA\x66\x72\x1E\x42\x06\x4E\x36\xAE\x8A\xA2\x2A\x7E\x96\x5A",16); // 1,15,8,9,2,5,0,6,4,14,11,13,3,10,12,7 : end value is value*12+6
rf_ch_num=(random(0xfefefefe)&0x0F)+1; // 0x01..0x10
hopping_frequency[rf_ch_num]=0xC6;
}
static void __attribute__((unused)) RLINK_rf_init() static void __attribute__((unused)) RLINK_rf_init()
{ {
CC2500_Strobe(CC2500_SIDLE); CC2500_Strobe(CC2500_SIDLE);
@ -62,7 +166,6 @@ static void __attribute__((unused)) RLINK_rf_init()
CC2500_WriteReg(CC2500_0C_FSCTRL0, option); CC2500_WriteReg(CC2500_0C_FSCTRL0, option);
CC2500_SetTxRxMode(TX_EN); CC2500_SetTxRxMode(TX_EN);
CC2500_SetPower();
} }
static void __attribute__((unused)) RLINK_tune_freq() static void __attribute__((unused)) RLINK_tune_freq()
@ -74,7 +177,7 @@ static void __attribute__((unused)) RLINK_tune_freq()
} }
} }
static void __attribute__((unused)) RLINK_TIMING_RFSEND_packet() static void __attribute__((unused)) RLINK_send_packet()
{ {
static uint32_t pseudo=0; static uint32_t pseudo=0;
uint32_t bits = 0; uint32_t bits = 0;
@ -86,8 +189,16 @@ static void __attribute__((unused)) RLINK_TIMING_RFSEND_packet()
// packet length // packet length
packet[0] = RLINK_TX_PACKET_LEN; packet[0] = RLINK_TX_PACKET_LEN;
// header // header
packet[1] = packet_count>3?0x03:0x01; // packet type: 0x01 normal, 0x03 request telemetry if(sub_protocol)
packet[1] = 0x21; //air 0x21 on dump but it looks to support telemetry at least RSSI
else
{//surface
packet[1] = 0x01;
//radiolink additionnal ID which is working only on a small set of RXs
//if(RX_num) packet[1] |= ((RX_num+2)<<4)+4; // RX number limited to 10 values, 0 is a wildcard //if(RX_num) packet[1] |= ((RX_num+2)<<4)+4; // RX number limited to 10 values, 0 is a wildcard
}
if(packet_count>3)
packet[1] |= 0x02; // 0x02 telemetry request flag
// ID // ID
memcpy(&packet[2],rx_tx_addr,RLINK_TX_ID_LEN); memcpy(&packet[2],rx_tx_addr,RLINK_TX_ID_LEN);
@ -117,7 +228,7 @@ static void __attribute__((unused)) RLINK_TIMING_RFSEND_packet()
packet[29]= pseudo >> 8; packet[29]= pseudo >> 8;
packet[30]= 0x00; // unknown packet[30]= 0x00; // unknown
packet[31]= 0x00; // unknown packet[31]= 0x00; // unknown
packet[32]= rf_ch_num; // value equal to 0xC6 in the RF table packet[32]= rf_ch_num; // index of value changed in the RF table
// check // check
uint8_t sum=0; uint8_t sum=0;
@ -132,13 +243,14 @@ static void __attribute__((unused)) RLINK_TIMING_RFSEND_packet()
packet_count++; packet_count++;
if(packet_count>5) packet_count=0; if(packet_count>5) packet_count=0;
//debug("P:"); //debugln("C= 0x%02X",hopping_frequency[pseudo & 0x0F]);
//for(uint8_t i=0;i<RLINK_TX_PACKET_LEN+1;i++) //debug("P=");
//for(uint8_t i=1;i<RLINK_TX_PACKET_LEN+1;i++)
// debug(" 0x%02X",packet[i]); // debug(" 0x%02X",packet[i]);
//debugln(""); //debugln("");
} }
#define RLINK_TIMING_PROTO 20000 #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
uint16_t RLINK_callback() uint16_t RLINK_callback()
@ -149,13 +261,15 @@ uint16_t RLINK_callback()
#ifdef MULTI_SYNC #ifdef MULTI_SYNC
telemetry_set_input_sync(RLINK_TIMING_PROTO); telemetry_set_input_sync(RLINK_TIMING_PROTO);
#endif #endif
CC2500_SetPower();
RLINK_tune_freq(); RLINK_tune_freq();
RLINK_TIMING_RFSEND_packet(); RLINK_send_packet();
#if not defined RLINK_HUB_TELEMETRY #if not defined RLINK_HUB_TELEMETRY
return RLINK_TIMING_PROTO; return RLINK_TIMING_PROTO;
#else #else
if(packet[1]==0x01) if(!(packet[1]&0x02))
return RLINK_TIMING_PROTO; return RLINK_TIMING_PROTO; //Normal packet
//Telemetry packet
phase++; // RX1 phase++; // RX1
return RLINK_TIMING_RFSEND; return RLINK_TIMING_RFSEND;
case RLINK_RX1: case RLINK_RX1:
@ -183,7 +297,7 @@ uint16_t RLINK_callback()
TX_RSSI += 128; TX_RSSI += 128;
RX_RSSI=packet_in[7]; //Should be packet_in[7]-256 but since it's an uint8_t... RX_RSSI=packet_in[7]; //Should be packet_in[7]-256 but since it's an uint8_t...
v_lipo1=packet_in[8]<<1; //RX Batt v_lipo1=packet_in[8]<<1; //RX Batt
v_lipo2=packet_in[9]<<1; //Batt v_lipo2=packet_in[9]; //Batt
telemetry_link=1; //Send telemetry out telemetry_link=1; //Send telemetry out
pps_counter++; pps_counter++;
packet_count=0; packet_count=0;
@ -191,10 +305,14 @@ uint16_t RLINK_callback()
//debugln(""); //debugln("");
} }
if (millis() - pps_timer >= 2000) if (millis() - pps_timer >= 2000)
{//1 packet every 20ms {//1 telemetry packet every 100ms
pps_timer = millis(); pps_timer = millis();
if(pps_counter<20)
pps_counter*=5;
else
pps_counter=100;
debugln("%d pps", pps_counter); debugln("%d pps", pps_counter);
TX_LQI = pps_counter; //Max=100% TX_LQI = pps_counter; //0..100%
pps_counter = 0; pps_counter = 0;
} }
CC2500_SetTxRxMode(TX_EN); CC2500_SetTxRxMode(TX_EN);

View File

@ -17,12 +17,12 @@ Multiprotocol is distributed in the hope that it will be useful,
#include "iface_nrf24l01.h" #include "iface_nrf24l01.h"
//#define V761_FORCE_ID
#define V761_PACKET_PERIOD 7060 // Timeout for callback in uSec #define V761_PACKET_PERIOD 7060 // Timeout for callback in uSec
#define V761_INITIAL_WAIT 500 #define V761_INITIAL_WAIT 500
#define V761_PACKET_SIZE 8 #define V761_PACKET_SIZE 8
#define V761_BIND_COUNT 200 #define V761_BIND_COUNT 200
//Fx chan management
#define V761_BIND_FREQ 0x28 #define V761_BIND_FREQ 0x28
#define V761_RF_NUM_CHANNELS 3 #define V761_RF_NUM_CHANNELS 3
@ -143,6 +143,7 @@ static void __attribute__((unused)) V761_init()
static void __attribute__((unused)) V761_initialize_txid() static void __attribute__((unused)) V761_initialize_txid()
{ {
#ifdef V761_FORCE_ID
switch(RX_num%5) switch(RX_num%5)
{ {
case 1: //Dump from air on Protonus TX case 1: //Dump from air on Protonus TX
@ -154,19 +155,28 @@ static void __attribute__((unused)) V761_initialize_txid()
memcpy(hopping_frequency,(uint8_t *)"\x13\x1D",2); memcpy(hopping_frequency,(uint8_t *)"\x13\x1D",2);
break; break;
case 3: //Dump from air on MikeHRC Eachine TX case 3: //Dump from air on MikeHRC Eachine TX
memcpy(rx_tx_addr,(uint8_t *)"\x08\x03\x00\xA0",4); // To be checked memcpy(rx_tx_addr,(uint8_t *)"\x08\x03\x00\xA0",4);
memcpy(hopping_frequency,(uint8_t *)"\x0D\x21",2); // To be checked memcpy(hopping_frequency,(uint8_t *)"\x0D\x21",2);
break; break;
case 4: //Dump from air on Crashanium Eachine TX case 4: //Dump from air on Crashanium Eachine TX
memcpy(rx_tx_addr,(uint8_t *)"\x58\x08\x00\xA0",4); // To be checked memcpy(rx_tx_addr,(uint8_t *)"\x58\x08\x00\xA0",4);
memcpy(hopping_frequency,(uint8_t *)"\x0D\x31",3); // To be checked memcpy(hopping_frequency,(uint8_t *)"\x0D\x31",2);
break; break;
default: //Dump from SPI default: //Dump from SPI
memcpy(rx_tx_addr,(uint8_t *)"\x6f\x2c\xb1\x93",4); memcpy(rx_tx_addr,(uint8_t *)"\x6f\x2c\xb1\x93",4);
memcpy(hopping_frequency,(uint8_t *)"\x14\x1e",3); memcpy(hopping_frequency,(uint8_t *)"\x14\x1e",2);
break; break;
} }
#else
//Tested with Eachine RX
rx_tx_addr[0]+=RX_num;
hopping_frequency[0]=(rx_tx_addr[0]&0x0F)+0x05;
hopping_frequency[1]=hopping_frequency[0]+0x05+(RX_num%0x2D);
#endif
hopping_frequency[2]=hopping_frequency[0]+0x37; hopping_frequency[2]=hopping_frequency[0]+0x37;
debugln("ID: %02X %02X %02X %02X , HOP: %02X %02X %02X",rx_tx_addr[0],rx_tx_addr[1],rx_tx_addr[2],rx_tx_addr[3],hopping_frequency[0],hopping_frequency[1],hopping_frequency[2]);
} }
uint16_t V761_callback() uint16_t V761_callback()
@ -223,7 +233,11 @@ uint16_t initV761(void)
phase = V761_BIND1; phase = V761_BIND1;
} }
else else
{
XN297_SetTXAddr(rx_tx_addr, 4);
phase = V761_DATA; phase = V761_DATA;
}
V761_init(); V761_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
packet_count = 0; packet_count = 0;

View File

@ -4,10 +4,10 @@
#endif #endif
#if not defined (ORANGE_TX) && not defined (STM32_BOARD) #if not defined (ORANGE_TX) && not defined (STM32_BOARD)
//Atmega328p //Atmega328p
#if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_MULTI_NO_BOOT) && not defined(ARDUINO_MULTI_FLASH_FROM_TX) && not defined(ARDUINO_AVR_MINI) && not defined(ARDUINO_AVR_NANO) #if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_MULTI_NO_BOOT) && not defined(ARDUINO_MULTI_FLASH_FROM_TX) && not defined(ARDUINO_AVR_MINI) && not defined(ARDUINO_AVR_NANO) && not defined(ARDUINO_AVR_DUEMILANOVE)
#error You must select one of these boards: "Multi 4-in-1", "Arduino Pro or Pro Mini" or "Arduino Mini" #error You must select one of these boards: "Multi 4-in-1", "Arduino Pro or Pro Mini" or "Arduino Mini"
#endif #endif
#if F_CPU != 16000000L || not defined(__AVR_ATmega328P__) #if F_CPU != 16000000L || not (defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__))
#error You must select the processor type "ATmega328(5V, 16MHz)" #error You must select the processor type "ATmega328(5V, 16MHz)"
#endif #endif
#endif #endif
@ -109,6 +109,11 @@
#error "The REDPINE forced frequency tuning value is outside of the range -127..127." #error "The REDPINE forced frequency tuning value is outside of the range -127..127."
#endif #endif
#endif #endif
#ifdef FORCE_RADIOLINK_TUNING
#if ( FORCE_RADIOLINK_TUNING < -127 ) || ( FORCE_RADIOLINK_TUNING > 127 )
#error "The RADIOLINK forced frequency tuning value is outside of the range -127..127."
#endif
#endif
#ifdef FORCE_SFHSS_TUNING #ifdef FORCE_SFHSS_TUNING
#if ( FORCE_SFHSS_TUNING < -127 ) || ( FORCE_SFHSS_TUNING > 127 ) #if ( FORCE_SFHSS_TUNING < -127 ) || ( FORCE_SFHSS_TUNING > 127 )
#error "The SFHSS forced frequency tuning value is outside of the range -127..127." #error "The SFHSS forced frequency tuning value is outside of the range -127..127."
@ -135,9 +140,9 @@
#error "The Flysky forced frequency tuning value is outside of the range -300..300." #error "The Flysky forced frequency tuning value is outside of the range -300..300."
#endif #endif
#endif #endif
#ifdef FORCE_FLYZONE_TUNING #ifdef FORCE_HEIGHT_TUNING
#if ( FORCE_FLYZONE_TUNING < -300 ) || ( FORCE_FLYZONE_TUNING > 300 ) #if ( FORCE_HEIGHT_TUNING < -300 ) || ( FORCE_HEIGHT_TUNING > 300 )
#error "The Flyzone forced frequency tuning value is outside of the range -300..300." #error "The Height forced frequency tuning value is outside of the range -300..300."
#endif #endif
#endif #endif
#ifdef FORCE_PELIKAN_TUNING #ifdef FORCE_PELIKAN_TUNING
@ -163,8 +168,8 @@
#ifndef FORCE_FLYSKY_TUNING #ifndef FORCE_FLYSKY_TUNING
#define FORCE_FLYSKY_TUNING 0 #define FORCE_FLYSKY_TUNING 0
#endif #endif
#ifndef FORCE_FLYZONE_TUNING #ifndef FORCE_HEIGHT_TUNING
#define FORCE_FLYZONE_TUNING 0 #define FORCE_HEIGHT_TUNING 0
#endif #endif
#ifndef FORCE_PELIKAN_TUNING #ifndef FORCE_PELIKAN_TUNING
#define FORCE_PELIKAN_TUNING 0 #define FORCE_PELIKAN_TUNING 0
@ -218,7 +223,7 @@
#undef AFHDS2A_RX_A7105_INO #undef AFHDS2A_RX_A7105_INO
#undef BUGS_A7105_INO #undef BUGS_A7105_INO
#undef FLYSKY_A7105_INO #undef FLYSKY_A7105_INO
#undef FLYZONE_A7105_INO #undef HEIGHT_A7105_INO
#undef HUBSAN_A7105_INO #undef HUBSAN_A7105_INO
#undef KYOSHO_A7105_INO #undef KYOSHO_A7105_INO
#undef PELIKAN_A7105_INO #undef PELIKAN_A7105_INO
@ -276,10 +281,12 @@
#undef MJXQ_NRF24L01_INO #undef MJXQ_NRF24L01_INO
#undef MT99XX_NRF24L01_INO #undef MT99XX_NRF24L01_INO
#undef NCC1701_NRF24L01_INO #undef NCC1701_NRF24L01_INO
#undef OMP_NRF24L01_INO
#undef POTENSIC_NRF24L01_INO #undef POTENSIC_NRF24L01_INO
#undef PROPEL_NRF24L01_INO #undef PROPEL_NRF24L01_INO
#undef Q303_NRF24L01_INO #undef Q303_NRF24L01_INO
#undef Q90C_NRF24L01_INO #undef Q90C_NRF24L01_INO
#undef REALACC_NRF24L01_INO
#undef SHENQI_NRF24L01_INO #undef SHENQI_NRF24L01_INO
#undef SLT_NRF24L01_INO #undef SLT_NRF24L01_INO
#undef SYMAX_NRF24L01_INO #undef SYMAX_NRF24L01_INO

View File

@ -23,7 +23,7 @@
// Parameters which can be modified // Parameters which can be modified
#define XN297DUMP_PERIOD_SCAN 50000 // 25000 #define XN297DUMP_PERIOD_SCAN 50000 // 25000
#define XN297DUMP_MAX_RF_CHANNEL 84 // Default 84 #define XN297DUMP_MAX_RF_CHANNEL 127 // Default 84
// Do not touch from there // Do not touch from there
#define XN297DUMP_INITIAL_WAIT 500 #define XN297DUMP_INITIAL_WAIT 500

View File

@ -16,7 +16,7 @@ Multiprotocol is distributed in the hope that it will be useful,
#if defined(ZSX_NRF24L01_INO) #if defined(ZSX_NRF24L01_INO)
#include "iface_nrf250k.h" #include "iface_nrf24l01.h"
//#define FORCE_ZSX_ORIGINAL_ID //#define FORCE_ZSX_ORIGINAL_ID

View File

@ -100,11 +100,12 @@
//#define FORCE_FRSKYL_TUNING 0 //#define FORCE_FRSKYL_TUNING 0
//#define FORCE_FRSKYV_TUNING 0 //#define FORCE_FRSKYV_TUNING 0
//#define FORCE_FRSKYX_TUNING 0 //#define FORCE_FRSKYX_TUNING 0
//#define FORCE_SFHSS_TUNING 0
//#define FORCE_SKYARTEC_TUNING 0
//#define FORCE_HITEC_TUNING 0 //#define FORCE_HITEC_TUNING 0
//#define FORCE_HOTT_TUNING 0 //#define FORCE_HOTT_TUNING 0
//#define FORCE_RADIOLINK_TUNING 0
//#define FORCE_REDPINE_TUNING 0 //#define FORCE_REDPINE_TUNING 0
//#define FORCE_SFHSS_TUNING 0
//#define FORCE_SKYARTEC_TUNING 0
/** A7105 Fine Frequency Tuning **/ /** A7105 Fine Frequency Tuning **/
//This is required in rare cases where some A7105 modules and/or RXs have an inaccurate crystal oscillator. //This is required in rare cases where some A7105 modules and/or RXs have an inaccurate crystal oscillator.
@ -117,7 +118,7 @@
//#define FORCE_AFHDS2A_TUNING 0 //#define FORCE_AFHDS2A_TUNING 0
//#define FORCE_BUGS_TUNING 0 //#define FORCE_BUGS_TUNING 0
//#define FORCE_FLYSKY_TUNING 0 //#define FORCE_FLYSKY_TUNING 0
//#define FORCE_FLYZONE_TUNING 0 //#define FORCE_HEIGHT_TUNING 0
//#define FORCE_HUBSAN_TUNING 0 //#define FORCE_HUBSAN_TUNING 0
//#define FORCE_KYOSHO_TUNING 0 //#define FORCE_KYOSHO_TUNING 0
//#define FORCE_PELIKAN_TUNING 0 //#define FORCE_PELIKAN_TUNING 0
@ -169,7 +170,7 @@
#define AFHDS2A_RX_A7105_INO #define AFHDS2A_RX_A7105_INO
#define BUGS_A7105_INO #define BUGS_A7105_INO
#define FLYSKY_A7105_INO #define FLYSKY_A7105_INO
#define FLYZONE_A7105_INO #define HEIGHT_A7105_INO
#define HUBSAN_A7105_INO #define HUBSAN_A7105_INO
#define KYOSHO_A7105_INO #define KYOSHO_A7105_INO
#define PELIKAN_A7105_INO #define PELIKAN_A7105_INO
@ -226,10 +227,12 @@
#define MJXQ_NRF24L01_INO #define MJXQ_NRF24L01_INO
#define MT99XX_NRF24L01_INO #define MT99XX_NRF24L01_INO
#define NCC1701_NRF24L01_INO #define NCC1701_NRF24L01_INO
#define OMP_NRF24L01_INO
#define POTENSIC_NRF24L01_INO #define POTENSIC_NRF24L01_INO
#define PROPEL_NRF24L01_INO #define PROPEL_NRF24L01_INO
#define Q303_NRF24L01_INO #define Q303_NRF24L01_INO
#define Q90C_NRF24L01_INO #define Q90C_NRF24L01_INO
#define REALACC_NRF24L01_INO
#define SHENQI_NRF24L01_INO #define SHENQI_NRF24L01_INO
#define SLT_NRF24L01_INO #define SLT_NRF24L01_INO
#define SYMAX_NRF24L01_INO #define SYMAX_NRF24L01_INO
@ -579,8 +582,6 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
V6X6 V6X6
V912 V912
CX20 CX20
PROTO_FLYZONE
FZ410
PROTO_FQ777 PROTO_FQ777
NONE NONE
PROTO_FRSKY_RX PROTO_FRSKY_RX
@ -634,6 +635,9 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
H20H H20H
H20MINI H20MINI
H30MINI H30MINI
PROTO_HEIGHT
HEIGHT_5CH
HEIGHT_8CH
PROTO_HISKY PROTO_HISKY
Hisky Hisky
HK310 HK310
@ -680,6 +684,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
FY805 FY805
PROTO_NCC1701 PROTO_NCC1701
NONE NONE
PROTO_OMP
NONE
PROTO_PELIKAN PROTO_PELIKAN
PELIKAN_PRO PELIKAN_PRO
PELIKAN_LITE PELIKAN_LITE
@ -698,6 +704,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
CX10WD CX10WD
PROTO_Q90C PROTO_Q90C
NONE NONE
PROTO_REALACC
NONE
PROTO_REDPINE PROTO_REDPINE
RED_FAST RED_FAST
RED_SLOW RED_SLOW

View File

@ -83,7 +83,6 @@ CFlie|38|CFlie||||||||NRF24L01|
[Flysky](Protocols_Details.md#FLYSKY---1)|1|Flysky|V9x9|V6x6|V912|CX20||||A7105| [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|||A7105| [Flysky AFHDS2A](Protocols_Details.md#FLYSKY-AFHDS2A---28)|28|PWM_IBUS|PPM_IBUS|PWM_SBUS|PPM_SBUS|PWM_IBUS16|PPM_IBUS16|||A7105|
[Flysky AFHDS2A RX](Protocols_Details.md#FLYSKY-AFHDS2A-RX---56)|56|RX||||||||A7105| [Flysky AFHDS2A RX](Protocols_Details.md#FLYSKY-AFHDS2A-RX---56)|56|RX||||||||A7105|
[Flyzone](Protocols_Details.md#FLYZONE---53)|53|FZ410||||||||A7105|
[FQ777](Protocols_Details.md#FQ777---23)|23|FQ777||||||||NRF24L01|SSV7241 [FQ777](Protocols_Details.md#FQ777---23)|23|FQ777||||||||NRF24L01|SSV7241
[FrskyD](Protocols_Details.md#FRSKYD---3)|3|D8|Cloned|||||||CC2500| [FrskyD](Protocols_Details.md#FRSKYD---3)|3|D8|Cloned|||||||CC2500|
[FrskyL](Protocols_Details.md#FRSKYL---67)|67|LR12|LR12 6CH|||||||CC2500| [FrskyL](Protocols_Details.md#FRSKYL---67)|67|LR12|LR12 6CH|||||||CC2500|
@ -94,9 +93,10 @@ CFlie|38|CFlie||||||||NRF24L01|
[Frsky_RX](Protocols_Details.md#FRSKY_RX---55)|55|RX|CloneTX|||||||CC2500| [Frsky_RX](Protocols_Details.md#FRSKY_RX---55)|55|RX|CloneTX|||||||CC2500|
[FX816](Protocols_Details.md#FX816---58)|28|FX816|P38|||||||NRF24L01| [FX816](Protocols_Details.md#FX816---58)|28|FX816|P38|||||||NRF24L01|
[FY326](Protocols_Details.md#FY326---20)|20|FY326|FY319|||||||NRF24L01| [FY326](Protocols_Details.md#FY326---20)|20|FY326|FY319|||||||NRF24L01|
[GD00X](Protocols_Details.md#GD00X---47)|47|GD_V1*|GD_V2*|||||||NRF24L01| [GD00X](Protocols_Details.md#GD00X---47)|47|GD_V1*|GD_V2*|||||||NRF24L01|XN297L
[GW008](Protocols_Details.md#GW008---32)|32|GW008||||||||NRF24L01|XN297 [GW008](Protocols_Details.md#GW008---32)|32|GW008||||||||NRF24L01|XN297
[H8_3D](Protocols_Details.md#H8_3D---36)|36|H8_3D|H20H|H20Mini|H30Mini|||||NRF24L01|XN297 [H8_3D](Protocols_Details.md#H8_3D---36)|36|H8_3D|H20H|H20Mini|H30Mini|||||NRF24L01|XN297
[Height](Protocols_Details.md#HEIGHT---53)|53|5ch|8ch|||||||A7105|
[Hisky](Protocols_Details.md#HISKY---4)|4|Hisky|HK310|||||||NRF24L01| [Hisky](Protocols_Details.md#HISKY---4)|4|Hisky|HK310|||||||NRF24L01|
[Hitec](Protocols_Details.md#HITEC---39)|39|OPT_FW|OPT_HUB|MINIMA||||||CC2500| [Hitec](Protocols_Details.md#HITEC---39)|39|OPT_FW|OPT_HUB|MINIMA||||||CC2500|
[Hontai](Protocols_Details.md#HONTAI---26)|26|HONTAI|JJRCX1|X5C1|FQ777_951|||||NRF24L01|XN297 [Hontai](Protocols_Details.md#HONTAI---26)|26|HONTAI|JJRCX1|X5C1|FQ777_951|||||NRF24L01|XN297
@ -110,6 +110,7 @@ CFlie|38|CFlie||||||||NRF24L01|
[MJXq](Protocols_Details.md#MJXQ---18)|18|WLH08|X600|X800|H26D|E010*|H26WH|PHOENIX*||NRF24L01|XN297 [MJXq](Protocols_Details.md#MJXQ---18)|18|WLH08|X600|X800|H26D|E010*|H26WH|PHOENIX*||NRF24L01|XN297
[MT99xx](Protocols_Details.md#MT99XX---17)|17|MT|H7|YZ|LS|FY805||||NRF24L01|XN297 [MT99xx](Protocols_Details.md#MT99XX---17)|17|MT|H7|YZ|LS|FY805||||NRF24L01|XN297
[NCC1701](Protocols_Details.md#NCC1701---44)|44|NCC1701||||||||NRF24L01| [NCC1701](Protocols_Details.md#NCC1701---44)|44|NCC1701||||||||NRF24L01|
[OMP](Protocols_Details.md#OMP---77)|77|||||||||NRF24L01|XN297L
[OpenLRS](Protocols_Details.md#OpenLRS---27)|27|||||||||None| [OpenLRS](Protocols_Details.md#OpenLRS---27)|27|||||||||None|
[Pelikan](Protocols_Details.md#Pelikan---60)|60|Pro|Lite|||||||A7105| [Pelikan](Protocols_Details.md#Pelikan---60)|60|Pro|Lite|||||||A7105|
[Potensic](Protocols_Details.md#Potensic---51)|51|A20||||||||NRF24L01|XN297 [Potensic](Protocols_Details.md#Potensic---51)|51|A20||||||||NRF24L01|XN297
@ -117,7 +118,7 @@ CFlie|38|CFlie||||||||NRF24L01|
[Q2X2](Protocols_Details.md#Q2X2---29)|29|Q222|Q242|Q282||||||NRF24L01| [Q2X2](Protocols_Details.md#Q2X2---29)|29|Q222|Q242|Q282||||||NRF24L01|
[Q303](Protocols_Details.md#Q303---31)|31|Q303|CX35|CX10D|CX10WD|||||NRF24L01|XN297 [Q303](Protocols_Details.md#Q303---31)|31|Q303|CX35|CX10D|CX10WD|||||NRF24L01|XN297
[Q90C](Protocols_Details.md#Q90C---72)|72|Q90C*||||||||NRF24L01|XN297 [Q90C](Protocols_Details.md#Q90C---72)|72|Q90C*||||||||NRF24L01|XN297
[RadioLink](Protocols_Details.md#RadioLink---74)|74|Surface||||||||CC2500| [RadioLink](Protocols_Details.md#RadioLink---74)|74|Surface|Air|||||||CC2500|
[Redpine](Protocols_Details.md#Redpine---50)|50|FAST|SLOW|||||||NRF24L01| [Redpine](Protocols_Details.md#Redpine---50)|50|FAST|SLOW|||||||NRF24L01|
[Scanner](Protocols_Details.md#Scanner---54)|54|||||||||CC2500| [Scanner](Protocols_Details.md#Scanner---54)|54|||||||||CC2500|
[SFHSS](Protocols_Details.md#SFHSS---21)|21|SFHSS||||||||CC2500| [SFHSS](Protocols_Details.md#SFHSS---21)|21|SFHSS||||||||CC2500|
@ -239,12 +240,21 @@ Extended limits supported
Low power: enable/disable the LNA stage on the RF component to use depending on the distance with the TX. Low power: enable/disable the LNA stage on the RF component to use depending on the distance with the TX.
## FLYZONE - *53* ## HEIGHT - *53*
Models using the Flyzone FZ-410 TX: Fokker D.VII Micro EP RTF. Models using the old ARES TX (prior to Hitec RED) Tiger Moth, eRC Micro Stick and Rage R/C.
CH1|CH2|CH3|CH4 ### Sub_protocol 5CH - *0*
---|---|---|--- Models from Height, Flyzone, Rage R/C, eRC and the old ARES (prior to Hitec RED).
A|E|T|R
CH1|CH2|CH3|CH4|CH5
---|---|---|---|---
A|E|T|R|Gear
### Sub_protocol 8CH - *1*
Models from Height and Rage R/C.
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8
---|---|---|---|---|---|---|---
A|E|T|R|Gear|Gyro|Flap|Light
## HUBSAN - *2* ## HUBSAN - *2*
@ -548,6 +558,8 @@ You should definitively upgrade your receivers/sensors to the latest firmware ve
Extended limits Extended limits
**64 IDs available, use RX num to scroll through them**
Option for this protocol corresponds to fine frequency tuning. This value is different for each Module and **must** be accurate otherwise the link will not be stable. Option for this protocol corresponds to fine frequency tuning. This value is different for each Module and **must** be accurate otherwise the link will not be stable.
Check the [Frequency Tuning page](/docs/Frequency_Tuning.md) to determine it. Check the [Frequency Tuning page](/docs/Frequency_Tuning.md) to determine it.
@ -558,13 +570,16 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|FS_CH1|FS_CH2|FS_CH3|FS_CH4|FS_CH5|FS_CH6|FS_CH7
FS=FailSafe FS=FailSafe
### Sub_protocol Surface - *0* ### Sub_protocol Surface - *0*
Surface protocol. TXs: RC4GS,RC6GS. Compatible RXs:R7FG(Std),R6FG,R6F,R8EF,R8FM,R8F,R4FGM Surface protocol. TXs: RC4GS,RC6GS. Compatible RXs:R7FG(Std),R6FG,R6F,R8EF,R8FM,R8F,R4FGM,R4F and more
**Only 1 ID for now**
CH1=Steering, CH2=Throttle, CH8=Gyro gain CH1=Steering, CH2=Throttle, CH8=Gyro gain
Telemetry: RX_RSSI (for the original value add -256), TX_RSSI, TX_QLY (0..100%), A1=RX_Batt, A2=Batt Telemetry: RX_RSSI (for the original value add -256), TX_RSSI, TX_QLY (0..100%), A1=RX_Batt, A2=Batt/2 (adjust the ratio)
### Sub_protocol Air - *1*
Air protocol. TXs: T8FB,T8S. Compatible RXs:R8EF,R8FM,R8SM,R4FG,R4F and more
Telemetry: RX_RSSI (for the original value add -256), TX_RSSI, TX_QLY (0..100%)
## SFHSS - *21* ## SFHSS - *21*
Models: Futaba RXs and XK models. Models: Futaba RXs and XK models.
@ -1263,6 +1278,21 @@ CH1|CH2|CH3|CH4|CH5
---|---|---|---|--- ---|---|---|---|---
A|E|T|R|Warp A|E|T|R|Warp
## OMP - *77*
Model: OMPHOBBY M2
This protocol is known to be problematic because it's using the xn297L emulation with a transmission speed of 250kbps therefore it doesn't work very well with every modules, this is an hardware issue with the accuracy of the components.
If the model does not respond well to inputs or hard to bind, you can try to switch the emulation from the default NRF24L01 RF component to the CC2500 by using an option value (freq tuning) different from 0. Option in this case is used for fine frequency tuning like any CC2500 protocols so check the [Frequency Tuning page](/docs/Frequency_Tuning.md).
CH1|CH2|CH3|CH4|CH5|CH6|CH7
---|---|---|---|---|---|---
A|E|T|R|HOLD|IDLE|MODE
IDLE= 3 pos switch: -100% Idle0, 0% Idle1, +100% Idle2
MODE= 3 pos switch -100% Attitude, 0% Attitude, +100% 3D
## Potensic - *51* ## Potensic - *51*
Model: Potensic A20 Model: Potensic A20
@ -1510,8 +1540,6 @@ A|E|T|R|FLIP|LIGHT
## V761 - *48* ## V761 - *48*
Warning: **Only 5 IDs**, you can cycle through them using RX_Num.
Gyro: -100%=Beginer mode (Gyro on, yaw and pitch rate limited), 0%=Mid Mode ( Gyro on no rate limits), +100%=Mode Expert Gyro off Gyro: -100%=Beginer mode (Gyro on, yaw and pitch rate limited), 0%=Mid Mode ( Gyro on no rate limits), +100%=Mode Expert Gyro off
Calib: momentary switch, calib will happen one the channel goes from -100% to +100% Calib: momentary switch, calib will happen one the channel goes from -100% to +100%
Flip: momentary switch: hold flip(+100%), indicate flip direction with Ele or Ail, release flip(-100%) Flip: momentary switch: hold flip(+100%), indicate flip direction with Ele or Ail, release flip(-100%)