-
Notifications
You must be signed in to change notification settings - Fork 1
/
cmd.c
51 lines (41 loc) · 1.18 KB
/
cmd.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <string.h>
#include "FreeRTOS.h"
#include "serial.h"
#include "cmd.h"
#define ISBLANK(x) ((x) == ' ' || (x) == '\t')
#define MAX_ARGS 8
int cmd_exec(int sern, const cmd_handler_t *handlers, char *cmd) {
/* parse command line */
while(ISBLANK(*cmd)) cmd++;
if(!*cmd) return -1;
char *start = cmd;
while(*cmd && !ISBLANK(*cmd)) cmd++;
if(*cmd) *(cmd++) = '\0';
const cmd_handler_t *hnd;
for(hnd = handlers; hnd->type != CMD_END; hnd++) {
if(strcmp(start, hnd->cmd) == 0) {
if(hnd->type == CMD_PROC) {
/* split args */
char *args[MAX_ARGS];
int cnt = 0;
while(ISBLANK(*cmd)) cmd++;
while(*cmd && cnt < MAX_ARGS) {
args[cnt++] = cmd;
while(*cmd && !ISBLANK(*cmd)) cmd++;
if(*cmd) *(cmd++) = '\0';
while(ISBLANK(*cmd)) cmd++;
}
if(hnd->h.proc != NULL) return hnd->h.proc(sern, cnt, args);
} else {
/* subcommand */
return cmd_exec(sern, hnd->h.sub, cmd);
}
}
}
serial_send_str(sern, "\r\nAvailable commands:\r\n", -1, portMAX_DELAY);
for(hnd = handlers; hnd->type != CMD_END; hnd++) {
serial_iprintf(sern, portMAX_DELAY, "%s\r\n", hnd->cmd);
}
serial_send_str(sern, "\r\n", -1, portMAX_DELAY);
return -1;
}