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

📄 atcmd.c

📁 CML CMX868 modem
💻 C
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------------------------------
//	Project:-	DE8681
//  	Filename:-	ATCMD.C
//	Description:-	Routines for AT Command Functions and Interpretation.
//	Programmer:-	D.T.F	
//	Version:-	2.0
//	Created:-	28th February 2002
//	Last modified:-
//---------------------------------------------------------------------------------------------------
//	(C) Consumer Microcircuits Ltd 2002
//
//	This firmware was designed by:-
//			Consumer Microcircuits Ltd,
//			Langford, Maldon,
//			ESSEX
//			CM9 6WG.
//	in the UK for use with CML evaluation kits only and is based on UK originated technology.
//	Please contact
//			sales@cmlmicro.co.uk
//			+44 (0)1621 875500
//	for licensing details.
//---------------------------------------------------------------------------------------------------

#define ATCMD_C

#include	"ef8681.h"

unsigned char atcmd_interpret(void)
{
	unsigned char retval;

	ATBUFPTR = 0;

	while (ATBUF[ATBUFPTR] != NUL)				// Check if NULL encountered to indicate end of AT command.
	{	

		switch(ATBUF[ATBUFPTR])
		{
			case 'A': case 'a':
				retval = atacmd();		// Routine sets Answer flag in S register
								// AT Command Mode Flag cleared to indicate Handshaking
				break;
			case 'B': case 'b':
				retval = atbcmd();		// Routine to control communication standard
				break;
			case 'D': case 'd':
				retval = atdcmd();		// Routine to extract DTMF digits and set Call flag in S register
								// AT Command Mode Flag cleared to indicate Handshaking
				break;
			case 'E': case'e':
				retval = atecmd();		// Routine to control echo
				break;
			case 'H': case'h':
				retval = athcmd();		// Routine to control hook swicth
				break;
			case 'I': case'i':
				retval = aticmd();		// Routine to provide user product information
				break;
			case 'N': case'n':
				retval = atncmd();		// Routine to enable/disable modulation fallback
				break;
			case 'O': case'o':
				retval = atocmd();		// Routine to revert back to online mode
				break;
			case 'Q': case'q':
				retval = atqcmd();		// Routine to control Modem responses
				break;
			case 'S': case's':
				retval = atscmd();		// Routine to write or read S-Registers
				break;
			case 'V': case'v':
				retval = atvcmd();		// Routine to control result code format
				break;
			case 'X': case'x':
				retval = atxcmd();		// Routine to control calling characteristics
				break;
			case 'Z': case'z':
				retval = atzcmd();		// Routine to reset modem and restore factory profiles
				break;
			case '&':
				retval = xatcmd();		// Routine to excute extended AT Commands
				break;
			case '@':
				retval = cmlatcmd();		// Routine to excute CML specific AT Commands
				break;
			default:
				retval = ERROR;
				break;
		}

		// If an error occurs during interpretation
		// or Manual Answer or Dial has been requested
		// AT Command interpretation will be terminated

		if (retval != OK)
		{
			return (retval);
		}

		ATBUFPTR++;					// Increment AT Command Buffer pointer.
	}	
	return (OK);						// Intepretation has completed successfully or no commands had been entered.
}


unsigned char atacmd(void)
{
	ATCMDMODE = 0;
	ANSORIG = 0;						// Set to indicate answering

	return (NORESULT);
}

unsigned char atbcmd(void)					// Modify Call Characteristic bits located in S27 reg
{
	unsigned char tempreg;

	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case '0':
			tempreg = PROTB0;
			break;
		case '1':
			tempreg = PROTB1;
			break;
		case '2':
			tempreg = PROTB2;
			break;
		case '3':
			tempreg = PROTB3;
			break;
		case '4':
			tempreg = PROTB4;
			break;
		case '5':
			tempreg = PROTB5;
			break;
		case '6':
			tempreg = PROTB6;
			break;
		case '7':
			tempreg = PROTB7;
			break;
		case '8':
			tempreg = PROTB8;
			break;
		case '9':
			tempreg = PROTB9;
			break;
		default:
			return (ERROR);				// Return ERROR to indicate invalid character
	}
	S27 &= 0b00001111;					// Clear existing Protocol settings 

	S27 ^= tempreg;						// Modify S27 to reflect new settings

	return (OK);						// Return OK to indicate success
}

unsigned char atdcmd(void)
{
	unsigned char	i, tmp;

	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	tmp = ATBUF[ATBUFPTR];					// Load temporary character register

	if ((tmp == 'L') || (tmp == 'l'))
	{
		if (TELNUM[0] != NUL)
		{
			ATCMDMODE = 0;				// Clear AT Command Mode Flag
			ANSORIG = 1;				// Set to indicate originate
			return (NORESULT);			// Return NORESULT to indicate success without result code.
		}
		else
		{
			return (ERROR);				// Return ERROR to indicate no previous telephone number exists
		}
	}

	i = 0;

	while ((tmp <= '9' && tmp >= '0') || (tmp <= 'D' && tmp >= 'A')
		|| (tmp <= 'd' && tmp >= 'a') || tmp == '#' || tmp == '*' || tmp == ',')
	{
		TELNUM[i++] = tmp;				// Load character into telephone digit buffer

		if (i >= maxteldigits)
		{
			TELNUM[0] = NUL;			// Destroy previous loaded digits due to error
			return(ERROR);				// Return ERROR to indicate telephone digit buffer is full
		}

		ATBUFPTR++;					// Increment AT Command Buffer pointer.

		tmp = ATBUF[ATBUFPTR];				// Load temporary character register
	}

	if (i > 0)
	{
		ATBUFPTR--;					// Decrement AT Command Buffer pointer (not essential because interpreter will be terminated)
		TELNUM[i] = NUL;				// Null terminate telephone digit string
		ATCMDMODE = 0;					// Clear AT Command Mode Flag
		ANSORIG = 1;					// Set to indicate originate
		return(NORESULT);				// Return NORESULT to indicate success without result code.
	}
	else
	{
		return (ERROR);					// Return ERROR to indicate no previous telephone number exists
	}
}

