Skip to content

Commit bc7f576

Browse files
committed
LP-518 OpenLRS: Fix Rssi and link quality
1 parent 7a97907 commit bc7f576

2 files changed

Lines changed: 20 additions & 9 deletions

File tree

flight/pios/common/pios_openlrs.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -829,9 +829,6 @@ static void pios_openlrs_rx_loop(struct pios_openlrs_dev *openlrs_dev)
829829
OPLinkStatusData oplink_status;
830830
OPLinkStatusGet(&oplink_status);
831831

832-
// Update the RSSI
833-
oplink_status.RSSI = openlrs_dev->rssi;
834-
835832
timeUs = PIOS_DELAY_GetuS();
836833
timeMs = PIOS_Thread_Systime();
837834

@@ -860,8 +857,8 @@ static void pios_openlrs_rx_loop(struct pios_openlrs_dev *openlrs_dev)
860857

861858
openlrs_dev->lastPacketTimeUs = timeUs;
862859
openlrs_dev->numberOfLostPackets = 0;
863-
oplink_status.LinkQuality <<= 1;
864-
oplink_status.LinkQuality |= 1;
860+
openlrs_dev->link_quality <<= 1;
861+
openlrs_dev->link_quality |= 1;
865862

866863
if ((openlrs_dev->rx_buf[0] & 0x3e) == 0x00) {
867864
// This flag indicates receiving PPM data
@@ -928,7 +925,7 @@ static void pios_openlrs_rx_loop(struct pios_openlrs_dev *openlrs_dev)
928925
}
929926
tx_buf[4] = (openlrs_dev->lastAFCCvalue >> 8);
930927
tx_buf[5] = openlrs_dev->lastAFCCvalue & 0xff;
931-
tx_buf[6] = countSetBits(oplink_status.LinkQuality & 0x7fff);
928+
tx_buf[6] = countSetBits(openlrs_dev->link_quality & 0x7fff);
932929
}
933930
}
934931

@@ -949,7 +946,7 @@ static void pios_openlrs_rx_loop(struct pios_openlrs_dev *openlrs_dev)
949946
if ((openlrs_dev->numberOfLostPackets < openlrs_dev->hopcount) && (PIOS_DELAY_GetuSSince(openlrs_dev->lastPacketTimeUs) > (getInterval(&openlrs_dev->bind_data) + packet_timeout_us))) {
950947
DEBUG_PRINTF(2, "OLRS WARN: Lost packet: %d\r\n", openlrs_dev->numberOfLostPackets);
951948
// we lost packet, hop to next channel
952-
oplink_status.LinkQuality <<= 1;
949+
openlrs_dev->link_quality <<= 1;
953950
openlrs_dev->willhop = 1;
954951
if (openlrs_dev->numberOfLostPackets == 0) {
955952
openlrs_dev->linkLossTimeMs = timeMs;
@@ -961,7 +958,7 @@ static void pios_openlrs_rx_loop(struct pios_openlrs_dev *openlrs_dev)
961958
} else if ((openlrs_dev->numberOfLostPackets >= openlrs_dev->hopcount) && (PIOS_DELAY_GetuSSince(openlrs_dev->lastPacketTimeUs) > (getInterval(&openlrs_dev->bind_data) * openlrs_dev->hopcount))) {
962959
DEBUG_PRINTF(2, "ORLS WARN: Trying to resync\r\n");
963960
// hop slowly to allow resync with TX
964-
oplink_status.LinkQuality = 0;
961+
openlrs_dev->link_quality = 0;
965962
openlrs_dev->willhop = 1;
966963
openlrs_dev->lastPacketTimeUs = timeUs;
967964
}
@@ -1029,6 +1026,19 @@ static void pios_openlrs_rx_loop(struct pios_openlrs_dev *openlrs_dev)
10291026
openlrs_dev->willhop = 0;
10301027
}
10311028

1029+
if (oplink_status.LinkState > OPLINKSTATUS_LINKSTATE_DISCONNECTED) {
1030+
// Convert raw Rssi to dBm
1031+
oplink_status.RSSI = (int8_t)(openlrs_dev->rssi >> 1) - 122;
1032+
1033+
// Count number of bits set in link_quality
1034+
uint8_t linkquality_bits = countSetBits(openlrs_dev->link_quality & 0x7fff);
1035+
// Translate link quality to 0 - 128 range
1036+
oplink_status.LinkQuality = (linkquality_bits + 1) * 8;
1037+
} else {
1038+
oplink_status.LinkQuality = 0;
1039+
oplink_status.RSSI = -127;
1040+
}
1041+
10321042
// Update UAVO
10331043
OPLinkStatusSet(&oplink_status);
10341044
}

flight/pios/inc/pios_openlrs_priv.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ struct pios_openlrs_dev {
183183
uint8_t rx_buf[64];
184184
uint8_t tx_buf[9];
185185

186-
int8_t rssi;
186+
uint8_t rssi;
187+
uint16_t link_quality;
187188

188189
// Variables from OpenLRS for radio control
189190
uint8_t hopcount;

0 commit comments

Comments
 (0)