Browse Source

Лёд тронулся...

Vladimir N. Shilov 6 years ago
parent
commit
be502b5a19
6 changed files with 115 additions and 84 deletions
  1. 1 0
      inc/event-system.h
  2. 2 1
      inc/list_event.h
  3. 3 0
      inc/main.h
  4. 15 16
      src/event-system.c
  5. 36 16
      src/main.c
  6. 58 51
      src/rtos.c

+ 1 - 0
inc/event-system.h

@@ -30,6 +30,7 @@ void ES_Dispatch(es_event_t event);     /* вызов диспетчера */
  * ES function prototypes
  * ES function prototypes
  */
  */
 void dotOnPersistent(void);
 void dotOnPersistent(void);
+void dotOff(void);
 void showTime(void);
 void showTime(void);
 void showMMSS(void);
 void showMMSS(void);
 void showWDay(void);
 void showWDay(void);

+ 2 - 1
inc/list_event.h

@@ -12,7 +12,8 @@ typedef enum {
   evBTN1Holded,
   evBTN1Holded,
   evBTN2Holded,
   evBTN2Holded,
   evBTN3Holded,
   evBTN3Holded,
-  evMenuWDT
+  evDisplayWDT,
+  evRefreshCal
 } es_event_t;
 } es_event_t;
 
 
 /* коды состояний */
 /* коды состояний */

+ 3 - 0
inc/main.h

@@ -61,6 +61,9 @@
 #define ANOD4           _BV(PD7)
 #define ANOD4           _BV(PD7)
 #define ANOD_PINS       (ANOD1 | ANOD2 | ANOD3 | ANOD4)
 #define ANOD_PINS       (ANOD1 | ANOD2 | ANOD3 | ANOD4)
 
 
+/* Display timeout, sec */
+#define DISP_WDT_TIME   10
+
 
 
 typedef struct {
 typedef struct {
   uint8_t     time;
   uint8_t     time;

+ 15 - 16
src/event-system.c

@@ -34,24 +34,23 @@ const table_state_t stateTable[] PROGMEM = {
 /* STATE    EVENT   NEXT STATE  STATE_FUNC1 STATE_FUNC2 */
 /* STATE    EVENT   NEXT STATE  STATE_FUNC1 STATE_FUNC2 */
   /* show date, time */
   /* show date, time */
   {stShowTime, evBTN1Pressed, stShowMMSS, dotOnPersistent, showMMSS},
   {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},
+  {stShowMMSS, evBTN1Pressed, stShowWDay, showWDay, dotOff},
+  {stShowWDay, evBTN1Pressed, stShowMDay, showMDay, dotOff},
+  {stShowMDay, evBTN1Pressed, stShowMon,  showMonth, dotOff},
+  {stShowMon,  evBTN1Pressed, stShowYear, showYear, dotOff},
   {stShowYear, evBTN1Pressed, stShowTime, showTime, NULL},
   {stShowYear, evBTN1Pressed, stShowTime, showTime, NULL},
-  {stShowYear, evBTN2Pressed, stShowMon,  showMonth, NULL},
+  /* display wdt */
+  {stShowWDay, evDisplayWDT, stShowTime, showTime, NULL},
+  {stShowMDay, evDisplayWDT, stShowTime, showTime, NULL},
+  {stShowMon,  evDisplayWDT, stShowTime, showTime, NULL},
+  {stShowYear, evDisplayWDT, stShowTime, showTime, NULL},
   /* Refresh output */
   /* Refresh output */
-  {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},
+  {stShowTime, evNewSecond,  stNoChange, showTime, NULL},
+  {stShowMMSS, evNewSecond,  stNoChange, showMMSS, NULL},
+  {stShowWDay, evRefreshCal, stNoChange, showWDay, NULL},
+  {stShowMDay, evRefreshCal, stNoChange, showMDay, NULL},
+  {stShowMon,  evRefreshCal, stNoChange, showMonth, NULL},
+  {stShowYear, evRefreshCal, stNoChange, showYear, NULL},
   /* обязательная пустая строка таблицы */
   /* обязательная пустая строка таблицы */
   {stNoChange, eventNull, stNoChange, EmptyFunc, EmptyFunc}
   {stNoChange, eventNull, stNoChange, EmptyFunc, EmptyFunc}
 };
 };

+ 36 - 16
src/main.c

@@ -35,12 +35,12 @@ static btn_t Button[BTN_NUM] = {
   {0, evBTN2Pressed, evBTN2Holded, BUTTON2_PIN},
   {0, evBTN2Pressed, evBTN2Holded, BUTTON2_PIN},
   {0, evBTN3Pressed, evBTN3Holded, BUTTON3_PIN}
   {0, evBTN3Pressed, evBTN3Holded, BUTTON3_PIN}
 };
 };
