Fix overflow at extremely low RSSI

Some LoRaWAN modem like SX1272 can receive downlink packets with RSSI level less than -127. So "int8_t" is not enough for store all possible RSSI values. For example, SX1272 has sensitivity at -137 dBm.
Problem was manifested in the file "SX1272_LoRaRadio.cpp" at SX1272_LoRaRadio::handle_dio0_irq() method.
When value of _rf_settings.lora_packet_handler.rssi_value calculated incorrect RSSI will be stored. Example case:

Value readen from register REG_LR_PKTSNRVALUE _rf_settings.lora_packet_handler.snr_value equals -47.
Value readen from register REG_LR_PKTRSSIVALUE equals 17.
RSSI_OFFSET equals "-139", snr equals "-11".

For case MODEM_LORA value calculated by formula:
_rf_settings.lora_packet_handler.rssi_value = RSSI_OFFSET + rssi + (rssi >> 4) + snr;
and result value will be "124" because of int8_t overflow so it's not correct value (too high).

Correct value must be:
-139 + 17 + (1) + (-11) = -132.

Another motivation: at all other places int16_t type used to store RSSI value.
pull/15177/head
Mikhail Isaev 2021-11-24 21:56:42 +03:00
parent 2eb06e7620
commit 352e6fbd23
1 changed files with 2 additions and 2 deletions

View File

@ -200,7 +200,7 @@ typedef struct radio_fsk_packet_handler {
/**
* Storage for RSSI value of the received signal.
*/
int8_t rssi_value;
int16_t rssi_value;
/**
* Automated frequency correction value.
@ -333,7 +333,7 @@ typedef struct radio_lora_packet_handler {
/**
* RSSI value in dBm for the received packet.
*/
int8_t rssi_value;
int16_t rssi_value;
/**
* Size of the transmitted or received packet.