Protocol init function modified

This commit is contained in:
Pascal Langer 2021-02-09 18:23:33 +01:00
parent d496f62719
commit 3b8b2ef376
87 changed files with 944 additions and 1565 deletions

View File

@ -28,7 +28,7 @@ enum {
AFHDS2A_RX_DATA AFHDS2A_RX_DATA
}; };
static void __attribute__((unused)) AFHDS2A_Rx_build_telemetry_packet() static void __attribute__((unused)) AFHDS2A_RX_build_telemetry_packet()
{ {
uint32_t bits = 0; uint32_t bits = 0;
uint8_t bitsavailable = 0; uint8_t bitsavailable = 0;
@ -56,13 +56,13 @@ static void __attribute__((unused)) AFHDS2A_Rx_build_telemetry_packet()
} }
} }
static uint8_t __attribute__((unused)) AFHDS2A_Rx_data_ready() static uint8_t __attribute__((unused)) AFHDS2A_RX_data_ready()
{ {
// check if FECF+CRCF Ok // check if FECF+CRCF Ok
return !(A7105_ReadReg(A7105_00_MODE) & (1 << 5 | 1 << 6 | 1 << 0)); return !(A7105_ReadReg(A7105_00_MODE) & (1 << 5 | 1 << 6 | 1 << 0));
} }
uint16_t initAFHDS2A_Rx() void AFHDS2A_RX_init()
{ {
uint8_t i; uint8_t i;
A7105_Init(); A7105_Init();
@ -84,12 +84,11 @@ uint16_t initAFHDS2A_Rx()
hopping_frequency[i] = eeprom_read_byte((EE_ADDR)temp++); hopping_frequency[i] = eeprom_read_byte((EE_ADDR)temp++);
phase = AFHDS2A_RX_DATA; phase = AFHDS2A_RX_DATA;
} }
return 1000;
} }
#define AFHDS2A_RX_WAIT_WRITE 0x80 #define AFHDS2A_RX_WAIT_WRITE 0x80
uint16_t AFHDS2A_Rx_callback() uint16_t AFHDS2A_RX_callback()
{ {
static int8_t read_retry; static int8_t read_retry;
int16_t temp; int16_t temp;
@ -105,9 +104,13 @@ 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(IS_BIND_DONE)
{
AFHDS2A_RX_init(); // Abort bind
break;
}
debugln("bind p=%d", phase+1); debugln("bind p=%d", phase+1);
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)) {
memcpy(rx_id, &packet[1], 4); // TX id actually memcpy(rx_id, &packet[1], 4); // TX id actually
@ -121,9 +124,13 @@ 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 if(IS_BIND_DONE)
{
AFHDS2A_RX_init(); // Abort bind
break;
}
// 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);
if ((packet[0] == 0xBC && packet[9] == 0x02 && packet[10] == 0x00) && if ((packet[0] == 0xBC && packet[9] == 0x02 && packet[10] == 0x00) &&
(memcmp(rx_id, &packet[1], 4) == 0) && (memcmp(rx_id, &packet[1], 4) == 0) &&
@ -156,7 +163,8 @@ uint16_t AFHDS2A_Rx_callback()
{ {
debugln("done"); debugln("done");
BIND_DONE; BIND_DONE;
return initAFHDS2A_Rx(); // Restart protocol AFHDS2A_RX_init(); // Restart protocol
break;
} }
phase |= AFHDS2A_RX_WAIT_WRITE; phase |= AFHDS2A_RX_WAIT_WRITE;
return 1700; return 1700;
@ -173,13 +181,13 @@ uint16_t AFHDS2A_Rx_callback()
return 10000; return 10000;
case AFHDS2A_RX_DATA: case AFHDS2A_RX_DATA:
if (AFHDS2A_Rx_data_ready()) { if (AFHDS2A_RX_data_ready()) {
A7105_ReadData(AFHDS2A_RX_TXPACKET_SIZE); A7105_ReadData(AFHDS2A_RX_TXPACKET_SIZE);
if (memcmp(&packet[1], rx_id, 4) == 0 && memcmp(&packet[5], rx_tx_addr, 4) == 0) { if (memcmp(&packet[1], rx_id, 4) == 0 && memcmp(&packet[5], rx_tx_addr, 4) == 0) {
if (packet[0] == 0x58 && packet[37] == 0x00 && telemetry_link == 0) { // standard packet, send channels to TX if (packet[0] == 0x58 && packet[37] == 0x00 && telemetry_link == 0) { // standard packet, send channels to TX
int rssi = min(A7105_ReadReg(A7105_1D_RSSI_THOLD),160); int rssi = min(A7105_ReadReg(A7105_1D_RSSI_THOLD),160);
RX_RSSI = map16b(rssi, 160, 8, 0, 128); RX_RSSI = map16b(rssi, 160, 8, 0, 128);
AFHDS2A_Rx_build_telemetry_packet(); AFHDS2A_RX_build_telemetry_packet();
telemetry_link = 1; telemetry_link = 1;
} }
rx_data_started = true; rx_data_started = true;

View File

@ -277,7 +277,7 @@ static void AFHDS2A_build_packet(uint8_t type)
#define AFHDS2A_WRITE_TIME 1700 #define AFHDS2A_WRITE_TIME 1700
#endif #endif
uint16_t ReadAFHDS2A() uint16_t AFHDS2A_callback()
{ {
static uint8_t packet_type; static uint8_t packet_type;
static uint16_t packet_counter; static uint16_t packet_counter;
@ -420,7 +420,7 @@ uint16_t ReadAFHDS2A()
return 3850; // never reached, please the compiler return 3850; // never reached, please the compiler
} }
uint16_t initAFHDS2A() void AFHDS2A_init()
{ {
A7105_Init(); A7105_Init();
@ -446,6 +446,5 @@ uint16_t initAFHDS2A()
num_ch=17; num_ch=17;
else else
num_ch=14; num_ch=14;
return 50000;
} }
#endif #endif

View File

@ -33,7 +33,7 @@ enum {
ASSAN_DATA5 ASSAN_DATA5
}; };
void ASSAN_init() void ASSAN_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x02); // 4 bytes rx/tx address NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x02); // 4 bytes rx/tx address
@ -169,17 +169,16 @@ static void __attribute__((unused)) ASSAN_initialize_txid()
hopping_frequency[1]=freq2; hopping_frequency[1]=freq2;
} }
uint16_t initASSAN() void ASSAN_init()
{ {
ASSAN_initialize_txid(); ASSAN_initialize_txid();
ASSAN_init(); ASSAN_RF_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
phase=ASSAN_BIND0; phase=ASSAN_BIND0;
else else
phase=ASSAN_DATA0; phase=ASSAN_DATA0;
return 1000;
} }
#endif #endif

View File

@ -57,7 +57,7 @@ enum {
#define BUGSMINI_FLAG_ANGLE 0x02 // angle/acro mode (set is angle mode) #define BUGSMINI_FLAG_ANGLE 0x02 // angle/acro mode (set is angle mode)
#define BUGSMINI_FLAG_ALTHOLD 0x04 // angle/altitude hold mode (set is altitude mode) #define BUGSMINI_FLAG_ALTHOLD 0x04 // angle/altitude hold mode (set is altitude mode)
static void __attribute__((unused)) BUGSMINI_init() static void __attribute__((unused)) BUGSMINI_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -357,11 +357,11 @@ static void __attribute__((unused)) BUGSMINI_initialize_txid()
BUGSMINI_txhash = pgm_read_byte_near( &BUGSMINI_tx_hash[rx_tx_addr[3]%BUGSMINI_NUM_TX_RF_MAPS] ); BUGSMINI_txhash = pgm_read_byte_near( &BUGSMINI_tx_hash[rx_tx_addr[3]%BUGSMINI_NUM_TX_RF_MAPS] );
} }
uint16_t initBUGSMINI() void BUGSMINI_init()
{ {
BUGSMINI_initialize_txid(); BUGSMINI_initialize_txid();
memset(packet, (uint8_t)0, BUGSMINI_TX_PAYLOAD_SIZE); memset(packet, (uint8_t)0, BUGSMINI_TX_PAYLOAD_SIZE);
BUGSMINI_init(); BUGSMINI_RF_init();
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
{ {
XN297_SetTXAddr((const uint8_t*)"mjxRC", 5); XN297_SetTXAddr((const uint8_t*)"mjxRC", 5);
@ -378,7 +378,6 @@ uint16_t initBUGSMINI()
armed = 0; armed = 0;
arm_flags = BUGSMINI_FLAG_DISARM; // initial value from captures arm_flags = BUGSMINI_FLAG_DISARM; // initial value from captures
arm_channel_previous = BUGSMINI_CH_SW_ARM; arm_channel_previous = BUGSMINI_CH_SW_ARM;
return BUGSMINI_INITIAL_WAIT;
} }
#endif #endif

View File

@ -98,7 +98,7 @@ static void __attribute__((unused)) Bayang_Rx_build_telemetry_packet()
} }
} }
uint16_t initBayang_Rx() void BAYANG_RX_init()
{ {
uint8_t i; uint8_t i;
Bayang_Rx_init_nrf24l01(); Bayang_Rx_init_nrf24l01();
@ -119,17 +119,20 @@ uint16_t initBayang_Rx()
XN297_SetRXAddr(rx_tx_addr, BAYANG_RX_ADDRESS_LENGTH); XN297_SetRXAddr(rx_tx_addr, BAYANG_RX_ADDRESS_LENGTH);
phase = BAYANG_RX_DATA; phase = BAYANG_RX_DATA;
} }
return 1000;
} }
uint16_t Bayang_Rx_callback() uint16_t BAYANG_RX_callback()
{ {
uint8_t i; uint8_t i;
static int8_t read_retry; static int8_t read_retry;
switch (phase) { switch (phase) {
case BAYANG_RX_BIND: case BAYANG_RX_BIND:
if(IS_BIND_DONE) return initBayang_Rx(); // Abort bind if(IS_BIND_DONE)
{
BAYANG_RX_init(); // Abort bind
break;
}
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

@ -246,7 +246,7 @@ static void __attribute__((unused)) BAYANG_check_rx(void)
} }
#endif #endif
static void __attribute__((unused)) BAYANG_init() static void __attribute__((unused)) BAYANG_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -363,15 +363,14 @@ static void __attribute__((unused)) BAYANG_initialize_txid()
hopping_frequency_no=0; hopping_frequency_no=0;
} }
uint16_t initBAYANG(void) void BAYANG_init(void)
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
phase=BAYANG_BIND; phase=BAYANG_BIND;
bind_counter = BAYANG_BIND_COUNT; bind_counter = BAYANG_BIND_COUNT;
BAYANG_initialize_txid(); BAYANG_initialize_txid();
BAYANG_init(); BAYANG_RF_init();
packet_count=0; packet_count=0;
return BAYANG_INITIAL_WAIT+BAYANG_PACKET_PERIOD;
} }
#endif #endif

View File

@ -315,7 +315,7 @@ static void __attribute__((unused)) BUGS_increment_counts()
// FIFO config is one less than desired value // FIFO config is one less than desired value
#define BUGS_FIFO_SIZE_RX 15 #define BUGS_FIFO_SIZE_RX 15
#define BUGS_FIFO_SIZE_TX 21 #define BUGS_FIFO_SIZE_TX 21
uint16_t ReadBUGS(void) uint16_t BUGS_callback(void)
{ {
uint8_t mode, base_adr; uint8_t mode, base_adr;
uint16_t rxid; uint16_t rxid;
@ -437,7 +437,7 @@ uint16_t ReadBUGS(void)
return packet_period; return packet_period;
} }
uint16_t initBUGS(void) void BUGS_init(void)
{ {
uint16_t rxid=0; uint16_t rxid=0;
uint8_t base_adr=BUGS_EEPROM_OFFSET+(RX_num&0x0F)*2; uint8_t base_adr=BUGS_EEPROM_OFFSET+(RX_num&0x0F)*2;
@ -459,8 +459,6 @@ uint16_t initBUGS(void)
armed = 0; armed = 0;
arm_flags = BUGS_FLAG_DISARM; // initial value from captures arm_flags = BUGS_FLAG_DISARM; // initial value from captures
arm_channel_previous = BUGS_CH_SW_ARM; arm_channel_previous = BUGS_CH_SW_ARM;
return 10000;
} }
#endif #endif

View File

@ -356,7 +356,7 @@ static void __attribute__((unused)) CABELL_setAddress()
} }
//----------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------
static void __attribute__((unused)) CABELL_init() static void __attribute__((unused)) CABELL_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
CABELL_SetPower(); CABELL_SetPower();
@ -414,7 +414,7 @@ uint16_t CABELL_callback()
else if (bind_counter == 0) else if (bind_counter == 0)
{ {
BIND_DONE; BIND_DONE;
CABELL_init(); // non-bind address CABELL_RF_init(); // non-bind address
} }
else else
{ {
@ -425,17 +425,15 @@ uint16_t CABELL_callback()
} }
//----------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------
uint16_t initCABELL(void) void CABELL_init(void)
{ {
if (IS_BIND_DONE) if (IS_BIND_DONE)
bind_counter = 0; bind_counter = 0;
else else
bind_counter = CABELL_BIND_COUNT; bind_counter = CABELL_BIND_COUNT;
CABELL_init(); CABELL_RF_init();
packet_period = CABELL_PACKET_PERIOD; packet_period = CABELL_PACKET_PERIOD;
return packet_period;
} }
#endif #endif

View File

@ -644,7 +644,7 @@ static uint8_t crtp_log_setup_state_machine()
return state_machine_completed; return state_machine_completed;
} }
static int cflie_init() static void CFLIE_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
@ -672,9 +672,6 @@ static int cflie_init()
NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x01); // Enable Dynamic Payload Length on pipe 0 NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x01); // Enable Dynamic Payload Length on pipe 0
NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x06); // Enable Dynamic Payload Length, enable Payload with ACK NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x06); // Enable Dynamic Payload Length, enable Payload with ACK
// 50ms delay in callback
return 50000;
} }
// TODO: Fix telemetry // TODO: Fix telemetry
@ -749,7 +746,7 @@ static int cflie_init()
// } // }
// } // }
static uint16_t cflie_callback() static uint16_t CFLIE_callback()
{ {
switch (phase) { switch (phase) {
case CFLIE_INIT_SEARCH: case CFLIE_INIT_SEARCH:
@ -799,7 +796,7 @@ static uint16_t cflie_callback()
} }
// Generate address to use from TX id and manufacturer id (STM32 unique id) // Generate address to use from TX id and manufacturer id (STM32 unique id)
static uint8_t initialize_rx_tx_addr() static uint8_t CFLIE_initialize_rx_tx_addr()
{ {
rx_tx_addr[0] = rx_tx_addr[0] =
rx_tx_addr[1] = rx_tx_addr[1] =
@ -844,19 +841,15 @@ static uint8_t initialize_rx_tx_addr()
return CFLIE_INIT_SEARCH; return CFLIE_INIT_SEARCH;
} }
uint16_t initCFlie(void) void CFLIE_init(void)
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
phase = initialize_rx_tx_addr(); phase = CFLIE_initialize_rx_tx_addr();
crtp_log_setup_state = CFLIE_CRTP_LOG_SETUP_STATE_INIT; crtp_log_setup_state = CFLIE_CRTP_LOG_SETUP_STATE_INIT;
packet_count=0; packet_count=0;
int delay = cflie_init(); CFLIE_RF_init();
// debugln("CFlie init!");
return delay;
} }
#endif #endif

View File

@ -119,7 +119,7 @@ static void __attribute__((unused)) CG023_send_packet(uint8_t bind)
NRF24L01_SetPower(); // Set tx_power NRF24L01_SetPower(); // Set tx_power
} }
static void __attribute__((unused)) CG023_init() static void __attribute__((unused)) CG023_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -165,17 +165,16 @@ static void __attribute__((unused)) CG023_initialize_txid()
hopping_frequency_no = rx_tx_addr[0] - 0x7D; // rf channel for data packets hopping_frequency_no = rx_tx_addr[0] - 0x7D; // rf channel for data packets
} }
uint16_t initCG023(void) void CG023_init(void)
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
bind_counter = CG023_BIND_COUNT; bind_counter = CG023_BIND_COUNT;
CG023_initialize_txid(); CG023_initialize_txid();
CG023_init(); CG023_RF_init();
if(sub_protocol==CG023) if(sub_protocol==CG023)
packet_period=CG023_PACKET_PERIOD; packet_period=CG023_PACKET_PERIOD;
else // YD829 else // YD829
packet_period=YD829_PACKET_PERIOD; packet_period=YD829_PACKET_PERIOD;
return CG023_INITIAL_WAIT+YD829_PACKET_PERIOD;
} }
#endif #endif

View File

@ -169,7 +169,7 @@ static void __attribute__((unused)) CX10_Write_Packet(uint8_t bind)
NRF24L01_SetPower(); NRF24L01_SetPower();
} }
static void __attribute__((unused)) CX10_init() static void __attribute__((unused)) CX10_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -261,9 +261,13 @@ static void __attribute__((unused)) CX10_initialize_txid()
} }
} }
uint16_t initCX10(void) void CX10_init(void)
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
if(protocol == PROTO_Q2X2)
sub_protocol|=0x08; // Increase the number of sub_protocols for CX-10
if(sub_protocol==CX10_BLUE) if(sub_protocol==CX10_BLUE)
{ {
packet_length = CX10A_PACKET_SIZE; packet_length = CX10A_PACKET_SIZE;
@ -286,8 +290,7 @@ uint16_t initCX10(void)
bind_counter = CX10_BIND_COUNT; bind_counter = CX10_BIND_COUNT;
} }
CX10_initialize_txid(); CX10_initialize_txid();
CX10_init(); CX10_RF_init();
return CX10_INITIAL_WAIT+packet_period;
} }
#endif #endif

View File

@ -71,7 +71,7 @@ static void __attribute__((unused)) CORONA_rf_init()
} }
// Generate id and hopping freq // Generate id and hopping freq
static void __attribute__((unused)) CORONA_init() static void __attribute__((unused)) CORONA_TXID_init()
{ {
#ifdef CORONA_FORCE_ID #ifdef CORONA_FORCE_ID
// Example of ID and channels taken from dumps // Example of ID and channels taken from dumps
@ -255,7 +255,7 @@ static uint16_t __attribute__((unused)) CORONA_build_packet()
return packet_period; return packet_period;
} }
uint16_t ReadCORONA() uint16_t CORONA_callback()
{ {
#ifdef MULTI_SYNC #ifdef MULTI_SYNC
telemetry_set_input_sync(22000); telemetry_set_input_sync(22000);
@ -276,7 +276,7 @@ uint16_t ReadCORONA()
return packet_period; return packet_period;
} }
uint16_t initCORONA() void CORONA_init()
{ {
switch(sub_protocol) switch(sub_protocol)
{ {
@ -293,9 +293,8 @@ uint16_t initCORONA()
state=400; // Used by V2 to send RF channels + ID for 2.65s at startup state=400; // Used by V2 to send RF channels + ID for 2.65s at startup
hopping_frequency_no=0; hopping_frequency_no=0;
fdv3_id_send = 0; fdv3_id_send = 0;
CORONA_init(); CORONA_TXID_init();
CORONA_rf_init(); CORONA_rf_init();
return 10000;
} }
#endif #endif

View File

@ -95,7 +95,7 @@ static void __attribute__((unused)) DM002_send_packet(uint8_t bind)
NRF24L01_SetPower(); // Set tx_power NRF24L01_SetPower(); // Set tx_power
} }
static void __attribute__((unused)) DM002_init() static void __attribute__((unused)) DM002_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -155,13 +155,12 @@ static void __attribute__((unused)) DM002_initialize_txid()
} }
} }
uint16_t initDM002(void) void DM002_init(void)
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
bind_counter = DM002_BIND_COUNT; bind_counter = DM002_BIND_COUNT;
DM002_initialize_txid(); DM002_initialize_txid();
DM002_init(); DM002_RF_init();
return DM002_INITIAL_WAIT;
} }
#endif #endif

View File

@ -228,7 +228,7 @@ static uint8_t __attribute__((unused)) DSM_Check_RX_packet()
return result; return result;
} }
uint16_t ReadDsm() uint16_t DSM_callback()
{ {
#define DSM_CH1_CH2_DELAY 4010 // Time between write of channel 1 and channel 2 #define DSM_CH1_CH2_DELAY 4010 // Time between write of channel 1 and channel 2
#ifdef STM32_BOARD #ifdef STM32_BOARD
@ -449,7 +449,7 @@ uint16_t ReadDsm()
return 0; return 0;
} }
uint16_t initDsm() void DSM_init()
{ {
CYRF_GetMfgData(cyrfmfg_id); CYRF_GetMfgData(cyrfmfg_id);
//Model match //Model match
@ -496,7 +496,6 @@ uint16_t initDsm()
} }
else else
phase = DSM_CHANSEL;// phase = DSM_CHANSEL;//
return 10000;
} }
#endif #endif

View File

@ -294,7 +294,7 @@ static void __attribute__((unused)) DEVO_BuildPacket()
packet_count = 0; packet_count = 0;
} }
uint16_t devo_callback() uint16_t DEVO_callback()
{ {
static uint8_t txState=0; static uint8_t txState=0;
@ -404,8 +404,23 @@ uint16_t devo_callback()
#endif #endif
} }
uint16_t DevoInit() void DEVO_init()
{ {
#ifdef ENABLE_PPM
if(mode_select) //PPM mode
{
if(IS_BIND_BUTTON_FLAG_on)
{
eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num),0x00); // reset to autobind mode for the current model
option=0;
}
else
{
option=eeprom_read_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num)); // load previous mode: autobind or fixed id
if(option!=1) option=0; // if not fixed id mode then it should be autobind
}
}
#endif //ENABLE_PPM
switch(sub_protocol) switch(sub_protocol)
{ {
case 1: case 1:
@ -453,7 +468,6 @@ uint16_t DevoInit()
bind_counter = 0; bind_counter = 0;
DEVO_cyrf_set_bound_sop_code(); DEVO_cyrf_set_bound_sop_code();
} }
return 2400;
} }
#endif #endif

View File

@ -51,7 +51,7 @@ static void __attribute__((unused)) E010R5_build_data_packet()
RF2500_BuildPayload(packet); RF2500_BuildPayload(packet);
} }
uint16_t ReadE010R5() uint16_t E010R5_callback()
{ {
//Bind //Bind
if(bind_counter) if(bind_counter)
@ -90,7 +90,7 @@ uint16_t ReadE010R5()
return 0; return 0;
} }
uint16_t initE010R5() void E010R5_init()
{ {
BIND_IN_PROGRESS; // Autobind protocol BIND_IN_PROGRESS; // Autobind protocol
bind_counter = 2600; bind_counter = 2600;
@ -134,8 +134,6 @@ uint16_t initE010R5()
RF2500_RFChannel(hopping_frequency[0]); RF2500_RFChannel(hopping_frequency[0]);
hopping_frequency_no=0; hopping_frequency_no=0;
packet_count=0; packet_count=0;
return 3400;
} }
#endif #endif

View File

@ -124,7 +124,7 @@ uint16_t E016HV2_callback()
return E016HV2_PACKET_PERIOD; return E016HV2_PACKET_PERIOD;
} }
uint16_t initE016HV2() void E016HV2_init()
{ {
//Config CC2500 //Config CC2500
CC2500_250K_Init(); CC2500_250K_Init();
@ -152,7 +152,6 @@ uint16_t initE016HV2()
flags=0; flags=0;
bind_counter = E016HV2_BIND_COUNT; bind_counter = E016HV2_BIND_COUNT;
BIND_IN_PROGRESS; // Autobind protocol BIND_IN_PROGRESS; // Autobind protocol
return E016HV2_INITIAL_WAIT;
} }
#endif #endif

View File

@ -244,7 +244,7 @@ static void __attribute__((unused)) E01X_send_packet(uint8_t bind)
NRF24L01_SetPower(); NRF24L01_SetPower();
} }
static void __attribute__((unused)) E01X_init() static void __attribute__((unused)) E01X_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -322,7 +322,7 @@ static void __attribute__((unused)) E016H_initialize_txid()
} }
} }
uint16_t initE01X() void E01X_init()
{ {
BIND_IN_PROGRESS; BIND_IN_PROGRESS;
if(sub_protocol==E012) if(sub_protocol==E012)
@ -343,10 +343,9 @@ uint16_t initE01X()
E016H_initialize_txid(); E016H_initialize_txid();
packet_period=E016H_PACKET_PERIOD; packet_period=E016H_PACKET_PERIOD;
} }
E01X_init(); E01X_RF_init();
bind_counter = E01X_BIND_COUNT; bind_counter = E01X_BIND_COUNT;
hopping_frequency_no = 0; hopping_frequency_no = 0;
return E01X_INITIAL_WAIT;
} }
#endif #endif

View File

@ -74,7 +74,7 @@ static void __attribute__((unused)) E129_build_data_packet()
RF2500_BuildPayload(packet); RF2500_BuildPayload(packet);
} }
uint16_t ReadE129() uint16_t E129_callback()
{ {
//Set RF channel //Set RF channel
if(phase==0) if(phase==0)
@ -115,7 +115,7 @@ uint16_t ReadE129()
return 5200-1260; return 5200-1260;
} }
uint16_t initE129() void E129_init()
{ {
BIND_IN_PROGRESS; // Autobind protocol BIND_IN_PROGRESS; // Autobind protocol
bind_counter = 384; // ~2sec bind_counter = 384; // ~2sec
@ -146,7 +146,6 @@ uint16_t initE129()
hopping_frequency_no=0; hopping_frequency_no=0;
packet_count=0; packet_count=0;
phase=0; phase=0;
return 1260;
} }
#endif #endif

View File

@ -23,7 +23,7 @@
#define ESKY150_BINDING_PACKET_PERIOD 2000 #define ESKY150_BINDING_PACKET_PERIOD 2000
#define ESKY150_SENDING_PACKET_PERIOD 4800 #define ESKY150_SENDING_PACKET_PERIOD 4800
static void __attribute__((unused)) ESKY150_init() static void __attribute__((unused)) ESKY150_RF_init()
{ {
//Original TX always sets for channelx 0x22 and 0x4a //Original TX always sets for channelx 0x22 and 0x4a
// Use channels 2..79 // Use channels 2..79
@ -171,16 +171,15 @@ uint16_t ESKY150_callback()
return ESKY150_SENDING_PACKET_PERIOD; return ESKY150_SENDING_PACKET_PERIOD;
} }
uint16_t initESKY150(void) void ESKY150_init(void)
{ {
ESKY150_init(); ESKY150_RF_init();
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
{ {
bind_counter=3000; bind_counter=3000;
ESKY150_bind_init(); ESKY150_bind_init();
} }
hopping_frequency_no=0; hopping_frequency_no=0;
return 10000;
} }
#endif #endif

View File

@ -104,7 +104,7 @@ uint16_t ESKY150V2_callback()
return ESKY150V2_PACKET_PERIOD; return ESKY150V2_PACKET_PERIOD;
} }
uint16_t initESKY150V2() void ESKY150V2_init()
{ {
CC2500_250K_Init(); CC2500_250K_Init();
ESKY150V2_set_freq(); ESKY150V2_set_freq();
@ -133,7 +133,6 @@ uint16_t initESKY150V2()
} }
else else
CC2500_250K_NRF_SetTXAddr(rx_tx_addr, ESKY150V2_TXID_SIZE); CC2500_250K_NRF_SetTXAddr(rx_tx_addr, ESKY150V2_TXID_SIZE);
return 50000;
} }
#endif #endif

View File

