From fbd5d7cf48bda51ddf2ce7b9bee667c29cf356f6 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Sat, 4 Jul 2020 22:43:19 +0200 Subject: [PATCH] FrSky R9: telemetry TX to RX attempt --- Multiprotocol/FrSkyDVX_common.ino | 112 +++++++++++++++++++++++---- Multiprotocol/FrSkyR9_sx1276.ino | 26 +++---- Multiprotocol/FrSkyX_cc2500.ino | 122 ++++++------------------------ Multiprotocol/Multiprotocol.h | 2 +- Multiprotocol/Multiprotocol.ino | 6 +- 5 files changed, 137 insertions(+), 131 deletions(-) diff --git a/Multiprotocol/FrSkyDVX_common.ino b/Multiprotocol/FrSkyDVX_common.ino index ae94339..11d0f49 100644 --- a/Multiprotocol/FrSkyDVX_common.ino +++ b/Multiprotocol/FrSkyDVX_common.ino @@ -382,8 +382,8 @@ void Frsky_init_clone(void) #endif #if defined(FRSKYX_CC2500_INO) || defined(FRSKYR9_SX1276_INO) -uint8_t FrSkyX_TX_Seq, FrSkyX_TX_IN_Seq; -uint8_t FrSkyX_RX_Seq ; + uint8_t FrSkyX_TX_Seq, FrSkyX_TX_IN_Seq; + uint8_t FrSkyX_RX_Seq ; #ifdef SPORT_SEND struct t_FrSkyX_TX_Frame @@ -394,20 +394,102 @@ uint8_t FrSkyX_RX_Seq ; // Store FrskyX telemetry struct t_FrSkyX_TX_Frame FrSkyX_TX_Frames[4] ; #endif + + static void __attribute__((unused)) FrSkyX_seq_sport(uint8_t start, uint8_t end) + { + for (uint8_t i=start+1;i<=end;i++) + packet[i]=0; + packet[start] = FrSkyX_RX_Seq << 4; //TX=8 at startup + #ifdef SPORT_SEND + if (FrSkyX_TX_IN_Seq!=0xFF) + {//RX has replied at least once + if (FrSkyX_TX_IN_Seq & 0x08) + {//Request init + //debugln("Init"); + FrSkyX_TX_Seq = 0 ; + for(uint8_t i=0;i<4;i++) + FrSkyX_TX_Frames[i].count=0; //Discard frames in current output buffer + } + else if (FrSkyX_TX_IN_Seq & 0x04) + {//Retransmit the requested packet + debugln("Retry:%d",FrSkyX_TX_IN_Seq&0x03); + packet[start] |= FrSkyX_TX_IN_Seq&0x03; + packet[start+1] = FrSkyX_TX_Frames[FrSkyX_TX_IN_Seq&0x03].count; + for (uint8_t i=start+2;i SportTail ) + used += MAX_SPORT_BUFFER - SportHead ; + else + used -= SportHead ; + if ( used < (MAX_SPORT_BUFFER>>1) ) + { + DATA_BUFFER_LOW_off; + debugln("Ok buf:%d",used); + } + } + FrSkyX_TX_Seq = ( FrSkyX_TX_Seq + 1 ) & 0x03 ; //Next iteration send next packet + } + else + {//Not in sequence somehow, transmit what the receiver wants but why not asking for retransmit... + //debugln("RX_Seq:%d,TX:%d",FrSkyX_TX_IN_Seq,FrSkyX_TX_Seq); + packet[start] |= FrSkyX_TX_IN_Seq; + packet[start+1] = FrSkyX_TX_Frames[FrSkyX_TX_IN_Seq].count; + for (uint8_t i=start+2;i>2)+1; TX_RSSI=SX1276_ReadReg(SX1276_1A_PACKETRSSI)-157; for(uint8_t i=0;i<9;i++) - packet[4+i]=packet_in[i]; //Adjust buffer to match FrSkyX - frsky_process_telemetry(packet,len); //Check and parse telemetry packets + packet[4+i]=packet_in[i]; // Adjust buffer to match FrSkyX + frsky_process_telemetry(packet,len); // Process telemetry packet pps_counter++; if(TX_LQI==0) - TX_LQI++; //Recover telemetry right away + TX_LQI++; // Recover telemetry right away } } } if (millis() - pps_timer >= 1000) - {//50pps @20ms + {//1 packet every 20ms pps_timer = millis(); debugln("%d pps", pps_counter); - TX_LQI = pps_counter<<1; // Max=100pps + TX_LQI = pps_counter<<1; // Max=100% pps_counter = 0; } if(TX_LQI==0) - FrSkyX_telem_init(); + FrSkyX_telem_init(); // Reset telemetry else telemetry_link=1; // Send telemetry out anyway //Clear all flags diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index 9223462..38520fa 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -98,87 +98,11 @@ static void __attribute__((unused)) FrSkyX_build_packet() packet[5] = FrSkyX_chanskip>>2; packet[6] = RX_num; + //Channels FrSkyX_channels(7); // Set packet[7]=failsafe, packet[8]=0?? and packet[9..20]=channels data - //sequence and send SPort - for (uint8_t i=22;i SportTail ) - used += MAX_SPORT_BUFFER - SportHead ; - else - used -= SportHead ; - if ( used < (MAX_SPORT_BUFFER>>1) ) - { - DATA_BUFFER_LOW_off; - debugln("Ok buf:%d",used); - } - } - FrSkyX_TX_Seq = ( FrSkyX_TX_Seq + 1 ) & 0x03 ; //Next iteration send next packet - } - else - {//Not in sequence somehow, transmit what the receiver wants but why not asking for retransmit... - //debugln("RX_Seq:%d,TX:%d",FrSkyX_TX_IN_Seq,FrSkyX_TX_Seq); - packet[21] |= FrSkyX_TX_IN_Seq; - packet[22] = FrSkyX_TX_Frames[FrSkyX_TX_IN_Seq].count; - for (uint8_t i=23;i<23+FrSkyX_TX_Frames[FrSkyX_TX_IN_Seq].count;i++) - packet[i] = FrSkyX_TX_Frames[FrSkyX_TX_IN_Seq].payload[i-23]; - } - } - else - packet[21] |= 0x08 ; //FrSkyX_TX_Seq=8 at startup - } - if(packet[22]) - {//Debug - debug("SP: "); - for(uint8_t i=0;i100)//~1sec - FrSkyX_telem_init(); + if (millis() - pps_timer >= 900) + {//1 packet every 9ms + pps_timer = millis(); + debugln("%d pps", pps_counter); + TX_LQI = pps_counter; //Max=100% + pps_counter = 0; } + if(TX_LQI==0) + FrSkyX_telem_init(); //Reset telemetry + else + telemetry_link=1; //Send telemetry out anyway #endif - CC2500_Strobe(CC2500_SFRX); //Flush the RXFIFO + CC2500_Strobe(CC2500_SFRX); //Flush the RXFIFO state = FRSKY_DATA1; return 400; // FCC & LBT } diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 4703c17..ef0ac25 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 1 -#define VERSION_PATCH_LEVEL 34 +#define VERSION_PATCH_LEVEL 35 //****************** // Protocols diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index e323a67..961a718 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -119,8 +119,8 @@ uint16_t state; uint8_t len; uint8_t armed, arm_flags, arm_channel_previous; uint8_t num_ch; -uint32_t pps_timer = 0; -uint16_t pps_counter = 0; +uint32_t pps_timer; +uint16_t pps_counter; #ifdef CC2500_INSTALLED #ifdef SCANNER_CC2500_INO @@ -1043,6 +1043,8 @@ static void protocol_init() #endif tx_pause(); init_frskyd_link_telemetry(); + pps_timer=millis(); + pps_counter=0; #ifdef BASH_SERIAL TIMSK0 = 0 ; // Stop all timer 0 interrupts #ifdef INVERT_SERIAL