Browse Source

Исправил работу с памятью в обработчие событий.

Vladimir Shilov 5 years ago
parent
commit
946a5628e0
3 changed files with 46 additions and 44 deletions
  1. 9 2
      ReadMe.txt
  2. 35 37
      src/event-system.c
  3. 2 5
      src/main.c

+ 9 - 2
ReadMe.txt

@@ -14,8 +14,9 @@ My Nixie Clock IN-12 / Мои часы на ГРИ ИН-12
 Опять застой.
 Платы собраны и работают.
 
-Были нюансы с анодным питанием - нужен конденсатор на вывод обратной связи MC, 
-! не забыть исправить схему и плату. Был писк дросслей - почти избавился.
+Забыл сделать запитку для ионисторов - пришло паять навесом.
+Были нюансы с анодным питанием - нужен конденсатор на вывод обратной связи MC.
+Был писк дросслей - почти избавился. !!! не забыть исправить схему и плату.
 
 Конденсаторы на кнопках - не дают работать SPI для прошивки.
 Само расположение кнопок - неудачное. Они должны "смотреть" назад, а 
@@ -32,3 +33,9 @@ My Nixie Clock IN-12 / Мои часы на ГРИ ИН-12
 ---
 2019.05.29
 При нажатии на кнопки "1"/"2" должно переключать отображение.
+---
+2019.05.30
+Вчера ничего не заработало.
+
+Сегодня вспомнил, что атмел с памятью работает слегка по другому.
+Упростил таблицу состояний, переписал обработчик - по идее должно работать.

+ 35 - 37
src/event-system.c

@@ -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();

+ 2 - 5
src/main.c

@@ -76,11 +76,6 @@ void main(void) {
       ES_PlaceEvent(evNewSecond);
 
       RTC_ReadTime(&RTC);
-
-      /* Blink dot if show HH:MM */
-      if (ES_GetState() == stShowTime) {
-        RTOS_SetTask(dotOff, 500, 0);
-      }
     }
 
     event = ES_GetEvent();
@@ -169,6 +164,8 @@ static void btnProcess(void) {
 
 void showTime(void) {
   dotOn();
+  RTOS_SetTask(dotOff, 500, 0);
+
   Digit[0] = RTC.Hr >> 4;
   Digit[1] = RTC.Hr & 0x0F;
   Digit[2] = RTC.Min >> 4;