State machine

Dependencies:   mbed Adafruit_GFX BioroboticsMotorControl MODSERIAL BioroboticsEMGFilter

main.cpp

Committer:
brass_phoenix
Date:
2018-10-30
Revision:
2:141cfcafe72b
Parent:
1:cfa5abca6d43
Child:
3:4b19b6cf6cc7

File content as of revision 2:141cfcafe72b:

#include "mbed.h"

#include "Button.h"


enum States {waiting, calib_motor, calib_bicep1, calib_bicep2, homing, operation, failure}; // The possible states of the state machine

// Global variables
const double PI = 3.14159265359;
// Main loop wait time per cycle. This does not influence the motor PID or EMG reading frequencies.
const double main_loop_wait_time = 0.01;


States current_state;   // Defining the state we are currently in
States last_state;      // To detect state changes.
Ticker loop_ticker;     // Ticker for the loop function

// Order of buttons: up_down, left_right, panic
// D2, D3, D8
Button ud_button(PTA4);
Button lr_button(D3);
Button p_button(PTC6);

DigitalOut led_red(LED_RED);
DigitalOut led_green(LED_GREEN);


void do_state_waiting() {
    if (ud_button.is_pressed()) {
        current_state = calib_motor;
    }
    
    led_green = 1;
}

void do_state_calib_motor() {
    if(last_state != current_state) {
        last_state = current_state;
        // State just changed to this one.
        
        led_green = 0;
    }
}

void do_state_calib_bicep1() {
    if(last_state != current_state) {
        last_state = current_state;
        // State just changed to this one.
    }
}

void do_state_calib_bicep2() {
    if(last_state != current_state) {
        last_state = current_state;
        // State just changed to this one.
    }
}

void do_state_homing() {
    if(last_state != current_state) {
        last_state = current_state;
        // State just changed to this one.
    }
}

void do_state_operation() {
    if(last_state != current_state) {
        last_state = current_state;
        // State just changed to this one.
    }
}

void do_state_failure() {
    if(last_state != current_state) {
        last_state = current_state;
        // State just changed.
        // Update the display.
        led_red = 0;
        led_green = 1;
    }
    
    // Stop the motors!
}


void main_loop()
{
    ud_button.update();
    lr_button.update();
    p_button.update();
    
    switch (current_state) {
        case waiting:
            do_state_waiting();
            break;
        case calib_motor:
            do_state_calib_motor();
            break;
        case calib_bicep1:
            do_state_calib_bicep1();
            break;
        case calib_bicep2:
            do_state_calib_bicep2();
            break;
        case homing:
            do_state_homing();
            break;
        case operation:
            do_state_operation();
            break;
        case failure:
            do_state_failure();
            break;
    }
    
    // Check if the panic button was pressed.
    // Doesn't matter in which state we are, we need to go to failure.
    if (p_button.is_pressed()) {
        current_state = failure;
    }    
}

int main()
{
    led_red = 1;
    
    // Start in the waiting state.
    current_state = waiting;
    last_state = waiting;
    
    while (true) {
        main_loop();
        wait(main_loop_wait_time);
    }
}