Geodesic Light Dome Controller Program

Dependencies:   mbed

Committer:
lolpcc
Date:
Wed Mar 24 09:06:23 2010 +0000
Revision:
1:dc58f0b0eeec
Parent:
0:a7af7ec8b12f

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }