mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-24 00:35:39 +03:00
Race and STD telemetry modes
This commit is contained in:
parent
e45afb3a76
commit
63e7ccbc9a
3 changed files with 32 additions and 50 deletions
|
@ -76,7 +76,7 @@ static uint8_t bindingRateIndex = 0;
|
||||||
static bool connectionHasModelMatch = false;
|
static bool connectionHasModelMatch = false;
|
||||||
static uint8_t txPower = 0;
|
static uint8_t txPower = 0;
|
||||||
static uint8_t wideSwitchIndex = 0;
|
static uint8_t wideSwitchIndex = 0;
|
||||||
|
static uint8_t currTlmDenom = 1;
|
||||||
static simpleLowpassFilter_t rssiFilter;
|
static simpleLowpassFilter_t rssiFilter;
|
||||||
|
|
||||||
static volatile DMA_DATA uint8_t dmaBuffer[ELRS_RX_TX_BUFF_SIZE];
|
static volatile DMA_DATA uint8_t dmaBuffer[ELRS_RX_TX_BUFF_SIZE];
|
||||||
|
@ -280,7 +280,7 @@ static void unpackChannelDataHybridWide(uint16_t *rcData, const uint8_t *payload
|
||||||
} else {
|
} else {
|
||||||
uint8_t bins;
|
uint8_t bins;
|
||||||
uint16_t switchValue;
|
uint16_t switchValue;
|
||||||
if (tlmRatioEnumToValue(receiver.modParams->tlmInterval) < 8) {
|
if (currTlmDenom < 8) {
|
||||||
bins = 63;
|
bins = 63;
|
||||||
switchValue = switchByte & 0x3F; // 6-bit
|
switchValue = switchByte & 0x3F; // 6-bit
|
||||||
} else {
|
} else {
|
||||||
|
@ -377,8 +377,8 @@ bool expressLrsIsFhssReq(void)
|
||||||
|
|
||||||
bool expressLrsTelemRespReq(void)
|
bool expressLrsTelemRespReq(void)
|
||||||
{
|
{
|
||||||
uint8_t modresult = (receiver.nonceRX + 1) % tlmRatioEnumToValue(receiver.modParams->tlmInterval);
|
uint8_t modresult = (receiver.nonceRX + 1) % currTlmDenom;
|
||||||
if (receiver.inBindingMode || (receiver.connectionState == ELRS_DISCONNECTED) || (receiver.modParams->tlmInterval == TLM_RATIO_NO_TLM) || (modresult != 0)) {
|
if (receiver.inBindingMode || (receiver.connectionState == ELRS_DISCONNECTED) || (currTlmDenom == 1) || (modresult != 0)) {
|
||||||
return false; // don't bother sending tlm if disconnected or TLM is off
|
return false; // don't bother sending tlm if disconnected or TLM is off
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
|
@ -662,9 +662,8 @@ static bool processRFSyncPacket(volatile uint8_t *packet, const uint32_t timeSta
|
||||||
receiver.lastSyncPacketMs = timeStampMs;
|
receiver.lastSyncPacketMs = timeStampMs;
|
||||||
|
|
||||||
// Will change the packet air rate in loop() if this changes
|
// Will change the packet air rate in loop() if this changes
|
||||||
receiver.nextRateIndex = (packet[3] & 0xC0) >> 6;
|
receiver.nextRateIndex = ((packet[3] & 0xE0) >> 5) - 3;
|
||||||
uint8_t tlmRateIn = (packet[3] & 0x38) >> 3;
|
uint8_t switchEncMode = ((packet[3] & 0x03) >> 0) - 1; //spi implementation uses 0 based index for hybrid
|
||||||
uint8_t switchEncMode = ((packet[3] & 0x06) >> 1) - 1; //spi implementation uses 0 based index for hybrid
|
|
||||||
|
|
||||||
// Update switch mode encoding immediately
|
// Update switch mode encoding immediately
|
||||||
if (switchEncMode != rxExpressLrsSpiConfig()->switchMode) {
|
if (switchEncMode != rxExpressLrsSpiConfig()->switchMode) {
|
||||||
|
@ -673,8 +672,10 @@ static bool processRFSyncPacket(volatile uint8_t *packet, const uint32_t timeSta
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update TLM ratio
|
// Update TLM ratio
|
||||||
if (receiver.modParams->tlmInterval != tlmRateIn) {
|
uint8_t tlmRateIn = ((packet[3] & 0x1C) >> 2) + TLM_RATIO_NO_TLM;
|
||||||
receiver.modParams->tlmInterval = tlmRateIn;
|
uint8_t tlmDenom = tlmRatioEnumToValue(tlmRateIn);
|
||||||
|
if (currTlmDenom != tlmDenom) {
|
||||||
|
currTlmDenom = tlmDenom;
|
||||||
telemBurstValid = false;
|
telemBurstValid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -730,7 +731,7 @@ rx_spi_received_e processRFPacket(volatile uint8_t *payload, uint32_t timeStampU
|
||||||
if (receiver.connectionState == ELRS_CONNECTED && connectionHasModelMatch) {
|
if (receiver.connectionState == ELRS_CONNECTED && connectionHasModelMatch) {
|
||||||
if (rxExpressLrsSpiConfig()->switchMode == SM_HYBRID_WIDE) {
|
if (rxExpressLrsSpiConfig()->switchMode == SM_HYBRID_WIDE) {
|
||||||
wideSwitchIndex = hybridWideNonceToSwitchIndex(receiver.nonceRX);
|
wideSwitchIndex = hybridWideNonceToSwitchIndex(receiver.nonceRX);
|
||||||
if ((tlmRatioEnumToValue(receiver.modParams->tlmInterval) < 8) || wideSwitchIndex == 7) {
|
if ((currTlmDenom < 8) || wideSwitchIndex == 7) {
|
||||||
confirmCurrentTelemetryPayload((dmaBuffer[6] & 0x40) >> 6);
|
confirmCurrentTelemetryPayload((dmaBuffer[6] & 0x40) >> 6);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -776,8 +777,7 @@ static void updateTelemetryBurst(void)
|
||||||
telemBurstValid = true;
|
telemBurstValid = true;
|
||||||
|
|
||||||
uint32_t hz = rateEnumToHz(receiver.modParams->enumRate);
|
uint32_t hz = rateEnumToHz(receiver.modParams->enumRate);
|
||||||
uint32_t ratiodiv = tlmRatioEnumToValue(receiver.modParams->tlmInterval);
|
telemetryBurstMax = TELEM_MIN_LINK_INTERVAL * hz / currTlmDenom / 1000U;
|
||||||
telemetryBurstMax = TELEM_MIN_LINK_INTERVAL * hz / ratiodiv / 1000U;
|
|
||||||
|
|
||||||
// Reserve one slot for LINK telemetry
|
// Reserve one slot for LINK telemetry
|
||||||
if (telemetryBurstMax > 1) {
|
if (telemetryBurstMax > 1) {
|
||||||
|
@ -787,7 +787,7 @@ static void updateTelemetryBurst(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notify the sender to adjust its expected throughput
|
// Notify the sender to adjust its expected throughput
|
||||||
updateTelemetryRate(hz, ratiodiv, telemetryBurstMax);
|
updateTelemetryRate(hz, currTlmDenom, telemetryBurstMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If not connected will rotate through the RF modes looking for sync
|
/* If not connected will rotate through the RF modes looking for sync
|
||||||
|
|
|
@ -56,8 +56,8 @@ elrsModSettings_t airRateConfig[][ELRS_RATE_MAX] = {
|
||||||
{
|
{
|
||||||
{0, RATE_200HZ, SX127x_BW_500_00_KHZ, SX127x_SF_6, SX127x_CR_4_7, 5000, TLM_RATIO_1_64, 4, 8},
|
{0, RATE_200HZ, SX127x_BW_500_00_KHZ, SX127x_SF_6, SX127x_CR_4_7, 5000, TLM_RATIO_1_64, 4, 8},
|
||||||
{1, RATE_100HZ, SX127x_BW_500_00_KHZ, SX127x_SF_7, SX127x_CR_4_7, 10000, TLM_RATIO_1_64, 4, 8},
|
{1, RATE_100HZ, SX127x_BW_500_00_KHZ, SX127x_SF_7, SX127x_CR_4_7, 10000, TLM_RATIO_1_64, 4, 8},
|
||||||
{2, RATE_50HZ, SX127x_BW_500_00_KHZ, SX127x_SF_8, SX127x_CR_4_7, 20000, TLM_RATIO_NO_TLM, 4, 10},
|
{2, RATE_50HZ, SX127x_BW_500_00_KHZ, SX127x_SF_8, SX127x_CR_4_7, 20000, TLM_RATIO_1_16, 4, 10},
|
||||||
{3, RATE_25HZ, SX127x_BW_500_00_KHZ, SX127x_SF_9, SX127x_CR_4_7, 40000, TLM_RATIO_NO_TLM, 2, 10}
|
{3, RATE_25HZ, SX127x_BW_500_00_KHZ, SX127x_SF_9, SX127x_CR_4_7, 40000, TLM_RATIO_1_8, 2, 10}
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_RX_SX1280
|
#ifdef USE_RX_SX1280
|
||||||
|
@ -65,7 +65,7 @@ elrsModSettings_t airRateConfig[][ELRS_RATE_MAX] = {
|
||||||
{0, RATE_500HZ, SX1280_LORA_BW_0800, SX1280_LORA_SF5, SX1280_LORA_CR_LI_4_6, 2000, TLM_RATIO_1_128, 4, 12},
|
{0, RATE_500HZ, SX1280_LORA_BW_0800, SX1280_LORA_SF5, SX1280_LORA_CR_LI_4_6, 2000, TLM_RATIO_1_128, 4, 12},
|
||||||
{1, RATE_250HZ, SX1280_LORA_BW_0800, SX1280_LORA_SF6, SX1280_LORA_CR_LI_4_7, 4000, TLM_RATIO_1_64, 4, 14},
|
{1, RATE_250HZ, SX1280_LORA_BW_0800, SX1280_LORA_SF6, SX1280_LORA_CR_LI_4_7, 4000, TLM_RATIO_1_64, 4, 14},
|
||||||
{2, RATE_150HZ, SX1280_LORA_BW_0800, SX1280_LORA_SF7, SX1280_LORA_CR_LI_4_7, 6666, TLM_RATIO_1_32, 4, 12},
|
{2, RATE_150HZ, SX1280_LORA_BW_0800, SX1280_LORA_SF7, SX1280_LORA_CR_LI_4_7, 6666, TLM_RATIO_1_32, 4, 12},
|
||||||
{3, RATE_50HZ, SX1280_LORA_BW_0800, SX1280_LORA_SF9, SX1280_LORA_CR_LI_4_6, 20000, TLM_RATIO_NO_TLM, 2, 12}
|
{3, RATE_50HZ, SX1280_LORA_BW_0800, SX1280_LORA_SF9, SX1280_LORA_CR_LI_4_6, 20000, TLM_RATIO_1_16, 2, 12}
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#if !defined(USE_RX_SX127X) && !defined(USE_RX_SX1280)
|
#if !defined(USE_RX_SX127X) && !defined(USE_RX_SX1280)
|
||||||
|
@ -472,34 +472,14 @@ void fhssGenSequence(const uint8_t UID[], const elrsFreqDomain_e dom)
|
||||||
|
|
||||||
uint8_t tlmRatioEnumToValue(const elrsTlmRatio_e enumval)
|
uint8_t tlmRatioEnumToValue(const elrsTlmRatio_e enumval)
|
||||||
{
|
{
|
||||||
switch (enumval) {
|
// !! TLM_RATIO_STD/TLM_RATIO_DISARMED should be converted by the caller !!
|
||||||
case TLM_RATIO_NO_TLM:
|
if (enumval == TLM_RATIO_NO_TLM) {
|
||||||
return 1;
|
return 1;
|
||||||
break;
|
|
||||||
case TLM_RATIO_1_2:
|
|
||||||
return 2;
|
|
||||||
break;
|
|
||||||
case TLM_RATIO_1_4:
|
|
||||||
return 4;
|
|
||||||
break;
|
|
||||||
case TLM_RATIO_1_8:
|
|
||||||
return 8;
|
|
||||||
break;
|
|
||||||
case TLM_RATIO_1_16:
|
|
||||||
return 16;
|
|
||||||
break;
|
|
||||||
case TLM_RATIO_1_32:
|
|
||||||
return 32;
|
|
||||||
break;
|
|
||||||
case TLM_RATIO_1_64:
|
|
||||||
return 64;
|
|
||||||
break;
|
|
||||||
case TLM_RATIO_1_128:
|
|
||||||
return 128;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 1 << (8 - (enumval - TLM_RATIO_NO_TLM))
|
||||||
|
// 1_128 = 128, 1_64 = 64, 1_32 = 32, etc
|
||||||
|
return 1 << (8 + TLM_RATIO_NO_TLM - enumval);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t rateEnumToHz(const elrsRfRate_e eRate)
|
uint16_t rateEnumToHz(const elrsRfRate_e eRate)
|
||||||
|
|
|
@ -86,14 +86,16 @@ typedef enum {
|
||||||
} elrsSwitchMode_e;
|
} elrsSwitchMode_e;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TLM_RATIO_NO_TLM = 0,
|
TLM_RATIO_STD = 0, // Use suggested ratio from ModParams
|
||||||
TLM_RATIO_1_128 = 1,
|
TLM_RATIO_NO_TLM,
|
||||||
TLM_RATIO_1_64 = 2,
|
TLM_RATIO_1_128,
|
||||||
TLM_RATIO_1_32 = 3,
|
TLM_RATIO_1_64,
|
||||||
TLM_RATIO_1_16 = 4,
|
TLM_RATIO_1_32,
|
||||||
TLM_RATIO_1_8 = 5,
|
TLM_RATIO_1_16,
|
||||||
TLM_RATIO_1_4 = 6,
|
TLM_RATIO_1_8,
|
||||||
TLM_RATIO_1_2 = 7,
|
TLM_RATIO_1_4,
|
||||||
|
TLM_RATIO_1_2,
|
||||||
|
TLM_RATIO_DISARMED, // TLM_RATIO_STD when disarmed, TLM_RATIO_NO_TLM when armed
|
||||||
} elrsTlmRatio_e;
|
} elrsTlmRatio_e;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue