Jelajahi Sumber

Настройка календаря.

Vladimir Shilov 5 tahun lalu
induk
melakukan
d656c76351
4 mengubah file dengan 125 tambahan dan 2 penghapusan
  1. 5 0
      ReadMe.txt
  2. 16 0
      inc/event-system.h
  3. 18 1
      src/event-system.c
  4. 86 1
      src/main.c

+ 5 - 0
ReadMe.txt

@@ -39,3 +39,8 @@ My Nixie Clock IN-12 / Мои часы на ГРИ ИН-12
 
 Сегодня вспомнил, что атмел с памятью работает слегка по другому.
 Упростил таблицу состояний, переписал обработчик - по идее должно работать.
+---
+2019.05.31
+Вчера всё получилось.
+
+Начинаю внедрять настройку часов.

+ 16 - 0
inc/event-system.h

@@ -38,4 +38,20 @@ void showMDay(void);
 void showMonth(void);
 void showYear(void);
 
+void incHH(void);
+void incMM(void);
+void incSS(void);
+void decHH(void);
+void decMM(void);
+void decSS(void);
+
+void incWDay(void);
+void incMDay(void);
+void incMonth(void);
+void incYear(void);
+void decWDay(void);
+void decMDay(void);
+void decMonth(void);
+void decYear(void);
+
 #endif /* EVENT_SYSTEM_H */

+ 18 - 1
src/event-system.c

@@ -44,13 +44,30 @@ const table_state_t stateTable[] PROGMEM = {
   {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, evRefreshCal, stNoChange, showWDay, NULL},
   {stShowMDay, evRefreshCal, stNoChange, showMDay, NULL},
   {stShowMon,  evRefreshCal, stNoChange, showMonth, NULL},
   {stShowYear, evRefreshCal, stNoChange, showYear, NULL},
+  /* edit calendar */
+  {stShowWDay, evBTN2Pressed, stNoChange, incWDay,  showWDay},
+  {stShowWDay, evBTN2Holded,  stNoChange, incWDay,  showWDay},
+  {stShowMDay, evBTN2Pressed, stNoChange, incMDay,  showMDay},
+  {stShowMDay, evBTN2Holded,  stNoChange, incMDay,  showMDay},
+  {stShowMon,  evBTN2Pressed, stNoChange, incMonth, showMonth},
+  {stShowMon,  evBTN2Holded,  stNoChange, incMonth, showMonth},
+  {stShowYear, evBTN2Pressed, stNoChange, incYear,  showYear},
+  {stShowYear, evBTN2Holded,  stNoChange, incYear,  showYear},
+  {stShowWDay, evBTN3Pressed, stNoChange, decWDay,  showWDay},
+  {stShowWDay, evBTN3Holded,  stNoChange, decWDay,  showWDay},
+  {stShowMDay, evBTN3Pressed, stNoChange, decMDay,  showMDay},
+  {stShowMDay, evBTN3Holded,  stNoChange, decMDay,  showMDay},
+  {stShowMon,  evBTN3Pressed, stNoChange, decMonth, showMonth},
+  {stShowMon,  evBTN3Holded,  stNoChange, decMonth, showMonth},
+  {stShowYear, evBTN3Pressed, stNoChange, decYear,  showYear},
+  {stShowYear, evBTN3Holded,  stNoChange, decYear,  showYear},
   /* обязательная пустая строка таблицы */
   {stNoChange, eventNull, stNoChange, EmptyFunc, EmptyFunc}
 };

+ 86 - 1
src/main.c

@@ -28,7 +28,8 @@ static volatile uint8_t Digit[4] = {1, 2, 3, 4};
 static rtc_t RTC;
 volatile struct {
   uint8_t RTC_Int:  1;
-  uint8_t rezerv:   7;
+  uint8_t saveCal:  1;
+  uint8_t rezerv:   6;
 } Flag;
 static btn_t Button[BTN_NUM] = {
   {0, evBTN1Pressed, evBTN1Holded, BUTTON1_PIN},
@@ -42,6 +43,8 @@ static volatile uint8_t DISP_WDT = 0;
 static void Board_Init(void);
 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);
 
 void main(void) {
   /**
@@ -49,6 +52,7 @@ void main(void) {
    */
   uint8_t event = 0;
   Flag.RTC_Int = 0;
+  Flag.saveCal = 0;
 
   /**
    * Инициализация, настройка...
@@ -86,6 +90,10 @@ void main(void) {
         DISP_WDT --;
         if (DISP_WDT == 0) {
           ES_PlaceEvent(evDisplayWDT);
+          if (Flag.saveCal != 0) {
+            Flag.saveCal = 0;
+            RTC_WriteCalendar(&RTC);
+          }
         }
       }
     }
@@ -223,6 +231,83 @@ void showYear(void) {
   Digit[3] = RTC.Year & 0x0F;
 }
 
+void incWDay(void) {
+  if (RTC.WD < 7) {
+    RTC.WD ++;
+  } else {
+    RTC.WD = 1;
+  }
+}
+
+void decWDay(void) {
+  if (RTC.WD > 1) {
+    RTC.WD --;
+  } else {
+    RTC.WD = 7;
+  }
+}
+
+void incMDay(void) {
+  valIncrease(&RTC.Day, 31);
+}
+
+void decMDay(void) {
+  valDecrease(&RTC.Day, 31);
+}
+
+void incMonth(void) {
+  valIncrease(&RTC.Mon, 12);
+  if (RTC.Mon == 0) {
+    RTC.Mon = 1;
+  }
+}
+
+void decMonth(void) {
+  valDecrease(&RTC.Mon, 12);
+  if (RTC.Mon == 0) {
+    RTC.Mon = 0x12;
+  }
+}
+
+void incYear(void) {
+  valIncrease(&RTC.Year, 99);
+}
+
+void decYear(void) {
+  valDecrease(&RTC.Year, 99);
+}
+
+
+/**
+  * @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 (binc < 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);
+}
+
 
 /**
  *  П р е р ы в а н и я