|
@@ -46,10 +46,10 @@ typedef enum _events {
|
|
} event_t;
|
|
} event_t;
|
|
|
|
|
|
/* Private define ------------------------------------------------------------*/
|
|
/* 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 BTNs_PORT GPIOC
|
|
#define BTN1_PIN GPIO_Pin_0
|
|
#define BTN1_PIN GPIO_Pin_0
|
|
@@ -57,7 +57,11 @@ typedef enum _events {
|
|
#define BTN_SCAN_PERIOD 10
|
|
#define BTN_SCAN_PERIOD 10
|
|
// кнопка считается нажатой через BTN_FACTOR * BTN_SCAN_PERIOD ms
|
|
// кнопка считается нажатой через BTN_FACTOR * BTN_SCAN_PERIOD ms
|
|
#define BTN_FACTOR 5
|
|
#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
|
|
#define VALUES_BUFFER_SIZE 10
|
|
|
|
|
|
/* Private macro -------------------------------------------------------------*/
|
|
/* Private macro -------------------------------------------------------------*/
|
|
@@ -138,7 +142,7 @@ static void showBotLineWH(void);
|
|
static void showBotLineT(void);
|
|
static void showBotLineT(void);
|
|
|
|
|
|
static void btnScan(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 btn1Short(void);
|
|
static void btn1Long(void);
|
|
static void btn1Long(void);
|
|
static void btn2Short(void);
|
|
static void btn2Short(void);
|
|
@@ -220,19 +224,23 @@ static void calculateValues(void) {
|
|
Current = (c + (VALUES_BUFFER_SIZE/2)) / VALUES_BUFFER_SIZE;
|
|
Current = (c + (VALUES_BUFFER_SIZE/2)) / VALUES_BUFFER_SIZE;
|
|
Voltage = (v + (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.
|
|
* any other for bottom.
|
|
*/
|
|
*/
|
|
static void showT(uint8_t pos) {
|
|
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);
|
|
GPIO_Init(LED_GREEN_PORT, LED_GREEN_PIN, GPIO_Mode_Out_PP_High_Fast);
|
|
|
|
|
|
/* Configure GPIO used for buttons */
|
|
/* 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 */
|
|
/* Enable general interrupts */
|
|
enableInterrupts();
|
|
enableInterrupts();
|
|
@@ -473,14 +516,13 @@ static void CLK_Config(void)
|
|
|
|
|
|
/** опрос кнопок */
|
|
/** опрос кнопок */
|
|
static void btnScan(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) {
|
|
if (*pressCount < 255) {
|
|
*pressCount = *pressCount + 1;
|
|
*pressCount = *pressCount + 1;
|
|
}
|
|
}
|
|
@@ -492,10 +534,10 @@ static void testButton(uint8_t btnPin, uint8_t *pressCount, void (*taskShortPres
|
|
}
|
|
}
|
|
*/
|
|
*/
|
|
} else {
|
|
} 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;
|
|
*pressCount = 0;
|
|
}
|
|
}
|
|
@@ -512,64 +554,76 @@ static void displayMode(mode_led_t * disp, event_t event, uint8_t pos) {
|
|
case dispNoState:
|
|
case dispNoState:
|
|
showLabelU(pos);
|
|
showLabelU(pos);
|
|
if (pos == 0) {
|
|
if (pos == 0) {
|
|
- RTOS_SetTask(showTopLineU, 1000, 200);
|
|
|
|
|
|
+ RTOS_SetTask(showTopLineU, 1000, 250);
|
|
} else {
|
|
} else {
|
|
- RTOS_SetTask(showBotLineU, 1000, 200);
|
|
|
|
|
|
+ RTOS_SetTask(showBotLineU, 1000, 250);
|
|
}
|
|
}
|
|
*disp = displayU;
|
|
*disp = displayU;
|
|
break;
|
|
break;
|
|
case displayU:
|
|
case displayU:
|
|
- showLabelI(pos);
|
|
|
|
if (pos == 0) {
|
|
if (pos == 0) {
|
|
- RTOS_SetTask(showTopLineI, 1000, 200);
|
|
|
|
|
|
+ RTOS_DeleteTask(showTopLineU);
|
|
|
|
+ RTOS_SetTask(showTopLineI, 1000, 250);
|
|
} else {
|
|
} else {
|
|
- RTOS_SetTask(showBotLineI, 1000, 200);
|
|
|
|
|
|
+ RTOS_DeleteTask(showBotLineU);
|
|
|
|
+ RTOS_SetTask(showBotLineI, 1000, 250);
|
|
}
|
|
}
|
|
|
|
+ showLabelI(pos);
|
|
*disp = displayI;
|
|
*disp = displayI;
|
|
break;
|
|
break;
|
|
case displayI:
|
|
case displayI:
|
|
- showLabelP(pos);
|
|
|
|
if (pos == 0) {
|
|
if (pos == 0) {
|
|
- RTOS_SetTask(showTopLineP, 1000, 200);
|
|
|
|
|
|
+ RTOS_DeleteTask(showTopLineI);
|
|
|
|
+ RTOS_SetTask(showTopLineP, 1000, 250);
|
|
} else {
|
|
} else {
|
|
- RTOS_SetTask(showBotLineP, 1000, 200);
|
|
|
|
|
|
+ RTOS_DeleteTask(showBotLineI);
|
|
|
|
+ RTOS_SetTask(showBotLineP, 1000, 250);
|
|
}
|
|
}
|
|
|
|
+ showLabelP(pos);
|
|
*disp = displayP;
|
|
*disp = displayP;
|
|
break;
|
|
break;
|
|
case displayP:
|
|
case displayP:
|
|
- showLabelAH(pos);
|
|
|
|
if (pos == 0) {
|
|
if (pos == 0) {
|
|
- RTOS_SetTask(showTopLineAH, 1000, 200);
|
|
|
|
|
|
+ RTOS_DeleteTask(showTopLineP);
|
|
|
|
+ RTOS_SetTask(showTopLineAH, 1000, 250);
|
|
} else {
|
|
} else {
|
|
- RTOS_SetTask(showBotLineAH, 1000, 200);
|
|
|
|
|
|
+ RTOS_DeleteTask(showBotLineP);
|
|
|
|
+ RTOS_SetTask(showBotLineAH, 1000, 250);
|
|
}
|
|
}
|
|
|
|
+ showLabelAH(pos);
|
|
*disp = displayAH;
|
|
*disp = displayAH;
|
|
break;
|
|
break;
|
|
case displayAH:
|
|
case displayAH:
|
|
- showLabelWH(pos);
|
|
|
|
if (pos == 0) {
|
|
if (pos == 0) {
|
|
- RTOS_SetTask(showTopLineWH, 1000, 200);
|
|
|
|
|
|
+ RTOS_DeleteTask(showTopLineAH);
|
|
|
|
+ RTOS_SetTask(showTopLineWH, 1000, 250);
|
|
} else {
|
|
} else {
|
|
- RTOS_SetTask(showBotLineWH, 1000, 200);
|
|
|
|
|
|
+ RTOS_DeleteTask(showBotLineAH);
|
|
|
|
+ RTOS_SetTask(showBotLineWH, 1000, 250);
|
|
}
|
|
}
|
|
|
|
+ showLabelWH(pos);
|
|
*disp = displayWH;
|
|
*disp = displayWH;
|
|
break;
|
|
break;
|
|
case displayWH:
|
|
case displayWH:
|
|
- showLabelU(pos);
|
|
|
|
if (pos == 0) {
|
|
if (pos == 0) {
|
|
- RTOS_SetTask(showTopLineT, 1000, 200);
|
|
|
|
|
|
+ RTOS_DeleteTask(showTopLineWH);
|
|
|
|
+ RTOS_SetTask(showTopLineT, 1000, 500);
|
|
} else {
|
|
} else {
|
|
- RTOS_SetTask(showBotLineT, 1000, 200);
|
|
|
|
|
|
+ RTOS_DeleteTask(showBotLineWH);
|
|
|
|
+ RTOS_SetTask(showBotLineT, 1000, 500);
|
|
}
|
|
}
|
|
|
|
+ showLabelT(pos);
|
|
*disp = displayT;
|
|
*disp = displayT;
|
|
break;
|
|
break;
|
|
case displayT:
|
|
case displayT:
|
|
- showLabelU(pos);
|
|
|
|
if (pos == 0) {
|
|
if (pos == 0) {
|
|
- RTOS_SetTask(showTopLineU, 1000, 200);
|
|
|
|
|
|
+ RTOS_DeleteTask(showTopLineT);
|
|
|
|
+ RTOS_SetTask(showTopLineU, 1000, 250);
|
|
} else {
|
|
} else {
|
|
- RTOS_SetTask(showBotLineU, 1000, 200);
|
|
|
|
|
|
+ RTOS_DeleteTask(showBotLineT);
|
|
|
|
+ RTOS_SetTask(showBotLineU, 1000, 250);
|
|
}
|
|
}
|
|
|
|
+ showLabelU(pos);
|
|
*disp = displayU;
|
|
*disp = displayU;
|
|
break;
|
|
break;
|
|
}
|
|
}
|