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

📄 shell._c

📁 使用8880实现DTMF通信及拨号的程序.
💻 _C
字号:
#include "serial.h"
#include "string.h"
#include "8880.h"
#include <iom8v.h>
#include "main.h"
#include "shell.h"
typedef int (*cmdproc)(char argc,char *argv[]);
typedef struct tagCMDSTRUCT{
	   char *cmd;
	   char *help;
	   cmdproc proc;
}CMD_STRUCT,*PCMD_STRUCT;
signed char GetCmdMatch(char * cmd);
CMD_STRUCT InnerCmd[]={
		   {"help","Desplay this information.\n",help},
		   {"call","call a telphon number,uses:call 110\n",call},
		   {"cancel","cancel a call process.\n", cancel},
		   {"echo","enable or disenable echo.\n",echo},
		   {"read","read a number from remote.\n",read},
		   {"autoanswer","auto answer the remote call.\n",autoanswer}, 
		   {0,0}
};
int read(char argc,char*argv[])
{
 	char buf[100];
	int x=atoi(argv[1]);
	if ((argc<2)||(!sysoption.calling)) {
	   serial_send(c_error);
	   return 0;
	}
 	M8880_Recv(buf,x);
	serial_send(buf);
}
int autoanswer(char argc,char*argv[])
{
 	if (argc<2){
	   serial_send(c_error);
	   return 0;
	}
	if (strcmp(argv[1],"on")==0)
	   sysoption.autoanswer=-1;
	else
	   sysoption.autoanswer=0;
	serial_send(ok); 
	return 0;
}
int echo(char argc,char*argv[])
{
 	if (argc<2){
	   serial_send(c_error);
	   return 0;
	}
	if (strcmp(argv[1],"on")==0)
	   sysoption.echo=-1;
	else
	   sysoption.echo=0;
	serial_send(ok);
	return 0;
}
int call(char argc,char*argv[])
{
 	char i;
	char *c;
	if (sysoption.calling){
	   serial_send(c_busying);
	   return 0;
	};
	if (argc<2){
	   serial_send(c_error);
	   return 0;
	}
	c=argv[1];
	while(*c){
		if ((*c<'0')||(*c>'9')) {
		   serial_send(c_error);
		   return 0;
		}
		c++;
	}
 	M8880_Handup;
	for (i=0;i<10;i++)
	delay(0xffff);
 	M8880_CPDial(argv[1]); 
	sysoption.calling=1;
	sysoption.timer=0;
	TCCR1B=0x05;
	serial_send(calling);
	return 0;
}
int cancel(char argc,char*argv[])
{
 	char i;
 	M8880_Handdown;
	for (i=0;i<10;i++) delay(0xffff);
	sysoption.calling=0;
 	MCUCR&=~0xc;
	MCUCR|=0x8;
	serial_send(c_ok);
 	return 0;
}
int help(char argc,char* argv[])
{
 	signed char i=0;
	if (argc==1){
	   while(InnerCmd[i].cmd){
		serial_send(InnerCmd[i].cmd);
		serial_send(":\t");
		serial_send(InnerCmd[i].help);
		i++;
	   }
	}else{
	   i=GetCmdMatch(argv[1]);
	   if (i<0)
	   	  serial_send("Haven't this command.\n");
	   else
	   	  serial_send(InnerCmd[i].help);
	}
	return 0;
}
void ParseArgs(char *cmdline,signed char *argc,char** argv)
{
#define STATE_WHITESPACE	0
#define STATE_WORD			1

	char *c;
	char state = STATE_WHITESPACE;
	char i;

	*argc = 0;

	if(strlen(cmdline) == 0)
		return;

	/* convert all tabs into single spaces */
	c = cmdline;
	while(*c != '\0')
	{
		if(*c == '\t')
			*c = ' ';
		c++;
	}
	
	c = cmdline;
	i = 0;

	/* now find all words on the command line */
	while(*c != '\0')
	{
		if(state == STATE_WHITESPACE)
		{
			if(*c != ' ')
			{
				argv[i] = c;		//将argv[i]指向c
				i++;
				state = STATE_WORD;
			}
		}
		else
		{ /* state == STATE_WORD */
			if(*c == ' ')
			{
				*c = '\0';
				state = STATE_WHITESPACE;
			}
		}
		c++;
	}
	
	*argc = i;
#undef STATE_WHITESPACE
#undef STATE_WORD
}
signed char GetCmdMatch(char * cmd)
{
 	char i=0;
 	while(InnerCmd[i].cmd){
		if (strcmp(InnerCmd[i].cmd,cmd)==0) return i;
		i++;
	}
 	 return -1;
}
void ParseCmd(char *cmdline)
{
  signed char argc,Cmd_Index;
  char *argv[5];
  ParseArgs(cmdline,&argc,argv);
  if (argc==0) return;
  Cmd_Index=GetCmdMatch(argv[0]);
  if (Cmd_Index<0){
  	 serial_send("unknow command\n");
	 return;
  }
  if (InnerCmd[Cmd_Index].proc)
  	 InnerCmd[Cmd_Index].proc(argc,argv);
} 
void shellin(void)
{	 
	 char buf[51];
 	 if (serial_recv(buf,50)>0){
	 	ParseCmd(buf);
	 };
}

⌨️ 快捷键说明

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