+static volatile uint8_t DISP_WDT = 0;
 
 
 /* Constants */
 /* Constants */
 /* Function prototypes */
 /* Function prototypes */
 static void Board_Init(void);
 static void Board_Init(void);
 static void dotOn(void);
 static void dotOn(void);
-static void dotOff(void);
 static void btnProcess(void);
 static void btnProcess(void);
 
 
 void main(void) {
 void main(void) {
@@ -55,19 +55,20 @@ void main(void) {
    */
    */
   Board_Init();
   Board_Init();
 
 
-  // Initialize Scheduler
+  /* Initialize Scheduler */
   RTOS_Init();
   RTOS_Init();
 
 
-  // Initialize I2C Bus and RTC
+  /* Initialize I2C Bus and RTC */
   I2C_Init();
   I2C_Init();
   RTC_Init();
   RTC_Init();
   RTC_ReadAll(&RTC);
   RTC_ReadAll(&RTC);
 
 
-  // Initialize Event State Machine
+  /* Initialize Event State Machine */
   ES_Init(stShowTime);
   ES_Init(stShowTime);
+
   showTime();
   showTime();
 
 
-  RTOS_SetTask(btnProcess, 10, 10);
+  RTOS_SetTask(btnProcess, 5, 10);
 
 
   /** main loop */
   /** main loop */
   do {
   do {
@@ -76,11 +77,22 @@ void main(void) {
       ES_PlaceEvent(evNewSecond);
       ES_PlaceEvent(evNewSecond);
 
 
       RTC_ReadTime(&RTC);
       RTC_ReadTime(&RTC);
+      if (RTC.Sec == 0 && RTC.Min == 0 && RTC.Hr == 0) {
+        RTC_ReadCalendar(&RTC);
+        ES_PlaceEvent(evRefreshCal);
+      }
+
+      if (DISP_WDT != 0) {
+        DISP_WDT --;
+        if (DISP_WDT == 0) {
+          ES_PlaceEvent(evDisplayWDT);
+        }
+      }
     }
     }
 
 
     event = ES_GetEvent();
     event = ES_GetEvent();
     if (event) {
     if (event) {
-      //ES_Dispatch(event);
+      ES_Dispatch(event);
     }
     }
 
 
     // крутим диспетчер
     // крутим диспетчер
@@ -126,8 +138,8 @@ static void dotOn(void) {
   PORTD |= DOT_PIN;
   PORTD |= DOT_PIN;
 }
 }
 
 
-static void dotOff(void) {
-  //PORTD &= ~(DOT_PIN);
+void dotOff(void) {
+  PORTD &= ~(DOT_PIN);
 }
 }
 
 
 void dotOnPersistent(void) {
 void dotOnPersistent(void) {
@@ -180,7 +192,7 @@ void showMMSS(void) {
 }
 }
 
 
 void showWDay(void) {
 void showWDay(void) {
-  PORTD &= ~(DOT_PIN);
+  DISP_WDT = DISP_WDT_TIME;
   Digit[0] = DIGIT_BLANK;
   Digit[0] = DIGIT_BLANK;
   Digit[1] = DIGIT_BLANK;
   Digit[1] = DIGIT_BLANK;
   Digit[2] = RTC.WD & 0x0F;
   Digit[2] = RTC.WD & 0x0F;
@@ -188,7 +200,7 @@ void showWDay(void) {
 }
 }
 
 
 void showMDay(void) {
 void showMDay(void) {
-  PORTD &= ~(DOT_PIN);
+  DISP_WDT = DISP_WDT_TIME;
   Digit[0] = RTC.Day >> 4;
   Digit[0] = RTC.Day >> 4;
   Digit[1] = RTC.Day & 0x0F;
   Digit[1] = RTC.Day & 0x0F;
   Digit[2] = DIGIT_BLANK;
   Digit[2] = DIGIT_BLANK;
@@ -196,7 +208,7 @@ void showMDay(void) {
 }
 }
 
 
 void showMonth(void) {
 void showMonth(void) {
-  PORTD &= ~(DOT_PIN);
+  DISP_WDT = DISP_WDT_TIME;
   Digit[0] = DIGIT_BLANK;
   Digit[0] = DIGIT_BLANK;
   Digit[1] = DIGIT_BLANK;
   Digit[1] = DIGIT_BLANK;
   Digit[2] = RTC.Mon >> 4;
   Digit[2] = RTC.Mon >> 4;
@@ -204,7 +216,7 @@ void showMonth(void) {
 }
 }
 
 
 void showYear(void) {
 void showYear(void) {
-  PORTD &= ~(DOT_PIN);
+  DISP_WDT = DISP_WDT_TIME;
   Digit[0] = 0x02;
   Digit[0] = 0x02;
   Digit[1] = 0x00;
   Digit[1] = 0x00;
   Digit[2] = RTC.Year >> 4;
   Digit[2] = RTC.Year >> 4;
@@ -246,25 +258,33 @@ ISR(TIMER2_OVF_vect) {
     // output lamp value
     // output lamp value
     PORTC = pc | Digit[0];
     PORTC = pc | Digit[0];
     // power on lamp
     // power on lamp
-    PORTD = pd | ANOD1;
+    if (Digit[0] != DIGIT_BLANK) {
+      PORTD = pd | ANOD1;
+    }
     idx = 1;
     idx = 1;
     break;
     break;
 
 
   case 1:
   case 1:
     PORTC = pc | Digit[1];
     PORTC = pc | Digit[1];
-    PORTD = pd | ANOD2;
+    if (Digit[1] != DIGIT_BLANK) {
+      PORTD = pd | ANOD2;
+    }
     idx = 2;
     idx = 2;
     break;
     break;
 
 
   case 2:
   case 2:
     PORTC = pc | Digit[2];
     PORTC = pc | Digit[2];
-    PORTD = pd | ANOD3;
+    if (Digit[2] != DIGIT_BLANK) {
+      PORTD = pd | ANOD3;
+    }
     idx = 3;
     idx = 3;
     break;
     break;
 
 
   case 3:
   case 3:
     PORTC = pc | Digit[3];
     PORTC = pc | Digit[3];
-    PORTD = pd | ANOD4;
+    if (Digit[3] != DIGIT_BLANK) {
+      PORTD = pd | ANOD4;
+    }
     idx = 0;
     idx = 0;
     break;
     break;
 
 

+ 58 - 51
src/rtos.c

@@ -13,6 +13,7 @@ static volatile uint8_t saveRegister;
  */
  */
 static volatile task TaskArray[MAX_TASKS]; // очередь задач
 static volatile task TaskArray[MAX_TASKS]; // очередь задач
 static volatile uint8_t arrayTail;         // "хвост" очереди
 static volatile uint8_t arrayTail;         // "хвост" очереди
+
 // внешние переменные
 // внешние переменные
 extern uint8_t TWI_WDT;
 extern uint8_t TWI_WDT;
 
 
@@ -22,8 +23,7 @@ static volatile uint16_t TDelay;
 /*
 /*
  * Инициализация РТОС и t_delay, время тика - 1 мс
  * Инициализация РТОС и t_delay, время тика - 1 мс
  */
  */
-inline void RTOS_Init()
-{
+inline void RTOS_Init(void) {
   // настраиваем основной таймер
   // настраиваем основной таймер
   TIMER_TCCR = TIMER_CSB;
   TIMER_TCCR = TIMER_CSB;
   TIMER_TCNT = TIMER_CNT;
   TIMER_TCNT = TIMER_CNT;
@@ -36,15 +36,17 @@ inline void RTOS_Init()
 /*
 /*
  * Добавление задачи в список
  * Добавление задачи в список
  */
  */
-void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeriod)
-{
+void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeriod) {
    uint8_t i;
    uint8_t i;
 
 
-   if(!taskFunc) return;
-   for(i = 0; i < arrayTail; i++)                     // поиск задачи в текущем списке
-   {
-      if(TaskArray[i].pFunc == taskFunc)              // если нашли, то обновляем переменные
-      {
+   if (!taskFunc) {
+    return;
+   }
+
+   // поиск задачи в текущем списке
+   for(i = 0; i < arrayTail; i++) {
+      // если нашли, то обновляем переменные
+      if (TaskArray[i].pFunc == taskFunc) {
          DISABLE_INTERRUPT;
          DISABLE_INTERRUPT;
 
 
          TaskArray[i].delay  = taskDelay;
          TaskArray[i].delay  = taskDelay;
@@ -52,12 +54,14 @@ void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeri
          TaskArray[i].run    = 0;
          TaskArray[i].run    = 0;
 
 
          RESTORE_INTERRUPT;
          RESTORE_INTERRUPT;
-         return;                                      // обновив, выходим
+         // обновив, выходим
+         return;
       }
       }
    }
    }
 
 
-   if (arrayTail < MAX_TASKS)                         // если такой задачи в списке нет
-   {                                                  // и есть место,то добавляем
+   // если такой задачи в списке нет
+   if (arrayTail < MAX_TASKS) {
+      // и есть место, то добавляем
       DISABLE_INTERRUPT;
       DISABLE_INTERRUPT;
 
 
       TaskArray[arrayTail].pFunc  = taskFunc;
       TaskArray[arrayTail].pFunc  = taskFunc;
@@ -65,29 +69,32 @@ void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeri
       TaskArray[arrayTail].period = taskPeriod;
       TaskArray[arrayTail].period = taskPeriod;
       TaskArray[arrayTail].run    = 0;
       TaskArray[arrayTail].run    = 0;
 
 
-      arrayTail++;                                    // увеличиваем "хвост"
+      // увеличиваем "хвост"
+      arrayTail++;
       RESTORE_INTERRUPT;
       RESTORE_INTERRUPT;
+   } else {
+     while(1);
    }
    }
 }
 }
 
 
 /*
 /*
  * Удаление задачи из списка
  * Удаление задачи из списка
  */
  */
-inline void RTOS_DeleteTask (void (*taskFunc)(void))
-{
+inline void RTOS_DeleteTask (void (*taskFunc)(void)) {
    uint8_t i;
    uint8_t i;
 
 
-   for (i=0; i<arrayTail; i++)                        // проходим по списку задач
-   {
-      if(TaskArray[i].pFunc == taskFunc)              // если задача в списке найдена
-      {
-
+   // проходим по списку задач
+   for (i=0; i<arrayTail; i++) {
+      // если задача в списке найдена
+      if (TaskArray[i].pFunc == taskFunc) {
          DISABLE_INTERRUPT;
          DISABLE_INTERRUPT;
-         if(i != (arrayTail - 1))                     // переносим последнюю задачу
-         {                                            // на место удаляемой
+         // переносим последнюю задачу
+         if (i != (arrayTail - 1)) {
+            // на место удаляемой
             TaskArray[i] = TaskArray[arrayTail - 1];
             TaskArray[i] = TaskArray[arrayTail - 1];
          }
          }
-         arrayTail--;                                 // уменьшаем указатель "хвоста"
+         // уменьшаем указатель "хвоста"
+         arrayTail--;
          RESTORE_INTERRUPT;
          RESTORE_INTERRUPT;
          return;
          return;
       }
       }
@@ -97,31 +104,30 @@ inline void RTOS_DeleteTask (void (*taskFunc)(void))
 /*
 /*
  * Диспетчер РТОС, вызывается в main
  * Диспетчер РТОС, вызывается в main
  */
  */
-
-void RTOS_DispatchTask(void)
-{
+void RTOS_DispatchTask(void) {
    uint8_t i;
    uint8_t i;
    void (*function) (void);
    void (*function) (void);
-   for (i=0; i<arrayTail; i++)                        // проходим по списку задач
-   {
-      if (TaskArray[i].run == 1)                      // если флаг на выполнение взведен,
-      {                                               // запоминаем задачу, т.к. во
-         function = TaskArray[i].pFunc;               // время выполнения может
-                                                      // измениться индекс
-         if(TaskArray[i].period == 0)
-         {                                            // если период равен 0
-            RTOS_DeleteTask(TaskArray[i].pFunc);      // удаляем задачу из списка,
-
-         }
-         else
-         {
-            TaskArray[i].run = 0;                     // иначе снимаем флаг запуска
-            if(!TaskArray[i].delay)                   // если задача не изменила задержку
-            {                                         // задаем ее
-               TaskArray[i].delay = TaskArray[i].period-1;
-            }                                         // задача для себя может сделать паузу
-         }
-         (*function)();                               // выполняем задачу
+   // проходим по списку задач
+   for (i=0; i<arrayTail; i++) {
+      // если флаг на выполнение взведен,
+      if (TaskArray[i].run != 0) {
+        // запоминаем задачу, т.к. во время выполнения может измениться индекс
+        function = TaskArray[i].pFunc;
+        if (TaskArray[i].period == 0) {
+          // если период равен 0, удаляем задачу из списка,
+          RTOS_DeleteTask(TaskArray[i].pFunc);
+        } else {
+          // иначе снимаем флаг запуска
+          TaskArray[i].run = 0;
+          // если задача не изменила задержку
+          if (!TaskArray[i].delay) {
+            // задаем ее
+            TaskArray[i].delay = TaskArray[i].period-1;
+            // задача для себя может сделать паузу
+          }
+        }
+        // выполняем задачу
+        (*function)();
       }
       }
    }
    }
 }
 }
@@ -135,11 +141,13 @@ void tdelay_ms(uint16_t msek) {
   TDelay = msek;
   TDelay = msek;
 
 
   do {
   do {
-    RTOS_DispatchTask();
+    if (TDelay > 1) {
+      RTOS_DispatchTask();
+    }
     // делать нехрен -- спим, ждём прерывание
     // делать нехрен -- спим, ждём прерывание
     set_sleep_mode(SLEEP_MODE_IDLE);
     set_sleep_mode(SLEEP_MODE_IDLE);
     sleep_mode();
     sleep_mode();
-  } while (TDelay>0);
+  } while (TDelay != 0);
 
 
 }
 }
 
 
@@ -153,7 +161,6 @@ ISR(TIMER_OVF_VECT) {
 
 
   /* RTOS_Timer */
   /* RTOS_Timer */
   uint8_t i;
   uint8_t i;
-
   // проходим по списку задач
   // проходим по списку задач
   for (i=0; i<arrayTail; i++) {
   for (i=0; i<arrayTail; i++) {
     // если время до выполнения истекло
     // если время до выполнения истекло
@@ -167,11 +174,11 @@ ISR(TIMER_OVF_VECT) {
   }
   }
 
 
   /* TDelay_Timer -- уменьшим счётчик */
   /* TDelay_Timer -- уменьшим счётчик */
-  if (TDelay > 0) {
+  if (TDelay != 0) {
     TDelay --;
     TDelay --;
   }
   }
 
 
-  if (TWI_WDT > 0) {
+  if (TWI_WDT != 0) {
     TWI_WDT --;
     TWI_WDT --;
   }
   }