FrSkyX: few cosmetic and optimization changes

This commit is contained in:
Pascal Langer 2019-09-18 11:05:46 +02:00
parent 7948e33cbc
commit ab2315c951
5 changed files with 48 additions and 47 deletions

View File

@ -163,6 +163,29 @@ uint16_t convert_channel_frsky(uint8_t num)
/******************************/ /******************************/
/** FrSky D and X routines **/ /** FrSky D and X routines **/
/******************************/ /******************************/
#if defined(FRSKYX_CC2500_INO) || defined(FRSKYX_RX_CC2500_INO)
//**CRC**
const uint16_t PROGMEM frskyX_CRC_Short[]={
0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7 };
static uint16_t __attribute__((unused)) frskyX_CRCTable(uint8_t val)
{
uint16_t word ;
word = pgm_read_word(&frskyX_CRC_Short[val&0x0F]) ;
val /= 16 ;
return word ^ (0x1081 * val) ;
}
uint16_t frskyX_crc_x(uint8_t *data, uint8_t len)
{
uint16_t crc = 0;
for(uint8_t i=0; i < len; i++)
crc = (crc<<8) ^ frskyX_CRCTable((uint8_t)(crc>>8) ^ *data++);
return crc;
}
#endif
#if defined(FRSKYD_CC2500_INO) || defined(FRSKYX_CC2500_INO) #if defined(FRSKYD_CC2500_INO) || defined(FRSKYX_CC2500_INO)
enum { enum {
FRSKY_BIND = 0, FRSKY_BIND = 0,

View File

@ -25,14 +25,9 @@
FRSKYX_RX_DATA, FRSKYX_RX_DATA,
}; };
static uint16_t frskyx_bind_check;
static uint8_t frskyx_rx_txid[3];
static uint16_t frskyx_rx_rc_chan[16];
static uint8_t frskyx_rx_chanskip; static uint8_t frskyx_rx_chanskip;
static uint8_t frskyx_rx_disable_lna; static uint8_t frskyx_rx_disable_lna;
static uint8_t frskyx_rx_data_started; static uint8_t frskyx_rx_data_started;
static uint8_t frskyx_rx_rssi;
static uint8_t frskyx_rx_pps;
static void __attribute__((unused)) FrSkyX_Rx_initialise() { static void __attribute__((unused)) FrSkyX_Rx_initialise() {
CC2500_Reset(); CC2500_Reset();
@ -134,6 +129,7 @@ static uint8_t __attribute__((unused)) frskyx_rx_check_crc()
static void __attribute__((unused)) frskyx_rx_build_telemetry_packet() static void __attribute__((unused)) frskyx_rx_build_telemetry_packet()
{ {
static uint16_t frskyx_rx_rc_chan[16];
uint16_t pxx_channel[8]; uint16_t pxx_channel[8];
uint32_t bits = 0; uint32_t bits = 0;
uint8_t bitsavailable = 0; uint8_t bitsavailable = 0;
@ -158,8 +154,8 @@ static void __attribute__((unused)) frskyx_rx_build_telemetry_packet()
} }
// buid telemetry packet // buid telemetry packet
pkt[idx++] = frskyx_rx_pps; pkt[idx++] = RX_LQI;
pkt[idx++] = frskyx_rx_rssi; pkt[idx++] = RX_RSSI;
pkt[idx++] = 0; // start channel pkt[idx++] = 0; // start channel
pkt[idx++] = 16; // number of channels in packet pkt[idx++] = 16; // number of channels in packet
@ -178,7 +174,7 @@ static void __attribute__((unused)) frskyx_rx_build_telemetry_packet()
uint16_t initFrSkyX_Rx() uint16_t initFrSkyX_Rx()
{ {
FrSkyX_Rx_initialise(); FrSkyX_Rx_initialise();
frskyx_bind_check = 0; state = 0;
frskyx_rx_chanskip = 1; frskyx_rx_chanskip = 1;
hopping_frequency_no = 0; hopping_frequency_no = 0;
frskyx_rx_data_started = 0; frskyx_rx_data_started = 0;
@ -188,14 +184,14 @@ uint16_t initFrSkyX_Rx()
} }
else { else {
uint16_t temp = FRSKYX_RX_EEPROM_OFFSET + ((RX_num & 0x03) * 50); uint16_t temp = FRSKYX_RX_EEPROM_OFFSET + ((RX_num & 0x03) * 50);
frskyx_rx_txid[0] = eeprom_read_byte(temp++); rx_tx_addr[0] = eeprom_read_byte(temp++);
frskyx_rx_txid[1] = eeprom_read_byte(temp++); rx_tx_addr[1] = eeprom_read_byte(temp++);
frskyx_rx_txid[2] = eeprom_read_byte(temp++); rx_tx_addr[2] = eeprom_read_byte(temp++);
for(uint8_t ch = 0; ch < 47; ch++) for(uint8_t ch = 0; ch < 47; ch++)
hopping_frequency[ch] = eeprom_read_byte(temp++); hopping_frequency[ch] = eeprom_read_byte(temp++);
frskyx_rx_calibrate(); frskyx_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, frskyx_rx_txid[0]); // set address CC2500_WriteReg(CC2500_09_ADDR, rx_tx_addr[0]); // set address
CC2500_WriteReg(CC2500_07_PKTCTRL1, 0x05); // check address CC2500_WriteReg(CC2500_07_PKTCTRL1, 0x05); // check address
frskyx_rx_set_channel(hopping_frequency_no); frskyx_rx_set_channel(hopping_frequency_no);
phase = FRSKYX_RX_DATA; phase = FRSKYX_RX_DATA;
@ -228,25 +224,25 @@ uint16_t FrSkyX_Rx_callback()
if (packet[5] <= 0x2D) { if (packet[5] <= 0x2D) {
for (ch = 0; ch < 5; ch++) for (ch = 0; ch < 5; ch++)
hopping_frequency[packet[5]+ch] = packet[6+ch]; hopping_frequency[packet[5]+ch] = packet[6+ch];
frskyx_bind_check |= 1 << (packet[5] / 5); state |= 1 << (packet[5] / 5);
} }
} }
if (frskyx_bind_check == 0x3ff) { if (state == 0x3ff) {
debugln("bind complete"); debugln("bind complete");
frskyx_rx_calibrate(); frskyx_rx_calibrate();
frskyx_rx_txid[0] = packet[3]; // TXID rx_tx_addr[0] = packet[3]; // TXID
frskyx_rx_txid[1] = packet[4]; // TXID rx_tx_addr[1] = packet[4]; // TXID
frskyx_rx_txid[2] = packet[12]; // RX # rx_tx_addr[2] = packet[12]; // RX #
CC2500_WriteReg(CC2500_18_MCSM0, 0x08); // FS_AUTOCAL = manual CC2500_WriteReg(CC2500_18_MCSM0, 0x08); // FS_AUTOCAL = manual
CC2500_WriteReg(CC2500_09_ADDR, frskyx_rx_txid[0]); // set address CC2500_WriteReg(CC2500_09_ADDR, rx_tx_addr[0]); // set address
CC2500_WriteReg(CC2500_07_PKTCTRL1, 0x05); // check address CC2500_WriteReg(CC2500_07_PKTCTRL1, 0x05); // check address
phase = FRSKYX_RX_DATA; phase = FRSKYX_RX_DATA;
frskyx_rx_set_channel(hopping_frequency_no); frskyx_rx_set_channel(hopping_frequency_no);
// store txid and channel list // store txid and channel list
uint16_t temp = FRSKYX_RX_EEPROM_OFFSET+((RX_num & 0x03) * 50); uint16_t temp = FRSKYX_RX_EEPROM_OFFSET+((RX_num & 0x03) * 50);
eeprom_write_byte((EE_ADDR)temp++, frskyx_rx_txid[0]); eeprom_write_byte((EE_ADDR)temp++, rx_tx_addr[0]);
eeprom_write_byte((EE_ADDR)temp++, frskyx_rx_txid[1]); eeprom_write_byte((EE_ADDR)temp++, rx_tx_addr[1]);
eeprom_write_byte((EE_ADDR)temp++, frskyx_rx_txid[2]); eeprom_write_byte((EE_ADDR)temp++, rx_tx_addr[2]);
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]);
BIND_DONE; BIND_DONE;
@ -260,12 +256,12 @@ uint16_t FrSkyX_Rx_callback()
len = CC2500_ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; len = CC2500_ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
if (len >= packet_length) { if (len >= packet_length) {
CC2500_ReadData(packet, packet_length); CC2500_ReadData(packet, packet_length);
if (packet[1] == frskyx_rx_txid[0] && packet[2] == frskyx_rx_txid[1] && packet[6] == frskyx_rx_txid[2] && frskyx_rx_check_crc()) { if (packet[1] == rx_tx_addr[0] && packet[2] == rx_tx_addr[1] && packet[6] == rx_tx_addr[2] && frskyx_rx_check_crc()) {
frskyx_rx_rssi = packet[packet_length-2]; RX_RSSI = packet[packet_length-2];
if(frskyx_rx_rssi >= 128) if(RX_RSSI >= 128)
frskyx_rx_rssi -= 128; RX_RSSI -= 128;
else else
frskyx_rx_rssi += 128; RX_RSSI += 128;
// hop to next channel // hop to next channel
frskyx_rx_chanskip = ((packet[4] & 0xC0) >> 6) | ((packet[5] & 0x3F) << 2); frskyx_rx_chanskip = ((packet[4] & 0xC0) >> 6) | ((packet[5] & 0x3F) << 2);
hopping_frequency_no = (hopping_frequency_no + frskyx_rx_chanskip) % 47; hopping_frequency_no = (hopping_frequency_no + frskyx_rx_chanskip) % 47;
@ -284,7 +280,7 @@ uint16_t FrSkyX_Rx_callback()
if (millis() - pps_timer >= 1000) { if (millis() - pps_timer >= 1000) {
pps_timer = millis(); pps_timer = millis();
debugln("%ld pps", pps_counter); debugln("%ld pps", pps_counter);
frskyx_rx_pps = pps_counter; RX_LQI = pps_counter;
pps_counter = 0; pps_counter = 0;
} }

View File

@ -55,25 +55,6 @@ static void __attribute__((unused)) frskyX_initialize_data(uint8_t adr)
CC2500_WriteReg(CC2500_07_PKTCTRL1,0x05); CC2500_WriteReg(CC2500_07_PKTCTRL1,0x05);
} }
//**CRC**
const uint16_t PROGMEM frskyX_CRC_Short[]={
0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7 };
static uint16_t __attribute__((unused)) frskyX_CRCTable(uint8_t val)
{
uint16_t word ;
word = pgm_read_word(&frskyX_CRC_Short[val&0x0F]) ;
val /= 16 ;
return word ^ (0x1081 * val) ;
}
uint16_t frskyX_crc_x(uint8_t *data, uint8_t len)
{
uint16_t crc = 0;
for(uint8_t i=0; i < len; i++)
crc = (crc<<8) ^ frskyX_CRCTable((uint8_t)(crc>>8) ^ *data++);
return crc;
}
static void __attribute__((unused)) frskyX_build_bind_packet() static void __attribute__((unused)) frskyX_build_bind_packet()
{ {
packet[0] = (sub_protocol & 2 ) ? 0x20 : 0x1D ; // LBT or FCC packet[0] = (sub_protocol & 2 ) ? 0x20 : 0x1D ; // LBT or FCC

View File

@ -52,4 +52,5 @@
52,ZSX,280 52,ZSX,280
53,Flyzone,FZ-410 53,Flyzone,FZ-410
54,Scanner 54,Scanner
55,FrskyX_RX,FCC,EU_LBT
63,XN_DUMP,250K,1M,2M 63,XN_DUMP,250K,1M,2M

View File

@ -19,7 +19,7 @@
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 2 #define VERSION_MINOR 2
#define VERSION_REVISION 1 #define VERSION_REVISION 1
#define VERSION_PATCH_LEVEL 77 #define VERSION_PATCH_LEVEL 78
//****************** //******************
// Protocols // Protocols