📄 console_v1_01.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 + -