FSST - Hardwarenahe Programmierung
STM Implementierung mit Klassen
#include "mbed.h" DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); // States //typedef enum {ST_EIN, ST_AUS, ST_ERROR, ST_STATE1} nextState; // alternativ const int ST_EIN = 0; const int ST_AUS = 1; const int ST_ERROR = 2; // ---------------- Event Klasse -------------------------- class SwEvent { InterruptIn _isr; bool _pressed; void _RisingISR(); public: SwEvent(PinName pin) : _isr(pin) { _pressed = false; } int CheckFlag(); // das muss im do-Zweig (while(true) Schleife) ständig abgefragt werden void InitIsr(); }; int SwEvent::CheckFlag() { if( _pressed ) { _pressed = false; return 1; } return 0; } void SwEvent::InitIsr() { _isr.rise(callback(this, &SwEvent::_RisingISR)); } void SwEvent::_RisingISR() { wait_ms(100); _pressed = true; } SwEvent sw1(p14); // Joy Stick Center // ----------------- Stm Klasse ----------------------------- class Stm { public: Stm() { state=ST_AUS; } void Ein(); void Aus(); void Error(); uint8_t state; }; void Stm::Ein(){ while(true) { led1 = 0; if(sw1.CheckFlag()) { state = ST_AUS; return; } } } void Stm::Aus(){ while(true) { led1 = 1; if(sw1.CheckFlag()) { state = ST_EIN; return; } } } void Stm::Error(){ while(1) { led3 = ~led3; wait_ms(200); } } Stm stm; void stateMachine() { printf("state: %d\n", stm.state); switch (stm.state) { case ST_EIN: stm.Ein(); break; case ST_AUS: stm.Aus(); break; default: stm.Error(); break; } } int main() { printf("Hello STM class\n"); sw1.InitIsr(); while(1) { stateMachine(); } }
Aufgaben:
- Teilen Sie obigen Code auf die entsprechenden Include- und Source-Dateien auf. Sie werden wahrscheinlich Initalisierunglisten benötigen.
- Es ist nach dem Start ein Timeout von 3 Sekunden zu implementieren, sodass die LED1 entweder nach drücken der Taste oder nach 3 Sekunden automatisch auf gelöscht wird.