@ -35,7 +35,7 @@ static void __attribute__((unused)) ESKY_set_data_address()
NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, 4); NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, 4);
} }
static void __attribute__((unused)) ESKY_init() static void __attribute__((unused)) ESKY_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
@ -65,7 +65,7 @@ static void __attribute__((unused)) ESKY_init()
NRF24L01_WriteReg(NRF24L01_17_FIFO_STATUS, 0x00); // Just in case, no real bits to write here NRF24L01_WriteReg(NRF24L01_17_FIFO_STATUS, 0x00); // Just in case, no real bits to write here
} }
static void __attribute__((unused)) ESKY_init2() static void __attribute__((unused)) ESKY_TXID_init()
{ {
NRF24L01_FlushTx(); NRF24L01_FlushTx();
if(sub_protocol==ESKY_STD) if(sub_protocol==ESKY_STD)
@ -187,7 +187,7 @@ uint16_t ESKY_callback()
return ESKY_STD_PACKET_PERIOD; return ESKY_STD_PACKET_PERIOD;
} }
uint16_t initESKY(void) void ESKY_init(void)
{ {
bind_counter = ESKY_BIND_COUNT; bind_counter = ESKY_BIND_COUNT;
rx_tx_addr[2] = rx_tx_addr[3]; // Model match rx_tx_addr[2] = rx_tx_addr[3]; // Model match
@ -200,10 +200,9 @@ uint16_t initESKY(void)
} }
#endif #endif
rx_tx_addr[3] = 0xBB; rx_tx_addr[3] = 0xBB;
ESKY_init(); ESKY_RF_init();
ESKY_init2(); ESKY_TXID_init();
packet_count=0; packet_count=0;
return 50000;
} }
#endif #endif

View File

@ -150,7 +150,7 @@ static void __attribute__((unused)) FQ777_send_packet(uint8_t bind)
NRF24L01_WritePayload(packet, packet_len); NRF24L01_WritePayload(packet, packet_len);
} }
static void __attribute__((unused)) FQ777_init() static void __attribute__((unused)) FQ777_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -191,7 +191,7 @@ uint16_t FQ777_callback()
return FQ777_PACKET_PERIOD; return FQ777_PACKET_PERIOD;
} }
uint16_t initFQ777(void) void FQ777_init(void)
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
bind_counter = FQ777_BIND_COUNT; bind_counter = FQ777_BIND_COUNT;
@ -204,8 +204,7 @@ uint16_t initFQ777(void)
rx_tx_addr[2] = 0x00; rx_tx_addr[2] = 0x00;
rx_tx_addr[3] = 0xe7; rx_tx_addr[3] = 0xe7;
rx_tx_addr[4] = 0x67; rx_tx_addr[4] = 0x67;
FQ777_init(); FQ777_RF_init();
return FQ777_INITIAL_WAIT;
} }
#endif #endif

View File

@ -58,7 +58,7 @@ static void __attribute__((unused)) FX816_send_packet()
NRF24L01_SetPower(); // Set tx_power NRF24L01_SetPower(); // Set tx_power
} }
static void __attribute__((unused)) FX816_init() static void __attribute__((unused)) FX816_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -100,14 +100,13 @@ uint16_t FX816_callback()
return FX816_PACKET_PERIOD; return FX816_PACKET_PERIOD;
} }
uint16_t initFX816() void FX816_init()
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
FX816_initialize_txid(); FX816_initialize_txid();
FX816_init(); FX816_RF_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
bind_counter=FX816_BIND_COUNT; bind_counter=FX816_BIND_COUNT;
return FX816_INITIAL_WAIT;
} }
#endif #endif

View File

@ -88,7 +88,7 @@ static void __attribute__((unused)) FY326_send_packet(uint8_t bind)
NRF24L01_SetPower(); // Set tx_power NRF24L01_SetPower(); // Set tx_power
} }
static void __attribute__((unused)) FY326_init() static void __attribute__((unused)) FY326_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -209,20 +209,19 @@ static void __attribute__((unused)) FY326_initialize_txid()
hopping_frequency[i]=rx_tx_addr[0] & ~0x80; hopping_frequency[i]=rx_tx_addr[0] & ~0x80;
} }
uint16_t initFY326(void) void FY326_init(void)
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
rxid = 0xAA; rxid = 0xAA;
bind_counter = FY326_BIND_COUNT; bind_counter = FY326_BIND_COUNT;
FY326_initialize_txid(); FY326_initialize_txid();
FY326_init(); FY326_RF_init();
if(sub_protocol==FY319) if(sub_protocol==FY319)
{ {
phase=FY319_BIND1; phase=FY319_BIND1;
} }
else else
phase=FY326_BIND1; phase=FY326_BIND1;
return FY326_INITIAL_WAIT;
} }
#endif #endif

View File

@ -12,7 +12,7 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>. along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
*/ */
// Last sync with hexfet new_protocols/flysky_a7105.c dated 2015-09-28 // Last sync with hexfet new_protocols/FLYSKY_a7105.c dated 2015-09-28
#if defined(FLYSKY_A7105_INO) #if defined(FLYSKY_A7105_INO)
@ -53,7 +53,7 @@ enum {
const uint8_t PROGMEM V912_X17_SEQ[10] = { 0x14, 0x31, 0x40, 0x49, 0x49, // sometime first byte is 0x15 ? const uint8_t PROGMEM V912_X17_SEQ[10] = { 0x14, 0x31, 0x40, 0x49, 0x49, // sometime first byte is 0x15 ?
0x49, 0x49, 0x49, 0x49, 0x49, }; 0x49, 0x49, 0x49, 0x49, 0x49, };
static void __attribute__((unused)) flysky_apply_extension_flags() static void __attribute__((unused)) FLYSKY_apply_extension_flags()
{ {
switch(sub_protocol) switch(sub_protocol)
{ {
@ -129,7 +129,7 @@ static void __attribute__((unused)) flysky_apply_extension_flags()
} }
} }
static void __attribute__((unused)) flysky_build_packet(uint8_t init) static void __attribute__((unused)) FLYSKY_build_packet(uint8_t init)
{ {
uint8_t i; uint8_t i;
//servodata timing range for flysky. //servodata timing range for flysky.
@ -150,17 +150,17 @@ static void __attribute__((unused)) flysky_build_packet(uint8_t init)
packet[5 + i*2]=temp&0xFF; //low byte of servo timing(1000-2000us) packet[5 + i*2]=temp&0xFF; //low byte of servo timing(1000-2000us)
packet[6 + i*2]=(temp>>8)&0xFF; //high byte of servo timing(1000-2000us) packet[6 + i*2]=(temp>>8)&0xFF; //high byte of servo timing(1000-2000us)
} }
flysky_apply_extension_flags(); FLYSKY_apply_extension_flags();
} }
uint16_t ReadFlySky() uint16_t FLYSKY_callback()
{ {
#ifndef FORCE_FLYSKY_TUNING #ifndef FORCE_FLYSKY_TUNING
A7105_AdjustLOBaseFreq(1); A7105_AdjustLOBaseFreq(1);
#endif #endif
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
{ {
flysky_build_packet(1); FLYSKY_build_packet(1);
A7105_WriteData(21, 1); A7105_WriteData(21, 1);
bind_counter--; bind_counter--;
if (bind_counter==0) if (bind_counter==0)
@ -171,7 +171,7 @@ uint16_t ReadFlySky()
#ifdef MULTI_SYNC #ifdef MULTI_SYNC
telemetry_set_input_sync(packet_period); telemetry_set_input_sync(packet_period);
#endif #endif
flysky_build_packet(0); FLYSKY_build_packet(0);
A7105_WriteData(21, hopping_frequency[hopping_frequency_no & 0x0F]); A7105_WriteData(21, hopping_frequency[hopping_frequency_no & 0x0F]);
A7105_SetPower(); A7105_SetPower();
} }
@ -179,7 +179,7 @@ uint16_t ReadFlySky()
return packet_period; return packet_period;
} }
const uint8_t PROGMEM tx_channels[8][4] = { const uint8_t PROGMEM FLYSKY_tx_channels[8][4] = {
{ 0x12, 0x34, 0x56, 0x78}, { 0x12, 0x34, 0x56, 0x78},
{ 0x18, 0x27, 0x36, 0x45}, { 0x18, 0x27, 0x36, 0x45},
{ 0x41, 0x82, 0x36, 0x57}, { 0x41, 0x82, 0x36, 0x57},
@ -190,7 +190,7 @@ const uint8_t PROGMEM tx_channels[8][4] = {
{ 0x71, 0x86, 0x43, 0x52} { 0x71, 0x86, 0x43, 0x52}
}; };
uint16_t initFlySky() void FLYSKY_init()
{ {
uint8_t chanrow; uint8_t chanrow;
uint8_t chanoffset; uint8_t chanoffset;
@ -208,7 +208,7 @@ uint16_t initFlySky()
chanoffset=rx_tx_addr[3]/16; chanoffset=rx_tx_addr[3]/16;
for(uint8_t i=0;i<16;i++) for(uint8_t i=0;i<16;i++)
{ {
temp=pgm_read_byte_near(&tx_channels[chanrow>>1][i>>2]); temp=pgm_read_byte_near(&FLYSKY_tx_channels[chanrow>>1][i>>2]);
if(i&0x02) if(i&0x02)
temp&=0x0F; temp&=0x0F;
else else
@ -242,6 +242,5 @@ uint16_t initFlySky()
bind_counter = FLYSKY_BIND_COUNT; bind_counter = FLYSKY_BIND_COUNT;
else else
bind_counter = 0; bind_counter = 0;
return 2400;
} }
#endif #endif

View File

@ -508,7 +508,7 @@ static void __attribute__((unused)) FrSkyX_set_start(uint8_t ch )
CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[ch]); CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[ch]);
} }
static void __attribute__((unused)) FrSkyX_init() static void __attribute__((unused)) FrSkyX_RF_init()
{ {
if(protocol==PROTO_FRSKYL) if(protocol==PROTO_FRSKYL)
FRSKY_init_cc2500(FRSKYL_cc2500_conf); FRSKY_init_cc2500(FRSKYL_cc2500_conf);

View File

@ -17,12 +17,12 @@
#include "iface_cc2500.h" #include "iface_cc2500.h"
static void __attribute__((unused)) frsky2way_init(uint8_t bind) static void __attribute__((unused)) FRSKYD_RF_init()
{ {
FRSKY_init_cc2500(FRSKYD_cc2500_conf); FRSKY_init_cc2500(FRSKYD_cc2500_conf);
CC2500_WriteReg(CC2500_1B_AGCCTRL2, bind ? 0x43 : 0x03); CC2500_WriteReg(CC2500_1B_AGCCTRL2, IS_BIND_IN_PROGRESS ? 0x43 : 0x03);
CC2500_WriteReg(CC2500_09_ADDR, bind ? 0x03 : rx_tx_addr[3]); CC2500_WriteReg(CC2500_09_ADDR, IS_BIND_IN_PROGRESS ? 0x03 : rx_tx_addr[3]);
CC2500_WriteReg(CC2500_07_PKTCTRL1, 0x05); CC2500_WriteReg(CC2500_07_PKTCTRL1, 0x05);
CC2500_Strobe(CC2500_SIDLE); // Go to idle... CC2500_Strobe(CC2500_SIDLE); // Go to idle...
// //
@ -32,7 +32,7 @@ static void __attribute__((unused)) frsky2way_init(uint8_t bind)
//#######END INIT######## //#######END INIT########
} }
static void __attribute__((unused)) frsky2way_build_bind_packet() static void __attribute__((unused)) FRSKYD_build_bind_packet()
{ {
//11 03 01 d7 2d 00 00 1e 3c 5b 78 00 00 00 00 00 00 01 //11 03 01 d7 2d 00 00 1e 3c 5b 78 00 00 00 00 00 00 01
//11 03 01 19 3e 00 02 8e 2f bb 5c 00 00 00 00 00 00 01 //11 03 01 19 3e 00 02 8e 2f bb 5c 00 00 00 00 00 00 01
@ -57,7 +57,7 @@ static void __attribute__((unused)) frsky2way_build_bind_packet()
packet[17] = rx_tx_addr[1]; packet[17] = rx_tx_addr[1];
} }
static void __attribute__((unused)) frsky2way_data_frame() static void __attribute__((unused)) FRSKYD_data_frame()
{//pachet[4] is telemetry user frame counter(hub) {//pachet[4] is telemetry user frame counter(hub)
//11 d7 2d 22 00 01 c9 c9 ca ca 88 88 ca ca c9 ca 88 88 //11 d7 2d 22 00 01 c9 c9 ca ca 88 88 ca ca c9 ca 88 88
//11 57 12 00 00 01 f2 f2 f2 f2 06 06 ca ca ca ca 18 18 //11 57 12 00 00 01 f2 f2 f2 f2 06 06 ca ca ca ca 18 18
@ -94,7 +94,7 @@ static void __attribute__((unused)) frsky2way_data_frame()
} }
} }
uint16_t initFrSky_2way() void FRSKYD_init(void)
{ {
//FrskyD init hop //FrskyD init hop
if (sub_protocol==DCLONE) if (sub_protocol==DCLONE)
@ -116,21 +116,20 @@ uint16_t initFrSky_2way()
packet_count=0; packet_count=0;
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
{ {
frsky2way_init(1); FRSKYD_RF_init();
state = FRSKY_BIND; state = FRSKY_BIND;
} }
else else
{ {
state = FRSKY_BIND_DONE; state = FRSKY_BIND_DONE;
} }
return 10000;
} }
uint16_t ReadFrSky_2way() uint16_t FRSKYD_callback(void)
{ {
if (state < FRSKY_BIND_DONE) if (state < FRSKY_BIND_DONE)
{ {
frsky2way_build_bind_packet(); FRSKYD_build_bind_packet();
CC2500_Strobe(CC2500_SIDLE); CC2500_Strobe(CC2500_SIDLE);
CC2500_WriteReg(CC2500_0A_CHANNR, 0x00); CC2500_WriteReg(CC2500_0A_CHANNR, 0x00);
CC2500_WriteReg(CC2500_23_FSCAL3, 0x89); CC2500_WriteReg(CC2500_23_FSCAL3, 0x89);
@ -144,10 +143,10 @@ uint16_t ReadFrSky_2way()
} }
if (state == FRSKY_BIND_DONE) if (state == FRSKY_BIND_DONE)
{ {
state = FRSKY_DATA2;
frsky2way_init(0);
counter = 0;
BIND_DONE; BIND_DONE;
FRSKYD_RF_init();
counter = 0;
state = FRSKY_DATA2;
} }
else else
if (state == FRSKY_DATA5) if (state == FRSKY_DATA5)
@ -206,7 +205,7 @@ uint16_t ReadFrSky_2way()
CC2500_SetFreqOffset(); CC2500_SetFreqOffset();
CC2500_WriteReg(CC2500_23_FSCAL3, 0x89); CC2500_WriteReg(CC2500_23_FSCAL3, 0x89);
CC2500_Strobe(CC2500_SFRX); CC2500_Strobe(CC2500_SFRX);
frsky2way_data_frame(); FRSKYD_data_frame();
CC2500_WriteData(packet, packet[0]+1); CC2500_WriteData(packet, packet[0]+1);
state++; state++;
} }

View File

@ -137,7 +137,7 @@ static void __attribute__((unused)) FrSkyL_encode_packet(bool type)
} }
} }
uint16_t ReadFrSkyL() uint16_t FRSKYL_callback()
{ {
static uint8_t written=0, send=0; static uint8_t written=0, send=0;
switch(send) switch(send)
@ -212,7 +212,7 @@ uint16_t ReadFrSkyL()
return 1; return 1;
} }
uint16_t initFrSkyL() void FRSKYL_init()
{ {
set_rx_tx_addr(MProtocol_id_master); set_rx_tx_addr(MProtocol_id_master);
rx_tx_addr[1]=0x02; // ID related, hw version? rx_tx_addr[1]=0x02; // ID related, hw version?
@ -227,7 +227,7 @@ uint16_t initFrSkyL()
while(!FrSkyX_chanskip) while(!FrSkyX_chanskip)
FrSkyX_chanskip=random(0xfefefefe)%47; FrSkyX_chanskip=random(0xfefefefe)%47;
FrSkyX_init(); FrSkyX_RF_init();
//Prepare frame //Prepare frame
memset(FrSkyL_buffer,0x00,FRSKYL_PACKET_LEN-3); memset(FrSkyL_buffer,0x00,FRSKYL_PACKET_LEN-3);
@ -253,6 +253,5 @@ uint16_t initFrSkyL()
state = FRSKY_DATA1; state = FRSKY_DATA1;
FrSkyX_initialize_data(0); FrSkyX_initialize_data(0);
} }
return 10000;
} }
#endif #endif

View File

