Look for a LOGO (.LGO) file on the mbed and run the commands in it. Only supports a small subset of the LOGO commands.

Dependencies:   mbed

Committer:
nbbhav
Date:
Sat Apr 09 18:06:27 2011 +0000
Revision:
0:864f6ee5169b
Initial version supporting FORWARD, BACK, LEFT and RIGHT commands.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nbbhav 0:864f6ee5169b 1 /*
nbbhav 0:864f6ee5169b 2 * Main program, looks for LOGO file on robot and executes the commands
nbbhav 0:864f6ee5169b 3 * within it.
nbbhav 0:864f6ee5169b 4 */
nbbhav 0:864f6ee5169b 5
nbbhav 0:864f6ee5169b 6 #include "mbed.h"
nbbhav 0:864f6ee5169b 7 #include "m3pi.h"
nbbhav 0:864f6ee5169b 8
nbbhav 0:864f6ee5169b 9 #include "commands.h"
nbbhav 0:864f6ee5169b 10
nbbhav 0:864f6ee5169b 11 m3pi m3pi(p23,p9,p10);
nbbhav 0:864f6ee5169b 12 LocalFileSystem local("local");
nbbhav 0:864f6ee5169b 13
nbbhav 0:864f6ee5169b 14 FILE* open_last_lgo_file() {
nbbhav 0:864f6ee5169b 15 char* fn = NULL;
nbbhav 0:864f6ee5169b 16
nbbhav 0:864f6ee5169b 17 DIR *d = opendir("/local");
nbbhav 0:864f6ee5169b 18 for (struct dirent *p = readdir(d); p != NULL; p = readdir(d)) {
nbbhav 0:864f6ee5169b 19 const char* dot = strchr(p->d_name, '.');
nbbhav 0:864f6ee5169b 20 if (dot != NULL) {
nbbhav 0:864f6ee5169b 21 const char* ext = dot+1; // skip '.'
nbbhav 0:864f6ee5169b 22 if (strcmp(ext, "LGO") == 0) {
nbbhav 0:864f6ee5169b 23 m3pi.cls();
nbbhav 0:864f6ee5169b 24 m3pi.printf("Found");
nbbhav 0:864f6ee5169b 25 m3pi.locate(0,1);
nbbhav 0:864f6ee5169b 26 m3pi.printf("%.*s", 8, p->d_name);
nbbhav 0:864f6ee5169b 27
nbbhav 0:864f6ee5169b 28 // Save reference to the file. Treat the last file as the
nbbhav 0:864f6ee5169b 29 // most recent. This may or may not be correct!
nbbhav 0:864f6ee5169b 30 size_t fn_len = strlen("/local/") + strlen(p->d_name) + 0;
nbbhav 0:864f6ee5169b 31 fn = (char*)((fn != NULL) ? realloc(fn, fn_len) : malloc(fn_len));
nbbhav 0:864f6ee5169b 32 sprintf(fn, "/local/%s", p->d_name);
nbbhav 0:864f6ee5169b 33 }
nbbhav 0:864f6ee5169b 34 }
nbbhav 0:864f6ee5169b 35 }
nbbhav 0:864f6ee5169b 36 closedir(d);
nbbhav 0:864f6ee5169b 37
nbbhav 0:864f6ee5169b 38 FILE* f = NULL;
nbbhav 0:864f6ee5169b 39 if (fn != NULL) {
nbbhav 0:864f6ee5169b 40 f = fopen(fn, "r");
nbbhav 0:864f6ee5169b 41 free(fn);
nbbhav 0:864f6ee5169b 42 fn = NULL;
nbbhav 0:864f6ee5169b 43 wait(2.0);
nbbhav 0:864f6ee5169b 44 }
nbbhav 0:864f6ee5169b 45 return f;
nbbhav 0:864f6ee5169b 46 }
nbbhav 0:864f6ee5169b 47
nbbhav 0:864f6ee5169b 48 int main() {
nbbhav 0:864f6ee5169b 49 FILE* f = open_last_lgo_file();
nbbhav 0:864f6ee5169b 50 if (f != NULL) {
nbbhav 0:864f6ee5169b 51 int line = 1;
nbbhav 0:864f6ee5169b 52 char buf[256];
nbbhav 0:864f6ee5169b 53 while (!feof(f)) {
nbbhav 0:864f6ee5169b 54 const char* str = fgets(buf, sizeof(buf), f);
nbbhav 0:864f6ee5169b 55 if (str == NULL) {
nbbhav 0:864f6ee5169b 56 break;
nbbhav 0:864f6ee5169b 57 }
nbbhav 0:864f6ee5169b 58 int pos = 0;
nbbhav 0:864f6ee5169b 59 while (true) {
nbbhav 0:864f6ee5169b 60 Command* cmd = build_command(line, str, &pos);
nbbhav 0:864f6ee5169b 61 if (cmd != NULL) {
nbbhav 0:864f6ee5169b 62 m3pi.cls();
nbbhav 0:864f6ee5169b 63 m3pi.printf("%s", cmd->string());
nbbhav 0:864f6ee5169b 64 wait(2.0);
nbbhav 0:864f6ee5169b 65 cmd->go();
nbbhav 0:864f6ee5169b 66 destroy_command(cmd);
nbbhav 0:864f6ee5169b 67 } else
nbbhav 0:864f6ee5169b 68 break;
nbbhav 0:864f6ee5169b 69 }
nbbhav 0:864f6ee5169b 70 ++line;
nbbhav 0:864f6ee5169b 71 }
nbbhav 0:864f6ee5169b 72 fclose(f);
nbbhav 0:864f6ee5169b 73 m3pi.cls();
nbbhav 0:864f6ee5169b 74 m3pi.printf("Success");
nbbhav 0:864f6ee5169b 75 } else {
nbbhav 0:864f6ee5169b 76 m3pi.cls();
nbbhav 0:864f6ee5169b 77 m3pi.printf("NotFound");
nbbhav 0:864f6ee5169b 78 }
nbbhav 0:864f6ee5169b 79 }