|
@@ -57,11 +57,8 @@ 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 -------------------------------------------------------------*/
|
|
@@ -84,8 +81,11 @@ static const max7219_sym_t num[16] = {
|
|
};
|
|
};
|
|
|
|
|
|
/* Private variables ---------------------------------------------------------*/
|
|
/* Private variables ---------------------------------------------------------*/
|
|
-static uint16_t bufVoltage[VALUES_BUFFER_SIZE];
|
|
|
|
-static uint16_t bufCurrent[VALUES_BUFFER_SIZE];
|
|
|
|
|
|
+static struct _slowBuf {
|
|
|
|
+ uint16_t Voltage[VALUES_BUFFER_SIZE];
|
|
|
|
+ uint16_t Current[VALUES_BUFFER_SIZE];
|
|
|
|
+ uint8_t idx;
|
|
|
|
+} slowBuf;
|
|
|
|
|
|
/* averaged values for 1 sek */
|
|
/* averaged values for 1 sek */
|
|
static uint16_t Voltage;
|
|
static uint16_t Voltage;
|
|
@@ -125,6 +125,8 @@ static void showLabelT(uint8_t pos);
|
|
|
|
|
|
static void displayMode(mode_led_t * disp, event_t event, uint8_t pos);
|
|
static void displayMode(mode_led_t * disp, event_t event, uint8_t pos);
|
|
|
|
|
|
|
|
+static void blankLine(uint8_t pos);
|
|
|
|
+
|
|
/* RTOS function prototypes -----------------------------------------------*/
|
|
/* RTOS function prototypes -----------------------------------------------*/
|
|
static void getADCValues(void);
|
|
static void getADCValues(void);
|
|
static void calculateValues(void);
|
|
static void calculateValues(void);
|
|
@@ -141,6 +143,9 @@ static void showBotLineAH(void);
|
|
static void showBotLineWH(void);
|
|
static void showBotLineWH(void);
|
|
static void showBotLineT(void);
|
|
static void showBotLineT(void);
|
|
|
|
|
|
|
|
+static void blankTopLine(void);
|
|
|
|
+static void blankBotLine(void);
|
|
|
|
+
|
|
static void btnScan(void);
|
|
static void btnScan(void);
|
|
static void btnTest(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);
|
|
@@ -174,10 +179,10 @@ void main(void)
|
|
|
|
|
|
/* ROTS tasks */
|
|
/* ROTS tasks */
|
|
RTOS_SetTask(btnScan, 0, BTN_SCAN_PERIOD);
|
|
RTOS_SetTask(btnScan, 0, BTN_SCAN_PERIOD);
|
|
- RTOS_SetTask(getADCValues, 100, 100);
|
|
|
|
- RTOS_SetTask(calculateValues, 101, 1000);
|
|
|
|
- RTOS_SetTask(showTopLineU, 102, 200);
|
|
|
|
- RTOS_SetTask(showBotLineI, 103, 200);
|
|
|
|
|
|
+ RTOS_SetTask(getADCValues, 101, 100);
|
|
|
|
+ RTOS_SetTask(calculateValues, 102, 1000);
|
|
|
|
+ RTOS_SetTask(showTopLineU, 103, 200);
|
|
|
|
+ RTOS_SetTask(showBotLineI, 104, 200);
|
|
displayTopLine = displayU;
|
|
displayTopLine = displayU;
|
|
displayBotLine = displayI;
|
|
displayBotLine = displayI;
|
|
|
|
|
|
@@ -193,17 +198,16 @@ void main(void)
|
|
* и складываем в медленный.
|
|
* и складываем в медленный.
|
|
*/
|
|
*/
|
|
static void getADCValues(void) {
|
|
static void getADCValues(void) {
|
|
- static uint8_t bufIdx = 0;
|
|
|
|
uint16_t * avgVal;
|
|
uint16_t * avgVal;
|
|
|
|
|
|
avgVal = ADC_GetValues();
|
|
avgVal = ADC_GetValues();
|
|
|
|
|
|
- bufVoltage[bufIdx] = *avgVal;
|
|
|
|
- bufCurrent[bufIdx] = *(avgVal + 1);
|
|
|
|
|
|
+ slowBuf.Voltage[slowBuf.idx] = *avgVal;
|
|
|
|
+ slowBuf.Current[slowBuf.idx] = *(avgVal + 1);
|
|
|
|
|
|
- bufIdx ++;
|
|
|
|
- if (bufIdx == VALUES_BUFFER_SIZE) {
|
|
|
|
- bufIdx = 0;
|
|
|
|
|
|
+ slowBuf.idx ++;
|
|
|
|
+ if (slowBuf.idx >= VALUES_BUFFER_SIZE) {
|
|
|
|
+ slowBuf.idx = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -217,8 +221,8 @@ static void calculateValues(void) {
|
|
uint32_t v=0;
|
|
uint32_t v=0;
|
|
|
|
|
|
for (i=0; i<VALUES_BUFFER_SIZE; i++) {
|
|
for (i=0; i<VALUES_BUFFER_SIZE; i++) {
|
|
- v += bufVoltage[i];
|
|
|
|
- c += bufCurrent[i];
|
|
|
|
|
|
+ v += slowBuf.Voltage[i];
|
|
|
|
+ c += slowBuf.Current[i];
|
|
}
|
|
}
|
|
|
|
|
|
Current = (c + (VALUES_BUFFER_SIZE/2)) / VALUES_BUFFER_SIZE;
|
|
Current = (c + (VALUES_BUFFER_SIZE/2)) / VALUES_BUFFER_SIZE;
|
|
@@ -270,6 +274,17 @@ static void showTopLineT(void) {
|
|
showT(0);
|
|
showT(0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void blankTopLine(void) {
|
|
|
|
+ static uint8_t cnt = 0;
|
|
|
|
+ if (cnt < 4) {
|
|
|
|
+ blankLine(0);
|
|
|
|
+ cnt ++;
|
|
|
|
+ } else {
|
|
|
|
+ RTOS_DeleteTask(blankTopLine);
|
|
|
|
+ cnt = 0;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* вывод инфы на нижнем индикаторе
|
|
* вывод инфы на нижнем индикаторе
|
|
*/
|
|
*/
|
|
@@ -297,6 +312,17 @@ static void showBotLineT(void) {
|
|
showT(4);
|
|
showT(4);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void blankBotLine(void) {
|
|
|
|
+ static uint8_t cnt = 0;
|
|
|
|
+ if (cnt < 4) {
|
|
|
|
+ blankLine(4);
|
|
|
|
+ cnt ++;
|
|
|
|
+ } else {
|
|
|
|
+ RTOS_DeleteTask(blankBotLine);
|
|
|
|
+ cnt = 0;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Output given value to given indicator
|
|
* Output given value to given indicator
|
|
* param1: value to show, from '0.000' to '999.9'
|
|
* param1: value to show, from '0.000' to '999.9'
|
|
@@ -370,21 +396,23 @@ static void showValue(uint32_t val, uint8_t pos) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * и как "морагать" только одной строкой?
|
|
|
|
+ */
|
|
|
|
+void blankLine(uint8_t pos) {
|
|
|
|
+ static uint8_t i;
|
|
|
|
+ for (i=0; i<4; i++) {
|
|
|
|
+ MAX7219_WriteData(dig[pos+i], Sym_BLANK);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Output voltage values to given indicator
|
|
* Output voltage values to given indicator
|
|
* param: starting position -- 0 for top
|
|
* param: starting position -- 0 for top
|
|
* any other for bottom.
|
|
* any other for bottom.
|
|
*/
|
|
*/
|
|
static void showU(uint8_t pos) {
|
|
static void showU(uint8_t pos) {
|
|
- uint32_t vlt = 0;
|
|
|
|
- uint8_t tmp;
|
|
|
|
-
|
|
|
|
- for (tmp=0; tmp<VALUES_BUFFER_SIZE; tmp++) {
|
|
|
|
- vlt += bufVoltage[tmp];
|
|
|
|
- }
|
|
|
|
- vlt /= VALUES_BUFFER_SIZE;
|
|
|
|
-
|
|
|
|
- showValue(vlt, pos);
|
|
|
|
|
|
+ showValue(slowBuf.Voltage[slowBuf.idx], pos);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -393,15 +421,7 @@ static void showU(uint8_t pos) {
|
|
* any other for bottom.
|
|
* any other for bottom.
|
|
*/
|
|
*/
|
|
static void showI(uint8_t pos) {
|
|
static void showI(uint8_t pos) {
|
|
- uint32_t crnt = 0;
|
|
|
|
- uint8_t tmp;
|
|
|
|
-
|
|
|
|
- for (tmp=0; tmp<VALUES_BUFFER_SIZE; tmp++) {
|
|
|
|
- crnt += bufCurrent[tmp];
|
|
|
|
- }
|
|
|
|
- crnt /= VALUES_BUFFER_SIZE;
|
|
|
|
-
|
|
|
|
- showValue(crnt, pos);
|
|
|
|
|
|
+ showValue(slowBuf.Current[slowBuf.idx], pos);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -419,7 +439,7 @@ static void showP(uint8_t pos) {
|
|
* any other for bottom.
|
|
* any other for bottom.
|
|
*/
|
|
*/
|
|
static void showAH(uint8_t pos) {
|
|
static void showAH(uint8_t pos) {
|
|
- showValue(CapacityAH, pos);
|
|
|
|
|
|
+ showValue(((CapacityAH + 1800) / 3600), pos);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -428,7 +448,7 @@ static void showAH(uint8_t pos) {
|
|
* any other for bottom.
|
|
* any other for bottom.
|
|
*/
|
|
*/
|
|
static void showWH(uint8_t pos) {
|
|
static void showWH(uint8_t pos) {
|
|
- showValue(CapacityWH, pos);
|
|
|
|
|
|
+ showValue(((CapacityWH + 1800) / 3600), pos);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -537,7 +557,7 @@ static void btnTest(uint8_t btnPin, uint8_t *pressCount, void (*taskShortPress)(
|
|
if (*pressCount >= (BTN_FACTOR * 10)) {
|
|
if (*pressCount >= (BTN_FACTOR * 10)) {
|
|
RTOS_SetTask(taskLongPress, 1, 0); // вызов функции при длительном нажатии
|
|
RTOS_SetTask(taskLongPress, 1, 0); // вызов функции при длительном нажатии
|
|
} else if (*pressCount >= BTN_FACTOR) {
|
|
} else if (*pressCount >= BTN_FACTOR) {
|
|
- RTOS_SetTask(taskShortPress, 2, 0); // вызов функции при коротком нажатии
|
|
|
|
|
|
+ RTOS_SetTask(taskShortPress, 1, 0); // вызов функции при коротком нажатии
|
|
}
|
|
}
|
|
*pressCount = 0;
|
|
*pressCount = 0;
|
|
}
|
|
}
|
|
@@ -607,10 +627,10 @@ static void displayMode(mode_led_t * disp, event_t event, uint8_t pos) {
|
|
case displayWH:
|
|
case displayWH:
|
|
if (pos == 0) {
|
|
if (pos == 0) {
|
|
RTOS_DeleteTask(showTopLineWH);
|
|
RTOS_DeleteTask(showTopLineWH);
|
|
- RTOS_SetTask(showTopLineT, 1000, 500);
|
|
|
|
|
|
+ RTOS_SetTask(showTopLineT, 1000, 250);
|
|
} else {
|
|
} else {
|
|
RTOS_DeleteTask(showBotLineWH);
|
|
RTOS_DeleteTask(showBotLineWH);
|
|
- RTOS_SetTask(showBotLineT, 1000, 500);
|
|
|
|
|
|
+ RTOS_SetTask(showBotLineT, 1000, 250);
|
|
}
|
|
}
|
|
showLabelT(pos);
|
|
showLabelT(pos);
|
|
*disp = displayT;
|
|
*disp = displayT;
|
|
@@ -627,6 +647,40 @@ static void displayMode(mode_led_t * disp, event_t event, uint8_t pos) {
|
|
*disp = displayU;
|
|
*disp = displayU;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ } else if (event == eventLongPress) {
|
|
|
|
+ /* КА долгих нажатий */
|
|
|
|
+ switch (*disp) {
|
|
|
|
+ case displayAH:
|
|
|
|
+ if (pos == 0) {
|
|
|
|
+ RTOS_SetTask(blankTopLine, 0, 250);
|
|
|
|
+ RTOS_SetTask(showTopLineAH, 250, 250);
|
|
|
|
+ } else {
|
|
|
|
+ RTOS_SetTask(blankBotLine, 0, 250);
|
|
|
|
+ RTOS_SetTask(showBotLineAH, 250, 250);
|
|
|
|
+ }
|
|
|
|
+ showLabelAH(pos);
|
|
|
|
+ break;
|
|
|
|
+ case displayWH:
|
|
|
|
+ if (pos == 0) {
|
|
|
|
+ RTOS_SetTask(blankTopLine, 0, 250);
|
|
|
|
+ RTOS_SetTask(showTopLineWH, 250, 250);
|
|
|
|
+ } else {
|
|
|
|
+ RTOS_SetTask(blankBotLine, 0, 250);
|
|
|
|
+ RTOS_SetTask(showBotLineWH, 250, 250);
|
|
|
|
+ }
|
|
|
|
+ showLabelWH(pos);
|
|
|
|
+ break;
|
|
|
|
+ case displayT:
|
|
|
|
+ if (pos == 0) {
|
|
|
|
+ RTOS_SetTask(blankTopLine, 0, 250);
|
|
|
|
+ RTOS_SetTask(showTopLineT, 250, 250);
|
|
|
|
+ } else {
|
|
|
|
+ RTOS_SetTask(blankBotLine, 0, 250);
|
|
|
|
+ RTOS_SetTask(showBotLineT, 250, 250);
|
|
|
|
+ }
|
|
|
|
+ showLabelT(pos);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -637,6 +691,7 @@ static void btn1Short(void) {
|
|
|
|
|
|
/** обработчик длинного нажатия первой кнопки */
|
|
/** обработчик длинного нажатия первой кнопки */
|
|
static void btn1Long(void) {
|
|
static void btn1Long(void) {
|
|
|
|
+ displayMode(&displayTopLine, eventLongPress, 0);
|
|
}
|
|
}
|
|
|
|
|
|
/** обработчик короткого нажатия второй кнопки */
|
|
/** обработчик короткого нажатия второй кнопки */
|
|
@@ -651,6 +706,7 @@ static void btn2Long(void) {
|
|
Timer.hh = 0;
|
|
Timer.hh = 0;
|
|
CapacityAH = 0;
|
|
CapacityAH = 0;
|
|
CapacityWH = 0;
|
|
CapacityWH = 0;
|
|
|
|
+ displayMode(&displayBotLine, eventLongPress, 4);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|