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

📄 console_v1_01.c

📁 just uploading the file to get a new downlad for AD7843
💻 C
字号:
#include "app_config.h"

#ifdef CONSOLE

#ifndef CONS_SER
#define CONS_SER	0
#endif

#ifndef CONS_TBUF_SIZE
#define CONS_TBUF_SIZE	240		//default
#endif

#ifndef CONS_RBUF_SIZE
#define CONS_RBUF_SIZE	80 		//default
#endif

#ifndef MAX_PARA_END
#define MAX_PARA_END	20
#endif

unsigned char ctx_buf[CONS_TBUF_SIZE];
unsigned char crx_buf[CONS_RBUF_SIZE];

#if (CONS_TBUF_SIZE<=255)
unsigned char ctx_wi;
unsigned char ctx_ri;
unsigned char ctx_dif;
#else
unsigned int ctx_wi;
unsigned int ctx_ri;
unsigned int ctx_dif;
#endif

#if (CONS_RBUF_SIZE<=256)
unsigned char crx_ri = 0;
#else
unsigned int crx_ri = 0;
#endif

char para;
char para_2[2];
int para_num;
int para_len;
unsigned char para_valid;
char para_end[MAX_PARA_END];

unsigned char cons_rovr = 0;
unsigned char console_echo = 1;

extern const char cmd_table[MAX_CMD][MAX_CMD_LEN+2];
extern void (*func_table[MAX_CMD])(unsigned char para_i);

void echo(unsigned char val) //set echo or not
{
	console_echo = val;
}

unsigned char get_para_1(unsigned char para_i)
{
	char c;
	para_valid = 0;
	while (para_i != crx_ri)
	{
		c = crx_buf[para_i]; 
		if (c != ' ')
		{
			para = c;
			if (para_i != crx_ri)
			{
				if (para_i == CONS_RBUF_SIZE-1)
					para_i = 0;
				else
					para_i++;
				c = crx_buf[para_i]; 
				if ((para_i == crx_ri) || (c == ' '))
					para_valid = 1;
			}
			else
			{
				para_valid = 1;
			}

			break;
		}
		if (para_i == CONS_RBUF_SIZE-1)
			para_i = 0;
		else
			para_i++;
	}
	return (para_i);
}

unsigned char get_para_2(unsigned char para_i)
{
	char c;
	para_valid = 0;
	while (para_i != crx_ri)
	{
		c = crx_buf[para_i]; 
		if (c != ' ')
		{
			para_2[0] = c;
			if (para_i != crx_ri)
			{
				if (para_i == CONS_RBUF_SIZE-1)
					para_i = 0;
				else
					para_i++;
				c = crx_buf[para_i];
				para_2[1] = c;
				if (para_i != crx_ri)
				{
					if (para_i == CONS_RBUF_SIZE-1)
						para_i = 0;
					else
						para_i++;
					c = crx_buf[para_i]; 
					if ((para_i == crx_ri) || (c == ' '))
						para_valid = 1;
				}
				else
				{
					para_valid = 1;
				}
			}

			break;
		}
		if (para_i == CONS_RBUF_SIZE-1)
			para_i = 0;
		else
			para_i++;
	}
	return (para_i);
}

unsigned char get_para_num(unsigned char para_i) //get number between -2147483648 to 2147483647
{
	char c = 0;
	short i = 0;
	unsigned char minus_flag = 0;
	int mul_buf = 1;
	para_valid = 0;
	para_len = 0;
	para_num = 0;
	while ((para_i != crx_ri))
	{
		c = crx_buf[para_i]; 
		if (c != ' ')
		{
			para_valid = 1;
			break;
		}
		if (para_i == CONS_RBUF_SIZE-1)
			para_i = 0;
		else
			para_i++;
	}
	if (para_valid)
	{
		if (crx_buf[para_i] == '-')
		{
			minus_flag = 1;
			para_i++;
		}
		while ((para_i != crx_ri) && (crx_buf[para_i] != ' '))
		{
			c = crx_buf[para_i];
			if (!check_m_n(c,'0','9'))
			{
				para_valid = 0;
				break;
			}
			para_end[i] = c;
			i++;
			if (i == MAX_PARA_END)
				break;
			if (para_i == CONS_RBUF_SIZE-1)
				para_i = 0;
			else
				para_i++;
		}
	}

	para_len = i;

	for (i=para_len-1; i>=0; i--)
	{
		para_num += mul_buf*(para_end[i] - '0');
		mul_buf *= 10;
	}

	if (minus_flag)
	{
		para_num *= -1;
	}

	return (para_i);

}