@ -157,7 +157,7 @@ static void __attribute__((unused)) FrSkyR9_build_EU_packet()
packet[13] = FrSkyR9_CRC8(packet, 13); packet[13] = FrSkyR9_CRC8(packet, 13);
} }
uint16_t initFrSkyR9() void FRSKYR9_init()
{ {
//Check frequencies //Check frequencies
#ifdef DISP_FREQ_TABLE #ifdef DISP_FREQ_TABLE
@ -213,10 +213,9 @@ uint16_t initFrSkyR9()
hopping_frequency_no=0; hopping_frequency_no=0;
phase=FRSKYR9_FREQ; phase=FRSKYR9_FREQ;
return 20000; // Start calling FrSkyR9_callback in 20 milliseconds
} }
uint16_t FrSkyR9_callback() uint16_t FRSKYR9_callback()
{ {
switch (phase) switch (phase)
{ {

View File

@ -113,7 +113,7 @@ static void __attribute__((unused)) FRSKYV_build_data_packet()
packet[14] = FRSKYV_crc8(crc8, packet, 14); packet[14] = FRSKYV_crc8(crc8, packet, 14);
} }
uint16_t ReadFRSKYV() uint16_t FRSKYV_callback(void)
{ {
if(IS_BIND_DONE) if(IS_BIND_DONE)
{ // Normal operation { // Normal operation
@ -148,7 +148,7 @@ uint16_t ReadFRSKYV()
return 53460; return 53460;
} }
uint16_t initFRSKYV() void FRSKYV_init(void)
{ {
//ID is 15 bits. Using rx_tx_addr[2] and rx_tx_addr[3] since we want to use RX_Num for model match //ID is 15 bits. Using rx_tx_addr[2] and rx_tx_addr[3] since we want to use RX_Num for model match
rx_tx_addr[2]&=0x7F; rx_tx_addr[2]&=0x7F;
@ -158,7 +158,6 @@ uint16_t initFRSKYV()
seed = 1; seed = 1;
binding_idx=0; binding_idx=0;
phase = FRSKYV_DATA1; phase = FRSKYV_DATA1;
return 10000;
} }
#endif #endif

View File

@ -116,7 +116,7 @@ static void __attribute__((unused)) FrSkyX_build_packet()
debugln("");*/ debugln("");*/
} }
uint16_t ReadFrSkyX() uint16_t FRSKYX_callback()
{ {
switch(state) switch(state)
{ {
@ -241,7 +241,7 @@ uint16_t ReadFrSkyX()
return 1; return 1;
} }
uint16_t initFrSkyX() void FRSKYX_init()
{ {
set_rx_tx_addr(MProtocol_id_master); set_rx_tx_addr(MProtocol_id_master);
FrSkyFormat = sub_protocol; FrSkyFormat = sub_protocol;
@ -268,7 +268,7 @@ uint16_t initFrSkyX()
while(!FrSkyX_chanskip) while(!FrSkyX_chanskip)
FrSkyX_chanskip=random(0xfefefefe)%47; FrSkyX_chanskip=random(0xfefefefe)%47;
FrSkyX_init(); FrSkyX_RF_init();
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
{ {
@ -281,6 +281,5 @@ uint16_t initFrSkyX()
FrSkyX_initialize_data(0); FrSkyX_initialize_data(0);
} }
FrSkyX_telem_init(); FrSkyX_telem_init();
return 10000;
} }
#endif #endif

View File

@ -40,7 +40,7 @@ enum {
FRSKY_RX_DATA, FRSKY_RX_DATA,
}; };
const PROGMEM uint8_t frsky_rx_common_reg[][2] = { const PROGMEM uint8_t FRSKY_RX_common_reg[][2] = {
{CC2500_02_IOCFG0, 0x01}, {CC2500_02_IOCFG0, 0x01},
{CC2500_18_MCSM0, 0x18}, {CC2500_18_MCSM0, 0x18},
{CC2500_07_PKTCTRL1, 0x05}, {CC2500_07_PKTCTRL1, 0x05},
@ -68,7 +68,7 @@ const PROGMEM uint8_t frsky_rx_common_reg[][2] = {
{CC2500_09_ADDR, 0x03}, {CC2500_09_ADDR, 0x03},
}; };
const PROGMEM uint8_t frsky_rx_d16fcc_reg[][2] = { const PROGMEM uint8_t FRSKY_RX_d16fcc_reg[][2] = {
{CC2500_17_MCSM1, 0x0C}, {CC2500_17_MCSM1, 0x0C},
{CC2500_0E_FREQ1, 0x76}, {CC2500_0E_FREQ1, 0x76},
{CC2500_0F_FREQ0, 0x27}, {CC2500_0F_FREQ0, 0x27},
@ -81,7 +81,7 @@ const PROGMEM uint8_t frsky_rx_d16fcc_reg[][2] = {
{CC2500_15_DEVIATN, 0x51}, {CC2500_15_DEVIATN, 0x51},
}; };
const PROGMEM uint8_t frsky_rx_d16lbt_reg[][2] = { const PROGMEM uint8_t FRSKY_RX_d16lbt_reg[][2] = {
{CC2500_17_MCSM1, 0x0E}, {CC2500_17_MCSM1, 0x0E},
{CC2500_0E_FREQ1, 0x80}, {CC2500_0E_FREQ1, 0x80},
{CC2500_0F_FREQ0, 0x00}, {CC2500_0F_FREQ0, 0x00},
@ -94,7 +94,7 @@ const PROGMEM uint8_t frsky_rx_d16lbt_reg[][2] = {
{CC2500_15_DEVIATN, 0x53}, {CC2500_15_DEVIATN, 0x53},
}; };
const PROGMEM uint8_t frsky_rx_d8_reg[][2] = { const PROGMEM uint8_t FRSKY_RX_d8_reg[][2] = {
{CC2500_17_MCSM1, 0x0C}, {CC2500_17_MCSM1, 0x0C},
{CC2500_0E_FREQ1, 0x76}, {CC2500_0E_FREQ1, 0x76},
{CC2500_0F_FREQ0, 0x27}, {CC2500_0F_FREQ0, 0x27},
@ -107,32 +107,32 @@ const PROGMEM uint8_t frsky_rx_d8_reg[][2] = {
{CC2500_15_DEVIATN, 0x42}, {CC2500_15_DEVIATN, 0x42},
}; };
static uint8_t frsky_rx_chanskip; static uint8_t FRSKY_RX_chanskip;
static int8_t frsky_rx_finetune; static int8_t FRSKY_RX_finetune;
static uint8_t frsky_rx_format; static uint8_t FRSKY_RX_format;
static void __attribute__((unused)) frsky_rx_strobe_rx() static void __attribute__((unused)) FRSKY_RX_strobe_rx()
{ {
CC2500_Strobe(CC2500_SIDLE); CC2500_Strobe(CC2500_SIDLE);
CC2500_Strobe(CC2500_SFRX); CC2500_Strobe(CC2500_SFRX);
CC2500_Strobe(CC2500_SRX); CC2500_Strobe(CC2500_SRX);
} }
static void __attribute__((unused)) frsky_rx_initialise_cc2500() { static void __attribute__((unused)) FRSKY_RX_initialise_cc2500() {
const uint8_t frsky_rx_length[] = { FRSKY_RX_D8_LENGTH, FRSKY_RX_D16FCC_LENGTH, FRSKY_RX_D16LBT_LENGTH, FRSKY_RX_D16v2_LENGTH, FRSKY_RX_D16v2_LENGTH }; const uint8_t FRSKY_RX_length[] = { FRSKY_RX_D8_LENGTH, FRSKY_RX_D16FCC_LENGTH, FRSKY_RX_D16LBT_LENGTH, FRSKY_RX_D16v2_LENGTH, FRSKY_RX_D16v2_LENGTH };
packet_length = frsky_rx_length[frsky_rx_format]; packet_length = FRSKY_RX_length[FRSKY_RX_format];
CC2500_Reset(); CC2500_Reset();
CC2500_Strobe(CC2500_SIDLE); CC2500_Strobe(CC2500_SIDLE);
for (uint8_t i = 0; i < sizeof(frsky_rx_common_reg) / 2; i++) for (uint8_t i = 0; i < sizeof(FRSKY_RX_common_reg) / 2; i++)
CC2500_WriteReg(pgm_read_byte_near(&frsky_rx_common_reg[i][0]), pgm_read_byte_near(&frsky_rx_common_reg[i][1])); CC2500_WriteReg(pgm_read_byte_near(&FRSKY_RX_common_reg[i][0]), pgm_read_byte_near(&FRSKY_RX_common_reg[i][1]));
switch (frsky_rx_format) switch (FRSKY_RX_format)
{ {
case FRSKY_RX_D16v2FCC: case FRSKY_RX_D16v2FCC:
case FRSKY_RX_D16FCC: case FRSKY_RX_D16FCC:
for (uint8_t i = 0; i < sizeof(frsky_rx_d16fcc_reg) / 2; i++) for (uint8_t i = 0; i < sizeof(FRSKY_RX_d16fcc_reg) / 2; i++)
CC2500_WriteReg(pgm_read_byte_near(&frsky_rx_d16fcc_reg[i][0]), pgm_read_byte_near(&frsky_rx_d16fcc_reg[i][1])); CC2500_WriteReg(pgm_read_byte_near(&FRSKY_RX_d16fcc_reg[i][0]), pgm_read_byte_near(&FRSKY_RX_d16fcc_reg[i][1]));
if(frsky_rx_format==FRSKY_RX_D16v2FCC) if(FRSKY_RX_format==FRSKY_RX_D16v2FCC)
{ {
CC2500_WriteReg(CC2500_08_PKTCTRL0, 0x05); // Enable CRC CC2500_WriteReg(CC2500_08_PKTCTRL0, 0x05); // Enable CRC
CC2500_WriteReg(CC2500_17_MCSM1, 0x0E); // Go/Stay in RX mode CC2500_WriteReg(CC2500_17_MCSM1, 0x0E); // Go/Stay in RX mode
@ -141,36 +141,36 @@ static void __attribute__((unused)) frsky_rx_initialise_cc2500() {
break; break;
case FRSKY_RX_D16v2LBT: case FRSKY_RX_D16v2LBT:
case FRSKY_RX_D16LBT: case FRSKY_RX_D16LBT:
for (uint8_t i = 0; i < sizeof(frsky_rx_d16lbt_reg) / 2; i++) for (uint8_t i = 0; i < sizeof(FRSKY_RX_d16lbt_reg) / 2; i++)
CC2500_WriteReg(pgm_read_byte_near(&frsky_rx_d16lbt_reg[i][0]), pgm_read_byte_near(&frsky_rx_d16lbt_reg[i][1])); CC2500_WriteReg(pgm_read_byte_near(&FRSKY_RX_d16lbt_reg[i][0]), pgm_read_byte_near(&FRSKY_RX_d16lbt_reg[i][1]));
if(frsky_rx_format==FRSKY_RX_D16v2LBT) if(FRSKY_RX_format==FRSKY_RX_D16v2LBT)
CC2500_WriteReg(CC2500_08_PKTCTRL0, 0x05); // Enable CRC CC2500_WriteReg(CC2500_08_PKTCTRL0, 0x05); // Enable CRC
break; break;
case FRSKY_RX_D8: case FRSKY_RX_D8:
for (uint8_t i = 0; i < sizeof(frsky_rx_d8_reg) / 2; i++) for (uint8_t i = 0; i < sizeof(FRSKY_RX_d8_reg) / 2; i++)
CC2500_WriteReg(pgm_read_byte_near(&frsky_rx_d8_reg[i][0]), pgm_read_byte_near(&frsky_rx_d8_reg[i][1])); CC2500_WriteReg(pgm_read_byte_near(&FRSKY_RX_d8_reg[i][0]), pgm_read_byte_near(&FRSKY_RX_d8_reg[i][1]));
CC2500_WriteReg(CC2500_23_FSCAL3, 0x89); CC2500_WriteReg(CC2500_23_FSCAL3, 0x89);
break; break;
} }
CC2500_WriteReg(CC2500_0A_CHANNR, 0); // bind channel CC2500_WriteReg(CC2500_0A_CHANNR, 0); // bind channel
rx_disable_lna = IS_POWER_FLAG_on; rx_disable_lna = IS_POWER_FLAG_on;
CC2500_SetTxRxMode(rx_disable_lna ? TXRX_OFF : RX_EN); // lna disable / enable CC2500_SetTxRxMode(rx_disable_lna ? TXRX_OFF : RX_EN); // lna disable / enable
frsky_rx_strobe_rx(); FRSKY_RX_strobe_rx();
delayMicroseconds(1000); // wait for RX to activate delayMicroseconds(1000); // wait for RX to activate
} }
static void __attribute__((unused)) frsky_rx_set_channel(uint8_t channel) static void __attribute__((unused)) FRSKY_RX_set_channel(uint8_t channel)
{ {
CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[channel]); CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[channel]);
if(frsky_rx_format == FRSKY_RX_D8) if(FRSKY_RX_format == FRSKY_RX_D8)
CC2500_WriteReg(CC2500_23_FSCAL3, 0x89); CC2500_WriteReg(CC2500_23_FSCAL3, 0x89);
CC2500_WriteReg(CC2500_25_FSCAL1, calData[channel]); CC2500_WriteReg(CC2500_25_FSCAL1, calData[channel]);
frsky_rx_strobe_rx(); FRSKY_RX_strobe_rx();
} }
static void __attribute__((unused)) frsky_rx_calibrate() static void __attribute__((unused)) FRSKY_RX_calibrate()
{ {
frsky_rx_strobe_rx(); FRSKY_RX_strobe_rx();
for (unsigned c = 0; c < 47; c++) for (unsigned c = 0; c < 47; c++)
{ {
CC2500_Strobe(CC2500_SIDLE); CC2500_Strobe(CC2500_SIDLE);
@ -193,7 +193,7 @@ static uint8_t __attribute__((unused)) frskyx_rx_check_crc_id(bool bind,bool ini
uint8_t offset=bind?3:1; uint8_t offset=bind?3:1;
// Check D8 checksum // Check D8 checksum
if (frsky_rx_format == FRSKY_RX_D8) if (FRSKY_RX_format == FRSKY_RX_D8)
{ {
if((packet[packet_length+1] & 0x80) != 0x80) // Check CRC_OK flag in status byte 2 if((packet[packet_length+1] & 0x80) != 0x80) // Check CRC_OK flag in status byte 2
return false; // Bad CRC return false; // Bad CRC
@ -210,7 +210,7 @@ static uint8_t __attribute__((unused)) frskyx_rx_check_crc_id(bool bind,bool ini
} }
// Check D16v2 checksum // Check D16v2 checksum
if (frsky_rx_format == FRSKY_RX_D16v2LBT || frsky_rx_format == FRSKY_RX_D16v2FCC) if (FRSKY_RX_format == FRSKY_RX_D16v2LBT || FRSKY_RX_format == FRSKY_RX_D16v2FCC)
if((packet[packet_length+1] & 0x80) != 0x80) // Check CRC_OK flag in status byte 2 if((packet[packet_length+1] & 0x80) != 0x80) // Check CRC_OK flag in status byte 2
return false; return false;
//debugln("HW Checksum ok"); //debugln("HW Checksum ok");
@ -222,12 +222,12 @@ static uint8_t __attribute__((unused)) frskyx_rx_check_crc_id(bool bind,bool ini
return false; // Bad CRC return false; // Bad CRC
//debugln("Checksum ok"); //debugln("Checksum ok");
if (bind && (frsky_rx_format == FRSKY_RX_D16v2LBT || frsky_rx_format == FRSKY_RX_D16v2FCC)) if (bind && (FRSKY_RX_format == FRSKY_RX_D16v2LBT || FRSKY_RX_format == FRSKY_RX_D16v2FCC))
for(uint8_t i=3; i<packet_length-2; i++) //unXOR bind packet for(uint8_t i=3; i<packet_length-2; i++) //unXOR bind packet
packet[i] ^= 0xA7; packet[i] ^= 0xA7;
uint8_t offset2=0; uint8_t offset2=0;
if (bind && (frsky_rx_format == FRSKY_RX_D16LBT || frsky_rx_format == FRSKY_RX_D16FCC)) if (bind && (FRSKY_RX_format == FRSKY_RX_D16LBT || FRSKY_RX_format == FRSKY_RX_D16FCC))
offset2=6; offset2=6;
if(init) if(init)
{//Save TXID {//Save TXID
@ -248,7 +248,7 @@ static uint8_t __attribute__((unused)) frskyx_rx_check_crc_id(bool bind,bool ini
return true; // Full match return true; // Full match
} }
static void __attribute__((unused)) frsky_rx_build_telemetry_packet() static void __attribute__((unused)) FRSKY_RX_build_telemetry_packet()
{ {
uint16_t raw_channel[8]; uint16_t raw_channel[8];
uint32_t bits = 0; uint32_t bits = 0;
@ -256,7 +256,7 @@ static void __attribute__((unused)) frsky_rx_build_telemetry_packet()
uint8_t idx = 0; uint8_t idx = 0;
uint8_t i; uint8_t i;
if (frsky_rx_format == FRSKY_RX_D8) if (FRSKY_RX_format == FRSKY_RX_D8)
{// decode D8 channels {// decode D8 channels
raw_channel[0] = ((packet[10] & 0x0F) << 8 | packet[6]); raw_channel[0] = ((packet[10] & 0x0F) << 8 | packet[6]);
raw_channel[1] = ((packet[10] & 0xF0) << 4 | packet[7]); raw_channel[1] = ((packet[10] & 0xF0) << 4 | packet[7]);
@ -299,7 +299,7 @@ static void __attribute__((unused)) frsky_rx_build_telemetry_packet()
packet_in[idx++] = RX_LQI; packet_in[idx++] = RX_LQI;
packet_in[idx++] = RX_RSSI; packet_in[idx++] = RX_RSSI;
packet_in[idx++] = 0; // start channel packet_in[idx++] = 0; // start channel
packet_in[idx++] = frsky_rx_format == FRSKY_RX_D8 ? 8 : 16; // number of channels in packet packet_in[idx++] = FRSKY_RX_format == FRSKY_RX_D8 ? 8 : 16; // number of channels in packet
// pack channels // pack channels
for (i = 0; i < packet_in[3]; i++) { for (i = 0; i < packet_in[3]; i++) {
@ -313,29 +313,29 @@ static void __attribute__((unused)) frsky_rx_build_telemetry_packet()
} }
} }
static void __attribute__((unused)) frsky_rx_data() static void __attribute__((unused)) FRSKY_RX_data()
{ {
uint16_t temp = FRSKY_RX_EEPROM_OFFSET; uint16_t temp = FRSKY_RX_EEPROM_OFFSET;
frsky_rx_format = eeprom_read_byte((EE_ADDR)temp++) % FRSKY_RX_FORMATS; FRSKY_RX_format = eeprom_read_byte((EE_ADDR)temp++) % FRSKY_RX_FORMATS;
rx_tx_addr[3] = eeprom_read_byte((EE_ADDR)temp++); rx_tx_addr[3] = eeprom_read_byte((EE_ADDR)temp++);
rx_tx_addr[2] = eeprom_read_byte((EE_ADDR)temp++); rx_tx_addr[2] = eeprom_read_byte((EE_ADDR)temp++);
rx_tx_addr[1] = eeprom_read_byte((EE_ADDR)temp++); rx_tx_addr[1] = eeprom_read_byte((EE_ADDR)temp++);
rx_tx_addr[0] = RX_num; rx_tx_addr[0] = RX_num;
frsky_rx_finetune = eeprom_read_byte((EE_ADDR)temp++); FRSKY_RX_finetune = eeprom_read_byte((EE_ADDR)temp++);
debug("format=%d, ", frsky_rx_format); debug("format=%d, ", FRSKY_RX_format);
debug("addr[3]=%02X, ", rx_tx_addr[3]); debug("addr[3]=%02X, ", rx_tx_addr[3]);
debug("addr[2]=%02X, ", rx_tx_addr[2]); debug("addr[2]=%02X, ", rx_tx_addr[2]);
debug("addr[1]=%02X, ", rx_tx_addr[1]); debug("addr[1]=%02X, ", rx_tx_addr[1]);
debug("rx_num=%02X, ", rx_tx_addr[0]); debug("rx_num=%02X, ", rx_tx_addr[0]);
debugln("tune=%d", (int8_t)frsky_rx_finetune); debugln("tune=%d", (int8_t)FRSKY_RX_finetune);
if(frsky_rx_format != FRSKY_RX_D16v2LBT && frsky_rx_format != FRSKY_RX_D16v2FCC) if(FRSKY_RX_format != FRSKY_RX_D16v2LBT && FRSKY_RX_format != FRSKY_RX_D16v2FCC)
{//D8 & D16v1 {//D8 & D16v1
for (uint8_t ch = 0; ch < 47; ch++) for (uint8_t ch = 0; ch < 47; ch++)
hopping_frequency[ch] = eeprom_read_byte((EE_ADDR)temp++); hopping_frequency[ch] = eeprom_read_byte((EE_ADDR)temp++);
} }
else else
{ {
FrSkyFormat=frsky_rx_format == FRSKY_RX_D16v2FCC?0:2; FrSkyFormat=FRSKY_RX_format == FRSKY_RX_D16v2FCC?0:2;
FrSkyX2_init_hop(); FrSkyX2_init_hop();
} }
debug("ch:"); debug("ch:");
@ -343,20 +343,20 @@ static void __attribute__((unused)) frsky_rx_data()
debug(" %02X", hopping_frequency[ch]); debug(" %02X", hopping_frequency[ch]);
debugln(""); debugln("");
frsky_rx_initialise_cc2500(); FRSKY_RX_initialise_cc2500();
frsky_rx_calibrate(); FRSKY_RX_calibrate();
CC2500_WriteReg(CC2500_18_MCSM0, 0x08); // FS_AUTOCAL = manual CC2500_WriteReg(CC2500_18_MCSM0, 0x08); // FS_AUTOCAL = manual
CC2500_WriteReg(CC2500_09_ADDR, rx_tx_addr[3]); // set address CC2500_WriteReg(CC2500_09_ADDR, rx_tx_addr[3]); // set address
CC2500_WriteReg(CC2500_07_PKTCTRL1, 0x05); // check address CC2500_WriteReg(CC2500_07_PKTCTRL1, 0x05); // check address
if (option == 0) if (option == 0)
CC2500_WriteReg(CC2500_0C_FSCTRL0, frsky_rx_finetune); CC2500_WriteReg(CC2500_0C_FSCTRL0, FRSKY_RX_finetune);
else else
CC2500_WriteReg(CC2500_0C_FSCTRL0, option); CC2500_WriteReg(CC2500_0C_FSCTRL0, option);
frsky_rx_set_channel(hopping_frequency_no); FRSKY_RX_set_channel(hopping_frequency_no);
phase = FRSKY_RX_DATA; phase = FRSKY_RX_DATA;
} }
uint16_t initFrSky_Rx() void FRSKY_RX_init()
{ {
if(sub_protocol == FRSKY_ERASE) if(sub_protocol == FRSKY_ERASE)
{ {
@ -371,26 +371,25 @@ uint16_t initFrSky_Rx()
} }
else else
{ {
frsky_rx_chanskip = 1; FRSKY_RX_chanskip = 1;
hopping_frequency_no = 0; hopping_frequency_no = 0;
rx_data_started = false; rx_data_started = false;
frsky_rx_finetune = 0; FRSKY_RX_finetune = 0;
telemetry_link = 0; telemetry_link = 0;
packet_count = 0; packet_count = 0;
if (IS_BIND_IN_PROGRESS) if (IS_BIND_IN_PROGRESS)
{ {
frsky_rx_format = FRSKY_RX_D8; FRSKY_RX_format = FRSKY_RX_D8;
frsky_rx_initialise_cc2500(); FRSKY_RX_initialise_cc2500();
phase = FRSKY_RX_TUNE_START; phase = FRSKY_RX_TUNE_START;
debugln("FRSKY_RX_TUNE_START"); debugln("FRSKY_RX_TUNE_START");
} }
else else
frsky_rx_data(); FRSKY_RX_data();
} }
return 1000;
} }
uint16_t FrSky_Rx_callback() uint16_t FRSKY_RX_callback()
{ {
static int8_t read_retry = 0; static int8_t read_retry = 0;
static int8_t tune_low, tune_high; static int8_t tune_low, tune_high;
@ -405,12 +404,13 @@ uint16_t FrSky_Rx_callback()
return 10000; // Nothing to do... return 10000; // Nothing to do...
} }
if(IS_BIND_DONE && phase != FRSKY_RX_DATA) return initFrSky_Rx(); // Abort bind if(IS_BIND_DONE && phase != FRSKY_RX_DATA)
FRSKY_RX_init(); // Abort bind
if ((prev_option != option) && (phase >= FRSKY_RX_DATA)) if ((prev_option != option) && (phase >= FRSKY_RX_DATA))
{ {
if (option == 0) if (option == 0)
CC2500_WriteReg(CC2500_0C_FSCTRL0, frsky_rx_finetune); CC2500_WriteReg(CC2500_0C_FSCTRL0, FRSKY_RX_finetune);
else else
CC2500_WriteReg(CC2500_0C_FSCTRL0, option); CC2500_WriteReg(CC2500_0C_FSCTRL0, option);
prev_option = option; prev_option = option;
@ -431,20 +431,20 @@ uint16_t FrSky_Rx_callback()
CC2500_ReadData(packet, len); CC2500_ReadData(packet, len);
if(frskyx_rx_check_crc_id(true,true)) if(frskyx_rx_check_crc_id(true,true))
{ {
frsky_rx_finetune = -127; FRSKY_RX_finetune = -127;
CC2500_WriteReg(CC2500_0C_FSCTRL0, frsky_rx_finetune); CC2500_WriteReg(CC2500_0C_FSCTRL0, FRSKY_RX_finetune);
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; state = 0;
return 1000; return 1000;
} }
} }
frsky_rx_format = (frsky_rx_format + 1) % FRSKY_RX_FORMATS; // switch to next format (D8, D16FCC, D16LBT, D16v2FCC, D16v2LBT) FRSKY_RX_format = (FRSKY_RX_format + 1) % FRSKY_RX_FORMATS; // switch to next format (D8, D16FCC, D16LBT, D16v2FCC, D16v2LBT)
frsky_rx_initialise_cc2500(); FRSKY_RX_initialise_cc2500();
frsky_rx_finetune += 10; FRSKY_RX_finetune += 10;
CC2500_WriteReg(CC2500_0C_FSCTRL0, frsky_rx_finetune); CC2500_WriteReg(CC2500_0C_FSCTRL0, FRSKY_RX_finetune);
frsky_rx_strobe_rx(); FRSKY_RX_strobe_rx();
return 18000; return 18000;
case FRSKY_RX_TUNE_LOW: case FRSKY_RX_TUNE_LOW:
@ -452,18 +452,18 @@ uint16_t FrSky_Rx_callback()
{ {
CC2500_ReadData(packet, len); CC2500_ReadData(packet, len);
if(frskyx_rx_check_crc_id(true,false)) { if(frskyx_rx_check_crc_id(true,false)) {
tune_low = frsky_rx_finetune; tune_low = FRSKY_RX_finetune;
frsky_rx_finetune = 127; FRSKY_RX_finetune = 127;
CC2500_WriteReg(CC2500_0C_FSCTRL0, frsky_rx_finetune); CC2500_WriteReg(CC2500_0C_FSCTRL0, FRSKY_RX_finetune);
phase = FRSKY_RX_TUNE_HIGH; phase = FRSKY_RX_TUNE_HIGH;
debugln("FRSKY_RX_TUNE_HIGH"); debugln("FRSKY_RX_TUNE_HIGH");
frsky_rx_strobe_rx(); FRSKY_RX_strobe_rx();
return 1000; return 1000;
} }
} }
frsky_rx_finetune += 1; FRSKY_RX_finetune += 1;
CC2500_WriteReg(CC2500_0C_FSCTRL0, frsky_rx_finetune); CC2500_WriteReg(CC2500_0C_FSCTRL0, FRSKY_RX_finetune);
frsky_rx_strobe_rx(); FRSKY_RX_strobe_rx();
return 18000; return 18000;
case FRSKY_RX_TUNE_HIGH: case FRSKY_RX_TUNE_HIGH:
@ -471,9 +471,9 @@ uint16_t FrSky_Rx_callback()
{ {
CC2500_ReadData(packet, len); CC2500_ReadData(packet, len);
if(frskyx_rx_check_crc_id(true,false)) { if(frskyx_rx_check_crc_id(true,false)) {
tune_high = frsky_rx_finetune; tune_high = FRSKY_RX_finetune;
frsky_rx_finetune = (tune_low + tune_high) / 2; FRSKY_RX_finetune = (tune_low + tune_high) / 2;
CC2500_WriteReg(CC2500_0C_FSCTRL0, (int8_t)frsky_rx_finetune); CC2500_WriteReg(CC2500_0C_FSCTRL0, (int8_t)FRSKY_RX_finetune);
if(tune_low < tune_high) if(tune_low < tune_high)
{ {
phase = FRSKY_RX_BIND; phase = FRSKY_RX_BIND;
@ -484,13 +484,13 @@ uint16_t FrSky_Rx_callback()
phase = FRSKY_RX_TUNE_START; phase = FRSKY_RX_TUNE_START;
debugln("FRSKY_RX_TUNE_START"); debugln("FRSKY_RX_TUNE_START");
} }
frsky_rx_strobe_rx(); FRSKY_RX_strobe_rx();
return 1000; return 1000;
} }
} }
frsky_rx_finetune -= 1; FRSKY_RX_finetune -= 1;
CC2500_WriteReg(CC2500_0C_FSCTRL0, frsky_rx_finetune); CC2500_WriteReg(CC2500_0C_FSCTRL0, FRSKY_RX_finetune);
frsky_rx_strobe_rx(); FRSKY_RX_strobe_rx();
return 18000; return 18000;
case FRSKY_RX_BIND: case FRSKY_RX_BIND:
@ -498,7 +498,7 @@ uint16_t FrSky_Rx_callback()
{ {
CC2500_ReadData(packet, len); CC2500_ReadData(packet, len);
if(frskyx_rx_check_crc_id(true,false)) { if(frskyx_rx_check_crc_id(true,false)) {
if(frsky_rx_format != FRSKY_RX_D16v2LBT && frsky_rx_format != FRSKY_RX_D16v2FCC) if(FRSKY_RX_format != FRSKY_RX_D16v2LBT && FRSKY_RX_format != FRSKY_RX_D16v2FCC)
{// D8 & D16v1 {// D8 & D16v1
if(packet[5] <= 0x2D) if(packet[5] <= 0x2D)
{ {
@ -517,27 +517,27 @@ uint16_t FrSky_Rx_callback()
uint16_t temp = FRSKY_RX_EEPROM_OFFSET; uint16_t temp = FRSKY_RX_EEPROM_OFFSET;
if(sub_protocol==FRSKY_CLONE) if(sub_protocol==FRSKY_CLONE)
{ {
if(frsky_rx_format==FRSKY_RX_D8) if(FRSKY_RX_format==FRSKY_RX_D8)
temp=FRSKYD_CLONE_EEPROM_OFFSET; temp=FRSKYD_CLONE_EEPROM_OFFSET;
else if(frsky_rx_format == FRSKY_RX_D16FCC || frsky_rx_format == FRSKY_RX_D16LBT) else if(FRSKY_RX_format == FRSKY_RX_D16FCC || FRSKY_RX_format == FRSKY_RX_D16LBT)
temp=FRSKYX_CLONE_EEPROM_OFFSET; temp=FRSKYX_CLONE_EEPROM_OFFSET;
else else
temp=FRSKYX2_CLONE_EEPROM_OFFSET; temp=FRSKYX2_CLONE_EEPROM_OFFSET;
} }
eeprom_write_byte((EE_ADDR)temp++, frsky_rx_format); eeprom_write_byte((EE_ADDR)temp++, FRSKY_RX_format);
eeprom_write_byte((EE_ADDR)temp++, rx_tx_addr[3]); eeprom_write_byte((EE_ADDR)temp++, rx_tx_addr[3]);
eeprom_write_byte((EE_ADDR)temp++, rx_tx_addr[2]); eeprom_write_byte((EE_ADDR)temp++, rx_tx_addr[2]);
eeprom_write_byte((EE_ADDR)temp++, rx_tx_addr[1]); eeprom_write_byte((EE_ADDR)temp++, rx_tx_addr[1]);
if(sub_protocol==FRSKY_RX) if(sub_protocol==FRSKY_RX)
eeprom_write_byte((EE_ADDR)temp++, frsky_rx_finetune); eeprom_write_byte((EE_ADDR)temp++, FRSKY_RX_finetune);
if(frsky_rx_format != FRSKY_RX_D16v2FCC && frsky_rx_format != FRSKY_RX_D16v2LBT) if(FRSKY_RX_format != FRSKY_RX_D16v2FCC && FRSKY_RX_format != FRSKY_RX_D16v2LBT)
for (ch = 0; ch < 47; ch++) for (ch = 0; ch < 47; ch++)
eeprom_write_byte((EE_ADDR)temp++, hopping_frequency[ch]); eeprom_write_byte((EE_ADDR)temp++, hopping_frequency[ch]);
frsky_rx_data(); FRSKY_RX_data();
debugln("FRSKY_RX_DATA"); debugln("FRSKY_RX_DATA");
} }
} }
frsky_rx_strobe_rx(); FRSKY_RX_strobe_rx();
} }
return 1000; return 1000;
@ -554,30 +554,30 @@ uint16_t FrSky_Rx_callback()
RX_RSSI += 128; RX_RSSI += 128;
bool chanskip_valid=true; bool chanskip_valid=true;
// hop to next channel // hop to next channel
if (frsky_rx_format != FRSKY_RX_D8) if (FRSKY_RX_format != FRSKY_RX_D8)
{//D16v1 & D16v2 {//D16v1 & D16v2
if(rx_data_started) if(rx_data_started)
{ {
if(frsky_rx_chanskip != (((packet[4] & 0xC0) >> 6) | ((packet[5] & 0x3F) << 2))) if(FRSKY_RX_chanskip != (((packet[4] & 0xC0) >> 6) | ((packet[5] & 0x3F) << 2)))
{ {
chanskip_valid=false; // chanskip value has changed which surely indicates a bad frame chanskip_valid=false; // chanskip value has changed which surely indicates a bad frame
packet_count++; packet_count++;
if(packet_count>5) // the TX must have changed chanskip... if(packet_count>5) // the TX must have changed chanskip...
frsky_rx_chanskip = ((packet[4] & 0xC0) >> 6) | ((packet[5] & 0x3F) << 2); // chanskip init FRSKY_RX_chanskip = ((packet[4] & 0xC0) >> 6) | ((packet[5] & 0x3F) << 2); // chanskip init
} }
else else
packet_count=0; packet_count=0;
} }
else else
frsky_rx_chanskip = ((packet[4] & 0xC0) >> 6) | ((packet[5] & 0x3F) << 2); // chanskip init FRSKY_RX_chanskip = ((packet[4] & 0xC0) >> 6) | ((packet[5] & 0x3F) << 2); // chanskip init
} }
hopping_frequency_no = (hopping_frequency_no + frsky_rx_chanskip) % 47; hopping_frequency_no = (hopping_frequency_no + FRSKY_RX_chanskip) % 47;
frsky_rx_set_channel(hopping_frequency_no); FRSKY_RX_set_channel(hopping_frequency_no);
if(chanskip_valid) if(chanskip_valid)
{ {
if (telemetry_link == 0) if (telemetry_link == 0)
{ // send channels to TX { // send channels to TX
frsky_rx_build_telemetry_packet(); FRSKY_RX_build_telemetry_packet();
telemetry_link = 1; telemetry_link = 1;
} }
pps_counter++; pps_counter++;
@ -602,8 +602,8 @@ uint16_t FrSky_Rx_callback()
// skip channel if no packet received in time // skip channel if no packet received in time
if (read_retry++ >= 9) { if (read_retry++ >= 9) {
hopping_frequency_no = (hopping_frequency_no + frsky_rx_chanskip) % 47; hopping_frequency_no = (hopping_frequency_no + FRSKY_RX_chanskip) % 47;
frsky_rx_set_channel(hopping_frequency_no); FRSKY_RX_set_channel(hopping_frequency_no);
if(rx_data_started) if(rx_data_started)
read_retry = 0; read_retry = 0;
else else

View File

@ -207,7 +207,7 @@ static void __attribute__((unused)) SFHSS_send_packet()
CC2500_WriteData(packet, SFHSS_PACKET_LEN); CC2500_WriteData(packet, SFHSS_PACKET_LEN);
} }
uint16_t ReadSFHSS() uint16_t SFHSS_callback()
{ {
switch(phase) switch(phase)
{ {
@ -285,7 +285,7 @@ static void __attribute__((unused)) SFHSS_get_tx_id()
rx_tx_addr[1] = fixed_id >> 0; rx_tx_addr[1] = fixed_id >> 0;
} }
uint16_t initSFHSS() void SFHSS_init()
{ {
BIND_DONE; // Not a TX bind protocol BIND_DONE; // Not a TX bind protocol
SFHSS_get_tx_id(); SFHSS_get_tx_id();
@ -294,7 +294,6 @@ uint16_t initSFHSS()
SFHSS_rf_init(); SFHSS_rf_init();
phase = SFHSS_START; phase = SFHSS_START;
return 10000;
} }
#endif #endif

View File

@ -127,7 +127,7 @@ static void __attribute__((unused)) GD00X_send_packet()
XN297L_SetFreqOffset(); // Set frequency offset XN297L_SetFreqOffset(); // Set frequency offset
} }
static void __attribute__((unused)) GD00X_init() static void __attribute__((unused)) GD00X_RF_init()
{ {
XN297L_Init(); XN297L_Init();
if(sub_protocol==GD_V1) if(sub_protocol==GD_V1)
@ -214,18 +214,17 @@ uint16_t GD00X_callback()
return packet_period; return packet_period;
} }
uint16_t initGD00X() void GD00X_init()
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
GD00X_initialize_txid(); GD00X_initialize_txid();
GD00X_init(); GD00X_RF_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
bind_counter=GD00X_BIND_COUNT; bind_counter=GD00X_BIND_COUNT;
packet_period=sub_protocol==GD_V1?GD00X_PACKET_PERIOD:GD00X_V2_BIND_PACKET_PERIOD; packet_period=sub_protocol==GD_V1?GD00X_PACKET_PERIOD:GD00X_V2_BIND_PACKET_PERIOD;
packet_length=sub_protocol==GD_V1?GD00X_PAYLOAD_SIZE:GD00X_V2_PAYLOAD_SIZE; packet_length=sub_protocol==GD_V1?GD00X_PAYLOAD_SIZE:GD00X_V2_PAYLOAD_SIZE;
packet_count=0; packet_count=0;
len=0; len=0;
return GD00X_INITIAL_WAIT;
} }
#endif #endif

View File

@ -75,7 +75,7 @@ static void __attribute__((unused)) GW008_send_packet(uint8_t bind)
NRF24L01_SetPower(); // Set tx_power NRF24L01_SetPower(); // Set tx_power
} }
static void __attribute__((unused)) GW008_init() static void __attribute__((unused)) GW008_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -148,14 +148,13 @@ uint16_t GW008_callback()
return GW008_PACKET_PERIOD; return GW008_PACKET_PERIOD;
} }
uint16_t initGW008() void GW008_init()
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
GW008_initialize_txid(); GW008_initialize_txid();
phase = GW008_BIND1; phase = GW008_BIND1;
GW008_init(); GW008_RF_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
return GW008_INITIAL_WAIT;
} }
#endif #endif

View File

@ -155,7 +155,7 @@ static void __attribute__((unused)) H8_3D_send_packet(uint8_t bind)
NRF24L01_SetPower(); // Set tx_power NRF24L01_SetPower(); // Set tx_power
} }
static void __attribute__((unused)) H8_3D_init() static void __attribute__((unused)) H8_3D_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -238,12 +238,12 @@ static void __attribute__((unused)) H8_3D_initialize_txid()
} }
} }
uint16_t initH8_3D(void) void H8_3D_init(void)
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
bind_counter = H8_3D_BIND_COUNT; bind_counter = H8_3D_BIND_COUNT;
H8_3D_initialize_txid(); H8_3D_initialize_txid();
H8_3D_init(); H8_3D_RF_init();
switch(sub_protocol) switch(sub_protocol)
{ {
case H8_3D: case H8_3D:
@ -257,7 +257,6 @@ uint16_t initH8_3D(void)
packet_period=H20MINI_PACKET_PERIOD; packet_period=H20MINI_PACKET_PERIOD;
break; break;
} }
return H8_3D_INITIAL_WAIT;
} }
#endif #endif

