X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=int%2Fint.c;h=fd54153e9fc1e3e2a1443197d64ca5eac81daddd;hb=c884100c832f235445d6a004c39db17ef83bb286;hp=71d3b4c5253e2ec4f4f022d80998d5ed0f01ce16;hpb=48dfd7ad2f104321657a3ea44d33340761c95c2e;p=mTask.git diff --git a/int/int.c b/int/int.c index 71d3b4c..fd54153 100644 --- a/int/int.c +++ b/int/int.c @@ -1,9 +1,17 @@ #include +#include +#include +#include +#include +#include +#include #include "mTaskSymbols.h" +#define MAXTASKS 5 +#define MAXTASKSIZE 1024 +#define MAXSDS 50 #define STACKSIZE 1024 -#define PROGRAMSIZE 1024 #define DEBUG #ifdef DEBUG @@ -12,109 +20,226 @@ #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}; -int main(void) +void killHandler(int i) { - // - char c; - int pl, sp, pc; + printf("%s caught, Bye...\n", strsignal(i)); + exit(1); +} - //Read program - pc = 0; - while ((c = getchar()) != EOF && pc < PROGRAMSIZE) - program[pc++] = c; - if (pc >= PROGRAMSIZE) - die("Max program size: %d\n", PROGRAMSIZE); - pl = pc; - debug("Done reading, program length: %d\n", pl); +bool input_available(int fd){ + struct timeval tv; + fd_set fds; + tv.tv_sec = 0; + tv.tv_usec = 0; + FD_ZERO(&fds); + FD_SET(fd, &fds); + if (select(fd+1, &fds, NULL, NULL, &tv) == -1) + pdie("select"); + return FD_ISSET(fd, &fds); +} - //Evaluate program - //Reset program counter and stack counter - pc = 0; - sp = 0; - while(pc != pl){ +void read_message(int fd_in, int fd_out) +{ + //Find next task + uint8_t c, ct; + uint16_t tasklen; + + for(ct = 0; ct MAXTASKSIZE) + die("Task is too long: %d\n", tasklen); + for(int i = 0; i 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: - if (stack[sp]) - pc = pc + program[pc]; - else - pc++; + case BCJMPT: + pc += stack[sp] ? program[pc] : 1; + break; + case BCJMPF: + pc += stack[sp] ? 1 : program[pc]; + break; + case BCSERIALAVAIL: + printf("SerialAvailable()\n"); + break; + case BCSERIALPRINT: + printf("SerialPrint()\n"); + break; + case BCSERIALPRINTLN: + printf("SerialPrintln()\n"); + break; + case BCSERIALREAD: + printf("SerialRead()\n"); + break; + case BCSERIALPARSEINT: + printf("SerialParseInt()\n"); break; - case BCJmpF: - if (stack[sp]) - pc++; - else - pc = pc + program[pc]; + case BCANALOGREAD: + printf("AnalogRead(%d)\n", program[pc++]); + break; + case BCANALOGWRITE: + printf("AnalogWrite(%d)\n", program[pc++]); + break; + case BCDIGITALREAD: + printf("DigitalRead(%d)\n", program[pc++]); + break; + case BCDIGITALWRITE: + printf("DigitalWrite(%d)\n", program[pc++]); break; default: - die("Unrecognized command: %X\n", program[--pc]); + die("Unrecognized command: %d\n", program[--pc]); + } + } +} + +int main(void) +{ + 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); + } + //Run tasks + for(ct = 0; ct= PROGRAMSIZE) + die("Max program size: %d\n", PROGRAMSIZE); + pl = pc; + debug("Done reading, program length: %d\n", pl); + + //Evaluate program + //Reset program counter and stack counter + pc = 0; + sp = 0; + while(pc != pl){ } +*/ return 0; }