X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=int%2Fint.c;h=c89a6a89561498dca52ea887b243003a0c7b4c01;hb=73d6866bdbab8f393b53c9951b05b62005a5423a;hp=9d6fde38bcdaab97bbc1667aac94376a53a97491;hpb=48bddd6acbfceed71f699e937c750f0994cc00fc;p=mTask.git diff --git a/int/int.c b/int/int.c index 9d6fde3..c89a6a8 100644 --- a/int/int.c +++ b/int/int.c @@ -8,18 +8,18 @@ #include #include #include +#include #include #include "mTaskSymbols.h" -#define PORT 8123 - #define MAXTASKS 5 #define MAXTASKSIZE 1024 #define MAXSDS 50 #define STACKSIZE 1024 #define MSG_TASK 't' +#define MSG_DELTASK 'd' #define MSG_SDS 's' #define DEBUG @@ -38,12 +38,16 @@ 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) { @@ -63,6 +67,12 @@ bool input_available(int fd){ return FD_ISSET(fd, &fds); } +long millis() { + if (gettimeofday(&tv1, NULL) == -1) + pdie("gettimeofday"); + return tv1.tv_sec*1000 + tv1.tv_usec/1000; +} + void read_message(int fd_in, int fd_out) { //Find next task @@ -80,13 +90,28 @@ void read_message(int fd_in, int fd_out) case MSG_SDS: debug("Receiving an sds\n"); break; + case MSG_DELTASK: + debug("Receiving a delete task request\n"); + //Read task number and set unused + read(fd_in, &c, 1); + tasks[ct].used = false; + break; case MSG_TASK: + debug("Receiving a task\n"); + bzero(&tasks[ct], sizeof(struct task)); + //Read interval + read(fd_in, &c, 1); + tasks[ct].interval = 256*c; + read(fd_in, &c, 1); + tasks[ct].interval += c; + //Read tasklength read(fd_in, &c, 1); tasks[ct].tlen = 256*c; read(fd_in, &c, 1); tasks[ct].tlen += c; if(tasks[ct].tlen > 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: - trace("add\n"); + case BCADD: trace("add\n"); stack[sp-1] = stack[sp] + stack[sp-1]; sp -= 1; break; - case BCSUB: - trace("sub\n"); + case BCSUB: trace("sub\n"); stack[sp-1] = stack[sp] - stack[sp-1]; sp -= 1; break; - case BCMUL: - trace("mul\n"); + case BCMUL: trace("mul\n"); stack[sp-1] = stack[sp] * stack[sp-1]; sp -= 1; break; - case BCDIV: - trace("div\n"); + case BCDIV: trace("div\n"); stack[sp-1] = stack[sp] / stack[sp-1]; sp -= 1; break; - case BCAND: - trace("and\n"); + case BCAND: trace("and\n"); stack[sp-1] = stack[sp] && stack[sp-1]; sp -= 1; break; - case BCOR: - trace("or\n"); + case BCOR: trace("or\n"); stack[sp-1] = stack[sp] || stack[sp-1]; sp -= 1; break; - case BCEQ: - trace("eq\n"); + case BCEQ: trace("eq\n"); stack[sp-1] = stack[sp] == stack[sp-1]; sp -= 1; break; - case BCNEQ: - trace("neq\n"); + case BCNEQ: trace("neq\n"); stack[sp-1] = stack[sp] != stack[sp-1]; sp -= 1; break; - case BCLES: - trace("les\n"); + case BCLES: trace("les\n"); stack[sp-1] = stack[sp] < stack[sp-1]; sp -= 1; break; - case BCGRE: - trace("gre\n"); + case BCGRE: trace("gre\n"); stack[sp-1] = stack[sp] > stack[sp-1]; sp -= 1; break; - case BCLEQ: - trace("leq\n"); + case BCLEQ: trace("leq\n"); stack[sp-1] = stack[sp] <= stack[sp-1]; sp -= 1; break; - case BCGEQ: - trace("geq\n"); + case BCGEQ: trace("geq\n"); stack[sp-1] = stack[sp] >= stack[sp-1]; sp -= 1; break; - case BCJMP: - trace("jmp to %d\n", program[pc]); + case BCJMP: trace("jmp to %d\n", program[pc]); pc = pc + program[pc]; break; - case BCJMPT: - trace("jmpt to %d\n", program[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]); + case BCJMPF: trace("jmpf to %d\n", program[pc]); pc += stack[sp] ? 1 : program[pc]; break; - case BCSERIALAVAIL: - trace("SerialAvailable()\n"); + case BCSERIALAVAIL: trace("SerialAvailable()\n"); break; - case BCSERIALPRINT: - trace("SerialPrint()\n"); + case BCSERIALPRINT: trace("SerialPrint()\n"); break; - case BCSERIALPRINTLN: - trace("SerialPrintln()\n"); + case BCSERIALPRINTLN: trace("SerialPrintln()\n"); break; - case BCSERIALREAD: - trace("SerialRead()\n"); + case BCSERIALREAD: trace("SerialRead()\n"); break; - case BCSERIALPARSEINT: - trace("SerialParseInt()\n"); + case BCSERIALPARSEINT: trace("SerialParseInt()\n"); break; - case BCANALOGREAD: - trace("AnalogRead(%d)\n", program[pc]); + case BCANALOGREAD: trace("AnalogRead(%d)\n", program[pc]); pc++; break; - case BCANALOGWRITE: - trace("AnalogWrite(%d)\n", program[pc]); + case BCANALOGWRITE: trace("AnalogWrite(%d)\n", program[pc]); pc++; break; - case BCDIGITALREAD: - trace("DigitalRead(%d)\n", program[pc]); + case BCDIGITALREAD: trace("DigitalRead(%d)\n", program[pc]); pc++; break; - case BCDIGITALWRITE: - trace("DigitalWrite(%d)\n", program[pc]); + case BCDIGITALWRITE: trace("DigitalWrite(%d)\n", program[pc]); pc++; break; default: @@ -246,7 +249,7 @@ void open_filedescriptors() bzero((char *) &sa, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = INADDR_ANY; - sa.sin_port = htons(PORT); + sa.sin_port = htons(port); if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) pdie("socket"); @@ -255,13 +258,22 @@ void open_filedescriptors() if(listen(sock_fd, 10) == -1) pdie("bind\n"); - printf("Listening on %d\n", PORT); + printf("Listening on %d\n", port); fflush(stdout); if((fd = accept(sock_fd, (struct sockaddr*)NULL, NULL)) == -1) pdie("accept"); } -int main(void) +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; @@ -273,18 +285,45 @@ int main(void) 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