unsigned char atecmd(void)					// Modify Echo Character bit located in S14 reg
{
	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case '0':
			ECHO = OFF;				// Disable Echoing
			break;
		case '1':
			ECHO = ON;				// Enable Echoing
			break;
		default:
			return (ERROR);				// Return ERROR to indicate invalid character
	}
	return (OK);						// Return OK to indicate success
}

unsigned char athcmd(void)					// Hook switch control
{
	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case '0':
			hook(0);				// On-Hook
			break;
		case '1':
			hook(1);				// Off-Hook
			break;
		default:
			return (ERROR);				// Return ERROR to indicate invalid character
	}
	return (OK);						// Return OK to indicate success
}

unsigned char aticmd(void)					// Send information to terminal
{
	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case '0':
			genmsgtopc(idmsg);			// Send id message to terminal
			break;
		case '1':
			genmsgtopc(prodmsg);			// Send product message to terminal
			break;
		case '2':
			genmsgtopc(cmlukmsg);			// Send CML UK message to terminal
			genmsgtopc(cmlukwwwmsg);		// Send CML UK Web address message to terminal
			genmsgtopc(cmlukemmsg);			// Send CML UK Email address message to terminal
			genmsgtopc(cmluktelmsg);		// Send CML UK Telephone message to terminal
			break;
		case '3':
			genmsgtopc(cmlsgmsg);			// Send CML Singapore message to terminal
			genmsgtopc(cmlsgemmsg);			// Send CML Singapore Email address message to terminal
			break;
		case '4':
			genmsgtopc(mxcommsg);			// Send MX-COM message to terminal
			genmsgtopc(mxcomemmsg);			// Send MXCOM Email address message to terminal
			break;
		default:
			return (ERROR);				// Return ERROR to indicate invalid character
	}
	return (OK);						// Return OK to indicate success
}

unsigned char atncmd(void)
{
	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case '0':
			FALLBACK = OFF;				// Disable Modulation Fallback
			break;
		case '1':
			FALLBACK = ON;				// Enable Modulation Fallback
			break;
		default:
			return (ERROR);				// Return ERROR to indicate invalid character
	}
	return (OK);						// Return OK to indicate success
}

unsigned char atocmd(void)
{
	DATAXFER = 1;						// Revert back to online data transfer mode
	ATCMDMODE = 0;
	return (NORESULT);
}

unsigned char atqcmd(void)					// Modify Response bit located in S14 reg
{
	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case '0':
			RESOFF = FALSE;				// Enable result code responses
			break;
		case '1':
			RESOFF = TRUE;				// Disable result code responses
			break;
		default:
			return (ERROR);				// Return ERROR to indicate invalid character
	}
	return (OK);						// Return OK to indicate success
}

unsigned char atscmd(void)
{
	unsigned long i;

	unsigned char k=0;

	char tempbuf[3];

	volatile unsigned char bank2 * sregptr;

	unsigned char sreg_offset;

	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	if ((ATBUF[ATBUFPTR] > '9') || (ATBUF[ATBUFPTR] < '0'))
	{
		return(ERROR);
	}

	tempbuf[k++] = ATBUF[ATBUFPTR++];

	if ((ATBUF[ATBUFPTR] <= '9') && (ATBUF[ATBUFPTR] >= '0'))
	{
		tempbuf[k++] = ATBUF[ATBUFPTR++];
	}
	tempbuf[k] = NUL;

	sreg_offset = (atoi(tempbuf)) & 0xFF;			// Convert ASCII decimal to integer
	
	if (sreg_offset >= numsregs)				// Return ERROR if offset exceeds max value
	{							// specified in header file
		return(ERROR);
	}

	sregptr = &S0;
	sregptr += sreg_offset;

	if (ATBUF[ATBUFPTR] == '=')
	{
		ATBUFPTR++;					// Increment AT Command Buffer pointer.

		i = ascregtolong();
		if (i > 255)					// If 8-bit register exceeds 255 return error.
		{
			return (ERROR);
		}
		*sregptr = i;
	}
	else if (ATBUF[ATBUFPTR] == '?')
	{
		if (HEXOP)
		{
			hexnum2scrn(*sregptr,2,WORDRES);	// Send LF char if word results enabled
		}
		else
		{
			decnum2scrn(*sregptr,3,WORDRES);	// Send LF char if word results enabled
		}
	}
	else
	{
		return (ERROR);					// Return ERROR to indicate invalid character
	}
	return (OK);						// Return OK to indicate success
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -