static bool _parseSignalQuality()

in sim70x0/cellular_sim70x0_api.c [114:325]


static bool _parseSignalQuality( char * pQcsqPayload,
                                 CellularSignalInfo_t * pSignalInfo );
static CellularPktStatus_t _Cellular_RecvFuncGetSignalInfo( CellularContext_t * pContext,
                                                            const CellularATCommandResponse_t * pAtResp,
                                                            void * pData,
                                                            uint16_t dataLen );
static CellularError_t controlSignalStrengthIndication( CellularContext_t * pContext,
                                                        bool enable );
static CellularPktStatus_t _Cellular_RecvFuncGetIccid( CellularContext_t * pContext,
                                                       const CellularATCommandResponse_t * pAtResp,
                                                       void * pData,
                                                       uint16_t dataLen );
static CellularPktStatus_t _Cellular_RecvFuncGetImsi( CellularContext_t * pContext,
                                                      const CellularATCommandResponse_t * pAtResp,
                                                      void * pData,
                                                      uint16_t dataLen );
static bool _checkCrsmMemoryStatus( const char * pToken );
static bool _checkCrsmReadStatus( const char * pToken );
static bool _parseHplmn( char * pToken,
                         void * pData );
static CellularPktStatus_t _Cellular_RecvFuncGetHplmn( CellularContext_t * pContext,
                                                       const CellularATCommandResponse_t * pAtResp,
                                                       void * pData,
                                                       uint16_t dataLen );
static CellularPktStatus_t _Cellular_RecvFuncGetSimCardStatus( CellularContext_t * pContext,
                                                               const CellularATCommandResponse_t * pAtResp,
                                                               void * pData,
                                                               uint16_t dataLen );
static CellularSimCardLockState_t _getSimLockState( char * pToken );
static CellularATError_t parsePdnStatusContextId( char * pToken,
                                                  CellularPdnStatus_t * pPdnStatusBuffers );
static CellularATError_t parsePdnStatusContextState( char * pToken,
                                                     CellularPdnStatus_t * pPdnStatusBuffers );
static CellularATError_t getPdnStatusParseToken( char * pToken,
                                                 uint8_t tokenIndex,
                                                 CellularPdnStatus_t * pPdnStatusBuffers );
static CellularATError_t getPdnStatusParseLine( char * pRespLine,
                                                CellularPdnStatus_t * pPdnStatusBuffers );
static CellularPktStatus_t _Cellular_RecvFuncGetPdnStatus( CellularContext_t * pContext,
                                                           const CellularATCommandResponse_t * pAtResp,
                                                           void * pData,
                                                           uint16_t dataLen );
static CellularError_t buildSocketConnect( CellularSocketHandle_t socketHandle,
                                           char * pCmdBuf );
static CellularATError_t getDataFromResp( const CellularATCommandResponse_t * pAtResp,
                                          const _socketDataRecv_t * pDataRecv,
                                          uint32_t outBufSize );
static CellularPktStatus_t _Cellular_RecvFuncData( CellularContext_t * pContext,
                                                   const CellularATCommandResponse_t * pAtResp,
                                                   void * pData,
                                                   uint16_t dataLen );
static CellularATError_t parseQpsmsMode( char * pToken,
                                         CellularPsmSettings_t * pPsmSettings );
static CellularATError_t parseQpsmsRau( char * pToken,
                                        CellularPsmSettings_t * pPsmSettings );
static CellularATError_t parseQpsmsRdyTimer( char * pToken,
                                             CellularPsmSettings_t * pPsmSettings );
static CellularATError_t parseQpsmsTau( char * pToken,
                                        CellularPsmSettings_t * pPsmSettings );
static CellularATError_t parseQpsmsActiveTime( char * pToken,
                                               CellularPsmSettings_t * pPsmSettings );
static CellularATError_t parseGetPsmToken( char * pToken,
                                           uint8_t tokenIndex,
                                           CellularPsmSettings_t * pPsmSettings );
static CellularRat_t convertRatPriority( char * pRatString );
static CellularPktStatus_t _Cellular_RecvFuncGetRatPriority( CellularContext_t * pContext,
                                                             const CellularATCommandResponse_t * pAtResp,
                                                             void * pData,
                                                             uint16_t dataLen );
static CellularPktStatus_t _Cellular_RecvFuncGetPsmSettings( CellularContext_t * pContext,
                                                             const CellularATCommandResponse_t * pAtResp,
                                                             void * pData,
                                                             uint16_t dataLen );
static CellularPktStatus_t socketRecvDataPrefix( void * pCallbackContext,
                                                 char * pLine,
                                                 uint32_t lineLength,
                                                 char ** ppDataStart,
                                                 uint32_t * pDataLength );
static CellularError_t storeAccessModeAndAddress( CellularContext_t * pContext,
                                                  CellularSocketHandle_t socketHandle,
                                                  CellularSocketAccessMode_t dataAccessMode,
                                                  const CellularSocketAddress_t * pRemoteSocketAddress );
static CellularError_t registerDnsEventCallback( cellularModuleContext_t * pModuleContext,
                                                 CellularDnsResultEventCallback_t dnsEventCallback,
                                                 char * pDnsUsrData );
