At the end of this project, you should be able to:
Design your FSM on paper.
Add a new variable type to "project.h":
typedef enum {
START,
#LIST YOUR OTHER STATES HERE#
} State;
Modify your main function such that it is structured as follows
(you will, of course, need to add other code). Here is an outline for
the code ("NEW" lines are explicitly indicated):
int main(void) {
int16_t counter = 0;
int16_t heading, heading_last, heading_goal, heading_error, heading_error_clipped;
int16_t rotation_rate, distance_left, distance_right;
State state = START; // NEW
int16_t forward_thrust = 0;
#APPROPRIATE VARIABLE DECLARATIONS HERE#
#APPROPRIATE INITIALIZATIONS HERE#
timer0_config(TIMER0_PRE_1024); // Prescale by 1024
timer0_enable(); // Enable the timer 0 overflow interrupt
sei(); // Enable global interrupts
#INITIALIZE VARIABLES HERE#
#RAMP UP MIDDLE THRUST TO HOVER#
// Loop forever
while(1) {
// ////////////////////////////////////////////////
// Sensors
heading = read_orientation();
heading_error = compute_orientation_error(heading_goal, heading);
heading_error_clipped = clip_error(heading_goal, #DB#, #SAT#);
rotation_rate = get_rotation_rate();
distance_left = get_distance(LEFT);
distance_right = get_distance(RIGHT);
// Display
#APPROPRIATE CODE FOR DISPLAYING SENSOR STATES WITH YOUR LEDS#
// ////////////////////////////////////////////////
// Finite state machine
switch(state) { // NEW
case STATE_START:
:
break;
case STATE_NAVIGATE_1:
:
break;
:
:
default:
// this should never happen: but take safety steps
// if it does
#Shut down craft#
while(1){};
break;
}
// ////////////////////////////////////////////////
// Control
// NOTE: forward_thrust and heading_goal should be set by your FSM
pd_control(forward_thrust, heading_error, rotation_rate);
// ////////////////////////////////////////////////
// Handle loop timing
// Increment time
++counter;
if(flag_timing) {
// Error condition: your code body is taking too much
// time.
#Indicate this with an LED display of some form#
}else{
#Indicate with LED display that everything is OK
}
// Wait for the flag to be set (happens once every ~50 ms)
while(flag_timing == 0) {};
// Clear the flag for next time.
flag_timing = 0;
}
}
Remember that documentation is about helping you and others looking at your code to understand what it is doing. Therefore, it will generally describe the logic of the code (and not-necessarily the low-level details). For this class:
Grades for individuals will be based on the group grade, but weighted by the assessed contributions of the group members to the non-personal programming items.
Last modified: Wed Apr 12 23:27:11 2017