Skip to content

Commit 2e25b7c

Browse files
committed
Display link score instead of RSSI
1 parent a16c06f commit 2e25b7c

File tree

5 files changed

+30
-22
lines changed

5 files changed

+30
-22
lines changed

src/gui/player_rect.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,11 @@ void PlayerRect::custom_ready() {
189189
}
190190

191191
for (int i = 0; i != GuiInterface::Instance().links_.size(); ++i) {
192-
auto rssi = GuiInterface::Instance().links_[i]->get_rssi();
192+
auto link_score = GuiInterface::Instance().links_[i]->get_link_score();
193193

194194
for (int j = 0; j != ANTENNA_COUNT; ++j) {
195195
lq_bars_[i * 2 + j]->set_visibility(true);
196-
lq_bars_[i * 2 + j]->set_value(rssi[j]);
196+
lq_bars_[i * 2 + j]->set_value(link_score[j]);
197197
}
198198
}
199199

src/wifi/signal_quality.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,13 @@ SignalQualityCalculator::SignalQuality SignalQualityCalculator::calculate_signal
7878
auto avg_snr = get_average(snr_data_);
7979

8080
// Map the RSSI from range 0..126 to 0..100
81-
avg_rssi.first = map_range(avg_rssi.first, 0.f, 126.f, 0.f, 100.f);
82-
avg_rssi.second = map_range(avg_rssi.second, 0.f, 126.f, 0.f, 100.f);
81+
float rssi0 = map_range(avg_rssi.first, 0.f, 126.f, 0.f, 100.f);
82+
float rssi1 = map_range(avg_rssi.second, 0.f, 126.f, 0.f, 100.f);
83+
84+
// Map the SNR from range 0..60 to 0..100
85+
float snr0 = map_range(avg_snr.first, 0.f, 60.f, 0.f, 100.f);
86+
float snr1 = map_range(avg_snr.second, 0.f, 60.f, 0.f, 100.f);
8387

84-
// Return final clamped quality
85-
// formula: quality = avg_rssi - p_recovered * 5 - p_lost * 100
86-
// clamp between -1024 and 1024
8788
auto [p_recovered, p_lost, p_total] = get_accumulated_fec_data();
8889

8990
ret.lost_last_second = p_lost;
@@ -96,6 +97,10 @@ SignalQualityCalculator::SignalQuality SignalQualityCalculator::calculate_signal
9697
ret.snr[1] = avg_snr.second;
9798
ret.idr_code = idr_code_;
9899

100+
// Link Quality = (w1 * RSSI) + (w2 * SNR)
101+
ret.link_score[0] = 0.3f * rssi0 + 0.7f * snr0;
102+
ret.link_score[1] = 0.3f * rssi1 + 0.7f * snr1;
103+
99104
return ret;
100105
}
101106

src/wifi/signal_quality.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ class SignalQualityCalculator {
2121
int lost_last_second;
2222
int recovered_last_second;
2323
int total_last_second;
24-
float rssi[2]; // [0, 100]
25-
float snr[2]; // Signal to noice ratio
24+
float rssi[2]; // Received signal strength indicator
25+
float snr[2]; // Signal to noice ratio
26+
float link_score[2]; // Based on RSSI and SNR [0, 100]
2627
std::string idr_code;
2728
};
2829

src/wifi/wfbng_link.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -442,8 +442,13 @@ void WfbngLink::start_link_quality_thread() {
442442
while (!this->alink_should_stop) {
443443
auto quality = signal_quality_calculator->calculate_signal_quality();
444444

445-
float best_rssi = std::max(quality.rssi[0], quality.rssi[1]);
445+
// Best values of the antennas.
446+
float best_rssi = round(std::max(quality.rssi[0], quality.rssi[1]));
446447
float best_snr = std::max(quality.snr[0], quality.snr[1]);
448+
float best_lq = std::max(quality.lq[0], quality.lq[1]);
449+
450+
// Map to 1000..2000
451+
int lq_for_uplink = round(map_range(best_lq, 0, 100, 1000, 2000));
447452

448453
if (quality.total_last_second != 0) {
449454
packet_loss_ =
@@ -454,9 +459,6 @@ void WfbngLink::start_link_quality_thread() {
454459

455460
time_t currentEpoch = time(nullptr);
456461

457-
// Map to 1000..2000
458-
best_rssi = map_range(best_rssi, 0, 100, 1000, 2000);
459-
460462
// Prepare & send a message
461463
{
462464
uint32_t len;
@@ -510,8 +512,8 @@ void WfbngLink::start_link_quality_thread() {
510512
sizeof(message) - sizeof(len),
511513
"%ld:%d:%d:%d:%d:%d:%f:0:-1:%d:%s\n",
512514
static_cast<long>(currentEpoch),
513-
best_rssi,
514-
best_rssi,
515+
lq_for_uplink,
516+
lq_for_uplink,
515517
quality.recovered_last_second,
516518
quality.lost_last_second,
517519
best_rssi,
@@ -660,8 +662,8 @@ void WfbngLink::handle_80211_frame(const Packet &packet) {
660662
#endif
661663

662664
const auto quality = signal_quality_calculator->calculate_signal_quality();
663-
rssi_[0] = quality.rssi[0];
664-
rssi_[1] = quality.rssi[1];
665+
link_score_[0] = quality.link_score[0];
666+
link_score_[1] = quality.link_score[1];
665667
}
666668
// MAVLink frame
667669
else if (frame.MatchesChannelID(mavlink_channel_id_be8)) {
@@ -688,8 +690,8 @@ void WfbngLink::handle_80211_frame(const Packet &packet) {
688690
}
689691
}
690692

691-
std::array<float, ANTENNA_COUNT> WfbngLink::get_rssi() const {
692-
return rssi_;
693+
std::array<float, ANTENNA_COUNT> WfbngLink::get_link_score() const {
694+
return link_score_;
693695
}
694696

695697
float WfbngLink::get_packet_loss() const {

src/wifi/wfbng_link.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class WfbngLink {
7373
/// Process a 802.11 frame.
7474
void handle_80211_frame(const Packet &packet);
7575

76-
std::array<float, ANTENNA_COUNT> get_rssi() const;
76+
std::array<float, ANTENNA_COUNT> get_link_score() const;
7777

7878
float get_packet_loss() const;
7979

@@ -107,8 +107,8 @@ class WfbngLink {
107107
#endif
108108

109109
std::shared_ptr<SignalQualityCalculator> signal_quality_calculator;
110-
std::array<float, ANTENNA_COUNT> rssi_ = {}; // Percentage
111-
float packet_loss_ = 0; // Percentage
110+
std::array<float, ANTENNA_COUNT> link_score_ = {}; // Percentage
111+
float packet_loss_ = 0; // Percentage
112112

113113
#ifndef _WIN32
114114
// --------------- Adaptive link

0 commit comments

Comments
 (0)