|
@@ -21,40 +21,39 @@ static volatile uint8_t countBuf = 0;
|
|
|
static volatile es_state_t _State;
|
|
|
|
|
|
typedef struct {
|
|
|
- es_state_t startState;
|
|
|
- es_state_t endState;
|
|
|
- es_event_t startEvent;
|
|
|
- es_event_t endEvent;
|
|
|
- es_state_t nextstate;
|
|
|
+ es_state_t state;
|
|
|
+ es_event_t event;
|
|
|
+ es_state_t nextState;
|
|
|
void (*pStateFunc1)(void);
|
|
|
void (*pStateFunc2)(void);
|
|
|
} table_state_t;
|
|
|
|
|
|
/** таблица состояний */
|
|
|
-const table_state_t table[] = {
|
|
|
-/* STATE from STATE to EVENT from EVENT to NEXT STATE STATE_FUNC1 STATE_FUNC2 */
|
|
|
+//const table_state_t table[] = {
|
|
|
+const table_state_t stateTable[] PROGMEM = {
|
|
|
+/* STATE EVENT NEXT STATE STATE_FUNC1 STATE_FUNC2 */
|
|
|
/* show date, time */
|
|
|
- {stShowTime, stShowTime, evBTN1Pressed, evBTN1Pressed, stShowMMSS, dotOnPersistent, showMMSS},
|
|
|
- {stShowTime, stShowTime, evBTN2Pressed, evBTN2Pressed, stShowYear, showYear, EmptyFunc},
|
|
|
- {stShowMMSS, stShowMMSS, evBTN1Pressed, evBTN1Pressed, stShowWDay, showWDay, EmptyFunc},
|
|
|
- {stShowMMSS, stShowMMSS, evBTN2Pressed, evBTN2Pressed, stShowTime, showTime, EmptyFunc},
|
|
|
- {stShowWDay, stShowWDay, evBTN1Pressed, evBTN1Pressed, stShowMDay, showMDay, EmptyFunc},
|
|
|
- {stShowWDay, stShowWDay, evBTN2Pressed, evBTN2Pressed, stShowMMSS, dotOnPersistent, showMMSS},
|
|
|
- {stShowMDay, stShowMDay, evBTN1Pressed, evBTN1Pressed, stShowMon, showMonth, EmptyFunc},
|
|
|
- {stShowMDay, stShowMDay, evBTN2Pressed, evBTN2Pressed, stShowWDay, showWDay, EmptyFunc},
|
|
|
- {stShowMon, stShowMon, evBTN1Pressed, evBTN1Pressed, stShowYear, showYear, EmptyFunc},
|
|
|
- {stShowMon, stShowMon, evBTN2Pressed, evBTN2Pressed, stShowMDay, showMDay, EmptyFunc},
|
|
|
- {stShowYear, stShowYear, evBTN1Pressed, evBTN1Pressed, stShowTime, showTime, EmptyFunc},
|
|
|
- {stShowYear, stShowYear, evBTN2Pressed, evBTN2Pressed, stShowMon, showMonth, EmptyFunc},
|
|
|
+ {stShowTime, evBTN1Pressed, stShowMMSS, dotOnPersistent, showMMSS},
|
|
|
+ {stShowTime, evBTN2Pressed, stShowYear, showYear, NULL},
|
|
|
+ {stShowMMSS, evBTN1Pressed, stShowWDay, showWDay, NULL},
|
|
|
+ {stShowMMSS, evBTN2Pressed, stShowTime, showTime, NULL},
|
|
|
+ {stShowWDay, evBTN1Pressed, stShowMDay, showMDay, NULL},
|
|
|
+ {stShowWDay, evBTN2Pressed, stShowMMSS, dotOnPersistent, showMMSS},
|
|
|
+ {stShowMDay, evBTN1Pressed, stShowMon, showMonth, NULL},
|
|
|
+ {stShowMDay, evBTN2Pressed, stShowWDay, showWDay, NULL},
|
|
|
+ {stShowMon, evBTN1Pressed, stShowYear, showYear, NULL},
|
|
|
+ {stShowMon, evBTN2Pressed, stShowMDay, showMDay, NULL},
|
|
|
+ {stShowYear, evBTN1Pressed, stShowTime, showTime, NULL},
|
|
|
+ {stShowYear, evBTN2Pressed, stShowMon, showMonth, NULL},
|
|
|
/* Refresh output */
|
|
|
- {stShowTime, stShowTime, evNewSecond, evNewSecond, stNoChange, showTime, EmptyFunc},
|
|
|
- {stShowMMSS, stShowMMSS, evNewSecond, evNewSecond, stNoChange, showMMSS, EmptyFunc},
|
|
|
- {stShowWDay, stShowWDay, evNewSecond, evNewSecond, stNoChange, showWDay, EmptyFunc},
|
|
|
- {stShowMDay, stShowMDay, evNewSecond, evNewSecond, stNoChange, showMDay, EmptyFunc},
|
|
|
- {stShowMon, stShowMon, evNewSecond, evNewSecond, stNoChange, showMonth, EmptyFunc},
|
|
|
- {stShowYear, stShowYear, evNewSecond, evNewSecond, stNoChange, showYear, EmptyFunc},
|
|
|
+ {stShowTime, evNewSecond, stNoChange, showTime, NULL},
|
|
|
+ {stShowMMSS, evNewSecond, stNoChange, showMMSS, NULL},
|
|
|
+ {stShowWDay, evNewSecond, stNoChange, showWDay, NULL},
|
|
|
+ {stShowMDay, evNewSecond, stNoChange, showMDay, NULL},
|
|
|
+ {stShowMon, evNewSecond, stNoChange, showMonth, NULL},
|
|
|
+ {stShowYear, evNewSecond, stNoChange, showYear, NULL},
|
|
|
/* обязательная пустая строка таблицы */
|
|
|
- {stNoChange, stNoChange, eventNull, eventNull, stNoChange, EmptyFunc, EmptyFunc}
|
|
|
+ {stNoChange, eventNull, stNoChange, EmptyFunc, EmptyFunc}
|
|
|
};
|
|
|
|
|
|
/**
|
|
@@ -124,28 +123,27 @@ static void EmptyFunc(void)
|
|
|
*/
|
|
|
void ES_Dispatch(es_event_t event)
|
|
|
{
|
|
|
+ uint8_t i;
|
|
|
void (*pStateFunc1)(void);
|
|
|
void (*pStateFunc2)(void);
|
|
|
- uint8_t i;
|
|
|
|
|
|
pStateFunc1 = NULL;
|
|
|
pStateFunc2 = NULL;
|
|
|
|
|
|
/* определяем следующее состояние */
|
|
|
- for (i=0; prb(table[i].startEvent) || prb(table[i].endEvent); i++)
|
|
|
+ for (i=0; prb(stateTable[i].state); i++)
|
|
|
{
|
|
|
- /* если текущее состояние попадает в диапазон */
|
|
|
- if ( (_State >= prb(table[i].startState)) && (_State <= prb(table[i].endState)) ) {
|
|
|
- /* если поступившее событие попадает в диапазон */
|
|
|
- if((event >= prb(table[i].startEvent)) && (event <= prb(table[i].endEvent)) ) {
|
|
|
+ /* если совпадают текущее состояние и поступившее событие */
|
|
|
+ if (prb(stateTable[i].state) == _State && prb(stateTable[i].event) == event)
|
|
|
+ {
|
|
|
/* меняем состояние если требуется */
|
|
|
- if (prb(table[i].nextstate) != stNoChange) {
|
|
|
- _State = prb(table[i].nextstate);
|
|
|
+ if (prb(stateTable[i].nextState) != stNoChange) {
|
|
|
+ _State = prb(stateTable[i].nextState);
|
|
|
}
|
|
|
- pStateFunc1 = (void *)prw(table[i].pStateFunc1);
|
|
|
- pStateFunc2 = (void *)prw(table[i].pStateFunc2);
|
|
|
+ /* получаем адреса функций */
|
|
|
+ pStateFunc1 = (void *)prw(stateTable[i].pStateFunc1);
|
|
|
+ pStateFunc2 = (void *)prw(stateTable[i].pStateFunc2);
|
|
|
break;
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
if (pStateFunc1) pStateFunc1();
|