added debug statements, dynamic allocation is working for tasks
[mTask.git] / client / interpret.c
index 39c24b0..6f2f20d 100644 (file)
 void run_task(struct task *t)
 {
        uint8_t *program = t->bc;
-       int plen = t->tlen;
+       int plen = t->tasklength;
        int pc = 0;
        int sp = 0;
        char stack[STACKSIZE] = {0};
        debug("Running task with length: %d", plen);
        while(pc < plen){
-//             debug("program: %d", program[pc]);
-//             debug("stack: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
-//                     stack[0], stack[1], stack[2], stack[3], stack[4],
-//                     stack[5], stack[6], stack[7], stack[8], stack[9]);
-
                switch(program[pc++]){
                case BCNOP: trace("nop");
                        break;
@@ -37,8 +32,21 @@ void run_task(struct task *t)
                        pc++;
                        break;
                case BCPUSH: trace("push %d", program[pc]*265+program[pc+1]);
-                       stack[sp++] = f16(pc);
-                       pc+=2;
+                       switch(program[pc++]){
+                       //Long
+                       case 'l':
+                       //Int
+                       case 'i':
+                               stack[sp++] = f16(pc);
+                               pc+=2;
+                               break;
+                       case 'b': //Bool
+                       case 'c': //Character
+                       case 'B': //Button
+                       case 'L': //UserLED
+                               stack[sp++] = program[pc++];
+                               break;
+                       }
                        break;
                case BCPOP: trace("pop");
                        sp--;
@@ -59,51 +67,51 @@ void run_task(struct task *t)
                        stack[sp] = stack[sp] > 0 ? 0 : 1;
                        break;
                case BCADD: trace("add");
-                       stack[sp-2] = stack[sp-1] + stack[sp-2];
+                       stack[sp-2] = stack[sp-2] + stack[sp-1];
                        sp -= 1;
                        break;
                case BCSUB: trace("sub");
-                       stack[sp-2] = stack[sp-1] - stack[sp-2];
+                       stack[sp-2] = stack[sp-2] - stack[sp-1];
                        sp -= 1;
                        break;
                case BCMUL: trace("mul");
-                       stack[sp-2] = stack[sp-1] * stack[sp-2];
+                       stack[sp-2] = stack[sp-2] * stack[sp-1];
                        sp -= 1;
                        break;
                case BCDIV: trace("div");
-                       stack[sp-2] = stack[sp-1] / stack[sp-2];
+                       stack[sp-2] = stack[sp-2] / stack[sp-1];
                        sp -= 1;
                        break;
                case BCAND: trace("and");
-                       stack[sp-2] = stack[sp-1] && stack[sp-2];
+                       stack[sp-2] = stack[sp-2] && stack[sp-1];
                        sp -= 1;
                        break;
                case BCOR: trace("or");
-                       stack[sp-2] = stack[sp-1] || stack[sp-2];
+                       stack[sp-2] = stack[sp-2] || stack[sp-1];
                        sp -= 1;
                        break;
                case BCEQ: trace("eq");
-                       stack[sp-2] = stack[sp-1] == stack[sp-2];
+                       stack[sp-2] = stack[sp-2] == stack[sp-1];
                        sp -= 1;
                        break;
                case BCNEQ: trace("neq");
-                       stack[sp-2] = stack[sp-1] != stack[sp-2];
+                       stack[sp-2] = stack[sp-2] != stack[sp-1];
                        sp -= 1;
                        break;
                case BCLES: trace("les");
-                       stack[sp-2] = stack[sp-1] < stack[sp-2];
+                       stack[sp-2] = stack[sp-2] < stack[sp-1];
                        sp -= 1;
                        break;
                case BCGRE: trace("gre");
-                       stack[sp-2] = stack[sp-1] > stack[sp-2];
+                       stack[sp-2] = stack[sp-2] > stack[sp-1];
                        sp -= 1;
                        break;
                case BCLEQ: trace("leq");
-                       stack[sp-2] = stack[sp-1] <= stack[sp-2];
+                       stack[sp-2] = stack[sp-2] <= stack[sp-1];
                        sp -= 1;
                        break;
                case BCGEQ: trace("geq");
-                       stack[sp-2] = stack[sp-1] >= stack[sp-2];
+                       stack[sp-2] = stack[sp-2] >= stack[sp-1];
                        sp -= 1;
                        break;
                case BCJMP: trace("jmp to %d", program[pc]);
@@ -125,6 +133,7 @@ void run_task(struct task *t)
                        break;
                case BCSERIALPARSEINT: trace("SerialParseInt()");
                        break;
+#if HAVEAIO == 1
                case BCANALOGREAD: trace("AnalogRead(%d)", program[pc]);
                        stack[sp++] = read_apin(program[pc++]);
                        break;
@@ -132,6 +141,8 @@ void run_task(struct task *t)
                        write_apin(program[pc++], stack[sp-1]);
                        sp--;
                        break;
+#endif
+#if HAVEDIO == 1
                case BCDIGITALREAD: trace("DigitalRead(%d)", program[pc]);
                        stack[sp++] = read_dpin(program[pc++]);
                        break;
@@ -139,12 +150,17 @@ void run_task(struct task *t)
                        write_dpin(program[pc++], stack[sp-1]);
                        sp--;
                        break;
+#endif
+#if HAVELED == 1
                case BCLEDON: trace("LedOn(%d)", program[pc]);
-                       led_on(program[pc++]);
+                       led_on(stack[sp-1]);
+                       sp--;
                        break;
                case BCLEDOFF: trace("LedOn(%d)", program[pc]);
-                       led_off(program[pc++]);
+                       led_off(stack[sp-1]);
+                       sp--;
                        break;
+#endif
                default:
                        trace("unrecognized");
                        die("Unrecognized command: %d", program[pc-1]);