BOOTLOADER
Main Page
Data Structures
Files
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
bootloader
middleware
shell
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
26
ARGUMENT_CONTROL
ArgumentCtrl
;
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
47
void
F_ShellArgumentInit
(
void
){
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
:
63
if
(
F_Uart0RxBufferCheck
()==
UART0_BUFFER_EMPTY
)
return
;
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
:
86
F_ShellArgumentHome
();
87
ArgumentCtrl.
Status
=0;
88
return
;
89
case
KEY_END
:
90
F_ShellArgumentEnd
();
91
ArgumentCtrl.
Status
=0;
92
return
;
93
case
KEY_PAGE_UP
:
94
F_ShellArgumentPageUp
();
95
ArgumentCtrl.
Status
=0;
96
return
;
97
case
KEY_PAGE_DOWN
:
98
ArgumentCtrl.
Status
=
HasPageDown
;
99
return
;
100
case
KEY_LEFT_ARROW
:
101
F_ShellArgumentArrowLeft
();
102
ArgumentCtrl.
Status
=0;
103
return
;
104
case
KEY_RIGHT_ARROW
:
105
F_ShellArgumentArrowRight
();
106
ArgumentCtrl.
Status
=0;
107
return
;
108
case
KEY_UP_ARROW
:
109
F_ShellArgumentArrowUp
();
110
ArgumentCtrl.
Status
=0;
111
return
;
112
case
KEY_DOWN_ARROW
:
113
F_ShellArgumentArrowDown
();
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){
124
F_ShellArgumentPageDown
();
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
148
F_ShellArgumentBs
();
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);
160
F_ShellArgumentParser
();
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
:
//
201
F_ShellArgumentDel
();
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
216
void
F_ShellArgumentParser
(
void
){
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
++;
239
State=
ArgumentGoThroughState
;
240
}
241
break
;
242
case
ArgumentGoThroughState
:
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
255
F_ShellArgumentReset
();
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
}
276
INT8U
F_ShellArgumentCheck
(
void
){
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
}
284
void
F_ShellArgumentReset
(
void
){
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
}
369
void
F_ShellArgumentHome
(
void
){
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
}
381
void
F_ShellArgumentPageUp
(
void
){
382
#if(DEBUG_SHELL_KEY==1)
383
printf
(
"\n key_page_up"
);
384
#endif
385
}
386
void
F_ShellArgumentPageDown
(
void
){
387
#if(DEBUG_SHELL_KEY==1)
388
printf
(
"\n key_page_down"
);
389
#endif
390
}
391
void
F_ShellArgumentArrowUp
(
void
){
392
#if(DEBUG_SHELL_KEY==1)
393
printf
(
"\n key_arrow_up"
);
394
#endif
395
}
396
void
F_ShellArgumentArrowDown
(
void
){
397
#if(DEBUG_SHELL_KEY==1)
398
printf
(
"\n key_arrow_down"
);
399
#endif
400
}
401
void
F_ShellArgumentArrowLeft
(
void
){
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
}
410
void
F_ShellArgumentArrowRight
(
void
){
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
}
Generated on Wed Jun 13 2012 00:03:10 for BOOTLOADER by
1.8.1.1