Failsafe: default for PPM and set on radio for Serial

This commit is contained in:
Pascal Langer
2017-12-07 16:02:18 +01:00
parent ebd44d9628
commit 4418cab3a5
12 changed files with 255 additions and 237 deletions

View File

@@ -19,14 +19,13 @@
#include "iface_cc2500.h"
uint8_t chanskip;
//uint8_t seq_last_sent;
//uint8_t seq_last_rcvd;
uint8_t FrX_chanskip;
uint8_t FrX_send_seq ;
uint8_t FrX_receive_seq ;
static void __attribute__((unused)) set_start(uint8_t ch )
#define FRX_FAILSAFE_TIMEOUT 1032
static void __attribute__((unused)) frskyX_set_start(uint8_t ch )
{
CC2500_Strobe(CC2500_SIDLE);
CC2500_WriteReg(CC2500_25_FSCAL1, calData[ch]);
@@ -48,7 +47,7 @@ static void __attribute__((unused)) frskyX_init()
//#######END INIT########
}
static void __attribute__((unused)) initialize_data(uint8_t adr)
static void __attribute__((unused)) frskyX_initialize_data(uint8_t adr)
{
CC2500_WriteReg(CC2500_0C_FSCTRL0,option); // Frequency offset hack
CC2500_WriteReg(CC2500_18_MCSM0, 0x8);
@@ -57,28 +56,28 @@ static void __attribute__((unused)) initialize_data(uint8_t adr)
}
//**CRC**
const uint16_t PROGMEM CRC_Short[]={
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 CRCTable(uint8_t val)
static uint16_t __attribute__((unused)) frskyX_CRCTable(uint8_t val)
{
uint16_t word ;
word = pgm_read_word(&CRC_Short[val&0x0F]) ;
word = pgm_read_word(&frskyX_CRC_Short[val&0x0F]) ;
val /= 16 ;
return word ^ (0x1081 * val) ;
}
static uint16_t __attribute__((unused)) crc_x(uint8_t *data, uint8_t len)
static uint16_t __attribute__((unused)) frskyX_crc_x(uint8_t *data, uint8_t len)
{
uint16_t crc = 0;
for(uint8_t i=0; i < len; i++)
crc = (crc<<8) ^ CRCTable((uint8_t)(crc>>8) ^ *data++);
crc = (crc<<8) ^ frskyX_CRCTable((uint8_t)(crc>>8) ^ *data++);
return crc;
}
// 0-2047, 0 = 817, 1024 = 1500, 2047 = 2182
//64=860,1024=1500,1984=2140//Taranis 125%
static uint16_t __attribute__((unused)) scaleForPXX( uint8_t i )
static uint16_t __attribute__((unused)) frskyX_scaleForPXX( uint8_t i )
{ //mapped 860,2140(125%) range to 64,1984(PXX values);
return (uint16_t)(((Servo_data[i]-servo_min_125)*3)>>1)+64;
}
@@ -103,7 +102,7 @@ static void __attribute__((unused)) frskyX_build_bind_packet()
//
uint8_t limit = (sub_protocol & 2 ) ? 31 : 28 ;
memset(&packet[13], 0, limit - 13);
uint16_t lcrc = crc_x(&packet[3], limit-3);
uint16_t lcrc = frskyX_crc_x(&packet[3], limit-3);
//
packet[limit++] = lcrc >> 8;
packet[limit] = lcrc;
@@ -124,8 +123,8 @@ static void __attribute__((unused)) frskyX_data_frame()
packet[2] = rx_tx_addr[2];
packet[3] = 0x02;
//
packet[4] = (chanskip<<6)|hopping_frequency_no;
packet[5] = chanskip>>2;
packet[4] = (FrX_chanskip<<6)|hopping_frequency_no;
packet[5] = FrX_chanskip>>2;
packet[6] = RX_num;
//packet[7] = FLAGS 00 - standard packet
//10, 12, 14, 16, 18, 1A, 1C, 1E - failsafe packet
@@ -138,12 +137,12 @@ static void __attribute__((unused)) frskyX_data_frame()
for(uint8_t i = 0; i <12 ; i+=3)
{//12 bytes
chan_0 = scaleForPXX(startChan);
chan_0 = frskyX_scaleForPXX(startChan);
if(lpass & 1 )
chan_0+=2048;
startChan+=1;
//
chan_1 = scaleForPXX(startChan);
chan_1 = frskyX_scaleForPXX(startChan);
if(lpass & 1 )
chan_1+= 2048;
startChan+=1;
@@ -187,8 +186,8 @@ static void __attribute__((unused)) frskyX_data_frame()
Serial.println(" ");
#endif
#endif // SPORT_POLLING
uint16_t lcrc = crc_x(&packet[3], limit-3);
uint16_t lcrc = frskyX_crc_x(&packet[3], limit-3);
packet[limit++]=lcrc>>8;//high byte
packet[limit]=lcrc;//low byte
}
@@ -198,7 +197,7 @@ uint16_t ReadFrSkyX()
switch(state)
{
default:
set_start(47);
frskyX_set_start(47);
CC2500_SetPower();
CC2500_Strobe(CC2500_SFRX);
//
@@ -211,7 +210,7 @@ uint16_t ReadFrSkyX()
state++;
return 9000;
case FRSKY_BIND_DONE:
initialize_data(0);
frskyX_initialize_data(0);
hopping_frequency_no=0;
BIND_DONE;
state++;
@@ -223,10 +222,10 @@ uint16_t ReadFrSkyX()
prev_option = option ;
}
CC2500_SetTxRxMode(TX_EN);
set_start(hopping_frequency_no);
frskyX_set_start(hopping_frequency_no);
CC2500_SetPower();
CC2500_Strobe(CC2500_SFRX);
hopping_frequency_no = (hopping_frequency_no+chanskip)%47;
hopping_frequency_no = (hopping_frequency_no+FrX_chanskip)%47;
CC2500_Strobe(CC2500_SIDLE);
CC2500_WriteData(packet, packet[0]+1);
//
@@ -287,8 +286,8 @@ uint16_t initFrSkyX()
set_rx_tx_addr(MProtocol_id_master);
Frsky_init_hop();
packet_count=0;
while(!chanskip)
chanskip=random(0xfefefefe)%47;
while(!FrX_chanskip)
FrX_chanskip=random(0xfefefefe)%47;
//for test***************
//rx_tx_addr[3]=0xB3;
@@ -299,12 +298,12 @@ uint16_t initFrSkyX()
if(IS_AUTOBIND_FLAG_on)
{
state = FRSKY_BIND;
initialize_data(1);
frskyX_initialize_data(1);
}
else
{
state = FRSKY_DATA1;
initialize_data(0);
frskyX_initialize_data(0);
}
// seq_last_sent = 0;
// seq_last_rcvd = 8;