37859cc9580e7628603e6f76a194595945337eaa
2 #include <netinet/in.h>
9 #include <sys/socket.h>
10 #include <sys/types.h>
13 #include "mTaskSymbols.h"
16 #define MAXTASKSIZE 1024
18 #define STACKSIZE 1024
26 #define debug(s, ...) printf(s, ##__VA_ARGS__);
27 #define trace(op, ...) printf("pc: %d, sp: %d, op: " op, pc, sp, ##__VA_ARGS__);
29 #define debug(s, ...) ;
30 #define trace(pc, sp, op) ;
33 #define pdie(s) {perror(s); exit(1);}
34 #define die(s, ...) {fprintf(stderr, s, ##__VA_ARGS__); exit(1);}
37 uint8_t bc
[MAXTASKSIZE
];
42 struct task tasks
[MAXTASKS
] = {0};
47 void killHandler(int i
)
49 printf("%s caught, Bye...\n", strsignal(i
));
53 bool input_available(int fd
){
60 if (select(fd
+1, &fds
, NULL
, NULL
, &tv
) == -1)
62 return FD_ISSET(fd
, &fds
);
65 void read_message(int fd_in
, int fd_out
)
70 for(ct
= 0; ct
<MAXTASKS
; ct
++)
74 die("Trying to add too much tasks...\n");
76 debug("Receiving input for task %d\n", ct
);
80 debug("Receiving an sds\n");
84 tasks
[ct
].tlen
= 256*c
;
87 if(tasks
[ct
].tlen
> MAXTASKSIZE
)
88 die("Task is too long: %d\n", tasks
[ct
].tlen
);
89 for(int i
= 0; i
<tasks
[ct
].tlen
; i
++){
90 debug("Read %d\n", i
);
91 read(fd_in
, tasks
[ct
].bc
+i
, 1);
92 debug("t[][%i]: %d\n", i
,
95 //Return the task number for later removal
96 write(fd_out
, (void *)&ct
, 1);
97 debug("Received a task of length %d\n", tasks
[ct
].tlen
);
98 tasks
[ct
].used
= true;
101 debug("Unknown message: %X?\n", c
);
105 void run_task(int tasknum
)
107 uint8_t *program
= tasks
[tasknum
].bc
;
108 int plen
= tasks
[tasknum
].tlen
;
111 char stack
[STACKSIZE
] = {0};
112 printf("Running task: %d\nWith length: %d\n", tasknum
, plen
);
114 printf("program: %x\n", program
[pc
]);
115 switch(program
[pc
++]){
120 trace("push %d\n", program
[pc
]);
121 stack
[sp
++] = program
[pc
++];
129 stack
[sp
] = stack
[sp
] > 0 ? 0 : 1;
133 stack
[sp
-1] = stack
[sp
] + stack
[sp
-1];
138 stack
[sp
-1] = stack
[sp
] - stack
[sp
-1];
143 stack
[sp
-1] = stack
[sp
] * stack
[sp
-1];
148 stack
[sp
-1] = stack
[sp
] / stack
[sp
-1];
153 stack
[sp
-1] = stack
[sp
] && stack
[sp
-1];
158 stack
[sp
-1] = stack
[sp
] || stack
[sp
-1];
163 stack
[sp
-1] = stack
[sp
] == stack
[sp
-1];
168 stack
[sp
-1] = stack
[sp
] != stack
[sp
-1];
173 stack
[sp
-1] = stack
[sp
] < stack
[sp
-1];
178 stack
[sp
-1] = stack
[sp
] > stack
[sp
-1];
183 stack
[sp
-1] = stack
[sp
] <= stack
[sp
-1];
188 stack
[sp
-1] = stack
[sp
] >= stack
[sp
-1];
192 trace("jmp to %d\n", program
[pc
]);
193 pc
= pc
+ program
[pc
];
196 trace("jmpt to %d\n", program
[pc
]);
197 pc
+= stack
[sp
] ? program
[pc
] : 1;
200 trace("jmpf to %d\n", program
[pc
]);
201 pc
+= stack
[sp
] ? 1 : program
[pc
];
204 trace("SerialAvailable()\n");
207 trace("SerialPrint()\n");
209 case BCSERIALPRINTLN
:
210 trace("SerialPrintln()\n");
213 trace("SerialRead()\n");
215 case BCSERIALPARSEINT
:
216 trace("SerialParseInt()\n");
219 trace("AnalogRead(%d)\n", program
[pc
]);
223 trace("AnalogWrite(%d)\n", program
[pc
]);
227 trace("DigitalRead(%d)\n", program
[pc
]);
231 trace("DigitalWrite(%d)\n", program
[pc
]);
235 die("Unrecognized command: %d\n", program
[--pc
]);
238 debug("Task %d terminated\n", tasknum
);
241 void open_filedescriptors()
243 struct sockaddr_in sa
;
245 bzero((char *) &sa
, sizeof(sa
));
246 sa
.sin_family
= AF_INET
;
247 sa
.sin_addr
.s_addr
= INADDR_ANY
;
248 sa
.sin_port
= htons(port
);
250 if((sock_fd
= socket(AF_INET
, SOCK_STREAM
, 0)) == -1)
252 if(bind(sock_fd
, (struct sockaddr
*)&sa
, sizeof(sa
)) == -1)
254 if(listen(sock_fd
, 10) == -1)
257 printf("Listening on %d\n", port
);
259 if((fd
= accept(sock_fd
, (struct sockaddr
*)NULL
, NULL
)) == -1)
263 void usage(FILE *o
, char *arg0
){
268 "-p PORT Custom port number, default: 8123\n"
272 int main(int argc
, char *argv
[])
276 //Register signal handler
277 if(signal(SIGINT
, killHandler
) == SIG_ERR
){
278 die("Couldn't register signal handler...\n");
280 if(signal(SIGTERM
, killHandler
) == SIG_ERR
){
281 die("Couldn't register signal handler...\n");
284 //Command line arguments
286 while((opt
= getopt(argc
, argv
, "hp:")) != -1){
291 die("Port numbers are > 1\n");
294 usage(stdout
, argv
[0]);
297 usage(stderr
, argv
[0]);
303 open_filedescriptors();
306 //Check for new tasks
307 if(input_available(fd
))
308 read_message(fd
, fd
);
310 for(ct
= 0; ct
<MAXTASKS
; ct
++){
312 debug("Task %d not implemented\n", ct
);
316 printf("Current task to run: %d\n", ct
);
317 printf("Enter to continue, s to step\n");