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