mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-07-12 09:47:54 +00:00
Renamed CX100 to QX100 and fixed the sub selection
This commit is contained in:
parent
50f1eca4be
commit
16585467f0
@ -1,370 +1,370 @@
|
|||||||
/*
|
/*
|
||||||
This project is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Multiprotocol is distributed in the hope that it will be useful,
|
Multiprotocol is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
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/>.
|
||||||
*/
|
*/
|
||||||
// Compatible with EAchine H8 mini, H10, BayangToys X6/X7/X9, JJRC JJ850 ...
|
// Compatible with EAchine H8 mini, H10, BayangToys X6/X7/X9, JJRC JJ850 ...
|
||||||
// Last sync with hexfet new_protocols/bayang_nrf24l01.c dated 2015-12-22
|
// Last sync with hexfet new_protocols/bayang_nrf24l01.c dated 2015-12-22
|
||||||
|
|
||||||
#if defined(BAYANG_NRF24L01_INO)
|
#if defined(BAYANG_NRF24L01_INO)
|
||||||
|
|
||||||
#include "iface_nrf24l01.h"
|
#include "iface_nrf24l01.h"
|
||||||
|
|
||||||
#define BAYANG_BIND_COUNT 1000
|
#define BAYANG_BIND_COUNT 1000
|
||||||
#define BAYANG_PACKET_PERIOD 2000
|
#define BAYANG_PACKET_PERIOD 2000
|
||||||
#define BAYANG_PACKET_TELEM_PERIOD 5000
|
#define BAYANG_PACKET_TELEM_PERIOD 5000
|
||||||
#define BAYANG_INITIAL_WAIT 500
|
#define BAYANG_INITIAL_WAIT 500
|
||||||
#define BAYANG_PACKET_SIZE 15
|
#define BAYANG_PACKET_SIZE 15
|
||||||
#define BAYANG_RF_NUM_CHANNELS 4
|
#define BAYANG_RF_NUM_CHANNELS 4
|
||||||
#define BAYANG_RF_BIND_CHANNEL 0
|
#define BAYANG_RF_BIND_CHANNEL 0
|
||||||
#define BAYANG_RF_BIND_CHANNEL_X16_AH 10
|
#define BAYANG_RF_BIND_CHANNEL_X16_AH 10
|
||||||
#define BAYANG_ADDRESS_LENGTH 5
|
#define BAYANG_ADDRESS_LENGTH 5
|
||||||
|
|
||||||
enum BAYANG_FLAGS {
|
enum BAYANG_FLAGS {
|
||||||
// flags going to packet[2]
|
// flags going to packet[2]
|
||||||
BAYANG_FLAG_RTH = 0x01,
|
BAYANG_FLAG_RTH = 0x01,
|
||||||
BAYANG_FLAG_HEADLESS = 0x02,
|
BAYANG_FLAG_HEADLESS = 0x02,
|
||||||
BAYANG_FLAG_FLIP = 0x08,
|
BAYANG_FLAG_FLIP = 0x08,
|
||||||
BAYANG_FLAG_VIDEO = 0x10,
|
BAYANG_FLAG_VIDEO = 0x10,
|
||||||
BAYANG_FLAG_PICTURE = 0x20,
|
BAYANG_FLAG_PICTURE = 0x20,
|
||||||
// flags going to packet[3]
|
// flags going to packet[3]
|
||||||
BAYANG_FLAG_INVERTED = 0x80, // inverted flight on Floureon H101
|
BAYANG_FLAG_INVERTED = 0x80, // inverted flight on Floureon H101
|
||||||
BAYANG_FLAG_TAKE_OFF = 0x20, // take off / landing on X16 AH
|
BAYANG_FLAG_TAKE_OFF = 0x20, // take off / landing on X16 AH
|
||||||
BAYANG_FLAG_EMG_STOP = 0x04|0x08, // 0x08 for VISUO XS809H-W-HD-G
|
BAYANG_FLAG_EMG_STOP = 0x04|0x08, // 0x08 for VISUO XS809H-W-HD-G
|
||||||
};
|
};
|
||||||
|
|
||||||
enum BAYANG_OPTION_FLAGS {
|
enum BAYANG_OPTION_FLAGS {
|
||||||
BAYANG_OPTION_FLAG_TELEMETRY = 0x01,
|
BAYANG_OPTION_FLAG_TELEMETRY = 0x01,
|
||||||
BAYANG_OPTION_FLAG_ANALOGAUX = 0x02,
|
BAYANG_OPTION_FLAG_ANALOGAUX = 0x02,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __attribute__((unused)) BAYANG_send_packet()
|
static void __attribute__((unused)) BAYANG_send_packet()
|
||||||
{
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
if (IS_BIND_IN_PROGRESS)
|
if (IS_BIND_IN_PROGRESS)
|
||||||
{
|
{
|
||||||
#ifdef BAYANG_HUB_TELEMETRY
|
#ifdef BAYANG_HUB_TELEMETRY
|
||||||
if(option & BAYANG_OPTION_FLAG_TELEMETRY)
|
if(option & BAYANG_OPTION_FLAG_TELEMETRY)
|
||||||
if(option & BAYANG_OPTION_FLAG_ANALOGAUX)
|
if(option & BAYANG_OPTION_FLAG_ANALOGAUX)
|
||||||
packet[0]= 0xA1; // telemetry and analog aux are enabled
|
packet[0]= 0xA1; // telemetry and analog aux are enabled
|
||||||
else
|
else
|
||||||
packet[0]= 0xA3; // telemetry is enabled
|
packet[0]= 0xA3; // telemetry is enabled
|
||||||
else if(option & BAYANG_OPTION_FLAG_ANALOGAUX)
|
else if(option & BAYANG_OPTION_FLAG_ANALOGAUX)
|
||||||
packet[0]= 0xA2; // analog aux is enabled
|
packet[0]= 0xA2; // analog aux is enabled
|
||||||
else
|
else
|
||||||
#else
|
#else
|
||||||
if(option & BAYANG_OPTION_FLAG_ANALOGAUX)
|
if(option & BAYANG_OPTION_FLAG_ANALOGAUX)
|
||||||
packet[0]= 0xA2; // analog aux is enabled
|
packet[0]= 0xA2; // analog aux is enabled
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
packet[0]= 0xA4;
|
packet[0]= 0xA4;
|
||||||
if(sub_protocol==CX100)
|
if(sub_protocol==QX100)
|
||||||
packet[0] = 0x53;
|
packet[0] = 0x53;
|
||||||
|
|
||||||
for(i=0;i<5;i++)
|
for(i=0;i<5;i++)
|
||||||
packet[i+1]=rx_tx_addr[i];
|
packet[i+1]=rx_tx_addr[i];
|
||||||
for(i=0;i<4;i++)
|
for(i=0;i<4;i++)
|
||||||
packet[i+6]=hopping_frequency[i];
|
packet[i+6]=hopping_frequency[i];
|
||||||
switch (sub_protocol)
|
switch (sub_protocol)
|
||||||
{
|
{
|
||||||
case CX100:
|
case QX100:
|
||||||
case X16_AH:
|
case X16_AH:
|
||||||
packet[10] = 0x00;
|
packet[10] = 0x00;
|
||||||
packet[11] = 0x00;
|
packet[11] = 0x00;
|
||||||
break;
|
break;
|
||||||
case IRDRONE:
|
case IRDRONE:
|
||||||
packet[10] = 0x30;
|
packet[10] = 0x30;
|
||||||
packet[11] = 0x01;
|
packet[11] = 0x01;
|
||||||
break;
|
break;
|
||||||
case DHD_D4:
|
case DHD_D4:
|
||||||
packet[10] = 0xC8;
|
packet[10] = 0xC8;
|
||||||
packet[11] = 0x99;
|
packet[11] = 0x99;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
packet[10] = rx_tx_addr[0]; // txid[0]
|
packet[10] = rx_tx_addr[0]; // txid[0]
|
||||||
packet[11] = rx_tx_addr[1]; // txid[1]
|
packet[11] = rx_tx_addr[1]; // txid[1]
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
uint16_t val;
|
uint16_t val;
|
||||||
uint8_t dyntrim = 1;
|
uint8_t dyntrim = 1;
|
||||||
switch (sub_protocol)
|
switch (sub_protocol)
|
||||||
{
|
{
|
||||||
case X16_AH:
|
case X16_AH:
|
||||||
case IRDRONE:
|
case IRDRONE:
|
||||||
packet[0] = 0xA6;
|
packet[0] = 0xA6;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
packet[0] = 0xA5;
|
packet[0] = 0xA5;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (option & BAYANG_OPTION_FLAG_ANALOGAUX)
|
if (option & BAYANG_OPTION_FLAG_ANALOGAUX)
|
||||||
{
|
{
|
||||||
// Analog aux channel 1 (channel 14)
|
// Analog aux channel 1 (channel 14)
|
||||||
packet[1] = convert_channel_8b(CH14);
|
packet[1] = convert_channel_8b(CH14);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
packet[1] = 0xFA; // normal mode is 0xF7, expert 0xFa , D4 normal is 0xF4
|
packet[1] = 0xFA; // normal mode is 0xF7, expert 0xFa , D4 normal is 0xF4
|
||||||
|
|
||||||
//Flags packet[2]
|
//Flags packet[2]
|
||||||
packet[2] = 0x00;
|
packet[2] = 0x00;
|
||||||
if(CH5_SW)
|
if(CH5_SW)
|
||||||
packet[2] = BAYANG_FLAG_FLIP;
|
packet[2] = BAYANG_FLAG_FLIP;
|
||||||
if(CH6_SW)
|
if(CH6_SW)
|
||||||
packet[2] |= BAYANG_FLAG_RTH;
|
packet[2] |= BAYANG_FLAG_RTH;
|
||||||
if(CH7_SW)
|
if(CH7_SW)
|
||||||
packet[2] |= BAYANG_FLAG_PICTURE;
|
packet[2] |= BAYANG_FLAG_PICTURE;
|
||||||
if(CH8_SW)
|
if(CH8_SW)
|
||||||
packet[2] |= BAYANG_FLAG_VIDEO;
|
packet[2] |= BAYANG_FLAG_VIDEO;
|
||||||
if(CH9_SW)
|
if(CH9_SW)
|
||||||
{
|
{
|
||||||
packet[2] |= BAYANG_FLAG_HEADLESS;
|
packet[2] |= BAYANG_FLAG_HEADLESS;
|
||||||
dyntrim = 0;
|
dyntrim = 0;
|
||||||
}
|
}
|
||||||
//Flags packet[3]
|
//Flags packet[3]
|
||||||
packet[3] = 0x00;
|
packet[3] = 0x00;
|
||||||
if(CH10_SW)
|
if(CH10_SW)
|
||||||
packet[3] = BAYANG_FLAG_INVERTED;
|
packet[3] = BAYANG_FLAG_INVERTED;
|
||||||
if(CH11_SW)
|
if(CH11_SW)
|
||||||
dyntrim = 0;
|
dyntrim = 0;
|
||||||
if(CH12_SW)
|
if(CH12_SW)
|
||||||
packet[3] |= BAYANG_FLAG_TAKE_OFF;
|
packet[3] |= BAYANG_FLAG_TAKE_OFF;
|
||||||
if(CH13_SW)
|
if(CH13_SW)
|
||||||
packet[3] |= BAYANG_FLAG_EMG_STOP;
|
packet[3] |= BAYANG_FLAG_EMG_STOP;
|
||||||
//Aileron
|
//Aileron
|
||||||
val = convert_channel_10b(AILERON);
|
val = convert_channel_10b(AILERON);
|
||||||
packet[4] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C);
|
packet[4] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C);
|
||||||
packet[5] = val & 0xFF;
|
packet[5] = val & 0xFF;
|
||||||
//Elevator
|
//Elevator
|
||||||
val = convert_channel_10b(ELEVATOR);
|
val = convert_channel_10b(ELEVATOR);
|
||||||
packet[6] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C);
|
packet[6] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C);
|
||||||
packet[7] = val & 0xFF;
|
packet[7] = val & 0xFF;
|
||||||
//Throttle
|
//Throttle
|
||||||
val = convert_channel_10b(THROTTLE);
|
val = convert_channel_10b(THROTTLE);
|
||||||
packet[8] = (val>>8) + 0x7C;
|
packet[8] = (val>>8) + 0x7C;
|
||||||
packet[9] = val & 0xFF;
|
packet[9] = val & 0xFF;
|
||||||
//Rudder
|
//Rudder
|
||||||
val = convert_channel_10b(RUDDER);
|
val = convert_channel_10b(RUDDER);
|
||||||
packet[10] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C);
|
packet[10] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C);
|
||||||
packet[11] = val & 0xFF;
|
packet[11] = val & 0xFF;
|
||||||
}
|
}
|
||||||
switch (sub_protocol)
|
switch (sub_protocol)
|
||||||
{
|
{
|
||||||
case H8S3D:
|
case H8S3D:
|
||||||
packet[12] = rx_tx_addr[2]; // txid[2]
|
packet[12] = rx_tx_addr[2]; // txid[2]
|
||||||
packet[13] = 0x34;
|
packet[13] = 0x34;
|
||||||
break;
|
break;
|
||||||
case CX100:
|
case QX100:
|
||||||
case X16_AH:
|
case X16_AH:
|
||||||
packet[12] = 0;
|
packet[12] = 0;
|
||||||
packet[13] = 0;
|
packet[13] = 0;
|
||||||
break;
|
break;
|
||||||
case IRDRONE:
|
case IRDRONE:
|
||||||
packet[12] = 0xE0;
|
packet[12] = 0xE0;
|
||||||
packet[13] = 0x2E;
|
packet[13] = 0x2E;
|
||||||
break;
|
break;
|
||||||
case DHD_D4:
|
case DHD_D4:
|
||||||
packet[12] = 0x37; //0x17 during bind
|
packet[12] = 0x37; //0x17 during bind
|
||||||
packet[13] = 0xED;
|
packet[13] = 0xED;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
packet[12] = rx_tx_addr[2]; // txid[2]
|
packet[12] = rx_tx_addr[2]; // txid[2]
|
||||||
if (option & BAYANG_OPTION_FLAG_ANALOGAUX)
|
if (option & BAYANG_OPTION_FLAG_ANALOGAUX)
|
||||||
{ // Analog aux channel 2 (channel 15)
|
{ // Analog aux channel 2 (channel 15)
|
||||||
packet[13] = convert_channel_8b(CH15);
|
packet[13] = convert_channel_8b(CH15);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
packet[13] = 0x0A;
|
packet[13] = 0x0A;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
packet[14] = 0;
|
packet[14] = 0;
|
||||||
for (uint8_t i=0; i < BAYANG_PACKET_SIZE-1; i++)
|
for (uint8_t i=0; i < BAYANG_PACKET_SIZE-1; i++)
|
||||||
packet[14] += packet[i];
|
packet[14] += packet[i];
|
||||||
|
|
||||||
NRF24L01_WriteReg(NRF24L01_05_RF_CH, IS_BIND_IN_PROGRESS ? rf_ch_num:hopping_frequency[hopping_frequency_no++]);
|
NRF24L01_WriteReg(NRF24L01_05_RF_CH, IS_BIND_IN_PROGRESS ? rf_ch_num:hopping_frequency[hopping_frequency_no++]);
|
||||||
hopping_frequency_no%=BAYANG_RF_NUM_CHANNELS;
|
hopping_frequency_no%=BAYANG_RF_NUM_CHANNELS;
|
||||||
|
|
||||||
// Power on, TX mode, 2byte CRC
|
// Power on, TX mode, 2byte CRC
|
||||||
// Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing
|
// Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing
|
||||||
NRF24L01_FlushTx();
|
NRF24L01_FlushTx();
|
||||||
NRF24L01_SetTxRxMode(TX_EN);
|
NRF24L01_SetTxRxMode(TX_EN);
|
||||||
XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP));
|
XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP));
|
||||||
XN297_WritePayload(packet, BAYANG_PACKET_SIZE);
|
XN297_WritePayload(packet, BAYANG_PACKET_SIZE);
|
||||||
|
|
||||||
NRF24L01_SetPower(); // Set tx_power
|
NRF24L01_SetPower(); // Set tx_power
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAYANG_HUB_TELEMETRY
|
#ifdef BAYANG_HUB_TELEMETRY
|
||||||
static void __attribute__((unused)) BAYANG_check_rx(void)
|
static void __attribute__((unused)) BAYANG_check_rx(void)
|
||||||
{
|
{
|
||||||
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 model
|
{ // data received from model
|
||||||
XN297_ReadPayload(packet, BAYANG_PACKET_SIZE);
|
XN297_ReadPayload(packet, BAYANG_PACKET_SIZE);
|
||||||
NRF24L01_WriteReg(NRF24L01_07_STATUS, 255);
|
NRF24L01_WriteReg(NRF24L01_07_STATUS, 255);
|
||||||
|
|
||||||
NRF24L01_FlushRx();
|
NRF24L01_FlushRx();
|
||||||
uint8_t check = packet[0];
|
uint8_t check = packet[0];
|
||||||
for (uint8_t i=1; i < BAYANG_PACKET_SIZE-1; i++)
|
for (uint8_t i=1; i < BAYANG_PACKET_SIZE-1; i++)
|
||||||
check += packet[i];
|
check += packet[i];
|
||||||
// decode data , check sum is ok as well, since there is no crc
|
// decode data , check sum is ok as well, since there is no crc
|
||||||
if (packet[0] == 0x85 && packet[14] == check)
|
if (packet[0] == 0x85 && packet[14] == check)
|
||||||
{
|
{
|
||||||
// uncompensated battery volts*100/2
|
// uncompensated battery volts*100/2
|
||||||
v_lipo1 = (packet[3]<<7) + (packet[4]>>2);
|
v_lipo1 = (packet[3]<<7) + (packet[4]>>2);
|
||||||
// compensated battery volts*100/2
|
// compensated battery volts*100/2
|
||||||
v_lipo2 = (packet[5]<<7) + (packet[6]>>2);
|
v_lipo2 = (packet[5]<<7) + (packet[6]>>2);
|
||||||
// reception in packets / sec
|
// reception in packets / sec
|
||||||
RX_LQI = packet[7];
|
RX_LQI = packet[7];
|
||||||
RX_RSSI = RX_LQI;
|
RX_RSSI = RX_LQI;
|
||||||
//Flags
|
//Flags
|
||||||
//uint8_t flags = packet[3] >> 3;
|
//uint8_t flags = packet[3] >> 3;
|
||||||
// battery low: flags & 1
|
// battery low: flags & 1
|
||||||
telemetry_counter++;
|
telemetry_counter++;
|
||||||
if(telemetry_lost==0)
|
if(telemetry_lost==0)
|
||||||
telemetry_link=1;
|
telemetry_link=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NRF24L01_SetTxRxMode(TXRX_OFF);
|
NRF24L01_SetTxRxMode(TXRX_OFF);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void __attribute__((unused)) BAYANG_init()
|
static void __attribute__((unused)) BAYANG_init()
|
||||||
{
|
{
|
||||||
NRF24L01_Initialize();
|
NRF24L01_Initialize();
|
||||||
NRF24L01_SetTxRxMode(TX_EN);
|
NRF24L01_SetTxRxMode(TX_EN);
|
||||||
|
|
||||||
XN297_SetTXAddr((uint8_t *)"\x00\x00\x00\x00\x00", BAYANG_ADDRESS_LENGTH);
|
XN297_SetTXAddr((uint8_t *)"\x00\x00\x00\x00\x00", BAYANG_ADDRESS_LENGTH);
|
||||||
|
|
||||||
NRF24L01_FlushTx();
|
NRF24L01_FlushTx();
|
||||||
NRF24L01_FlushRx();
|
NRF24L01_FlushRx();
|
||||||
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
|
||||||
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowldgement on all data pipes
|
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowldgement on all data pipes
|
||||||
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 only
|
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 only
|
||||||
NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, BAYANG_PACKET_SIZE);
|
NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, BAYANG_PACKET_SIZE);
|
||||||
NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps
|
NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps
|
||||||
NRF24L01_WriteReg(NRF24L01_04_SETUP_RETR, 0x00); // No retransmits
|
NRF24L01_WriteReg(NRF24L01_04_SETUP_RETR, 0x00); // No retransmits
|
||||||
NRF24L01_SetPower();
|
NRF24L01_SetPower();
|
||||||
NRF24L01_Activate(0x73); // Activate feature register
|
NRF24L01_Activate(0x73); // Activate feature register
|
||||||
NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes
|
NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes
|
||||||
NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x01);
|
NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x01);
|
||||||
NRF24L01_Activate(0x73);
|
NRF24L01_Activate(0x73);
|
||||||
|
|
||||||
switch (sub_protocol)
|
switch (sub_protocol)
|
||||||
{
|
{
|
||||||
case X16_AH:
|
case X16_AH:
|
||||||
case IRDRONE:
|
case IRDRONE:
|
||||||
rf_ch_num = BAYANG_RF_BIND_CHANNEL_X16_AH;
|
rf_ch_num = BAYANG_RF_BIND_CHANNEL_X16_AH;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
rf_ch_num = BAYANG_RF_BIND_CHANNEL;
|
rf_ch_num = BAYANG_RF_BIND_CHANNEL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
BAYANG_BIND=0,
|
BAYANG_BIND=0,
|
||||||
BAYANG_WRITE,
|
BAYANG_WRITE,
|
||||||
BAYANG_CHECK,
|
BAYANG_CHECK,
|
||||||
BAYANG_READ,
|
BAYANG_READ,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define BAYANG_CHECK_DELAY 1000 // Time after write phase to check write complete
|
#define BAYANG_CHECK_DELAY 1000 // Time after write phase to check write complete
|
||||||
#define BAYANG_READ_DELAY 600 // Time before read phase
|
#define BAYANG_READ_DELAY 600 // Time before read phase
|
||||||
|
|
||||||
uint16_t BAYANG_callback()
|
uint16_t BAYANG_callback()
|
||||||
{
|
{
|
||||||
#ifdef BAYANG_HUB_TELEMETRY
|
#ifdef BAYANG_HUB_TELEMETRY
|
||||||
uint16_t start;
|
uint16_t start;
|
||||||
#endif
|
#endif
|
||||||
switch(phase)
|
switch(phase)
|
||||||
{
|
{
|
||||||
case BAYANG_BIND:
|
case BAYANG_BIND:
|
||||||
if (--bind_counter == 0)
|
if (--bind_counter == 0)
|
||||||
{
|
{
|
||||||
XN297_SetTXAddr(rx_tx_addr, BAYANG_ADDRESS_LENGTH);
|
XN297_SetTXAddr(rx_tx_addr, BAYANG_ADDRESS_LENGTH);
|
||||||
#ifdef BAYANG_HUB_TELEMETRY
|
#ifdef BAYANG_HUB_TELEMETRY
|
||||||
XN297_SetRXAddr(rx_tx_addr, BAYANG_ADDRESS_LENGTH);
|
XN297_SetRXAddr(rx_tx_addr, BAYANG_ADDRESS_LENGTH);
|
||||||
#endif
|
#endif
|
||||||
BIND_DONE;
|
BIND_DONE;
|
||||||
phase++; //WRITE
|
phase++; //WRITE
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
BAYANG_send_packet();
|
BAYANG_send_packet();
|
||||||
break;
|
break;
|
||||||
case BAYANG_WRITE:
|
case BAYANG_WRITE:
|
||||||
#ifdef MULTI_SYNC
|
#ifdef MULTI_SYNC
|
||||||
telemetry_set_input_sync((option & BAYANG_OPTION_FLAG_TELEMETRY)?BAYANG_PACKET_TELEM_PERIOD:BAYANG_PACKET_PERIOD);
|
telemetry_set_input_sync((option & BAYANG_OPTION_FLAG_TELEMETRY)?BAYANG_PACKET_TELEM_PERIOD:BAYANG_PACKET_PERIOD);
|
||||||
#endif
|
#endif
|
||||||
BAYANG_send_packet();
|
BAYANG_send_packet();
|
||||||
#ifdef BAYANG_HUB_TELEMETRY
|
#ifdef BAYANG_HUB_TELEMETRY
|
||||||
if (option & BAYANG_OPTION_FLAG_TELEMETRY)
|
if (option & BAYANG_OPTION_FLAG_TELEMETRY)
|
||||||
{ // telemetry is enabled
|
{ // telemetry is enabled
|
||||||
state++;
|
state++;
|
||||||
if (state > 200)
|
if (state > 200)
|
||||||
{
|
{
|
||||||
state = 0;
|
state = 0;
|
||||||
//telemetry reception packet rate - packets per second
|
//telemetry reception packet rate - packets per second
|
||||||
TX_LQI = telemetry_counter>>1;
|
TX_LQI = telemetry_counter>>1;
|
||||||
telemetry_counter = 0;
|
telemetry_counter = 0;
|
||||||
telemetry_lost=0;
|
telemetry_lost=0;
|
||||||
}
|
}
|
||||||
phase++; //CHECK
|
phase++; //CHECK
|
||||||
return BAYANG_CHECK_DELAY;
|
return BAYANG_CHECK_DELAY;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
#ifdef BAYANG_HUB_TELEMETRY
|
#ifdef BAYANG_HUB_TELEMETRY
|
||||||
case BAYANG_CHECK:
|
case BAYANG_CHECK:
|
||||||
// switch radio to rx as soon as packet is sent
|
// switch radio to rx as soon as packet is sent
|
||||||
start=(uint16_t)micros();
|
start=(uint16_t)micros();
|
||||||
while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 1000) // Wait max 1ms
|
while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 1000) // Wait max 1ms
|
||||||
if((NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS)))
|
if((NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS)))
|
||||||
break;
|
break;
|
||||||
NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x03);
|
NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x03);
|
||||||
phase++; // READ
|
phase++; // READ
|
||||||
return BAYANG_PACKET_TELEM_PERIOD - BAYANG_CHECK_DELAY - BAYANG_READ_DELAY;
|
return BAYANG_PACKET_TELEM_PERIOD - BAYANG_CHECK_DELAY - BAYANG_READ_DELAY;
|
||||||
case BAYANG_READ:
|
case BAYANG_READ:
|
||||||
BAYANG_check_rx();
|
BAYANG_check_rx();
|
||||||
phase=BAYANG_WRITE;
|
phase=BAYANG_WRITE;
|
||||||
return BAYANG_READ_DELAY;
|
return BAYANG_READ_DELAY;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return BAYANG_PACKET_PERIOD;
|
return BAYANG_PACKET_PERIOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __attribute__((unused)) BAYANG_initialize_txid()
|
static void __attribute__((unused)) BAYANG_initialize_txid()
|
||||||
{
|
{
|
||||||
//Could be using txid[0..2] but using rx_tx_addr everywhere instead...
|
//Could be using txid[0..2] but using rx_tx_addr everywhere instead...
|
||||||
if(sub_protocol==DHD_D4)
|
if(sub_protocol==DHD_D4)
|
||||||
hopping_frequency[0]=(rx_tx_addr[2]&0x07)|0x01;
|
hopping_frequency[0]=(rx_tx_addr[2]&0x07)|0x01;
|
||||||
else
|
else
|
||||||
hopping_frequency[0]=0;
|
hopping_frequency[0]=0;
|
||||||
hopping_frequency[1]=(rx_tx_addr[3]&0x1F)+0x10;
|
hopping_frequency[1]=(rx_tx_addr[3]&0x1F)+0x10;
|
||||||
hopping_frequency[2]=hopping_frequency[1]+0x20;
|
hopping_frequency[2]=hopping_frequency[1]+0x20;
|
||||||
hopping_frequency[3]=hopping_frequency[2]+0x20;
|
hopping_frequency[3]=hopping_frequency[2]+0x20;
|
||||||
hopping_frequency_no=0;
|
hopping_frequency_no=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t initBAYANG(void)
|
uint16_t initBAYANG(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_init();
|
||||||
packet_count=0;
|
packet_count=0;
|
||||||
return BAYANG_INITIAL_WAIT+BAYANG_PACKET_PERIOD;
|
return BAYANG_INITIAL_WAIT+BAYANG_PACKET_PERIOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -101,7 +101,7 @@ 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_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_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_CG023[] = "\x05""Std\0 ""YD829";
|
||||||
const char STR_SUBTYPE_BAYANG[] = "\x07""Std\0 ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4\0""CX100\0 ";
|
const char STR_SUBTYPE_BAYANG[] = "\x07""Std\0 ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4\0""QX100\0 ";
|
||||||
const char STR_SUBTYPE_MT99[] = "\x06""MT99\0 ""H7\0 ""YZ\0 ""LS\0 ""FY805";
|
const char STR_SUBTYPE_MT99[] = "\x06""MT99\0 ""H7\0 ""YZ\0 ""LS\0 ""FY805";
|
||||||
const char STR_SUBTYPE_MJXQ[] = "\x07""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix";
|
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_FY326[] = "\x05""Std\0 ""FY319";
|
||||||
@ -157,7 +157,7 @@ const mm_protocol_definition multi_protocols[] = {
|
|||||||
{PROTO_ASSAN, STR_ASSAN, 0, NO_SUBTYPE, OPTION_NONE },
|
{PROTO_ASSAN, STR_ASSAN, 0, NO_SUBTYPE, OPTION_NONE },
|
||||||
#endif
|
#endif
|
||||||
#if defined(BAYANG_NRF24L01_INO)
|
#if defined(BAYANG_NRF24L01_INO)
|
||||||
{PROTO_BAYANG, STR_BAYANG, 5, STR_SUBTYPE_BAYANG, OPTION_TELEM },
|
{PROTO_BAYANG, STR_BAYANG, 6, STR_SUBTYPE_BAYANG, OPTION_TELEM },
|
||||||
#endif
|
#endif
|
||||||
#if defined(BAYANG_RX_NRF24L01_INO)
|
#if defined(BAYANG_RX_NRF24L01_INO)
|
||||||
{PROTO_BAYANG_RX, STR_BAYANG_RX, 0, NO_SUBTYPE, OPTION_NONE },
|
{PROTO_BAYANG_RX, STR_BAYANG_RX, 0, NO_SUBTYPE, OPTION_NONE },
|
||||||
@ -369,4 +369,4 @@ const mm_protocol_definition multi_protocols[] = {
|
|||||||
{0x00, nullptr, 0, nullptr, 0 }
|
{0x00, nullptr, 0, nullptr, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -195,7 +195,7 @@ enum BAYANG
|
|||||||
X16_AH = 2,
|
X16_AH = 2,
|
||||||
IRDRONE = 3,
|
IRDRONE = 3,
|
||||||
DHD_D4 = 4,
|
DHD_D4 = 4,
|
||||||
CX100 = 5,
|
QX100 = 5,
|
||||||
};
|
};
|
||||||
enum MT99XX
|
enum MT99XX
|
||||||
{
|
{
|
||||||
@ -834,6 +834,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
|
|||||||
X16_AH 2
|
X16_AH 2
|
||||||
IRDRONE 3
|
IRDRONE 3
|
||||||
DHD_D4 4
|
DHD_D4 4
|
||||||
|
QX100 5
|
||||||
sub_protocol==MT99XX
|
sub_protocol==MT99XX
|
||||||
MT99 0
|
MT99 0
|
||||||
H7 1
|
H7 1
|
||||||
|
@ -510,7 +510,7 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
|
|||||||
X16_AH
|
X16_AH
|
||||||
IRDRONE
|
IRDRONE
|
||||||
DHD_D4
|
DHD_D4
|
||||||
CX100
|
QX100
|
||||||
PROTO_BAYANG_RX
|
PROTO_BAYANG_RX
|
||||||
NONE
|
NONE
|
||||||
PROTO_BUGS
|
PROTO_BUGS
|
||||||
|
Loading…
x
Reference in New Issue
Block a user