View File

@ -137,7 +137,7 @@ const uint8_t PROGMEM HOTT_hop[][HOTT_NUM_RF_CHANNELS]=
}; };
const uint16_t PROGMEM HOTT_hop_val[] = { 0xC06B, 0xC34A, 0xDB24, 0x8E09, 0x272E, 0x217F, 0x155B, 0xEDE8, 0x1D31, 0x0986, 0x56F7, 0x6454, 0xC42D, 0x01D2, 0xC253, 0x1180 }; const uint16_t PROGMEM HOTT_hop_val[] = { 0xC06B, 0xC34A, 0xDB24, 0x8E09, 0x272E, 0x217F, 0x155B, 0xEDE8, 0x1D31, 0x0986, 0x56F7, 0x6454, 0xC42D, 0x01D2, 0xC253, 0x1180 };
static void __attribute__((unused)) HOTT_init() static void __attribute__((unused)) HOTT_TXID_init()
{ {
packet[0] = pgm_read_word_near( &HOTT_hop_val[num_ch] ); packet[0] = pgm_read_word_near( &HOTT_hop_val[num_ch] );
packet[1] = pgm_read_word_near( &HOTT_hop_val[num_ch] )>>8; packet[1] = pgm_read_word_near( &HOTT_hop_val[num_ch] )>>8;
@ -277,7 +277,7 @@ static void __attribute__((unused)) HOTT_prep_data_packet()
rf_ch_num=hopping_frequency[hopping_frequency_no]; rf_ch_num=hopping_frequency[hopping_frequency_no];
} }
uint16_t ReadHOTT() uint16_t HOTT_callback()
{ {
switch(phase) switch(phase)
{ {
@ -383,7 +383,7 @@ uint16_t ReadHOTT()
for(uint8_t i=0; i<5; i++) for(uint8_t i=0; i<5; i++)
eeprom_write_byte((EE_ADDR)(addr+i),packet_in[5+i]); eeprom_write_byte((EE_ADDR)(addr+i),packet_in[5+i]);
BIND_DONE; BIND_DONE;
HOTT_init(); HOTT_TXID_init();
} }
#ifdef HOTT_FW_TELEMETRY #ifdef HOTT_FW_TELEMETRY
else else
@ -509,10 +509,10 @@ uint16_t ReadHOTT()
return 0; return 0;
} }
uint16_t initHOTT() void HOTT_init()
{ {
num_ch=random(0xfefefefe)%16; num_ch=random(0xfefefefe)%16;
HOTT_init(); HOTT_TXID_init();
HOTT_rf_init(); HOTT_rf_init();
#ifdef HOTT_FW_TELEMETRY #ifdef HOTT_FW_TELEMETRY
HoTT_SerialRX_val=0; HoTT_SerialRX_val=0;
@ -527,7 +527,6 @@ uint16_t initHOTT()
state=HOTT_SENSOR_SEARCH_PERIOD; state=HOTT_SENSOR_SEARCH_PERIOD;
#endif #endif
phase = HOTT_START; phase = HOTT_START;
return 10000;
} }
#endif #endif

View File

@ -41,7 +41,7 @@ static void __attribute__((unused)) HEIGHT_build_packet()
} }
} }
uint16_t ReadHeight() uint16_t HEIGHT_callback()
{ {
#ifndef FORCE_HEIGHT_TUNING #ifndef FORCE_HEIGHT_TUNING
A7105_AdjustLOBaseFreq(1); A7105_AdjustLOBaseFreq(1);
@ -78,7 +78,7 @@ uint16_t ReadHeight()
return 1500; return 1500;
} }
uint16_t initHeight() void HEIGHT_init()
{ {
A7105_Init(); A7105_Init();
@ -94,7 +94,6 @@ uint16_t initHeight()
phase=255; phase=255;
bind_counter = HEIGHT_BIND_COUNT; bind_counter = HEIGHT_BIND_COUNT;
return 2400;
} }
#endif #endif
// Normal packet is 8 bytes: 0xA5 0xAF 0x59 0x84 0x7A 0x00 0x80 0xFF // Normal packet is 8 bytes: 0xA5 0xAF 0x59 0x84 0x7A 0x00 0x80 0xFF

View File

@ -27,7 +27,7 @@ uint8_t bind_buf_arry[4][10];
// HiSky protocol uses TX id as an address for nRF24L01, and uses frequency hopping sequence // HiSky protocol uses TX id as an address for nRF24L01, and uses frequency hopping sequence
// which does not depend on this id and is passed explicitly in binding sequence. So we are free // which does not depend on this id and is passed explicitly in binding sequence. So we are free
// to generate this sequence as we wish. It should be in the range [02..77] // to generate this sequence as we wish. It should be in the range [02..77]
static void __attribute__((unused)) calc_fh_channels() static void __attribute__((unused)) HISKY_calc_fh_channels()
{ {
uint8_t idx = 0; uint8_t idx = 0;
uint32_t rnd = MProtocol_id; uint32_t rnd = MProtocol_id;
@ -61,7 +61,7 @@ static void __attribute__((unused)) calc_fh_channels()
} }
} }
static void __attribute__((unused)) build_binding_packet(void) static void __attribute__((unused)) HISKY_build_binding_packet(void)
{ {
uint8_t i; uint8_t i;
uint16_t sum=0; uint16_t sum=0;
@ -95,7 +95,7 @@ static void __attribute__((unused)) build_binding_packet(void)
} }
} }
static void __attribute__((unused)) hisky_init() static void __attribute__((unused)) HISKY_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
@ -116,7 +116,7 @@ static void __attribute__((unused)) hisky_init()
// HiSky channel sequence: AILE ELEV THRO RUDD GEAR PITCH, channel data value is from 0 to 1000 // HiSky channel sequence: AILE ELEV THRO RUDD GEAR PITCH, channel data value is from 0 to 1000
// Channel 7 - Gyro mode, 0 - 6 axis, 3 - 3 axis // Channel 7 - Gyro mode, 0 - 6 axis, 3 - 3 axis
static void __attribute__((unused)) build_ch_data() static void __attribute__((unused)) HISKY_build_ch_data()
{ {
uint16_t temp; uint16_t temp;
uint8_t i,j; uint8_t i,j;
@ -133,7 +133,7 @@ static void __attribute__((unused)) build_ch_data()
} }
} }
uint16_t hisky_cb() uint16_t HISKY_callback()
{ {
phase++; phase++;
if(sub_protocol==HK310) if(sub_protocol==HK310)
@ -223,7 +223,7 @@ uint16_t hisky_cb()
#ifdef MULTI_SYNC #ifdef MULTI_SYNC
telemetry_set_input_sync(9000); telemetry_set_input_sync(9000);
#endif #endif
build_ch_data(); HISKY_build_ch_data();
break; break;
case 8: case 8:
break; break;
@ -236,7 +236,7 @@ uint16_t hisky_cb()
return 1000; // send 1 binding packet and 1 data packet per 9ms return 1000; // send 1 binding packet and 1 data packet per 9ms
} }
static void __attribute__((unused)) initialize_tx_id() static void __attribute__((unused)) HISKY_initialize_tx_id()
{ {
//Generate frequency hopping table //Generate frequency hopping table
if(sub_protocol==HK310) if(sub_protocol==HK310)
@ -248,14 +248,14 @@ static void __attribute__((unused)) initialize_tx_id()
hopping_frequency[i]=hopping_frequency_no++; // Sequential order hop channels... hopping_frequency[i]=hopping_frequency_no++; // Sequential order hop channels...
} }
else else
calc_fh_channels(); HISKY_calc_fh_channels();
} }
uint16_t initHiSky() void HISKY_init()
{ {
initialize_tx_id(); HISKY_initialize_tx_id();
build_binding_packet(); HISKY_build_binding_packet();
hisky_init(); HISKY_RF_init();
phase = 0; phase = 0;
hopping_frequency_no = 0; hopping_frequency_no = 0;
binding_idx = 0; binding_idx = 0;
@ -264,7 +264,6 @@ uint16_t initHiSky()
bind_counter = HISKY_BIND_COUNT; bind_counter = HISKY_BIND_COUNT;
else else
bind_counter = 0; bind_counter = 0;
return 1000;
} }
#endif #endif

View File

