diff --git a/main.cpp b/main.cpp index 53bd9a8..4f1f318 100644 --- a/main.cpp +++ b/main.cpp @@ -19,14 +19,8 @@ using namespace std; //#include "drv_systick.h" #include // kvuli typu bool -// Vyber verze kodu. -// 1. stav blikani a nesviti; kontrola tlacitka vzdy az po bliknuti vsech LED. -// 2. kontrola tlacitka po bliknuti kazde LED. -// 3. nepouziva se delay - polling casu. -// 4. rozdeleni kodu na ulohy - tasky. -#define VERSION 1 -// Spolecne definice + #define SWITCH_PRESSED (1) #define SWITCH_NOT_PRESSED (0) @@ -42,211 +36,6 @@ int switch1_read(void); void delay_debounce(void); void LED_control(bool d1, bool d2, bool d3); -/////////////////////////////////////////////////////////////////////////////////////// -// Kod programu v nekolika verzich. -// Aktivni verze se vybere pomoci #define VERSION nahore. -#if VERSION == 1 -// Verze 1 -// Odezva je spatna, protoze stav tlacitka se testuje az po bliknuti vsech LED. -// Pri uvolneni tlacitka program zareaguje az na konci celeho efektu, kdyz zhasne -// treti LED a prvni uz se nerozsviti. - -// Stavy programu -#define ST_EFFECT 1 -#define ST_OFF 2 - -int state = ST_OFF; - - -int main(void) { - // inicializace ovladace pinu a delay - init(); - - while (1) { - if (switch1_read() == SWITCH_PRESSED) - state = ST_EFFECT; - else - state = ST_OFF; - - switch (state) { - case ST_OFF: - LED_control(false, false, false); - break; - - case ST_EFFECT: - LED_control(true, false, false); - SYSTICK_delay_ms(BLINK_DELAY); - LED_control(false, true, false); - SYSTICK_delay_ms(BLINK_DELAY); - LED_control(false, false, true); - SYSTICK_delay_ms(BLINK_DELAY); - break; - } // switch - - } // while - - /* Never leave main */ - return 0; -} - -////////////////////////////////////////////////////////////////////////////////// - -#elif VERSION == 2 -// Verze 2 -// Odezva je vylepsena tim, ze kontrola tlacitka probiha po bliknuti kazde LED. -// Po uvolneni tlacitka pak LED sice "dosviti" svou dobu svitu, -// ale dalsi LED uz se nerozsviti. - -// Stavy programu -#define ST_LED1_ON 1 -#define ST_LED2_ON 2 -#define ST_LED3_ON 3 -#define ST_OFF 4 - -int state = ST_OFF; - -int main(void) { - // inicializace ovladace pinu a delay - init(); - - while (1) { - if (switch1_read() == SWITCH_PRESSED) { - // Jen pokud je stisknuto tlacitko a soucasny stav je vypnuto, - // prejdeme na stav rozsviceni prvni LED, jinak uz nektera LED - // sviti a stavy se meni ve switch. - if ( state == ST_OFF ) - state = ST_LED1_ON; - } - else - state = ST_OFF; - - switch (state) { - - case ST_OFF: - LED_control(false, false, false); - break; - - case ST_LED1_ON: - // Bliknout LED1 a prejit na stav dalsi LED2 - LED_control(true, false, false); - SYSTICK_delay_ms(BLINK_DELAY); - state = ST_LED2_ON; - break; - - case ST_LED2_ON: - LED_control(false, true, false); - SYSTICK_delay_ms(BLINK_DELAY); - state = ST_LED3_ON; - break; - - case ST_LED3_ON: - LED_control(false, false, true); - SYSTICK_delay_ms(BLINK_DELAY); - state = ST_LED1_ON; - break; - } // switch - - } // while - - /* Never leave main */ - return 0; -} -////////////////////////////////////////////////////////////////////////////////// - -#elif VERSION == 3 -// Verze 3 -// Odezva je vylepsena tim, ze se nepouziva cekani (busy waiting) ale zjistuje se -// zda uz ubehl potrebny cas - jde o tzv. polling - dotazovani. -// Diky tomu LED zhasne okamzite po uvolneni tlacitka. - -// Stavy programu -#define ST_LED1_ON 1 -#define ST_LED2_ON 2 -#define ST_LED3_ON 3 -#define ST_OFF 4 -#define ST_LED1_WAIT 5 -#define ST_LED2_WAIT 6 -#define ST_LED3_WAIT 7 - -int state = ST_OFF; - -int main(void) { - // inicializace ovladace pinu a delay - init(); - - uint32_t waitStart; // cas, kdy se rozvitila LED - uint32_t currentTime; // aktualni cas, pomocna promenna - - while (1) { - - if (switch1_read() == SWITCH_PRESSED) { - // Jen pokud je stisknuto tlacitko a soucasny stav je vypnuto, - // prejdeme na stav rozsviceni prvni LED, jinak uz nektera LED - // sviti a stavy se meni ve switch. - if ( state == ST_OFF ) - state = ST_LED1_ON; - } - else - state = ST_OFF; - - switch (state) { - - case ST_OFF: - LED_control(false, false, false); - break; - - case ST_LED1_ON: - // Rozsvitit LED, ulozit aktualni cas a prejit do stavu cekani na - // uplynuti casu svitu teto LED. - LED_control(true, false, false); - waitStart = SYSTICK_millis(); - state = ST_LED1_WAIT; - break; - - case ST_LED1_WAIT: - // Kontrola jestli uz ubehlo dost casu abychom rozsvitili dalsi LED - // a pokud ano, prechod na dalsi stav - currentTime = SYSTICK_millis(); - if ( currentTime - waitStart >= BLINK_DELAY ) - state = ST_LED2_ON; - break; - - - case ST_LED2_ON: - LED_control(false, true, false); - waitStart = SYSTICK_millis(); - state = ST_LED2_WAIT; - break; - - case ST_LED2_WAIT: - currentTime = SYSTICK_millis(); - if ( currentTime - waitStart >= BLINK_DELAY ) - state = ST_LED3_ON; - break; - - case ST_LED3_ON: - LED_control(false, false, true); - waitStart = SYSTICK_millis(); - state = ST_LED3_WAIT; - break; - - case ST_LED3_WAIT: - currentTime = SYSTICK_millis(); - if ( currentTime - waitStart >= BLINK_DELAY ) - state = ST_LED1_ON; - break; - - } // switch - - } // while - - /* Never leave main */ - return 0; -} - -////////////////////////////////////////////////////////////////////////////////// - -#elif VERSION == 4 // Verze 4 // Program je vylepsen rozdelenim na jednotlive ulohy - tasky. // Z pohledu odezvy je chovani stejne jako u verze 3, ale struktura programu je @@ -409,12 +198,7 @@ void TaskGreenLed() { } } - -////////////////////////////////////////////////////////////////////////////////// -#endif /* VERSION == 4*/ - -///////////////////////////////////////////////////////// -// Pomocne funkce spolecne pro vsechny verze +// Pomocne funkce // inicializace void init()