static CellularPktStatus_t socketRecvDataPrefix()

in sim70x0/cellular_sim70x0_api.c [1566:1697]


static CellularPktStatus_t socketRecvDataPrefix( void * pCallbackContext,
                                                 char * pLine,
                                                 uint32_t lineLength,
                                                 char ** ppDataStart,
                                                 uint32_t * pDataLength )
{
    CellularContext_t * pContext = ( CellularContext_t * ) pCallbackContext;
    char sPrefix[ MAX_CARECV_STRING_PREFIX_STRING ];

    /* Handling: +CARECV: 1459,<data>    */
    if( ( pLine == NULL ) || ( ppDataStart == NULL ) || ( pDataLength == NULL ) )
    {
        LogError( ( "Data prefix Bad Param(nul point)" ) );
        return CELLULAR_PKT_STATUS_BAD_PARAM;
    }

    char * pData = strchr( pLine, ',' );
    char * pEos;
    char * pPrefix;
    char * pToken;

    *pDataLength = 0;
    *ppDataStart = NULL;

    if( ( pData != NULL ) &&
        ( pData - pLine < MAX_CARECV_STRING_PREFIX_STRING ) &&
        ( strncmp( pLine, "+CARECV:", 8 ) == 0 ) )
    {
        goto ok; /* matched +CARECV: 1459,<data>    */
    }

    /*
     * OK
     * +CADATAIND: 0
     * +CARECV: 0
     */
    CellularPktStatus_t pktStatus = CELLULAR_PKT_STATUS_PREFIX_MISMATCH;

    pData = pLine;

    while( pData - pLine < ( int ) lineLength &&
           ( pEos = strchr( pData, '\r' ) ) != NULL &&
           pEos - pLine < ( int ) lineLength )
    {
        int nLen = min( sizeof( sPrefix ) - 1, pEos - pData );
        strncpy( sPrefix, pData, nLen );
        sPrefix[ nLen ] = 0;

        pData = ++pEos;

        while( *pData == '\n' || *pData == '\r' )
        {
            pData++;
        }

        pPrefix = sPrefix;
        Cellular_ATRemoveAllWhiteSpaces( pPrefix );

        if( strlen( pPrefix ) <= 0 )
        {
            continue; /* empty line   */
        }

        /* Check if the message is a data related response. */
        if( ( strcmp( pPrefix, "OK" ) == 0 ) ||
            ( strncmp( pPrefix, "+CADATAIND:", 11 ) == 0 ) )
        {
            LogDebug( ( "%s recieved. just ignore", pPrefix ) );
            pktStatus = CELLULAR_PKT_STATUS_OK;
            continue;
        }

        if( strcmp( pPrefix, "+CARECV:0" ) == 0 )
        {
            LogDebug( ( "%s recieved. no more data", pPrefix ) );
            cellularModuleContext_t * pSimContex = ( cellularModuleContext_t * ) pContext->pModueContext;
            xEventGroupClearBits( pSimContex->pdnEvent, CNACT_EVENT_BIT_IND ); /* recv data empty, need wait +CADATAIND: */
            pktStatus = CELLULAR_PKT_STATUS_OK;
            continue;
        }

        LogError( ( "not match(+CARECV).line: %s", sPrefix ) );
        pktStatus = CELLULAR_PKT_STATUS_PREFIX_MISMATCH;
    }

    return pktStatus;

ok: /* +CARECV: 1459,<data> come here */
    pPrefix = sPrefix;
    strncpy( sPrefix, pLine, pData - pLine );
    sPrefix[ pData - pLine ] = 0;

    if( CELLULAR_AT_SUCCESS != Cellular_ATRemovePrefix( &pPrefix ) )
    {
        LogError( ( "remove prefix(+CARECV) failed: %s", sPrefix ) );
        return CELLULAR_PKT_STATUS_PREFIX_MISMATCH;
    }

    if( CELLULAR_AT_SUCCESS != Cellular_ATGetNextTok( &pPrefix, &pToken ) )
    {
        LogError( ( "get recv length failed: %s", sPrefix ) );
        return CELLULAR_PKT_STATUS_PREFIX_MISMATCH;
    }

    int32_t nRecvCnt = 0;

    if( CELLULAR_AT_SUCCESS != Cellular_ATStrtoi( pToken, 10, &nRecvCnt ) )
    {
        LogError( ( "convert recv length failed: %s", pToken ) );
        return CELLULAR_PKT_STATUS_PREFIX_MISMATCH;
    }

    if( ( nRecvCnt < 0 ) || ( nRecvCnt > CELLULAR_MAX_RECV_DATA_LEN ) )
    {
        LogError( ( "Data response received with wrong size: %d", nRecvCnt ) );
        return CELLULAR_PKT_STATUS_PREFIX_MISMATCH;
    }

    if( lineLength < ( uint32_t ) ( nRecvCnt + pData - pLine ) ) /*lineLength not enguth */
    {
        /* More data is required. */
        LogDebug( ( "need more data %u < %u", lineLength, ( uint32_t ) nRecvCnt + pData - pLine ) );
        return CELLULAR_PKT_STATUS_SIZE_MISMATCH; /* Modem recv continue*/
    }

    *pDataLength = nRecvCnt;
    *pData++ = 0;         /* current line become +CARECV: <len>\0       */
    *ppDataStart = pData; /* pData will be saved to pResp->pItm->next   */
    LogDebug( ( "Data: %p length: %d saved to nex pResp", pData, nRecvCnt ) );

    return CELLULAR_PKT_STATUS_OK;
}