unsigned char get_para_end(unsigned char para_i)
{
	char c = 0;
	unsigned char i = 0;
	para_valid = 0;
	para_len = 0;
	while ((para_i != crx_ri))
	{
		c = crx_buf[para_i]; 
		if (c != ' ')
		{
			para_valid = 1;
			break;
		}
		if (para_i == CONS_RBUF_SIZE-1)
			para_i = 0;
		else
			para_i++;
	}
	if (para_valid)
	{
		while (para_i != crx_ri)
		{
			c = crx_buf[para_i]; 
			para_end[i] = c;
			i++;
			if (i == MAX_PARA_END)
				break;
			if (para_i == CONS_RBUF_SIZE-1)
				para_i = 0;
			else
				para_i++;
		}
	}
	para_end[i] = 0;
	para_len = i;
	return (para_i);
}

void check_cmd(int si)
{
	unsigned char i,j,k;
	unsigned char match;

	for (i=0; i<MAX_CMD; i++)
	{
		j = 0;
		k = si;
		
		if (code(cmd_table[i][j])) //Check if cmd is not a blank one
		{
			match = 1;
			while (code(cmd_table[i][j]))
			{
				if ((code(cmd_table[i][j]) != to_upper(crx_buf[k])))
				{
					match = 0;
					break;
				}
				j++;
				k++;
			}
		}
		else
		{
			match = 0;
		}

		if (match)
		{
			if ((crx_buf[k] == 0x0D) || (crx_buf[k] == ' ')) //add up at v1.01
				break;
		}
	}

	if (match)
	{
		(func_table[i])(k);
	}
}

void recog(void)
{
	unsigned int i;
	unsigned char found_alph = 0;
	for (i=0; i<crx_ri; i++)
	{
		if (check_m_n(to_upper(crx_buf[i]),'A','Z')) //Search for first alphabet
		{
			found_alph = 1;
			break;
		}
	} 

	if (found_alph)
	{
		check_cmd(i);
	}
}

void listen(void)
{
	char c;
	while (SerialIsRxReady(CONS_SER))
	{
		c = SerialGetRx(CONS_SER);
		if (!SerialIsRxError(CONS_SER))
		{
			crx_buf[crx_ri] = c;
			switch (c)
			{
				case 0x08 :				//Back Space
					if (console_echo)
					{
						saych(0x08); 		//Back Space
						saych(0x20); 		//Space
						saych(0x08); 		//Back Space
					}
					if (crx_ri)
						crx_ri--;
					break;
				case 0x0D :				//Carriage Return
					if (console_echo)
					{
						saych(0x0A); 		//Line Feed
						saych(0x0D); 		//Carriage Return
					}
					recog();
					crx_ri = 0;
					break;
				default :
					if (console_echo)
					{
						saych(c);
					}
					if (crx_ri < CONS_RBUF_SIZE-1)
						crx_ri++;
					else
						cons_rovr = 1;
					break;
			}
		}
	}
}

unsigned char say(void)
{
	unsigned char n = 0;
	if (SerialIsTxEmpty(CONS_SER))
	{
		while (ctx_dif && (n < SER_FIFO_SIZE - 1))
		{
			SerialSendTx(CONS_SER,ctx_buf[ctx_ri]);
			if (ctx_ri == CONS_TBUF_SIZE - 1)
				ctx_ri = 0;
			else
				ctx_ri++;
			ctx_dif--;
			n++;
		}
	}

	if (ctx_dif)
		return (1);
	else
		return (0); //return 0 when there are no more to say
}

void saych(char c)
{
	if (ctx_dif != CONS_TBUF_SIZE - 1)
	{
		ctx_buf[ctx_wi] = c;
		if (ctx_wi == CONS_TBUF_SIZE - 1)
			ctx_wi = 0;
		else
			ctx_wi++;
		ctx_dif++;
	}
}

void saystr(char *str)
{
	int i = 0;

	while(str[i])
	{
		saych(str[i]);
		i++;
	}
}

void saytxt(const char *txt)
{
	int i = 0;

	while(code(txt[i]))
	{
		saych(code(txt[i]));
		i++;
	}
}

void sayhex(unsigned char hex)
{
	unsigned char hex1 = hex >> 4;
	unsigned char hex0 = hex & 0x0F;

	saych(hextable(hex1));
	saych(hextable(hex0));
}

void sayhex16(unsigned short hex)
{
	unsigned char hex1 = hex >> 12;
	unsigned char hex0 = (hex >> 8) & 0x0F;

	saych(hextable(hex1));
	saych(hextable(hex0));

	hex1 = (hex >> 4) & 0x0F;
	hex0 = hex & 0x0F;

	saych(hextable(hex1));
	saych(hextable(hex0));
}

void sayhex32(unsigned long hex)
{
	unsigned short a = hex >> 16;
	sayhex16(a);
	a = hex;
	sayhex16(a);
}

#endif

⌨️ 快捷键说明

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