198aee3793d14c9f80d39e8b45d6f5c9b1b53254
[mTask.git] / client / task.c
1 #include <stdlib.h>
2 #include <string.h>
3
4 #include "task.h"
5 #include "spec.h"
6 #include "interface.h"
7
8 struct task tasks[MAXTASKS];
9
10 void task_init(void)
11 {
12 memset(&tasks, 0, sizeof(struct task)*MAXTASKS);
13 }
14
15 void task_register(void)
16 {
17 uint8_t ct;
18 uint16_t i;
19
20 for(ct = 0; ct<MAXTASKS; ct++)
21 if(!tasks[ct].used)
22 break;
23 if(ct == MAXTASKS)
24 die("Trying to add too much tasks...");
25
26 memset(&tasks[ct], 0, sizeof(struct task));
27 //Read interval
28 tasks[ct].interval = read16();
29
30 //Interrupt task
31 if(is_interrupt_task(&tasks[ct])) {
32
33 }
34
35 //Read tasklength
36 tasks[ct].tlen = read16();
37 debug("task interval: %d, length: %d\n",
38 tasks[ct].interval, tasks[ct].tlen);
39
40 if(tasks[ct].tlen > MAXTASKSIZE)
41 die("Task is too long: %d", tasks[ct].tlen);
42 //Read task bytecode
43 for(i = 0; i<tasks[ct].tlen; i++){
44 tasks[ct].bc[i] = read_byte();
45 }
46 //Return the task number for later removal
47 debug("Received a task of length %d", tasks[ct].tlen);
48 tasks[ct].used = true;
49 tasks[ct].lastrun = 0L;
50
51 write_byte('t');
52 write16(ct);
53 write_byte('\n');
54 }
55
56 bool is_interrupt_task(struct task *t)
57 {
58 return t->interval & (2 <<14);
59 }
60
61 bool had_interrupt(struct task* t)
62 {
63 //Not implemented yet...
64 return false;
65 (void)t;
66 }
67
68 void task_delete(void)
69 {
70 uint8_t c = read16();
71 tasks[c].used = false;
72 write_byte('d');
73 write16(c);
74 write_byte('\n');
75 }
76
77 struct task *task_get(int num)
78 {
79 return tasks[num].used ? &tasks[num] : NULL;
80 }