diff --git a/examples/platforms/efr32mg1/radio.c b/examples/platforms/efr32mg1/radio.c index c9a54d393..764be7183 100644 --- a/examples/platforms/efr32mg1/radio.c +++ b/examples/platforms/efr32mg1/radio.c @@ -77,6 +77,7 @@ enum enum { EFR32_RECEIVE_SENSITIVITY = -100, // dBm + EFR32_RSSI_AVERAGING_TIME = 16, // us EFR32_RSSI_AVERAGING_TIMEOUT = 300, // us }; @@ -657,19 +658,29 @@ otRadioFrame *otPlatRadioGetTransmitBuffer(otInstance *aInstance) int8_t otPlatRadioGetRssi(otInstance *aInstance) { - int8_t rssi = OT_RADIO_RSSI_INVALID; + otError error; + uint32_t start; + int8_t rssi = OT_RADIO_RSSI_INVALID; + OT_UNUSED_VARIABLE(aInstance); - if ((RAIL_GetRadioState(gRailHandle) & RAIL_RF_STATE_RX)) + error = efr32StartEnergyScan(ENERGY_SCAN_MODE_SYNC, sReceiveFrame.mChannel, EFR32_RSSI_AVERAGING_TIME); + otEXPECT(error == OT_ERROR_NONE); + + start = RAIL_GetTime(); + + // waiting for the event RAIL_EVENT_RSSI_AVERAGE_DONE + while (sEnergyScanStatus == ENERGY_SCAN_STATUS_IN_PROGRESS && + ((RAIL_GetTime() - start) < EFR32_RSSI_AVERAGING_TIMEOUT)) + ; + + if (sEnergyScanStatus == ENERGY_SCAN_STATUS_COMPLETED) { - int16_t railRssi = RAIL_RSSI_INVALID; - railRssi = RAIL_GetRssi(gRailHandle, true); - if (railRssi != RAIL_RSSI_INVALID) - { - rssi = railRssi / QUARTER_DBM_IN_DBM; - } + rssi = sEnergyScanResultDbm; } + sEnergyScanStatus = ENERGY_SCAN_STATUS_IDLE; +exit: return rssi; } diff --git a/examples/platforms/efr32mg12/radio.c b/examples/platforms/efr32mg12/radio.c index c9a54d393..764be7183 100644 --- a/examples/platforms/efr32mg12/radio.c +++ b/examples/platforms/efr32mg12/radio.c @@ -77,6 +77,7 @@ enum enum { EFR32_RECEIVE_SENSITIVITY = -100, // dBm + EFR32_RSSI_AVERAGING_TIME = 16, // us EFR32_RSSI_AVERAGING_TIMEOUT = 300, // us }; @@ -657,19 +658,29 @@ otRadioFrame *otPlatRadioGetTransmitBuffer(otInstance *aInstance) int8_t otPlatRadioGetRssi(otInstance *aInstance) { - int8_t rssi = OT_RADIO_RSSI_INVALID; + otError error; + uint32_t start; + int8_t rssi = OT_RADIO_RSSI_INVALID; + OT_UNUSED_VARIABLE(aInstance); - if ((RAIL_GetRadioState(gRailHandle) & RAIL_RF_STATE_RX)) + error = efr32StartEnergyScan(ENERGY_SCAN_MODE_SYNC, sReceiveFrame.mChannel, EFR32_RSSI_AVERAGING_TIME); + otEXPECT(error == OT_ERROR_NONE); + + start = RAIL_GetTime(); + + // waiting for the event RAIL_EVENT_RSSI_AVERAGE_DONE + while (sEnergyScanStatus == ENERGY_SCAN_STATUS_IN_PROGRESS && + ((RAIL_GetTime() - start) < EFR32_RSSI_AVERAGING_TIMEOUT)) + ; + + if (sEnergyScanStatus == ENERGY_SCAN_STATUS_COMPLETED) { - int16_t railRssi = RAIL_RSSI_INVALID; - railRssi = RAIL_GetRssi(gRailHandle, true); - if (railRssi != RAIL_RSSI_INVALID) - { - rssi = railRssi / QUARTER_DBM_IN_DBM; - } + rssi = sEnergyScanResultDbm; } + sEnergyScanStatus = ENERGY_SCAN_STATUS_IDLE; +exit: return rssi; } diff --git a/examples/platforms/efr32mg13/radio.c b/examples/platforms/efr32mg13/radio.c index 8207fa055..2f8bcdc30 100644 --- a/examples/platforms/efr32mg13/radio.c +++ b/examples/platforms/efr32mg13/radio.c @@ -77,6 +77,7 @@ enum enum { EFR32_RECEIVE_SENSITIVITY = -100, // dBm + EFR32_RSSI_AVERAGING_TIME = 16, // us EFR32_RSSI_AVERAGING_TIMEOUT = 300, // us }; @@ -657,19 +658,29 @@ otRadioFrame *otPlatRadioGetTransmitBuffer(otInstance *aInstance) int8_t otPlatRadioGetRssi(otInstance *aInstance) { - int8_t rssi = OT_RADIO_RSSI_INVALID; + otError error; + uint32_t start; + int8_t rssi = OT_RADIO_RSSI_INVALID; + OT_UNUSED_VARIABLE(aInstance); - if ((RAIL_GetRadioState(gRailHandle) & RAIL_RF_STATE_RX)) + error = efr32StartEnergyScan(ENERGY_SCAN_MODE_SYNC, sReceiveFrame.mChannel, EFR32_RSSI_AVERAGING_TIME); + otEXPECT(error == OT_ERROR_NONE); + + start = RAIL_GetTime(); + + // waiting for the event RAIL_EVENT_RSSI_AVERAGE_DONE + while (sEnergyScanStatus == ENERGY_SCAN_STATUS_IN_PROGRESS && + ((RAIL_GetTime() - start) < EFR32_RSSI_AVERAGING_TIMEOUT)) + ; + + if (sEnergyScanStatus == ENERGY_SCAN_STATUS_COMPLETED) { - int16_t railRssi = RAIL_RSSI_INVALID; - railRssi = RAIL_GetRssi(gRailHandle, true); - if (railRssi != RAIL_RSSI_INVALID) - { - rssi = railRssi / QUARTER_DBM_IN_DBM; - } + rssi = sEnergyScanResultDbm; } + sEnergyScanStatus = ENERGY_SCAN_STATUS_IDLE; +exit: return rssi; }