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.

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }