Browse Source

Работает переключение режимов отображения кнопками.

Vladimir N. Shilov 9 năm trước cách đây
mục cha
commit
a3425d0aad
3 tập tin đã thay đổi với 109 bổ sung49 xóa
  1. 6 0
      ReadMe.txt
  2. 1 1
      lib/rtos.h
  3. 102 48
      src/main.c

+ 6 - 0
ReadMe.txt

@@ -260,3 +260,9 @@ Factory_VREFINT у меня == 0x7E, т.е. полное значение 0x067E
 Получается, что для каждой строки нужна функция отображения каждого параметра.
 Как-то это накладно, но ничего умнее пока придумать не могу.
 хватило бы оперативки...
+
+---
+2016.07.28
+
+Сделал переключение режимов построчно.
+Пора подумать о сохранении настроек в eeprom.

+ 1 - 1
lib/rtos.h

@@ -25,7 +25,7 @@
 #include "stm8l15x.h"
 
 // Êîëè÷åñòâî çàäà÷
-#define MAX_TASKS	9
+#define MAX_TASKS	12
 
 #define  ENABLE_INTERRUPT enableInterrupts()
 #define DISABLE_INTERRUPT disableInterrupts()

+ 102 - 48
src/main.c

@@ -46,10 +46,10 @@ typedef enum _events {
 } event_t;
 
 /* Private define ------------------------------------------------------------*/
-#define LED_RED_PORT    GPIOC
-#define LED_RED_PIN     GPIO_Pin_4
-#define LED_GREEN_PORT  GPIOB
-#define LED_GREEN_PIN   GPIO_Pin_7
+#define LED_RED_PORT    GPIOB
+#define LED_RED_PIN     GPIO_Pin_7
+#define LED_GREEN_PORT  GPIOC
+#define LED_GREEN_PIN   GPIO_Pin_4
 
 #define BTNs_PORT       GPIOC
 #define BTN1_PIN        GPIO_Pin_0
