Procházet zdrojové kódy

Added Time setting actions.

Vladimir N. Shilov před 2 roky
rodič
revize
e424c2f4c3
6 změnil soubory, kde provedl 250 přidání a 60 odebrání
  1. 1 0
      inc/clock.h
  2. 2 0
      inc/display.h
  3. 3 0
      inc/msg.h
  4. 155 50
      src/clock.c
  5. 77 1
      src/display.c
  6. 12 9
      src/event-system.c

+ 1 - 0
inc/clock.h

@@ -8,6 +8,7 @@ void show_Time(void);
 void show_MMSS(void);
 void show_Date(void);
 
+void setTimeCorrect(void);
 void setTimeShow(void);
 void setTimeBegin(void);
 void setHHBegin(void);

+ 2 - 0
inc/display.h

@@ -22,7 +22,9 @@ void display_BlinkState(dis_en_t state);
 void display_LedState(dis_en_t state);
 void display_Fill(uint8_t pattern);
 void display_Char(const uint8_t symb, uint8_t column);
+void display_Text(const char * text, uint8_t column);
 void display_String(const char * string, uint8_t repeat);
+void display_Digits(uint8_t left, uint8_t right);
 void display_Wait4Display(void);
 void TIM16_IRQHandler(void);
 

+ 3 - 0
inc/msg.h

@@ -24,6 +24,9 @@ static const char Msg_Mon_Full[12][9] = {
 "Ëèïåíü\0  ", "Ñåðïåíü\0 ", "Âåðåñåíü\0", "Æîâòåíü\0 ", "Ëèñòîïàä\0", "Ãðóäåíü\0 "
 };
 
+static const char Msg_hodyn[3][7] = {"ãîäèí\0 ","ãîäèíà\0","ãîäèíè\0"};
+static const char Msg_hvylyn[3][8] = {"õâèëèí\0 ","õâèëèíà\0","õâèëèíè\0"};
+
 static const char Msg_Null[] = "\0";
 
 #endif /* _MSG_H_ */

+ 155 - 50
src/clock.c

@@ -1,5 +1,4 @@
 #include "main.h"
-#include "digits.h"
 #include "msg.h"
 #include "xprintf.h"
 
@@ -57,9 +56,13 @@ static void switch_4_On(void);
 static void switch_4_Off(void);
 static void switch_5_On(void);
 static void switch_5_Off(void);
+static void valIncrease(uint8_t * val, const uint8_t max);
+static void valDecrease(uint8_t * val, const uint8_t max);
+static void dvalIncrease(uint8_t * val, const uint8_t max);
+static void dvalDecrease(uint8_t * val, const uint8_t max);
 
 /** Private variables */
