diff --git a/Multiprotocol/DSM2_cyrf6936.ino b/Multiprotocol/DSM2_cyrf6936.ino
index e6769a6..928d24e 100644
--- a/Multiprotocol/DSM2_cyrf6936.ino
+++ b/Multiprotocol/DSM2_cyrf6936.ino
@@ -42,8 +42,7 @@ enum {
DSM2_CH2_READ_B = BIND_COUNT1 + 10,
};
-
-const uint8_t pncodes[5][9][8] = {
+const uint8_t PROGMEM pncodes[5][9][8] = {
/* Note these are in order transmitted (LSB 1st) */
{ /* Row 0 */
/* Col 0 */ {0x03, 0xBC, 0x6E, 0x8A, 0xEF, 0xBD, 0xFE, 0xF8},
@@ -102,6 +101,12 @@ const uint8_t pncodes[5][9][8] = {
},
};
+static void __attribute__((unused)) read_code(uint8_t *buf, uint8_t row, uint8_t col, uint8_t len)
+{
+ for(uint8_t i=0;i.
- */
+/* **************************
+ * By Midelic on RCGroups *
+ **************************
+ 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 .
+*/
#if defined(FRSKYX_CC2500_INO)
+
+ #include "iface_cc2500.h"
+
+ uint8_t chanskip;
+ uint8_t calData[48][3];
+ uint8_t channr;
+ uint8_t pass_ = 1 ;
+ uint8_t counter_rst;
+ uint8_t ctr;
+ uint8_t FS_flag=0;
+ // uint8_t ptr[4]={0x01,0x12,0x23,0x30};
+ //uint8_t ptr[4]={0x00,0x11,0x22,0x33};
+
+ const PROGMEM uint8_t hop_data[]={
+ 0x02, 0xD4, 0xBB, 0xA2, 0x89,
+ 0x70, 0x57, 0x3E, 0x25, 0x0C,
+ 0xDE, 0xC5, 0xAC, 0x93, 0x7A,
+ 0x61, 0x48, 0x2F, 0x16, 0xE8,
+ 0xCF, 0xB6, 0x9D, 0x84, 0x6B,
+ 0x52, 0x39, 0x20, 0x07, 0xD9,
+ 0xC0, 0xA7, 0x8E, 0x75, 0x5C,
+ 0x43, 0x2A, 0x11, 0xE3, 0xCA,
+ 0xB1, 0x98, 0x7F, 0x66, 0x4D,
+ 0x34, 0x1B, 0x00, 0x1D, 0x03
+ };
-#include "iface_cc2500.h"
+ uint8_t hop(uint8_t byte)
+ {
+ return pgm_read_byte_near(&hop_data[byte]);
+ }
+ uint16_t initFrSkyX()
+ {
+ while(!chanskip)
+ {
+ randomSeed((uint32_t)analogRead(A6) << 10 | analogRead(A7));
+ chanskip=random(0xfefefefe)%47;
+ }
+ while((chanskip-ctr)%4)
+ ctr=(ctr+1)%4;
+
+ counter_rst=(chanskip-ctr)>>2;
+ //for test***************
+ //rx_tx_addr[3]=0xB3;
+ //rx_tx_addr[2]=0xFD;
+ //************************
+ frskyX_init();
+ //
+ if(IS_AUTOBIND_FLAG_on)
+ {
+ state = FRSKY_BIND;
+ initialize_data(1);
+ }
+ else
+ {
+ state = FRSKY_DATA1;
+ initialize_data(0);
+ }
+ return 10000;
+ }
+
+ uint16_t ReadFrSkyX()
+ {
+ switch(state)
+ {
+ default:
+ set_start(47);
+ CC2500_SetPower();
+ cc2500_strobe(CC2500_SFRX);
+ //
+ frskyX_build_bind_packet();
+ cc2500_strobe(CC2500_SIDLE);
+ cc2500_writeFifo(packet, packet[0]+1);
+ state++;
+ return 9000;
+ case FRSKY_BIND_DONE:
+ initialize_data(0);
+ channr=0;
+ BIND_DONE;
+ state++;
+ break;
+ case FRSKY_DATA1:
+ LED_ON;
+ CC2500_SetTxRxMode(TX_EN);
+ set_start(channr);
+ CC2500_SetPower();
+ cc2500_strobe(CC2500_SFRX);
+ channr = (channr+chanskip)%47;
+ cc2500_strobe(CC2500_SIDLE);
+ cc2500_writeFifo(packet, packet[0]+1);
+ //
+ frskyX_data_frame();
+ state++;
+ return 5500;
+ case FRSKY_DATA2:
+ CC2500_SetTxRxMode(RX_EN);
+ cc2500_strobe(CC2500_SIDLE);
+ state++;
+ return 200;
+ case FRSKY_DATA3:
+ cc2500_strobe(CC2500_SRX);
+ state++;
+ return 3000;
+ case FRSKY_DATA4:
+ len = cc2500_readReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
+ if (len &&(len>8) & 0x0F)|(chan_1 << 4)));
+ packet[9+i+2]=crc_Byte(chan_1>>4);
+ }
+ //packet[21]=crc_Byte(0x08);//first
+ packet[21]=crc_Byte(0x80);//??? when received first telemetry frame is changed to 0x80
+ //packet[21]=crc_Byte(ptr[p]);//???
+ //p=(p+1)%4;//repeating 4 bytes sequence pattern every 4th frame.
+
+ pass_=lpass+1;
+
+ for (uint8_t i=22;i<28;i++)
+ packet[i]=crc_Byte(0);
+
+ packet[28]=highByte(crc);
+ packet[29]=lowByte(crc);
+ }
-#endif
+ uint16_t scaleForPXX( uint8_t i )
+ { //mapped 860,2140(125%) range to 64,1984(PXX values);
+ return (uint16_t)(((Servo_data[i]-PPM_MIN)*3)>>1)+64;
+ }
+
+ uint8_t crc_Byte( uint8_t byte )
+ {
+ crc = (crc<<8) ^ pgm_read_word(&CRCTable[((uint8_t)(crc>>8) ^ byte) & 0xFF]);
+ return byte;
+ }
+#endif
\ No newline at end of file
diff --git a/Multiprotocol/FrSky_cc2500.ino b/Multiprotocol/FrSky_cc2500.ino
index dae03c7..f3c6d3c 100644
--- a/Multiprotocol/FrSky_cc2500.ino
+++ b/Multiprotocol/FrSky_cc2500.ino
@@ -20,7 +20,6 @@
//##########Variables########
//uint32_t state;
//uint8_t len;
-uint8_t telemetry_counter=0;
/*
enum {
@@ -128,8 +127,6 @@ static void __attribute__((unused)) frsky2way_build_bind_packet()
packet[17] = 0x01;
}
-
-
static void __attribute__((unused)) frsky2way_data_frame()
{//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
@@ -138,7 +135,11 @@ static void __attribute__((unused)) frsky2way_data_frame()
packet[1] = rx_tx_addr[3];
packet[2] = rx_tx_addr[2];
packet[3] = counter;//
- packet[4]=telemetry_counter;
+ #if defined TELEMETRY
+ packet[4] = telemetry_counter;
+ #else
+ packet[4] = 0x00;
+ #endif
packet[5] = 0x01;
//
diff --git a/Multiprotocol/MT99xx_nrf24l01.ino b/Multiprotocol/MT99xx_nrf24l01.ino
index ab4c825..51415b7 100644
--- a/Multiprotocol/MT99xx_nrf24l01.ino
+++ b/Multiprotocol/MT99xx_nrf24l01.ino
@@ -37,29 +37,16 @@ enum{
FLAG_MT_FLIP = 0x80,
};
-enum{
- // flags going to ?????? (Yi Zhan i6S)ROLL
- BLABLA,
-};
-
enum {
MT99XX_INIT = 0,
MT99XX_BIND,
MT99XX_DATA
};
-static uint8_t __attribute__((unused)) MT99XX_calcChecksum()
-{
- uint8_t result=checksum_offset;
- for(uint8_t i=0; i<8; i++)
- result += packet[i];
- return result;
-}
-
static void __attribute__((unused)) MT99XX_send_packet()
{
- static const uint8_t yz_p4_seq[] = {0xa0, 0x20, 0x60};
- static const uint8_t mys_byte[] = {
+ const uint8_t yz_p4_seq[] = {0xa0, 0x20, 0x60};
+ const uint8_t mys_byte[] = {
0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 0x04, 0x14,
0x05, 0x15, 0x06, 0x16, 0x07, 0x17, 0x00, 0x10
};
@@ -71,8 +58,8 @@ static void __attribute__((unused)) MT99XX_send_packet()
packet[1] = convert_channel_8b_scale(RUDDER ,0x00,0xE1); // rudder
packet[2] = convert_channel_8b_scale(AILERON ,0x00,0xE1); // aileron
packet[3] = convert_channel_8b_scale(ELEVATOR,0x00,0xE1); // elevator
- packet[4] = convert_channel_8b_scale(AUX5,0x00,0x3F); // pitch trim (0x3f-0x20-0x00)
- packet[5] = convert_channel_8b_scale(AUX6,0x00,0x3F); // roll trim (0x00-0x20-0x3f)
+ packet[4] = 0x20; // pitch trim (0x3f-0x20-0x00)
+ packet[5] = 0x20; // roll trim (0x00-0x20-0x3f)
packet[6] = GET_FLAG( Servo_AUX1, FLAG_MT_FLIP )
| GET_FLAG( Servo_AUX3, FLAG_MT_SNAPSHOT )
| GET_FLAG( Servo_AUX4, FLAG_MT_VIDEO );
@@ -84,7 +71,10 @@ static void __attribute__((unused)) MT99XX_send_packet()
// low nibble: index in chan list ?
// high nibble: 0->start from start of list, 1->start from end of list ?
packet[7] = mys_byte[hopping_frequency_no];
- packet[8] = MT99XX_calcChecksum();
+ uint8_t result=checksum_offset;
+ for(uint8_t i=0; i<8; i++)
+ result += packet[i];
+ packet[8] = result;
}
else
{ // YZ
@@ -100,8 +90,12 @@ static void __attribute__((unused)) MT99XX_send_packet()
packet_count=0;
}
packet[4] = yz_p4_seq[yz_seq_num];
- packet[5] = 0x02; // expert ? (0=unarmed, 1=normal)
- packet[6] = 0x80;
+ packet[5] = 0x02 // expert ? (0=unarmed, 1=normal)
+ | GET_FLAG(Servo_AUX4, 0x10) //VIDEO
+ | GET_FLAG(Servo_AUX1, 0x80) //FLIP
+ | GET_FLAG(Servo_AUX5, 0x04) //HEADLESS
+ | GET_FLAG(Servo_AUX3, 0x20); //SNAPSHOT
+ packet[6] = GET_FLAG(Servo_AUX2, 0x80); //LED
packet[7] = packet[0];
for(uint8_t idx = 1; idx < MT99XX_PACKET_SIZE-2; idx++)
packet[7] += packet[idx];
@@ -138,6 +132,9 @@ static void __attribute__((unused)) MT99XX_init()
else
NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps
NRF24L01_SetPower();
+
+ XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP) | (sub_protocol == YZ ? BV(XN297_UNSCRAMBLED):0) );
+
XN297_SetTXAddr((uint8_t *)"\0xCC\0xCC\0xCC\0xCC\0xCC", 5);
}
@@ -210,8 +207,8 @@ uint16_t initMT99XX(void)
packet[2] = 0x05;
packet[3] = 0x06;
}
- packet[4] = rx_tx_addr[0]; // 1th byte for data state tx address
- packet[5] = rx_tx_addr[1]; // 2th byte for data state tx address (always 0x00 on Yi Zhan ?)
+ packet[4] = rx_tx_addr[0]; // 1st byte for data state tx address
+ packet[5] = rx_tx_addr[1]; // 2nd byte for data state tx address (always 0x00 on Yi Zhan ?)
packet[6] = 0x00; // 3th byte for data state tx address (always 0x00 ?)
packet[7] = checksum_offset; // checksum offset
packet[8] = 0xAA; // fixed
diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino
index b76d74f..38c23aa 100644
--- a/Multiprotocol/Multiprotocol.ino
+++ b/Multiprotocol/Multiprotocol.ino
@@ -47,7 +47,7 @@ uint8_t Servo_AUX;
// PPM variable
volatile uint16_t PPM_data[NUM_CHN];
-// NRF variables
+// Protocol variables
uint8_t rx_tx_addr[5];
uint8_t phase;
uint16_t bind_counter;
@@ -64,6 +64,7 @@ uint8_t hopping_frequency_no=0;
uint8_t rf_ch_num;
uint8_t throttle, rudder, elevator, aileron;
uint8_t flags;
+uint16_t crc;
//
uint32_t state;
uint8_t len;
@@ -91,13 +92,14 @@ uint8_t prev_protocol=0;
#define MAX_PKT 27
uint8_t pkt[MAX_PKT];//telemetry receiving packets
#if defined(TELEMETRY)
-uint8_t pktt[MAX_PKT];//telemetry receiving packets
-volatile uint8_t tx_head;
-volatile uint8_t tx_tail;
-uint8_t v_lipo;
-int16_t RSSI_dBm;
-//const uint8_t RSSI_offset=72;//69 71.72 values db
-uint8_t telemetry_link=0;
+ uint8_t pktt[MAX_PKT];//telemetry receiving packets
+ volatile uint8_t tx_head;
+ volatile uint8_t tx_tail;
+ uint8_t v_lipo;
+ int16_t RSSI_dBm;
+ //const uint8_t RSSI_offset=72;//69 71.72 values db
+ uint8_t telemetry_link=0;
+ uint8_t telemetry_counter=0;
#endif
// Callback
diff --git a/Multiprotocol/NRF24l01_SPI.ino b/Multiprotocol/NRF24l01_SPI.ino
index c14f5d5..cec1439 100644
--- a/Multiprotocol/NRF24l01_SPI.ino
+++ b/Multiprotocol/NRF24l01_SPI.ino
@@ -257,6 +257,7 @@ uint8_t NRF24L01_packet_ack()
///////////////
// XN297 emulation layer
+uint8_t xn297_scramble_enabled;
uint8_t xn297_addr_len;
uint8_t xn297_tx_addr[5];
uint8_t xn297_rx_addr[5];
@@ -269,9 +270,16 @@ static const uint8_t xn297_scramble[] = {
0x1b, 0x5d, 0x19, 0x10, 0x24, 0xd3, 0xdc, 0x3f,
0x8e, 0xc5, 0x2f};
-static const uint16_t xn297_crc_xorout[] = {
- 0x0000, 0x3448, 0x9BA7, 0x8BBB, 0x85E1, 0x3E8C, // 1st entry is missing, probably never needed
- 0x451E, 0x18E6, 0x6B24, 0xE7AB, 0x3828, 0x814B, // it's used for 3-byte address w/ 0 byte payload only
+const uint16_t PROGMEM xn297_crc_xorout[] = {
+ 0x0000, 0x3d5f, 0xa6f1, 0x3a23, 0xaa16, 0x1caf,
+ 0x62b2, 0xe0eb, 0x0821, 0xbe07, 0x5f1a, 0xaf15,
+ 0x4f0a, 0xad24, 0x5e48, 0xed34, 0x068c, 0xf2c9,
+ 0x1852, 0xdf36, 0x129d, 0xb17c, 0xd5f5, 0x70d7,
+ 0xb798, 0x5133, 0x67db, 0xd94e};
+
+const uint16_t PROGMEM xn297_crc_xorout_scrambled[] = {
+ 0x0000, 0x3448, 0x9BA7, 0x8BBB, 0x85E1, 0x3E8C,
+ 0x451E, 0x18E6, 0x6B24, 0xE7AB, 0x3828, 0x814B,
0xD461, 0xF494, 0x2503, 0x691D, 0xFE8B, 0x9BA7,
0x8B17, 0x2920, 0x8B5F, 0x61B1, 0xD391, 0x7401,
0x2138, 0x129F, 0xB3A0, 0x2988};
@@ -327,16 +335,21 @@ void XN297_SetRXAddr(const uint8_t* addr, uint8_t len)
memcpy(buf, addr, len);
memcpy(xn297_rx_addr, addr, len);
for (uint8_t i = 0; i < xn297_addr_len; ++i)
- buf[i] = xn297_rx_addr[i] ^ xn297_scramble[xn297_addr_len-i-1];
+ {
+ buf[i] = xn297_rx_addr[i];
+ if(xn297_scramble_enabled)
+ buf[i] ^= xn297_scramble[xn297_addr_len-i-1];
+ }
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, len-2);
NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, buf, 5);
}
-void XN297_Configure(uint8_t flags)
+void XN297_Configure(uint16_t flags)
{
+ xn297_scramble_enabled = !(flags & BV(XN297_UNSCRAMBLED));
xn297_crc = !!(flags & BV(NRF24L01_00_EN_CRC));
flags &= ~(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO));
- NRF24L01_WriteReg(NRF24L01_00_CONFIG, flags);
+ NRF24L01_WriteReg(NRF24L01_00_CONFIG, flags & 0xFF);
}
void XN297_WritePayload(uint8_t* msg, uint8_t len)
@@ -352,12 +365,20 @@ void XN297_WritePayload(uint8_t* msg, uint8_t len)
buf[last++] = 0x55;
}
for (uint8_t i = 0; i < xn297_addr_len; ++i)
- buf[last++] = xn297_tx_addr[xn297_addr_len-i-1] ^ xn297_scramble[i];
-
- for (uint8_t i = 0; i < len; ++i) {
+ {
+ buf[last] = xn297_tx_addr[xn297_addr_len-i-1];
+ if(xn297_scramble_enabled)
+ buf[last] ^= xn297_scramble[i];
+ last++;
+ }
+ for (uint8_t i = 0; i < len; ++i)
+ {
// bit-reverse bytes in packet
uint8_t b_out = bit_reverse(msg[i]);
- buf[last++] = b_out ^ xn297_scramble[xn297_addr_len+i];
+ buf[last] = b_out;
+ if(xn297_scramble_enabled)
+ buf[last] ^= xn297_scramble[xn297_addr_len+i];
+ last++;
}
if (xn297_crc)
{
@@ -365,7 +386,10 @@ void XN297_WritePayload(uint8_t* msg, uint8_t len)
uint16_t crc = 0xb5d2;
for (uint8_t i = offset; i < last; ++i)
crc = crc16_update(crc, buf[i]);
- crc ^= xn297_crc_xorout[xn297_addr_len - 3 + len];
+ if(xn297_scramble_enabled)
+ crc ^= pgm_read_word(&xn297_crc_xorout_scrambled[xn297_addr_len - 3 + len]);
+ else
+ crc ^= pgm_read_word(&xn297_crc_xorout[xn297_addr_len - 3 + len]);
buf[last++] = crc >> 8;
buf[last++] = crc & 0xff;
}
@@ -374,9 +398,14 @@ void XN297_WritePayload(uint8_t* msg, uint8_t len)
void XN297_ReadPayload(uint8_t* msg, uint8_t len)
{
+ // TODO: if xn297_crc==1, check CRC before filling *msg
NRF24L01_ReadPayload(msg, len);
for(uint8_t i=0; i>5);
- if(pktt[len-2] >=128)
- RSSI_dBm -= 82;
- else
- RSSI_dBm += 65;
-}
-
-void frsky_check_telemetry(uint8_t *pkt,uint8_t len)
-{
- if(pkt[1] != rx_tx_addr[3] || pkt[2] != rx_tx_addr[2] || len != pkt[0] + 3)
- {//only packets with the required id and packet length
- for(uint8_t i=3;i<6;i++)
- pktt[i]=0;
- return;
- }
- else
- {
- for (uint8_t i=3;i0)
- telemetry_counter=(telemetry_counter+1)%32;
- }
-}
-
-void frsky_link_frame()
-{
- frame[0] = 0xFE;
- if ((cur_protocol[0]&0x1F)==MODE_FRSKY)
- {
- compute_RSSIdbm();
- frame[1] = pktt[3];
- frame[2] = pktt[4];
- frame[3] = (uint8_t)RSSI_dBm;
- frame[4] = pktt[5]*2;
- }
- else
- if ((cur_protocol[0]&0x1F)==MODE_HUBSAN)
- {
- frame[1] = v_lipo*2; //v_lipo; common 0x2A=42/10=4.2V
- frame[2] = frame[1];
- frame[3] = 0x00;
- frame[4] = (uint8_t)RSSI_dBm;
- }
- frame[5] = frame[6] = frame[7] = frame[8] = 0;
- frskySendStuffed();
-}
-
-#if defined HUB_TELEMETRY
-void frsky_user_frame()
-{
- uint8_t indexx = 0, c=0, j=8, n=0, i;
-
- if(pktt[6]>0 && pktt[6]<=MAX_PKTX)
- {//only valid hub frames
- frame[0] = 0xFD;
- frame[1] = 0;
- frame[2] = pktt[7];
+
+ void compute_RSSIdbm(){
- switch(pass)
- {
- case 0:
- indexx=pktt[6];
- for(i=0;i>5);
+ if(pktt[len-2] >=128)
+ RSSI_dBm -= 82;
+ else
+ RSSI_dBm += 65;
+ }
+
+ void frsky_check_telemetry(uint8_t *pkt,uint8_t len)
+ {
+ if(pkt[1] != rx_tx_addr[3] || pkt[2] != rx_tx_addr[2] || len != pkt[0] + 3)
+ {//only packets with the required id and packet length
+ for(uint8_t i=3;i<6;i++)
+ pktt[i]=0;
return;
- frame[1] = index;
+ }
+ else
+ {
+ for (uint8_t i=3;i0)
+ telemetry_counter=(telemetry_counter+1)%32;
+ }
+ }
+
+ void frsky_link_frame()
+ {
+ frame[0] = 0xFE;
+ if ((cur_protocol[0]&0x1F)==MODE_FRSKY)
+ {
+ compute_RSSIdbm();
+ frame[1] = pktt[3];
+ frame[2] = pktt[4];
+ frame[3] = (uint8_t)RSSI_dBm;
+ frame[4] = pktt[5]*2;
+ }
+ else
+ if ((cur_protocol[0]&0x1F)==MODE_HUBSAN)
+ {
+ frame[1] = v_lipo*2; //v_lipo; common 0x2A=42/10=4.2V
+ frame[2] = frame[1];
+ frame[3] = 0x00;
+ frame[4] = (uint8_t)RSSI_dBm;
+ }
+ frame[5] = frame[6] = frame[7] = frame[8] = 0;
frskySendStuffed();
}
- else
- pass=0;
-}
-#endif
-
-void frskyUpdate()
-{
- if(telemetry_link)
- {
- frsky_link_frame();
- telemetry_link=0;
- return;
- }
+
#if defined HUB_TELEMETRY
- if(!telemetry_link && (cur_protocol[0]&0x1F) != MODE_HUBSAN )
- frsky_user_frame();
+ void frsky_user_frame()
+ {
+ uint8_t indexx = 0, c=0, j=8, n=0, i;
+
+ if(pktt[6]>0 && pktt[6]<=MAX_PKTX)
+ {//only valid hub frames
+ frame[0] = 0xFD;
+ frame[1] = 0;
+ frame[2] = pktt[7];
+
+ switch(pass)
+ {
+ case 0:
+ indexx=pktt[6];
+ for(i=0;i0)
+ {
+ crc_s += p[i]; //0-1FF
+ crc_s += crc_s >> 8; //0-100
+ crc_s &= 0x00ff;
+ }
+ }
+ }
+
+ void sportIdle()
+ {
+ Serial_write(0x7e);
+ }
+ void sportSendFrame()
+ {
+ //at the moment only SWR RSSI,RxBt and A2.
+ sport_counter = (sport_counter + 1) %9;
+
+ for (uint8_t i=5;i<8;i++)
+ frame[i]=0;
+
+ switch (sport_counter)
+ {
+ case 0: // SWR
+ frame[0] = 0x98;
+ frame[1] = 0x10;
+ frame[2] = 0x05;
+ frame[3] = 0xf1;
+ frame[4] = 0x20;//dummy values if swr 20230f00
+ frame[5] = 0x23;
+ frame[6] = 0x0F;
+ frame[7] = 0x00;
+ break;
+ case 1: // RSSI
+ frame[0] = 0x98;
+ frame[1] = 0x10;
+ frame[2] = 0x01;
+ frame[3] = 0xf1;
+ frame[4] = rssi;
+ break;
+ case 2: //BATT
+ frame[0] = 0x98;
+ frame[1] = 0x10;
+ frame[2] = 0x04;
+ frame[3] = 0xf1;
+ frame[4] = RxBt;//a1;
+ break;
+ case 3: //ADC2(A2)
+ frame[0] = 0x1A;
+ frame[1] = 0x10;
+ frame[2] = 0x03;
+ frame[3] = 0xf1;
+ frame[4] = ADC2;//a2;;
+ break;
+ default:
+ sportIdle();
+ return;
+ }
+ sportSend(frame);
+ }
+
+ void process_sport_data()//only for ADC2
+ {
+ uint8_t j=7;
+ if(pktt[6]>0 && pktt[6]<=USER_MAX_BYTES)
+ {
+ for(uint8_t i=0;i<6;i++)
+ if(pktt[j++]==0x03)
+ if(pktt[j]==0xF1)
+ {
+ ADC2=pktt[j+1];
+ break;
+ }
+ pktt[6]=0;//new frame
+ }
+ }
+ #endif
+
+
+ void frskyUpdate()
+ {
+ if(telemetry_link && (cur_protocol[0]&0x1F) != MODE_FRSKYX )
+ {
+ frsky_link_frame();
+ telemetry_link=0;
+ return;
+ }
+ #if defined HUB_TELEMETRY
+ if(!telemetry_link && (cur_protocol[0]&0x1F) != MODE_HUBSAN && (cur_protocol[0]&0x1F) != MODE_FRSKYX)
+ {
+ frsky_user_frame();
+ return;
+ }
+ #endif
+ #if defined SPORT_TELEMETRY
+ if ((cur_protocol[0]&0x1F)==MODE_FRSKYX)
+ {
+ if(telemetry_link)
+ {
+ process_sport_data();
+ if(pktt[4]>0x36)
+ rssi=pktt[4]/2;
+ else
+ RxBt=pktt[4];
+ telemetry_link=0;
+ }
+ uint32_t now = micros();
+ if ((now - last) > SPORT_TIME)
+ {
+ sportSendFrame();
+ last = now;
+ }
+ }
+ #endif
+ }
+
#endif
\ No newline at end of file
diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h
index f76d79e..83bf3ec 100644
--- a/Multiprotocol/_Config.h
+++ b/Multiprotocol/_Config.h
@@ -23,31 +23,40 @@
//Uncomment to enable telemetry
#define TELEMETRY
-#define HUB_TELEMETRY
+
+//Comment if a module is not installed
+#define A7105_INSTALLED
+#define CYRF6936_INSTALLED
+#define CC2500_INSTALLED
+#define NFR24L01_INSTALLED
//Comment a protocol to exclude it from compilation
-//A7105 protocols
-#define FLYSKY_A7105_INO
-#define HUBSAN_A7105_INO
-//CYRF6936 protocols
-#define DEVO_CYRF6936_INO
-#define DSM2_CYRF6936_INO
-//CC2500 protocols
-#define FRSKY_CC2500_INO
-//#define FRSKYX_CC2500_INO
-//NFR24L01 protocols
-#define BAYANG_NRF24L01_INO
-#define CG023_NRF24L01_INO
-#define CX10_NRF24L01_INO
-#define ESKY_NRF24L01_INO
-#define HISKY_NRF24L01_INO
-#define KN_NRF24L01_INO
-#define SLT_NRF24L01_INO
-#define SYMAX_NRF24L01_INO
-#define V2X2_NRF24L01_INO
-#define YD717_NRF24L01_INO
-#define MT99XX_NRF24L01_INO
-#define MJXQ_NRF24L01_INO
+#ifdef A7105_INSTALLED
+ #define FLYSKY_A7105_INO
+ #define HUBSAN_A7105_INO
+#endif
+#ifdef CYRF6936_INSTALLED
+ #define DEVO_CYRF6936_INO
+ #define DSM2_CYRF6936_INO
+#endif
+#ifdef CC2500_INSTALLED
+ #define FRSKY_CC2500_INO
+ #define FRSKYX_CC2500_INO
+#endif
+#ifdef NFR24L01_INSTALLED
+ #define BAYANG_NRF24L01_INO
+ #define CG023_NRF24L01_INO
+ #define CX10_NRF24L01_INO
+ #define ESKY_NRF24L01_INO
+ #define HISKY_NRF24L01_INO
+ #define KN_NRF24L01_INO
+ #define SLT_NRF24L01_INO
+ #define SYMAX_NRF24L01_INO
+ #define V2X2_NRF24L01_INO
+ #define YD717_NRF24L01_INO
+ #define MT99XX_NRF24L01_INO
+ #define MJXQ_NRF24L01_INO
+#endif
//Update this table to set which protocol and all associated settings are called for the corresponding dial number
static const PPM_Parameters PPM_prot[15]=
diff --git a/Multiprotocol/iface_nrf24l01.h b/Multiprotocol/iface_nrf24l01.h
index 1acf438..92ff9e1 100644
--- a/Multiprotocol/iface_nrf24l01.h
+++ b/Multiprotocol/iface_nrf24l01.h
@@ -102,18 +102,7 @@ enum {
#define REUSE_TX_PL 0xE3
//#define NOP 0xFF
-/*
-void NRF24L01_Initialize();
-byte NRF24L01_WriteReg(byte reg, byte data);
-byte NRF24L01_WriteRegisterMulti(byte reg, byte data[], byte length);
-byte NRF24L01_WritePayload(byte *data, byte len);
-byte NRF24L01_ReadReg(byte reg);
-byte NRF24L01_ReadRegisterMulti(byte reg, byte data[], byte length);
-byte NRF24L01_ReadPayload(byte *data, byte len);
+// XN297 emulation layer
+#define XN297_UNSCRAMBLED 8
-byte NRF24L01_FlushTx();
-byte NRF24L01_FlushRx();
-byte NRF24L01_Activate(byte code);
-
-*/
#endif
\ No newline at end of file
diff --git a/Multiprotocol/multiprotocol.h b/Multiprotocol/multiprotocol.h
index 3f735e5..ec6e437 100644
--- a/Multiprotocol/multiprotocol.h
+++ b/Multiprotocol/multiprotocol.h
@@ -353,41 +353,40 @@ enum {
//*******************
const uint16_t PROGMEM CRCTable[]=
{
- 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf,
- 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7,
- 0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e,
- 0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876,
- 0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd,
- 0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5,
- 0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c,
- 0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974,
- 0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb,
- 0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3,
- 0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a,
- 0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72,
- 0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9,
- 0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1,
- 0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738,
- 0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70,
- 0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7,
- 0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff,
- 0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036,
- 0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e,
- 0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5,
- 0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd,
- 0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134,
- 0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c,
- 0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3,
- 0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb,
- 0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232,
- 0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a,
- 0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1,
- 0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9,
- 0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330,
- 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78
+ 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf,
+ 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7,
+ 0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e,
+ 0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876,
+ 0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd,
+ 0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5,
+ 0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c,
+ 0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974,
+ 0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb,
+ 0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3,
+ 0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a,
+ 0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72,
+ 0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9,
+ 0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1,
+ 0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738,
+ 0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70,
+ 0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7,
+ 0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff,
+ 0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036,
+ 0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e,
+ 0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5,
+ 0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd,
+ 0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134,
+ 0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c,
+ 0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3,
+ 0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb,
+ 0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232,
+ 0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a,
+ 0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1,
+ 0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9,
+ 0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330,
+ 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78
};
-
//****************************************
//*** MULTI protocol serial definition ***
//****************************************