diff --git a/Multiprotocol/Bayang_nrf24l01.ino b/Multiprotocol/Bayang_nrf24l01.ino
index d2c6cc9..79b1c18 100644
--- a/Multiprotocol/Bayang_nrf24l01.ino
+++ b/Multiprotocol/Bayang_nrf24l01.ino
@@ -1,370 +1,370 @@
-/*
- 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 .
- */
-// 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
-
-#if defined(BAYANG_NRF24L01_INO)
-
-#include "iface_nrf24l01.h"
-
-#define BAYANG_BIND_COUNT 1000
-#define BAYANG_PACKET_PERIOD 2000
-#define BAYANG_PACKET_TELEM_PERIOD 5000
-#define BAYANG_INITIAL_WAIT 500
-#define BAYANG_PACKET_SIZE 15
-#define BAYANG_RF_NUM_CHANNELS 4
-#define BAYANG_RF_BIND_CHANNEL 0
-#define BAYANG_RF_BIND_CHANNEL_X16_AH 10
-#define BAYANG_ADDRESS_LENGTH 5
-
-enum BAYANG_FLAGS {
- // flags going to packet[2]
- BAYANG_FLAG_RTH = 0x01,
- BAYANG_FLAG_HEADLESS = 0x02,
- BAYANG_FLAG_FLIP = 0x08,
- BAYANG_FLAG_VIDEO = 0x10,
- BAYANG_FLAG_PICTURE = 0x20,
- // flags going to packet[3]
- BAYANG_FLAG_INVERTED = 0x80, // inverted flight on Floureon H101
- BAYANG_FLAG_TAKE_OFF = 0x20, // take off / landing on X16 AH
- BAYANG_FLAG_EMG_STOP = 0x04|0x08, // 0x08 for VISUO XS809H-W-HD-G
-};
-
-enum BAYANG_OPTION_FLAGS {
- BAYANG_OPTION_FLAG_TELEMETRY = 0x01,
- BAYANG_OPTION_FLAG_ANALOGAUX = 0x02,
-};
-
-static void __attribute__((unused)) BAYANG_send_packet()
-{
- uint8_t i;
- if (IS_BIND_IN_PROGRESS)
- {
- #ifdef BAYANG_HUB_TELEMETRY
- if(option & BAYANG_OPTION_FLAG_TELEMETRY)
- if(option & BAYANG_OPTION_FLAG_ANALOGAUX)
- packet[0]= 0xA1; // telemetry and analog aux are enabled
- else
- packet[0]= 0xA3; // telemetry is enabled
- else if(option & BAYANG_OPTION_FLAG_ANALOGAUX)
- packet[0]= 0xA2; // analog aux is enabled
- else
- #else
- if(option & BAYANG_OPTION_FLAG_ANALOGAUX)
- packet[0]= 0xA2; // analog aux is enabled
- else
- #endif
- packet[0]= 0xA4;
- if(sub_protocol==CX100)
- packet[0] = 0x53;
-
- for(i=0;i<5;i++)
- packet[i+1]=rx_tx_addr[i];
- for(i=0;i<4;i++)
- packet[i+6]=hopping_frequency[i];
- switch (sub_protocol)
- {
- case CX100:
- case X16_AH:
- packet[10] = 0x00;
- packet[11] = 0x00;
- break;
- case IRDRONE:
- packet[10] = 0x30;
- packet[11] = 0x01;
- break;
- case DHD_D4:
- packet[10] = 0xC8;
- packet[11] = 0x99;
- break;
- default:
- packet[10] = rx_tx_addr[0]; // txid[0]
- packet[11] = rx_tx_addr[1]; // txid[1]
- break;
- }
- }
- else
- {
- uint16_t val;
- uint8_t dyntrim = 1;
- switch (sub_protocol)
- {
- case X16_AH:
- case IRDRONE:
- packet[0] = 0xA6;
- break;
- default:
- packet[0] = 0xA5;
- break;
- }
- if (option & BAYANG_OPTION_FLAG_ANALOGAUX)
- {
- // Analog aux channel 1 (channel 14)
- packet[1] = convert_channel_8b(CH14);
- }
- else
- packet[1] = 0xFA; // normal mode is 0xF7, expert 0xFa , D4 normal is 0xF4
-
- //Flags packet[2]
- packet[2] = 0x00;
- if(CH5_SW)
- packet[2] = BAYANG_FLAG_FLIP;
- if(CH6_SW)
- packet[2] |= BAYANG_FLAG_RTH;
- if(CH7_SW)
- packet[2] |= BAYANG_FLAG_PICTURE;
- if(CH8_SW)
- packet[2] |= BAYANG_FLAG_VIDEO;
- if(CH9_SW)
- {
- packet[2] |= BAYANG_FLAG_HEADLESS;
- dyntrim = 0;
- }
- //Flags packet[3]
- packet[3] = 0x00;
- if(CH10_SW)
- packet[3] = BAYANG_FLAG_INVERTED;
- if(CH11_SW)
- dyntrim = 0;
- if(CH12_SW)
- packet[3] |= BAYANG_FLAG_TAKE_OFF;
- if(CH13_SW)
- packet[3] |= BAYANG_FLAG_EMG_STOP;
- //Aileron
- val = convert_channel_10b(AILERON);
- packet[4] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C);
- packet[5] = val & 0xFF;
- //Elevator
- val = convert_channel_10b(ELEVATOR);
- packet[6] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C);
- packet[7] = val & 0xFF;
- //Throttle
- val = convert_channel_10b(THROTTLE);
- packet[8] = (val>>8) + 0x7C;
- packet[9] = val & 0xFF;
- //Rudder
- val = convert_channel_10b(RUDDER);
- packet[10] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C);
- packet[11] = val & 0xFF;
- }
- switch (sub_protocol)
- {
- case H8S3D:
- packet[12] = rx_tx_addr[2]; // txid[2]
- packet[13] = 0x34;
- break;
- case CX100:
- case X16_AH:
- packet[12] = 0;
- packet[13] = 0;
- break;
- case IRDRONE:
- packet[12] = 0xE0;
- packet[13] = 0x2E;
- break;
- case DHD_D4:
- packet[12] = 0x37; //0x17 during bind
- packet[13] = 0xED;
- break;
- default:
- packet[12] = rx_tx_addr[2]; // txid[2]
- if (option & BAYANG_OPTION_FLAG_ANALOGAUX)
- { // Analog aux channel 2 (channel 15)
- packet[13] = convert_channel_8b(CH15);
- }
- else
- packet[13] = 0x0A;
- break;
- }
- packet[14] = 0;
- for (uint8_t i=0; i < BAYANG_PACKET_SIZE-1; i++)
- packet[14] += packet[i];
-
- 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;
-
- // Power on, TX mode, 2byte CRC
- // Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing
- NRF24L01_FlushTx();
- NRF24L01_SetTxRxMode(TX_EN);
- XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP));
- XN297_WritePayload(packet, BAYANG_PACKET_SIZE);
-
- NRF24L01_SetPower(); // Set tx_power
-}
-
-#ifdef BAYANG_HUB_TELEMETRY
-static void __attribute__((unused)) BAYANG_check_rx(void)
-{
- if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR))
- { // data received from model
- XN297_ReadPayload(packet, BAYANG_PACKET_SIZE);
- NRF24L01_WriteReg(NRF24L01_07_STATUS, 255);
-
- NRF24L01_FlushRx();
- uint8_t check = packet[0];
- for (uint8_t i=1; i < BAYANG_PACKET_SIZE-1; i++)
- check += packet[i];
- // decode data , check sum is ok as well, since there is no crc
- if (packet[0] == 0x85 && packet[14] == check)
- {
- // uncompensated battery volts*100/2
- v_lipo1 = (packet[3]<<7) + (packet[4]>>2);
- // compensated battery volts*100/2
- v_lipo2 = (packet[5]<<7) + (packet[6]>>2);
- // reception in packets / sec
- RX_LQI = packet[7];
- RX_RSSI = RX_LQI;
- //Flags
- //uint8_t flags = packet[3] >> 3;
- // battery low: flags & 1
- telemetry_counter++;
- if(telemetry_lost==0)
- telemetry_link=1;
- }
- }
- NRF24L01_SetTxRxMode(TXRX_OFF);
-}
-#endif
-
-static void __attribute__((unused)) BAYANG_init()
-{
- NRF24L01_Initialize();
- NRF24L01_SetTxRxMode(TX_EN);
-
- XN297_SetTXAddr((uint8_t *)"\x00\x00\x00\x00\x00", BAYANG_ADDRESS_LENGTH);
-
- NRF24L01_FlushTx();
- NRF24L01_FlushRx();
- NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit
- NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowldgement on all data pipes
- NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 only
- NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, BAYANG_PACKET_SIZE);
- NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps
- NRF24L01_WriteReg(NRF24L01_04_SETUP_RETR, 0x00); // No retransmits
- NRF24L01_SetPower();
- NRF24L01_Activate(0x73); // Activate feature register
- NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes
- NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x01);
- NRF24L01_Activate(0x73);
-
- switch (sub_protocol)
- {
- case X16_AH:
- case IRDRONE:
- rf_ch_num = BAYANG_RF_BIND_CHANNEL_X16_AH;
- break;
- default:
- rf_ch_num = BAYANG_RF_BIND_CHANNEL;
- break;
- }
-}
-
-enum {
- BAYANG_BIND=0,
- BAYANG_WRITE,
- BAYANG_CHECK,
- BAYANG_READ,
-};
-
-#define BAYANG_CHECK_DELAY 1000 // Time after write phase to check write complete
-#define BAYANG_READ_DELAY 600 // Time before read phase
-
-uint16_t BAYANG_callback()
-{
- #ifdef BAYANG_HUB_TELEMETRY
- uint16_t start;
- #endif
- switch(phase)
- {
- case BAYANG_BIND:
- if (--bind_counter == 0)
- {
- XN297_SetTXAddr(rx_tx_addr, BAYANG_ADDRESS_LENGTH);
- #ifdef BAYANG_HUB_TELEMETRY
- XN297_SetRXAddr(rx_tx_addr, BAYANG_ADDRESS_LENGTH);
- #endif
- BIND_DONE;
- phase++; //WRITE
- }
- else
- BAYANG_send_packet();
- break;
- case BAYANG_WRITE:
- #ifdef MULTI_SYNC
- telemetry_set_input_sync((option & BAYANG_OPTION_FLAG_TELEMETRY)?BAYANG_PACKET_TELEM_PERIOD:BAYANG_PACKET_PERIOD);
- #endif
- BAYANG_send_packet();
- #ifdef BAYANG_HUB_TELEMETRY
- if (option & BAYANG_OPTION_FLAG_TELEMETRY)
- { // telemetry is enabled
- state++;
- if (state > 200)
- {
- state = 0;
- //telemetry reception packet rate - packets per second
- TX_LQI = telemetry_counter>>1;
- telemetry_counter = 0;
- telemetry_lost=0;
- }
- phase++; //CHECK
- return BAYANG_CHECK_DELAY;
- }
- #endif
- break;
- #ifdef BAYANG_HUB_TELEMETRY
- case BAYANG_CHECK:
- // switch radio to rx as soon as packet is sent
- start=(uint16_t)micros();
- while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 1000) // Wait max 1ms
- if((NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS)))
- break;
- NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x03);
- phase++; // READ
- return BAYANG_PACKET_TELEM_PERIOD - BAYANG_CHECK_DELAY - BAYANG_READ_DELAY;
- case BAYANG_READ:
- BAYANG_check_rx();
- phase=BAYANG_WRITE;
- return BAYANG_READ_DELAY;
- #endif
- }
- return BAYANG_PACKET_PERIOD;
-}
-
-static void __attribute__((unused)) BAYANG_initialize_txid()
-{
- //Could be using txid[0..2] but using rx_tx_addr everywhere instead...
- if(sub_protocol==DHD_D4)
- hopping_frequency[0]=(rx_tx_addr[2]&0x07)|0x01;
- else
- hopping_frequency[0]=0;
- hopping_frequency[1]=(rx_tx_addr[3]&0x1F)+0x10;
- hopping_frequency[2]=hopping_frequency[1]+0x20;
- hopping_frequency[3]=hopping_frequency[2]+0x20;
- hopping_frequency_no=0;
-}
-
-uint16_t initBAYANG(void)
-{
- BIND_IN_PROGRESS; // autobind protocol
- phase=BAYANG_BIND;
- bind_counter = BAYANG_BIND_COUNT;
- BAYANG_initialize_txid();
- BAYANG_init();
- packet_count=0;
- return BAYANG_INITIAL_WAIT+BAYANG_PACKET_PERIOD;
-}
-
+/*
+ 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 .
+ */
+// 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
+
+#if defined(BAYANG_NRF24L01_INO)
+
+#include "iface_nrf24l01.h"
+
+#define BAYANG_BIND_COUNT 1000
+#define BAYANG_PACKET_PERIOD 2000
+#define BAYANG_PACKET_TELEM_PERIOD 5000
+#define BAYANG_INITIAL_WAIT 500
+#define BAYANG_PACKET_SIZE 15
+#define BAYANG_RF_NUM_CHANNELS 4
+#define BAYANG_RF_BIND_CHANNEL 0
+#define BAYANG_RF_BIND_CHANNEL_X16_AH 10
+#define BAYANG_ADDRESS_LENGTH 5
+
+enum BAYANG_FLAGS {
+ // flags going to packet[2]
+ BAYANG_FLAG_RTH = 0x01,
+ BAYANG_FLAG_HEADLESS = 0x02,
+ BAYANG_FLAG_FLIP = 0x08,
+ BAYANG_FLAG_VIDEO = 0x10,
+ BAYANG_FLAG_PICTURE = 0x20,
+ // flags going to packet[3]
+ BAYANG_FLAG_INVERTED = 0x80, // inverted flight on Floureon H101
+ BAYANG_FLAG_TAKE_OFF = 0x20, // take off / landing on X16 AH
+ BAYANG_FLAG_EMG_STOP = 0x04|0x08, // 0x08 for VISUO XS809H-W-HD-G
+};
+
+enum BAYANG_OPTION_FLAGS {
+ BAYANG_OPTION_FLAG_TELEMETRY = 0x01,
+ BAYANG_OPTION_FLAG_ANALOGAUX = 0x02,
+};
+
+static void __attribute__((unused)) BAYANG_send_packet()
+{
+ uint8_t i;
+ if (IS_BIND_IN_PROGRESS)
+ {
+ #ifdef BAYANG_HUB_TELEMETRY
+ if(option & BAYANG_OPTION_FLAG_TELEMETRY)
+ if(option & BAYANG_OPTION_FLAG_ANALOGAUX)
+ packet[0]= 0xA1; // telemetry and analog aux are enabled
+ else
+ packet[0]= 0xA3; // telemetry is enabled
+ else if(option & BAYANG_OPTION_FLAG_ANALOGAUX)
+ packet[0]= 0xA2; // analog aux is enabled
+ else
+ #else
+ if(option & BAYANG_OPTION_FLAG_ANALOGAUX)
+ packet[0]= 0xA2; // analog aux is enabled
+ else
+ #endif
+ packet[0]= 0xA4;
+ if(sub_protocol==QX100)
+ packet[0] = 0x53;
+
+ for(i=0;i<5;i++)
+ packet[i+1]=rx_tx_addr[i];
+ for(i=0;i<4;i++)
+ packet[i+6]=hopping_frequency[i];
+ switch (sub_protocol)
+ {
+ case QX100:
+ case X16_AH:
+ packet[10] = 0x00;
+ packet[11] = 0x00;
+ break;
+ case IRDRONE:
+ packet[10] = 0x30;
+ packet[11] = 0x01;
+ break;
+ case DHD_D4:
+ packet[10] = 0xC8;
+ packet[11] = 0x99;
+ break;
+ default:
+ packet[10] = rx_tx_addr[0]; // txid[0]
+ packet[11] = rx_tx_addr[1]; // txid[1]
+ break;
+ }
+ }
+ else
+ {
+ uint16_t val;
+ uint8_t dyntrim = 1;
+ switch (sub_protocol)
+ {
+ case X16_AH:
+ case IRDRONE:
+ packet[0] = 0xA6;
+ break;
+ default:
+ packet[0] = 0xA5;
+ break;
+ }
+ if (option & BAYANG_OPTION_FLAG_ANALOGAUX)
+ {
+ // Analog aux channel 1 (channel 14)
+ packet[1] = convert_channel_8b(CH14);
+ }
+ else
+ packet[1] = 0xFA; // normal mode is 0xF7, expert 0xFa , D4 normal is 0xF4
+
+ //Flags packet[2]
+ packet[2] = 0x00;
+ if(CH5_SW)
+ packet[2] = BAYANG_FLAG_FLIP;
+ if(CH6_SW)
+ packet[2] |= BAYANG_FLAG_RTH;
+ if(CH7_SW)
+ packet[2] |= BAYANG_FLAG_PICTURE;
+ if(CH8_SW)
+ packet[2] |= BAYANG_FLAG_VIDEO;
+ if(CH9_SW)
+ {
+ packet[2] |= BAYANG_FLAG_HEADLESS;
+ dyntrim = 0;
+ }
+ //Flags packet[3]
+ packet[3] = 0x00;
+ if(CH10_SW)
+ packet[3] = BAYANG_FLAG_INVERTED;
+ if(CH11_SW)
+ dyntrim = 0;
+ if(CH12_SW)
+ packet[3] |= BAYANG_FLAG_TAKE_OFF;
+ if(CH13_SW)
+ packet[3] |= BAYANG_FLAG_EMG_STOP;
+ //Aileron
+ val = convert_channel_10b(AILERON);
+ packet[4] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C);
+ packet[5] = val & 0xFF;
+ //Elevator
+ val = convert_channel_10b(ELEVATOR);
+ packet[6] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C);
+ packet[7] = val & 0xFF;
+ //Throttle
+ val = convert_channel_10b(THROTTLE);
+ packet[8] = (val>>8) + 0x7C;
+ packet[9] = val & 0xFF;
+ //Rudder
+ val = convert_channel_10b(RUDDER);
+ packet[10] = (val>>8) + (dyntrim ? ((val>>2) & 0xFC) : 0x7C);
+ packet[11] = val & 0xFF;
+ }
+ switch (sub_protocol)
+ {
+ case H8S3D:
+ packet[12] = rx_tx_addr[2]; // txid[2]
+ packet[13] = 0x34;
+ break;
+ case QX100:
+ case X16_AH:
+ packet[12] = 0;
+ packet[13] = 0;
+ break;
+ case IRDRONE:
+ packet[12] = 0xE0;
+ packet[13] = 0x2E;
+ break;
+ case DHD_D4:
+ packet[12] = 0x37; //0x17 during bind
+ packet[13] = 0xED;
+ break;
+ default:
+ packet[12] = rx_tx_addr[2]; // txid[2]
+ if (option & BAYANG_OPTION_FLAG_ANALOGAUX)
+ { // Analog aux channel 2 (channel 15)
+ packet[13] = convert_channel_8b(CH15);
+ }
+ else
+ packet[13] = 0x0A;
+ break;
+ }
+ packet[14] = 0;
+ for (uint8_t i=0; i < BAYANG_PACKET_SIZE-1; i++)
+ packet[14] += packet[i];
+
+ 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;
+
+ // Power on, TX mode, 2byte CRC
+ // Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing
+ NRF24L01_FlushTx();
+ NRF24L01_SetTxRxMode(TX_EN);
+ XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP));
+ XN297_WritePayload(packet, BAYANG_PACKET_SIZE);
+
+ NRF24L01_SetPower(); // Set tx_power
+}
+
+#ifdef BAYANG_HUB_TELEMETRY
+static void __attribute__((unused)) BAYANG_check_rx(void)
+{
+ if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR))
+ { // data received from model
+ XN297_ReadPayload(packet, BAYANG_PACKET_SIZE);
+ NRF24L01_WriteReg(NRF24L01_07_STATUS, 255);
+
+ NRF24L01_FlushRx();
+ uint8_t check = packet[0];
+ for (uint8_t i=1; i < BAYANG_PACKET_SIZE-1; i++)
+ check += packet[i];
+ // decode data , check sum is ok as well, since there is no crc
+ if (packet[0] == 0x85 && packet[14] == check)
+ {
+ // uncompensated battery volts*100/2
+ v_lipo1 = (packet[3]<<7) + (packet[4]>>2);
+ // compensated battery volts*100/2
+ v_lipo2 = (packet[5]<<7) + (packet[6]>>2);
+ // reception in packets / sec
+ RX_LQI = packet[7];
+ RX_RSSI = RX_LQI;
+ //Flags
+ //uint8_t flags = packet[3] >> 3;
+ // battery low: flags & 1
+ telemetry_counter++;
+ if(telemetry_lost==0)
+ telemetry_link=1;
+ }
+ }
+ NRF24L01_SetTxRxMode(TXRX_OFF);
+}
+#endif
+
+static void __attribute__((unused)) BAYANG_init()
+{
+ NRF24L01_Initialize();
+ NRF24L01_SetTxRxMode(TX_EN);
+
+ XN297_SetTXAddr((uint8_t *)"\x00\x00\x00\x00\x00", BAYANG_ADDRESS_LENGTH);
+
+ NRF24L01_FlushTx();
+ NRF24L01_FlushRx();
+ NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit
+ NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowldgement on all data pipes
+ NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 only
+ NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, BAYANG_PACKET_SIZE);
+ NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps
+ NRF24L01_WriteReg(NRF24L01_04_SETUP_RETR, 0x00); // No retransmits
+ NRF24L01_SetPower();
+ NRF24L01_Activate(0x73); // Activate feature register
+ NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes
+ NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x01);
+ NRF24L01_Activate(0x73);
+
+ switch (sub_protocol)
+ {
+ case X16_AH:
+ case IRDRONE:
+ rf_ch_num = BAYANG_RF_BIND_CHANNEL_X16_AH;
+ break;
+ default:
+ rf_ch_num = BAYANG_RF_BIND_CHANNEL;
+ break;
+ }
+}
+
+enum {
+ BAYANG_BIND=0,
+ BAYANG_WRITE,
+ BAYANG_CHECK,
+ BAYANG_READ,
+};
+
+#define BAYANG_CHECK_DELAY 1000 // Time after write phase to check write complete
+#define BAYANG_READ_DELAY 600 // Time before read phase
+
+uint16_t BAYANG_callback()
+{
+ #ifdef BAYANG_HUB_TELEMETRY
+ uint16_t start;
+ #endif
+ switch(phase)
+ {
+ case BAYANG_BIND:
+ if (--bind_counter == 0)
+ {
+ XN297_SetTXAddr(rx_tx_addr, BAYANG_ADDRESS_LENGTH);
+ #ifdef BAYANG_HUB_TELEMETRY
+ XN297_SetRXAddr(rx_tx_addr, BAYANG_ADDRESS_LENGTH);
+ #endif
+ BIND_DONE;
+ phase++; //WRITE
+ }
+ else
+ BAYANG_send_packet();
+ break;
+ case BAYANG_WRITE:
+ #ifdef MULTI_SYNC
+ telemetry_set_input_sync((option & BAYANG_OPTION_FLAG_TELEMETRY)?BAYANG_PACKET_TELEM_PERIOD:BAYANG_PACKET_PERIOD);
+ #endif
+ BAYANG_send_packet();
+ #ifdef BAYANG_HUB_TELEMETRY
+ if (option & BAYANG_OPTION_FLAG_TELEMETRY)
+ { // telemetry is enabled
+ state++;
+ if (state > 200)
+ {
+ state = 0;
+ //telemetry reception packet rate - packets per second
+ TX_LQI = telemetry_counter>>1;
+ telemetry_counter = 0;
+ telemetry_lost=0;
+ }
+ phase++; //CHECK
+ return BAYANG_CHECK_DELAY;
+ }
+ #endif
+ break;
+ #ifdef BAYANG_HUB_TELEMETRY
+ case BAYANG_CHECK:
+ // switch radio to rx as soon as packet is sent
+ start=(uint16_t)micros();
+ while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 1000) // Wait max 1ms
+ if((NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS)))
+ break;
+ NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x03);
+ phase++; // READ
+ return BAYANG_PACKET_TELEM_PERIOD - BAYANG_CHECK_DELAY - BAYANG_READ_DELAY;
+ case BAYANG_READ:
+ BAYANG_check_rx();
+ phase=BAYANG_WRITE;
+ return BAYANG_READ_DELAY;
+ #endif
+ }
+ return BAYANG_PACKET_PERIOD;
+}
+
+static void __attribute__((unused)) BAYANG_initialize_txid()
+{
+ //Could be using txid[0..2] but using rx_tx_addr everywhere instead...
+ if(sub_protocol==DHD_D4)
+ hopping_frequency[0]=(rx_tx_addr[2]&0x07)|0x01;
+ else
+ hopping_frequency[0]=0;
+ hopping_frequency[1]=(rx_tx_addr[3]&0x1F)+0x10;
+ hopping_frequency[2]=hopping_frequency[1]+0x20;
+ hopping_frequency[3]=hopping_frequency[2]+0x20;
+ hopping_frequency_no=0;
+}
+
+uint16_t initBAYANG(void)
+{
+ BIND_IN_PROGRESS; // autobind protocol
+ phase=BAYANG_BIND;
+ bind_counter = BAYANG_BIND_COUNT;
+ BAYANG_initialize_txid();
+ BAYANG_init();
+ packet_count=0;
+ return BAYANG_INITIAL_WAIT+BAYANG_PACKET_PERIOD;
+}
+
#endif
diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino
index 3cba389..05532b9 100644
--- a/Multiprotocol/Multi_Names.ino
+++ b/Multiprotocol/Multi_Names.ino
@@ -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_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""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_MJXQ[] = "\x07""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix";
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 },
#endif
#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
#if defined(BAYANG_RX_NRF24L01_INO)
{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 }
};
-#endif
\ No newline at end of file
+#endif
diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h
index 2c4e9b1..c760bf6 100644
--- a/Multiprotocol/Multiprotocol.h
+++ b/Multiprotocol/Multiprotocol.h
@@ -195,7 +195,7 @@ enum BAYANG
X16_AH = 2,
IRDRONE = 3,
DHD_D4 = 4,
- CX100 = 5,
+ QX100 = 5,
};
enum MT99XX
{
@@ -834,6 +834,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
X16_AH 2
IRDRONE 3
DHD_D4 4
+ QX100 5
sub_protocol==MT99XX
MT99 0
H7 1
diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h
index 1ec2097..ac7e8f5 100644
--- a/Multiprotocol/_Config.h
+++ b/Multiprotocol/_Config.h
@@ -510,7 +510,7 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
X16_AH
IRDRONE
DHD_D4
- CX100
+ QX100
PROTO_BAYANG_RX
NONE
PROTO_BUGS