Peter Cooper
/
Dome
Geodesic Light Dome Controller Program
Diff: cmd.c
- Revision:
- 0:a7af7ec8b12f
- Child:
- 1:dc58f0b0eeec
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd.c Fri Mar 19 11:17:54 2010 +0000 @@ -0,0 +1,214 @@ +#include "mbed.h" +#include "breakup.h" +#include "useful.h" +#include "i2c.h" +#include "serial.h" +#include "cmd.h" +#include "local_defines.h" +#include "scripting.h" + + +LocalFileSystem local("local"); +FILE *exec_fp; +extern int sys_state; +extern int var[MAX_VAR]; +extern int jmp[MAX_JMP]; + + + +/******************************************/ +/* */ +/* Exec commands, for the dome */ +/* */ +/******************************************/ + +struct cmd_callback { + char *label; /* command */ + int cmd; /* switch value */ + int args; /* Number of args for this command */ + void (*cmd_routine)(int,char **); /* call */ +}; +struct cmd_callback cmd_cb[] ={ + { "list", 0, 1, list}, /* List I2C Devices to user */ + { "list2", 0, 1, list2}, /* List I2C Devices to user */ + { "exec", 0, 2, exec_file}, /* Run a script file from the local file store */ + { "dir", 0, 1, dir_file}, /* Get a directory listing from the local file store */ + { "cat", 0, 2, cat_file}, /* Cat a file on the file system to the current output device */ + { "relay", 0, 2, relay_control}, /* Switch a relay 0-8 */ + { "light", 0, 3, light_control}, /* Set a light level on a channel */ + { "wait", 0, 2, wait_control}, /* wait for X tenths of a second */ + { "baud", 0, 2, baud_rate}, /* Set the baudrate of the serial I/O */ + { "pca", 0, 2, init_pca}, /* Init a PCA9685 device from the command line */ + { "print", 0, 0, print_string}, /* Print a string to current output device */ + { "set", 0, 0, set_var}, /* Set the variable to a value */ + { "sum", 0, 0, sum_var}, /* Add some basic maths */ + { "point", 0, 0, point_var}, /* Set out loop point */ + { "tst", 0, 0, tst_var}, /* test the value of a var */ + { "clr", 0, 0, clr_var}, /* Clear the var's to zero */ + { "END", -1, -1, error_handler} +}; + + +/* Scan down tags, to find the match, else return -1 */ +int find_cmd(char *tag) +{ + int cnt=0,c; + int length=strlen(tag); + char *elements[0x10]; + + if(tag[0]=='#') /* See is we have a command or a comment */ + return(0); + + c = breakup(tag,elements,' '); + while(1){ + if((strcmp(cmd_cb[cnt].label,"END"))==0){ + if(length>1) + cmd_cb[cnt].cmd_routine(c,elements); /* this will call the error routine */ + return(cmd_cb[cnt].cmd); + } else if((strcmp(cmd_cb[cnt].label,tag))==0){ + if((cmd_cb[cnt].args==c) || (cmd_cb[cnt].args==0)){ /* if arg count set to zero, can be anything */ + cmd_cb[cnt].cmd_routine(c,elements); /* Call the function with args */ + return(cnt); + } else { + lprintf("\n\rWrong number of args passed to %s\n\r",cmd_cb[cnt].label); + return(-1); + } + } + cnt++; + } +} + + +void error_handler(int c, char **a) +{ + int cnt=0; + lprintf("\n\rCommands available are "); + while(1){ + if((strcmp(cmd_cb[cnt].label,"END"))==0){ + lprintf("\n\r"); + return; + } else + lprintf("%s, ",cmd_cb[cnt].label); + cnt++; + } +} + +/******************************************/ +/* */ +/* Command stubs are here */ +/* */ +/******************************************/ + +void list(int c, char **a) +{ + i2c_probe(); +} +void list2(int c, char **a) +{ + i2c_probe2(); +} + +void exec_file(int c, char **a) +{ + /* File on a[1] */ + + FILE *fp; + char buf[0x60]; + char cmd[0x60]; + + sprintf(buf,"/local/%s",a[1]); + + if((fp = fopen(buf,"r"))==NULL){ + lprintf("Unable to open %s\n\r",buf); + return; + } + sys_state = sys_state | EXEC_CALLED; + while(!feof(fp)){ + fgets(buf,sizeof(buf),fp); + if(strlen(buf) > 2){ + sprintf(cmd,"%s\n",buf); + find_cmd(cmd); + } + buf[0]='\0'; + buf[1]='\0'; + } + fclose(fp); +} +void dir_file(int c, char **a) +{ + lprintf("List of files in /local\n\r"); + + DIR *d; + struct dirent *p; + d = opendir("/local"); + if(d != NULL) { + while((p = readdir(d)) != NULL) { + lprintf(" - %s\n\r", p->d_name); + } + } else { + error("Could not open directory!"); + } +} +void cat_file(int c, char **a) +{ + /* File on a[1] */ + + FILE *fp; + char buf[0x60]; + + sprintf(buf,"/local/%s",a[1]); + + if((fp = fopen(buf,"r"))==NULL){ + lprintf("Unable to open %s\n\r",buf); + return; + } + + while(!feof(fp)){ + fgets(buf,sizeof(buf),fp); + if(strlen(buf) > 2){ + lprintf(buf); + } + buf[0]='\0'; + buf[1]='\0'; + } + fclose(fp); +} + + +void relay_control(int c, char **a) +{ + relay_operate(htoi(a[1])); +} + +void wait_control(int c, char **a) +{ + wait(htoi(a[1])/10); +} + +void light_control(int c, char **a) +{ + channel_light(htoi(a[1]), htoi(a[2])); +} +void init_pca(int c, char **a) +{ + init_pca9685(htoi(a[1])); +} + +void print_string(int c, char **a) +{ + int cnt = 1; + int len; + while(cnt <= c){ + if(a[cnt][0]=='v' || a[cnt][0]=='V'){ + len = strlen(a[cnt]); + if(len == 2){ + lprintf(" %04x",htoi(a[cnt])); + } else { + lprintf("%s",a[cnt]); + } + } else + lprintf("%s",a[cnt]); + cnt++; + } + lprintf("\n"); +} \ No newline at end of file