Oliver Ainhirn
/
85_Event_State
erweitert um RGB LED
main.cpp
- Committer:
- corsa1600
- Date:
- 2019-04-02
- Revision:
- 1:dc7c5869f9e1
- Parent:
- 0:f0345f20337e
File content as of revision 1:dc7c5869f9e1:
#include "mbed.h" DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut red(p23); DigitalOut green(p24); DigitalOut blue(p25); class StopLight { private: Timer t1; //mein Timer EventQueue _queue; int _pending; enum state { RED, GREEN, YELLOW,GREENBLINK }; // The _step function is a traditional FSM which enqueues transitions onto the event queue void _step(state transition) { switch (transition) { case RED: set_red(); _pending = _queue.call_in(1000, this, &StopLight::_step, GREEN); break; case GREEN: set_green(); _pending = _queue.call_in(1000, this, &StopLight::_step, GREENBLINK); break; case GREENBLINK: set_greenBlink(); _pending = _queue.call_in(3000, this, &StopLight::_step, YELLOW); break; case YELLOW: set_yellow(); _pending = _queue.call_in(500, this, &StopLight::_step, RED); break; } } void set_red() { red = 0; green = 1; blue = 1; } void set_green() { red = 1; green = 0; blue = 1; } void set_greenBlink() { t1.start(); // ich starte meinen Timer //red = 1; green = 1; blue = 1; if(t1.read_ms()>200) // erst wenn 10Hz { if(green=1) { red = 1; green = 1; blue = 1; } else { red = 1; green = 0; blue = 1; } t1.reset(); // ich resete meinen Timer } if ( green=0) green=1; else green=0; } void set_yellow() { red = 0; green = 0; blue = 1; /* wait_ms(150); red = 1; green = 1; blue = 1; wait_ms(150); red = 0; green = 0; blue = 1; wait_ms(150); red = 1; green = 1; blue = 1; */ } public: // The fire function can immediately change states in the FSM void fire() { _queue.cancel(_pending); _queue.call(this, &StopLight::_step, GREEN); _queue.dispatch(); } }; StopLight sl; int main (void) { sl.fire(); wait(osWaitForever); }