X-Git-Url: https://robinkrens.nl/gitweb/?p=cortex-from-scratch;a=blobdiff_plain;f=term.c;h=51eb9cf38ed0da93e56d5c0d9ad5e9ead747cc19;hp=0628e1e86d1f3a488ab7b43bf7c4c947abd86f76;hb=094f4defd7ee3b672f9c690f57125893a64901c8;hpb=d35408aabe7ea757d406bf8a7dba669ee8736bd5 diff --git a/term.c b/term.c index 0628e1e..51eb9cf 100644 --- a/term.c +++ b/term.c @@ -6,10 +6,16 @@ #include #include +#include +#include + +#include #define SERIAL 1 #define BUFSIZE 200 - +#define MAXARGS 5 +#define WHITESPACE "\t\r\n " +#define BUILTINCMDS 3 int help(int, char**); @@ -26,27 +32,107 @@ static char buf[BUFSIZE]; struct cmd { char * name; - char * description; int (*function)(int argc, char ** argsv); }; -static struct cmd builtin[] = - { "info", "show info", help}; +struct cmd builtincmds[4]; int help(int argc, char ** argsv) { sysinfo(); return 0; } +int led(int argc, char ** argsv) { + + + if (argsv[1] != NULL) { + if (strcmp(argsv[1], "on")) { + cputs("LED ON\n"); + led_on(); + } + else if (strcmp(argsv[1], "off")) { + cputs("LED OFF\n"); + led_off(); + } + } + return 0; +} + +int show(int argc, char ** argsv) { + + if ((argsv[1] != NULL) && (strlen(argsv[1]) == 8)) { + + uint32_t * check = (uint32_t *) hextoreg(argsv[1]); + cputs("REGISTER 0x"); + cputs(argsv[1]); + cputs(" VALUE: "); + cputs(regtohex(*check)); + cputchar('\n'); + return 1; + + } + + return 0; +} + +int exec_cmd(char * buf) { + + int argc; + char *argv[MAXARGS]; + int i; + + // Parse the command buffer into whitespace-separated arguments + argc = 0; + argv[argc] = 0; + while (1) { + // gobble whitespace + while (*buf && strchr(WHITESPACE, *buf)) + *buf++ = 0; + if (*buf == 0) + break; + + // save and scan past next arg + if (argc == MAXARGS-1) { + cputs("Too many arguments"); + return 0; + } + argv[argc++] = buf; + while (*buf && !strchr(WHITESPACE, *buf)) + buf++; + } + argv[argc] = 0; + + // Lookup and invoke the command + if (argc == 0) + return 0; + for (i = 0; i < BUILTINCMDS; i++) { + if (strcmp(argv[0], builtincmds[i].name)) + return builtincmds[i].function(argc, argv); + } + cputs("Unknown command"); + return 0; + +} + void terminal() { - + + builtincmds[0].name = "help"; + builtincmds[0].function = help; + + builtincmds[1].name = "led"; + builtincmds[1].function = led; + + builtincmds[2].name = "show"; + builtincmds[2].function = show; + char *buf; - cputs("Terminal running!\n"); + cputs("WELCOME TO ROBSYS!\n"); while (1) { buf = readline("root# "); - /* if (buf != NULL) - if (runcmd(buf, tf) < 0) - break; */ + if (buf != NULL) + if (exec_cmd(buf) < 0) + break; } } +