static bool _parseExtendedSignalQuality()

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;
}