@ -219,7 +219,7 @@ static void __attribute__((unused)) HITEC_send_packet()
packet[23] >>= 1; // packet sequence packet[23] >>= 1; // packet sequence
} }
uint16_t ReadHITEC() uint16_t HITEC_callback()
{ {
switch(phase) switch(phase)
{ {
@ -389,7 +389,7 @@ uint16_t ReadHITEC()
return 0; return 0;
} }
uint16_t initHITEC() void HITEC_init()
{ {
HITEC_RF_channels(); HITEC_RF_channels();
#ifdef HITEC_FORCE_ID // ID and channels taken from dump #ifdef HITEC_FORCE_ID // ID and channels taken from dump
@ -399,7 +399,6 @@ uint16_t initHITEC()
memcpy((void *)hopping_frequency,(void *)"\x00\x3A\x4A\x32\x0C\x58\x2A\x10\x26\x20\x08\x60\x68\x70\x78\x80\x88\x56\x5E\x66\x6E",HITEC_NUM_FREQUENCE); memcpy((void *)hopping_frequency,(void *)"\x00\x3A\x4A\x32\x0C\x58\x2A\x10\x26\x20\x08\x60\x68\x70\x78\x80\x88\x56\x5E\x66\x6E",HITEC_NUM_FREQUENCE);
#endif #endif
phase = HITEC_START; phase = HITEC_START;
return 10000;
} }
/* Full telemetry /* Full telemetry

View File

@ -148,7 +148,7 @@ static void __attribute__((unused)) HONTAI_send_packet(uint8_t bind)
NRF24L01_SetPower(); NRF24L01_SetPower();
} }
static void __attribute__((unused)) HONTAI_init() static void __attribute__((unused)) HONTAI_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
@ -252,13 +252,12 @@ uint16_t HONTAI_callback()
return packet_period; return packet_period;
} }
uint16_t initHONTAI() void HONTAI_init()
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
bind_counter = HONTAI_BIND_COUNT; bind_counter = HONTAI_BIND_COUNT;
HONTAI_initialize_txid(); HONTAI_initialize_txid();
HONTAI_init(); HONTAI_RF_init();
packet_period = sub_protocol == FQ777_951 ? FQ777_951_PACKET_PERIOD : HONTAI_PACKET_PERIOD; packet_period = sub_protocol == FQ777_951 ? FQ777_951_PACKET_PERIOD : HONTAI_PACKET_PERIOD;
return HONTAI_INITIAL_WAIT;
} }
#endif #endif

View File

@ -285,7 +285,7 @@ static uint8_t __attribute__((unused)) hubsan_check_integrity()
} }
#endif #endif
uint16_t ReadHubsan() uint16_t HUBSAN_callback()
{ {
#ifdef HUBSAN_HUB_TELEMETRY #ifdef HUBSAN_HUB_TELEMETRY
static uint8_t rfMode=0; static uint8_t rfMode=0;
@ -446,7 +446,7 @@ uint16_t ReadHubsan()
return 0; return 0;
} }
uint16_t initHubsan() void HUBSAN_init()
{ {
const uint8_t allowed_ch[] = {0x14, 0x1e, 0x28, 0x32, 0x3c, 0x46, 0x50, 0x5a, 0x64, 0x6e, 0x78, 0x82}; const uint8_t allowed_ch[] = {0x14, 0x1e, 0x28, 0x32, 0x3c, 0x46, 0x50, 0x5a, 0x64, 0x6e, 0x78, 0x82};
A7105_Init(); A7105_Init();
@ -467,7 +467,6 @@ uint16_t initHubsan()
} }
packet_count=0; packet_count=0;
bind_phase=0; bind_phase=0;
return 10000;
} }
#endif #endif

View File

@ -126,7 +126,7 @@ static void __attribute__((unused)) j6pro_set_radio_channels()
hopping_frequency[3] = hopping_frequency[0]; hopping_frequency[3] = hopping_frequency[0];
} }
uint16_t ReadJ6Pro() uint16_t J6PRO_callback()
{ {
uint16_t start; uint16_t start;
@ -226,7 +226,7 @@ uint16_t ReadJ6Pro()
return 0; return 0;
} }
uint16_t initJ6Pro() void J6PRO_init()
{ {
j6pro_cyrf_init(); j6pro_cyrf_init();
@ -234,7 +234,6 @@ uint16_t initJ6Pro()
phase = J6PRO_BIND; phase = J6PRO_BIND;
else else
phase = J6PRO_CHANSEL; phase = J6PRO_CHANSEL;
return 2400;
} }
#endif #endif

View File

@ -130,7 +130,7 @@ static void __attribute__((unused)) JJRC345_send_packet()
NRF24L01_SetPower(); // Set tx_power NRF24L01_SetPower(); // Set tx_power
} }
static void __attribute__((unused)) JJRC345_init() static void __attribute__((unused)) JJRC345_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -183,13 +183,12 @@ static void __attribute__((unused)) JJRC345_initialize_txid()
#endif #endif
} }
uint16_t initJJRC345(void) void JJRC345_init(void)
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
bind_counter = JJRC345_BIND_COUNT; bind_counter = JJRC345_BIND_COUNT;
JJRC345_initialize_txid(); JJRC345_initialize_txid();
JJRC345_init(); JJRC345_RF_init();
return JJRC345_INITIAL_WAIT;
} }
#endif #endif

View File

@ -76,7 +76,7 @@ static void __attribute__((unused)) KF606_initialize_txid()
#endif #endif
} }
static void __attribute__((unused)) KF606_init() static void __attribute__((unused)) KF606_RF_init()
{ {
XN297L_Init(); XN297L_Init();
XN297L_SetTXAddr((uint8_t*)"\xe7\xe7\xe7\xe7\xe7", 5); XN297L_SetTXAddr((uint8_t*)"\xe7\xe7\xe7\xe7\xe7", 5);
@ -99,14 +99,13 @@ uint16_t KF606_callback()
return KF606_PACKET_PERIOD; return KF606_PACKET_PERIOD;
} }
uint16_t initKF606() void KF606_init()
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
KF606_initialize_txid(); KF606_initialize_txid();
KF606_init(); KF606_RF_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
bind_counter=KF606_BIND_COUNT; bind_counter=KF606_BIND_COUNT;
return KF606_INITIAL_WAIT;
} }
#endif #endif

View File

@ -239,7 +239,7 @@ static void __attribute__((unused)) kn_calculate_freqency_hopping_channels()
// V977 needs payload length in the packet. We should configure 24L01 to enable Packet Control Field(PCF) // V977 needs payload length in the packet. We should configure 24L01 to enable Packet Control Field(PCF)
// Some RX reg settings are actually for enable PCF // Some RX reg settings are actually for enable PCF
//------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------
static void __attribute__((unused)) kn_init() static void __attribute__((unused)) KN_RF_init()
{ {
kn_calculate_tx_addr(); kn_calculate_tx_addr();
kn_calculate_freqency_hopping_channels(); kn_calculate_freqency_hopping_channels();
@ -272,7 +272,7 @@ static void __attribute__((unused)) kn_init()
//================================================================================================ //================================================================================================
// Private Functions // Private Functions
//================================================================================================ //================================================================================================
uint16_t initKN() void KN_init()
{ {
if(sub_protocol==WLTOYS) if(sub_protocol==WLTOYS)
{ {
@ -288,13 +288,11 @@ uint16_t initKN()
packet_count = KN_FX_PACKET_SEND_COUNT; packet_count = KN_FX_PACKET_SEND_COUNT;
seed = KN_FX_PACKET_SEND_COUNT * KN_FX_SENDING_PACKET_PERIOD; seed = KN_FX_PACKET_SEND_COUNT * KN_FX_SENDING_PACKET_PERIOD;
} }
kn_init(); KN_RF_init();
phase = IS_BIND_IN_PROGRESS ? KN_PHASE_PRE_BIND : KN_PHASE_PRE_SEND; phase = IS_BIND_IN_PROGRESS ? KN_PHASE_PRE_BIND : KN_PHASE_PRE_SEND;
return KN_INIT_WAIT_MS;
} }
uint16_t kn_callback() uint16_t KN_callback()
{ {
switch (phase) switch (phase)
{ {

View File

@ -23,7 +23,7 @@
//Kyosho constants & variables //Kyosho constants & variables
#define KYOSHO_BIND_COUNT 2500 #define KYOSHO_BIND_COUNT 2500
static void __attribute__((unused)) kyosho_send_packet() static void __attribute__((unused)) KYOSHO_send_packet()
{ {
//ID //ID
packet[1] = rx_tx_addr[0]; packet[1] = rx_tx_addr[0];
@ -77,7 +77,7 @@ static void __attribute__((unused)) kyosho_send_packet()
A7105_WriteData(37, rf_ch_num); A7105_WriteData(37, rf_ch_num);
} }
static void __attribute__((unused)) kyosho_hype_send_packet() static void __attribute__((unused)) KYOSHO_hype_send_packet()
{ {
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
{ {
@ -124,7 +124,7 @@ static void __attribute__((unused)) kyosho_hype_send_packet()
} }
} }
uint16_t ReadKyosho() uint16_t KYOSHO_callback()
{ {
#ifndef FORCE_KYOSHO_TUNING #ifndef FORCE_KYOSHO_TUNING
A7105_AdjustLOBaseFreq(1); A7105_AdjustLOBaseFreq(1);
@ -151,13 +151,13 @@ uint16_t ReadKyosho()
#endif #endif
} }
if(sub_protocol==KYOSHO_FHSS) if(sub_protocol==KYOSHO_FHSS)
kyosho_send_packet(); KYOSHO_send_packet();
else//HYPE else//HYPE
kyosho_hype_send_packet(); KYOSHO_hype_send_packet();
return packet_period; return packet_period;
} }
uint16_t initKyosho() void KYOSHO_init()
{ {
A7105_Init(); A7105_Init();
@ -197,6 +197,5 @@ uint16_t initKyosho()
packet_sent=0; packet_sent=0;
packet_period=3852; //FHSS packet_period=3852; //FHSS
return 2000;
} }
#endif #endif

View File

@ -21,7 +21,7 @@ Multiprotocol is distributed in the hope that it will be useful,
#define LOLI_PACKET_SIZE 11 #define LOLI_PACKET_SIZE 11
#define LOLI_NUM_CHANNELS 5 #define LOLI_NUM_CHANNELS 5
static void __attribute__((unused)) LOLI_init() static void __attribute__((unused)) LOLI_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_FlushTx(); NRF24L01_FlushTx();
@ -290,7 +290,7 @@ uint16_t LOLI_callback()
return 20000; return 20000;
} }
uint16_t initLOLI() void LOLI_init()
{ {
rx_tx_addr[1] %= 0x30; rx_tx_addr[1] %= 0x30;
calc_fh_channels(LOLI_NUM_CHANNELS); calc_fh_channels(LOLI_NUM_CHANNELS);
@ -306,9 +306,7 @@ uint16_t initLOLI()
else else
phase = LOLI_PREP_DATA; phase = LOLI_PREP_DATA;
LOLI_init(); LOLI_RF_init();
return 500;
} }
#endif #endif

View File

@ -223,7 +223,7 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind)
hopping_frequency_no %= 2 * MJXQ_RF_NUM_CHANNELS; // channels repeated hopping_frequency_no %= 2 * MJXQ_RF_NUM_CHANNELS; // channels repeated
} }
static void __attribute__((unused)) MJXQ_init() static void __attribute__((unused)) MJXQ_RF_init()
{ {
uint8_t addr[MJXQ_ADDRESS_LENGTH]; uint8_t addr[MJXQ_ADDRESS_LENGTH];
memcpy(addr, "\x6d\x6a\x77\x77\x77", MJXQ_ADDRESS_LENGTH); memcpy(addr, "\x6d\x6a\x77\x77\x77", MJXQ_ADDRESS_LENGTH);
@ -350,14 +350,13 @@ uint16_t MJXQ_callback()
return MJXQ_PACKET_PERIOD; return MJXQ_PACKET_PERIOD;
} }
uint16_t initMJXQ(void) void MJXQ_init(void)
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
bind_counter = MJXQ_BIND_COUNT; bind_counter = MJXQ_BIND_COUNT;
MJXQ_initialize_txid(); MJXQ_initialize_txid();
MJXQ_init(); MJXQ_RF_init();
packet_count=0; packet_count=0;
return MJXQ_INITIAL_WAIT+MJXQ_PACKET_PERIOD;
} }
#endif #endif

View File

@ -318,7 +318,7 @@ static void __attribute__((unused)) MLINK_send_data_packet()
} }
#endif #endif
uint16_t ReadMLINK() uint16_t MLINK_callback()
{ {
uint8_t status; uint8_t status;
uint16_t start; uint16_t start;
@ -511,7 +511,7 @@ static void __attribute__((unused)) MLINK_shuffle_freqs(uint32_t seed, uint8_t *
} }
} }
uint16_t initMLINK() void MLINK_init()
{ {
MLINK_cyrf_config(); MLINK_cyrf_config();
@ -582,8 +582,6 @@ uint16_t initMLINK()
} }
else else
phase = MLINK_PREP_DATA; phase = MLINK_PREP_DATA;
return 10000;
} }
#endif #endif

View File

@ -222,7 +222,7 @@ static void __attribute__((unused)) MT99XX_send_packet()
NRF24L01_SetPower(); NRF24L01_SetPower();
} }
static void __attribute__((unused)) MT99XX_init() static void __attribute__((unused)) MT99XX_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
if(sub_protocol == YZ) if(sub_protocol == YZ)
@ -315,18 +315,17 @@ uint16_t MT99XX_callback()
return packet_period; return packet_period;
} }
uint16_t initMT99XX(void) void MT99XX_init(void)
{ {
if(sub_protocol != A180) if(sub_protocol != A180)
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
bind_counter = MT99XX_BIND_COUNT; bind_counter = MT99XX_BIND_COUNT;
MT99XX_initialize_txid(); MT99XX_initialize_txid();
MT99XX_init(); MT99XX_RF_init();
packet_period = MT99XX_PACKET_PERIOD_MT; packet_period = MT99XX_PACKET_PERIOD_MT;
packet_count=0; packet_count=0;
return MT99XX_INITIAL_WAIT+MT99XX_PACKET_PERIOD_MT;
} }
#endif #endif

View File

@ -1,429 +0,0 @@
/*
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(MULTI_NAMES)
const char STR_FLYSKY[] ="FlySky";
const char STR_HUBSAN[] ="Hubsan";
const char STR_FRSKYD[] ="FrSky D";
const char STR_HISKY[] ="Hisky";
const char STR_V2X2[] ="V2x2";
const char STR_DSM[] ="DSM";
const char STR_DSM_RX[] ="DSM_RX";
const char STR_DEVO[] ="Devo";
const char STR_YD717[] ="YD717";
const char STR_KN[] ="KN";
const char STR_SYMAX[] ="SymaX";
const char STR_SLT[] ="SLT";
const char STR_CX10[] ="CX10";
const char STR_CG023[] ="CG023";
const char STR_BAYANG[] ="Bayang";
const char STR_FRSKYL[] ="FrSky L";
const char STR_FRSKYX[] ="FrSky X";
const char STR_FRSKYX2[] ="FrSkyX2";
const char STR_ESKY[] ="ESky";
const char STR_MT99XX[] ="MT99XX";
const char STR_MJXQ[] ="MJXq";
const char STR_SHENQI[] ="Shenqi";
const char STR_FY326[] ="FY326";
const char STR_FUTABA[] ="Futaba";
const char STR_J6PRO[] ="J6 Pro";
const char STR_JJRC345[] ="JJRC345";
const char STR_FQ777[] ="FQ777";
const char STR_ASSAN[] ="Assan";
const char STR_FRSKYV[] ="FrSky V";
const char STR_HONTAI[] ="Hontai";
const char STR_AFHDS2A[] ="FlSky2A";
const char STR_Q2X2[] ="Q2x2";
const char STR_WK2x01[] ="Walkera";
const char STR_Q303[] ="Q303";
const char STR_Q90C[] ="Q90C";
const char STR_GW008[] ="GW008";
const char STR_DM002[] ="DM002";
const char STR_CABELL[] ="Cabell";
const char STR_ESKY150[] ="Esky150";
const char STR_ESKY150V2[] ="EskyV2";
const char STR_H8_3D[] ="H8 3D";
const char STR_CORONA[] ="Corona";
const char STR_CFLIE[] ="CFlie";
const char STR_HITEC[] ="Hitec";
const char STR_WFLY[] ="WFLY";
const char STR_WFLY2[] ="WFLY2";
const char STR_BUGS[] ="Bugs";
const char STR_BUGSMINI[] ="BugMini";
const char STR_TRAXXAS[] ="Traxxas";
const char STR_NCC1701[] ="NCC1701";
const char STR_E01X[] ="E01X";
const char STR_V911S[] ="V911S";
const char STR_GD00X[] ="GD00x";
const char STR_V761[] ="V761";
const char STR_KF606[] ="KF606";
const char STR_REDPINE[] ="Redpine";
const char STR_POTENSIC[] ="Potensi";
const char STR_ZSX[] ="ZSX";
const char STR_HEIGHT[] ="Height";
const char STR_SCANNER[] ="Scanner";
const char STR_FRSKY_RX[] ="FrSkyRX";
const char STR_AFHDS2A_RX[] ="FS2A_RX";
const char STR_HOTT[] ="HoTT";
const char STR_FX816[] ="FX816";
const char STR_BAYANG_RX[] ="BayanRX";
const char STR_PELIKAN[] ="Pelikan";
const char STR_TIGER[] ="Tiger";
const char STR_XK[] ="XK";
const char STR_XN297DUMP[] ="XN297DP";
const char STR_FRSKYR9[] ="FrSkyR9";
const char STR_PROPEL[] ="Propel";
const char STR_SKYARTEC[] ="Skyartc";
const char STR_KYOSHO[] ="Kyosho";
const char STR_RLINK[] ="RadLink";
const char STR_REALACC[] ="Realacc";
const char STR_OMP[] ="OMP";
const char STR_MLINK[] ="M-Link";
const char STR_TEST[] ="Test";
const char STR_NANORF[] ="NanoRF";
const char STR_E016HV2[] ="E016Hv2";
const char STR_E010R5[] ="E010r5";
const char STR_LOLI[] ="LOLI";
const char STR_E129[] ="E129";
const char STR_SUBTYPE_FLYSKY[] = "\x04""Std\0""V9x9""V6x6""V912""CX20";
const char STR_SUBTYPE_HUBSAN[] = "\x04""H107""H301""H501";
const char STR_SUBTYPE_FRSKYD[] = "\x06""D8\0 ""Cloned";
const char STR_SUBTYPE_FRSKYX[] = "\x07""D16\0 ""D16 8ch""LBT(EU)""LBT 8ch""Cloned\0""Clo 8ch";
const char STR_SUBTYPE_HISKY[] = "\x05""Std\0 ""HK310";
const char STR_SUBTYPE_V2X2[] = "\x06""Std\0 ""JXD506""MR101\0";
const char STR_SUBTYPE_DSM[] = "\x04""2 1F""2 2F""X 1F""X 2F""Auto";
const char STR_SUBTYPE_DEVO[] = "\x04""8ch\0""10ch""12ch""6ch\0""7ch\0";
const char STR_SUBTYPE_YD717[] = "\x07""Std\0 ""SkyWlkr""Syma X4""XINXUN\0""NIHUI\0 ";
const char STR_SUBTYPE_KN[] = "\x06""WLtoys""FeiLun";
const char STR_SUBTYPE_SYMAX[] = "\x03""Std""X5C";
const char STR_SUBTYPE_SLT[] = "\x06""V1_6ch""V2_8ch""Q100\0 ""Q200\0 ""MR100\0";
const char STR_SUBTYPE_CX10[] = "\x07""Green\0 ""Blue\0 ""DM007\0 ""-\0 ""JC3015a""JC3015b""MK33041";
const char STR_SUBTYPE_CG023[] = "\x05""Std\0 ""YD829";
const char STR_SUBTYPE_BAYANG[] = "\x07""Std\0 ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4\0""QX100\0 ";
const char STR_SUBTYPE_MT99[] = "\x05""MT99\0""H7\0 ""YZ\0 ""LS\0 ""FY805""A180\0";
const char STR_SUBTYPE_MJXQ[] = "\x07""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix";
const char STR_SUBTYPE_FY326[] = "\x05""Std\0 ""FY319";
const char STR_SUBTYPE_HONTAI[] = "\x07""Std\0 ""JJRC X1""X5C1\0 ""FQ_951";
const char STR_SUBTYPE_AFHDS2A[] = "\x08""PWM,IBUS""PPM,IBUS""PWM,SBUS""PPM,SBUS""PWM,IB16""PPM,IB16""PWM,SB16""PPM,SB16";
const char STR_SUBTYPE_Q2X2[] = "\x04""Q222""Q242""Q282";
const char STR_SUBTYPE_WK2x01[] = "\x06""WK2801""WK2401""W6_5_1""W6_6_1""W6_HeL""W6_HeI";
const char STR_SUBTYPE_Q303[] = "\x06""Std\0 ""CX35\0 ""CX10D\0""CX10WD";
const char STR_SUBTYPE_CABELL[] = "\x07""V3\0 ""V3 Telm""-\0 ""-\0 ""-\0 ""-\0 ""F-Safe\0""Unbind\0";
const char STR_SUBTYPE_H83D[] = "\x07""Std\0 ""H20H\0 ""H20Mini""H30Mini";
const char STR_SUBTYPE_CORONA[] = "\x05""V1\0 ""V2\0 ""FD V3";
const char STR_SUBTYPE_HITEC[] = "\x07""Optima\0""Opt Hub""Minima\0";
const char STR_SUBTYPE_BUGS_MINI[] = "\x06""Std\0 ""Bugs3H";
const char STR_SUBTYPE_TRAXXAS[] = "\x04""6519";
const char STR_SUBTYPE_E01X[] = "\x05""E012\0""E015\0""E016H";
const char STR_SUBTYPE_GD00X[] = "\x05""GD_V1""GD_V2";
const char STR_SUBTYPE_REDPINE[] = "\x04""Fast""Slow";
const char STR_SUBTYPE_POTENSIC[] = "\x03""A20";
const char STR_SUBTYPE_ZSX[] = "\x07""280JJRC";
const char STR_SUBTYPE_HEIGHT[] = "\x03""5ch""8ch";
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_ESKY150[] = "\x03""4ch""7ch";
const char STR_SUBTYPE_ESKY150V2[] = "\x05""150V2";
const char STR_SUBTYPE_V911S[] = "\x05""V911S""E119\0";
const char STR_SUBTYPE_XK[] = "\x04""X450""X420";
const char STR_SUBTYPE_FRSKYR9[] = "\x07""915MHz\0""868MHz\0""915 8ch""868 8ch""FCC\0 ""--\0 ""FCC 8ch""-- 8ch\0";
const char STR_SUBTYPE_ESKY[] = "\x03""Std""ET4";
const char STR_SUBTYPE_PROPEL[] = "\x04""74-Z";
const char STR_SUBTYPE_FRSKY_RX[] = "\x07""RX\0 ""CloneTX""EraseTX";
const char STR_SUBTYPE_FRSKYL[] = "\x08""LR12\0 ""LR12 6ch";
const char STR_SUBTYPE_WFLY[] = "\x05""WFR0x";
const char STR_SUBTYPE_WFLY2[] = "\x05""RF20x";
const char STR_SUBTYPE_HOTT[] = "\x07""Sync\0 ""No_Sync";
const char STR_SUBTYPE_PELIKAN[] = "\x04""Pro\0""Lite";
const char STR_SUBTYPE_V761[] = "\x03""3ch""4ch";
const char STR_SUBTYPE_RLINK[] = "\x07""Surface""Air\0 ""DumboRC";
const char STR_SUBTYPE_REALACC[] = "\x03""R11";
const char STR_SUBTYPE_KYOSHO[] = "\x04""FHSS""Hype";
const char STR_SUBTYPE_FUTABA[] = "\x05""SFHSS";
const char STR_SUBTYPE_JJRC345[] = "\x08""JJRC345\0""SkyTmblr";
enum
{
OPTION_NONE,
OPTION_OPTION,
OPTION_RFTUNE,
OPTION_VIDFREQ,
OPTION_FIXEDID,
OPTION_TELEM,
OPTION_SRVFREQ,
OPTION_MAXTHR,
OPTION_RFCHAN,
OPTION_RFPOWER,
};
#define NO_SUBTYPE nullptr
const mm_protocol_definition multi_protocols[] = {
// Protocol number, Protocol String, Number of sub_protocols, Sub_protocol strings, Option type
#if defined(ASSAN_NRF24L01_INO)
{PROTO_ASSAN, STR_ASSAN, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(BAYANG_NRF24L01_INO)
{PROTO_BAYANG, STR_BAYANG, 6, STR_SUBTYPE_BAYANG, OPTION_TELEM },
#endif
#if defined(BAYANG_RX_NRF24L01_INO)
{PROTO_BAYANG_RX, STR_BAYANG_RX, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(BUGS_A7105_INO)
{PROTO_BUGS, STR_BUGS, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(BUGSMINI_NRF24L01_INO)
{PROTO_BUGSMINI, STR_BUGSMINI, 2, STR_SUBTYPE_BUGS_MINI, OPTION_NONE },
#endif
#if defined(CABELL_NRF24L01_INO)
{PROTO_CABELL, STR_CABELL, 8, STR_SUBTYPE_CABELL, OPTION_OPTION },
#endif
#if defined(CFLIE_NRF24L01_INO)
{PROTO_CFLIE, STR_CFLIE, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(CG023_NRF24L01_INO)
{PROTO_CG023, STR_CG023, 2, STR_SUBTYPE_CG023, OPTION_NONE },
#endif
#if defined(CORONA_CC2500_INO)
{PROTO_CORONA, STR_CORONA, 3, STR_SUBTYPE_CORONA, OPTION_RFTUNE },
#endif
#if defined(CX10_NRF24L01_INO)
{PROTO_CX10, STR_CX10, 7, STR_SUBTYPE_CX10, OPTION_NONE },
#endif
#if defined(DEVO_CYRF6936_INO)
{PROTO_DEVO, STR_DEVO, 5, STR_SUBTYPE_DEVO, OPTION_FIXEDID },
#endif
#if defined(DM002_NRF24L01_INO)
{PROTO_DM002, STR_DM002, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(DSM_CYRF6936_INO)
{PROTO_DSM, STR_DSM, 5, STR_SUBTYPE_DSM, OPTION_MAXTHR },
#endif
#if defined(DSM_RX_CYRF6936_INO)
{PROTO_DSM_RX, STR_DSM_RX, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(E010R5_CYRF6936_INO)
{PROTO_E010R5, STR_E010R5, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(E016HV2_CC2500_INO)
{PROTO_E016HV2, STR_E016HV2, 0, NO_SUBTYPE, OPTION_RFTUNE },
#endif
#if defined(E01X_NRF24L01_INO)
{PROTO_E01X, STR_E01X, 3, STR_SUBTYPE_E01X, OPTION_OPTION },
#endif
#if defined(E129_CYRF6936_INO)
{PROTO_E129, STR_E129, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(ESKY_NRF24L01_INO)
{PROTO_ESKY, STR_ESKY, 2, STR_SUBTYPE_ESKY, OPTION_NONE },
#endif
#if defined(ESKY150_NRF24L01_INO)
{PROTO_ESKY150, STR_ESKY150, 2, STR_SUBTYPE_ESKY150, OPTION_NONE },
#endif
#if defined(ESKY150V2_CC2500_INO)
{PROTO_ESKY150V2, STR_ESKY150V2, 1, STR_SUBTYPE_ESKY150V2, OPTION_RFTUNE },
#endif
#if defined(FLYSKY_A7105_INO)
{PROTO_FLYSKY, STR_FLYSKY, 5, STR_SUBTYPE_FLYSKY, OPTION_NONE },
#endif
#if defined(AFHDS2A_A7105_INO)
{PROTO_AFHDS2A, STR_AFHDS2A, 8, STR_SUBTYPE_AFHDS2A, OPTION_SRVFREQ },
#endif
#if defined(AFHDS2A_RX_A7105_INO)
{PROTO_AFHDS2A_RX, STR_AFHDS2A_RX,0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(FQ777_NRF24L01_INO)
{PROTO_FQ777, STR_FQ777, 0, NO_SUBTYPE, OPTION_NONE },
#endif
//OpenTX 2.3.x issue: DO NOT CHANGE ORDER below
#if defined(FRSKY_RX_CC2500_INO)
{PROTO_FRSKY_RX, STR_FRSKY_RX, 3, STR_SUBTYPE_FRSKY_RX, OPTION_RFTUNE },
#endif
#if defined(FRSKYD_CC2500_INO)
{PROTO_FRSKYD, STR_FRSKYD, 2, STR_SUBTYPE_FRSKYD, OPTION_RFTUNE },
#endif
#if defined(FRSKYV_CC2500_INO)
{PROTO_FRSKYV, STR_FRSKYV, 0, NO_SUBTYPE, OPTION_RFTUNE },
#endif
#if defined(FRSKYX_CC2500_INO)
{PROTO_FRSKYX, STR_FRSKYX, 6, STR_SUBTYPE_FRSKYX, OPTION_RFTUNE },
{PROTO_FRSKYX2, STR_FRSKYX2, 6, STR_SUBTYPE_FRSKYX, OPTION_RFTUNE },
#endif
//OpenTX 2.3.x issue: DO NOT CHANGE ORDER above
#if defined(FRSKYL_CC2500_INO)
{PROTO_FRSKYL, STR_FRSKYL, 2, STR_SUBTYPE_FRSKYL, OPTION_RFTUNE },
#endif
#if defined(FRSKYR9_SX1276_INO)
{PROTO_FRSKY_R9, STR_FRSKYR9, 8, STR_SUBTYPE_FRSKYR9, OPTION_NONE },
#endif
#if defined(FUTABA_CC2500_INO)
{PROTO_FUTABA, STR_FUTABA, 1, STR_SUBTYPE_FUTABA, OPTION_RFTUNE },
#endif
#if defined(FX816_NRF24L01_INO)
{PROTO_FX816, STR_FX816, 1, STR_SUBTYPE_FX816, OPTION_NONE },
#endif
#if defined(FY326_NRF24L01_INO)
{PROTO_FY326, STR_FY326, 2, STR_SUBTYPE_FY326, OPTION_NONE },
#endif
#if defined(GD00X_NRF24L01_INO)
{PROTO_GD00X, STR_GD00X, 2, STR_SUBTYPE_GD00X, OPTION_RFTUNE },
#endif
#if defined(GW008_NRF24L01_INO)
{PROTO_GW008, STR_GW008, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(H8_3D_NRF24L01_INO)
{PROTO_H8_3D, STR_H8_3D, 4, STR_SUBTYPE_H83D, OPTION_NONE },
#endif
#if defined(HEIGHT_A7105_INO)
{PROTO_HEIGHT, STR_HEIGHT, 2, STR_SUBTYPE_HEIGHT, OPTION_NONE },
#endif
#if defined(HISKY_NRF24L01_INO)
{PROTO_HISKY, STR_HISKY, 2, STR_SUBTYPE_HISKY, OPTION_NONE },
#endif
#if defined(HITEC_CC2500_INO)
{PROTO_HITEC, STR_HITEC, 3, STR_SUBTYPE_HITEC, OPTION_RFTUNE },
#endif
#if defined(HONTAI_NRF24L01_INO)
{PROTO_HONTAI, STR_HONTAI, 4, STR_SUBTYPE_HONTAI, OPTION_NONE },
#endif
#if defined(HOTT_CC2500_INO)
{PROTO_HOTT, STR_HOTT, 2, STR_SUBTYPE_HOTT, OPTION_RFTUNE },
#endif
#if defined(HUBSAN_A7105_INO)
{PROTO_HUBSAN, STR_HUBSAN, 3, STR_SUBTYPE_HUBSAN, OPTION_VIDFREQ },
#endif
#if defined(J6PRO_CYRF6936_INO)
{PROTO_J6PRO, STR_J6PRO, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(JJRC345_NRF24L01_INO)
{PROTO_JJRC345, STR_JJRC345, 2, STR_SUBTYPE_JJRC345, OPTION_NONE },
#endif
#if defined(KF606_NRF24L01_INO)
{PROTO_KF606, STR_KF606, 0, NO_SUBTYPE, OPTION_RFTUNE },
#endif
#if defined(KN_NRF24L01_INO)
{PROTO_KN, STR_KN, 2, STR_SUBTYPE_KN, OPTION_NONE },
#endif
#if defined(KYOSHO_A7105_INO)
{PROTO_KYOSHO, STR_KYOSHO, 2, STR_SUBTYPE_KYOSHO, OPTION_NONE },
#endif
#if defined(LOLI_NRF24L01_INO)
{PROTO_LOLI, STR_LOLI, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(MJXQ_NRF24L01_INO)
{PROTO_MJXQ, STR_MJXQ, 7, STR_SUBTYPE_MJXQ, OPTION_RFTUNE },
#endif
#if defined(MLINK_CYRF6936_INO)
{PROTO_MLINK, STR_MLINK, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(MT99XX_NRF24L01_INO)
{PROTO_MT99XX, STR_MT99XX, 6, STR_SUBTYPE_MT99, OPTION_NONE },
#endif
#if defined(NCC1701_NRF24L01_INO)
{PROTO_NCC1701, STR_NCC1701, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(OMP_CC2500_INO)
{PROTO_OMP, STR_OMP, 0, NO_SUBTYPE, OPTION_RFTUNE },
#endif
#if defined(PELIKAN_A7105_INO)
{PROTO_PELIKAN, STR_PELIKAN , 2, STR_SUBTYPE_PELIKAN, OPTION_NONE },
#endif
#if defined(POTENSIC_NRF24L01_INO)
{PROTO_POTENSIC, STR_POTENSIC, 1, STR_SUBTYPE_POTENSIC, OPTION_NONE },
#endif
#if defined(PROPEL_NRF24L01_INO)
{PROTO_PROPEL, STR_PROPEL, 1, STR_SUBTYPE_PROPEL, OPTION_NONE },
#endif
#if defined(CX10_NRF24L01_INO)
{PROTO_Q2X2, STR_Q2X2, 3, STR_SUBTYPE_Q2X2, OPTION_NONE },
#endif
#if defined(Q303_NRF24L01_INO)
{PROTO_Q303, STR_Q303, 4, STR_SUBTYPE_Q303, OPTION_NONE },
#endif
#if defined(Q90C_NRF24L01_INO)
{PROTO_Q90C, STR_Q90C, 0, NO_SUBTYPE, OPTION_RFTUNE },
#endif
#if defined(RLINK_CC2500_INO)
{PROTO_RLINK, STR_RLINK, 3, 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)
{PROTO_REDPINE, STR_REDPINE, 2, STR_SUBTYPE_REDPINE, OPTION_RFTUNE },
#endif
#if defined(SCANNER_CC2500_INO)
// {PROTO_SCANNER, STR_SCANNER, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(SHENQI_NRF24L01_INO)
{PROTO_SHENQI, STR_SHENQI, 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(SKYARTEC_CC2500_INO)
{PROTO_SKYARTEC, STR_SKYARTEC, 0, NO_SUBTYPE, OPTION_RFTUNE },
#endif
#if defined(SLT_NRF24L01_INO)
{PROTO_SLT, STR_SLT, 5, STR_SUBTYPE_SLT, OPTION_RFTUNE },
#endif
#if defined(SYMAX_NRF24L01_INO)
{PROTO_SYMAX, STR_SYMAX, 2, STR_SUBTYPE_SYMAX, OPTION_NONE },
#endif
#if defined(TIGER_NRF24L01_INO)
{PROTO_TIGER, STR_TIGER , 0, NO_SUBTYPE, OPTION_NONE },
#endif
#if defined(TRAXXAS_CYRF6936_INO)
{PROTO_TRAXXAS, STR_TRAXXAS, 1, STR_SUBTYPE_TRAXXAS, OPTION_NONE },
#endif
#if defined(V2X2_NRF24L01_INO)
{PROTO_V2X2, STR_V2X2, 3, STR_SUBTYPE_V2X2, OPTION_NONE },
#endif
#if defined(V761_NRF24L01_INO)
{PROTO_V761, STR_V761, 2, STR_SUBTYPE_V761, OPTION_NONE },
#endif
#if defined(V911S_NRF24L01_INO)
{PROTO_V911S, STR_V911S, 2, STR_SUBTYPE_V911S, OPTION_RFTUNE },
#endif
#if defined(WK2x01_CYRF6936_INO)
{PROTO_WK2x01, STR_WK2x01, 6, STR_SUBTYPE_WK2x01, OPTION_NONE },
#endif
#if defined(WFLY_CYRF6936_INO)
{PROTO_WFLY, STR_WFLY, 1, STR_SUBTYPE_WFLY, OPTION_NONE },
#endif
#if defined(WFLY2_A7105_INO)
{PROTO_WFLY2, STR_WFLY2, 1, STR_SUBTYPE_WFLY2, OPTION_OPTION },
#endif
#if defined(XK_NRF24L01_INO)
{PROTO_XK, STR_XK , 2, STR_SUBTYPE_XK, OPTION_RFTUNE },
#endif
#if defined(XN297DUMP_NRF24L01_INO)
{PROTO_XN297DUMP, STR_XN297DUMP, 5, STR_SUBTYPE_XN297DUMP, OPTION_RFCHAN },
#endif
#if defined(YD717_NRF24L01_INO)
{PROTO_YD717, STR_YD717, 5, STR_SUBTYPE_YD717, OPTION_NONE },
#endif
#if defined(ZSX_NRF24L01_INO)
{PROTO_ZSX, STR_ZSX, 1, STR_SUBTYPE_ZSX, OPTION_NONE },
#endif
#if defined(TEST_CC2500_INO)
{PROTO_TEST, STR_TEST, 0, NO_SUBTYPE, OPTION_RFTUNE },
#endif
#if defined(NANORF_NRF24L01_INO)
{PROTO_NANORF, STR_NANORF, 0, NO_SUBTYPE, OPTION_NONE },
#endif
{0x00, nullptr, 0, nullptr, 0 }
};
#endif

View File

@ -0,0 +1,426 @@
/*
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/>.
*/
const char STR_FLYSKY[] ="FlySky";
const char STR_HUBSAN[] ="Hubsan";
const char STR_FRSKYD[] ="FrSky D";
const char STR_HISKY[] ="Hisky";
const char STR_V2X2[] ="V2x2";
const char STR_DSM[] ="DSM";
const char STR_DSM_RX[] ="DSM_RX";
const char STR_DEVO[] ="Devo";
const char STR_YD717[] ="YD717";
const char STR_KN[] ="KN";
const char STR_SYMAX[] ="SymaX";
const char STR_SLT[] ="SLT";
const char STR_CX10[] ="CX10";
const char STR_CG023[] ="CG023";
const char STR_BAYANG[] ="Bayang";
const char STR_FRSKYL[] ="FrSky L";
const char STR_FRSKYX[] ="FrSky X";
const char STR_FRSKYX2[] ="FrSkyX2";
const char STR_ESKY[] ="ESky";
const char STR_MT99XX[] ="MT99XX";
const char STR_MJXQ[] ="MJXq";
const char STR_SHENQI[] ="Shenqi";
const char STR_FY326[] ="FY326";
const char STR_FUTABA[] ="Futaba";
const char STR_J6PRO[] ="J6 Pro";
const char STR_JJRC345[] ="JJRC345";
const char STR_FQ777[] ="FQ777";
const char STR_ASSAN[] ="Assan";
const char STR_FRSKYV[] ="FrSky V";
const char STR_HONTAI[] ="Hontai";
const char STR_AFHDS2A[] ="FlSky2A";
const char STR_Q2X2[] ="Q2x2";
const char STR_WK2x01[] ="Walkera";
const char STR_Q303[] ="Q303";
const char STR_Q90C[] ="Q90C";
const char STR_GW008[] ="GW008";
const char STR_DM002[] ="DM002";
const char STR_CABELL[] ="Cabell";
const char STR_ESKY150[] ="Esky150";
const char STR_ESKY150V2[] ="EskyV2";
const char STR_H8_3D[] ="H8 3D";
const char STR_CORONA[] ="Corona";
const char STR_CFLIE[] ="CFlie";
const char STR_HITEC[] ="Hitec";
const char STR_WFLY[] ="WFLY";
const char STR_WFLY2[] ="WFLY2";
const char STR_BUGS[] ="Bugs";
const char STR_BUGSMINI[] ="BugMini";
const char STR_TRAXXAS[] ="Traxxas";
const char STR_NCC1701[] ="NCC1701";
const char STR_E01X[] ="E01X";
const char STR_V911S[] ="V911S";
const char STR_GD00X[] ="GD00x";
const char STR_V761[] ="V761";
const char STR_KF606[] ="KF606";
const char STR_REDPINE[] ="Redpine";
const char STR_POTENSIC[] ="Potensi";
const char STR_ZSX[] ="ZSX";
const char STR_HEIGHT[] ="Height";
const char STR_SCANNER[] ="Scanner";
const char STR_FRSKY_RX[] ="FrSkyRX";
const char STR_AFHDS2A_RX[] ="FS2A_RX";
const char STR_HOTT[] ="HoTT";
const char STR_FX816[] ="FX816";
const char STR_BAYANG_RX[] ="BayanRX";
const char STR_PELIKAN[] ="Pelikan";
const char STR_TIGER[] ="Tiger";
const char STR_XK[] ="XK";
const char STR_XN297DUMP[] ="XN297DP";
const char STR_FRSKYR9[] ="FrSkyR9";
const char STR_PROPEL[] ="Propel";
const char STR_SKYARTEC[] ="Skyartc";
const char STR_KYOSHO[] ="Kyosho";
const char STR_RLINK[] ="RadLink";
const char STR_REALACC[] ="Realacc";
const char STR_OMP[] ="OMP";
const char STR_MLINK[] ="M-Link";
const char STR_TEST[] ="Test";
const char STR_NANORF[] ="NanoRF";
const char STR_E016HV2[] ="E016Hv2";
const char STR_E010R5[] ="E010r5";
const char STR_LOLI[] ="LOLI";
const char STR_E129[] ="E129";
const char STR_SUBTYPE_FLYSKY[] = "\x04""Std\0""V9x9""V6x6""V912""CX20";
const char STR_SUBTYPE_HUBSAN[] = "\x04""H107""H301""H501";
const char STR_SUBTYPE_FRSKYD[] = "\x06""D8\0 ""Cloned";
const char STR_SUBTYPE_FRSKYX[] = "\x07""D16\0 ""D16 8ch""LBT(EU)""LBT 8ch""Cloned\0""Clo 8ch";
const char STR_SUBTYPE_HISKY[] = "\x05""Std\0 ""HK310";
const char STR_SUBTYPE_V2X2[] = "\x06""Std\0 ""JXD506""MR101\0";
const char STR_SUBTYPE_DSM[] = "\x04""2 1F""2 2F""X 1F""X 2F""Auto";
const char STR_SUBTYPE_DEVO[] = "\x04""8ch\0""10ch""12ch""6ch\0""7ch\0";
const char STR_SUBTYPE_YD717[] = "\x07""Std\0 ""SkyWlkr""Syma X4""XINXUN\0""NIHUI\0 ";
const char STR_SUBTYPE_KN[] = "\x06""WLtoys""FeiLun";
const char STR_SUBTYPE_SYMAX[] = "\x03""Std""X5C";
const char STR_SUBTYPE_SLT[] = "\x06""V1_6ch""V2_8ch""Q100\0 ""Q200\0 ""MR100\0";
const char STR_SUBTYPE_CX10[] = "\x07""Green\0 ""Blue\0 ""DM007\0 ""-\0 ""JC3015a""JC3015b""MK33041";
const char STR_SUBTYPE_CG023[] = "\x05""Std\0 ""YD829";
const char STR_SUBTYPE_BAYANG[] = "\x07""Std\0 ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4\0""QX100\0 ";
const char STR_SUBTYPE_MT99[] = "\x05""MT99\0""H7\0 ""YZ\0 ""LS\0 ""FY805""A180\0";
const char STR_SUBTYPE_MJXQ[] = "\x07""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix";
const char STR_SUBTYPE_FY326[] = "\x05""Std\0 ""FY319";
const char STR_SUBTYPE_HONTAI[] = "\x07""Std\0 ""JJRC X1""X5C1\0 ""FQ_951";
const char STR_SUBTYPE_AFHDS2A[] = "\x08""PWM,IBUS""PPM,IBUS""PWM,SBUS""PPM,SBUS""PWM,IB16""PPM,IB16""PWM,SB16""PPM,SB16";
const char STR_SUBTYPE_Q2X2[] = "\x04""Q222""Q242""Q282";
const char STR_SUBTYPE_WK2x01[] = "\x06""WK2801""WK2401""W6_5_1""W6_6_1""W6_HeL""W6_HeI";
const char STR_SUBTYPE_Q303[] = "\x06""Std\0 ""CX35\0 ""CX10D\0""CX10WD";
const char STR_SUBTYPE_CABELL[] = "\x07""V3\0 ""V3 Telm""-\0 ""-\0 ""-\0 ""-\0 ""F-Safe\0""Unbind\0";
const char STR_SUBTYPE_H83D[] = "\x07""Std\0 ""H20H\0 ""H20Mini""H30Mini";
const char STR_SUBTYPE_CORONA[] = "\x05""V1\0 ""V2\0 ""FD V3";
const char STR_SUBTYPE_HITEC[] = "\x07""Optima\0""Opt Hub""Minima\0";
const char STR_SUBTYPE_BUGS_MINI[] = "\x06""Std\0 ""Bugs3H";
const char STR_SUBTYPE_TRAXXAS[] = "\x04""6519";
const char STR_SUBTYPE_E01X[] = "\x05""E012\0""E015\0""E016H";
const char STR_SUBTYPE_GD00X[] = "\x05""GD_V1""GD_V2";
const char STR_SUBTYPE_REDPINE[] = "\x04""Fast""Slow";
const char STR_SUBTYPE_POTENSIC[] = "\x03""A20";
const char STR_SUBTYPE_ZSX[] = "\x07""280JJRC";
const char STR_SUBTYPE_HEIGHT[] = "\x03""5ch""8ch";
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_ESKY150[] = "\x03""4ch""7ch";
const char STR_SUBTYPE_ESKY150V2[] = "\x05""150V2";
const char STR_SUBTYPE_V911S[] = "\x05""V911S""E119\0";
const char STR_SUBTYPE_XK[] = "\x04""X450""X420";
const char STR_SUBTYPE_FRSKYR9[] = "\x07""915MHz\0""868MHz\0""915 8ch""868 8ch""FCC\0 ""--\0 ""FCC 8ch""-- 8ch\0";
const char STR_SUBTYPE_ESKY[] = "\x03""Std""ET4";
const char STR_SUBTYPE_PROPEL[] = "\x04""74-Z";
const char STR_SUBTYPE_FRSKY_RX[] = "\x07""RX\0 ""CloneTX""EraseTX";
const char STR_SUBTYPE_FRSKYL[] = "\x08""LR12\0 ""LR12 6ch";
const char STR_SUBTYPE_WFLY[] = "\x05""WFR0x";
const char STR_SUBTYPE_WFLY2[] = "\x05""RF20x";
const char STR_SUBTYPE_HOTT[] = "\x07""Sync\0 ""No_Sync";
const char STR_SUBTYPE_PELIKAN[] = "\x04""Pro\0""Lite";
const char STR_SUBTYPE_V761[] = "\x03""3ch""4ch";
const char STR_SUBTYPE_RLINK[] = "\x07""Surface""Air\0 ""DumboRC";
const char STR_SUBTYPE_REALACC[] = "\x03""R11";
const char STR_SUBTYPE_KYOSHO[] = "\x04""FHSS""Hype";
const char STR_SUBTYPE_FUTABA[] = "\x05""SFHSS";
const char STR_SUBTYPE_JJRC345[] = "\x08""JJRC345\0""SkyTmblr";
enum
{
OPTION_NONE,
OPTION_OPTION,
OPTION_RFTUNE,
OPTION_VIDFREQ,
OPTION_FIXEDID,
OPTION_TELEM,
OPTION_SRVFREQ,
OPTION_MAXTHR,
OPTION_RFCHAN,
OPTION_RFPOWER,
};
#define NO_SUBTYPE nullptr
const mm_protocol_definition multi_protocols[] = {
// Protocol number, Protocol String, Sub_protocol strings, Number of sub_protocols, Option type, Failsafe, ChMap, RF switch, Init, Callback
#if defined(ASSAN_NRF24L01_INO)
{PROTO_ASSAN, STR_ASSAN, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, ASSAN_init, ASSAN_callback },
#endif
#if defined(BAYANG_NRF24L01_INO)
{PROTO_BAYANG, STR_BAYANG, STR_SUBTYPE_BAYANG, 6, OPTION_TELEM, 0, 0, SW_NRF, BAYANG_init, BAYANG_callback },
#endif
#if defined(BAYANG_RX_NRF24L01_INO)
{PROTO_BAYANG_RX, STR_BAYANG_RX, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, BAYANG_RX_init, BAYANG_RX_callback },
#endif
#if defined(BUGS_A7105_INO)
{PROTO_BUGS, STR_BUGS, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_A7105, BUGS_init, BUGS_callback },
#endif
#if defined(BUGSMINI_NRF24L01_INO)
{PROTO_BUGSMINI, STR_BUGSMINI, STR_SUBTYPE_BUGS_MINI, 2, OPTION_NONE, 0, 0, SW_NRF, BUGSMINI_init, BUGSMINI_callback },
#endif
#if defined(CABELL_NRF24L01_INO)
{PROTO_CABELL, STR_CABELL, STR_SUBTYPE_CABELL, 8, OPTION_OPTION, 0, 0, SW_NRF, CABELL_init, CABELL_callback },
#endif
#if defined(CFLIE_NRF24L01_INO)
{PROTO_CFLIE, STR_CFLIE, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, CFLIE_init, CFLIE_callback }, // review protocol
#endif
#if defined(CG023_NRF24L01_INO)
{PROTO_CG023, STR_CG023, STR_SUBTYPE_CG023, 2, OPTION_NONE, 0, 0, SW_NRF, CG023_init, CG023_callback },
#endif
#if defined(CORONA_CC2500_INO)
{PROTO_CORONA, STR_CORONA, STR_SUBTYPE_CORONA, 3, OPTION_RFTUNE, 0, 0, SW_CC2500, CORONA_init, CORONA_callback },
#endif
#if defined(CX10_NRF24L01_INO)
{PROTO_CX10, STR_CX10, STR_SUBTYPE_CX10, 7, OPTION_NONE, 0, 0, SW_NRF, CX10_init, CX10_callback },
#endif
#if defined(DEVO_CYRF6936_INO)
{PROTO_DEVO, STR_DEVO, STR_SUBTYPE_DEVO, 5, OPTION_FIXEDID, 1, 1, SW_CYRF, DEVO_init, DEVO_callback },
#endif
#if defined(DM002_NRF24L01_INO)
{PROTO_DM002, STR_DM002, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, DM002_init, DM002_callback },
#endif
#if defined(DSM_CYRF6936_INO)
{PROTO_DSM, STR_DSM, STR_SUBTYPE_DSM, 5, OPTION_MAXTHR, 0, 1, SW_CYRF, DSM_init, DSM_callback },
#endif
#if defined(DSM_RX_CYRF6936_INO)
{PROTO_DSM_RX, STR_DSM_RX, NO_SUBTYPE, 0, OPTION_NONE, 0, 1, SW_CYRF, DSM_RX_init, DSM_RX_callback },
#endif
#if defined(E010R5_CYRF6936_INO)
{PROTO_E010R5, STR_E010R5, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_CYRF, E010R5_init, E010R5_callback },
#endif
#if defined(E016HV2_CC2500_INO)
{PROTO_E016HV2, STR_E016HV2, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_CC2500, E016HV2_init, E016HV2_callback },
#endif
#if defined(E01X_NRF24L01_INO)
{PROTO_E01X, STR_E01X, STR_SUBTYPE_E01X, 3, OPTION_OPTION, 0, 0, SW_NRF, E01X_init, E01X_callback },
#endif
#if defined(E129_CYRF6936_INO)
{PROTO_E129, STR_E129, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_CYRF, E129_init, E129_callback },
#endif
#if defined(ESKY_NRF24L01_INO)
{PROTO_ESKY, STR_ESKY, STR_SUBTYPE_ESKY, 2, OPTION_NONE, 0, 1, SW_NRF, ESKY_init, ESKY_callback },
#endif
#if defined(ESKY150_NRF24L01_INO)
{PROTO_ESKY150, STR_ESKY150, STR_SUBTYPE_ESKY150, 2, OPTION_NONE, 0, 0, SW_NRF, ESKY150_init, ESKY150_callback },
#endif
#if defined(ESKY150V2_CC2500_INO)
{PROTO_ESKY150V2, STR_ESKY150V2, STR_SUBTYPE_ESKY150V2, 1, OPTION_RFTUNE, 0, 1, SW_CC2500, ESKY150V2_init, ESKY150V2_callback },
#endif
#if defined(FLYSKY_A7105_INO)
{PROTO_FLYSKY, STR_FLYSKY, STR_SUBTYPE_FLYSKY, 5, OPTION_NONE, 0, 1, SW_A7105, FLYSKY_init, FLYSKY_callback },
#endif
#if defined(AFHDS2A_A7105_INO)
{PROTO_AFHDS2A, STR_AFHDS2A, STR_SUBTYPE_AFHDS2A, 8, OPTION_SRVFREQ, 1, 1, SW_A7105, AFHDS2A_init, AFHDS2A_callback },
#endif
#if defined(AFHDS2A_RX_A7105_INO)
{PROTO_AFHDS2A_RX, STR_AFHDS2A_RX,NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_A7105, AFHDS2A_RX_init, AFHDS2A_RX_callback },
#endif
#if defined(FQ777_NRF24L01_INO)
{PROTO_FQ777, STR_FQ777, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, FQ777_init, FQ777_callback },
#endif
//OpenTX 2.3.x issue: DO NOT CHANGE ORDER below
#if defined(FRSKY_RX_CC2500_INO)
{PROTO_FRSKY_RX, STR_FRSKY_RX, STR_SUBTYPE_FRSKY_RX, 3, OPTION_RFTUNE, 0, 0, SW_CC2500, FRSKY_RX_init, FRSKY_RX_callback },
#endif
#if defined(FRSKYD_CC2500_INO)
{PROTO_FRSKYD, STR_FRSKYD, STR_SUBTYPE_FRSKYD, 2, OPTION_RFTUNE, 0, 0, SW_CC2500, FRSKYD_init, FRSKYD_callback },
#endif
#if defined(FRSKYV_CC2500_INO)
{PROTO_FRSKYV, STR_FRSKYV, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_CC2500, FRSKYV_init, FRSKYV_callback },
#endif
#if defined(FRSKYX_CC2500_INO)
{PROTO_FRSKYX, STR_FRSKYX, STR_SUBTYPE_FRSKYX, 6, OPTION_RFTUNE, 1, 0, SW_CC2500, FRSKYX_init, FRSKYX_callback },
{PROTO_FRSKYX2, STR_FRSKYX2, STR_SUBTYPE_FRSKYX, 6, OPTION_RFTUNE, 1, 0, SW_CC2500, FRSKYX_init, FRSKYX_callback },
#endif
//OpenTX 2.3.x issue: DO NOT CHANGE ORDER above
#if defined(FRSKYL_CC2500_INO)
{PROTO_FRSKYL, STR_FRSKYL, STR_SUBTYPE_FRSKYL, 2, OPTION_RFTUNE, 0, 0, SW_CC2500, FRSKYL_init, FRSKYL_callback },
#endif
#if defined(FRSKYR9_SX1276_INO)
{PROTO_FRSKY_R9, STR_FRSKYR9, STR_SUBTYPE_FRSKYR9, 8, OPTION_NONE, 1, 0, 0, FRSKYR9_init, FRSKYR9_callback },
#endif
#if defined(FUTABA_CC2500_INO)
{PROTO_FUTABA, STR_FUTABA, STR_SUBTYPE_FUTABA, 1, OPTION_RFTUNE, 1, 1, SW_CC2500, SFHSS_init, SFHSS_callback },
#endif
#if defined(FX816_NRF24L01_INO)
{PROTO_FX816, STR_FX816, STR_SUBTYPE_FX816, 1, OPTION_NONE, 0, 0, SW_NRF, FX816_init, FX816_callback },
#endif
#if defined(FY326_NRF24L01_INO)
{PROTO_FY326, STR_FY326, STR_SUBTYPE_FY326, 2, OPTION_NONE, 0, 0, SW_NRF, FY326_init, FY326_callback },
#endif
#if defined(GD00X_NRF24L01_INO)
{PROTO_GD00X, STR_GD00X, STR_SUBTYPE_GD00X, 2, OPTION_RFTUNE, 0, 0, SW_NRF, GD00X_init, GD00X_callback },
#endif
#if defined(GW008_NRF24L01_INO)
{PROTO_GW008, STR_GW008, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, GW008_init, GW008_callback },
#endif
#if defined(H8_3D_NRF24L01_INO)
{PROTO_H8_3D, STR_H8_3D, STR_SUBTYPE_H83D, 4, OPTION_NONE, 0, 0, SW_NRF, H8_3D_init, H8_3D_callback },
#endif
#if defined(HEIGHT_A7105_INO)
{PROTO_HEIGHT, STR_HEIGHT, STR_SUBTYPE_HEIGHT, 2, OPTION_NONE, 0, 0, SW_A7105, HEIGHT_init, HEIGHT_callback },
#endif
#if defined(HISKY_NRF24L01_INO)
{PROTO_HISKY, STR_HISKY, STR_SUBTYPE_HISKY, 2, OPTION_NONE, 1, 1, SW_NRF, HISKY_init, HISKY_callback },
#endif
#if defined(HITEC_CC2500_INO)
{PROTO_HITEC, STR_HITEC, STR_SUBTYPE_HITEC, 3, OPTION_RFTUNE, 0, 0, SW_CC2500, HITEC_init, HITEC_callback },
#endif
#if defined(HONTAI_NRF24L01_INO)
{PROTO_HONTAI, STR_HONTAI, STR_SUBTYPE_HONTAI, 4, OPTION_NONE, 0, 0, SW_NRF, HONTAI_init, HONTAI_callback }, // review crc
#endif
#if defined(HOTT_CC2500_INO)
{PROTO_HOTT, STR_HOTT, STR_SUBTYPE_HOTT, 2, OPTION_RFTUNE, 1, 0, SW_CC2500, HOTT_init, HOTT_callback },
#endif
#if defined(HUBSAN_A7105_INO)
{PROTO_HUBSAN, STR_HUBSAN, STR_SUBTYPE_HUBSAN, 3, OPTION_VIDFREQ, 0, 0, SW_A7105, HUBSAN_init, HUBSAN_callback },
#endif
#if defined(J6PRO_CYRF6936_INO)
{PROTO_J6PRO, STR_J6PRO, NO_SUBTYPE, 0, OPTION_NONE, 0, 1, SW_CYRF, J6PRO_init, J6PRO_callback },
#endif
#if defined(JJRC345_NRF24L01_INO)
{PROTO_JJRC345, STR_JJRC345, STR_SUBTYPE_JJRC345, 2, OPTION_NONE, 0, 0, SW_NRF, JJRC345_init, JJRC345_callback },
#endif
#if defined(KF606_NRF24L01_INO)
{PROTO_KF606, STR_KF606, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, KF606_init, KF606_callback },
#endif
#if defined(KN_NRF24L01_INO)
{PROTO_KN, STR_KN, STR_SUBTYPE_KN, 2, OPTION_NONE, 0, 0, SW_NRF, KN_init, KN_callback },
#endif
#if defined(KYOSHO_A7105_INO)
{PROTO_KYOSHO, STR_KYOSHO, STR_SUBTYPE_KYOSHO, 2, OPTION_NONE, 0, 1, SW_A7105, KYOSHO_init, KYOSHO_callback },
#endif
#if defined(LOLI_NRF24L01_INO)
{PROTO_LOLI, STR_LOLI, NO_SUBTYPE, 0, OPTION_NONE, 1, 0, SW_NRF, LOLI_init, LOLI_callback },
#endif
#if defined(MJXQ_NRF24L01_INO)
{PROTO_MJXQ, STR_MJXQ, STR_SUBTYPE_MJXQ, 7, OPTION_RFTUNE, 0, 0, SW_NRF, MJXQ_init, MJXQ_callback },
#endif
#if defined(MLINK_CYRF6936_INO)
{PROTO_MLINK, STR_MLINK, NO_SUBTYPE, 0, OPTION_NONE, 1, 0, SW_CYRF, MLINK_init, MLINK_callback },
#endif
#if defined(MT99XX_NRF24L01_INO)
{PROTO_MT99XX, STR_MT99XX, STR_SUBTYPE_MT99, 6, OPTION_NONE, 0, 0, SW_NRF, MT99XX_init, MT99XX_callback },
#endif
#if defined(NCC1701_NRF24L01_INO)
{PROTO_NCC1701, STR_NCC1701, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, NCC_init, NCC_callback },
#endif
#if defined(OMP_CC2500_INO)
{PROTO_OMP, STR_OMP, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, OMP_init, OMP_callback },
#endif
#if defined(PELIKAN_A7105_INO)
{PROTO_PELIKAN, STR_PELIKAN, STR_SUBTYPE_PELIKAN, 2, OPTION_NONE, 0, 1, SW_A7105, PELIKAN_init, PELIKAN_callback },
#endif
#if defined(POTENSIC_NRF24L01_INO)
{PROTO_POTENSIC, STR_POTENSIC, STR_SUBTYPE_POTENSIC, 1, OPTION_NONE, 0, 0, SW_NRF, POTENSIC_init, POTENSIC_callback },
#endif
#if defined(PROPEL_NRF24L01_INO)
{PROTO_PROPEL, STR_PROPEL, STR_SUBTYPE_PROPEL, 1, OPTION_NONE, 0, 0, SW_NRF, PROPEL_init, PROPEL_callback },
#endif
#if defined(CX10_NRF24L01_INO)
{PROTO_Q2X2, STR_Q2X2, STR_SUBTYPE_Q2X2, 3, OPTION_NONE, 0, 0, SW_NRF, CX10_init, CX10_callback },
#endif
#if defined(Q303_NRF24L01_INO)
{PROTO_Q303, STR_Q303, STR_SUBTYPE_Q303, 4, OPTION_NONE, 0, 0, SW_NRF, Q303_init, Q303_callback },
#endif
#if defined(Q90C_NRF24L01_INO)
{PROTO_Q90C, STR_Q90C, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, Q90C_init, Q90C_callback },
#endif
#if defined(RLINK_CC2500_INO)
{PROTO_RLINK, STR_RLINK, STR_SUBTYPE_RLINK, 3, OPTION_RFTUNE, 0, 0, SW_CC2500, RLINK_init, RLINK_callback },
#endif
#if defined(REALACC_NRF24L01_INO)
{PROTO_REALACC, STR_REALACC, STR_SUBTYPE_REALACC, 1, OPTION_NONE, 0, 0, SW_NRF, REALACC_init, REALACC_callback },
#endif
#if defined(REDPINE_CC2500_INO)
{PROTO_REDPINE, STR_REDPINE, STR_SUBTYPE_REDPINE, 2, OPTION_RFTUNE, 0, 0, SW_CC2500, REDPINE_init, REDPINE_callback },
#endif
#if defined(SCANNER_CC2500_INO)
{PROTO_SCANNER, STR_SCANNER, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_CC2500, SCANNER_init, SCANNER_callback },
#endif
#if defined(SHENQI_NRF24L01_INO)
{PROTO_SHENQI, STR_SHENQI, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, SHENQI_init, SHENQI_callback },
#endif
#if defined(SKYARTEC_CC2500_INO)
{PROTO_SKYARTEC, STR_SKYARTEC, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 1, SW_CC2500, SKYARTEC_init, SKYARTEC_callback },
#endif
#if defined(SLT_NRF24L01_INO)
{PROTO_SLT, STR_SLT, STR_SUBTYPE_SLT, 5, OPTION_RFTUNE, 0, 1, SW_NRF, SLT_init, SLT_callback },
#endif
#if defined(SYMAX_NRF24L01_INO)
{PROTO_SYMAX, STR_SYMAX, STR_SUBTYPE_SYMAX, 2, OPTION_NONE, 0, 0, SW_NRF, SYMAX_init, SYMAX_callback },
#endif
#if defined(TIGER_NRF24L01_INO)
{PROTO_TIGER, STR_TIGER, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, TIGER_init, TIGER_callback },
#endif
#if defined(TRAXXAS_CYRF6936_INO)
{PROTO_TRAXXAS, STR_TRAXXAS, STR_SUBTYPE_TRAXXAS, 1, OPTION_NONE, 0, 0, SW_CYRF, TRAXXAS_init, TRAXXAS_callback },
#endif
#if defined(V2X2_NRF24L01_INO)
{PROTO_V2X2, STR_V2X2, STR_SUBTYPE_V2X2, 3, OPTION_NONE, 0, 0, SW_NRF, V2X2_init, V2X2_callback },
#endif
#if defined(V761_NRF24L01_INO)
{PROTO_V761, STR_V761, STR_SUBTYPE_V761, 2, OPTION_NONE, 0, 0, SW_NRF, V761_init, V761_callback },
#endif
#if defined(V911S_NRF24L01_INO)
{PROTO_V911S, STR_V911S, STR_SUBTYPE_V911S, 2, OPTION_RFTUNE, 0, 0, SW_NRF, V911S_init, V911S_callback },
#endif
#if defined(WK2x01_CYRF6936_INO)
{PROTO_WK2x01, STR_WK2x01, STR_SUBTYPE_WK2x01, 6, OPTION_NONE, 1, 1, SW_CYRF, WK_init, WK_callback },
#endif
#if defined(WFLY_CYRF6936_INO)
{PROTO_WFLY, STR_WFLY, STR_SUBTYPE_WFLY, 1, OPTION_NONE, 0, 0, SW_CYRF, WFLY_init, WFLY_callback },
#endif
#if defined(WFLY2_A7105_INO)
{PROTO_WFLY2, STR_WFLY2, STR_SUBTYPE_WFLY2, 1, OPTION_OPTION, 1, 0, SW_A7105, WFLY2_init, WFLY2_callback },
#endif
#if defined(XK_NRF24L01_INO)
{PROTO_XK, STR_XK, STR_SUBTYPE_XK, 2, OPTION_RFTUNE, 0, 0, SW_NRF, XK_init, XK_callback },
#endif
#if defined(XN297DUMP_NRF24L01_INO)
{PROTO_XN297DUMP, STR_XN297DUMP, STR_SUBTYPE_XN297DUMP, 5, OPTION_RFCHAN, 0, 0, SW_NRF, XN297Dump_init, XN297Dump_callback },
#endif
#if defined(YD717_NRF24L01_INO)
{PROTO_YD717, STR_YD717, STR_SUBTYPE_YD717, 5, OPTION_NONE, 0, 0, SW_NRF, YD717_init, YD717_callback },
#endif
#if defined(ZSX_NRF24L01_INO)
{PROTO_ZSX, STR_ZSX, STR_SUBTYPE_ZSX, 1, OPTION_NONE, 0, 0, SW_NRF, ZSX_init, ZSX_callback },
#endif
#if defined(TEST_CC2500_INO)
{PROTO_TEST, STR_TEST, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, TEST_init, TEST_callback },
#endif
#if defined(NANORF_NRF24L01_INO)
{PROTO_NANORF, STR_NANORF, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, NANORF_init, NANORF_callback },
#endif
{0x00, nullptr, nullptr, 0, 0, 0, 0, 0, nullptr, nullptr }
};

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 2 #define VERSION_REVISION 2
#define VERSION_PATCH_LEVEL 32 #define VERSION_PATCH_LEVEL 33
//****************** //******************
// Protocols // Protocols
@ -431,6 +431,7 @@ enum RLINK
#define AUTOBIND 1 #define AUTOBIND 1
#define NO_AUTOBIND 0 #define NO_AUTOBIND 0
//PPM protocols
struct PPM_Parameters struct PPM_Parameters
{ {
uint8_t protocol; uint8_t protocol;
@ -442,6 +443,33 @@ struct PPM_Parameters
uint32_t chan_order; uint32_t chan_order;
}; };
//Callback
typedef uint16_t (*uint16_function_t) (void); //pointer to a function with no parameters which return an uint16_t integer
typedef void (*void_function_t ) (void); //pointer to a function with no parameters which returns nothing
//Protocols definition
struct mm_protocol_definition {
uint8_t protocol;
const char *ProtoString;
const char *SubProtoString;
uint8_t nbrSubProto : 4;
uint8_t optionType : 4;
uint8_t failSafe : 1;
uint8_t chMap : 1;
uint8_t rfSwitch : 2;
void_function_t Init;
uint16_function_t CallBack;
};
extern const mm_protocol_definition multi_protocols[];
enum RF_SWITCH
{
SW_A7105 = 0, //antenna RF1
SW_CC2500 = 1, //antenna RF2
SW_NRF = 2, //antenna RF3
SW_CYRF = 3, //antenna RF4
};
// Telemetry // Telemetry
enum MultiPacketTypes enum MultiPacketTypes
{ {
@ -464,12 +492,6 @@ enum MultiPacketTypes
// Macros // Macros
#define NOP() __asm__ __volatile__("nop") #define NOP() __asm__ __volatile__("nop")
//***************
//*** Tests ***
//***************
#define IS_FAILSAFE_PROTOCOL ( (protocol==PROTO_HISKY && sub_protocol==HK310) || protocol==PROTO_AFHDS2A || protocol==PROTO_DEVO || protocol==PROTO_FUTABA || protocol==PROTO_WK2x01 || protocol== PROTO_HOTT || protocol==PROTO_FRSKYX || protocol==PROTO_FRSKYX2 || protocol==PROTO_FRSKY_R9 || protocol==PROTO_WFLY2 || protocol==PROTO_LOLI || protocol==PROTO_MLINK)
#define IS_CHMAP_PROTOCOL ( (protocol==PROTO_HISKY && sub_protocol==HK310) || protocol==PROTO_AFHDS2A || protocol==PROTO_DEVO || protocol==PROTO_FUTABA || protocol==PROTO_WK2x01 || protocol== PROTO_DSM || protocol==PROTO_SLT || protocol==PROTO_FLYSKY || (protocol==PROTO_KYOSHO && sub_protocol==KYOSHO_HYPE) || protocol==PROTO_ESKY || protocol==PROTO_J6PRO || protocol==PROTO_PELIKAN || protocol==PROTO_SKYARTEC || protocol==PROTO_ESKY150V2 || protocol==PROTO_DSM_RX)
//*************** //***************
//*** Flags *** //*** Flags ***
//*************** //***************

View File

@ -185,6 +185,8 @@ volatile uint8_t rx_ok_buff[RXBUFFER_SIZE];
volatile bool discard_frame = false; volatile bool discard_frame = false;
volatile uint8_t rx_idx=0, rx_len=0; volatile uint8_t rx_idx=0, rx_len=0;
// Callback
uint16_function_t remote_callback = 0;
// Telemetry // Telemetry
#define TELEMETRY_BUFFER_SIZE 32 #define TELEMETRY_BUFFER_SIZE 32
@ -247,18 +249,6 @@ uint8_t packet_in[TELEMETRY_BUFFER_SIZE];//telemetry receiving packets
uint16_t rx_rc_chan[16]; uint16_t rx_rc_chan[16];
#endif #endif
//Multi names
#ifdef MULTI_NAMES
struct mm_protocol_definition {
uint8_t protocol;
const char *ProtoString;
uint8_t nbrSubProto;
const char *SubProtoString;
uint8_t optionType;
};
extern const mm_protocol_definition multi_protocols[];
uint8_t multi_protocols_index=0xFF;
#endif
#ifdef HOTT_FW_TELEMETRY #ifdef HOTT_FW_TELEMETRY
uint8_t HoTT_SerialRX_val=0; uint8_t HoTT_SerialRX_val=0;
bool HoTT_SerialRX=false; bool HoTT_SerialRX=false;
@ -269,9 +259,7 @@ uint8_t packet_in[TELEMETRY_BUFFER_SIZE];//telemetry receiving packets
#endif #endif
#endif // TELEMETRY #endif // TELEMETRY
// Callback uint8_t multi_protocols_index=0xFF;
typedef uint16_t (*void_function_t) (void);//pointer to a function with no parameters which return an uint16_t integer
void_function_t remote_callback = 0;
// Init // Init
void setup() void setup()
@ -1090,11 +1078,9 @@ inline void tx_resume()
// Protocol start // Protocol start
static void protocol_init() static void protocol_init()
{ {
static uint16_t next_callback;
if(IS_WAIT_BIND_off) if(IS_WAIT_BIND_off)
{ {
remote_callback = 0; // No protocol remote_callback = 0; // No protocol
next_callback=0; // Default is immediate call back
LED_off; // Led off during protocol init LED_off; // Led off during protocol init
modules_reset(); // Reset all modules modules_reset(); // Reset all modules
crc16_polynomial = 0x1021; // Default CRC crc16_polynomial crc16_polynomial = 0x1021; // Default CRC crc16_polynomial
@ -1106,9 +1092,7 @@ static void protocol_init()
#ifdef MULTI_SYNC #ifdef MULTI_SYNC
inputRefreshRate = 0; // Don't do it unless the protocol asks for it inputRefreshRate = 0; // Don't do it unless the protocol asks for it
#endif #endif
#ifdef MULTI_NAMES
multi_protocols_index = 0xFF; multi_protocols_index = 0xFF;
#endif
tx_pause(); tx_pause();
init_frskyd_link_telemetry(); init_frskyd_link_telemetry();
pps_timer=millis(); pps_timer=millis();
@ -1148,603 +1132,34 @@ static void protocol_init()
blink=millis(); blink=millis();
PE1_on; //NRF24L01 antenna RF3 by default
PE2_off; //NRF24L01 antenna RF3 by default
switch(protocol) // Init the requested protocol
{
#ifdef A7105_INSTALLED
#if defined(FLYSKY_A7105_INO)
case PROTO_FLYSKY:
PE1_off; //antenna RF1
next_callback = initFlySky();
remote_callback = ReadFlySky;
break;
#endif
#if defined(AFHDS2A_A7105_INO)
case PROTO_AFHDS2A:
PE1_off; //antenna RF1
next_callback = initAFHDS2A();
remote_callback = ReadAFHDS2A;
break;
#endif
#if defined(HUBSAN_A7105_INO)
case PROTO_HUBSAN:
PE1_off; //antenna RF1
if(IS_BIND_BUTTON_FLAG_on) random_id(EEPROM_ID_OFFSET,true); // Generate new ID if bind button is pressed.
next_callback = initHubsan();
remote_callback = ReadHubsan;
break;
#endif
#if defined(BUGS_A7105_INO)
case PROTO_BUGS:
PE1_off; //antenna RF1
next_callback = initBUGS();
remote_callback = ReadBUGS;
break;
#endif
#if defined(HEIGHT_A7105_INO)
case PROTO_HEIGHT:
PE1_off; //antenna RF1
next_callback = initHeight();
remote_callback = ReadHeight;
break;
#endif
#if defined(AFHDS2A_RX_A7105_INO)
case PROTO_AFHDS2A_RX:
PE1_off; //antenna RF1
next_callback = initAFHDS2A_Rx();
remote_callback = AFHDS2A_Rx_callback;
break;
#endif
#if defined(PELIKAN_A7105_INO)
case PROTO_PELIKAN:
PE1_off; //antenna RF1
next_callback = initPelikan();
remote_callback = ReadPelikan;
break;
#endif
#if defined(KYOSHO_A7105_INO)
case PROTO_KYOSHO:
PE1_off; //antenna RF1
next_callback = initKyosho();
remote_callback = ReadKyosho;
break;
#endif
#if defined(WFLY2_A7105_INO)
case PROTO_WFLY2:
PE1_off; //antenna RF1
next_callback = initWFLY2();
remote_callback = ReadWFLY2;
break;
#endif
#endif
#ifdef CC2500_INSTALLED
#if defined(FRSKYD_CC2500_INO)
case PROTO_FRSKYD:
PE1_off; //antenna RF2
PE2_on;
next_callback = initFrSky_2way();
remote_callback = ReadFrSky_2way;
break;
#endif
#if defined(FRSKYL_CC2500_INO)
case PROTO_FRSKYL:
PE1_off; //antenna RF2
PE2_on;
next_callback = initFrSkyL();
remote_callback = ReadFrSkyL;
break;
#endif
#if defined(FRSKYV_CC2500_INO)
case PROTO_FRSKYV:
PE1_off; //antenna RF2
PE2_on;
next_callback = initFRSKYV();
remote_callback = ReadFRSKYV;
break;
#endif
#if defined(FRSKYX_CC2500_INO)
case PROTO_FRSKYX:
case PROTO_FRSKYX2:
#ifdef EU_MODULE
if(sub_protocol<2)
break;
#endif
PE1_off; //antenna RF2
PE2_on;
next_callback = initFrSkyX();
remote_callback = ReadFrSkyX;
break;
#endif
#if defined(FUTABA_CC2500_INO)
case PROTO_FUTABA:
PE1_off; //antenna RF2
PE2_on;
next_callback = initSFHSS();
remote_callback = ReadSFHSS;
break;
#endif
#if defined(CORONA_CC2500_INO)
case PROTO_CORONA:
PE1_off; //antenna RF2
PE2_on;
next_callback = initCORONA();
remote_callback = ReadCORONA;
break;
#endif
#if defined(SKYARTEC_CC2500_INO)
case PROTO_SKYARTEC:
PE1_off; //antenna RF2
PE2_on;
next_callback = initSKYARTEC();
remote_callback = ReadSKYARTEC;
break;
#endif
#if defined(REDPINE_CC2500_INO)
case PROTO_REDPINE:
PE1_off; //antenna RF2
PE2_on;
next_callback = initREDPINE();
remote_callback = ReadREDPINE;
break;
#endif
#if defined(HITEC_CC2500_INO)
case PROTO_HITEC:
PE1_off; //antenna RF2
PE2_on;
next_callback = initHITEC();
remote_callback = ReadHITEC;
break;
#endif
#if defined(HOTT_CC2500_INO)
case PROTO_HOTT:
PE1_off; //antenna RF2
PE2_on;
next_callback = initHOTT();
remote_callback = ReadHOTT;
break;
#endif
#if defined(SCANNER_CC2500_INO)
case PROTO_SCANNER:
PE1_off;
PE2_on; //antenna RF2
next_callback = initScanner();
remote_callback = Scanner_callback;
break;
#endif
#if defined(FRSKY_RX_CC2500_INO)
case PROTO_FRSKY_RX:
PE1_off;
PE2_on; //antenna RF2
next_callback = initFrSky_Rx();
remote_callback = FrSky_Rx_callback;
break;
#endif
#if defined(ESKY150V2_CC2500_INO)
case PROTO_ESKY150V2:
PE1_off;
PE2_on; //antenna RF2
next_callback = initESKY150V2();
remote_callback = ESKY150V2_callback;
break;
#endif
#if defined(RLINK_CC2500_INO)
case PROTO_RLINK:
PE1_off;
PE2_on; //antenna RF2
next_callback = initRLINK();
remote_callback = RLINK_callback;
break;
#endif
#if defined(E016HV2_CC2500_INO)
case PROTO_E016HV2:
PE1_off;
PE2_on; //antenna RF2
next_callback = initE016HV2();
remote_callback = E016HV2_callback;
break;
#endif
#endif
#ifdef CYRF6936_INSTALLED
#if defined(DSM_CYRF6936_INO)
case PROTO_DSM:
PE2_on; //antenna RF4
next_callback = initDsm();
remote_callback = ReadDsm;
break;
#endif
#if defined(DSM_RX_CYRF6936_INO)
case PROTO_DSM_RX:
PE2_on; //antenna RF4
next_callback = initDSM_Rx();
remote_callback = DSM_Rx_callback;
break;
#endif
#if defined(WFLY_CYRF6936_INO)
case PROTO_WFLY:
PE2_on; //antenna RF4
next_callback = initWFLY();
remote_callback = ReadWFLY;
break;
#endif
#if defined(MLINK_CYRF6936_INO)
case PROTO_MLINK:
PE2_on; //antenna RF4
next_callback = initMLINK();
remote_callback = ReadMLINK;
break;
#endif
#if defined(E010R5_CYRF6936_INO)
case PROTO_E010R5:
PE2_on; //antenna RF4
next_callback = initE010R5();
remote_callback = ReadE010R5;
break;
#endif
#if defined(E129_CYRF6936_INO)
case PROTO_E129:
PE2_on; //antenna RF4
next_callback = initE129();
remote_callback = ReadE129;
break;
#endif
#if defined(DEVO_CYRF6936_INO)
case PROTO_DEVO:
#ifdef ENABLE_PPM
if(mode_select) //PPM mode
{
if(IS_BIND_BUTTON_FLAG_on)
{
eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num),0x00); // reset to autobind mode for the current model
option=0;
}
else
{
option=eeprom_read_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num)); // load previous mode: autobind or fixed id
if(option!=1) option=0; // if not fixed id mode then it should be autobind
}
}
#endif //ENABLE_PPM
PE2_on; //antenna RF4
next_callback = DevoInit();
remote_callback = devo_callback;
break;
#endif
#if defined(WK2x01_CYRF6936_INO)
case PROTO_WK2x01:
#ifdef ENABLE_PPM
if(mode_select) //PPM mode
{
if(IS_BIND_BUTTON_FLAG_on)
{
eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num),0x00); // reset to autobind mode for the current model
option=0;
}
else
{
option=eeprom_read_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num)); // load previous mode: autobind or fixed id
if(option!=1) option=0; // if not fixed id mode then it should be autobind
}
}
#endif //ENABLE_PPM
PE2_on; //antenna RF4
next_callback = WK_setup();
remote_callback = WK_cb;
break;
#endif
#if defined(J6PRO_CYRF6936_INO)
case PROTO_J6PRO:
PE2_on; //antenna RF4
next_callback = initJ6Pro();
remote_callback = ReadJ6Pro;
break;
#endif
#if defined(TRAXXAS_CYRF6936_INO)
case PROTO_TRAXXAS:
PE2_on; //antenna RF4
next_callback = initTRAXXAS();
remote_callback = ReadTRAXXAS;
break;
#endif
#endif
#ifdef NRF24L01_INSTALLED
#if defined(HISKY_NRF24L01_INO)
case PROTO_HISKY:
next_callback=initHiSky();
remote_callback = hisky_cb;
break;
#endif
#if defined(V2X2_NRF24L01_INO)
case PROTO_V2X2:
next_callback = initV2x2();
remote_callback = ReadV2x2;
break;
#endif
#if defined(YD717_NRF24L01_INO)
case PROTO_YD717:
next_callback=initYD717();
remote_callback = yd717_callback;
break;
#endif
#if defined(KN_NRF24L01_INO)
case PROTO_KN:
next_callback = initKN();
remote_callback = kn_callback;
break;
#endif
#if defined(SYMAX_NRF24L01_INO)
case PROTO_SYMAX:
next_callback = initSymax();
remote_callback = symax_callback;
break;
#endif
#if defined(SLT_NRF24L01_INO)
case PROTO_SLT:
next_callback=initSLT();
remote_callback = SLT_callback;
break;
#endif
#if defined(CX10_NRF24L01_INO)
case PROTO_Q2X2:
sub_protocol|=0x08; // Increase the number of sub_protocols for CX-10
case PROTO_CX10:
next_callback=initCX10();
remote_callback = CX10_callback;
break;
#endif
#if defined(CG023_NRF24L01_INO)
case PROTO_CG023:
next_callback=initCG023();
remote_callback = CG023_callback;
break;
#endif
#if defined(BAYANG_NRF24L01_INO)
case PROTO_BAYANG:
next_callback=initBAYANG();
remote_callback = BAYANG_callback;
break;
#endif
#if defined(ESKY_NRF24L01_INO)
case PROTO_ESKY:
next_callback=initESKY();
remote_callback = ESKY_callback;
break;
#endif
#if defined(MT99XX_NRF24L01_INO)
case PROTO_MT99XX:
next_callback=initMT99XX();
remote_callback = MT99XX_callback;
break;
#endif
#if defined(LOLI_NRF24L01_INO)
case PROTO_LOLI:
next_callback=initLOLI();
remote_callback = LOLI_callback;
break;
#endif
#if defined(MJXQ_NRF24L01_INO)
case PROTO_MJXQ:
next_callback=initMJXQ();
remote_callback = MJXQ_callback;
break;
#endif
#if defined(SHENQI_NRF24L01_INO)
case PROTO_SHENQI:
next_callback=initSHENQI();
remote_callback = SHENQI_callback;
break;
#endif
#if defined(FY326_NRF24L01_INO)
case PROTO_FY326:
next_callback=initFY326();
remote_callback = FY326_callback;
break;
#endif
#if defined(FQ777_NRF24L01_INO)
case PROTO_FQ777:
next_callback=initFQ777();
remote_callback = FQ777_callback;
break;
#endif
#if defined(ASSAN_NRF24L01_INO)
case PROTO_ASSAN:
next_callback=initASSAN();
remote_callback = ASSAN_callback;
break;
#endif
#if defined(HONTAI_NRF24L01_INO)
case PROTO_HONTAI:
next_callback=initHONTAI();
remote_callback = HONTAI_callback;
break;
#endif
#if defined(Q303_NRF24L01_INO)
case PROTO_Q303:
next_callback=initQ303();
remote_callback = Q303_callback;
break;
#endif
#if defined(GW008_NRF24L01_INO)
case PROTO_GW008:
next_callback=initGW008();
remote_callback = GW008_callback;
break;
#endif
#if defined(DM002_NRF24L01_INO)
case PROTO_DM002:
next_callback=initDM002();
remote_callback = DM002_callback;
break;
#endif
#if defined(CABELL_NRF24L01_INO)
case PROTO_CABELL:
next_callback=initCABELL();
remote_callback = CABELL_callback;
break;
#endif
#if defined(ESKY150_NRF24L01_INO)
case PROTO_ESKY150:
next_callback=initESKY150();
remote_callback = ESKY150_callback;
break;
#endif
#if defined(H8_3D_NRF24L01_INO)
case PROTO_H8_3D:
next_callback=initH8_3D();
remote_callback = H8_3D_callback;
break;
#endif
#if defined(CFLIE_NRF24L01_INO)
case PROTO_CFLIE:
next_callback=initCFlie();
remote_callback = cflie_callback;
break;
#endif
#if defined(BUGSMINI_NRF24L01_INO)
case PROTO_BUGSMINI:
next_callback=initBUGSMINI();
remote_callback = BUGSMINI_callback;
break;
#endif
#if defined(NCC1701_NRF24L01_INO)
case PROTO_NCC1701:
next_callback=initNCC();
remote_callback = NCC_callback;
break;
#endif
#if defined(E01X_NRF24L01_INO)
case PROTO_E01X:
next_callback=initE01X();
remote_callback = E01X_callback;
break;
#endif
#if defined(V911S_NRF24L01_INO)
case PROTO_V911S:
next_callback=initV911S();
remote_callback = V911S_callback;
break;
#endif
#if defined(GD00X_NRF24L01_INO)
case PROTO_GD00X:
next_callback=initGD00X();
remote_callback = GD00X_callback;
break;
#endif
#if defined(V761_NRF24L01_INO)
case PROTO_V761:
next_callback=initV761();
remote_callback = V761_callback;
break;
#endif
#if defined(KF606_NRF24L01_INO)
case PROTO_KF606:
next_callback=initKF606();
remote_callback = KF606_callback;
break;
#endif
#if defined(POTENSIC_NRF24L01_INO)
case PROTO_POTENSIC:
next_callback=initPOTENSIC();
remote_callback = POTENSIC_callback;
break;
#endif
#if defined(ZSX_NRF24L01_INO)
case PROTO_ZSX:
next_callback=initZSX();
remote_callback = ZSX_callback;
break;
#endif
#if defined(FX816_NRF24L01_INO)
case PROTO_FX816:
next_callback=initFX816();
remote_callback = FX816_callback;
break;
#endif
#if defined(BAYANG_RX_NRF24L01_INO)
case PROTO_BAYANG_RX:
next_callback=initBayang_Rx();
remote_callback = Bayang_Rx_callback;
break;
#endif
#if defined(TIGER_NRF24L01_INO)
case PROTO_TIGER:
next_callback=initTIGER();
remote_callback = TIGER_callback;
break;
#endif
#if defined(XK_NRF24L01_INO)
case PROTO_XK:
next_callback=initXK();
remote_callback = XK_callback;
break;
#endif
#if defined(PROPEL_NRF24L01_INO)
case PROTO_PROPEL:
next_callback=initPROPEL();
remote_callback = PROPEL_callback;
break;
#endif
#if defined(XN297DUMP_NRF24L01_INO)
case PROTO_XN297DUMP:
next_callback=initXN297Dump();
remote_callback = XN297Dump_callback;
break;
#endif
#if defined(JJRC345_NRF24L01_INO)
case PROTO_JJRC345:
next_callback=initJJRC345();
remote_callback = JJRC345_callback;
break;
#endif
#if defined(Q90C_NRF24L01_INO)
case PROTO_Q90C:
next_callback=initQ90C();
remote_callback = Q90C_callback;
break;
#endif
#if defined(REALACC_NRF24L01_INO)
case PROTO_REALACC:
next_callback=initREALACC();
remote_callback = REALACC_callback;
break;
#endif
#if defined(OMP_CC2500_INO)
case PROTO_OMP:
next_callback=initOMP();
remote_callback = OMP_callback;
break;
#endif
#if defined(TEST_CC2500_INO)
case PROTO_TEST:
next_callback=initTEST();
remote_callback = TEST_callback;
break;
#endif
#if defined(NANORF_NRF24L01_INO)
case PROTO_NANORF:
next_callback=initNANORF();
remote_callback = NANORF_callback;
break;
#endif
#endif
#ifdef SX1276_INSTALLED
#if defined(FRSKYR9_SX1276_INO)
case PROTO_FRSKY_R9:
next_callback = initFrSkyR9();
remote_callback = FrSkyR9_callback;
break;
#endif
#endif
}
debugln("Protocol selected: %d, sub proto %d, rxnum %d, option %d", protocol, sub_protocol, RX_num, option); debugln("Protocol selected: %d, sub proto %d, rxnum %d, option %d", protocol, sub_protocol, RX_num, option);
#ifdef MULTI_NAMES
uint8_t index=0; uint8_t index=0;
#if defined(FRSKYX_CC2500_INO) && defined(EU_MODULE)
if( ! ( (protocol == PROTO_FRSKYX || protocol == PROTO_FRSKYX2) && sub_protocol < 2 ) )
#endif
while(multi_protocols[index].protocol != 0) while(multi_protocols[index].protocol != 0)
{ {
if(multi_protocols[index].protocol==protocol) if(multi_protocols[index].protocol==protocol)
{ {
multi_protocols_index=index; //Save index
multi_protocols_index = index;
//Set the RF switch
switch(multi_protocols[multi_protocols_index].rfSwitch)
{
case SW_CC2500:
PE2_on;
break;
case SW_CYRF:
PE2_on;
case SW_NRF:
PE1_on;
break;
}
//Init protocol
multi_protocols[multi_protocols_index].Init();
//Save call back function address
remote_callback = multi_protocols[multi_protocols_index].CallBack;
//Send a telemetry status right now
SEND_MULTI_STATUS_on; SEND_MULTI_STATUS_on;
#ifdef DEBUG_SERIAL #ifdef DEBUG_SERIAL
debug("Proto=%s",multi_protocols[multi_protocols_index].ProtoString); debug("Proto=%s",multi_protocols[multi_protocols_index].ProtoString);
@ -1758,12 +1173,14 @@ static void protocol_init()
debug("%c",multi_protocols[multi_protocols_index].SubProtoString[j+offset]); debug("%c",multi_protocols[multi_protocols_index].SubProtoString[j+offset]);
} }
debugln(", Opt=%d",multi_protocols[multi_protocols_index].optionType); debugln(", Opt=%d",multi_protocols[multi_protocols_index].optionType);
debugln(", FS=%d",multi_protocols[multi_protocols_index].failSafe);
debugln(", CHMap=%d",multi_protocols[multi_protocols_index].chMap);
debugln(", rfSw=%d",multi_protocols[multi_protocols_index].rfSwitch);
#endif #endif
break; break;
} }
index++; index++;
} }
#endif
} }
#if defined(WAIT_FOR_BIND) && defined(ENABLE_BIND_CH) #if defined(WAIT_FOR_BIND) && defined(ENABLE_BIND_CH)
@ -1776,14 +1193,9 @@ static void protocol_init()
WAIT_BIND_off; WAIT_BIND_off;
CHANGE_PROTOCOL_FLAG_off; CHANGE_PROTOCOL_FLAG_off;
if(next_callback>32000) //Wait 5ms after protocol init
{ // next_callback should not be more than 32767 so we will wait here...
uint16_t temp=(next_callback>>10)-2;
delayMilliseconds(temp);
next_callback-=temp<<10; // between 2-3ms left at this stage
}
cli(); // disable global int cli(); // disable global int
OCR1A = TCNT1 + next_callback*2; // set compare A for callback OCR1A = TCNT1 + 5000*2; // set compare A for callback
#ifndef STM32_BOARD #ifndef STM32_BOARD
TIFR1 = OCF1A_bm ; // clear compare A flag TIFR1 = OCF1A_bm ; // clear compare A flag
#else #else
@ -1973,8 +1385,9 @@ void update_serial_data()
cur_protocol[i] = rx_ok_buff[i]; cur_protocol[i] = rx_ok_buff[i];
//disable channel mapping //disable channel mapping
if(!IS_CHMAP_PROTOCOL) //not a protocol supporting ch map to be disabled if(multi_protocols[multi_protocols_index].chMap == 0)
DISABLE_CH_MAP_off; DISABLE_CH_MAP_off; //not a protocol supporting ch map to be disabled
if(prev_ch_mapping!=IS_DISABLE_CH_MAP_on) if(prev_ch_mapping!=IS_DISABLE_CH_MAP_on)
{ {
prev_ch_mapping=IS_DISABLE_CH_MAP_on; prev_ch_mapping=IS_DISABLE_CH_MAP_on;

View File

@ -31,7 +31,7 @@ enum {
NCC_RX3, NCC_RX3,
}; };
static void __attribute__((unused)) NCC_init() static void __attribute__((unused)) NCC_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -247,7 +247,7 @@ const uint8_t PROGMEM NCC_TX_DATA[][6]= {
{ 0xC2, 0x93, 0x55, 0x44, 0x4C, 0x0B }, { 0xC2, 0x93, 0x55, 0x44, 0x4C, 0x0B },
}; };
uint16_t initNCC(void) void NCC_init(void)
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
@ -269,9 +269,8 @@ uint16_t initNCC(void)
hopping_frequency[4]=0x08; // bind channel 1 hopping_frequency[4]=0x08; // bind channel 1
hopping_frequency[5]=0x2A; // bind channel 2 hopping_frequency[5]=0x2A; // bind channel 2
hopping_frequency_no=4; // start with bind hopping_frequency_no=4; // start with bind
NCC_init(); NCC_RF_init();
phase=NCC_BIND_TX1; phase=NCC_BIND_TX1;
return 10000;
} }
#endif #endif

