in modules/sara_r4/cellular_r4_api.c [83:214]
static CellularPktStatus_t socketRecvDataPrefix( void * pCallbackContext,
char * pLine,
uint32_t lineLength,
char ** ppDataStart,
uint32_t * pDataLength );
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 CellularError_t storeAccessModeAndAddress( CellularContext_t * pContext,
CellularSocketHandle_t socketHandle,
CellularSocketAccessMode_t dataAccessMode,
const CellularSocketAddress_t * pRemoteSocketAddress );
static CellularPktStatus_t _Cellular_RecvFuncGetSocketId( CellularContext_t * pContext,
const CellularATCommandResponse_t * pAtResp,
void * pData,
uint16_t dataLen );
static CellularError_t _Cellular_GetSocketNumber( CellularHandle_t cellularHandle,
CellularSocketHandle_t socketHandle,
uint8_t * pSessionId );
CellularError_t Cellular_SetPdnConfig( CellularHandle_t cellularHandle,
uint8_t contextId,
const CellularPdnConfig_t * pPdnConfig );
static CellularError_t _Cellular_GetPacketSwitchStatus( CellularHandle_t cellularHandle,
bool * pPacketSwitchStatus );
static CellularError_t _Cellular_GetContextActivationStatus( CellularHandle_t cellularHandle,
CellularPdnContextActInfo_t * pPdpContextsActInfo );
static bool _parseExtendedSignalQuality( char * pQcsqPayload,
CellularSignalInfo_t * pSignalInfo );
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 );
CellularError_t Cellular_SetPsmSettings( CellularHandle_t cellularHandle,
const CellularPsmSettings_t * pPsmSettings );
/*-----------------------------------------------------------*/
static CellularPktStatus_t socketRecvDataPrefix( void * pCallbackContext,
char * pLine,
uint32_t lineLength,
char ** ppDataStart,
uint32_t * pDataLength )
{
char * pToken = NULL;
int32_t tempValue = 0;
CellularATError_t atResult = CELLULAR_AT_SUCCESS;
CellularPktStatus_t pktStatus = CELLULAR_PKT_STATUS_OK;
char pLocalLine[ SOCKET_DATA_PREFIX_STRING_LENGTH + 1 ] = { '\0' };
char * pDataStart = pLocalLine;
( void ) lineLength;
/* pCallbackContext is not used in this function. It should be NULL. */
if( ( pLine == NULL ) || ( ppDataStart == NULL ) || ( pDataLength == NULL ) || ( pCallbackContext != NULL ) )
{
LogError( ( "socketRecvData: Bad parameters" ) );
pktStatus = CELLULAR_PKT_STATUS_BAD_PARAM;
}
else if( strncmp( pLine, SOCKET_DATA_PREFIX_TOKEN, SOCKET_DATA_PREFIX_TOKEN_LEN ) != 0 )
{
/* Prefix string which is not SOCKET_DATA_PREFIX_TOKEN does't indicate data start.
* Set data length to 0.*/
*ppDataStart = NULL;
*pDataLength = 0;
}
else
{
/* The string length of "+USORD: <socket>[,<length>],"<data in text mode>". */
strncpy( pLocalLine, pLine, SOCKET_DATA_PREFIX_STRING_LENGTH );
pDataStart = &pLocalLine[ SOCKET_DATA_PREFIX_TOKEN_LEN ];
/* Skip the socket number. */
atResult = Cellular_ATGetNextTok( &pDataStart, &pToken );
/* Parse the receive data length. */
if( ( atResult == CELLULAR_AT_SUCCESS ) && ( pDataStart[ 0 ] == '"' ) )
{
/* Peek the next symbol. If it is \", then length is ommited. Received byte is 0. */
LogDebug( ( "socketRecvData: 0 received bytes." ) );
*pDataLength = 0U;
*ppDataStart = NULL;
}
else if( atResult == CELLULAR_AT_SUCCESS )
{
/* Parse the length. */
atResult = Cellular_ATGetNextTok( &pDataStart, &pToken );
if( atResult == CELLULAR_AT_SUCCESS )
{
atResult = Cellular_ATStrtoi( pToken, 10, &tempValue );
if( ( tempValue < 0 ) && ( ( uint32_t ) tempValue > CELLULAR_MAX_RECV_DATA_LEN ) )
{
LogError( ( "socketRecvData: Bad parameters" ) );
atResult = CELLULAR_AT_ERROR;
}
}
if( atResult == CELLULAR_AT_SUCCESS )
{
/* Change +USROD: <socket>,<length>," to +USROD: <socket>,<length>,\r. */
pDataStart = &pLine[ pDataStart - pLocalLine ];
if( pDataStart[ 0 ] == '\"' )
{
*pDataStart = '\r';
*ppDataStart = ( char * ) &pDataStart[ 1 ];
*pDataLength = ( uint32_t ) tempValue;
}
}
}
else
{
LogDebug( ( "socketRecvDataPrefix : pLine [%s] with lineLength [%d] is not data prefix", pLine, lineLength ) );
}
}
return pktStatus;
}