⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rxtext.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
================================================================================
* @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 + -