View File

@ -42,7 +42,7 @@ static void __attribute__((unused)) NANORF_send_packet()
} }
static void __attribute__((unused)) NANORF_init() static void __attribute__((unused)) NANORF_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -63,11 +63,10 @@ uint16_t NANORF_callback()
return NANORF_PACKET_PERIOD; return NANORF_PACKET_PERIOD;
} }
uint16_t initNANORF() void NANORF_init()
{ {
BIND_DONE; BIND_DONE;
NANORF_init(); NANORF_RF_init();
return NANORF_INITIAL_WAIT;
} }
#endif #endif

View File

@ -106,7 +106,7 @@ static void __attribute__((unused)) OMP_send_packet()
XN297L_WriteEnhancedPayload(packet, OMP_PAYLOAD_SIZE, packet_sent!=0); XN297L_WriteEnhancedPayload(packet, OMP_PAYLOAD_SIZE, packet_sent!=0);
} }
static void __attribute__((unused)) OMP_init() static void __attribute__((unused)) OMP_RF_init()
{ {
//Config CC2500 //Config CC2500
#ifdef OMP_HUB_TELEMETRY #ifdef OMP_HUB_TELEMETRY
@ -278,10 +278,10 @@ uint16_t OMP_callback()
return OMP_PACKET_PERIOD; return OMP_PACKET_PERIOD;
} }
uint16_t initOMP() void OMP_init()
{ {
OMP_initialize_txid(); OMP_initialize_txid();
OMP_init(); OMP_RF_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
packet_sent = 0; packet_sent = 0;
#ifdef OMP_HUB_TELEMETRY #ifdef OMP_HUB_TELEMETRY
@ -295,7 +295,6 @@ uint16_t initOMP()
} }
else else
phase = OMP_PREPDATA; phase = OMP_PREPDATA;
return OMP_INITIAL_WAIT;
} }
#endif #endif

View File

@ -71,7 +71,7 @@ static void __attribute__((unused)) POTENSIC_send_packet()
NRF24L01_SetPower(); NRF24L01_SetPower();
} }
static void __attribute__((unused)) POTENSIC_init() static void __attribute__((unused)) POTENSIC_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -116,13 +116,12 @@ uint16_t POTENSIC_callback()
return POTENSIC_PACKET_PERIOD; return POTENSIC_PACKET_PERIOD;
} }
uint16_t initPOTENSIC(void) void POTENSIC_init(void)
{ {
bind_counter = POTENSIC_BIND_COUNT; bind_counter = POTENSIC_BIND_COUNT;
POTENSIC_initialize_txid(); POTENSIC_initialize_txid();
POTENSIC_init(); POTENSIC_RF_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
return POTENSIC_INITIAL_WAIT;
} }
#endif #endif

View File

@ -110,7 +110,7 @@ static void __attribute__((unused)) pelikan_build_packet()
A7105_SetPower(); A7105_SetPower();
} }
uint16_t ReadPelikan() uint16_t PELIKAN_callback()
{ {
if(phase==0) if(phase==0)
{ {
@ -242,7 +242,7 @@ const uint8_t PROGMEM pelikan_lite_hopp[][PELIKAN_NUM_RF_CHAN] = {
}; };
#endif #endif
uint16_t initPelikan() void PELIKAN_init()
{ {
A7105_Init(); A7105_Init();
if(IS_BIND_IN_PROGRESS || sub_protocol==PELIKAN_LITE) if(IS_BIND_IN_PROGRESS || sub_protocol==PELIKAN_LITE)
@ -288,6 +288,5 @@ uint16_t initPelikan()
hopping_frequency_no=PELIKAN_NUM_RF_CHAN; hopping_frequency_no=PELIKAN_NUM_RF_CHAN;
packet_count=5; packet_count=5;
phase=0; phase=0;
return 2400;
} }
#endif #endif

View File

@ -155,7 +155,7 @@ static void __attribute__((unused)) PROPEL_data_packet()
NRF24L01_WritePayload(packet, PROPEL_PACKET_SIZE); NRF24L01_WritePayload(packet, PROPEL_PACKET_SIZE);
} }
static void __attribute__((unused)) PROPEL_init() static void __attribute__((unused)) PROPEL_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x7f); NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x7f);
@ -281,14 +281,13 @@ uint16_t PROPEL_callback()
return PROPEL_PACKET_PERIOD; return PROPEL_PACKET_PERIOD;
} }
uint16_t initPROPEL() void PROPEL_init()
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
PROPEL_initialize_txid(); PROPEL_initialize_txid();
PROPEL_init(); PROPEL_RF_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
phase=PROPEL_BIND1; phase=PROPEL_BIND1;
return PROPEL_INITIAL_WAIT;
} }
#endif #endif

View File

@ -281,7 +281,7 @@ static void __attribute__((unused)) Q303_send_packet(uint8_t bind)
NRF24L01_SetPower(); // Set tx_power NRF24L01_SetPower(); // Set tx_power
} }
static void __attribute__((unused)) Q303_init() static void __attribute__((unused)) Q303_RF_init()
{ {
const uint8_t bind_address[] = {0xcc,0xcc,0xcc,0xcc,0xcc}; const uint8_t bind_address[] = {0xcc,0xcc,0xcc,0xcc,0xcc};
@ -377,10 +377,10 @@ uint16_t Q303_callback()
return packet_period; return packet_period;
} }
uint16_t initQ303() void Q303_init()
{ {
Q303_initialize_txid(); Q303_initialize_txid();
Q303_init(); Q303_RF_init();
bind_counter = Q303_BIND_COUNT; bind_counter = Q303_BIND_COUNT;
switch(sub_protocol) switch(sub_protocol)
{ {
@ -407,7 +407,6 @@ uint16_t initQ303()
} }
hopping_frequency_no = 0; hopping_frequency_no = 0;
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
return Q303_INITIAL_WAIT;
} }
#endif #endif

View File

@ -131,7 +131,7 @@ static void __attribute__((unused)) Q90C_initialize_txid()
crc8=rx_tx_addr[0]^rx_tx_addr[1]^rx_tx_addr[2]^rx_tx_addr[3]; crc8=rx_tx_addr[0]^rx_tx_addr[1]^rx_tx_addr[2]^rx_tx_addr[3];
} }
static void __attribute__((unused)) Q90C_init() static void __attribute__((unused)) Q90C_RF_init()
{ {
XN297L_Init(); XN297L_Init();
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
@ -157,10 +157,10 @@ uint16_t Q90C_callback()
return Q90C_PACKET_PERIOD; return Q90C_PACKET_PERIOD;
} }
uint16_t initQ90C() void Q90C_init()
{ {
Q90C_initialize_txid(); Q90C_initialize_txid();
Q90C_init(); Q90C_RF_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
packet_count = 0; packet_count = 0;
bind_counter=Q90C_BIND_COUNT; bind_counter=Q90C_BIND_COUNT;
@ -170,7 +170,6 @@ uint16_t initQ90C()
Q90C_VTX=CH6_SW; Q90C_VTX=CH6_SW;
packet[8] = 0x00; packet[8] = 0x00;
packet[9] = 0x00; packet[9] = 0x00;
return Q90C_INITIAL_WAIT;
} }
#endif #endif

View File

@ -86,7 +86,7 @@ static void __attribute__((unused)) REALACC_initialize_txid()
#endif #endif
} }
static void __attribute__((unused)) REALACC_init() static void __attribute__((unused)) REALACC_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -124,14 +124,13 @@ uint16_t REALACC_callback()
return REALACC_PACKET_PERIOD; return REALACC_PACKET_PERIOD;
} }
uint16_t initREALACC() void REALACC_init()
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
REALACC_initialize_txid(); REALACC_initialize_txid();
REALACC_init(); REALACC_RF_init();
bind_counter=REALACC_BIND_COUNT; bind_counter=REALACC_BIND_COUNT;
hopping_frequency_no=0; hopping_frequency_no=0;
return REALACC_INITIAL_WAIT;
} }
#endif #endif

View File

@ -95,7 +95,7 @@ static void __attribute__((unused)) RLINK_hop()
hopping_frequency[rf_ch_num]=12*16+inc; hopping_frequency[rf_ch_num]=12*16+inc;
} }
static void __attribute__((unused)) RLINK_init() static void __attribute__((unused)) RLINK_TXID_init()
{ {
#ifdef RLINK_FORCE_ID #ifdef RLINK_FORCE_ID
//surface RC6GS //surface RC6GS
@ -296,14 +296,13 @@ uint16_t RLINK_callback()
return 0; return 0;
} }
uint16_t initRLINK() void RLINK_init()
{ {
BIND_DONE; // Not a TX bind protocol BIND_DONE; // Not a TX bind protocol
RLINK_init(); RLINK_TXID_init();
RLINK_rf_init(); RLINK_rf_init();
packet_count = 0; packet_count = 0;
phase = RLINK_DATA; phase = RLINK_DATA;
return 10000;
} }
#endif #endif

View File

