FrSkyD telemetry

- rewritten the handling of the incoming over the air telemetry packet
- rewritten the TX_RSSI calculation (link frame[4])
- added RX LQI and TX_LQI information in the link frame (frame[5] and
frame[6])
This commit is contained in:
pascallanger 2017-02-01 09:28:35 +01:00
parent c7e7a559a6
commit 41d75da33f
7 changed files with 68 additions and 91 deletions

View File

@ -110,11 +110,11 @@ static void AFHDS2A_update_telemetry()
v_lipo1 = packet[index+2]; v_lipo1 = packet[index+2];
telemetry_link=1; telemetry_link=1;
break; break;
/*case AFHDS2A_SENSOR_RX_ERR_RATE: case AFHDS2A_SENSOR_RX_ERR_RATE:
// packet[index+2]; RX_LQI=packet[index+2];
break;*/ break;
case AFHDS2A_SENSOR_RX_RSSI: case AFHDS2A_SENSOR_RX_RSSI:
RSSI_dBm = -packet[index+2]; RX_RSSI = -packet[index+2];
break; break;
case 0xff: case 0xff:
return; return;
@ -352,7 +352,7 @@ uint16_t initAFHDS2A()
} }
hopping_frequency_no = 0; hopping_frequency_no = 0;
#if defined(AFHDS2A_FW_TELEMETRY) || defined(AFHDS2A_HUB_TELEMETRY) #if defined(AFHDS2A_FW_TELEMETRY) || defined(AFHDS2A_HUB_TELEMETRY)
init_hub_telemetry(); init_frskyd_link_telemetry();
#endif #endif
return 50000; return 50000;
} }

View File

@ -150,7 +150,7 @@ static void __attribute__((unused)) check_rx(void)
// 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
RSSI_dBm = packet[7]; RX_RSSI = packet[7];
//Flags //Flags
//uint8_t flags = packet[3] >> 3; //uint8_t flags = packet[3] >> 3;
// battery low: flags & 1 // battery low: flags & 1
@ -252,7 +252,7 @@ uint16_t initBAYANG(void)
BAYANG_init(); BAYANG_init();
packet_count=0; packet_count=0;
#ifdef BAYANG_HUB_TELEMETRY #ifdef BAYANG_HUB_TELEMETRY
init_hub_telemetry(); init_frskyd_link_telemetry();
telemetry_lost=1; // do not send telemetry to TX right away until we have a TX_RSSI value to prevent warning message... telemetry_lost=1; // do not send telemetry to TX right away until we have a TX_RSSI value to prevent warning message...
#endif #endif
return BAYANG_INITIAL_WAIT+BAYANG_PACKET_PERIOD; return BAYANG_INITIAL_WAIT+BAYANG_PACKET_PERIOD;

View File

