BOOTLOADER
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
shellargument.c
Go to the documentation of this file.
1 /******************************************************
2 * Function: Receive uart input string and transfers to
3 * argv, argc for shell use
4 *
5 * File: shellargument.c
6 * Author: Book Chen
7 * Date: 2008.07.18
8 *******************************************************
9 */
10 #include "includes.h"
11 
12 #if(DEBUG_SHELLARGUMENT==1)
13 #define DEBUG_SHELL_DUMP 0
14 #define DEBUG_SHELL_KEY 0
15 #define DEBUG_SHELL_DONE 0
16 #endif
17 
18 #define ArgumentIdleState 0
19 #define ArgumentInitialState 1
20 #define ArgumentRxState 2
21 
22 #define MeetEscKey 0x01
23 #define HasEscXkey 0x02
24 #define HasPageDown 0x04
25 
27 
28 void F_ShellArgumentInit(void);
29 void F_ShellArgumentSvc(void);
30 void F_ShellArgumentParser(void);
31 void F_ShellArgumentReceive(unsigned char **Argv,unsigned char Argc);
32 void F_ShellArgumentReset(void);
33 void F_ShellArgumentBs(void);
34 void F_ShellArgumentDel(void);
35 void F_ShellArgumentKeyPut(unsigned char);
36 void F_ShellArgumentIns(void);
37 void F_ShellArgumentHome(void);
38 void F_ShellArgumentEnd(void);
39 void F_ShellArgumentPageUp(void);
40 void F_ShellArgumentPageDown(void);
41 void F_ShellArgumentArrowUp(void);
42 void F_ShellArgumentArrowDown(void);
43 void F_ShellArgumentArrowLeft(void);
44 void F_ShellArgumentArrowRight(void);
45 void F_ShellDump(void);
46 
48  ArgumentCtrl.Put=0;
49  ArgumentCtrl.Index=0;
50  ArgumentCtrl.Insert=FALSE;
51  ArgumentCtrl.Argc=0;
52  ArgumentCtrl.Status=0;
53  ArgumentCtrl.HasInput=FALSE;
54  ArgumentCtrl.State=ArgumentRxState;
55 }
56 void F_ShellArgumentSvc(void){
57  unsigned char Data;
58 
59  switch(ArgumentCtrl.State){
60  case ArgumentIdleState:
61  break;
62  case ArgumentRxState:
64  Data=F_Uart0RxBufferGet();
65  #if(DEBUG_SHELL_KEY==1)
66  //printf("\n key=%2x [%1c]",Data,Data);
67  #endif
68  // process special keys
69  if(Data==ASCII_ESC){
70  ArgumentCtrl.Status=0;
71  ArgumentCtrl.Status=MeetEscKey;
72  return;
73  }
74  else if(ArgumentCtrl.Status==MeetEscKey){
75  if(Data==0x5b){
76  ArgumentCtrl.Status=HasEscXkey;
77  return;
78  }
79  else{
80  ArgumentCtrl.Status=0; // meet single esc key, not a special key
81  }
82  }
83  else if(ArgumentCtrl.Status==HasEscXkey){
84  switch(Data){
85  case KEY_HOME:
87  ArgumentCtrl.Status=0;
88  return;
89  case KEY_END:
91  ArgumentCtrl.Status=0;
92  return;
93  case KEY_PAGE_UP:
95  ArgumentCtrl.Status=0;
96  return;
97  case KEY_PAGE_DOWN:
98  ArgumentCtrl.Status=HasPageDown;
99  return;
100  case KEY_LEFT_ARROW:
102  ArgumentCtrl.Status=0;
103  return;
104  case KEY_RIGHT_ARROW:
106  ArgumentCtrl.Status=0;
107  return;
108  case KEY_UP_ARROW:
110  ArgumentCtrl.Status=0;
111  return;
112  case KEY_DOWN_ARROW:
114  ArgumentCtrl.Status=0;
115  return;
116  default:
117  ArgumentCtrl.Status=0;
118  return; // skip this code no matter what it is
119  }
120  //ArgumentCtrl.Status=0;
121  }
122  else if(ArgumentCtrl.Status==HasPageDown){
123  if(Data==0x4a){
125  ArgumentCtrl.Status=0;
126  return;
127  }
128  ArgumentCtrl.Status=0;
129  }
130  switch(Data){
131  case ASCII_NUL: // ^@
132  break;
133  case ASCII_SOH: // ^A
134  break;
135  case ASCII_STX: // ^B
136  break;
137  case ASCII_ETX: // ^C
138  break;
139  case ASCII_EOT: // ^D
140  break;
141  case ASCII_ENQ: // ^E
142  break;
143  case ASCII_ACK: // ^F
144  break;
145  case ASCII_BEL: // ^G
146  break;
147  case ASCII_BS: // ^H
149  break;
150  case ASCII_HT: // ^I
151  break;
152  case ASCII_LF: // ^J
153  break;
154  case ASCII_VT: // ^K
155  break;
156  case ASCII_FF: // ^L
157  break;
158  case ASCII_CR: // ^M
159  F_ShellArgumentKeyPut(Data);
161  //ArgumentCtrl.Index=0;
162  //ArgumentCtrl.Put=0;
163  break;
164  case ASCII_SO: // ^N
165  break;
166  case ASCII_SI: // ^O
167  break;
168  case ASCII_DLE: // ^P
169  break;
170  case ASCII_DC1: // ^Q
171  break;
172  case ASCII_DC2: // ^R
173  break;
174  case ASCII_DC3: // ^S
175  break;
176  case ASCII_DC4: // ^T
177  break;
178  case ASCII_NAK: // ^U
179  break;
180  case ASCII_SYN: // ^V
181  break;
182  case ASCII_ETB: // ^W
183  break;
184  case ASCII_CAN: // ^X
185  break;
186  case ASCII_EM: // ^Y
187  break;
188  case ASCII_SUB: // ^Z
189  break;
190  //case ASCII_ESC: // ^[
191  // break;
192  case ASCII_FS: // ^\
193  break;
194  case ASCII_GS: // ^]
195  break;
196  case ASCII_RS: // ^^
197  break;
198  case ASCII_US: // ^_
199  break;
200  case ASCII_DEL: //
202  break;
203  default:
204  if((Data>=0x20)&&(Data<=0x7e)){
205  F_ShellArgumentKeyPut(Data);
206  }
207  break;
208  }
209  //F_ShellDump();
210  }
211 }
212 
213 #define ArgumentSearchState 0
214 #define ArgumentGoThroughState 1
215 #define ArgumentDoneState 2
217  unsigned char Index;
218  unsigned char State;
219  unsigned char Status;
220  //unsigned char i;
221  //unsigned char **ppArgv;
222 
223  Index=0;
224  Status=0;
225  ArgumentCtrl.Argc=0;
226  State=ArgumentSearchState;
227  while(1){
228  switch(State){
229  case ArgumentSearchState:
230  if(ArgumentCtrl.Data[Index]==0x20){;} // " "
231  else if(ArgumentCtrl.Data[Index]==0x0d){ // enter key
232  ArgumentCtrl.Data[Index]=0;
233  ArgumentCtrl.Data[Index+1]=0x0d;
234  State=ArgumentDoneState;
235  }
236  else{
237  ArgumentCtrl.pArgv[ArgumentCtrl.Argc]=&ArgumentCtrl.Data[Index];
238  ArgumentCtrl.Argc++;
240  }
241  break;
243  if(ArgumentCtrl.Data[Index]==0x0d){
244  ArgumentCtrl.Data[Index]=0;
245  ArgumentCtrl.Data[Index+1]=0x0d;
246  State=ArgumentDoneState;
247  }
248  else if(ArgumentCtrl.Data[Index]==0x20){
249  ArgumentCtrl.Data[Index]=0;
250  State=ArgumentSearchState;
251  }
252  break;
253  case ArgumentDoneState:
254  if(ArgumentCtrl.Put==250){ // too many input
256  return;
257  }
258  ArgumentCtrl.HasInput=TRUE;
259  //F_ShellDump();
260  #if(DEBUG_SHELL_DONE==1)
261  ppArgv=(unsigned char **)ArgumentCtrl.pArgv;
262  printf("\nArgc %x",ArgumentCtrl.Argc);
263  for(i=0;i<ArgumentCtrl.Argc;i++){
264  printf("\n %s",ArgumentCtrl.pArgv[i]);
265  //printf("\n %s",*ppArgv++);
266  }
267  printf("\n");
268  #endif
269  return;
270  //if(ArgumentCtrl.Argc!=0) F_ShellArgumentExecute(&ArgumentCtrl.pArgv,ArgumentCtrl.Argc);
271  //break;
272  }
273  Index++;
274  }
275 }
277  if(ArgumentCtrl.HasInput==TRUE) return TRUE;
278  else return FALSE;
279 }
280 //void F_ShellExecute(unsigned char **Argv,unsigned char Argc){
281 void F_ShellArgumentExecute(unsigned char **Argv,unsigned char Argc){
282 
283 }
285  ArgumentCtrl.Index=0;
286  ArgumentCtrl.Put=0;
287  ArgumentCtrl.Argc=0;
288  ArgumentCtrl.HasInput=FALSE;
289 }
290 void F_ShellArgumentBs(void){
291  unsigned char i;
292  #if(DEBUG_SHELL_KEY==1)
293  printf("\n key_bs");
294  #endif
295  if(ArgumentCtrl.Put==ArgumentCtrl.Index){
296  if(ArgumentCtrl.Put==0){;}
297  else{
298  ArgumentCtrl.Put--;
299  ArgumentCtrl.Index--;
300  }
301  }
302  else{
303  if(ArgumentCtrl.Index==0){;}
304  else{
305  ArgumentCtrl.Index--;
306  ArgumentCtrl.Put--;
307  i=ArgumentCtrl.Index;
308  for(;i<=ArgumentCtrl.Put;i++){
309  ArgumentCtrl.Data[i]=ArgumentCtrl.Data[i+1];
310  }
311  }
312  }
313 }
314 void F_ShellArgumentDel(void){
315  unsigned char i;
316  #if(DEBUG_SHELL_KEY==1)
317  printf("\n key_del");
318  #endif
319  if(ArgumentCtrl.Put==ArgumentCtrl.Index){;} // nothing to delete
320  else{ // xxxxyyyy -> xxxyyyy
321  ArgumentCtrl.Put--;
322  i=ArgumentCtrl.Index;
323  for(;i<=ArgumentCtrl.Put;i++){
324  ArgumentCtrl.Data[i]=ArgumentCtrl.Data[i+1];
325  }
326  }
327 }
328 void F_ShellArgumentKeyPut(unsigned char Data){
329  unsigned char i;
330 
331  #if(DEBUG_SHELL_KEY==1)
332  printf("\n key=%2x [%c]",Data,Data);
333  #endif
334  if(ArgumentCtrl.Put==ArgumentCtrl.Index){
335  ArgumentCtrl.Data[ArgumentCtrl.Index]=Data;
336  if(ArgumentCtrl.Put<250){
337  ArgumentCtrl.Put++;
338  ArgumentCtrl.Index++;
339  }
340  }
341  else{
342  if(Data==0x0d){
343  ArgumentCtrl.Data[ArgumentCtrl.Put]=Data;
344  }
345  else{
346  if(ArgumentCtrl.Insert==TRUE){
347  i=ArgumentCtrl.Put;
348  for(;i>=ArgumentCtrl.Index;i--){
349  ArgumentCtrl.Data[i+1]=ArgumentCtrl.Data[i];
350  }
351  ArgumentCtrl.Data[ArgumentCtrl.Index]=Data;
352  if(ArgumentCtrl.Put<250) ArgumentCtrl.Put++;
353  ArgumentCtrl.Index++;
354  }
355  else{
356  ArgumentCtrl.Data[ArgumentCtrl.Index]=Data;
357  ArgumentCtrl.Index++;
358  }
359  }
360  }
361 }
362 void F_ShellArgumentIns(void){
363  #if(DEBUG_SHELL_KEY==1)
364  printf("\n key_ins");
365  #endif
366  //if(ArgumentCtrl.Insert==TRUE) ArgumentCtrl.Insert=FALSE;
367  //else ArgumentCtrl.Insert=TRUE;
368 }
370  #if(DEBUG_SHELL_KEY==1)
371  printf("\n key_home");
372  #endif
373  ArgumentCtrl.Index=0;
374 }
375 void F_ShellArgumentEnd(void){
376  #if(DEBUG_SHELL_KEY==1)
377  printf("\n key_end");
378  #endif
379  ArgumentCtrl.Index=ArgumentCtrl.Put;
380 }
382  #if(DEBUG_SHELL_KEY==1)
383  printf("\n key_page_up");
384  #endif
385 }
387  #if(DEBUG_SHELL_KEY==1)
388  printf("\n key_page_down");
389  #endif
390 }
392  #if(DEBUG_SHELL_KEY==1)
393  printf("\n key_arrow_up");
394  #endif
395 }
397  #if(DEBUG_SHELL_KEY==1)
398  printf("\n key_arrow_down");
399  #endif
400 }
402  #if(DEBUG_SHELL_KEY==1)
403  printf("\n key_arrow_left");
404  #endif
405  if(ArgumentCtrl.Index==0){;}
406  else{
407  ArgumentCtrl.Index--;
408  }
409 }
411  #if(DEBUG_SHELL_KEY==1)
412  printf("\n key_arrow_right");
413  #endif
414  if(ArgumentCtrl.Index==ArgumentCtrl.Put){;}
415  else{
416  if(ArgumentCtrl.Index<ArgumentCtrl.Put) ArgumentCtrl.Index++;
417  }
418 }
419 void F_ShellDump(void){
420  #if(DEBUG_SHELL_DUMP==1)
421  unsigned char i;
422 
423  printf("\n Put %2x Index %2x String:",ArgumentCtrl.Put,ArgumentCtrl.Index);
424  for(i=0;i<ArgumentCtrl.Put;i++) printf("%c",ArgumentCtrl.Data[i]);
425  #endif
426 }