Markus Höbel
/
TINF_Test_STM_Hoebel
Projekt TINF 7ABELI
Diff: mAIn_1.cpp
- Revision:
- 0:603870fc1af3
- Child:
- 1:125e4981a54c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mAIn_1.cpp Thu Nov 29 17:15:55 2018 +0000 @@ -0,0 +1,221 @@ +#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; +} + \ No newline at end of file