@ -96,13 +96,13 @@ static void REDPINE_data_frame() {
packet[10] = REDPINE_LOOPTIME_SLOW; packet[10] = REDPINE_LOOPTIME_SLOW;
} }
static uint16_t ReadREDPINE() uint16_t REDPINE_callback()
{ {
CC2500_SetFreqOffset(); CC2500_SetFreqOffset();
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
{ {
if (state == REDPINE_BIND) { if (state == REDPINE_BIND) {
REDPINE_init(0); REDPINE_RF_init(0);
} }
REDPINE_set_channel(49); REDPINE_set_channel(49);
CC2500_SetTxRxMode(TX_EN); CC2500_SetTxRxMode(TX_EN);
@ -114,7 +114,7 @@ static uint16_t ReadREDPINE()
if(--bind_counter==0) if(--bind_counter==0)
{ {
BIND_DONE; BIND_DONE;
REDPINE_init(sub_protocol); REDPINE_RF_init(sub_protocol);
} }
return 4000; return 4000;
} }
@ -171,7 +171,7 @@ static const uint8_t REDPINE_init_data[][3] = {
{CC2500_3E_PATABLE, 0xff, 0xff} {CC2500_3E_PATABLE, 0xff, 0xff}
}; };
static void REDPINE_init(uint8_t format) static void REDPINE_RF_init(uint8_t format)
{ {
CC2500_Reset(); CC2500_Reset();
@ -195,7 +195,7 @@ static void REDPINE_init(uint8_t format)
} }
} }
static uint16_t initREDPINE() void REDPINE_init()
{ {
hopping_frequency_no = 0; hopping_frequency_no = 0;
// Used from kn_nrf24l01.c : kn_calculate_freqency_hopping_channels // Used from kn_nrf24l01.c : kn_calculate_freqency_hopping_channels
@ -228,8 +228,7 @@ static uint16_t initREDPINE()
packet_period = REDPINE_LOOPTIME_SLOW*1000; packet_period = REDPINE_LOOPTIME_SLOW*1000;
bind_counter=REDPINE_BIND; bind_counter=REDPINE_BIND;
REDPINE_init(sub_protocol); REDPINE_RF_init(sub_protocol);
CC2500_SetTxRxMode(TX_EN); // enable PA CC2500_SetTxRxMode(TX_EN); // enable PA
return 10000;
} }
#endif #endif

View File

@ -29,7 +29,7 @@ const uint8_t PROGMEM SHENQI_Freq[] = {
10,60,10,50,30,40, 10,60,10,50,30,40,
20,10,40,30,60,20 }; 20,10,40,30,60,20 };
void SHENQI_init() void SHENQI_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit
@ -116,14 +116,13 @@ uint16_t SHENQI_callback()
return packet_period; return packet_period;
} }
uint16_t initSHENQI() void SHENQI_init()
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
SHENQI_init(); SHENQI_RF_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
packet_count=0; packet_count=0;
packet_period=500; packet_period=500;
return 1000;
} }
#endif #endif

View File

@ -52,7 +52,7 @@ enum {
SLT_BIND2, SLT_BIND2,
}; };
static void __attribute__((unused)) SLT_init() static void __attribute__((unused)) SLT_RF_init()
{ {
NRF250K_Init(); NRF250K_Init();
NRF250K_SetTXAddr(rx_tx_addr, SLT_TXID_SIZE); NRF250K_SetTXAddr(rx_tx_addr, SLT_TXID_SIZE);
@ -258,7 +258,7 @@ uint16_t SLT_callback()
return 19000; return 19000;
} }
uint16_t initSLT() void SLT_init()
{ {
BIND_DONE; // Not a TX bind protocol BIND_DONE; // Not a TX bind protocol
packet_count = 0; packet_count = 0;
@ -273,10 +273,9 @@ uint16_t initSLT()
/* rx_tx_addr[0]=0x01;rx_tx_addr[1]=0x02;rx_tx_addr[2]=0x0B;rx_tx_addr[3]=0x57;*/ /* rx_tx_addr[0]=0x01;rx_tx_addr[1]=0x02;rx_tx_addr[2]=0x0B;rx_tx_addr[3]=0x57;*/
#endif #endif
} }
SLT_init(); SLT_RF_init();
SLT_set_freq(); SLT_set_freq();
phase = SLT_BUILD; phase = SLT_BUILD;
return 50000;
} }
#endif #endif

View File

@ -93,7 +93,7 @@ static int __attribute__((unused)) Scanner_scan_rssi()
return rssi_rel; return rssi_rel;
} }
uint16_t Scanner_callback() uint16_t SCANNER_callback()
{ {
uint8_t rssi,max_rssi; uint8_t rssi,max_rssi;
@ -131,7 +131,7 @@ uint16_t Scanner_callback()
return 0; return 0;
} }
uint16_t initScanner(void) void SCANNER_init(void)
{ {
rf_ch_num = 0; rf_ch_num = 0;
telemetry_link = 0; telemetry_link = 0;
@ -141,7 +141,6 @@ uint16_t initScanner(void)
CC2500_Strobe(CC2500_SIDLE); CC2500_Strobe(CC2500_SIDLE);
CC2500_SetTxRxMode(RX_EN); CC2500_SetTxRxMode(RX_EN);
CC2500_Strobe(CC2500_SRX); // Receive mode CC2500_Strobe(CC2500_SRX); // Receive mode
return 1250;
} }
#endif #endif

View File

@ -120,7 +120,7 @@ static void __attribute__((unused)) SKYARTEC_send_bind_packet()
CC2500_WriteData(packet, 12); CC2500_WriteData(packet, 12);
} }
uint16_t ReadSKYARTEC() uint16_t SKYARTEC_callback()
{ {
if (phase & 0x01) if (phase & 0x01)
{ {
@ -154,7 +154,7 @@ uint16_t ReadSKYARTEC()
return 3000; return 3000;
} }
uint16_t initSKYARTEC() void SKYARTEC_init()
{ {
SKYARTEC_rf_init(); SKYARTEC_rf_init();
@ -168,7 +168,6 @@ uint16_t initSKYARTEC()
bind_counter = 250; bind_counter = 250;
phase = SKYARTEC_PKT1; phase = SKYARTEC_PKT1;
return 10000;
} }
#endif #endif

View File

@ -189,7 +189,7 @@ static void __attribute__((unused)) SYMAX_send_packet(uint8_t bind)
NRF24L01_SetPower(); // Set tx_power NRF24L01_SetPower(); // Set tx_power
} }
static void __attribute__((unused)) symax_init() static void __attribute__((unused)) symax_rf_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
// //
@ -331,7 +331,7 @@ static uint8_t chans_data_x5c[] = {0x1d, 0x2f, 0x26, 0x3d, 0x15, 0x2b, 0x25, 0x2
packet_count = 0; packet_count = 0;
} }
uint16_t symax_callback() uint16_t SYMAX_callback()
{ {
switch (phase) switch (phase)
{ {
@ -368,14 +368,13 @@ uint16_t symax_callback()
return SYMAX_PACKET_PERIOD; return SYMAX_PACKET_PERIOD;
} }
uint16_t initSymax() void SYMAX_init()
{ {
packet_count = 0; packet_count = 0;
flags = 0; flags = 0;
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
symax_init(); symax_rf_init();
phase = SYMAX_INIT1; phase = SYMAX_INIT1;
return SYMAX_INITIAL_WAIT;
} }
#endif #endif

View File

@ -43,7 +43,7 @@ uint16_t TEST_callback()
return TEST_PACKET_PERIOD>>1; return TEST_PACKET_PERIOD>>1;
} }
uint16_t initTEST() void TEST_init()
{ {
option=1; option=1;
@ -57,7 +57,6 @@ uint16_t initTEST()
phase=0; phase=0;
for(uint8_t i=0; i<TEST_PAYLOAD_SIZE; i++) for(uint8_t i=0; i<TEST_PAYLOAD_SIZE; i++)
packet[i]= i; packet[i]= i;
return TEST_INITIAL_WAIT;
} }
#endif #endif

View File

@ -97,7 +97,7 @@ static void __attribute__((unused)) TRAXXAS_send_data_packet()
CYRF_WriteDataPacketLen(packet, TRAXXAS_PACKET_SIZE); CYRF_WriteDataPacketLen(packet, TRAXXAS_PACKET_SIZE);
} }
uint16_t ReadTRAXXAS() uint16_t TRAXXAS_callback()
{ {
uint8_t status; uint8_t status;
@ -171,10 +171,8 @@ uint16_t ReadTRAXXAS()
return 13940; return 13940;
} }
uint16_t initTRAXXAS() void TRAXXAS_init()
{ {
CYRF_Reset();
//Config CYRF registers //Config CYRF registers
for(uint8_t i = 0; i < sizeof(TRAXXAS_init_vals) / 2; i++) for(uint8_t i = 0; i < sizeof(TRAXXAS_init_vals) / 2; i++)
CYRF_WriteRegister(pgm_read_byte_near(&TRAXXAS_init_vals[i][0]), pgm_read_byte_near(&TRAXXAS_init_vals[i][1])); CYRF_WriteRegister(pgm_read_byte_near(&TRAXXAS_init_vals[i][0]), pgm_read_byte_near(&TRAXXAS_init_vals[i][1]));
@ -199,7 +197,6 @@ uint16_t initTRAXXAS()
} }
else else
phase = TRAXXAS_PREP_DATA; phase = TRAXXAS_PREP_DATA;
return 1000;
} }
/* /*

View File

@ -143,12 +143,15 @@ static void multi_send_status()
else else
if (IS_BIND_IN_PROGRESS) if (IS_BIND_IN_PROGRESS)
flags |= 0x08; flags |= 0x08;
if(IS_CHMAP_PROTOCOL) if(multi_protocols_index != 0xFF)
{
if(multi_protocols[multi_protocols_index].chMap)
flags |= 0x40; //Disable_ch_mapping supported flags |= 0x40; //Disable_ch_mapping supported
#ifdef FAILSAFE_ENABLE #ifdef FAILSAFE_ENABLE
if(IS_FAILSAFE_PROTOCOL) if(multi_protocols[multi_protocols_index].failSafe)
flags |= 0x20; //Failsafe supported flags |= 0x20; //Failsafe supported
#endif #endif
}
if(IS_DATA_BUFFER_LOW_on) if(IS_DATA_BUFFER_LOW_on)
flags |= 0x80; flags |= 0x80;
} }

View File

@ -88,7 +88,7 @@ static void __attribute__((unused)) TIGER_send_packet()
NRF24L01_SetPower(); NRF24L01_SetPower();
} }
static void __attribute__((unused)) TIGER_init() static void __attribute__((unused)) TIGER_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -142,14 +142,13 @@ uint16_t TIGER_callback()
return TIGER_PACKET_PERIOD; return TIGER_PACKET_PERIOD;
} }
uint16_t initTIGER() void TIGER_init()
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
TIGER_initialize_txid(); TIGER_initialize_txid();
TIGER_init(); TIGER_RF_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
bind_counter=TIGER_BIND_COUNT; bind_counter=TIGER_BIND_COUNT;
return TIGER_INITIAL_WAIT;
} }
#endif #endif

View File

@ -70,7 +70,7 @@ const uint8_t PROGMEM freq_hopping[][16] = {
0x18, 0x2A, 0x21, 0x38, 0x10, 0x26, 0x20, 0x1F } // 03 0x18, 0x2A, 0x21, 0x38, 0x10, 0x26, 0x20, 0x1F } // 03
}; };
static void __attribute__((unused)) v202_init() static void __attribute__((unused)) V2X2_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
@ -241,7 +241,7 @@ static void __attribute__((unused)) V2X2_send_packet()
NRF24L01_SetPower(); NRF24L01_SetPower();
} }
uint16_t ReadV2x2() uint16_t V2X2_callback()
{ {
//if (packet_sent && NRF24L01_packet_ack() != PKT_ACKED) //if (packet_sent && NRF24L01_packet_ack() != PKT_ACKED)
// return V2X2_PACKET_CHKTIME; // return V2X2_PACKET_CHKTIME;
@ -268,7 +268,7 @@ uint16_t ReadV2x2()
return V2X2_PACKET_PERIOD; return V2X2_PACKET_PERIOD;
} }
uint16_t initV2x2() void V2X2_init()
{ {
if(sub_protocol==V2X2_MR101) if(sub_protocol==V2X2_MR101)
BIND_IN_PROGRESS; BIND_IN_PROGRESS;
@ -276,9 +276,8 @@ uint16_t initV2x2()
hopping_frequency_no = 0; hopping_frequency_no = 0;
bind_counter = V2X2_BIND_COUNT; bind_counter = V2X2_BIND_COUNT;
v202_init(); V2X2_RF_init();
V2X2_set_tx_id(); V2X2_set_tx_id();
return 50000;
} }
#endif #endif

View File

@ -123,7 +123,7 @@ static void __attribute__((unused)) V761_send_packet()
NRF24L01_SetPower(); NRF24L01_SetPower();
} }
static void __attribute__((unused)) V761_init() static void __attribute__((unused)) V761_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -224,7 +224,7 @@ uint16_t V761_callback()
return V761_PACKET_PERIOD; return V761_PACKET_PERIOD;
} }
uint16_t initV761(void) void V761_init(void)
{ {
V761_initialize_txid(); V761_initialize_txid();
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
@ -238,10 +238,9 @@ uint16_t initV761(void)
phase = V761_DATA; phase = V761_DATA;
} }
V761_init(); V761_RF_init();
hopping_frequency_no = 0; hopping_frequency_no = 0;
packet_count = 0; packet_count = 0;
return V761_INITIAL_WAIT;
} }
#endif #endif

View File

@ -110,7 +110,7 @@ static void __attribute__((unused)) V911S_send_packet(uint8_t bind)
XN297L_SetFreqOffset(); // Set frequency offset XN297L_SetFreqOffset(); // Set frequency offset
} }
static void __attribute__((unused)) V911S_init() static void __attribute__((unused)) V911S_RF_init()
{ {
XN297L_Init(); XN297L_Init();
if(sub_protocol==V911S_STD) if(sub_protocol==V911S_STD)
@ -161,7 +161,7 @@ uint16_t V911S_callback()
return packet_period; return packet_period;
} }
uint16_t initV911S(void) void V911S_init(void)
{ {
V911S_initialize_txid(); V911S_initialize_txid();
#ifdef V911S_ORIGINAL_ID #ifdef V911S_ORIGINAL_ID
@ -191,7 +191,7 @@ uint16_t initV911S(void)
} }
#endif #endif
V911S_init(); V911S_RF_init();
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
{ {
@ -204,7 +204,6 @@ uint16_t initV911S(void)
packet_period= V911S_PACKET_PERIOD; packet_period= V911S_PACKET_PERIOD;
} }
hopping_frequency_no=0; hopping_frequency_no=0;
return V911S_INITIAL_WAIT;
} }
#endif #endif

View File

@ -411,9 +411,6 @@
#undef HITEC_HUB_TELEMETRY #undef HITEC_HUB_TELEMETRY
#undef HITEC_FW_TELEMETRY #undef HITEC_FW_TELEMETRY
#endif #endif
#if not defined(FRSKYD_CC2500_INO)
#undef HUB_TELEMETRY
#endif
#if not defined(FRSKYX_CC2500_INO) && not defined(FRSKYR9_SX1276_INO) #if not defined(FRSKYX_CC2500_INO) && not defined(FRSKYR9_SX1276_INO)
#undef SPORT_TELEMETRY #undef SPORT_TELEMETRY
#undef SPORT_SEND #undef SPORT_SEND
@ -436,6 +433,10 @@
#if not defined(LOLI_NRF24L01_INO) #if not defined(LOLI_NRF24L01_INO)
#undef LOLI_HUB_TELEMETRY #undef LOLI_HUB_TELEMETRY
#endif #endif
#if not defined(FRSKYD_CC2500_INO) && not defined(MLINK_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY)
//protocols using FRSKYD user frames
#undef HUB_TELEMETRY
#endif
#if not defined(HOTT_FW_TELEMETRY) && not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BUGS_HUB_TELEMETRY) && not defined(NCC1701_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(RLINK_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) && not defined(HITEC_HUB_TELEMETRY) && not defined(HITEC_FW_TELEMETRY) && not defined(SCANNER_TELEMETRY) && not defined(FRSKY_RX_TELEMETRY) && not defined(AFHDS2A_RX_TELEMETRY) && not defined(BAYANG_RX_TELEMETRY) && not defined(DEVO_HUB_TELEMETRY) && not defined(PROPEL_HUB_TELEMETRY) && not defined(OMP_HUB_TELEMETRY) && not defined(WFLY2_HUB_TELEMETRY) && not defined(LOLI_HUB_TELEMETRY) && not defined(MLINK_HUB_TELEMETRY) #if not defined(HOTT_FW_TELEMETRY) && not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BUGS_HUB_TELEMETRY) && not defined(NCC1701_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(RLINK_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) && not defined(HITEC_HUB_TELEMETRY) && not defined(HITEC_FW_TELEMETRY) && not defined(SCANNER_TELEMETRY) && not defined(FRSKY_RX_TELEMETRY) && not defined(AFHDS2A_RX_TELEMETRY) && not defined(BAYANG_RX_TELEMETRY) && not defined(DEVO_HUB_TELEMETRY) && not defined(PROPEL_HUB_TELEMETRY) && not defined(OMP_HUB_TELEMETRY) && not defined(WFLY2_HUB_TELEMETRY) && not defined(LOLI_HUB_TELEMETRY) && not defined(MLINK_HUB_TELEMETRY)
#undef TELEMETRY #undef TELEMETRY
#undef INVERT_TELEMETRY #undef INVERT_TELEMETRY
@ -453,9 +454,6 @@
#if not defined(MULTI_TELEMETRY) #if not defined(MULTI_TELEMETRY)
#undef MULTI_SYNC #undef MULTI_SYNC
#undef MULTI_NAMES
#else
#define MULTI_NAMES
#endif #endif
//Make sure TX is defined correctly //Make sure TX is defined correctly

View File

@ -206,7 +206,7 @@ static void __attribute__((unused)) WFLY2_build_packet()
#define WFLY2_BUFFER_TIME 1500 //1500 #define WFLY2_BUFFER_TIME 1500 //1500
#define WFLY2_WRITE_TIME 800 //942 #define WFLY2_WRITE_TIME 800 //942
uint16_t ReadWFLY2() uint16_t WFLY2_callback()
{ {
uint16_t start; uint16_t start;
uint8_t status; uint8_t status;
@ -310,7 +310,7 @@ uint16_t ReadWFLY2()
return WFLY2_PACKET_PERIOD; // never reached, please the compiler return WFLY2_PACKET_PERIOD; // never reached, please the compiler
} }
uint16_t initWFLY2() void WFLY2_init()
{ {
A7105_Init(); A7105_Init();
@ -336,6 +336,5 @@ uint16_t initWFLY2()
packet_count = 0; packet_count = 0;
telemetry_lost = 1; telemetry_lost = 1;
#endif #endif
return 2000;
} }
#endif #endif

View File

@ -150,7 +150,7 @@ static uint16_t __attribute__((unused)) WFLY_send_data_packet()
return 1093; // case 3 return 1093; // case 3
} }
uint16_t ReadWFLY() uint16_t WFLY_callback()
{ {
uint8_t status,len,sum=0,check=0; uint8_t status,len,sum=0,check=0;
uint8_t start; uint8_t start;
@ -244,7 +244,7 @@ uint16_t ReadWFLY()
return 1000; return 1000;
} }
uint16_t initWFLY() void WFLY_init()
{ {
//Random start channel //Random start channel
uint8_t ch=0x0A+random(0xfefefefe)%0x0E; uint8_t ch=0x0A+random(0xfefefefe)%0x0E;
@ -291,7 +291,6 @@ uint16_t initWFLY()
} }
else else
phase = WFLY_PREP_DATA; phase = WFLY_PREP_DATA;
return 10000;
} }
#endif #endif

View File

@ -431,7 +431,7 @@ static void __attribute__((unused)) WK_BuildPacket_2401()
WK_build_data_pkt_2401(); WK_build_data_pkt_2401();
} }
uint16_t WK_cb() uint16_t WK_callback()
{ {
if (packet_sent == 0) if (packet_sent == 0)
{ {
@ -465,8 +465,24 @@ uint16_t WK_cb()
return 1200; return 1200;
} }
uint16_t WK_setup() void WK_init()
{ {
#ifdef ENABLE_PPM
if(mode_select) //PPM mode
{
if(IS_BIND_BUTTON_FLAG_on)
{
eeprom_write_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num),0x00); // reset to autobind mode for the current model
option=0;
}
else
{
option=eeprom_read_byte((EE_ADDR)(MODELMODE_EEPROM_OFFSET+RX_num)); // load previous mode: autobind or fixed id
if(option!=1) option=0; // if not fixed id mode then it should be autobind
}
}
#endif //ENABLE_PPM
wk2x01_cyrf_init(); wk2x01_cyrf_init();
CYRF_SetTxRxMode(TX_EN); CYRF_SetTxRxMode(TX_EN);
@ -497,7 +513,6 @@ uint16_t WK_setup()
phase = WK_BOUND_1; phase = WK_BOUND_1;
BIND_DONE; BIND_DONE;
} }
return 2800;
} }
#endif #endif

View File

@ -186,7 +186,7 @@ static void __attribute__((unused)) XK_initialize_txid()
#endif #endif
} }
static void __attribute__((unused)) XK_init() static void __attribute__((unused)) XK_RF_init()
{ {
XN297L_Init(); XN297L_Init();
XN297L_SetTXAddr((uint8_t*)"\x68\x94\xA6\xD5\xC3", 5); // Bind address XN297L_SetTXAddr((uint8_t*)"\x68\x94\xA6\xD5\xC3", 5); // Bind address
@ -210,18 +210,17 @@ uint16_t XK_callback()
return XK_PACKET_PERIOD; return XK_PACKET_PERIOD;
} }
uint16_t initXK() void XK_init()
{ {
if(sub_protocol==X420) if(sub_protocol==X420)
option=prev_option=0; // Forcing the use of NRF24L01@1Mbps option=prev_option=0; // Forcing the use of NRF24L01@1Mbps
BIND_IN_PROGRESS; // Autobind protocol BIND_IN_PROGRESS; // Autobind protocol
XK_initialize_txid(); XK_initialize_txid();
XK_init(); XK_RF_init();
if(sub_protocol==X420) if(sub_protocol==X420)
NRF24L01_SetBitrate(NRF24L01_BR_1M); // X420/X520 runs @1Mbps NRF24L01_SetBitrate(NRF24L01_BR_1M); // X420/X520 runs @1Mbps
hopping_frequency_no = 0; hopping_frequency_no = 0;
bind_counter=XK_BIND_COUNT; bind_counter=XK_BIND_COUNT;
return XK_INITIAL_WAIT;
} }
#endif #endif

View File

@ -38,7 +38,7 @@ boolean ack;
uint8_t pid; uint8_t pid;
uint8_t bitrate; uint8_t bitrate;
static void __attribute__((unused)) XN297Dump_init() static void __attribute__((unused)) XN297Dump_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(RX_EN); NRF24L01_SetTxRxMode(RX_EN);
@ -284,7 +284,7 @@ static uint16_t XN297Dump_callback()
case 0: case 0:
debugln("------------------------"); debugln("------------------------");
debugln("Detecting XN297 packets."); debugln("Detecting XN297 packets.");
XN297Dump_init(); XN297Dump_RF_init();
debug("Trying RF channel: 0"); debug("Trying RF channel: 0");
hopping_frequency_no=0; hopping_frequency_no=0;
bitrate=0; bitrate=0;
@ -301,7 +301,7 @@ static uint16_t XN297Dump_callback()
bitrate++; bitrate++;
bitrate%=3; bitrate%=3;
debugln(""); debugln("");
XN297Dump_init(); XN297Dump_RF_init();
debug("Trying RF channel: 0"); debug("Trying RF channel: 0");
} }
if(hopping_frequency_no) if(hopping_frequency_no)
@ -756,7 +756,7 @@ static uint16_t XN297Dump_callback()
return 100; return 100;
} }
uint16_t initXN297Dump(void) void XN297Dump_init(void)
{ {
BIND_DONE; BIND_DONE;
if(sub_protocol<XN297DUMP_AUTO) if(sub_protocol<XN297DUMP_AUTO)
@ -766,12 +766,11 @@ uint16_t initXN297Dump(void)
address_length=RX_num; address_length=RX_num;
if(address_length<3||address_length>5) if(address_length<3||address_length>5)
address_length=5; //default address_length=5; //default
XN297Dump_init(); XN297Dump_RF_init();
bind_counter=0; bind_counter=0;
rf_ch_num=0xFF; rf_ch_num=0xFF;
prev_option=option^0x55; prev_option=option^0x55;
phase=0; // init phase=0; // init
return XN297DUMP_INITIAL_WAIT;
} }
#endif #endif

View File

@ -12,7 +12,7 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>. along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
*/ */
// Last sync with hexfet new_protocols/yd717_nrf24l01.c dated 2015-09-28 // Last sync with hexfet new_protocols/YD717_nrf24l01.c dated 2015-09-28
#if defined(YD717_NRF24L01_INO) #if defined(YD717_NRF24L01_INO)
@ -33,10 +33,10 @@
#define YD717_PAYLOADSIZE 8 // receive data pipes set to this size, but unused #define YD717_PAYLOADSIZE 8 // receive data pipes set to this size, but unused
static void __attribute__((unused)) yd717_send_packet(uint8_t bind) static void __attribute__((unused)) YD717_send_packet()
{ {
uint8_t rudder_trim, elevator_trim, aileron_trim; uint8_t rudder_trim, elevator_trim, aileron_trim;
if (bind) if (IS_BIND_IN_PROGRESS)
{ {
packet[0]= rx_tx_addr[0]; // send data phase address in first 4 bytes packet[0]= rx_tx_addr[0]; // send data phase address in first 4 bytes
packet[1]= rx_tx_addr[1]; packet[1]= rx_tx_addr[1];
@ -117,7 +117,7 @@ static void __attribute__((unused)) yd717_send_packet(uint8_t bind)
NRF24L01_SetPower(); // Set tx_power NRF24L01_SetPower(); // Set tx_power
} }
static void __attribute__((unused)) yd717_init() static void __attribute__((unused)) YD717_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
@ -152,42 +152,32 @@ static void __attribute__((unused)) yd717_init()
NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, bind_rx_tx_addr, 5); NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, bind_rx_tx_addr, 5);
} }
uint16_t yd717_callback() uint16_t YD717_callback()
{ {
if(IS_BIND_DONE) if (bind_counter)
{ {
#ifdef MULTI_SYNC bind_counter--;
telemetry_set_input_sync(YD717_PACKET_PERIOD); if(bind_counter==0)
#endif
yd717_send_packet(0);
}
else
{
if (bind_counter == 0)
{ {
NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, 5); // set address NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, 5); // set address
NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rx_tx_addr, 5); NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rx_tx_addr, 5);
yd717_send_packet(0);
BIND_DONE; // bind complete BIND_DONE; // bind complete
} }
}
else else
{ #ifdef MULTI_SYNC
yd717_send_packet(1); telemetry_set_input_sync(YD717_PACKET_PERIOD);
bind_counter--; #endif
} YD717_send_packet();
}
return YD717_PACKET_PERIOD; // Packet every 8ms return YD717_PACKET_PERIOD; // Packet every 8ms
} }
uint16_t initYD717() void YD717_init()
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
rx_tx_addr[4] = 0xC1; // always uses first data port rx_tx_addr[4] = 0xC1; // always uses first data port
yd717_init(); YD717_RF_init();
bind_counter = YD717_BIND_COUNT; bind_counter = YD717_BIND_COUNT;
// Call callback in 50ms
return YD717_INITIAL_WAIT;
} }
#endif #endif

View File

@ -63,7 +63,7 @@ static void __attribute__((unused)) ZSX_initialize_txid()
#endif #endif
} }
static void __attribute__((unused)) ZSX_init() static void __attribute__((unused)) ZSX_RF_init()
{ {
NRF24L01_Initialize(); NRF24L01_Initialize();
NRF24L01_SetTxRxMode(TX_EN); NRF24L01_SetTxRxMode(TX_EN);
@ -94,13 +94,12 @@ uint16_t ZSX_callback()
return ZSX_PACKET_PERIOD; return ZSX_PACKET_PERIOD;
} }
uint16_t initZSX() void ZSX_init()
{ {
BIND_IN_PROGRESS; // autobind protocol BIND_IN_PROGRESS; // autobind protocol
ZSX_initialize_txid(); ZSX_initialize_txid();
ZSX_init(); ZSX_RF_init();
bind_counter=ZSX_BIND_COUNT; bind_counter=ZSX_BIND_COUNT;
return ZSX_INITIAL_WAIT;
} }
#endif #endif