📄 shell._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 + -