Slams doors

Dependencies:   Motor RemoteIR TextLCD mbed

main.cpp

Committer:
mversteeg3
Date:
2012-10-12
Revision:
0:15e49f97cb3d

File content as of revision 0:15e49f97cb3d:

#include "mbed.h"
#include "func.h"
#include "define.h"
#include "globlvar.h"


int main()
{
    int myButton;
    //For developer use
    //GetIRCodes();
    //GetForces();
    format = RemoteIR::SONY;
    while(1) {
        //The state machine switch statement
        switch( state) {
            //The initialization state
            case BOOT:
                pc.printf("BOOTING UP\n\r");
                forceThresh = DEFAULT_FORCE;
                pushSpeed = DEFAULT_SPEED;
                state = LISTEN;
                newState = true;
                held = false;
                lcd.cls();
                lcd.printf("RON SWANSON \nDOOR SLAMMER!");
                break;
            //Listen for IR signal             
            case LISTEN:
                if(newState)
                    pc.printf("LISTENING FOR IR\n\r");
                newState = false;
                myButton = IRListen();

                switch(myButton) {
                    case NONE:
                        break;
                    case RUN:
                        pc.printf("OK Button\n\r");
                        state = CLOSE_DOOR;
                        newState = true;
                        held = true;
                        break;
                    case SPD_UP:
                        if(pushSpeed+SPEED_INC<=1)
                            pushSpeed += SPEED_INC;
                        else
                            pushSpeed = 1;
                        speedPercent = (int)(pushSpeed*100.0f);
                        lcd.cls();
                        lcd.printf("Speed:\n%3d%%\n\r", speedPercent);
                        pc.printf("Speed:\n%3d%%\n\r", speedPercent);
                        break;
                    case SPD_DN:
                        if(pushSpeed-SPEED_INC>=SPEED_MIN)
                            pushSpeed -= SPEED_INC;
                        else
                            pushSpeed = SPEED_MIN;
                        speedPercent = (int)(pushSpeed*100.0f);
                        lcd.cls();
                        lcd.printf("Speed:\n%3d%%\n\r", speedPercent);
                        pc.printf("Speed:\n%3d%%\n\r", speedPercent);
                        break;
                    case RST:
                        pc.printf("Exit Button\n\r");
                        state = BOOT;
                        break;
                    case FRC_UP:

                        if(forceThresh+FORCE_INC<=1)
                            forceThresh+=FORCE_INC;
                        lcd.cls();
                        lcd.printf("Force threshold:\n%f pounds\n", (forceThresh*200.0f)/4.44822162f);
                        pc.printf("Force threshold:\n\r%f pounds\n\r", (forceThresh*200.0f)/4.44822162f);
                        break;
                    case FRC_DN:
                        if(forceThresh-FORCE_INC>0)
                            forceThresh-=FORCE_INC;
                        lcd.cls();
                        lcd.printf("Force threshold:\n%f pounds\n", (forceThresh*200.0f)/4.44822162f);
                        pc.printf("Force threshold:\n\r%f pounds\n\r", (forceThresh*200.0f)/4.44822162f);
                        break;
                    default:
                        pc.printf("Unknown Button: %d\n\r", myButton);
                        break;
                }
                break;
            case CLOSE_DOOR:
                lcd.cls();
                lcd.printf("GET OUT\n");
                pc.printf("CLOSING DOOR\n\r");
                state = CHECK_IR;
                break;
            case CHECK_IR:
                pc.printf("CHECKING FOR CANCEL SIGNAL\n\r");
                if(IRListen()==-1)
                    held = false;
                else if(!held) {
                    pc.printf("CANCEL SIGNAL RECEIVED\n\r");
                    state = RESET;
                    break;
                }
                state = CHECK_FORCE;
                break;
            case CHECK_FORCE:
                force = doorForce;
                pc.printf("CHECKING FORCE: %f\n\r", force);
                if(force<FORCE_MIN)
                    speed = COAST_SPEED;
                else if(force<forceThresh)
                    speed = pushSpeed;
                else {
                    wait(PUSH_TIME);
                    state = RESET;
                    break;
                }
                state = RUN_MOTOR;
                pc.printf("\tNEW SPEED: %f\n\r", speed);
                break;
            case RUN_MOTOR:
                myMotor.speed(DIRECTION*speed);

                state = CHECK_IR;
                break;
            case RESET:
                pc.printf("RETURNING TO IDLE\n\r");
                myMotor.speed(0);
                myMotor.speed(DIRECTION*REVERSE_SPEED);
                state = CHECK_WALL;
                break;
            case CHECK_WALL:
                wall = wallForce;
                if(wall>=WALL_THRESH||IRListen()>=0) {
                    myMotor.speed(0);
                    state = LISTEN;
                    lcd.printf("AND STAY OUT!");
                    pc.printf("WALL DETECTED, ENTERING IDLE STATE\n\r");

                    break;
                }
                pc.printf("CHECKING WALL: %f\n\r", wall);

                break;
            default:
                break;
        }


    }
}