forked from ExpressLRS/ExpressLRS
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcommon.cpp
More file actions
192 lines (166 loc) · 9.13 KB
/
common.cpp
File metadata and controls
192 lines (166 loc) · 9.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#include "common.h"
#include "OTA.h"
#if defined(RADIO_SX127X)
#include "SX127xDriver.h"
SX127xDriver DMA_ATTR Radio;
expresslrs_mod_settings_s ExpressLRS_AirRateConfig[RATE_MAX] = {
{0, RADIO_TYPE_SX127x_LORA, RATE_LORA_200HZ, SX127x_BW_500_00_KHZ, SX127x_SF_6, SX127x_CR_4_7, TLM_RATIO_1_64, 4, 5000, 8, OTA4_PACKET_SIZE, 1},
{1, RADIO_TYPE_SX127x_LORA, RATE_LORA_100HZ_8CH, SX127x_BW_500_00_KHZ, SX127x_SF_6, SX127x_CR_4_8, TLM_RATIO_1_32, 4, 10000, 8, OTA8_PACKET_SIZE, 1},
{2, RADIO_TYPE_SX127x_LORA, RATE_LORA_100HZ, SX127x_BW_500_00_KHZ, SX127x_SF_7, SX127x_CR_4_7, TLM_RATIO_1_32, 4, 10000, 8, OTA4_PACKET_SIZE, 1},
{3, RADIO_TYPE_SX127x_LORA, RATE_LORA_50HZ, SX127x_BW_500_00_KHZ, SX127x_SF_8, SX127x_CR_4_7, TLM_RATIO_1_16, 4, 20000, 10, OTA4_PACKET_SIZE, 1},
{4, RADIO_TYPE_SX127x_LORA, RATE_LORA_25HZ, SX127x_BW_500_00_KHZ, SX127x_SF_9, SX127x_CR_4_7, TLM_RATIO_1_8, 2, 40000, 10, OTA4_PACKET_SIZE, 1},
{5, RADIO_TYPE_SX127x_LORA, RATE_DVDA_50HZ, SX127x_BW_500_00_KHZ, SX127x_SF_6, SX127x_CR_4_7, TLM_RATIO_1_64, 2, 5000, 8, OTA4_PACKET_SIZE, 4}};
expresslrs_rf_pref_params_s ExpressLRS_AirRateRFperf[RATE_MAX] = {
{0, RATE_LORA_200HZ, -112, 4380, 3000, 2500, 600, 5000, SNR_SCALE( 1), SNR_SCALE(3.0)},
{1, RATE_LORA_100HZ_8CH, -112, 6690, 3500, 2500, 600, 5000, SNR_SCALE( 1), SNR_SCALE(3.0)},
{2, RATE_LORA_100HZ, -117, 8770, 3500, 2500, 600, 5000, SNR_SCALE( 1), SNR_SCALE(2.5)},
{3, RATE_LORA_50HZ, -120, 18560, 4000, 2500, 600, 5000, SNR_SCALE(-1), SNR_SCALE(1.5)},
{4, RATE_LORA_25HZ, -123, 29950, 6000, 4000, 0, 5000, SNR_SCALE(-3), SNR_SCALE(0.5)},
{5, RATE_DVDA_50HZ, -112, 4380, 3000, 2500, 600, 5000, SNR_SCALE( 1), SNR_SCALE(3.0)}};
#endif
#if defined(RADIO_SX128X)
#include "SX1280Driver.h"
SX1280Driver DMA_ATTR Radio;
expresslrs_mod_settings_s ExpressLRS_AirRateConfig[RATE_MAX] = {
{0, RADIO_TYPE_SX128x_FLRC, RATE_FLRC_1000HZ, SX1280_FLRC_BR_0_650_BW_0_6, SX1280_FLRC_BT_1, SX1280_FLRC_CR_1_2, TLM_RATIO_1_128, 2, 1000, 32, OTA4_PACKET_SIZE, 1},
{1, RADIO_TYPE_SX128x_FLRC, RATE_FLRC_500HZ, SX1280_FLRC_BR_0_650_BW_0_6, SX1280_FLRC_BT_1, SX1280_FLRC_CR_1_2, TLM_RATIO_1_128, 2, 2000, 32, OTA4_PACKET_SIZE, 1},
{2, RADIO_TYPE_SX128x_FLRC, RATE_DVDA_500HZ, SX1280_FLRC_BR_0_650_BW_0_6, SX1280_FLRC_BT_1, SX1280_FLRC_CR_1_2, TLM_RATIO_1_128, 2, 1000, 32, OTA4_PACKET_SIZE, 2},
{3, RADIO_TYPE_SX128x_FLRC, RATE_DVDA_250HZ, SX1280_FLRC_BR_0_650_BW_0_6, SX1280_FLRC_BT_1, SX1280_FLRC_CR_1_2, TLM_RATIO_1_128, 2, 1000, 32, OTA4_PACKET_SIZE, 4},
{4, RADIO_TYPE_SX128x_LORA, RATE_LORA_500HZ, SX1280_LORA_BW_0800, SX1280_LORA_SF5, SX1280_LORA_CR_LI_4_6, TLM_RATIO_1_128, 4, 2000, 12, OTA4_PACKET_SIZE, 1},
{5, RADIO_TYPE_SX128x_LORA, RATE_LORA_333HZ_8CH, SX1280_LORA_BW_0800, SX1280_LORA_SF5, SX1280_LORA_CR_LI_4_8, TLM_RATIO_1_128, 4, 3003, 12, OTA8_PACKET_SIZE, 1},
{6, RADIO_TYPE_SX128x_LORA, RATE_LORA_250HZ, SX1280_LORA_BW_0800, SX1280_LORA_SF6, SX1280_LORA_CR_LI_4_8, TLM_RATIO_1_64, 4, 4000, 14, OTA4_PACKET_SIZE, 1},
{7, RADIO_TYPE_SX128x_LORA, RATE_LORA_150HZ, SX1280_LORA_BW_0800, SX1280_LORA_SF7, SX1280_LORA_CR_LI_4_8, TLM_RATIO_1_32, 4, 6666, 12, OTA4_PACKET_SIZE, 1},
{8, RADIO_TYPE_SX128x_LORA, RATE_LORA_100HZ_8CH, SX1280_LORA_BW_0800, SX1280_LORA_SF7, SX1280_LORA_CR_LI_4_8, TLM_RATIO_1_32, 4, 10000, 12, OTA8_PACKET_SIZE, 1},
{9, RADIO_TYPE_SX128x_LORA, RATE_LORA_50HZ, SX1280_LORA_BW_0800, SX1280_LORA_SF8, SX1280_LORA_CR_LI_4_8, TLM_RATIO_1_16, 2, 20000, 12, OTA4_PACKET_SIZE, 1}};
expresslrs_rf_pref_params_s ExpressLRS_AirRateRFperf[RATE_MAX] = {
{0, RATE_FLRC_1000HZ, -104, 389, 2500, 2500, 3, 5000, DYNPOWER_SNR_THRESH_NONE, DYNPOWER_SNR_THRESH_NONE},
{1, RATE_FLRC_500HZ, -104, 389, 2500, 2500, 3, 5000, DYNPOWER_SNR_THRESH_NONE, DYNPOWER_SNR_THRESH_NONE},
{2, RATE_DVDA_500HZ, -104, 389, 2500, 2500, 3, 5000, DYNPOWER_SNR_THRESH_NONE, DYNPOWER_SNR_THRESH_NONE},
{3, RATE_DVDA_250HZ, -104, 389, 2500, 2500, 3, 5000, DYNPOWER_SNR_THRESH_NONE, DYNPOWER_SNR_THRESH_NONE},
{4, RATE_LORA_500HZ, -105, 1507, 2500, 2500, 3, 5000, SNR_SCALE( 5), SNR_SCALE(9.5)},
{5, RATE_LORA_333HZ_8CH, -105, 2374, 2500, 2500, 4, 5000, SNR_SCALE( 5), SNR_SCALE(9.5)},
{6, RATE_LORA_250HZ, -108, 3300, 3000, 2500, 6, 5000, SNR_SCALE( 3), SNR_SCALE(9.5)},
{7, RATE_LORA_150HZ, -112, 5871, 3500, 2500, 10, 5000, SNR_SCALE( 0), SNR_SCALE(8.5)},
{8, RATE_LORA_100HZ_8CH, -112, 7605, 3500, 2500, 11, 5000, SNR_SCALE( 0), SNR_SCALE(8.5)},
{9, RATE_LORA_50HZ, -115, 10798, 4000, 2500, 0, 5000, SNR_SCALE(-1), SNR_SCALE(6.5)}};
#endif
expresslrs_mod_settings_s *get_elrs_airRateConfig(uint8_t index)
{
if (RATE_MAX <= index)
{
// Set to last usable entry in the array
index = RATE_MAX - 1;
}
return &ExpressLRS_AirRateConfig[index];
}
expresslrs_rf_pref_params_s *get_elrs_RFperfParams(uint8_t index)
{
if (RATE_MAX <= index)
{
// Set to last usable entry in the array
index = RATE_MAX - 1;
}
return &ExpressLRS_AirRateRFperf[index];
}
uint8_t get_elrs_HandsetRate_max(uint8_t rateIndex, uint32_t minInterval)
{
while (rateIndex < RATE_MAX)
{
expresslrs_mod_settings_s const * const ModParams = &ExpressLRS_AirRateConfig[rateIndex];
// Handset interval = time between packets from handset, which is expected to be air rate * number of times it is sent
uint32_t handsetInterval = ModParams->interval * ModParams->numOfSends;
if (handsetInterval >= minInterval)
break;
++rateIndex;
}
return rateIndex;
}
uint8_t ICACHE_RAM_ATTR enumRatetoIndex(expresslrs_RFrates_e const eRate)
{ // convert enum_rate to index
expresslrs_mod_settings_s const * ModParams;
for (uint8_t i = 0; i < RATE_MAX; i++)
{
ModParams = get_elrs_airRateConfig(i);
if (ModParams->enum_rate == eRate)
{
return i;
}
}
// If 25Hz selected and not available, return the slowest rate available
// else return the fastest rate available (500Hz selected but not available)
return (eRate == RATE_LORA_25HZ) ? RATE_MAX - 1 : 0;
}
uint8_t ExpressLRS_currTlmDenom;
expresslrs_mod_settings_s *ExpressLRS_currAirRate_Modparams;
expresslrs_rf_pref_params_s *ExpressLRS_currAirRate_RFperfParams;
connectionState_e connectionState = disconnected;
bool connectionHasModelMatch;
uint32_t ChannelData[CRSF_NUM_CHANNELS]; // Current state of channels, CRSF format
uint8_t MasterUID[6]; // The definitive user UID
uint8_t UID[6]; // The currently running UID
uint8_t BindingUID[6] = {0, 1, 2, 3, 4, 5}; // Special binding UID values
uint8_t ICACHE_RAM_ATTR TLMratioEnumToValue(expresslrs_tlm_ratio_e const enumval)
{
// !! TLM_RATIO_STD/TLM_RATIO_DISARMED should be converted by the caller !!
if (enumval == TLM_RATIO_NO_TLM)
return 1;
// 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);
}
/***
* @brief: Calculate number of 'burst' telemetry frames for the specified air rate and tlm ratio
*
* When attempting to send a LinkStats telemetry frame at most every TELEM_MIN_LINK_INTERVAL_MS,
* calculate the number of sequential advanced telemetry frames before another LinkStats is due.
****/
uint8_t TLMBurstMaxForRateRatio(uint16_t const rateHz, uint8_t const ratioDiv)
{
// Maximum ms between LINK_STATISTICS packets for determining burst max
constexpr uint32_t TELEM_MIN_LINK_INTERVAL_MS = 512U;
// telemInterval = 1000 / (hz / ratiodiv);
// burst = TELEM_MIN_LINK_INTERVAL_MS / telemInterval;
// This ^^^ rearranged to preserve precision vvv, using u32 because F1000 1:2 = 256
unsigned retVal = TELEM_MIN_LINK_INTERVAL_MS * rateHz / ratioDiv / 1000U;
// Reserve one slot for LINK telemetry. 256 becomes 255 here, safe for return in uint8_t
if (retVal > 1)
--retVal;
else
retVal = 1;
//DBGLN("TLMburst: %d", retVal);
return retVal;
}
uint32_t uidMacSeedGet(void)
{
const uint32_t macSeed = ((uint32_t)UID[2] << 24) + ((uint32_t)UID[3] << 16) +
((uint32_t)UID[4] << 8) + (UID[5]^OTA_VERSION_ID);
return macSeed;
}
void initUID()
{
// default until first sync packet calculates it
ExpressLRS_currTlmDenom = 1;
if (firmwareOptions.hasUID)
{
memcpy(MasterUID, firmwareOptions.uid, sizeof(MasterUID));
}
else
{
#ifdef PLATFORM_ESP32
esp_err_t WiFiErr = esp_read_mac(MasterUID, ESP_MAC_WIFI_STA);
#elif PLATFORM_STM32
MasterUID[0] = (uint8_t)HAL_GetUIDw0();
MasterUID[1] = (uint8_t)(HAL_GetUIDw0() >> 8);
MasterUID[2] = (uint8_t)HAL_GetUIDw1();
MasterUID[3] = (uint8_t)(HAL_GetUIDw1() >> 8);
MasterUID[4] = (uint8_t)HAL_GetUIDw2();
MasterUID[5] = (uint8_t)(HAL_GetUIDw2() >> 8);
#endif
}
memcpy(UID, MasterUID, sizeof(UID));
OtaUpdateCrcInitFromUid();
}
bool ICACHE_RAM_ATTR isDualRadio()
{
return GPIO_PIN_NSS_2 != UNDEF_PIN;
}