@@ -57,7 +57,11 @@ typedef enum _events {
 #define BTN_SCAN_PERIOD 10
 // кнопка считается нажатой через BTN_FACTOR * BTN_SCAN_PERIOD ms
 #define BTN_FACTOR      5
-
+/*
+#define BTNs_PORT       GPIOA
+#define BTN1_PIN        GPIO_Pin_2
+#define BTN2_PIN        GPIO_Pin_3
+*/
 #define VALUES_BUFFER_SIZE  10
 
 /* Private macro -------------------------------------------------------------*/
@@ -138,7 +142,7 @@ static void showBotLineWH(void);
 static void showBotLineT(void);
 
 static void btnScan(void);
-static void testButton(uint8_t btnPin, uint8_t *pressCount, void (*taskShortPress)(void), void (*taskLongPress)(void));
+static void btnTest(uint8_t btnPin, uint8_t *pressCount, void (*taskShortPress)(void), void (*taskLongPress)(void));
 static void btn1Short(void);
 static void btn1Long(void);
 static void btn2Short(void);
@@ -220,19 +224,23 @@ static void calculateValues(void) {
   Current = (c + (VALUES_BUFFER_SIZE/2)) / VALUES_BUFFER_SIZE;
   Voltage = (v + (VALUES_BUFFER_SIZE/2)) / VALUES_BUFFER_SIZE;
 
-  Power = ((Voltage * Current) + 500) / 1000;
+  if (Current > 4) {
 
-  CapacityAH += Current;
-  CapacityWH += Power;
+    Power = ((Voltage * Current) + 500) / 1000;
 
-  Timer.ss ++;
-  if (Timer.ss > 59) {
-    Timer.ss = 0;
-    Timer.mm ++;
-    if (Timer.mm > 59) {
-      Timer.hh ++;
+    CapacityAH += Current;
+    CapacityWH += Power;
+
+    Timer.ss ++;
+    if (Timer.ss > 59) {
+      Timer.ss = 0;
+      Timer.mm ++;
+      if (Timer.mm > 59) {
+        Timer.hh ++;
+      }
     }
   }
+
 }
 
 /**
@@ -429,8 +437,43 @@ static void showWH(uint8_t pos) {
   * any other for bottom.
   */
 static void showT(uint8_t pos) {
-  if (pos > 0) {
-    pos = 4;
+  static uint8_t halfsek = 0;
+  uint8_t tmp;
+
+  if (Timer.hh > 0) {
+    tmp = Timer.hh / 10;
+    MAX7219_WriteData(dig[pos], num[tmp]);
+    pos ++;
+    tmp = Timer.hh % 10;
+    if (halfsek == 0) {
+      MAX7219_WriteData(dig[pos], num[tmp]);
+    } else {
+      MAX7219_WriteData(dig[pos], (num[tmp] | Sym_Dot));
+    }
+    pos ++;
+    tmp = Timer.mm / 10;
+    MAX7219_WriteData(dig[pos], num[tmp]);
+    pos ++;
+    tmp = Timer.mm % 10;
+    MAX7219_WriteData(dig[pos], num[tmp]);
+  } else {
+    tmp = Timer.mm / 10;
+    MAX7219_WriteData(dig[pos], num[Timer.mm >> 4]);
+    pos ++;
+    tmp = Timer.mm % 10;
+    MAX7219_WriteData(dig[pos], (num[tmp] | Sym_Dot));
+    pos ++;
+    tmp = Timer.ss / 10;
+    MAX7219_WriteData(dig[pos], num[tmp]);
+    pos ++;
+    tmp = Timer.ss % 10;
+    MAX7219_WriteData(dig[pos], num[tmp]);
+  }
+
+  if (halfsek == 0) {
+    halfsek = 1;
+  } else {
+    halfsek = 0;
   }
 }
 
@@ -446,8 +489,8 @@ static void GPIO_Config(void)
   GPIO_Init(LED_GREEN_PORT, LED_GREEN_PIN, GPIO_Mode_Out_PP_High_Fast);
 
   /* Configure GPIO used for buttons */
-  GPIO_Init(BTNs_PORT, BTN1_PIN, GPIO_Mode_In_PU_No_IT);
-  GPIO_Init(BTNs_PORT, BTN2_PIN, GPIO_Mode_In_PU_No_IT);
+  GPIO_Init(BTNs_PORT, BTN1_PIN, GPIO_Mode_In_FL_No_IT);
+  GPIO_Init(BTNs_PORT, BTN2_PIN, GPIO_Mode_In_FL_No_IT);
 
   /* Enable general interrupts */
   enableInterrupts();
@@ -473,14 +516,13 @@ static void CLK_Config(void)
 
 /** опрос кнопок */
 static void btnScan(void) {
-  testButton(BTN1_PIN, &btn1Cnt, btn1Short, btn1Long);
-  testButton(BTN2_PIN, &btn2Cnt, btn2Short, btn2Long);
+  btnTest(BTN1_PIN, &btn1Cnt, btn1Short, btn1Long);
+  btnTest(BTN2_PIN, &btn2Cnt, btn2Short, btn2Long);
 }
 
 /** проверка конкретной кнопки */
-static void testButton(uint8_t btnPin, uint8_t *pressCount, void (*taskShortPress)(void), void (*taskLongPress)(void)) {
-  if (BTNs_PORT->IDR & (uint8_t)btnPin == 0) {
-
+static void btnTest(uint8_t btnPin, uint8_t *pressCount, void (*taskShortPress)(void), void (*taskLongPress)(void)) {
+  if ((BTNs_PORT->IDR & btnPin) == 0) {
     if (*pressCount < 255) {
       *pressCount = *pressCount + 1;
     }
@@ -492,10 +534,10 @@ static void testButton(uint8_t btnPin, uint8_t *pressCount, void (*taskShortPres
       }
 */
   } else {
-    if (*pressCount > (BTN_FACTOR * 10)) {
-      RTOS_SetTask(taskLongPress, 0, 0); // вызов функции при длительном нажатии
-    } else if (*pressCount > BTN_FACTOR) {
-      RTOS_SetTask(taskShortPress, 0, 0); // вызов функции при коротком нажатии
+    if (*pressCount >= (BTN_FACTOR * 10)) {
+      RTOS_SetTask(taskLongPress, 1, 0); // вызов функции при длительном нажатии
+    } else if (*pressCount >= BTN_FACTOR) {
+      RTOS_SetTask(taskShortPress, 2, 0); // вызов функции при коротком нажатии
     }
     *pressCount = 0;
   }
@@ -512,64 +554,76 @@ static void displayMode(mode_led_t * disp, event_t event, uint8_t pos) {
     case dispNoState:
       showLabelU(pos);
       if (pos == 0) {
-        RTOS_SetTask(showTopLineU, 1000, 200);
+        RTOS_SetTask(showTopLineU, 1000, 250);
       } else {
-        RTOS_SetTask(showBotLineU, 1000, 200);
+        RTOS_SetTask(showBotLineU, 1000, 250);
       }
       *disp = displayU;
       break;
     case displayU:
-      showLabelI(pos);
       if (pos == 0) {
-        RTOS_SetTask(showTopLineI, 1000, 200);
+        RTOS_DeleteTask(showTopLineU);
+        RTOS_SetTask(showTopLineI, 1000, 250);
       } else {
-        RTOS_SetTask(showBotLineI, 1000, 200);
+        RTOS_DeleteTask(showBotLineU);
+        RTOS_SetTask(showBotLineI, 1000, 250);
       }
+      showLabelI(pos);
       *disp = displayI;
       break;
     case displayI:
-      showLabelP(pos);
       if (pos == 0) {
-        RTOS_SetTask(showTopLineP, 1000, 200);
+        RTOS_DeleteTask(showTopLineI);
+        RTOS_SetTask(showTopLineP, 1000, 250);
       } else {
-        RTOS_SetTask(showBotLineP, 1000, 200);
+        RTOS_DeleteTask(showBotLineI);
+        RTOS_SetTask(showBotLineP, 1000, 250);
       }
+      showLabelP(pos);
       *disp = displayP;
       break;
     case displayP:
-      showLabelAH(pos);
       if (pos == 0) {
-        RTOS_SetTask(showTopLineAH, 1000, 200);
+        RTOS_DeleteTask(showTopLineP);
+        RTOS_SetTask(showTopLineAH, 1000, 250);
       } else {
-        RTOS_SetTask(showBotLineAH, 1000, 200);
+        RTOS_DeleteTask(showBotLineP);
+        RTOS_SetTask(showBotLineAH, 1000, 250);
       }
+      showLabelAH(pos);
       *disp = displayAH;
       break;
     case displayAH:
-      showLabelWH(pos);
       if (pos == 0) {
-        RTOS_SetTask(showTopLineWH, 1000, 200);
+        RTOS_DeleteTask(showTopLineAH);
+        RTOS_SetTask(showTopLineWH, 1000, 250);
       } else {
-        RTOS_SetTask(showBotLineWH, 1000, 200);
+        RTOS_DeleteTask(showBotLineAH);
+        RTOS_SetTask(showBotLineWH, 1000, 250);
       }
+      showLabelWH(pos);
       *disp = displayWH;
       break;
     case displayWH:
-      showLabelU(pos);
       if (pos == 0) {
-        RTOS_SetTask(showTopLineT, 1000, 200);
+        RTOS_DeleteTask(showTopLineWH);
+        RTOS_SetTask(showTopLineT, 1000, 500);
       } else {
-        RTOS_SetTask(showBotLineT, 1000, 200);
+        RTOS_DeleteTask(showBotLineWH);
+        RTOS_SetTask(showBotLineT, 1000, 500);
       }
+      showLabelT(pos);
       *disp = displayT;
       break;
     case displayT:
-      showLabelU(pos);
       if (pos == 0) {
-        RTOS_SetTask(showTopLineU, 1000, 200);
+        RTOS_DeleteTask(showTopLineT);
+        RTOS_SetTask(showTopLineU, 1000, 250);
       } else {
-        RTOS_SetTask(showBotLineU, 1000, 200);
+        RTOS_DeleteTask(showBotLineT);
+        RTOS_SetTask(showBotLineU, 1000, 250);
       }
+      showLabelU(pos);
       *disp = displayU;
       break;
     }