9 #include "mTaskSymbols.h"
12 #define MAXTASKSIZE 1024
14 #define STACKSIZE 1024
18 #define debug(s, ...) printf(s, ##__VA_ARGS__);
20 #define debug(s, ...) ;
23 #define pdie(s) {perror(s); exit(1);}
24 #define die(s, ...) {fprintf(stderr, s, ##__VA_ARGS__); exit(1);}
26 char tasks
[MAXTASKS
][MAXTASKSIZE
] = {0};
27 bool tasks_used
[MAXTASKS
] = {0};
29 void killHandler(int i
)
31 printf("%s caught, Bye...\n", strsignal(i
));
35 bool input_available(int fd
){
42 if (select(fd
+1, &fds
, NULL
, NULL
, &tv
) == -1)
44 return FD_ISSET(fd
, &fds
);
47 void read_message(int fd_in
, int fd_out
)
53 for(ct
= 0; ct
<MAXTASKS
; ct
++)
57 die("Trying to add too much tasks...\n");
59 debug("Receiving input for task %d\n", ct
);
62 debug("Receiving an sds\n");
68 if(tasklen
> MAXTASKSIZE
)
69 die("Task is too long: %d\n", tasklen
);
70 for(int i
= 0; i
<tasklen
; i
++){
71 debug("Read %d\n", i
);
72 read(fd_in
, tasks
[ct
]+i
, 1);
73 debug("t[][%i]: %d\n", i
,
76 //Return the task number for later removal
77 write(fd_out
, (void *)&ct
, 1);
78 debug("Received a task of length %d\n", tasklen
);
79 tasks_used
[ct
] = true;
81 debug("Unknown message: %X?\n", c
);
85 void run_task(char *program
)
89 int plen
= strlen(program
);
90 char stack
[1024] = {0};
92 switch(program
[pc
++]){
96 stack
[sp
++] = program
[pc
++];
102 stack
[sp
] = stack
[sp
] > 0 ? 0 : 1;
105 stack
[sp
-1] = stack
[sp
] + stack
[sp
-1];
109 stack
[sp
-1] = stack
[sp
] - stack
[sp
-1];
113 stack
[sp
-1] = stack
[sp
] * stack
[sp
-1];
117 stack
[sp
-1] = stack
[sp
] / stack
[sp
-1];
121 stack
[sp
-1] = stack
[sp
] && stack
[sp
-1];
125 stack
[sp
-1] = stack
[sp
] || stack
[sp
-1];
129 stack
[sp
-1] = stack
[sp
] == stack
[sp
-1];
133 stack
[sp
-1] = stack
[sp
] != stack
[sp
-1];
136 case BCLES
: stack
[sp
-1] = stack
[sp
] < stack
[sp
-1];
140 stack
[sp
-1] = stack
[sp
] > stack
[sp
-1];
144 stack
[sp
-1] = stack
[sp
] <= stack
[sp
-1];
148 stack
[sp
-1] = stack
[sp
] >= stack
[sp
-1];
152 pc
= pc
+ program
[pc
];
155 pc
+= stack
[sp
] ? program
[pc
] : 1;
158 pc
+= stack
[sp
] ? 1 : program
[pc
];
161 printf("SerialAvailable()\n");
164 printf("SerialPrint()\n");
166 case BCSERIALPRINTLN
:
167 printf("SerialPrintln()\n");
170 printf("SerialRead()\n");
172 case BCSERIALPARSEINT
:
173 printf("SerialParseInt()\n");
176 printf("AnalogRead(%d)\n", program
[pc
++]);
179 printf("AnalogWrite(%d)\n", program
[pc
++]);
182 printf("DigitalRead(%d)\n", program
[pc
++]);
185 printf("DigitalWrite(%d)\n", program
[pc
++]);
188 die("Unrecognized command: %d\n", program
[--pc
]);
198 fd_in
= fileno(stdin
);
199 fd_out
= fileno(stdout
);
201 //Register signal handler
202 if(signal(SIGINT
, killHandler
) == SIG_ERR
){
203 die("Couldn't register signal handler...\n");
205 if(signal(SIGTERM
, killHandler
) == SIG_ERR
){
206 die("Couldn't register signal handler...\n");
210 //Check for new tasks
211 if(input_available(fd_in
)){
212 read_message(fd_in
, fd_out
);
215 for(ct
= 0; ct
<MAXTASKS
; ct
++){
217 debug("Task %d not implemented\n", ct
);
220 debug("Going to execute task %d\n", ct
);
229 while ((c = getchar()) != EOF && pc < PROGRAMSIZE)
231 if (pc >= PROGRAMSIZE)
232 die("Max program size: %d\n", PROGRAMSIZE);
234 debug("Done reading, program length: %d\n", pl);
237 //Reset program counter and stack counter