fsm

Dependencies:   mbed QEI HIDScope MODSERIAL FXOS8700Q

Opzet_Eli.cpp

Committer:
ehopman
Date:
2019-10-14
Revision:
2:5730195cf595
Parent:
1:268bf7dbb15c

File content as of revision 2:5730195cf595:

// Robot states
#include "mbed.h"
#include "HIDScope.h"
#include "QEI.h"
#include "MODSERIAL.h"

// Define objects
MODSERIAL pc(USBTX,USBRX);
DigitalOut led_red(LED_RED);
DigitalOut led_blue(LED_BLUE);
DigitalOut led_green(LED_GREEN);
InterruptIn button_Mbed(PTC6); //Button 1 Mbed
InterruptIn button_1(PTB10); //Button 2 BRS
InterruptIn button_2(PTB11); // Button 3 BRS

// Functions 
enum states{START,KAL_ME,KAL_EMG,MOVE_START,READY_START,DEMO,MOVE,WAIT,OFF};

states CurrentState = START;
bool StateChanged = true;         // this is the initialization of the first state

// Function START_TO_KAL_ME

void StateMachine(void)
{
    switch(CurrentState)
    {
        case START:     
            if (StateChanged)
            {
                pc.printf("Start state, red led is on. If button 1 pressed, go to kal_me state");
                led_red = 0;  // Red led is on 
                led_blue = 1;
                led_green = 1;
                StateChanged = false;
            }
            if (button_Mbed.mode (PullDown)== false; ) // State switches when button pressed
            {
                CurrentState = KAL_ME;
                StateChanged = true;
                wait(0.2f);
                
            }
        break;      // end of state START
                
        case KAL_ME:
            if (StateChanged)
            {
                pc.printf("Calibration ME state, red ld flickers slow"); 
                //FUNCTION Red led flickers slow
                
                
                // FUNCTION Move to mechanical stop, include v_motor, t_passed
                // FUNCTION Reset encoders
                
                StateChanged = false;
            }
            
            if  (v_motor == 0 && t_passed > 2) // FUNCTION t_passed, included in v_motor?
            {
                CurrentState = KAL_EMG;
                StateChanged = true;
            }
        break;      // end of state KAL_ME
        
        case KAL_EMG:
            if (StateChanged)
            {
                // FUCNTION Red led flickers fast
                
                //FUNCTION Measure EMG_max, EMG variable meten, t_passed
                
                StateChanged = false;
            }
            
            if (EMG < 0.1*EMG_max && t_passed > 2)
            {
                CurrentState = MOVE_START;
                StateChanged = true;
            }
        break;      // end of state KAL_EMG
        
        case MOVE_START:
            if(StateChanged)
            {
                led_red = 1;
                led_blue = 1; 
                led_green = 0;   // Green led is on
            
                // FUNCTION move to start, t_passed
                // Define current_position & start_position 
                StateChanged = false; 
            }
            
            if (current_position == start_position && t_passed > 2) // FUNCTIO t_passed
            {
                CurrentState = READY_START;
                StateChanged = true;
            } 
        break;      // end of state MOVE_START
        
        case READY_START:
            if (StateChanged)
            {
                led_red = 1;
                led_blue = 1;
                led_green = 0;       // Green led is on 
                
                StateChanged = false;
            }
            
            if (button_1.read() == false)   // Button 1
            {
                CurrentState = DEMO;
                StateChanged = true;
                wait(0.2f);
            }
            else if (button_2.read() == false || EMG > 0.2*EMG_max) // Button 2 or 20% EMG_max
            {
                CurrentState = MOVE;
                StateChanged = true;
                wait(0.2f);
            }                
        break;      // end of state READY_START
        
        case DEMO:
            if (StateChanged)
            {
                //FUNCTION Blue led blink fast
                
                //FUNCTION perform straight movements for demo
                
                StateChanged = false; 
            }
            
            if (current_position == end_position && t_passed > 2) 
            {
                CurrentState = MOVE_START;
                StateChanged = true;
            }
        break;      // end of state DEMO
        
        case MOVE:
            if (StateChanged)
            {
                led_red = 1;
                led_green = 1;
                led_blue = 0;  //Blue led is on 
                
                // FUNCTION Play the game with EMG signal
                
                StateChanged = false; 
            }
            
            if (button_Mbed.read() == false)
            {
                CurrentState = OFF;
                StateChanged = true;
                wait(0.2f);
            }
            
            else if (button_1.read() == false || EMG < 0.2*EMG_max) 
            {
                CurrentState = WAIT;
                StateChanged = true;
                wait(0.2f);
            }
            break;      // end of state MOVE
        
        case WAIT:
            if (StateChanged)
            {
                led_red = 0;   // Pink led iS on 
                led_blue = 0; 
                led_green = 1
                
            if (button_Mbed.read() == false) // For five second, too hard
            {
                CurrentState = OFF;
                StateChanged = true;
                wait(0.2f);
            )
            else if (button_1.read() == false) 
            {
                CurrentState = MOVE_START;
                StateChanged = true;
                wait(0.2f);
            }
            else if (button_2.read() == false || EMG > 0.2*EMG_max) 
            {
                CurrentState = MOVE;
                StateChanged = true;
                wait(0.2f);
            }
            
        break;      // end of state WAIT
        
        case OFF:
            led_red = 0;       // White led is on 
            led_blue = 0; 
            led_green = 0;
            
        break;      // end of state OFF
        
        default:
        TurnMotorsoff(); //FUNCTION 
        printf("Unknown state reached");
    }               // End of the switch, all states are prescribed
}

int main(void)      // wat hier in moet snap ik nog niet 
{
        // hier moeten dingen komen
        while (true)
        {
            CheckForCommandFromTerminal();
            StateMachine();
        }
}