📄 rxtext.c
字号:
/*
================================================================================
* @file RxText.c
* @brief Character string reception processing
* @author 2006/03/30 Michiru Kagaya
* Copyright (C)SEIKO EPSON Corp. All Rights Reserved.
================================================================================
*/
//=================================
// Include files
//=================================
#include <string.h>
#include <ctype.h>
#include "UART_FUNC.h"
#include "UART_FuncCom.h"
#include "UART_IF.h"
//=================================
// Define declaration
//=================================
#define STS_SUCCESS 1 // All requested bytes is set.
#define STS_NULL_FOUND 0 // NULL is found before transfering requested bytes.
//=================================
// Function prototype
//=================================
short RcvTxtCallback( unsigned short wMsg, unsigned short wStatus, void* pRxChannel );
static BOOL IsAsciiCode( unsigned char ch );
static unsigned char GetRcvBufData( unsigned short reqSize, unsigned char *pReqAdd, unsigned short *pwActSize, PRX_INFO psRxInfo ); //=================================
// static variable
//=================================
static unsigned char IntRcvCtrlCh = 0;
/*
--------------------------------------------------------------------------------
* UART_FuncReceiveTextA
* @brief Receive string (Asynchronous)
* @param unsigned char bChannel : Suspension channel number
* unsigned short wSize : Receive buffer size
* unsigned char* String : Receive buffer address
* UART_FUNC_CALLBACK pfnCallbackProc : The callback function notified on completion.
* @retval unsigned short
* STATUS_SUCCESS : Complete normally
* STATUS_INVALID_PARAMETER: Parameter error
--------------------------------------------------------------------------------
*/
short UART_FuncReceiveTextA ( unsigned char bChannel, unsigned short wSize,
unsigned char *pString, UART_FUNC_CALLBACK pfnCallbackProc )
{
PRX_INFO psRxInfo;
unsigned char index = bChannel-1;
unsigned short wRcvdSize;
unsigned char sts;
//===============================
// Check parameter
//===============================
if( wSize == 0 || pString == NULL || bChannel == 0 || bChannel > MAX_UART_CHANNEL ){
return STATUS_INVALID_PARAMETER;
}
// Does the number of transmission exceed the size of the sheltering buffer?
psRxInfo = &sModuleInfo.sChInfo[index].rxInfo;
if( wSize > psRxInfo->wTempSize ){
return STATUS_UNSUCCESSFUL;
}
//===============================
// Check state
//===============================
if( sModuleInfo.sChInfo[index].state < STATE_READY ){
return STATUS_UNSUCCESSFUL;
}
if( psRxInfo->state == TRAN_STATE_BUF_OVERFLOW ){
// Before the API is called, the buffer is overflow.
psRxInfo->state = TRAN_STATE_READY; // Return the state
return UART_FUNC_STATUS_BUF_OVERFLOW;
}
if( psRxInfo->state != TRAN_STATE_READY ){
return STATUS_UNSUCCESSFUL; // In transmiting
}
if( sModuleInfo.sChInfo[index].state < STATE_READY ){
return STATUS_UNSUCCESSFUL;
}
//===============================
// Save the data
//===============================
psRxInfo->wActSize = 0;
psRxInfo->wReqSize = wSize;
psRxInfo->pReqAddr = pString;
psRxInfo->pPutAddr = pString; // Set the receive address
psRxInfo->pfnCallback = pfnCallbackProc;
//===============================
// Receive string processing
//===============================
// Confirm if the data is collected in the internal buffer
//-----------------------------------------
sts = GetRcvBufData( psRxInfo->wReqSize, psRxInfo->pReqAddr, &wRcvdSize, psRxInfo );
if( (sts == STS_SUCCESS && wSize <= wRcvdSize) || (sts==STS_NULL_FOUND) ){ // Have received all the data
// Callback notification
if( psRxInfo->pfnCallback != NULL ){ // The callback is not notified if pCallbackProc is NULL.
UART_FUNC_XFER_RESULT sXferResult;
sXferResult.bChannel = bChannel;
sXferResult.wReqSize = psRxInfo->wReqSize;
sXferResult.wActSize = psRxInfo->wActSize;
sXferResult.pBufAddr = psRxInfo->pReqAddr; // Address specified by API call
psRxInfo->state = TRAN_STATE_READY; // Waiting for transmission preparation
psRxInfo->pfnCallback( UART_FUNCM_RCV_TEXT_CMP, STATUS_SUCCESS, &sXferResult );
}
}else{
//===============================
// Receive data
//===============================
psRxInfo->state = TRAN_STATE_EXEC_TXTASYNC; // Set to executing transmission.
}
return STATUS_SUCCESS;
}
/*
--------------------------------------------------------------------------------
* UART_FuncReceiveText
* @brief Receive string (synchronous)
* @param unsigned char bChannel : Suspension channel number
* unsigned short wSize : Receive buffer size
* unsigned char* String : Receive buffer address
* @retval unsigned short
* STATUS_SUCCESS : Complete normally
* STATUS_INVALID_PARAMETER: Parameter error
--------------------------------------------------------------------------------
*/
short UART_FuncReceiveText ( unsigned char bChannel, unsigned short wSize,
unsigned char *pString, unsigned short *pwRcvdSize )
{
PRX_INFO psRxInfo;
volatile unsigned char *pTranState;
unsigned char index = bChannel-1;
unsigned char sts;
unsigned short wActSize;
//===============================
// check parameter
//===============================
if( wSize == 0 || pString == NULL || pwRcvdSize == NULL
|| bChannel == 0 || bChannel > MAX_UART_CHANNEL ){
return STATUS_INVALID_PARAMETER;
}
// Doesn't the number of transmission exceed the size of the saving buffer?
psRxInfo = &sModuleInfo.sChInfo[index].rxInfo;
if( wSize > psRxInfo->wTempSize ){
return STATUS_UNSUCCESSFUL;
}
//===============================
// Check state
//===============================
if( sModuleInfo.sChInfo[index].state < STATE_READY ){
return STATUS_UNSUCCESSFUL;
}
if( psRxInfo->state == TRAN_STATE_BUF_OVERFLOW ){
// Befor the API is called, the buffer is overflow.
psRxInfo->state = TRAN_STATE_READY; // set rxState
return UART_FUNC_STATUS_BUF_OVERFLOW;
}
if( psRxInfo->state != TRAN_STATE_READY ){
return STATUS_UNSUCCESSFUL; // In transmiting
}
if( sModuleInfo.sChInfo[index].state < STATE_READY ){
return STATUS_UNSUCCESSFUL;
}
//===============================
// Save data
//===============================
psRxInfo->wActSize = 0;
psRxInfo->wReqSize = wSize;
psRxInfo->pReqAddr = pString;
psRxInfo->pPutAddr = pString; // Set receive address
psRxInfo->pfnCallback = NULL;
//===============================
// Receive string process
//===============================
// Confirm if the data is collected in the internal buffer
//-----------------------------------------
sts = GetRcvBufData( psRxInfo->wReqSize, psRxInfo->pReqAddr, &wActSize, psRxInfo );
if( (sts == STS_SUCCESS && wSize <= wActSize) || (sts==STS_NULL_FOUND) ){ // all the data had been received.
// All data had been set
return STATUS_SUCCESS;
}else{
//===============================
// Receive string process
//===============================
psRxInfo->state = TRAN_STATE_EXEC_TXTSYNC; // Set to executing transmission.
pTranState = &psRxInfo->state;
do {
UART_DELAY( UART_DELAY_TIME ); // Waiting for the completion of transmission
}while( *pTranState != TRAN_STATE_CMP );
psRxInfo->state = TRAN_STATE_READY;
}
*pwRcvdSize = psRxInfo->wActSize;
return STATUS_SUCCESS;
}
/*
--------------------------------------------------------------------------------
* RcvTxtCallback
* @brief The function that recept the Reception callback function from lower module
* @param unsigned short wMsg : UART_IF_RCVD_DATA enters
* unsigned short wStatus : Reception status
* void* pRxChannel : Reception channel number
* @retval short
* STATUS_SUCCESS : Complete normally
--------------------------------------------------------------------------------
*/
short RcvTxtCallback( unsigned short wMsg, unsigned short wStatus, void* pRxChannel )
{
unsigned char ch,
index;
unsigned short i;
unsigned short wRxStatus;
unsigned short wReadSize;
UART_FUNC_XFER_RESULT sXferResult;
PRX_INFO psRxInfo;
// Check parameter
if( wMsg != UART_IF_RCVD_DATA || pRxChannel == NULL ){
return STATUS_INVALID_PARAMETER;
}
ch = *(unsigned char *)pRxChannel;
index = *(unsigned char *)pRxChannel-1;
psRxInfo = &sModuleInfo.sChInfo[index].rxInfo;
if( ch == 0 || ch > MAX_UART_CHANNEL ){
return STATUS_INVALID_PARAMETER;
}
// --- Check the status ---
if( wStatus != STATUS_SUCCESS ){
// Transmission error callback notification
if( psRxInfo->state == TRAN_STATE_EXEC_TXTASYNC ){
if( psRxInfo->pfnCallback != NULL ){ // The callback is not notified if pCallbackProc is NULL.
sXferResult.bChannel = ch;
sXferResult.wReqSize = psRxInfo->wReqSize;
sXferResult.wActSize = psRxInfo->wActSize;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -