Peter Cooper
/
Dome
Geodesic Light Dome Controller Program
scripting.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 "local_defines.h" |
lolpcc | 0:a7af7ec8b12f | 3 | #include "useful.h" |
lolpcc | 0:a7af7ec8b12f | 4 | #include "scripting.h" |
lolpcc | 0:a7af7ec8b12f | 5 | |
lolpcc | 0:a7af7ec8b12f | 6 | extern int var[MAX_VAR]; |
lolpcc | 0:a7af7ec8b12f | 7 | extern int sys_state; |
lolpcc | 0:a7af7ec8b12f | 8 | extern FILE *exec_fp; |
lolpcc | 0:a7af7ec8b12f | 9 | |
lolpcc | 0:a7af7ec8b12f | 10 | long jmp[MAX_JMP]; /* Jump points */ |
lolpcc | 0:a7af7ec8b12f | 11 | |
lolpcc | 0:a7af7ec8b12f | 12 | void clear_var(void) |
lolpcc | 0:a7af7ec8b12f | 13 | { |
lolpcc | 0:a7af7ec8b12f | 14 | int a = 0; |
lolpcc | 0:a7af7ec8b12f | 15 | |
lolpcc | 0:a7af7ec8b12f | 16 | while(a != MAX_VAR){ |
lolpcc | 0:a7af7ec8b12f | 17 | var[a] = 0; |
lolpcc | 0:a7af7ec8b12f | 18 | a++; |
lolpcc | 0:a7af7ec8b12f | 19 | } |
lolpcc | 0:a7af7ec8b12f | 20 | } |
lolpcc | 0:a7af7ec8b12f | 21 | |
lolpcc | 0:a7af7ec8b12f | 22 | void set_var(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 23 | { |
lolpcc | 0:a7af7ec8b12f | 24 | int v,val; |
lolpcc | 0:a7af7ec8b12f | 25 | |
lolpcc | 0:a7af7ec8b12f | 26 | if(sys_state & EXEC_CALLED){ |
lolpcc | 0:a7af7ec8b12f | 27 | if(c != 3) |
lolpcc | 0:a7af7ec8b12f | 28 | var_exec_error(VAR_SET_CNT_ERROR); |
lolpcc | 0:a7af7ec8b12f | 29 | else { |
lolpcc | 0:a7af7ec8b12f | 30 | v = return_var(a[1]); |
lolpcc | 0:a7af7ec8b12f | 31 | val = htoi(a[2]); |
lolpcc | 0:a7af7ec8b12f | 32 | var[v]=val; |
lolpcc | 0:a7af7ec8b12f | 33 | } |
lolpcc | 0:a7af7ec8b12f | 34 | |
lolpcc | 0:a7af7ec8b12f | 35 | } else |
lolpcc | 0:a7af7ec8b12f | 36 | var_exec_error(VAR_EXEC_ERROR); |
lolpcc | 0:a7af7ec8b12f | 37 | |
lolpcc | 0:a7af7ec8b12f | 38 | } |
lolpcc | 0:a7af7ec8b12f | 39 | |
lolpcc | 0:a7af7ec8b12f | 40 | void sum_var(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 41 | { |
lolpcc | 0:a7af7ec8b12f | 42 | int v,val1,val2; |
lolpcc | 0:a7af7ec8b12f | 43 | |
lolpcc | 0:a7af7ec8b12f | 44 | if(sys_state & EXEC_CALLED){ |
lolpcc | 0:a7af7ec8b12f | 45 | if(c != 4) |
lolpcc | 0:a7af7ec8b12f | 46 | var_exec_error(VAR_SUM_CNT_ERROR); |
lolpcc | 0:a7af7ec8b12f | 47 | else { |
lolpcc | 0:a7af7ec8b12f | 48 | val1 = htoi(a[1]); |
lolpcc | 0:a7af7ec8b12f | 49 | val2 = htoi(a[3]); |
lolpcc | 0:a7af7ec8b12f | 50 | v = return_var(a[1]); |
lolpcc | 0:a7af7ec8b12f | 51 | switch(a[2][0]){ |
lolpcc | 0:a7af7ec8b12f | 52 | case '+' : |
lolpcc | 0:a7af7ec8b12f | 53 | var[v] = val1 + val2; |
lolpcc | 0:a7af7ec8b12f | 54 | break; |
lolpcc | 0:a7af7ec8b12f | 55 | case '-' : |
lolpcc | 0:a7af7ec8b12f | 56 | var[v] = val1 - val2; |
lolpcc | 0:a7af7ec8b12f | 57 | break; |
lolpcc | 0:a7af7ec8b12f | 58 | case '/' : |
lolpcc | 0:a7af7ec8b12f | 59 | var[v] = val1 / val2; |
lolpcc | 0:a7af7ec8b12f | 60 | break; |
lolpcc | 0:a7af7ec8b12f | 61 | case '*' : |
lolpcc | 0:a7af7ec8b12f | 62 | var[v] = val1 * val2; |
lolpcc | 0:a7af7ec8b12f | 63 | break; |
lolpcc | 0:a7af7ec8b12f | 64 | case '%' : |
lolpcc | 0:a7af7ec8b12f | 65 | var[v] = val1 * val2; |
lolpcc | 0:a7af7ec8b12f | 66 | break; |
lolpcc | 0:a7af7ec8b12f | 67 | default : |
lolpcc | 0:a7af7ec8b12f | 68 | var_exec_error(VAR_SUM_TYPE_ERROR); |
lolpcc | 0:a7af7ec8b12f | 69 | } |
lolpcc | 0:a7af7ec8b12f | 70 | } |
lolpcc | 0:a7af7ec8b12f | 71 | } else |
lolpcc | 0:a7af7ec8b12f | 72 | var_exec_error(VAR_EXEC_ERROR); |
lolpcc | 0:a7af7ec8b12f | 73 | } |
lolpcc | 0:a7af7ec8b12f | 74 | void point_var(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 75 | { |
lolpcc | 0:a7af7ec8b12f | 76 | int v; |
lolpcc | 0:a7af7ec8b12f | 77 | if(sys_state & EXEC_CALLED){ |
lolpcc | 0:a7af7ec8b12f | 78 | v = return_jmp(a[1]); |
lolpcc | 0:a7af7ec8b12f | 79 | jmp[v] = ftell(exec_fp); /* Read the current file pointers position */ |
lolpcc | 0:a7af7ec8b12f | 80 | sys_state = sys_state | INDENT_SET; /* Mark the state as set */ |
lolpcc | 0:a7af7ec8b12f | 81 | } else |
lolpcc | 0:a7af7ec8b12f | 82 | var_exec_error(VAR_EXEC_ERROR); |
lolpcc | 0:a7af7ec8b12f | 83 | } |
lolpcc | 0:a7af7ec8b12f | 84 | void tst_var(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 85 | { |
lolpcc | 0:a7af7ec8b12f | 86 | int v,val,j; |
lolpcc | 0:a7af7ec8b12f | 87 | int doit=0; |
lolpcc | 0:a7af7ec8b12f | 88 | |
lolpcc | 0:a7af7ec8b12f | 89 | if(sys_state & EXEC_CALLED){ |
lolpcc | 0:a7af7ec8b12f | 90 | if(sys_state & INDENT_SET){ |
lolpcc | 0:a7af7ec8b12f | 91 | if(c != 5) |
lolpcc | 0:a7af7ec8b12f | 92 | var_exec_error(VAR_TST_CNT_ERROR); |
lolpcc | 0:a7af7ec8b12f | 93 | else { |
lolpcc | 0:a7af7ec8b12f | 94 | v = return_var(a[1]); |
lolpcc | 0:a7af7ec8b12f | 95 | j = return_jmp(a[4]); |
lolpcc | 0:a7af7ec8b12f | 96 | val = htoi(a[3]); |
lolpcc | 0:a7af7ec8b12f | 97 | switch(a[2][0]){ |
lolpcc | 0:a7af7ec8b12f | 98 | case '<' : |
lolpcc | 0:a7af7ec8b12f | 99 | if(var[v] < val) |
lolpcc | 0:a7af7ec8b12f | 100 | doit = 1; |
lolpcc | 0:a7af7ec8b12f | 101 | break; |
lolpcc | 0:a7af7ec8b12f | 102 | case '>' : |
lolpcc | 0:a7af7ec8b12f | 103 | if(var[v] > val) |
lolpcc | 0:a7af7ec8b12f | 104 | doit = 1; |
lolpcc | 0:a7af7ec8b12f | 105 | break; |
lolpcc | 0:a7af7ec8b12f | 106 | case '=' : |
lolpcc | 0:a7af7ec8b12f | 107 | if(var[v] == val) |
lolpcc | 0:a7af7ec8b12f | 108 | doit = 1; |
lolpcc | 0:a7af7ec8b12f | 109 | break; |
lolpcc | 0:a7af7ec8b12f | 110 | case '!' : |
lolpcc | 0:a7af7ec8b12f | 111 | if(var[v] != val) |
lolpcc | 0:a7af7ec8b12f | 112 | doit = 1; |
lolpcc | 0:a7af7ec8b12f | 113 | break; |
lolpcc | 0:a7af7ec8b12f | 114 | default : |
lolpcc | 0:a7af7ec8b12f | 115 | var_exec_error(VAR_TST_TYPE_ERROR); |
lolpcc | 0:a7af7ec8b12f | 116 | } |
lolpcc | 0:a7af7ec8b12f | 117 | if(doit) |
lolpcc | 0:a7af7ec8b12f | 118 | fseek (exec_fp ,jmp[j] , SEEK_SET ); |
lolpcc | 0:a7af7ec8b12f | 119 | } |
lolpcc | 0:a7af7ec8b12f | 120 | } else |
lolpcc | 0:a7af7ec8b12f | 121 | var_exec_error(VAR_INDENT_ERROR); |
lolpcc | 0:a7af7ec8b12f | 122 | } else |
lolpcc | 0:a7af7ec8b12f | 123 | var_exec_error(VAR_EXEC_ERROR); |
lolpcc | 0:a7af7ec8b12f | 124 | } |
lolpcc | 0:a7af7ec8b12f | 125 | void clr_var(int c, char **a) |
lolpcc | 0:a7af7ec8b12f | 126 | { |
lolpcc | 0:a7af7ec8b12f | 127 | if(sys_state & EXEC_CALLED){ |
lolpcc | 0:a7af7ec8b12f | 128 | clear_var(); |
lolpcc | 0:a7af7ec8b12f | 129 | } else |
lolpcc | 0:a7af7ec8b12f | 130 | var_exec_error(VAR_EXEC_ERROR); |
lolpcc | 0:a7af7ec8b12f | 131 | } |
lolpcc | 0:a7af7ec8b12f | 132 | void var_exec_error(int state) |
lolpcc | 0:a7af7ec8b12f | 133 | { |
lolpcc | 0:a7af7ec8b12f | 134 | switch(state){ |
lolpcc | 0:a7af7ec8b12f | 135 | case VAR_EXEC_ERROR : |
lolpcc | 0:a7af7ec8b12f | 136 | lprintf("Can only be called from an exec call\n"); |
lolpcc | 0:a7af7ec8b12f | 137 | break; |
lolpcc | 0:a7af7ec8b12f | 138 | case VAR_SET_CNT_ERROR : |
lolpcc | 0:a7af7ec8b12f | 139 | lprintf("Format: set v<num> <value>\n"); |
lolpcc | 0:a7af7ec8b12f | 140 | break; |
lolpcc | 0:a7af7ec8b12f | 141 | case VAR_SUM_CNT_ERROR : |
lolpcc | 0:a7af7ec8b12f | 142 | lprintf("Format: sum v<num> <action> v<num>\n"); |
lolpcc | 0:a7af7ec8b12f | 143 | break; |
lolpcc | 0:a7af7ec8b12f | 144 | case VAR_TST_CNT_ERROR : |
lolpcc | 0:a7af7ec8b12f | 145 | lprintf("Format: tst v<num> <type> <value>\n"); |
lolpcc | 0:a7af7ec8b12f | 146 | break; |
lolpcc | 0:a7af7ec8b12f | 147 | case VAR_INDENT_ERROR : |
lolpcc | 0:a7af7ec8b12f | 148 | lprintf("In branch test, with no point to loop back to\n"); |
lolpcc | 0:a7af7ec8b12f | 149 | break; |
lolpcc | 0:a7af7ec8b12f | 150 | case VAR_SUM_TYPE_ERROR : |
lolpcc | 0:a7af7ec8b12f | 151 | lprintf("Unknown test type should be either +-/*\n"); |
lolpcc | 0:a7af7ec8b12f | 152 | break; |
lolpcc | 0:a7af7ec8b12f | 153 | case VAR_TST_TYPE_ERROR : |
lolpcc | 0:a7af7ec8b12f | 154 | lprintf("Unknown test type should be either <>=!\n"); |
lolpcc | 0:a7af7ec8b12f | 155 | break; |
lolpcc | 0:a7af7ec8b12f | 156 | default : |
lolpcc | 0:a7af7ec8b12f | 157 | lprintf("Unknown exec_error %04x\n",state); |
lolpcc | 0:a7af7ec8b12f | 158 | } |
lolpcc | 0:a7af7ec8b12f | 159 | } |
lolpcc | 0:a7af7ec8b12f | 160 | |
lolpcc | 0:a7af7ec8b12f | 161 | int return_jmp(char *str) |
lolpcc | 0:a7af7ec8b12f | 162 | { |
lolpcc | 0:a7af7ec8b12f | 163 | char buf[0x4]; |
lolpcc | 0:a7af7ec8b12f | 164 | int a; |
lolpcc | 0:a7af7ec8b12f | 165 | |
lolpcc | 0:a7af7ec8b12f | 166 | buf[0] = str[1]; |
lolpcc | 0:a7af7ec8b12f | 167 | buf[1] = str[2]; |
lolpcc | 0:a7af7ec8b12f | 168 | buf[2] = str[3]; |
lolpcc | 0:a7af7ec8b12f | 169 | buf[3] = str[4]; |
lolpcc | 0:a7af7ec8b12f | 170 | a = atoi(buf); |
lolpcc | 0:a7af7ec8b12f | 171 | if(a > MAX_VAR){ |
lolpcc | 0:a7af7ec8b12f | 172 | lprintf("In Return_jmp, jmp number %d more than MAXJMP %d, returned -1\n", |
lolpcc | 0:a7af7ec8b12f | 173 | a,MAX_JMP); |
lolpcc | 0:a7af7ec8b12f | 174 | return(-1); |
lolpcc | 0:a7af7ec8b12f | 175 | } |
lolpcc | 0:a7af7ec8b12f | 176 | return(a); |
lolpcc | 0:a7af7ec8b12f | 177 | } |