infrastructuur voor het lezen van taken
[mTask.git] / int / int.c
index a946908..2bf2cef 100644 (file)
--- a/int/int.c
+++ b/int/int.c
@@ -1,10 +1,17 @@
 #include <stdio.h>
 #include <stdbool.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
 
 #include "mTaskSymbols.h"
 
+#define MAXTASKS 5
+#define MAXTASKSIZE 1024
+#define MAXSDS 50
 #define STACKSIZE 1024
-#define PROGRAMSIZE 1024
 
 #define DEBUG
 #ifdef DEBUG
 #define debug(s, ...) ;
 #endif
 
-#define die(s, ...) {fprintf(stderr, s, ##__VA_ARGS__); return 1;}
+#define pdie(s) {perror(s); exit(1);}
+#define die(s, ...) {fprintf(stderr, s, ##__VA_ARGS__); exit(1);}
 
-char program[PROGRAMSIZE+1] = {0};
-int stack[STACKSIZE+1] = {0};
+char tasks[MAXTASKS][MAXTASKSIZE] = {0};
+bool tasks_used[MAXTASKS] = {0};
 
-bool input_available(){
+void killHandler(int i)
+{
+       printf("%s caught, Bye...\n", strsignal(i));
+       exit(1);
+}
+
+bool input_available(int fd){
        struct timeval tv;
        fd_set fds;
        tv.tv_sec = 0;
        tv.tv_usec = 0;
        FD_ZERO(&fds);
-       FD_SET(0, &fds);
-       select(1, &fds, NULL, NULL, &tv);
-       return FD_ISSET(0, &fds);
+       FD_SET(fd, &fds);
+       if(select(fd+1, &fds, NULL, NULL, &tv) == -1){
+               pdie("select");
+       }
+       return FD_ISSET(fd, &fds);
 }
 
+void read_message(int fd_in, int fd_out)
+{
+       //Find next task
+       uint8_t c;
+       uint16_t tasklen;
+       uint8_t ct;
+
+       for(ct = 0; ct<MAXTASKS; ct++)
+               if(!tasks_used[ct])
+                       break;
+       if(ct == MAXTASKS)
+               die("Trying to add too much tasks...\n");
+
+       debug("Receiving input for task %d\n", ct);
+       read(fd_in, &c, 1);
+       if((char) c == 's') {
+               debug("Receiving an sds\n");
+       } else if((char) c == 't'){
+               read(fd_in, &c, 1);
+               tasklen = 256*c;
+               read(fd_in, &c, 1);
+               tasklen += c;
+               if(tasklen > MAXTASKSIZE)
+                       die("Task is too long: %d\n", tasklen);
+               for(int i = 0; i<tasklen; i++){
+                       debug("Read %d\n", i);
+                       read(fd_in, tasks[ct]+i, 1);
+                       debug("t[][%i]: %d\n", i,
+                               tasks[ct][i]);
+               }
+               //Return the task number for later removal
+               write(fd_out, (void *)&ct, 1);
+               debug("Received a task of length %d\n", tasklen);
+               tasks_used[ct] = true;
+       } else {
+               die("Unknown message: %c?\n", c);
+       }
+}
+
+void run_task(char *program)
+{
+
+       (void) program;
+}
 
 int main(void)
 {
-       char c;
-       int pl, sp, pc;
+       int fd_in, fd_out;
+       int ct;
+
+       fd_in = fileno(stdin);
+       fd_out = fileno(stdout);
+
+       //Register signal handler
+       if(signal(SIGINT, killHandler) == SIG_ERR){
+               die("Couldn't register signal handler...\n");
+       }
+       if(signal(SIGTERM, killHandler) == SIG_ERR){
+               die("Couldn't register signal handler...\n");
+       }
+
+       while(true){
+               //Check for new tasks
+               if(input_available(fd_in)){
+                       read_message(fd_in, fd_out);
+                       exit(1);
+               }
+               //Run tasks
+               for(ct = 0; ct<MAXTASKS; ct++){
+                       if(!tasks_used[ct]){
+                               debug("Task %d not implemented\n", ct);
+                               continue;
+                       }
+                       debug("Going to execute task %d\n", ct);
+                       run_task(tasks[ct]);
+               }
+               usleep(10);
+       }
 
-       //Read program
+/*     //Read program
        pc = 0;
        while ((c = getchar()) != EOF && pc < PROGRAMSIZE)
                program[pc++] = c;
@@ -50,72 +139,71 @@ int main(void)
        sp = 0;
        while(pc != pl){
                switch(program[pc++]){
-               case BCNop:;
+               case BCNOP:;
                        break;
-               case BCPush:
+               case BCPUSH:
                        stack[sp++] = program[pc++];
                        break;
-               case BCPop:
+               case BCPOP:
                        sp--;
                        break;
-               case BCNot:
+               case BCNOT:
                        stack[sp] = stack[sp] > 0 ? 0 : 1;
                        break;
-               case BCAdd:
+               case BCADD:
                        stack[sp-1] = stack[sp] + stack[sp-1];
                        sp -= 1;
                        break;
-               case BCSub:
+               case BCSUB:
                        stack[sp-1] = stack[sp] - stack[sp-1];
                        sp -= 1;
                        break;
-               case BCMul:
+               case BCMUL:
                        stack[sp-1] = stack[sp] * stack[sp-1];
                        sp -= 1;
                        break;
-               case BCDiv:
+               case BCDIV:
                        stack[sp-1] = stack[sp] / stack[sp-1];
                        sp -= 1;
                        break;
-               case BCAnd:
+               case BCAND:
                        stack[sp-1] = stack[sp] && stack[sp-1];
                        sp -= 1;
                        break;
-               case BCOr:
+               case BCOR:
                        stack[sp-1] = stack[sp] || stack[sp-1];
                        sp -= 1;
                        break;
-               case BCEq:
+               case BCEQ:
                        stack[sp-1] = stack[sp] == stack[sp-1];
                        sp -= 1;
                        break;
-               case BCNeq:
+               case BCNEQ:
                        stack[sp-1] = stack[sp] != stack[sp-1];
                        sp -= 1;
                        break;
-               case BCLes:
-                       stack[sp-1] = stack[sp] < stack[sp-1];
+               case BCLES: stack[sp-1] = stack[sp] < stack[sp-1];
                        sp -= 1;
                        break;
-               case BCGre:
+               case BCGRE:
                        stack[sp-1] = stack[sp] > stack[sp-1];
                        sp -= 1;
                        break;
-               case BCLeq:
+               case BCLEQ:
                        stack[sp-1] = stack[sp] <= stack[sp-1];
                        sp -= 1;
                        break;
-               case BCGeq:
+               case BCGEQ:
                        stack[sp-1] = stack[sp] >= stack[sp-1];
                        sp -= 1;
                        break;
-               case BCJmp:
+               case BCJMP:
                        pc = pc + program[pc];
                        break;
-               case BCJmpT:
+               case BCJMPT:
                        pc += stack[sp] ? program[pc] : 1;
                        break;
-               case BCJmpF:
+               case BCJMPF:
                        pc += stack[sp] ? 1 : program[pc];
                        break;
                case BCSERIALAVAIL:
@@ -142,5 +230,6 @@ int main(void)
                        die("Unrecognized command: %X\n", program[--pc]);
                }
        }
+*/
        return 0;
 }