9d6fde38bcdaab97bbc1667aac94376a53a97491
2 #include <netinet/in.h>
9 #include <sys/socket.h>
10 #include <sys/types.h>
13 #include "mTaskSymbols.h"
18 #define MAXTASKSIZE 1024
20 #define STACKSIZE 1024
28 #define debug(s, ...) printf(s, ##__VA_ARGS__);
29 #define trace(op, ...) printf("pc: %d, sp: %d, op: " op, pc, sp, ##__VA_ARGS__);
31 #define debug(s, ...) ;
32 #define trace(pc, sp, op) ;
35 #define pdie(s) {perror(s); exit(1);}
36 #define die(s, ...) {fprintf(stderr, s, ##__VA_ARGS__); exit(1);}
39 uint8_t bc
[MAXTASKSIZE
];
44 struct task tasks
[MAXTASKS
] = {0};
48 void killHandler(int i
)
50 printf("%s caught, Bye...\n", strsignal(i
));
54 bool input_available(int fd
){
61 if (select(fd
+1, &fds
, NULL
, NULL
, &tv
) == -1)
63 return FD_ISSET(fd
, &fds
);
66 void read_message(int fd_in
, int fd_out
)
71 for(ct
= 0; ct
<MAXTASKS
; ct
++)
75 die("Trying to add too much tasks...\n");
77 debug("Receiving input for task %d\n", ct
);
81 debug("Receiving an sds\n");
85 tasks
[ct
].tlen
= 256*c
;
88 if(tasks
[ct
].tlen
> MAXTASKSIZE
)
89 die("Task is too long: %d\n", tasks
[ct
].tlen
);
90 for(int i
= 0; i
<tasks
[ct
].tlen
; i
++){
91 debug("Read %d\n", i
);
92 read(fd_in
, tasks
[ct
].bc
+i
, 1);
93 debug("t[][%i]: %d\n", i
,
96 //Return the task number for later removal
97 write(fd_out
, (void *)&ct
, 1);
98 debug("Received a task of length %d\n", tasks
[ct
].tlen
);
99 tasks
[ct
].used
= true;
102 debug("Unknown message: %X?\n", c
);
106 void run_task(int tasknum
)
108 uint8_t *program
= tasks
[tasknum
].bc
;
109 int plen
= tasks
[tasknum
].tlen
;
112 char stack
[STACKSIZE
] = {0};
113 printf("Running task: %d\nWith length: %d\n", tasknum
, plen
);
115 printf("program: %x\n", program
[pc
]);
116 switch(program
[pc
++]){
121 trace("push %d\n", program
[pc
]);
122 stack
[sp
++] = program
[pc
++];
130 stack
[sp
] = stack
[sp
] > 0 ? 0 : 1;
134 stack
[sp
-1] = stack
[sp
] + stack
[sp
-1];
139 stack
[sp
-1] = stack
[sp
] - stack
[sp
-1];
144 stack
[sp
-1] = stack
[sp
] * stack
[sp
-1];
149 stack
[sp
-1] = stack
[sp
] / stack
[sp
-1];
154 stack
[sp
-1] = stack
[sp
] && stack
[sp
-1];
159 stack
[sp
-1] = stack
[sp
] || stack
[sp
-1];
164 stack
[sp
-1] = stack
[sp
] == stack
[sp
-1];
169 stack
[sp
-1] = stack
[sp
] != stack
[sp
-1];
174 stack
[sp
-1] = stack
[sp
] < stack
[sp
-1];
179 stack
[sp
-1] = stack
[sp
] > stack
[sp
-1];
184 stack
[sp
-1] = stack
[sp
] <= stack
[sp
-1];
189 stack
[sp
-1] = stack
[sp
] >= stack
[sp
-1];
193 trace("jmp to %d\n", program
[pc
]);
194 pc
= pc
+ program
[pc
];
197 trace("jmpt to %d\n", program
[pc
]);
198 pc
+= stack
[sp
] ? program
[pc
] : 1;
201 trace("jmpf to %d\n", program
[pc
]);
202 pc
+= stack
[sp
] ? 1 : program
[pc
];
205 trace("SerialAvailable()\n");
208 trace("SerialPrint()\n");
210 case BCSERIALPRINTLN
:
211 trace("SerialPrintln()\n");
214 trace("SerialRead()\n");
216 case BCSERIALPARSEINT
:
217 trace("SerialParseInt()\n");
220 trace("AnalogRead(%d)\n", program
[pc
]);
224 trace("AnalogWrite(%d)\n", program
[pc
]);
228 trace("DigitalRead(%d)\n", program
[pc
]);
232 trace("DigitalWrite(%d)\n", program
[pc
]);
236 die("Unrecognized command: %d\n", program
[--pc
]);
239 debug("Task %d terminated\n", tasknum
);
242 void open_filedescriptors()
244 struct sockaddr_in sa
;
246 bzero((char *) &sa
, sizeof(sa
));
247 sa
.sin_family
= AF_INET
;
248 sa
.sin_addr
.s_addr
= INADDR_ANY
;
249 sa
.sin_port
= htons(PORT
);
251 if((sock_fd
= socket(AF_INET
, SOCK_STREAM
, 0)) == -1)
253 if(bind(sock_fd
, (struct sockaddr
*)&sa
, sizeof(sa
)) == -1)
255 if(listen(sock_fd
, 10) == -1)
258 printf("Listening on %d\n", PORT
);
260 if((fd
= accept(sock_fd
, (struct sockaddr
*)NULL
, NULL
)) == -1)
268 //Register signal handler
269 if(signal(SIGINT
, killHandler
) == SIG_ERR
){
270 die("Couldn't register signal handler...\n");
272 if(signal(SIGTERM
, killHandler
) == SIG_ERR
){
273 die("Couldn't register signal handler...\n");
276 open_filedescriptors();
279 //Check for new tasks
280 if(input_available(fd
))
281 read_message(fd
, fd
);
283 for(ct
= 0; ct
<MAXTASKS
; ct
++){
285 debug("Task %d not implemented\n", ct
);
289 printf("Current task to run: %d\n", ct
);
290 printf("Enter to continue, s to step\n");