Browse Source

Настройка времени.

Vladimir Shilov 6 years ago
parent
commit
9808f2ad6f
4 changed files with 142 additions and 9 deletions
  1. 10 0
      inc/event-system.h
  2. 2 0
      inc/list_event.h
  3. 22 0
      src/event-system.c
  4. 108 9
      src/main.c

+ 10 - 0
inc/event-system.h

@@ -54,4 +54,14 @@ void decMDay(void);
 void decMonth(void);
 void decYear(void);
 
+void setTimeShow(void);
+void setTimeBegin(void);
+void setHHBegin(void);
+void setHHInc(void);
+void setHHDec(void);
+void setMMBegin(void);
+void setMMInc(void);
+void setMMDec(void);
+void setTimeEnd(void);
+
 #endif /* EVENT_SYSTEM_H */

+ 2 - 0
inc/list_event.h

@@ -25,6 +25,8 @@ typedef enum {
   stShowMDay,
   stShowMon,
   stShowYear,
+  stSetHH,
+  stSetMM,
   /* end */
   stLastState
 } es_state_t;

+ 22 - 0
src/event-system.c

@@ -51,6 +51,28 @@ const table_state_t stateTable[] PROGMEM = {
   {stShowMDay, evRefreshCal, stNoChange, showMDay, NULL},
   {stShowMon,  evRefreshCal, stNoChange, showMonth, NULL},
   {stShowYear, evRefreshCal, stNoChange, showYear, NULL},
+  /* set time */
+  {stShowTime, evBTN1Holded, stSetHH, setTimeBegin, setHHBegin},
+  {stShowMMSS, evBTN1Holded, stSetHH, setTimeBegin, setMMBegin},
+
+  {stSetHH, evBTN1Pressed, stSetMM, setMMBegin, NULL},
+  {stSetMM, evBTN1Pressed, stSetHH, setHHBegin, NULL},
+
+  {stSetHH, evNewSecond, stNoChange, setTimeShow, NULL},
+  {stSetMM, evNewSecond, stNoChange, setTimeShow, NULL},
+
+  {stSetHH, evBTN1Holded, stShowTime, setTimeEnd, showTime},
+  {stSetMM, evBTN1Holded, stShowTime, setTimeEnd, showTime},
+
+  {stSetHH, evBTN2Pressed, stNoChange, setHHInc, setTimeShow},
+  {stSetHH, evBTN2Holded,  stNoChange, setHHInc, setTimeShow},
+  {stSetHH, evBTN3Pressed, stNoChange, setHHDec, setTimeShow},
+  {stSetHH, evBTN3Holded,  stNoChange, setHHDec, setTimeShow},
+
+  {stSetMM, evBTN2Pressed, stNoChange, setMMInc, setTimeShow},
+  {stSetMM, evBTN2Holded,  stNoChange, setMMInc, setTimeShow},
+  {stSetMM, evBTN3Pressed, stNoChange, setMMDec, setTimeShow},
+  {stSetMM, evBTN3Holded,  stNoChange, setMMDec, setTimeShow},
   /* edit calendar */
   {stShowWDay, evBTN2Pressed, stNoChange, incWDay,  showWDay},
   {stShowWDay, evBTN2Holded,  stNoChange, incWDay,  showWDay},

+ 108 - 9
src/main.c

@@ -18,18 +18,23 @@
 #include "event-system.h"
 
 /* Defines */
-#define TIMER2_HZ          250
+#define TIMER2_HZ         250
 #define TIMER2_PRESCALER  256
 #define TIMER2_CS         (1<<CS22 | 1<<CS21 | 0<<CS20)
-#define  TIMER2_CNT        (0x100 - (F_CPU / TIMER2_PRESCALER / TIMER2_HZ))
+#define  TIMER2_CNT       (0x100 - (F_CPU / TIMER2_PRESCALER / TIMER2_HZ))
 
 /* Variables */
 static volatile uint8_t Digit[4] = {1, 2, 3, 4};
-static rtc_t RTC;
-volatile struct {
+static rtc_t RTC, setRTC;
+static volatile struct {
   uint8_t RTC_Int:  1;
   uint8_t saveCal:  1;
-  uint8_t rezerv:   6;
+  uint8_t blinkC:   1;
+  uint8_t blink0:   1;
+  uint8_t blink1:   1;
+  uint8_t blink2:   1;
+  uint8_t blink3:   1;
+  uint8_t rezerv:   1;
 } Flag;
 static btn_t Button[BTN_NUM] = {
   {0, evBTN1Pressed, evBTN1Holded, BUTTON1_PIN},
@@ -45,6 +50,7 @@ static void dotOn(void);
 static void btnProcess(void);
 static void valIncrease(uint8_t * val, uint8_t max);
 static void valDecrease(uint8_t * val, uint8_t max);
+static void blink(void);
 
 void main(void) {
   /**
@@ -53,6 +59,11 @@ void main(void) {
   uint8_t event = 0;
   Flag.RTC_Int = 0;
   Flag.saveCal = 0;
+  Flag.blink0 = 0;
+  Flag.blink1 = 0;
+  Flag.blink2 = 0;
+  Flag.blink3 = 0;
+  Flag.blinkC = 0;
 
   /**
    * Инициализация, настройка...
@@ -285,6 +296,86 @@ void decYear(void) {
   Flag.saveCal = 1;
 }
 
+static void blink(void) {
+  static uint8_t s = 0;
+  switch (s) {
+  case 0:
+    Flag.blinkC = 0;
+    RTOS_SetTask(blink, 750, 0);
+    s = 1;
+    break;
+
+  case 1:
+    Flag.blinkC = 1;
+    RTOS_SetTask(blink, 250, 0);
+    s = 0;
+    break;
+
+  default:
+    s = 0;
+  }
+}
+
+void setTimeShow(void) {
+  dotOn();
+  RTOS_SetTask(dotOff, 500, 0);
+
+  Digit[0] = setRTC.Hr >> 4;
+  Digit[1] = setRTC.Hr & 0x0F;
+  Digit[2] = setRTC.Min >> 4;
+  Digit[3] = setRTC.Min & 0x0F;
+}
+
+void setTimeBegin(void) {
+  RTC_ReadTime(&setRTC);
+}
+
+void setHHBegin(void) {
+  Flag.blink0 = 1;
+  Flag.blink1 = 1;
+  Flag.blink2 = 0;
+  Flag.blink3 = 0;
+  RTOS_SetTask(blink, 0, 0);
+  setTimeShow();
+}
+
+void setHHInc(void) {
+  valIncrease(&setRTC.Hr, 23);
+}
+
+void setHHDec(void) {
+  valDecrease(&setRTC.Hr, 23);
+}
+
+void setMMBegin(void) {
+  Flag.blink0 = 0;
+  Flag.blink1 = 0;
+  Flag.blink2 = 1;
+  Flag.blink3 = 1;
+  RTOS_SetTask(blink, 0, 0);
+  setTimeShow();
+}
+
+void setMMInc(void) {
+  valIncrease(&setRTC.Min, 59);
+}
+
+void setMMDec(void) {
+  valDecrease(&setRTC.Min, 59);
+}
+
+void setTimeEnd(void) {
+  setRTC.Sec = 0;
+  RTC_WriteTime(&setRTC);
+  RTC_ReadTime(&RTC);
+  RTOS_DeleteTask(blink);
+  Flag.blink0 = 0;
+  Flag.blink1 = 0;
+  Flag.blink2 = 0;
+  Flag.blink3 = 0;
+  Flag.blinkC = 0;
+}
+
 
 /**
   * @brief  Increase BCD value.
@@ -352,7 +443,9 @@ ISR(TIMER2_OVF_vect) {
     PORTC = pc | Digit[0];
     // power on lamp
     if (Digit[0] != DIGIT_BLANK) {
-      PORTD = pd | ANOD1;
+      if (Flag.blink0 == 0 || Flag.blinkC == 0) {
+        PORTD = pd | ANOD1;
+      }
     }
     idx = 1;
     break;
@@ -360,7 +453,9 @@ ISR(TIMER2_OVF_vect) {
   case 1:
     PORTC = pc | Digit[1];
     if (Digit[1] != DIGIT_BLANK) {
-      PORTD = pd | ANOD2;
+      if (Flag.blink1 == 0 || Flag.blinkC == 0) {
+        PORTD = pd | ANOD2;
+      }
     }
     idx = 2;
     break;
@@ -368,7 +463,9 @@ ISR(TIMER2_OVF_vect) {
   case 2:
     PORTC = pc | Digit[2];
     if (Digit[2] != DIGIT_BLANK) {
-      PORTD = pd | ANOD3;
+      if (Flag.blink2 == 0 || Flag.blinkC == 0) {
+        PORTD = pd | ANOD3;
+      }
     }
     idx = 3;
     break;
@@ -376,7 +473,9 @@ ISR(TIMER2_OVF_vect) {
   case 3:
     PORTC = pc | Digit[3];
     if (Digit[3] != DIGIT_BLANK) {
-      PORTD = pd | ANOD4;
+      if (Flag.blink3 == 0 || Flag.blinkC == 0) {
+        PORTD = pd | ANOD4;
+      }
     }
     idx = 0;
     break;