00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "..\inc\includes.h"
00010
00011 #define ShellIdleState 0
00012 #define ShellInit0State 1
00013 #define ShellInit1State 2
00014 #define ShellArgumentWaitState 3
00015 #define ShellArgumentProcState 4
00016 #define ShellCommandProcState 5
00017 #define ShellCommandExecState 6
00018
00019 #define ShellArgumentSearchState 0
00020 #define ShellArgumentGoThroughState 1
00021 #define ShellArgumentDoneState 2
00022
00023 #define Command0 0
00024 #define Command1 1
00025 #define Command2 2
00026 #define Command3 3
00027 #define Command4 4
00028 #define Command5 5
00029
00030 #define SHELL_COMMAND_MAX 5
00031 INT8U code info[5]={'i','n','f','o',0};
00032 INT8U code ls[3]={'l','s',0};
00033 INT8U code motor[6]={'m','o','t','o','r',0};
00034 INT8U code rtc[4]={'r','t','c',0};
00035 INT8U code lcm[4]={'l','c','m',0};
00036 INT8U code *ShellCommand[SHELL_COMMAND_MAX]={info,ls,motor,rtc,lcm};
00037
00038 struct SHELL_CONTROL ShellCtrl;
00039
00040 void F_ShellPowerOnInit(void) LargeReentrant;
00041 void F_ShellSvc(void) LargeReentrant;
00042 void F_ShellKeyPut(INT8U Data) LargeReentrant;
00043
00044 void F_ShellPowerOnInit(void) LargeReentrant{
00045 ShellCtrl.State=ShellInit0State;
00046 ShellCtrl.Put=0;
00047 ShellCtrl.Argc=0;
00048 }
00049 void F_ShellSvc(void) LargeReentrant{
00050 INT8U i;
00051 INT8U ArgumentState;
00052
00053 switch(ShellCtrl.State){
00054 case ShellIdleState:
00055 break;
00056 case ShellInit0State:
00057 printf("\n****************");
00058 printf("\nHello, I am 8051 ");
00059 printf("\n****************");
00060 ShellCtrl.State=ShellInit1State;
00061 break;
00062 case ShellInit1State:
00063 printf("\ncmd:>");
00064 ShellCtrl.Put=0;
00065 ShellCtrl.State=ShellArgumentWaitState;
00066 break;
00067 case ShellArgumentWaitState:
00068 if(F_UartCheckKeyInBuffer()==UART_KEY_BUFFER_EMPTY) return;
00069 i=F_UartKeyInGet();
00070 F_ShellKeyPut(i);
00071 if(ShellCtrl.Put==SHELL_BUFFER_MAX){
00072 printf("\n invalid command");
00073 ShellCtrl.State=ShellInit1State;
00074 }
00075 else if(i==0x0d) ShellCtrl.State=ShellArgumentProcState;
00076 break;
00077 case ShellArgumentProcState:
00078 i=0;
00079 ShellCtrl.Argc=0;
00080 ArgumentState=ShellArgumentSearchState;
00081 while(1){
00082 switch(ArgumentState){
00083 case ShellArgumentSearchState:
00084 if(ShellCtrl.Data[i]==' ');
00085 else if(ShellCtrl.Data[i]==0x0d){
00086 ArgumentState=ShellArgumentDoneState;
00087 }
00088 else{
00089 ShellCtrl.pArgv[ShellCtrl.Argc]=&ShellCtrl.Data[i];
00090 ArgumentState=ShellArgumentGoThroughState;
00091 }
00092 break;
00093 case ShellArgumentGoThroughState:
00094 if(ShellCtrl.Data[i]==' '){
00095 ShellCtrl.Data[i]=0;
00096 ShellCtrl.Argc++;
00097 if(ShellCtrl.Argc==SHELL_ARGUMENT_MAX) ArgumentState=ShellArgumentDoneState;
00098 else ArgumentState=ShellArgumentSearchState;
00099 }
00100 else if(ShellCtrl.Data[i]==0x0d){
00101 ShellCtrl.Data[i]=0;
00102 ShellCtrl.Argc++;
00103 ArgumentState=ShellArgumentDoneState;
00104 }
00105 break;
00106 }
00107 i++;
00108 if(ArgumentState==ShellArgumentDoneState) break;
00109 }
00110 if(ShellCtrl.Argc==0) ShellCtrl.State=ShellInit1State;
00111 else ShellCtrl.State=ShellCommandProcState;
00112 break;
00113 case ShellCommandProcState:
00114 for(i=0;i<SHELL_COMMAND_MAX;i++){
00115 if(strcmp(ShellCtrl.pArgv[0],ShellCommand[i])==0){
00116 ShellCtrl.Command=i;
00117 break;
00118 }
00119 }
00120 if(i==SHELL_COMMAND_MAX){
00121 printf("\n Command '%s' is not supported",ShellCtrl.pArgv[0]);
00122 ShellCtrl.State=ShellInit1State;
00123 }
00124 else ShellCtrl.State=ShellCommandExecState;
00125 break;
00126 case ShellCommandExecState:
00127 switch(ShellCtrl.Command){
00128 case Command0:
00129 printf("\n mcu: MPC89E54AE");
00130 printf("\n 16k flash rom");
00131 printf("\n 256 bytes internal ram, at 0x00~0xff");
00132 printf("\n 1024 bytes external ram, at 0x00~0x3ff");
00133 printf("\n support lcm,led,rtc,motor,irda");
00134 break;
00135 case Command1:
00136 printf("\ncommand list:");
00137 printf("\ninfo");
00138 printf("\nls");
00139 printf("\nmotor");
00140 printf("\nrtc");
00141 printf("\nlcm");
00142 break;
00143 case Command2:
00144 printf("\ncommand motor");
00145 F_MotorCommandSet(&ShellCtrl.pArgv[1],(ShellCtrl.Argc-1));
00146 break;
00147 case Command3:
00148 printf("\ncommand rtc");
00149 F_RtcCommandSet(&ShellCtrl.pArgv[1],(ShellCtrl.Argc-1));
00150 break;
00151 case Command4:
00152 printf("\ncommand 'lcm' not supported");
00153 break;
00154 default:
00155 printf("\nunknow command value");
00156 break;
00157 }
00158 ShellCtrl.State=ShellInit1State;
00159 break;
00160 }
00161 }
00162 void F_ShellKeyPut(INT8U Data) LargeReentrant{
00163 if(ShellCtrl.Put<SHELL_BUFFER_MAX){
00164 ShellCtrl.Data[ShellCtrl.Put]=Data;
00165 ShellCtrl.Put++;
00166 }
00167 }
00168
00169
00170