static void _dnsResultCallback( cellularModuleContext_t * pModuleContext,
                                char * pDnsResult,
                                char * pDnsUsrData );
static uint32_t appendBinaryPattern( char * cmdBuf,
                                     uint32_t cmdLen,
                                     uint32_t value,
                                     bool endOfString );
static CellularPktStatus_t socketSendDataPrefix( void * pCallbackContext,
                                                 char * pLine,
                                                 uint32_t * pBytesRead );

/*-----------------------------------------------------------*/

/*
 * //+CPSI: <System Mode>,<Operation Mode>,<MCC>-<MNC>,<TAC>,<SCellID>,<PCellID>,<Frequency Band>,<earfcn>,<dlbw>,<ulbw>,<RSRQ>,<RSRP>,<RSSI>,<RSSNR>
 * //+CPSI: LTE CAT-M1,Online,440-52,0x6061,33815299,94,EUTRAN-BAND18,5900,3,3,-8,-84,-60,18
 * //+CPSI: LTE NB-IOT,Online,440-20,0x1182,10171378,293,EUTRAN-BAND8,3740,0,0,-12,-75,-63,13
 */
static bool _parseSignalQuality( char * pQcsqPayload,
                                 CellularSignalInfo_t * pSignalInfo )
{
    char * pToken = NULL, * pTmpQcsqPayload = pQcsqPayload;
    int32_t tempValue = 0;

    if( ( pSignalInfo == NULL ) || ( pQcsqPayload == NULL ) )
    {
        LogError( ( "_parseSignalQuality: Invalid Input Parameters" ) );
        return false;
    }

    if( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS )
    { /*<System Mode> */
        LogDebug( ( "_parseSignalQuality: get <System Mode> failed" ) );
        return false;
    }

    if( ( strcmp( pToken, "LTE CAT-M1" ) != 0 ) &&
        ( strcmp( pToken, "LTE NB-IOT" ) != 0 ) )
    {
        LogDebug( ( "_parseSignalQuality: Unsupport <System Mode>" ) );
        return false;
    }

    if( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS )
    { /*<Operation Mode>  */
        LogDebug( ( "_parseSignalQuality: get <Operation Mode> failed" ) );
        return false;
    }

    if( ( strcmp( pToken, "Online" ) != 0 ) )
    {
        LogDebug( ( "_parseSignalQuality: <Operation Mode>=%s", pToken ) );
        return false;
    }

    if( ( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS ) || /*<MCC>-<MNC>:      440-20          */
        ( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS ) || /*<TAC>:            0x1182          */
        ( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS ) || /*<SCellID>:        10171378        */
        ( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS ) || /*<PCellID>:        293             */
        ( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS ) || /*<Frequency Band>: EUTRAN-BAND8    */
        ( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS ) || /*<earfcn>:         3740            */
        ( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS ) || /*<dlbw>:           0               */
        ( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS ) )  /*<ulbw>:           0               */
    {
        LogDebug( ( "_parseSignalQuality: CPSI Response not expected format." ) );
        return false;
    }

    if( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS )
    { /*<RSRQ>    */
        LogDebug( ( "_parseSignalQuality: get RSRQ failed" ) );
        return false;
    }

    if( Cellular_ATStrtoi( pToken, 10, &tempValue ) != CELLULAR_AT_SUCCESS )
    {
        LogError( ( "_parseSignalQuality: Error in processing RSRQ. Token %s", pToken ) );
        return false;
    }

    pSignalInfo->rsrq = ( int16_t ) tempValue;

    if( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS )
    { /*<RSRP>    */
        LogDebug( ( "_parseSignalQuality: get RSRP failed" ) );
        return false;
    }

    if( Cellular_ATStrtoi( pToken, 10, &tempValue ) != CELLULAR_AT_SUCCESS )
    {
        LogError( ( "_parseSignalQuality: Error in processing RSRP. Token %s", pToken ) );
        return false;
    }

    pSignalInfo->rsrp = ( int16_t ) tempValue;

    if( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS )
    { /*<RSSI>    */
        LogDebug( ( "_parseSignalQuality: get RSSI failed" ) );
        return false;
    }

    if( Cellular_ATStrtoi( pToken, 10, &tempValue ) != CELLULAR_AT_SUCCESS )
    {
        LogError( ( "_parseSignalQuality: Error in processing RSSI. Token %s", pToken ) );
        return false;
    }

    pSignalInfo->rssi = ( int16_t ) tempValue;

    if( Cellular_ATGetNextTok( &pTmpQcsqPayload, &pToken ) != CELLULAR_AT_SUCCESS )
    { /*<RSSNR>   */
        LogDebug( ( "_parseSignalQuality: get RSSNR failed" ) );
        return false;
    }

    if( Cellular_ATStrtoi( pToken, 10, &tempValue ) != CELLULAR_AT_SUCCESS )
    {
        LogError( ( "_parseSignalQuality: Error in processing SINR. pToken %s", pToken ) );
        return false;
    }

    /* SINR -20 dBm to +30 dBm. */
    pSignalInfo->sinr = ( int16_t ) ( SIGNAL_QUALITY_SINR_MIN_VALUE + 10 * tempValue / SIGNAL_QUALITY_SINR_DIVISIBILITY_FACTOR );

    return true;
}