Versie 2 - Vorm state machine aangenomen

Dependencies:   mbed

main.cpp

Committer:
lennartgroen
Date:
2018-03-25
Revision:
0:ec163fd43fec
Child:
1:879991cde999

File content as of revision 0:ec163fd43fec:

/*
Namen: Lennart Groen
Klas: EMT1PSa
Opdracht: MBED - Stoplicht
Samengewerkt met: ...
Datum: 17-03-2018
Inspiratie uit: https://os.mbed.com/users/4180_1/notebook/rgb-leds/
*/

#include <mbed.h>

struct lichtkleur {             // Struct voor beheren LED kleuren van stoplicht
    float val_rood, val_groen, val_blauw;
};

enum State {                    // State machine status
    STATE_ROOD,
    STATE_NZ_GROEN,
    STATE_NZ_ORANJE,
    STATE_OW_GROEN,
    STATE_OW_ORANJE,
};

// Defineren van ledkleuren voor RGB LED - Buiten class omdat dit compiling errors geeft
const lichtkleur rood = { 0.0,1.0,1.0};
const lichtkleur geel = { 0.5,0.0,1.0};
const lichtkleur groen = { 1.0,0.0,1.0};


class stoplicht                 // Class voor object stoplicht
{
public:
    stoplicht(PinName p_rood, PinName p_groen, PinName p_blauw);
    void set_rood();
    void set_geel();
    void set_groen();
private:
    PwmOut pin_rood;
    PwmOut pin_groen;
    PwmOut pin_blauw;
};

int main()
{
    enum State stoplicht_state = STATE_ROOD;    // State machine status wegschrijven

    stoplicht stoplicht_nz(D11, D10, D9);       // defineren stoplicht noord zuid (pin_rood, pin_groen, pin_blauw)
    stoplicht stoplicht_ow(D6, D5, D3);         // defineren stoplicht oost west  (pin_rood, pin_groen, pin_blauw)
    enum State prev_state = STATE_OW_ORANJE;    // bijhouden van vorige state om te bepalen welke stoplicht aan gaat na rood

    Timer timer1;                               // timer voor beheren van tijd interrupt
    timer1.start();

    while(1) {


        switch (stoplicht_state) {
            case STATE_ROOD:
                stoplicht_nz.set_rood();
                stoplicht_ow.set_rood();
                if(prev_state == STATE_OW_ORANJE && timer1.read() >= 1) {
                    stoplicht_state = STATE_NZ_GROEN;
                    timer1.reset();
                } else if(prev_state == STATE_NZ_ORANJE && timer1.read() >= 1) {
                    stoplicht_state = STATE_OW_GROEN;
                    timer1.reset();
                }
                break;
            case STATE_NZ_GROEN:
                stoplicht_nz.set_groen();
                if(timer1.read() >= 5) {
                    stoplicht_state = STATE_NZ_ORANJE;
                    timer1.reset();
                }
                break;
            case STATE_NZ_ORANJE:
                stoplicht_nz.set_geel();
                if(timer1.read() >= 1) {
                    prev_state = STATE_NZ_ORANJE;
                    stoplicht_state = STATE_ROOD;
                    timer1.reset();
                }
                break;
            case STATE_OW_GROEN:
                stoplicht_ow.set_groen();
                if(timer1.read() >= 5) {
                    stoplicht_state = STATE_OW_ORANJE;
                    timer1.reset();
                }
                break;
            case STATE_OW_ORANJE:
                stoplicht_ow.set_geel();
                if(timer1.read() >= 1) {
                    prev_state = STATE_OW_ORANJE;
                    stoplicht_state = STATE_ROOD;
                    timer1.reset();
                }
                break;
            default:
                stoplicht_state = STATE_ROOD;
                break;
        }

    }

}

stoplicht::stoplicht(PinName p_rood, PinName p_groen, PinName p_blauw)
    :pin_rood(p_rood), pin_groen(p_groen), pin_blauw(p_blauw)
{

}

// Functies voor stoplicht class //
void stoplicht::set_groen()
{
    pin_rood = groen.val_rood;
    pin_groen = groen.val_groen;
    pin_blauw = groen.val_blauw;
}


void stoplicht::set_geel()
{
    pin_rood = geel.val_rood;
    pin_groen = geel.val_groen;
    pin_blauw = geel.val_blauw;
}


void stoplicht::set_rood()
{
    pin_rood = rood.val_rood;
    pin_groen = rood.val_groen;
    pin_blauw = rood.val_blauw;
}