in modules/sara_r4/cellular_r4_api.c [1762:1897]
static bool _parseExtendedSignalQuality( char * pQcsqPayload,
CellularSignalInfo_t * pSignalInfo )
{
char * pToken = NULL, * pTmpQcsqPayload = pQcsqPayload;
int32_t tempValue = 0;
bool parseStatus = true;
CellularATError_t atCoreStatus = CELLULAR_AT_SUCCESS;
if( ( pSignalInfo == NULL ) || ( pQcsqPayload == NULL ) )
{
LogError( ( "_parseExtendedSignalQuality: Invalid Input Parameters" ) );
parseStatus = false;
}
/* +CESQ: <rxlev>,<ber>,<rscp>,<ecn0>,<rsrq>,<rsrp>. */
/* Skip <rxlev>. */
atCoreStatus = Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken );
/* Parse <ber>. */
if( atCoreStatus == CELLULAR_AT_SUCCESS )
{
atCoreStatus = Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken );
}
if( atCoreStatus == CELLULAR_AT_SUCCESS )
{
atCoreStatus = Cellular_ATStrtoi( pToken, 10, &tempValue );
if( ( atCoreStatus == CELLULAR_AT_SUCCESS ) && ( tempValue <= INT16_MAX ) && ( tempValue >= INT16_MIN ) )
{
/*
* Bit Error Rate (BER):
* 0..7: as RXQUAL values in the table in 3GPP TS 45.008 [124], subclause 8.2.4
* 99: not known or not detectable
*/
if( ( tempValue >= 0 ) && ( tempValue <= 7 ) )
{
pSignalInfo->ber = ( int16_t ) tempValue;
}
else
{
pSignalInfo->ber = CELLULAR_INVALID_SIGNAL_VALUE;
}
}
else
{
LogError( ( "_parseExtendedSignalQuality: Error in processing BER. Token %s", pToken ) );
atCoreStatus = CELLULAR_AT_ERROR;
}
}
/* Skip <rscp>. */
if( atCoreStatus == CELLULAR_AT_SUCCESS )
{
atCoreStatus = Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken );
}
/* Skip <ecno>. */
if( atCoreStatus == CELLULAR_AT_SUCCESS )
{
atCoreStatus = Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken );
}
/* Parse <rsrq>. */
if( atCoreStatus == CELLULAR_AT_SUCCESS )
{
atCoreStatus = Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken );
}
if( atCoreStatus == CELLULAR_AT_SUCCESS )
{
atCoreStatus = Cellular_ATStrtoi( pToken, 10, &tempValue );
if( atCoreStatus == CELLULAR_AT_SUCCESS )
{
/*
* Reference Signal Received Quality (RSRQ):
* 0: less than -19.5 dB
* 1..33: from -19.5 dB to -3.5 dB with 0.5 dB steps
* 34: -3 dB or greater
* 255: not known or not detectable
*/
if( ( tempValue >= 0 ) && ( tempValue <= 34 ) )
{
pSignalInfo->rsrq = ( int16_t ) ( ( -20 ) + ( tempValue * 0.5 ) );
}
else
{
pSignalInfo->rsrq = CELLULAR_INVALID_SIGNAL_VALUE;
}
}
else
{
LogError( ( "_parseExtendedSignalQuality: Error in processing RSRP. Token %s", pToken ) );
parseStatus = false;
}
}
/* Parse <rsrp>. */
if( atCoreStatus == CELLULAR_AT_SUCCESS )
{
atCoreStatus = Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken );
}
if( atCoreStatus == CELLULAR_AT_SUCCESS )
{
atCoreStatus = Cellular_ATStrtoi( pToken, 10, &tempValue );
if( atCoreStatus == CELLULAR_AT_SUCCESS )
{
/*
* Reference Signal Received Power(RSRP) :
* 0 : less than - 140 dBm
* 1..96 : from - 140 dBm to - 45 dBm with 1 dBm steps
* 97 : -44 dBm or greater
* 255 : not known or not detectable
*/
if( ( tempValue >= 0 ) && ( tempValue <= 97 ) )
{
pSignalInfo->rsrp = ( int16_t ) ( ( -141 ) + ( tempValue ) );
}
else
{
pSignalInfo->rsrp = CELLULAR_INVALID_SIGNAL_VALUE;
}
}
else
{
LogError( ( "_parseExtendedSignalQuality: Error in processing RSRP. Token %s", pToken ) );
parseStatus = false;
}
}
return parseStatus;
}