@ -97,6 +97,7 @@ uint16_t initFrSky_2way()
{ {
Frsky_init_hop(); Frsky_init_hop();
packet_count=0; packet_count=0;
init_frskyd_link_telemetry();
if(IS_AUTOBIND_FLAG_on) if(IS_AUTOBIND_FLAG_on)
{ {
frsky2way_init(1); frsky2way_init(1);

View File

@ -352,7 +352,7 @@ uint16_t initHubsan() {
packet_count=0; packet_count=0;
id_data=ID_NORMAL; id_data=ID_NORMAL;
#ifdef HUBSAN_HUB_TELEMETRY #ifdef HUBSAN_HUB_TELEMETRY
init_hub_telemetry(); init_frskyd_link_telemetry();
#endif #endif
return 10000; return 10000;
} }

View File

@ -19,7 +19,7 @@
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 1 #define VERSION_MINOR 1
#define VERSION_REVISION 6 #define VERSION_REVISION 6
#define VERSION_PATCH_LEVEL 8 #define VERSION_PATCH_LEVEL 9
//****************** //******************
// Protocols // Protocols
//****************** //******************

View File

@ -148,8 +148,10 @@ uint8_t pkt[MAX_PKT];//telemetry receiving packets
#endif // BASH_SERIAL #endif // BASH_SERIAL
uint8_t v_lipo1; uint8_t v_lipo1;
uint8_t v_lipo2; uint8_t v_lipo2;
int16_t RSSI_dBm; uint8_t RX_RSSI;
uint8_t TX_RSSI; uint8_t TX_RSSI;
uint8_t RX_LQI;
uint8_t TX_LQI;
uint8_t telemetry_link=0; uint8_t telemetry_link=0;
uint8_t telemetry_counter=0; uint8_t telemetry_counter=0;
uint8_t telemetry_lost; uint8_t telemetry_lost;

View File

@ -28,7 +28,6 @@
uint32_t last = 0; uint32_t last = 0;
uint8_t sport_counter=0; uint8_t sport_counter=0;
uint8_t RxBt = 0; uint8_t RxBt = 0;
uint8_t rssi;
uint8_t sport = 0; uint8_t sport = 0;
#endif #endif
#if defined HUB_TELEMETRY #if defined HUB_TELEMETRY
@ -159,25 +158,25 @@ void frskySendStuffed()
Serial_write(START_STOP); Serial_write(START_STOP);
} }
void compute_RSSIdbm()
{
RSSI_dBm = (((uint16_t)(pktt[len-2])*18)>>4);
if(pktt[len-2] >=128)
RSSI_dBm -= 164;
else
RSSI_dBm += 130;
}
void frsky_check_telemetry(uint8_t *pkt,uint8_t len) 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)) if(pkt[1] == rx_tx_addr[3] && pkt[2] == rx_tx_addr[2] && len ==(pkt[0] + 3))
{ {
for (uint8_t i=3;i<len;i++) telemetry_link=1; // telemetry data is available
pktt[i]=pkt[i]; /*preious version
telemetry_link=1; RSSI_dBm = (((uint16_t)(pktt[len-2])*18)>>4);
if(pktt[6]>0 && pktt[6]<=10) //increment only for valid hub frames if(pktt[len-2] >=128) RSSI_dBm -= 164;
else RSSI_dBm += 130;*/
TX_RSSI = pkt[len-2];
if(TX_RSSI >=128)
TX_RSSI -= 128;
else
TX_RSSI += 128;
TX_LQI = pkt[len-1]&0x7F;
if(pkt[6]>0 && pkt[6]<=10) // increment only for valid size hub frames
telemetry_counter=(telemetry_counter+1)%32; telemetry_counter=(telemetry_counter+1)%32;
for (uint8_t i=3;i<len-2;i++)
pktt[i]=pkt[i]; // buffer telemetry values to be sent
// //
#if defined SPORT_TELEMETRY && defined FRSKYX_CC2500_INO #if defined SPORT_TELEMETRY && defined FRSKYX_CC2500_INO
telemetry_lost=0; telemetry_lost=0;
@ -201,36 +200,40 @@ void frsky_check_telemetry(uint8_t *pkt,uint8_t len)
} }
} }
void init_hub_telemetry() void init_frskyd_link_telemetry()
{ {
telemetry_link=0; telemetry_link=0;
telemetry_counter=0; telemetry_counter=0;
v_lipo1=0; v_lipo1=0;
v_lipo2=0; v_lipo2=0;
RSSI_dBm=0; RX_RSSI=0;
TX_RSSI=0; TX_RSSI=0;
RX_LQI=0;
TX_LQI=0;
} }
void frsky_link_frame() void frsky_link_frame()
{ {
frame[0] = 0xFE; frame[0] = 0xFE; // Link frame
if (protocol==MODE_FRSKYD) if (protocol==MODE_FRSKYD)
{ {
compute_RSSIdbm(); frame[1] = pktt[3]; // A1
frame[1] = pktt[3]; frame[2] = pktt[4]; // A2
frame[2] = pktt[4]; frame[3] = pktt[5]; // RX_RSSI
frame[3] = pktt[5]; telemetry_link++; // Send hub if available
frame[4] = (uint8_t)RSSI_dBm;
} }
else else
if (protocol==MODE_HUBSAN||protocol==MODE_AFHDS2A||protocol==MODE_BAYANG) if (protocol==MODE_HUBSAN||protocol==MODE_AFHDS2A||protocol==MODE_BAYANG)
{ {
frame[1] = v_lipo1; frame[1] = v_lipo1;
frame[2] = v_lipo2; frame[2] = v_lipo2;
frame[3] = (uint8_t)RSSI_dBm; frame[3] = RX_RSSI;
frame[4] = TX_RSSI; telemetry_link=0;
} }
frame[5] = frame[6] = frame[7] = frame[8] = 0; frame[4] = TX_RSSI;
frame[5] = RX_LQI;
frame[6] = TX_LQI;
frame[7] = frame[8] = 0;
#if defined MULTI_TELEMETRY #if defined MULTI_TELEMETRY
multi_send_frskyhub(); multi_send_frskyhub();
#else #else
@ -241,54 +244,26 @@ void frsky_link_frame()
#if defined HUB_TELEMETRY #if defined HUB_TELEMETRY
void frsky_user_frame() void frsky_user_frame()
{ {
uint8_t indexx = 0, j=8, i;
//uint8_t c=0, n=0;
if(pktt[6]>0 && pktt[6]<=10) if(pktt[6]>0 && pktt[6]<=10)
{//only valid hub frames {//only send valid hub frames
frame[0] = 0xFD; frame[0] = 0xFD; // user frame
frame[2] = pktt[7]; if(pktt[6]>USER_MAX_BYTES)
switch(pass)
{ {
case 0: frame[1]=USER_MAX_BYTES; // packet size
indexx=pktt[6]; pktt[6]-=USER_MAX_BYTES;
for(i=0;i<indexx;i++) telemetry_link++; // 2 packets need to be sent
pktx[i]=pktt[j++];
pass=1;
case 1:
indx=indexx;
prev_index = indexx;
if(indx<USER_MAX_BYTES)
{
for(i=0;i<indx;i++)
frame[i+3]=pktx[i];
pktt[6]=0;
pass=0;
}
else
{
indx = USER_MAX_BYTES;
for(i=0;i<indx;i++)
frame[i+3]=pktx[i];
pass=2;
}
break;
case 2:
indx = prev_index - indx;
prev_index=0;
if(indx<=(MAX_PKTX-USER_MAX_BYTES)) //10-6=4
for(i=0;i<indx;i++)
frame[i+3]=pktx[USER_MAX_BYTES+i];
pass=0;
pktt[6]=0;
break;
default:
break;
} }
if(!indx) else
return; {
frame[1] = indx; frame[1]=pktt[6]; // packet size
telemetry_link=0; // only 1 packet or processing second packet
}
frame[2] = pktt[7];
for(uint8_t i=0;i<USER_MAX_BYTES;i++)
frame[i+3]=pktt[i+8];
if(telemetry_link) // prepare the content of second packet
for(uint8_t i=8;i<USER_MAX_BYTES+8;i++)
pktt[i]=pktt[i+USER_MAX_BYTES];
#if defined MULTI_TELEMETRY #if defined MULTI_TELEMETRY
multi_send_frskyhub(); multi_send_frskyhub();
#else #else
@ -296,10 +271,8 @@ void frsky_user_frame()
#endif #endif
} }
else else
pass=0; telemetry_link=0;
} }
#endif
/* /*
HuB RX packets. HuB RX packets.
pkt[6]|(counter++)|00 01 02 03 04 05 06 07 08 09 pkt[6]|(counter++)|00 01 02 03 04 05 06 07 08 09
@ -314,6 +287,8 @@ pkt[6]|(counter++)|00 01 02 03 04 05 06 07 08 09
0A 0F 5E 3A 06 00 5E 5E 3B 09 00 5E 0A 0F 5E 3A 06 00 5E 5E 3B 09 00 5E
05 10 5E 06 16 72 5E 5E 3A 06 00 5E 05 10 5E 06 16 72 5E 5E 3A 06 00 5E
*/ */
#endif
#if defined SPORT_TELEMETRY #if defined SPORT_TELEMETRY
/* SPORT details serial /* SPORT details serial
@ -448,7 +423,7 @@ void sportSendFrame()
case 2: // RSSI case 2: // RSSI
frame[2] = 0x01; frame[2] = 0x01;
frame[3] = 0xf1; frame[3] = 0xf1;
frame[4] = rssi; frame[4] = RX_RSSI;
break; break;
case 4: //BATT case 4: //BATT
frame[2] = 0x04; frame[2] = 0x04;
@ -567,7 +542,7 @@ void TelemetryUpdate()
if(telemetry_link) if(telemetry_link)
{ {
if(pktt[4] & 0x80) if(pktt[4] & 0x80)
rssi=pktt[4] & 0x7F ; RX_RSSI=pktt[4] & 0x7F ;
else else
RxBt = (pktt[4]<<1) + 1 ; RxBt = (pktt[4]<<1) + 1 ;
if(pktt[6]<=6) if(pktt[6]<=6)
@ -589,7 +564,7 @@ void TelemetryUpdate()
#endif #endif
#if defined DSM_TELEMETRY #if defined DSM_TELEMETRY
if(telemetry_link && protocol == MODE_DSM ) if(telemetry_link && protocol == MODE_DSM)
{ // DSM { // DSM
DSM_frame(); DSM_frame();
telemetry_link=0; telemetry_link=0;
@ -604,15 +579,14 @@ void TelemetryUpdate()
return; return;
} }
#endif #endif
if(telemetry_link && protocol != MODE_FRSKYX ) if(telemetry_link == 1 && protocol != MODE_FRSKYX)
{ // FrSkyD + Hubsan + AFHDS2A + Bayang { // FrSkyD + Hubsan + AFHDS2A + Bayang
frsky_link_frame(); frsky_link_frame();
telemetry_link=0;
return; return;
} }
#if defined HUB_TELEMETRY #if defined HUB_TELEMETRY
if(!telemetry_link && protocol == MODE_FRSKYD) if(telemetry_link > 1 && protocol == MODE_FRSKYD)
{ // FrSky { // FrSkyD
frsky_user_frame(); frsky_user_frame();
return; return;
} }