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