Code for an autonomous plane I'm building. Includes process scheduling, process communication, and hardware sensor interfacing (via I2C). NOTE: currently in development, source code will be updated frequently.
control.cpp@4:44a5b1e8fd27, 2013-11-02 (annotated)
- Committer:
- teamgoat
- Date:
- Sat Nov 02 08:47:14 2013 +0000
- Revision:
- 4:44a5b1e8fd27
- Parent:
- 2:452dd766d212
added process memory and communication via output buffer
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
teamgoat | 0:0c627ff4c5ed | 1 | #include "control.h" |
teamgoat | 0:0c627ff4c5ed | 2 | #include "sensor.h" |
teamgoat | 0:0c627ff4c5ed | 3 | #include "steps.h" |
teamgoat | 0:0c627ff4c5ed | 4 | #include "mbed.h" |
teamgoat | 0:0c627ff4c5ed | 5 | |
teamgoat | 0:0c627ff4c5ed | 6 | #define MAXPROC 15 |
teamgoat | 0:0c627ff4c5ed | 7 | |
teamgoat | 0:0c627ff4c5ed | 8 | process procs[MAXPROC] = {0}; |
teamgoat | 0:0c627ff4c5ed | 9 | |
teamgoat | 0:0c627ff4c5ed | 10 | int main() |
teamgoat | 0:0c627ff4c5ed | 11 | { |
teamgoat | 2:452dd766d212 | 12 | init(); |
teamgoat | 0:0c627ff4c5ed | 13 | while (true) |
teamgoat | 0:0c627ff4c5ed | 14 | { |
teamgoat | 0:0c627ff4c5ed | 15 | schedule(); |
teamgoat | 2:452dd766d212 | 16 | } |
teamgoat | 0:0c627ff4c5ed | 17 | } |
teamgoat | 0:0c627ff4c5ed | 18 | |
teamgoat | 2:452dd766d212 | 19 | void init() |
teamgoat | 0:0c627ff4c5ed | 20 | { |
teamgoat | 2:452dd766d212 | 21 | // initialize i2c sensors |
teamgoat | 4:44a5b1e8fd27 | 22 | schedule_proc("INITSENSE", &init_sensors); |
teamgoat | 2:452dd766d212 | 23 | // set initial processes |
teamgoat | 0:0c627ff4c5ed | 24 | procs[0].status = READY; |
teamgoat | 0:0c627ff4c5ed | 25 | procs[0].start = &get_sensor_data; |
teamgoat | 0:0c627ff4c5ed | 26 | return; |
teamgoat | 0:0c627ff4c5ed | 27 | } |
teamgoat | 0:0c627ff4c5ed | 28 | |
teamgoat | 4:44a5b1e8fd27 | 29 | char* get_output(int pid) |
teamgoat | 4:44a5b1e8fd27 | 30 | { |
teamgoat | 4:44a5b1e8fd27 | 31 | return procs[pid].output; |
teamgoat | 4:44a5b1e8fd27 | 32 | } |
teamgoat | 4:44a5b1e8fd27 | 33 | |
teamgoat | 0:0c627ff4c5ed | 34 | void schedule() |
teamgoat | 0:0c627ff4c5ed | 35 | { |
teamgoat | 0:0c627ff4c5ed | 36 | for (int i=0; i<MAXPROC; i++) |
teamgoat | 0:0c627ff4c5ed | 37 | { |
teamgoat | 0:0c627ff4c5ed | 38 | process proc = procs[i]; |
teamgoat | 0:0c627ff4c5ed | 39 | if(proc.status == READY) |
teamgoat | 0:0c627ff4c5ed | 40 | { |
teamgoat | 4:44a5b1e8fd27 | 41 | int ret = proc.start(i); |
teamgoat | 4:44a5b1e8fd27 | 42 | // if the process returns 0, it means don't run again |
teamgoat | 4:44a5b1e8fd27 | 43 | if (ret == 0) |
teamgoat | 4:44a5b1e8fd27 | 44 | { |
teamgoat | 4:44a5b1e8fd27 | 45 | // set proc.status to ZOMBIE |
teamgoat | 4:44a5b1e8fd27 | 46 | // ZOMBIE means process |
teamgoat | 4:44a5b1e8fd27 | 47 | // is no longer active, but |
teamgoat | 4:44a5b1e8fd27 | 48 | // it's output buffer is still |
teamgoat | 4:44a5b1e8fd27 | 49 | // needed. |
teamgoat | 4:44a5b1e8fd27 | 50 | proc.status = ZOMBIE; |
teamgoat | 4:44a5b1e8fd27 | 51 | } |
teamgoat | 0:0c627ff4c5ed | 52 | return; |
teamgoat | 0:0c627ff4c5ed | 53 | } |
teamgoat | 0:0c627ff4c5ed | 54 | } |
teamgoat | 0:0c627ff4c5ed | 55 | } |
teamgoat | 4:44a5b1e8fd27 | 56 | |
teamgoat | 4:44a5b1e8fd27 | 57 | int schedule_proc(char *sid, int (*funcptr)(int)) |
teamgoat | 4:44a5b1e8fd27 | 58 | { |
teamgoat | 4:44a5b1e8fd27 | 59 | for (int i=0; i<MAXPROC; i++) |
teamgoat | 4:44a5b1e8fd27 | 60 | { |
teamgoat | 4:44a5b1e8fd27 | 61 | process proc = procs[i]; |
teamgoat | 4:44a5b1e8fd27 | 62 | if(proc.status == EMPTY) |
teamgoat | 4:44a5b1e8fd27 | 63 | { |
teamgoat | 4:44a5b1e8fd27 | 64 | proc.status = READY; |
teamgoat | 4:44a5b1e8fd27 | 65 | proc.start = funcptr; |
teamgoat | 4:44a5b1e8fd27 | 66 | strncpy(proc.sid, sid, MAX_SID_LEN-1); |
teamgoat | 4:44a5b1e8fd27 | 67 | // null terminate proc.sid |
teamgoat | 4:44a5b1e8fd27 | 68 | proc.sid[MAX_SID_LEN-1] = 0; |
teamgoat | 4:44a5b1e8fd27 | 69 | return i; |
teamgoat | 4:44a5b1e8fd27 | 70 | } |
teamgoat | 4:44a5b1e8fd27 | 71 | } |
teamgoat | 4:44a5b1e8fd27 | 72 | // if no open processes, return -1 |
teamgoat | 4:44a5b1e8fd27 | 73 | return -1; |
teamgoat | 4:44a5b1e8fd27 | 74 | } |