Projekt TINF 7ABELI

Dependencies:   mbed C12832

mAIn_1.cpp

Committer:
markus286
Date:
2018-11-29
Revision:
0:603870fc1af3
Child:
1:125e4981a54c

File content as of revision 0:603870fc1af3:

#include "mbed.h"
#include "C12832.h"

BusOut doLeds(LED1,LED2,LED3,LED4);
InterruptIn  SW1(p14);
InterruptIn  SW2(p15); 
InterruptIn  SW3(p12); 
InterruptIn  SW4(p16); 

Ticker T1;
Timer T2;
volatile float timerValue = 0;
volatile int blinkCount = 0; 

//************** LCD ****************

C12832 lcd(p5, p7, p6, p8, p11);

//************* VARIABLEN ****************

enum State {ST_AUS=0, ST_EIN, ST_TIMEOUT};
State state;

bool pressed1 = false, pressed2 = false;

//************* andere Funktionen ****************

void blink()
{
    blinkCount++;
    
    Led4 = !Led4;
}


//************* EREIGNISSE ****************
 
void rise1(void)
{  
    wait_ms(100); //Entprellung
    pressed1 = true;
    
    timerValue = T2.read();
    T2.reset();
    T2.start();
}

bool CheckFlag1() 
{
    if (pressed1) {
        pressed1=false;
        return true;
        }
    return false;
}

void rise2(void)
{  
    wait_ms(100);
    if(state == ST_EIN) pressed2 = true;
}

bool CheckFlag2() 
{
    if (pressed2) {
        pressed2=false;
        return true;
        }
    return false;
}

//************* STATES ****************

void ST_Aus (void)
{
    //Status auf LCD und Serial
    lcd.cls();      // löscht lcd (clear screen)
    lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
    lcd.printf("State: 1 (Aus)");
    printf("State: 1 (Aus)");
    // entry
    
    // do
    while(true) {
        Led1 = 0;
    
        if(CheckFlag1()) {
            state = ST_EIN;
            
    // exit
            return;
            }
        }
}

void ST_Ein (void)
{
    //Status auf LCD und Serial
    lcd.cls();      // löscht lcd (clear screen)
    lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
    lcd.printf("State: 2 (Ein)");
    printf("State: 2 (Ein)");
    
    // entry
    T1.attach(&blink, 0.3);
    while (true)
    {
      if(blinkCount >= 4) break;
    }
    T1.detach();
    blinkCount = 0;
    
    // do
    while(true) {
        Led1 = 1;
        
    if(CheckFlag1()) {
            state = ST_AUS;
    // exit
            return;
            }
            
    if(CheckFlag2()) {
            state = ST_TIMEOUT;
    // exit
            return;
            }
        }
}

void ST_TimeOut (void)
{
    //Status auf LCD und Serial
    lcd.cls();      // löscht lcd (clear screen)
    lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
    lcd.printf("State: 3 (TimeOut)");
    printf("State: 3 (TimeOut)");
    
    // entry
    
    
    // do
    while(true) {
        lcd.locate(0,12);   // x-position, y-position (x: 0-128; y: 0-32)
        lcd.printf("Time: %f", timerValue);
        printf("Time: %f", timerValue);
           
    // exit
            
            }
}

void ST_Error (void)
{
    //Status auf LCD und Serial
    lcd.cls();      // löscht lcd (clear screen)
    lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
    lcd.printf("State: ERROR!!!");
    printf("State: ERROR!!!");
    return;
}

//************* STATE MACHINE ****************

void stateMachine()
{
    switch (state)
    {
    case ST_AUS: ST_Aus();
        break;
    case ST_EIN: ST_Ein();
        break;
    case ST_TIMEOUT: ST_TimeOut();
        break;
    default: ST_Error();  // sollte nicht auftreten :-)
        break;
    }
}

//************* MAIN ****************
 
int main()
{
    SW1.rise(&rise1);      //.fall(&fall);
    SW2.rise(&rise2);
    state = ST_AUS;
    while(true){
        stateMachine(); 
        }
}

class IsAnEvent : public InterruptIn {
        volatile int16_t _pressed;
        void _RisingISR(); 
    public:
        IsAnEvent() : InterruptIn(p15) {};
        IsAnEvent(PinName pin) : InterruptIn(pin) {
             rise(callback(this, &IsAnEvent::_RisingISR)); 
            _pressed=0; 
        };
        int CheckFlag();
        void InitIsr();
};

void IsAnEvent::InitIsr() { 
    rise(callback(this, &IsAnEvent::_RisingISR)); 
}

void IsAnEvent::_RisingISR() {
    wait_ms(50);
    if( read() )
        _pressed = true;
}
int IsAnEvent::CheckFlag() {
    if( _pressed ) { 
        _pressed = false; 
        return 1; 
    }
    return 0;
}