-static rtc_t Clock;
+static rtc_t Clock, setClock;
 static i2c_status_t i2c_status;
 static btn_t Button[BTN_NUM] = {
   {0, evBTN1Pressed, evBTN1Pressed, BTN1_PIN},
@@ -182,31 +185,13 @@ static void switchProcess(void) {
  * @brief Show Time. Use 4x7 digits
  */
 void show_Time(void) {
-  display_Wait4Display();
-
   if (Clock.Sec == 0x0) {
     char buf[16] = {0};
-    xsprintf(buf, "%x %s. %02x %s.\0", Clock.Hr, Msg_god, Clock.Min, Msg_hv);
-    display_String(buf, 2);
+    xsprintf(buf, "%x %s. %x %s.\0", Clock.Hr, Msg_god, Clock.Min, Msg_hv);
+    display_String(buf, 1);
   } else {
-    uint8_t t;
-    // dots blink
-    display_WriteData(&digit_4x7[10][0], 10, 4);
     RTOS_SetTask(dots_Off, 500, 0);
-
-    t = Clock.Hr >> 4;
-    display_WriteData(&digit_4x7[t][0], 1, 4);
-
-    t = Clock.Hr & 0xf;
-    display_WriteData(&digit_4x7[t][0], 6, 4);
-
-    t = Clock.Min >> 4;
-    display_WriteData(&digit_4x7[t][0], 14, 4);
-
-    t = Clock.Min & 0xf;
-    display_WriteData(&digit_4x7[t][0], 19, 4);
-
-    display_WriteBuffer();
+    display_Digits(Clock.Hr, Clock.Min);
   }
 }
 
@@ -215,25 +200,8 @@ void show_Time(void) {
  */
 void show_MMSS(void) {
   RTOS_DeleteTask(dots_Off);
-  display_Wait4Display();
-
-  uint8_t t;
-  // dots on
-  display_WriteData(&digit_4x7[10][0], 10, 4);
-
-  t = Clock.Min >> 4;
-  display_WriteData(&digit_4x7[t][0], 1, 4);
 
-  t = Clock.Min & 0xf;
-  display_WriteData(&digit_4x7[t][0], 6, 4);
-
-  t = Clock.Sec >> 4;
-  display_WriteData(&digit_4x7[t][0], 14, 4);
-
-  t = Clock.Sec & 0xf;
-  display_WriteData(&digit_4x7[t][0], 19, 4);
-
-  display_WriteBuffer();
+  display_Digits(Clock.Min, Clock.Sec);
 }
 
 void show_Date(void) {
@@ -245,15 +213,98 @@ void show_Date(void) {
   display_String(buf, 2);
 }
 
-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) {}
+void blink_dig_HH(void) {
+  static int state = 0;
+
+  switch (state) {
+  case 0:
+    display_Digits(setClock.Hr, setClock.Min);
+    state = 1;
+    break;
+  
+  case 1:
+    display_Digits(0xff, setClock.Min);
+    state = 0;
+    break;
+
+  default:
+    state = 0;
+    break;
+  }
+}
+
+void blink_dig_MM(void) {
+  static int state = 0;
+
+  switch (state) {
+  case 0:
+    display_Digits(setClock.Hr, setClock.Min);
+    state = 1;
+    break;
+  
+  case 1:
+    display_Digits(setClock.Hr, 0xff);
+    state = 0;
+    break;
+
+  default:
+    state = 0;
+    break;
+  }
+}
+
+void setTimeCorrect(void) {
+  if (Clock.Sec > 30) {
+    valIncrease(&Clock.Min, 59);
+    if (Clock.Min == 0) {
+      valIncrease(&Clock.Hr, 23);
+    }
+  }
+  Clock.Sec = 0;
+  RTC_WriteTime(&Clock);
+}
+
+void setTimeShow(void) {
+  display_Digits(setClock.Hr, setClock.Min);
+}
+
+void setTimeBegin(void) {
+  RTOS_DeleteTask(dots_Off);
+  RTC_ReadAll(&setClock);
+}
+
+void setHHBegin(void) {
+  RTOS_DeleteTask(blink_dig_MM);
+  RTOS_SetTask(blink_dig_HH, 0, 250);
+}
+
+void setHHInc(void) {
+  valIncrease(&setClock.Hr, 23);
+}
+
+void setHHDec(void) {
+  valDecrease(&setClock.Hr, 23);
+}
+
+void setMMBegin(void) {
+  RTOS_DeleteTask(blink_dig_HH);
+  RTOS_SetTask(blink_dig_MM, 0, 250);
+}
+
+void setMMInc(void) {
+  valIncrease(&setClock.Min, 59);
+}
+
+void setMMDec(void) {
+  valDecrease(&setClock.Min, 59);
+}
+
+void setTimeEnd(void) {
+  RTOS_DeleteTask(blink_dig_HH);
+  RTOS_DeleteTask(blink_dig_MM);
+  setClock.Sec = 0;
+  RTC_WriteTime(&setClock);
+}
 
 void setDateBegin(void) {}
 void setDateEnd(void) {}
@@ -371,10 +422,12 @@ static void beep_Repeated(void) {
  */
 static void switch_1_On(void) {
  // Stop
+ ES_PlaceEvent(evSwitch1Off);
 }
 
 static void switch_1_Off(void) {
  // Stop
+ ES_PlaceEvent(evSwitch1On);
 }
 
 static void switch_2_On(void) {
@@ -425,3 +478,55 @@ void EXTI4_15_IRQHandler(void)
     RTOS_SetTask(new_Second, 0, 0);
   }
 }
+
+/**
+  * @brief  Increase BCD value.
+  * @param  : val, max
+  * @retval : None
+  */
+static void valIncrease(uint8_t * val, uint8_t max) {
+  uint8_t bin = 10 * (*val >> 4) + (*val & 0x0f);
+  if (bin < max) {
+    bin ++;
+  } else {
+    bin = 0;
+  }
+  *val = ((bin / 10 ) << 4) | (bin % 10);
+}
+
+/**
+  * @brief  Decrease BCD value.
+  * @param  : value, max
+  * @retval : None
+  */
+static void valDecrease(uint8_t * val, uint8_t max) {
+  uint8_t bin = 10 * (*val >> 4) + (*val & 0x0f);
+  if (bin > 0) {
+    bin --;
+  } else {
+    bin = max;
+  }
+  *val = ((bin / 10 ) << 4) | (bin % 10);
+}
+
+/**
+  * @brief Increase/Decrease decimal value.
+  * @param val
+  * @param max 
+  * @retval : None, change value
+  */
+static void dvalIncrease(uint8_t * val, uint8_t max) {
+  if (*val < max) {
+    *val += 1;
+  } else {
+    *val = 0;
+  }
+}
+
+static void dvalDecrease(uint8_t * val, uint8_t max) {
+  if (*val > 0) {
+    *val -= 1;
+  } else {
+    *val = max;
+  }
+}

+ 77 - 1
src/display.c

@@ -58,7 +58,6 @@ void display_Init(void) {
 
 /**
  * @brief Out to display one symbol from specified column
- * 
  * @param symb Symbol to display
  * @param column column from 0 to DISPLAY_COLUMNS-1
  */
@@ -76,6 +75,15 @@ void display_Char(const uint8_t symb, const uint8_t column) {
   }
 }
 
+/**
+ * @brief Out short static text to display.
+ * @param text Text to display, 4 symbol maximum.
+ * @param column Column, from 0 to DISPLAY_COLUMNS-1
+ */
+void display_Text(const char * text, uint8_t column) {
+
+}
+
 /**
  * @brief Out string to display. Running string. Left shit.
  * @param string String to display, null terminated.
@@ -110,6 +118,74 @@ void display_String(const char * string, uint8_t repeat) {
   TIM16_IRQHandler();
 }
 
+/**
+ * @brief Display 4 tink digits in "Clock format" - '00:00'
+ * @param left BCD value for left part
+ * @param right BCD value for right part
+ */
+void display_Digits(uint8_t left, uint8_t right) {
+  display_Wait4Display();
+
+  uint8_t t;
+
+  display_Buffer[0] = 0;
+  display_Buffer[5] = 0;
+
+  if (left == 0xff) {
+    display_Buffer[1] = 0;
+    display_Buffer[2] = 0;
+    display_Buffer[3] = 0;
+    display_Buffer[4] = 0;
+    display_Buffer[6] = 0;
+    display_Buffer[7] = 0;
+    display_Buffer[8] = 0;
+    display_Buffer[9] = 0;
+  } else {
+    t = left >> 4;
+    display_Buffer[1] = digit_4x7[t][0];
+    display_Buffer[2] = digit_4x7[t][1];
+    display_Buffer[3] = digit_4x7[t][2];
+    display_Buffer[4] = digit_4x7[t][3];
+
+    t = left & 0xf;
+    display_Buffer[6] = digit_4x7[t][0];
+    display_Buffer[7] = digit_4x7[t][1];
+    display_Buffer[8] = digit_4x7[t][2];
+    display_Buffer[9] = digit_4x7[t][3];
+  }
+
+  display_Buffer[10] = 0;
+  display_Buffer[11] = digit_4x7[10][1];
+  display_Buffer[12] = digit_4x7[10][2];
+  display_Buffer[13] = 0;
+
+  display_Buffer[18] = 0;
+  display_Buffer[23] = 0;
+  if (right == 0xff) {
+    display_Buffer[14] = 0;
+    display_Buffer[15] = 0;
+    display_Buffer[16] = 0;
+    display_Buffer[17] = 0;
+    display_Buffer[19] = 0;
+    display_Buffer[20] = 0;
+    display_Buffer[21] = 0;
+    display_Buffer[22] = 0;
+  } else {
+    t = right >> 4;
+    display_Buffer[14] = digit_4x7[t][0];
+    display_Buffer[15] = digit_4x7[t][1];
+    display_Buffer[16] = digit_4x7[t][2];
+    display_Buffer[17] = digit_4x7[t][3];
+
+    t = right & 0xf;
+    display_Buffer[19] = digit_4x7[t][0];
+    display_Buffer[20] = digit_4x7[t][1];
+    display_Buffer[21] = digit_4x7[t][2];
+    display_Buffer[22] = digit_4x7[t][3];
+  }
+
+  display_WriteBuffer();
+}
 /**
  * @brief Set HT1632C PWM Value
  * @param pwm value in 0-15

+ 12 - 9
src/event-system.c

@@ -38,6 +38,9 @@ const table_state_t stateTable[] = {
   // 'Min+' Button pressed
   {stShowTime, evSwitch2On,  stShowMMSS, show_MMSS, NULL},
   {stShowMMSS, evSwitch2Off, stShowTime, show_Time, NULL},
+  // 'Reset' Button pressed
+  {stShowTime, evBTN3Pressed, stShowMMSS, setTimeCorrect, show_MMSS},
+  {stShowMMSS, evBTN3Pressed, stShowTime, setTimeCorrect, show_Time},
 
   /* display wdt events */
   {stShowDate,  evDisplayWDT, stShowTime, show_Time, NULL},
@@ -47,17 +50,17 @@ const table_state_t stateTable[] = {
   {stShowMMSS, evNewSecond,  stNoChange, show_MMSS,   NULL},
 
   /* set time */
-  {stShowTime, evBTN1Holded,  stSetHH,    setTimeBegin, setHHBegin},
-  {stSetHH,    evBTN1Holded,  stShowTime, setTimeEnd,   show_Time},
-  {stSetMM,    evBTN1Holded,  stShowTime, setTimeEnd,   show_Time},
+  {stShowTime, evSwitch1On,  stSetHH,    setTimeBegin, setHHBegin},
+  {stSetHH,    evSwitch1Off, stShowTime, setTimeEnd,   show_Time},
+  {stSetMM,    evSwitch1Off, stShowTime, setTimeEnd,   show_Time},
 
-  {stSetHH,    evBTN1Pressed, stSetMM,    setMMBegin,   NULL},
-  {stSetMM,    evBTN1Pressed, stSetHH,    setHHBegin,   NULL},
+  {stSetHH,    evBTN3Pressed, stSetMM,    setMMBegin,   NULL},
+  {stSetMM,    evBTN3Pressed, stSetHH,    setHHBegin,   NULL},
 
-  {stSetHH,    evBTN2Pressed, stNoChange, setHHInc,     setTimeShow},
-  {stSetHH,    evBTN3Pressed, stNoChange, setHHDec,     setTimeShow},
-  {stSetMM,    evBTN2Pressed, stNoChange, setMMInc,     setTimeShow},
-  {stSetMM,    evBTN3Pressed, stNoChange, setMMDec,     setTimeShow},
+  {stSetHH,    evBTN1Pressed, stNoChange, setHHInc,     setTimeShow},
+  {stSetHH,    evBTN2Pressed, stNoChange, setHHDec,     setTimeShow},
+  {stSetMM,    evBTN1Pressed, stNoChange, setMMInc,     setTimeShow},
+  {stSetMM,    evBTN2Pressed, stNoChange, setMMDec,     setTimeShow},
 
   {stSetHH,    evDisplayWDT,  stShowTime, show_Time,     NULL},
   {stSetMM,    evDisplayWDT,  stShowTime, show_Time,     NULL},