X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=int%2Fint.c;h=c89a6a89561498dca52ea887b243003a0c7b4c01;hb=73d6866bdbab8f393b53c9951b05b62005a5423a;hp=71d3b4c5253e2ec4f4f022d80998d5ed0f01ce16;hpb=48dfd7ad2f104321657a3ea44d33340761c95c2e;p=mTask.git diff --git a/int/int.c b/int/int.c index 71d3b4c..c89a6a8 100644 --- a/int/int.c +++ b/int/int.c @@ -1,120 +1,345 @@ +#include +#include +#include +#include +#include #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 MSG_TASK 't' +#define MSG_DELTASK 'd' +#define MSG_SDS 's' #define DEBUG + #ifdef DEBUG #define debug(s, ...) printf(s, ##__VA_ARGS__); +#define trace(op, ...) printf("pc: %d, sp: %d, op: " op, pc, sp, ##__VA_ARGS__); #else #define debug(s, ...) ; +#define trace(pc, sp, op) ; #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);} + +struct task { + uint8_t bc[MAXTASKSIZE]; + uint16_t tlen; + uint16_t interval; + long lastrun; + bool used; +}; + +struct timeval tv1; +struct task tasks[MAXTASKS] = {0}; +int sock_fd = -1; +int fd = -1; +int port = 8123; + +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(fd, &fds); + if (select(fd+1, &fds, NULL, NULL, &tv) == -1) + pdie("select"); + return FD_ISSET(fd, &fds); +} -char program[PROGRAMSIZE+1] = {0}; -int stack[STACKSIZE+1] = {0}; +long millis() { + if (gettimeofday(&tv1, NULL) == -1) + pdie("gettimeofday"); + return tv1.tv_sec*1000 + tv1.tv_usec/1000; +} -int main(void) +void read_message(int fd_in, int fd_out) { - // - char c; - int pl, sp, pc; - - //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); - - //Evaluate program - //Reset program counter and stack counter - pc = 0; - sp = 0; - while(pc != pl){ + //Find next task + uint8_t c, ct; + + for(ct = 0; ct MAXTASKSIZE) + die("Task is too long: %d\n", tasks[ct].tlen); + //Read task bytecode + for(int i = 0; i 0 ? 0 : 1; break; - case BCAdd: + case BCADD: trace("add\n"); stack[sp-1] = stack[sp] + stack[sp-1]; sp -= 1; break; - case BCSub: + case BCSUB: trace("sub\n"); stack[sp-1] = stack[sp] - stack[sp-1]; sp -= 1; break; - case BCMul: + case BCMUL: trace("mul\n"); stack[sp-1] = stack[sp] * stack[sp-1]; sp -= 1; break; - case BCDiv: + case BCDIV: trace("div\n"); stack[sp-1] = stack[sp] / stack[sp-1]; sp -= 1; break; - case BCAnd: + case BCAND: trace("and\n"); stack[sp-1] = stack[sp] && stack[sp-1]; sp -= 1; break; - case BCOr: + case BCOR: trace("or\n"); stack[sp-1] = stack[sp] || stack[sp-1]; sp -= 1; break; - case BCEq: + case BCEQ: trace("eq\n"); stack[sp-1] = stack[sp] == stack[sp-1]; sp -= 1; break; - case BCNeq: + case BCNEQ: trace("neq\n"); stack[sp-1] = stack[sp] != stack[sp-1]; sp -= 1; break; - case BCLes: + case BCLES: trace("les\n"); stack[sp-1] = stack[sp] < stack[sp-1]; sp -= 1; break; - case BCGre: + case BCGRE: trace("gre\n"); stack[sp-1] = stack[sp] > stack[sp-1]; sp -= 1; break; - case BCLeq: + case BCLEQ: trace("leq\n"); stack[sp-1] = stack[sp] <= stack[sp-1]; sp -= 1; break; - case BCGeq: + case BCGEQ: trace("geq\n"); stack[sp-1] = stack[sp] >= stack[sp-1]; sp -= 1; break; - case BCJmp: + case BCJMP: trace("jmp to %d\n", program[pc]); pc = pc + program[pc]; break; - case BCJmpT: - if (stack[sp]) - pc = pc + program[pc]; - else - pc++; + case BCJMPT: trace("jmpt to %d\n", program[pc]); + pc += stack[sp] ? program[pc] : 1; + break; + case BCJMPF: trace("jmpf to %d\n", program[pc]); + pc += stack[sp] ? 1 : program[pc]; + break; + case BCSERIALAVAIL: trace("SerialAvailable()\n"); + break; + case BCSERIALPRINT: trace("SerialPrint()\n"); + break; + case BCSERIALPRINTLN: trace("SerialPrintln()\n"); + break; + case BCSERIALREAD: trace("SerialRead()\n"); + break; + case BCSERIALPARSEINT: trace("SerialParseInt()\n"); break; - case BCJmpF: - if (stack[sp]) - pc++; - else - pc = pc + program[pc]; + case BCANALOGREAD: trace("AnalogRead(%d)\n", program[pc]); + pc++; + break; + case BCANALOGWRITE: trace("AnalogWrite(%d)\n", program[pc]); + pc++; + break; + case BCDIGITALREAD: trace("DigitalRead(%d)\n", program[pc]); + pc++; + break; + case BCDIGITALWRITE: trace("DigitalWrite(%d)\n", program[pc]); + pc++; break; default: - die("Unrecognized command: %X\n", program[--pc]); + die("Unrecognized command: %d\n", program[--pc]); + } + } + debug("Task %d terminated\n", tasknum); +} + +void open_filedescriptors() +{ + struct sockaddr_in sa; + + bzero((char *) &sa, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_addr.s_addr = INADDR_ANY; + sa.sin_port = htons(port); + + if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) + pdie("socket"); + if(bind(sock_fd, (struct sockaddr*)&sa, sizeof(sa)) == -1) + pdie("bind\n"); + if(listen(sock_fd, 10) == -1) + pdie("bind\n"); + + printf("Listening on %d\n", port); + fflush(stdout); + if((fd = accept(sock_fd, (struct sockaddr*)NULL, NULL)) == -1) + pdie("accept"); +} + +void usage(FILE *o, char *arg0){ + fprintf(o, + "Usage: %s [opts]\n" + "\n" + "Options\n" + "-p PORT Custom port number, default: 8123\n" + , arg0); +} + +int main(int argc, char *argv[]) +{ + int ct; + + //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"); + } + + //Command line arguments + int opt; + while((opt = getopt(argc, argv, "hp:")) != -1){ + switch(opt){ + case 'p': + port = atoi(optarg); + if(port < 1) + die("Port numbers are > 1\n"); + break; + case 'h': + usage(stdout, argv[0]); + exit(EXIT_SUCCESS); + default: + usage(stderr, argv[0]); + exit(EXIT_FAILURE); + } + + } + + open_filedescriptors(); + + long cyclestart; + while(true){ + //Check for new tasks + if(input_available(fd)) + read_message(fd, fd); + //Run tasks + cyclestart = millis(); + for(ct = 0; ct