Code for autonomous ground vehicle, Data Bus, 3rd place winner in 2012 Sparkfun AVC.

Dependencies:   Watchdog mbed Schedule SimpleFilter LSM303DLM PinDetect DebounceIn Servo

Committer:
shimniok
Date:
Wed Jun 20 14:57:48 2012 +0000
Revision:
0:826c6171fc1b
Updated documentation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shimniok 0:826c6171fc1b 1 #include <stdio.h>
shimniok 0:826c6171fc1b 2 #include "mbed.h"
shimniok 0:826c6171fc1b 3 #include "stdint.h"
shimniok 0:826c6171fc1b 4 #include "DirHandle.h"
shimniok 0:826c6171fc1b 5 #include "SDHCFileSystem.h"
shimniok 0:826c6171fc1b 6 #include "util.h"
shimniok 0:826c6171fc1b 7 #include "Buttons.h"
shimniok 0:826c6171fc1b 8
shimniok 0:826c6171fc1b 9 extern SDFileSystem sd;
shimniok 0:826c6171fc1b 10 extern Serial pc;
shimniok 0:826c6171fc1b 11 extern Buttons keypad;
shimniok 0:826c6171fc1b 12
shimniok 0:826c6171fc1b 13 char cwd[64];
shimniok 0:826c6171fc1b 14 char buf[128];
shimniok 0:826c6171fc1b 15 bool debug=false;
shimniok 0:826c6171fc1b 16
shimniok 0:826c6171fc1b 17 void shell(void);
shimniok 0:826c6171fc1b 18 void termInput(char *cmd);
shimniok 0:826c6171fc1b 19 void resolveDirectory(char *newpath, char *path);
shimniok 0:826c6171fc1b 20 void splitName(char *path, char *dirname, char *basename);
shimniok 0:826c6171fc1b 21 void ls(char *path);
shimniok 0:826c6171fc1b 22 void cd(char *path);
shimniok 0:826c6171fc1b 23 void pwd(void);
shimniok 0:826c6171fc1b 24 void touch(char *path);
shimniok 0:826c6171fc1b 25 void head(char *path);
shimniok 0:826c6171fc1b 26 void cat(char *path);
shimniok 0:826c6171fc1b 27 void send(char *path);
shimniok 0:826c6171fc1b 28
shimniok 0:826c6171fc1b 29 void shell() {
shimniok 0:826c6171fc1b 30 FILE *fp;
shimniok 0:826c6171fc1b 31 char newpath[64], *arg, cmd[64], cmdline[64];
shimniok 0:826c6171fc1b 32 bool done=false;
shimniok 0:826c6171fc1b 33
shimniok 0:826c6171fc1b 34 //Logger.SelectCRCMode(1);
shimniok 0:826c6171fc1b 35
shimniok 0:826c6171fc1b 36 //pc.printf("Formatting...\n");
shimniok 0:826c6171fc1b 37 //int i = Logger.format(32);
shimniok 0:826c6171fc1b 38 //pc.printf("format result: %d\n", i);
shimniok 0:826c6171fc1b 39
shimniok 0:826c6171fc1b 40 if ((fp = fopen("/log/message.txt", "w")) != NULL) {
shimniok 0:826c6171fc1b 41 for (int i=0; i < 20; i++)
shimniok 0:826c6171fc1b 42 fprintf(fp, "Hello, World!\n");
shimniok 0:826c6171fc1b 43 fclose(fp);
shimniok 0:826c6171fc1b 44 //pc.printf("created!\n");
shimniok 0:826c6171fc1b 45 } else {
shimniok 0:826c6171fc1b 46 pc.printf("Error creating file\n");
shimniok 0:826c6171fc1b 47 }
shimniok 0:826c6171fc1b 48 pc.printf("\n");
shimniok 0:826c6171fc1b 49
shimniok 0:826c6171fc1b 50 strcpy(cwd, "/log");
shimniok 0:826c6171fc1b 51
shimniok 0:826c6171fc1b 52 while (!done) {
shimniok 0:826c6171fc1b 53 termInput(cmdline);
shimniok 0:826c6171fc1b 54 arg = split(cmd, cmdline, 64, ' ');
shimniok 0:826c6171fc1b 55 resolveDirectory(newpath, arg);
shimniok 0:826c6171fc1b 56
shimniok 0:826c6171fc1b 57 if (keypad.pressed) {
shimniok 0:826c6171fc1b 58 keypad.pressed = false;
shimniok 0:826c6171fc1b 59 break;
shimniok 0:826c6171fc1b 60 }
shimniok 0:826c6171fc1b 61
shimniok 0:826c6171fc1b 62 if (debug) pc.printf("cmdline:<%s> cmd:<%s> arg:<%s> newpath:<%s>\n", cmdline, cmd, arg, newpath);
shimniok 0:826c6171fc1b 63
shimniok 0:826c6171fc1b 64 if (!strcmp(cmd, "ls")) {
shimniok 0:826c6171fc1b 65 ls(newpath);
shimniok 0:826c6171fc1b 66 } else if (!strcmp(cmd, "cd")) {
shimniok 0:826c6171fc1b 67 cd(newpath);
shimniok 0:826c6171fc1b 68 } else if (!strcmp(cmd, "pwd")) {
shimniok 0:826c6171fc1b 69 pwd();
shimniok 0:826c6171fc1b 70 } else if (!strcmp(cmd, "head")) {
shimniok 0:826c6171fc1b 71 head(newpath);
shimniok 0:826c6171fc1b 72 } else if (!strcmp(cmd, "cat")) {
shimniok 0:826c6171fc1b 73 cat(newpath);
shimniok 0:826c6171fc1b 74 } else if (!strcmp(cmd, "send")) {
shimniok 0:826c6171fc1b 75 send(newpath);
shimniok 0:826c6171fc1b 76 } else if (!strcmp(cmd, "mkdir")) {
shimniok 0:826c6171fc1b 77 mkdir(newpath, 1023);
shimniok 0:826c6171fc1b 78 } else if (!strcmp(cmd, "debug")) {
shimniok 0:826c6171fc1b 79 debug = !debug;
shimniok 0:826c6171fc1b 80 } else if (!strcmp(cmd, "touch")) {
shimniok 0:826c6171fc1b 81 touch(newpath);
shimniok 0:826c6171fc1b 82 } else if (!strcmp(cmd, "rm")) {
shimniok 0:826c6171fc1b 83 remove(newpath);
shimniok 0:826c6171fc1b 84 } else if (!strcmp(cmd, "exit")) {
shimniok 0:826c6171fc1b 85 done = true;
shimniok 0:826c6171fc1b 86 } else if (cmd[0] == '\0') {
shimniok 0:826c6171fc1b 87 // ignore
shimniok 0:826c6171fc1b 88 } else {
shimniok 0:826c6171fc1b 89 pc.printf("%s: command not found\n", cmd);
shimniok 0:826c6171fc1b 90 }
shimniok 0:826c6171fc1b 91 }
shimniok 0:826c6171fc1b 92
shimniok 0:826c6171fc1b 93 /*
shimniok 0:826c6171fc1b 94 pc.printf("Printing splitName()\n");
shimniok 0:826c6171fc1b 95 splitName("/SDCard/testdir", dirname, basename);
shimniok 0:826c6171fc1b 96 pc.printf("%s %s\n", dirname, basename);
shimniok 0:826c6171fc1b 97
shimniok 0:826c6171fc1b 98 pc.printf("Printing resolveDirectory()\n");
shimniok 0:826c6171fc1b 99 resolveDirectory(newpath, "test");
shimniok 0:826c6171fc1b 100 pc.printf("%s\n", newpath);
shimniok 0:826c6171fc1b 101 */
shimniok 0:826c6171fc1b 102
shimniok 0:826c6171fc1b 103 // remove("/SDCard/testdir/TEST.txt");
shimniok 0:826c6171fc1b 104
shimniok 0:826c6171fc1b 105 /*
shimniok 0:826c6171fc1b 106 int test = rename("/SDCard/message.txt", "/SDCard/message2.txt");
shimniok 0:826c6171fc1b 107 fp = fopen("/SDCard/message.txt", "a");
shimniok 0:826c6171fc1b 108 fprintf(fp, " Result = %d", test);
shimniok 0:826c6171fc1b 109 fclose(fp);
shimniok 0:826c6171fc1b 110 */
shimniok 0:826c6171fc1b 111
shimniok 0:826c6171fc1b 112 pc.printf ("exiting shell\n");
shimniok 0:826c6171fc1b 113
shimniok 0:826c6171fc1b 114 return;
shimniok 0:826c6171fc1b 115 }
shimniok 0:826c6171fc1b 116
shimniok 0:826c6171fc1b 117
shimniok 0:826c6171fc1b 118 /** termInput
shimniok 0:826c6171fc1b 119 *
shimniok 0:826c6171fc1b 120 */
shimniok 0:826c6171fc1b 121 void termInput(char *cmd) {
shimniok 0:826c6171fc1b 122 int i=0;
shimniok 0:826c6171fc1b 123 char c;
shimniok 0:826c6171fc1b 124 bool done = false;
shimniok 0:826c6171fc1b 125
shimniok 0:826c6171fc1b 126 memset(cmd, 0, 64);
shimniok 0:826c6171fc1b 127
shimniok 0:826c6171fc1b 128 pc.printf("# ", cwd);
shimniok 0:826c6171fc1b 129 do {
shimniok 0:826c6171fc1b 130 cmd[i] = 0;
shimniok 0:826c6171fc1b 131 c = pc.getc();
shimniok 0:826c6171fc1b 132 if (c == '\r') { // if return is hit, we're done, don't add \r to cmd
shimniok 0:826c6171fc1b 133 done = true;
shimniok 0:826c6171fc1b 134 } else if (i < 64-1) {
shimniok 0:826c6171fc1b 135 if (c == 0x7f || c == '\b') { // backspace or delete
shimniok 0:826c6171fc1b 136 if (i > 0) { // if we're at the beginning, do nothing
shimniok 0:826c6171fc1b 137 i--;
shimniok 0:826c6171fc1b 138 pc.printf("\b \b");
shimniok 0:826c6171fc1b 139 }
shimniok 0:826c6171fc1b 140 } else {
shimniok 0:826c6171fc1b 141 pc.printf("%c", c);
shimniok 0:826c6171fc1b 142 cmd[i++] = c;
shimniok 0:826c6171fc1b 143 }
shimniok 0:826c6171fc1b 144 }
shimniok 0:826c6171fc1b 145 } while (!done);
shimniok 0:826c6171fc1b 146 pc.printf("\n");
shimniok 0:826c6171fc1b 147 }
shimniok 0:826c6171fc1b 148
shimniok 0:826c6171fc1b 149 /** resolveDirectory
shimniok 0:826c6171fc1b 150 * resolve the directory path provided, given the cwd
shimniok 0:826c6171fc1b 151 */
shimniok 0:826c6171fc1b 152 void resolveDirectory(char *newpath, char *path) {
shimniok 0:826c6171fc1b 153 char dirname[32], basename[16];
shimniok 0:826c6171fc1b 154
shimniok 0:826c6171fc1b 155 /** absolute path */
shimniok 0:826c6171fc1b 156 if (path[0] == '/') {
shimniok 0:826c6171fc1b 157 strcpy(newpath, path);
shimniok 0:826c6171fc1b 158 }
shimniok 0:826c6171fc1b 159 /** relative path */
shimniok 0:826c6171fc1b 160 else {
shimniok 0:826c6171fc1b 161 strcpy(newpath, cwd);
shimniok 0:826c6171fc1b 162 if (path[0] != 0) {
shimniok 0:826c6171fc1b 163 if (newpath[strlen(newpath)-1] != '/')
shimniok 0:826c6171fc1b 164 strcat(newpath, "/");
shimniok 0:826c6171fc1b 165 strcat(newpath, path);
shimniok 0:826c6171fc1b 166 }
shimniok 0:826c6171fc1b 167 /** Resolve .. references */
shimniok 0:826c6171fc1b 168 splitName(newpath, dirname, basename);
shimniok 0:826c6171fc1b 169 if (!strcmp(basename, "..")) {
shimniok 0:826c6171fc1b 170 splitName(dirname, newpath, basename);
shimniok 0:826c6171fc1b 171 }
shimniok 0:826c6171fc1b 172 }
shimniok 0:826c6171fc1b 173 }
shimniok 0:826c6171fc1b 174
shimniok 0:826c6171fc1b 175 // copy t to s until space is reached
shimniok 0:826c6171fc1b 176 // return location of delimiter+1 in t
shimniok 0:826c6171fc1b 177 // if space not found, return t pointing to end of string
shimniok 0:826c6171fc1b 178 // if s or t null, return null
shimniok 0:826c6171fc1b 179 char *splitCmd(char *s, char *t, int max)
shimniok 0:826c6171fc1b 180 {
shimniok 0:826c6171fc1b 181 int i = 0;
shimniok 0:826c6171fc1b 182
shimniok 0:826c6171fc1b 183 if (s == 0 || t == 0)
shimniok 0:826c6171fc1b 184 return 0;
shimniok 0:826c6171fc1b 185
shimniok 0:826c6171fc1b 186 while (*t != 0 && i < max) {
shimniok 0:826c6171fc1b 187 *s++ = *t++;
shimniok 0:826c6171fc1b 188 i++;
shimniok 0:826c6171fc1b 189 if (*t == ' ') {
shimniok 0:826c6171fc1b 190 t++;
shimniok 0:826c6171fc1b 191 break;
shimniok 0:826c6171fc1b 192 }
shimniok 0:826c6171fc1b 193 }
shimniok 0:826c6171fc1b 194 *s = 0;
shimniok 0:826c6171fc1b 195
shimniok 0:826c6171fc1b 196 return t;
shimniok 0:826c6171fc1b 197 }
shimniok 0:826c6171fc1b 198
shimniok 0:826c6171fc1b 199 /** splitName
shimniok 0:826c6171fc1b 200 * split the path into a dirname and a
shimniok 0:826c6171fc1b 201 */
shimniok 0:826c6171fc1b 202 void splitName(char *path, char *dirname, char *basename) {
shimniok 0:826c6171fc1b 203 int sep;
shimniok 0:826c6171fc1b 204
shimniok 0:826c6171fc1b 205 sep = 0;
shimniok 0:826c6171fc1b 206 if (debug) pc.printf("%d\n", strlen(path));
shimniok 0:826c6171fc1b 207 for (int i=strlen(path)-1; i >= 0; i--) {
shimniok 0:826c6171fc1b 208 if (debug) pc.printf("- %c\n", path[i]);
shimniok 0:826c6171fc1b 209 sep = i;
shimniok 0:826c6171fc1b 210 if (path[i] == '/') break;
shimniok 0:826c6171fc1b 211 }
shimniok 0:826c6171fc1b 212 for (int j=0; j < sep; j++) {
shimniok 0:826c6171fc1b 213 if (debug) pc.printf("> %c\n", path[j]);
shimniok 0:826c6171fc1b 214 dirname[j] = path[j];
shimniok 0:826c6171fc1b 215 dirname[j+1] = 0;
shimniok 0:826c6171fc1b 216 }
shimniok 0:826c6171fc1b 217 for (int k=sep+1; k < strlen(path); k++) {
shimniok 0:826c6171fc1b 218 if (debug) pc.printf("* %c\n", path[k]);
shimniok 0:826c6171fc1b 219 basename[k-(sep+1)] = path[k];
shimniok 0:826c6171fc1b 220 basename[k-sep] = 0;
shimniok 0:826c6171fc1b 221 }
shimniok 0:826c6171fc1b 222 if (debug) pc.printf("d:<%s> b:<%s>\n", dirname, basename);
shimniok 0:826c6171fc1b 223 }
shimniok 0:826c6171fc1b 224
shimniok 0:826c6171fc1b 225 /** ls
shimniok 0:826c6171fc1b 226 * lists files in the current working directory, 4 columns
shimniok 0:826c6171fc1b 227 */
shimniok 0:826c6171fc1b 228 void ls(char *path) {
shimniok 0:826c6171fc1b 229 if (debug) pc.printf("%s\n", cwd);
shimniok 0:826c6171fc1b 230 DIR *d;
shimniok 0:826c6171fc1b 231 struct dirent *p;
shimniok 0:826c6171fc1b 232
shimniok 0:826c6171fc1b 233 int count=0;
shimniok 0:826c6171fc1b 234 if ((d = opendir(path)) != NULL) {
shimniok 0:826c6171fc1b 235 while ((p = readdir(d)) != NULL) {
shimniok 0:826c6171fc1b 236 pc.printf("%12s", p->d_name);
shimniok 0:826c6171fc1b 237 if (count++ >= 3) {
shimniok 0:826c6171fc1b 238 count = 0;
shimniok 0:826c6171fc1b 239 pc.printf("\n");
shimniok 0:826c6171fc1b 240 }
shimniok 0:826c6171fc1b 241 }
shimniok 0:826c6171fc1b 242 pc.printf("\n");
shimniok 0:826c6171fc1b 243 if (count < 3)
shimniok 0:826c6171fc1b 244 pc.printf("\n");
shimniok 0:826c6171fc1b 245 closedir(d);
shimniok 0:826c6171fc1b 246 } else {
shimniok 0:826c6171fc1b 247 pc.printf("%s: No such directory\n", path);
shimniok 0:826c6171fc1b 248 }
shimniok 0:826c6171fc1b 249 }
shimniok 0:826c6171fc1b 250
shimniok 0:826c6171fc1b 251 /** cd
shimniok 0:826c6171fc1b 252 * changes current working directory
shimniok 0:826c6171fc1b 253 */
shimniok 0:826c6171fc1b 254 void cd(char *path) {
shimniok 0:826c6171fc1b 255 strcpy(cwd, path);
shimniok 0:826c6171fc1b 256 }
shimniok 0:826c6171fc1b 257
shimniok 0:826c6171fc1b 258 /** pwd
shimniok 0:826c6171fc1b 259 * print current working directory
shimniok 0:826c6171fc1b 260 */
shimniok 0:826c6171fc1b 261 void pwd() {
shimniok 0:826c6171fc1b 262 pc.printf("%s\n", cwd);
shimniok 0:826c6171fc1b 263 }
shimniok 0:826c6171fc1b 264
shimniok 0:826c6171fc1b 265 /** touch
shimniok 0:826c6171fc1b 266 * create an empty file
shimniok 0:826c6171fc1b 267 */
shimniok 0:826c6171fc1b 268 void touch(char *path) {
shimniok 0:826c6171fc1b 269 FILE *fp;
shimniok 0:826c6171fc1b 270 if ((fp = fopen(path, "w")) != NULL) {
shimniok 0:826c6171fc1b 271 fclose(fp);
shimniok 0:826c6171fc1b 272 } else {
shimniok 0:826c6171fc1b 273 pc.printf("%s: No such file\n", path);
shimniok 0:826c6171fc1b 274 }
shimniok 0:826c6171fc1b 275 }
shimniok 0:826c6171fc1b 276
shimniok 0:826c6171fc1b 277 /** head
shimniok 0:826c6171fc1b 278 * print the first 10 lines of a file
shimniok 0:826c6171fc1b 279 */
shimniok 0:826c6171fc1b 280 void head(char *path) {
shimniok 0:826c6171fc1b 281 FILE *fp;
shimniok 0:826c6171fc1b 282 char line = 0;
shimniok 0:826c6171fc1b 283
shimniok 0:826c6171fc1b 284 if ((fp = fopen(path, "r")) != NULL) {
shimniok 0:826c6171fc1b 285 while (!feof(fp) && line++ < 10) {
shimniok 0:826c6171fc1b 286 fgets(buf, 128, fp);
shimniok 0:826c6171fc1b 287 pc.printf("%s", buf);
shimniok 0:826c6171fc1b 288 }
shimniok 0:826c6171fc1b 289 fclose(fp);
shimniok 0:826c6171fc1b 290 } else {
shimniok 0:826c6171fc1b 291 pc.printf("%s: No such file\n", path);
shimniok 0:826c6171fc1b 292 }
shimniok 0:826c6171fc1b 293 }
shimniok 0:826c6171fc1b 294
shimniok 0:826c6171fc1b 295 /** cat
shimniok 0:826c6171fc1b 296 * display the content of a file
shimniok 0:826c6171fc1b 297 */
shimniok 0:826c6171fc1b 298 void cat(char *path) {
shimniok 0:826c6171fc1b 299 FILE *fp;
shimniok 0:826c6171fc1b 300
shimniok 0:826c6171fc1b 301 if ((fp = fopen(path, "r")) != NULL) {
shimniok 0:826c6171fc1b 302 while (!feof(fp)) {
shimniok 0:826c6171fc1b 303 if (fgets(buf, 127, fp) != NULL)
shimniok 0:826c6171fc1b 304 pc.printf("%s", buf);
shimniok 0:826c6171fc1b 305 }
shimniok 0:826c6171fc1b 306 fclose(fp);
shimniok 0:826c6171fc1b 307 } else {
shimniok 0:826c6171fc1b 308 pc.printf("%s: No such file\n", path);
shimniok 0:826c6171fc1b 309 }
shimniok 0:826c6171fc1b 310 }
shimniok 0:826c6171fc1b 311
shimniok 0:826c6171fc1b 312 /** send
shimniok 0:826c6171fc1b 313 * Simple serial file transfer protocol
shimniok 0:826c6171fc1b 314 * Initiates escape sequence: ^A^B, sends filename, ^C, and then file
shimniok 0:826c6171fc1b 315 * contents followed by ^D
shimniok 0:826c6171fc1b 316 */
shimniok 0:826c6171fc1b 317 void send(char *path) {
shimniok 0:826c6171fc1b 318 FILE *fp;
shimniok 0:826c6171fc1b 319 char dirname[32], basename[16];
shimniok 0:826c6171fc1b 320
shimniok 0:826c6171fc1b 321 if ((fp = fopen(path, "r")) != NULL) {
shimniok 0:826c6171fc1b 322 splitName(path, dirname, basename);
shimniok 0:826c6171fc1b 323 pc.printf("%c%c%s%c", 1, 2, basename, 3);
shimniok 0:826c6171fc1b 324 while (!feof(fp)) {
shimniok 0:826c6171fc1b 325 if (fgets(buf, 127, fp) != NULL)
shimniok 0:826c6171fc1b 326 pc.printf("%s", buf);
shimniok 0:826c6171fc1b 327 }
shimniok 0:826c6171fc1b 328 fclose(fp);
shimniok 0:826c6171fc1b 329 pc.printf("%c", 4);
shimniok 0:826c6171fc1b 330 } else {
shimniok 0:826c6171fc1b 331 pc.printf("%s: No such file\n", path);
shimniok 0:826c6171fc1b 332 }
shimniok 0:826c6171fc1b 333 }