Peter Cooper
/
Dome
Geodesic Light Dome Controller Program
cmd.c@1:dc58f0b0eeec, 2010-03-24 (annotated)
- Committer:
- lolpcc
- Date:
- Wed Mar 24 09:06:23 2010 +0000
- Revision:
- 1:dc58f0b0eeec
- Parent:
- 0:a7af7ec8b12f
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lolpcc | 0:a7af7ec8b12f | 1 | #include "mbed.h" |
lolpcc | 0:a7af7ec8b12f | 2 | #include "breakup.h" |
lolpcc | 0:a7af7ec8b12f | 3 | #include "useful.h" |
lolpcc | 0:a7af7ec8b12f | 4 | #include "i2c.h" |
lolpcc | 0:a7af7ec8b12f | 5 | #include "serial.h" |
lolpcc | 0:a7af7ec8b12f | 6 | #include "cmd.h" |
lolpcc | 0:a7af7ec8b12f | 7 | #include "local_defines.h" |
lolpcc | 0:a7af7ec8b12f | 8 | #include "scripting.h" |
lolpcc | 0:a7af7ec8b12f | 9 | |
lolpcc | 0:a7af7ec8b12f | 10 | |
lolpcc | 0:a7af7ec8b12f | 11 | LocalFileSystem local("local"); |
lolpcc | 0:a7af7ec8b12f | 12 | FILE *exec_fp; |
lolpcc | 0:a7af7ec8b12f | 13 | extern int sys_state; |
lolpcc | 0:a7af7ec8b12f | 14 | extern int var[MAX_VAR]; |
lolpcc | 0:a7af7ec8b12f | 15 | extern int jmp[MAX_JMP]; |
lolpcc | 0:a7af7ec8b12f | 16 | |
lolpcc | 0:a7af7ec8b12f | 17 | |
lolpcc | 0:a7af7ec8b12f | 18 | |
lolpcc | 0:a7af7ec8b12f | 19 | /******************************************/ |
lolpcc | 0:a7af7ec8b12f | 20 | /* */ |
lolpcc | 0:a7af7ec8b12f | 21 | /* Exec commands, for the dome */ |
lolpcc | 0:a7af7ec8b12f | 22 | /* */ |
lolpcc | 0:a7af7ec8b12f | 23 | /******************************************/ |
lolpcc | 0:a7af7ec8b12f | 24 | |
lolpcc | 0:a7af7ec8b12f | 25 | struct cmd_callback { |
lolpcc | 0:a7af7ec8b12f | 26 | char *label; /* command */ |
lolpcc | 0:a7af7ec8b12f | 27 | int cmd; /* switch value */ |
lolpcc | 0:a7af7ec8b12f | 28 | int args; /* Number of args for this command */ |
lolpcc | 0:a7af7ec8b12f | 29 | void (*cmd_routine)(int,char **); /* call */ |
lolpcc | 0:a7af7ec8b12f | 30 | }; |
lolpcc | 0:a7af7ec8b12f | 31 | struct cmd_callback cmd_cb[] ={ |
lolpcc | 0:a7af7ec8b12f | 32 | { "list", 0, 1, list}, /* List I2C Devices to user */ |
lolpcc | 0:a7af7ec8b12f | 33 | { "list2", 0, 1, list2}, /* List I2C Devices to user */ |
lolpcc | 0:a7af7ec8b12f | 34 | { "exec", 0, 2, exec_file}, /* Run a script file from the local file store */ |
lolpcc | 0:a7af7ec8b12f | 35 | { "dir", 0, 1, dir_file}, /* Get a directory listing from the local file store */ |
lolpcc | 1:dc58f0b0eeec | 36 | { "cat", 0, 2, cat_file}, /* Cat a file on the file system to the current output device */ |
lolpcc | 0:a7af7ec8b12f | 37 | { "relay", 0, 2, relay_control}, /* Switch a relay 0-8 */ |
lolpcc | 0:a7af7ec8b12f | 38 | { "light", 0, 3, light_control}, /* Set a light level on a channel */ |
lolpcc | 0:a7af7ec8b12f | 39 | { "wait", 0, 2, wait_control}, /* wait for X tenths of a second */ |
lolpcc | 0:a7af7ec8b12f | 40 | { "baud", 0, 2, baud_rate}, /* Set the baudrate of the serial I/O */ |
lolpcc | 0:a7af7ec8b12f | 41 | { "pca", 0, 2, init_pca}, /* Init a PCA9685 device from the command line */ |
lolpcc | 0:a7af7ec8b12f | 42 | { "print", 0, 0, print_string}, /* Print a string to current output device */ |
lolpcc | 0:a7af7ec8b12f | 43 | { "set", 0, 0, set_var}, /* Set the variable to a value */ |
lolpcc | 0:a7af7ec8b12f | 44 | { "sum", 0, 0, sum_var}, /* Add some basic maths */ |
lolpcc | 0:a7af7ec8b12f | 45 | { "point", 0, 0, point_var}, /* Set out loop point */ |
lolpcc | 0:a7af7ec8b12f | 46 | { "tst", 0, 0, tst_var}, /* test the value of a var */ |
lolpcc | 0:a7af7ec8b12f | 47 | { "clr", 0, 0, clr_var}, /* Clear the var's to zero */ |
lolpcc | 0:a7af7ec8b12f | 48 | { "END", -1, -1, error_handler} |
lolpcc | 0:a7af7ec8b12f | 49 | }; |
lolpcc | 0:a7af7ec8b12f | 50 | |
lolpcc | 0:a7af7ec8b12f | 51 | |
lolpcc | 0:a7af7ec8b12f | 52 | /* Scan down tags, to find the match, else return -1 */ |
lolpcc | 0:a7af7ec8b12f | 53 | int find_cmd(char *tag) |
lolpcc | 0:a7af7ec8b12f | 54 | { |
lolpcc | 0:a7af7ec8b12f | 55 | int cnt=0,c; |
lolpcc | 0:a7af7ec8b12f | 56 | int length=strlen(tag); |
lolpcc | 0:a7af7ec8b12f | 57 | char *elements[0x10]; |
lolpcc | 0:a7af7ec8b12f | 58 | |
lolpcc | 0:a7af7ec8b12f | 59 | if(tag[0]=='#') /* See is we have a command or a comment */ |
lolpcc | 0:a7af7ec8b12f | 60 | return(0); |
lolpcc | 0:a7af7ec8b12f | 61 | |
lolpcc | 0:a7af7ec8b12f | 62 | c = breakup(tag,elements,' '); |
lolpcc | 0:a7af7ec8b12f | 63 | while(1){ |
lolpcc | 0:a7af7ec8b12f | 64 | if((strcmp(cmd_cb[cnt].label,"END"))==0){ |
lolpcc | 0:a7af7ec8b12f | 65 | if(length>1) |
lolpcc | 0:a7af7ec8b12f | 66 | cmd_cb[cnt].cmd_routine(c,elements); /* this will call the error routine */ |
lolpcc | 0:a7af7ec8b12f | 67 | return(cmd_cb[cnt].cmd); |
lolpcc | 0:a7af7ec8b12f | 68 | } else if((strcmp(cmd_cb[cnt].label,tag))==0){ |
lolpcc | 0:a7af7ec8b12f | 69 | if((cmd_cb[cnt].args==c) || (cmd_cb[cnt].args==0)){ /* if arg count set to zero, can be anything */ |
lolpcc | 0:a7af7ec8b12f | 70 | cmd_cb[cnt].cmd_routine(c,elements); /* Call the function with args */ |
lolpcc | 0:a7af7ec8b12f | 71 | return(cnt); |
lolpcc | 0:a7af7ec8b12f | 72 | } else { |
lolpcc | 0:a7af7ec8b12f | 73 | lprintf("\n\rWrong number of args passed to %s\n\r",cmd_cb[cnt].label); |
lolpcc | 0:a7af7ec8b12f | 74 | return(-1); |
lolpcc | 0:a7af7ec8b12f | 75 | } |
lolpcc | 0:a7af7ec8b12f | 76 | } |
lolpcc | 0:a7af7ec8b12f | 77 | cnt++; |
lolpcc | 0:a7af7ec8b12f | 78 | } |
lolpcc | 0:a7af7ec8b12f | 79 | } |
lolpcc | 0:a7af7ec8b12f | 80 | |
lolpcc | 0:a7af7ec8b12f | 81 | |
lolpcc | 0:a7af7ec8b12f | 82 | void error_handler(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 83 | { |
lolpcc | 0:a7af7ec8b12f | 84 | int cnt=0; |
lolpcc | 0:a7af7ec8b12f | 85 | lprintf("\n\rCommands available are "); |
lolpcc | 0:a7af7ec8b12f | 86 | while(1){ |
lolpcc | 0:a7af7ec8b12f | 87 | if((strcmp(cmd_cb[cnt].label,"END"))==0){ |
lolpcc | 0:a7af7ec8b12f | 88 | lprintf("\n\r"); |
lolpcc | 0:a7af7ec8b12f | 89 | return; |
lolpcc | 0:a7af7ec8b12f | 90 | } else |
lolpcc | 0:a7af7ec8b12f | 91 | lprintf("%s, ",cmd_cb[cnt].label); |
lolpcc | 0:a7af7ec8b12f | 92 | cnt++; |
lolpcc | 0:a7af7ec8b12f | 93 | } |
lolpcc | 0:a7af7ec8b12f | 94 | } |
lolpcc | 0:a7af7ec8b12f | 95 | |
lolpcc | 0:a7af7ec8b12f | 96 | /******************************************/ |
lolpcc | 0:a7af7ec8b12f | 97 | /* */ |
lolpcc | 0:a7af7ec8b12f | 98 | /* Command stubs are here */ |
lolpcc | 0:a7af7ec8b12f | 99 | /* */ |
lolpcc | 0:a7af7ec8b12f | 100 | /******************************************/ |
lolpcc | 0:a7af7ec8b12f | 101 | |
lolpcc | 0:a7af7ec8b12f | 102 | void list(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 103 | { |
lolpcc | 0:a7af7ec8b12f | 104 | i2c_probe(); |
lolpcc | 0:a7af7ec8b12f | 105 | } |
lolpcc | 0:a7af7ec8b12f | 106 | void list2(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 107 | { |
lolpcc | 0:a7af7ec8b12f | 108 | i2c_probe2(); |
lolpcc | 0:a7af7ec8b12f | 109 | } |
lolpcc | 0:a7af7ec8b12f | 110 | |
lolpcc | 0:a7af7ec8b12f | 111 | void exec_file(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 112 | { |
lolpcc | 0:a7af7ec8b12f | 113 | /* File on a[1] */ |
lolpcc | 0:a7af7ec8b12f | 114 | |
lolpcc | 0:a7af7ec8b12f | 115 | FILE *fp; |
lolpcc | 0:a7af7ec8b12f | 116 | char buf[0x60]; |
lolpcc | 0:a7af7ec8b12f | 117 | char cmd[0x60]; |
lolpcc | 0:a7af7ec8b12f | 118 | |
lolpcc | 0:a7af7ec8b12f | 119 | sprintf(buf,"/local/%s",a[1]); |
lolpcc | 0:a7af7ec8b12f | 120 | |
lolpcc | 0:a7af7ec8b12f | 121 | if((fp = fopen(buf,"r"))==NULL){ |
lolpcc | 0:a7af7ec8b12f | 122 | lprintf("Unable to open %s\n\r",buf); |
lolpcc | 0:a7af7ec8b12f | 123 | return; |
lolpcc | 0:a7af7ec8b12f | 124 | } |
lolpcc | 0:a7af7ec8b12f | 125 | sys_state = sys_state | EXEC_CALLED; |
lolpcc | 0:a7af7ec8b12f | 126 | while(!feof(fp)){ |
lolpcc | 0:a7af7ec8b12f | 127 | fgets(buf,sizeof(buf),fp); |
lolpcc | 0:a7af7ec8b12f | 128 | if(strlen(buf) > 2){ |
lolpcc | 0:a7af7ec8b12f | 129 | sprintf(cmd,"%s\n",buf); |
lolpcc | 0:a7af7ec8b12f | 130 | find_cmd(cmd); |
lolpcc | 0:a7af7ec8b12f | 131 | } |
lolpcc | 0:a7af7ec8b12f | 132 | buf[0]='\0'; |
lolpcc | 0:a7af7ec8b12f | 133 | buf[1]='\0'; |
lolpcc | 0:a7af7ec8b12f | 134 | } |
lolpcc | 0:a7af7ec8b12f | 135 | fclose(fp); |
lolpcc | 0:a7af7ec8b12f | 136 | } |
lolpcc | 0:a7af7ec8b12f | 137 | void dir_file(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 138 | { |
lolpcc | 0:a7af7ec8b12f | 139 | lprintf("List of files in /local\n\r"); |
lolpcc | 0:a7af7ec8b12f | 140 | |
lolpcc | 0:a7af7ec8b12f | 141 | DIR *d; |
lolpcc | 0:a7af7ec8b12f | 142 | struct dirent *p; |
lolpcc | 0:a7af7ec8b12f | 143 | d = opendir("/local"); |
lolpcc | 0:a7af7ec8b12f | 144 | if(d != NULL) { |
lolpcc | 0:a7af7ec8b12f | 145 | while((p = readdir(d)) != NULL) { |
lolpcc | 0:a7af7ec8b12f | 146 | lprintf(" - %s\n\r", p->d_name); |
lolpcc | 0:a7af7ec8b12f | 147 | } |
lolpcc | 0:a7af7ec8b12f | 148 | } else { |
lolpcc | 0:a7af7ec8b12f | 149 | error("Could not open directory!"); |
lolpcc | 0:a7af7ec8b12f | 150 | } |
lolpcc | 0:a7af7ec8b12f | 151 | } |
lolpcc | 0:a7af7ec8b12f | 152 | void cat_file(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 153 | { |
lolpcc | 0:a7af7ec8b12f | 154 | /* File on a[1] */ |
lolpcc | 0:a7af7ec8b12f | 155 | |
lolpcc | 0:a7af7ec8b12f | 156 | FILE *fp; |
lolpcc | 0:a7af7ec8b12f | 157 | char buf[0x60]; |
lolpcc | 0:a7af7ec8b12f | 158 | |
lolpcc | 0:a7af7ec8b12f | 159 | sprintf(buf,"/local/%s",a[1]); |
lolpcc | 0:a7af7ec8b12f | 160 | |
lolpcc | 0:a7af7ec8b12f | 161 | if((fp = fopen(buf,"r"))==NULL){ |
lolpcc | 0:a7af7ec8b12f | 162 | lprintf("Unable to open %s\n\r",buf); |
lolpcc | 0:a7af7ec8b12f | 163 | return; |
lolpcc | 0:a7af7ec8b12f | 164 | } |
lolpcc | 0:a7af7ec8b12f | 165 | |
lolpcc | 0:a7af7ec8b12f | 166 | while(!feof(fp)){ |
lolpcc | 0:a7af7ec8b12f | 167 | fgets(buf,sizeof(buf),fp); |
lolpcc | 0:a7af7ec8b12f | 168 | if(strlen(buf) > 2){ |
lolpcc | 0:a7af7ec8b12f | 169 | lprintf(buf); |
lolpcc | 0:a7af7ec8b12f | 170 | } |
lolpcc | 0:a7af7ec8b12f | 171 | buf[0]='\0'; |
lolpcc | 0:a7af7ec8b12f | 172 | buf[1]='\0'; |
lolpcc | 0:a7af7ec8b12f | 173 | } |
lolpcc | 0:a7af7ec8b12f | 174 | fclose(fp); |
lolpcc | 0:a7af7ec8b12f | 175 | } |
lolpcc | 0:a7af7ec8b12f | 176 | |
lolpcc | 0:a7af7ec8b12f | 177 | |
lolpcc | 0:a7af7ec8b12f | 178 | void relay_control(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 179 | { |
lolpcc | 0:a7af7ec8b12f | 180 | relay_operate(htoi(a[1])); |
lolpcc | 0:a7af7ec8b12f | 181 | } |
lolpcc | 0:a7af7ec8b12f | 182 | |
lolpcc | 0:a7af7ec8b12f | 183 | void wait_control(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 184 | { |
lolpcc | 0:a7af7ec8b12f | 185 | wait(htoi(a[1])/10); |
lolpcc | 0:a7af7ec8b12f | 186 | } |
lolpcc | 0:a7af7ec8b12f | 187 | |
lolpcc | 0:a7af7ec8b12f | 188 | void light_control(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 189 | { |
lolpcc | 0:a7af7ec8b12f | 190 | channel_light(htoi(a[1]), htoi(a[2])); |
lolpcc | 0:a7af7ec8b12f | 191 | } |
lolpcc | 0:a7af7ec8b12f | 192 | void init_pca(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 193 | { |
lolpcc | 0:a7af7ec8b12f | 194 | init_pca9685(htoi(a[1])); |
lolpcc | 0:a7af7ec8b12f | 195 | } |
lolpcc | 0:a7af7ec8b12f | 196 | |
lolpcc | 0:a7af7ec8b12f | 197 | void print_string(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 198 | { |
lolpcc | 0:a7af7ec8b12f | 199 | int cnt = 1; |
lolpcc | 0:a7af7ec8b12f | 200 | int len; |
lolpcc | 0:a7af7ec8b12f | 201 | while(cnt <= c){ |
lolpcc | 0:a7af7ec8b12f | 202 | if(a[cnt][0]=='v' || a[cnt][0]=='V'){ |
lolpcc | 0:a7af7ec8b12f | 203 | len = strlen(a[cnt]); |
lolpcc | 0:a7af7ec8b12f | 204 | if(len == 2){ |
lolpcc | 0:a7af7ec8b12f | 205 | lprintf(" %04x",htoi(a[cnt])); |
lolpcc | 0:a7af7ec8b12f | 206 | } else { |
lolpcc | 0:a7af7ec8b12f | 207 | lprintf("%s",a[cnt]); |
lolpcc | 0:a7af7ec8b12f | 208 | } |
lolpcc | 0:a7af7ec8b12f | 209 | } else |
lolpcc | 0:a7af7ec8b12f | 210 | lprintf("%s",a[cnt]); |
lolpcc | 0:a7af7ec8b12f | 211 | cnt++; |
lolpcc | 0:a7af7ec8b12f | 212 | } |
lolpcc | 0:a7af7ec8b12f | 213 | lprintf("\n"); |
lolpcc | 0:a7af7ec8b12f | 214 | } |