Skip to content

Commit 3b0556a

Browse files
committed
fix: add judgment to prevent valid_count overflow
Closes #396
1 parent db62dff commit 3b0556a

File tree

5 files changed

+37
-16
lines changed

5 files changed

+37
-16
lines changed

components/zero_detection/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# ChangeLog
22

3+
## v0.0.6 - 2024-9-19
4+
5+
### Bug Fix:
6+
7+
- Fix valid_count data overflow.
8+
39
## v0.0.5 - 2024-3-12
410

511
### Bug Fix:

components/zero_detection/idf_component.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: "0.0.5"
1+
version: "0.0.6"
22
description: Zero Cross Detection Driver
33
url: https://github.com/espressif/esp-iot-solution/tree/master/components/zero_detection
44
repository: https://github.com/espressif/esp-iot-solution.git

components/zero_detection/include/zero_detection.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ typedef enum {
6060
PULSE_WAVE,
6161
} zero_signal_type_t;
6262

63+
/**
64+
* @brief Zero detection signal edge type
65+
*/
66+
typedef enum {
67+
CAP_EDGE_POS = 0,
68+
CAP_EDGE_NEG,
69+
} zero_signal_edge_t;
70+
6371
/**
6472
* @brief Zero detection driver type
6573
*/
@@ -78,15 +86,15 @@ typedef union {
7886
* @brief Signal exceeds frequency range data return type
7987
*/
8088
struct signal_freq_event_data_t {
81-
mcpwm_capture_edge_t cap_edge; /*!< Trigger edge of zero cross signal */
89+
zero_signal_edge_t cap_edge; /*!< Trigger edge of zero cross signal */
8290
uint32_t full_cycle_us; /*!< Current signal cycle */
8391
} signal_freq_event_data; /*!< Signal freq event data struct */
8492

8593
/**
8694
* @brief Signal valid data return type
8795
*/
8896
struct signal_valid_event_data_t {
89-
mcpwm_capture_edge_t cap_edge; /*!< Trigger edge of zero cross signal */
97+
zero_signal_edge_t cap_edge; /*!< Trigger edge of zero cross signal */
9098
uint32_t full_cycle_us; /*!< Current signal cycle */
9199
uint16_t valid_count; /*!< Counting when the signal is valid */
92100
} signal_valid_event_data; /*!< Signal valid event data struct */
@@ -95,7 +103,7 @@ typedef union {
95103
* @brief Signal invalid data return type
96104
*/
97105
struct signal_invalid_event_data_t {
98-
mcpwm_capture_edge_t cap_edge; /*!< Trigger edge of zero cross signal */
106+
zero_signal_edge_t cap_edge; /*!< Trigger edge of zero cross signal */
99107
uint32_t full_cycle_us; /*!< Current signal cycle */
100108
uint16_t invalid_count; /*!< Counting when the signal is invalid */
101109
} signal_invalid_event_data; /*!< Signal invalid event data struct */

components/zero_detection/zero_detection.c

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ static void IRAM_ATTR zero_cross_handle_interrupt(void *user_data, const mcpwm_c
6262
gpio_status = gpio_ll_get_level(&GPIO, zero_cross_dev->capture_pin);
6363
}
6464
#if defined(SOC_MCPWM_SUPPORTED)
65-
bool edge_status = (gpio_status && zero_cross_dev->zero_driver_type == GPIO_TYPE) || (edata->cap_edge == MCPWM_CAP_EDGE_POS && zero_cross_dev->zero_driver_type == MCPWM_TYPE);
65+
bool edge_status = (gpio_status && zero_cross_dev->zero_driver_type == GPIO_TYPE) || ((zero_signal_edge_t)edata->cap_edge == CAP_EDGE_POS && zero_cross_dev->zero_driver_type == MCPWM_TYPE);
6666
#else
6767
bool edge_status = gpio_status && zero_cross_dev->zero_driver_type == GPIO_TYPE;
6868
#endif
@@ -92,7 +92,11 @@ static void IRAM_ATTR zero_cross_handle_interrupt(void *user_data, const mcpwm_c
9292
zero_detect_cb_param_t param = {0};
9393
param.signal_valid_event_data.valid_count = zero_cross_dev->valid_count;
9494
param.signal_valid_event_data.full_cycle_us = zero_cross_dev->full_cycle_us;
95-
param.signal_valid_event_data.cap_edge = MCPWM_CAP_EDGE_POS;
95+
param.signal_valid_event_data.cap_edge = CAP_EDGE_POS;
96+
//Add judgments to prevent data overflow
97+
if (zero_cross_dev->valid_count >= UINT16_MAX - 1) {
98+
zero_cross_dev->valid_count = zero_cross_dev->valid_times;
99+
}
96100
zero_cross_dev->event_callback(SIGNAL_VALID, &param, zero_cross_dev->user_data);
97101
}
98102
}
@@ -120,7 +124,10 @@ static void IRAM_ATTR zero_cross_handle_interrupt(void *user_data, const mcpwm_c
120124
zero_detect_cb_param_t param = {0};
121125
param.signal_valid_event_data.valid_count = zero_cross_dev->valid_count;
122126
param.signal_valid_event_data.full_cycle_us = zero_cross_dev->full_cycle_us;
123-
param.signal_valid_event_data.cap_edge = MCPWM_CAP_EDGE_NEG;
127+
param.signal_valid_event_data.cap_edge = CAP_EDGE_NEG;
128+
if (zero_cross_dev->valid_count >= UINT16_MAX - 1) {
129+
zero_cross_dev->valid_count = zero_cross_dev->valid_times;
130+
}
124131
zero_cross_dev->event_callback(SIGNAL_VALID, &param, zero_cross_dev->user_data);
125132
}
126133
}
@@ -146,19 +153,19 @@ static void IRAM_ATTR zero_cross_handle_interrupt(void *user_data, const mcpwm_c
146153
param.signal_invalid_event_data.invalid_count = zero_cross_dev->invalid_count;
147154
param.signal_invalid_event_data.full_cycle_us = zero_cross_dev->full_cycle_us;
148155
if (edge_status) {
149-
param.signal_invalid_event_data.cap_edge = MCPWM_CAP_EDGE_POS;
156+
param.signal_invalid_event_data.cap_edge = CAP_EDGE_POS;
150157
} else {
151-
param.signal_invalid_event_data.cap_edge = MCPWM_CAP_EDGE_NEG;
158+
param.signal_invalid_event_data.cap_edge = CAP_EDGE_NEG;
152159
}
153160
zero_cross_dev->event_callback(SIGNAL_INVALID, &param, zero_cross_dev->user_data);
154161
}
155162
}
156163
if (zero_cross_dev->event_callback && (zero_cross_dev->cap_val_end_of_sample != 0) && (zero_cross_dev->cap_val_begin_of_sample != 0)) {
157164
zero_detect_cb_param_t param = {0};
158165
if (edge_status) {
159-
param.signal_freq_event_data.cap_edge = MCPWM_CAP_EDGE_POS;
166+
param.signal_freq_event_data.cap_edge = CAP_EDGE_POS;
160167
} else {
161-
param.signal_freq_event_data.cap_edge = MCPWM_CAP_EDGE_NEG;
168+
param.signal_freq_event_data.cap_edge = CAP_EDGE_NEG;
162169
}
163170
param.signal_freq_event_data.full_cycle_us = zero_cross_dev->full_cycle_us;
164171
zero_cross_dev->event_callback(SIGNAL_FREQ_OUT_OF_RANGE, &param, zero_cross_dev->user_data);

examples/zero_cross_detection/main/zero_detect_example_main.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void IRAM_ATTR zero_detection_event_cb(zero_detect_event_t zero_detect_event, ze
4545
switch (zero_detect_event) {
4646
case SIGNAL_FREQ_OUT_OF_RANGE:
4747
freq_out_of_range_count++;
48-
if (param->signal_freq_event_data.cap_edge == MCPWM_CAP_EDGE_POS) {
48+
if (param->signal_freq_event_data.cap_edge == CAP_EDGE_POS) {
4949
if (zcd.relay_out_of_range == RELAY_DEFAULT_HIGH) {
5050
gpio_ll_set_level(&GPIO, zcd.control_pin, zcd.relay_active_level);
5151
} else if ((CONFIG_ZERO_DETECT_SIGNAL_TYPE == PULSE_WAVE) && (zcd.relay_out_of_range == RELAY_DEFAULT_LOW)) { //The relay off performed on the rising edge of the pulse signal.
@@ -58,7 +58,7 @@ void IRAM_ATTR zero_detection_event_cb(zero_detect_event_t zero_detect_event, ze
5858
}
5959
break;
6060
case SIGNAL_VALID:
61-
if (param->signal_valid_event_data.cap_edge == MCPWM_CAP_EDGE_POS) {
61+
if (param->signal_valid_event_data.cap_edge == CAP_EDGE_POS) {
6262
if (zcd.relay_suspend) {
6363
if (zcd.relay_on_off) {
6464
gpio_ll_set_level(&GPIO, zcd.control_pin, zcd.relay_active_level);
@@ -73,7 +73,7 @@ void IRAM_ATTR zero_detection_event_cb(zero_detect_event_t zero_detect_event, ze
7373
}
7474
}
7575
}
76-
} else if (param->signal_valid_event_data.cap_edge == MCPWM_CAP_EDGE_NEG) {
76+
} else if (param->signal_valid_event_data.cap_edge == CAP_EDGE_NEG) {
7777
if (zcd.relay_suspend) {
7878
if (zcd.relay_on_off == false) {
7979
gpio_ll_set_level(&GPIO, zcd.control_pin, !zcd.relay_active_level);
@@ -90,7 +90,7 @@ void IRAM_ATTR zero_detection_event_cb(zero_detect_event_t zero_detect_event, ze
9090
}
9191
break;
9292
case SIGNAL_INVALID:
93-
if (param->signal_invalid_event_data.cap_edge == MCPWM_CAP_EDGE_POS) {
93+
if (param->signal_invalid_event_data.cap_edge == CAP_EDGE_POS) {
9494
if (zcd.relay_out_of_range == RELAY_CONTROL_BY_USER) {
9595
if (zcd.relay_suspend) { //Operation is suspend, on or off
9696
if (zcd.relay_on_off == true) {
@@ -107,7 +107,7 @@ void IRAM_ATTR zero_detection_event_cb(zero_detect_event_t zero_detect_event, ze
107107
}
108108
}
109109
}
110-
} else if (param->signal_invalid_event_data.cap_edge == MCPWM_CAP_EDGE_NEG) {
110+
} else if (param->signal_invalid_event_data.cap_edge == CAP_EDGE_NEG) {
111111
if (zcd.relay_out_of_range == RELAY_CONTROL_BY_USER) {
112112
if (zcd.relay_suspend) { //Operation is suspend, on or off
113113
if (zcd.relay_on_off == false) {

0 commit comments

Comments
 (0)