From d673bc6288b9c0edb8ea5917f755bbc4c3704504 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=A0=A9=E4=B8=B0?= Date: Fri, 18 Aug 2023 10:02:25 +0800 Subject: [PATCH] Change for HZ program --- buzzer.c | 230 +++++++++++++++++++++++++++---------------------------- buzzer.h | 43 +++++------ 2 files changed, 133 insertions(+), 140 deletions(-) diff --git a/buzzer.c b/buzzer.c index d45b565..58c1ac9 100644 --- a/buzzer.c +++ b/buzzer.c @@ -22,48 +22,43 @@ // aux functions -void __buzzer_stop_gpio(buzzer_t *buzzer){ - if (buzzer->fnx.gpioOut != NULL) - buzzer->fnx.gpioOut(_LOW); -} +#ifdef _BUZZER_DERIVER_USE_PWM void __buzzer_stop_pwm(buzzer_t *buzzer){ - if (buzzer->fnx.pwmOut != NULL) - buzzer->fnx.pwmOut(0); -} - -void __buzzer_turn_on_gpio(buzzer_t *buzzer){ - if (buzzer->fnx.gpioOut != NULL) - buzzer->fnx.gpioOut(_HIGH); + if (buzzer->fnx.pwmOut != NULL) + buzzer->fnx.pwmOut(0); } void __buzzer_turn_on_pwm(buzzer_t *buzzer, uint32_t freq){ - if (buzzer->fnx.pwmOut != NULL) - buzzer->fnx.pwmOut(freq); + if (buzzer->fnx.pwmOut != NULL) + buzzer->fnx.pwmOut(freq); } -void __buzzer_start_gpio(buzzer_t *buzzer){ - __buzzer_turn_on_gpio(buzzer); +void __buzzer_start_array_pwm(buzzer_t *buzzer){ + __buzzer_turn_on_pwm(buzzer, buzzer->play_param.pFreq[0]); + buzzer->play_param.time = buzzer->play_param.pTimes[0]; } -void __buzzer_start_pwm(buzzer_t *buzzer){ - __buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq); -} +#endif +#ifdef _BUZZER_DERIVER_USE_GPIO -void __buzzer_start_array_gpio(buzzer_t *buzzer){ - __buzzer_turn_on_gpio(buzzer); - buzzer->play_param.time = buzzer->play_param.pTimes[0]; +void __buzzer_stop_gpio(buzzer_t *buzzer){ + if (buzzer->fnx.gpioOut != NULL) + buzzer->fnx.gpioOut(_LOW); +} +void __buzzer_turn_on_gpio(buzzer_t *buzzer){ + if (buzzer->fnx.gpioOut != NULL) + buzzer->fnx.gpioOut(_HIGH); } -void __buzzer_start_array_pwm(buzzer_t *buzzer){ - __buzzer_turn_on_pwm(buzzer, buzzer->play_param.pFreq[0]); +void __buzzer_start_array_gpio(buzzer_t *buzzer){ + __buzzer_turn_on_gpio(buzzer); buzzer->play_param.time = buzzer->play_param.pTimes[0]; } - - +#endif /* * Publics @@ -78,88 +73,89 @@ void __attribute__((weak)) buzzer_end_callback(buzzer_t *buzzer){ // interrupts void buzzer_interrupt(buzzer_t *buzzer){ - uint16_t i; + uint16_t i; // if (buzzer->started == 0){ // return; // } - buzzer->counting += buzzer->interruptMs; - if (buzzer->active && - buzzer->play_param.len > 0 && - buzzer->counting > buzzer->play_param.time){ - i = buzzer->play_param.i; - buzzer->counting = 0; - buzzer->play_param.i++; - if (buzzer->play_param.i < buzzer->play_param.len){ - if (buzzer->play_param.pTimes == NULL){ - if (buzzer->play_param.loop == BUZZER_LOOP_ON){ - buzzer->play_param.i %= 2; - } - if (buzzer->type == BUZZER_TYPE_ACTIVE){ - if (buzzer->play_param.i){ - __buzzer_stop_gpio(buzzer); - } - else{ - __buzzer_turn_on_gpio(buzzer); - } - } - else{ - if (buzzer->play_param.i){ - __buzzer_stop_pwm(buzzer); - } - else{ - __buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq); - } - } - } - else{ - buzzer->play_param.time = buzzer->play_param.pTimes[i]; - buzzer->play_param.freq = buzzer->play_param.pFreq[i]; - __buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq); - } - } - else{ - if (buzzer->type == BUZZER_TYPE_ACTIVE){ - __buzzer_stop_gpio(buzzer); - } - else{ - __buzzer_stop_pwm(buzzer); - } - buzzer_end_callback(buzzer); - buzzer->active = 0; - } - } + buzzer->counting += buzzer->interruptMs; + if (buzzer->active && + buzzer->play_param.len > 0 && + buzzer->counting > buzzer->play_param.time){ + buzzer->counting = 0; + buzzer->play_param.i++; + if (buzzer->play_param.i < buzzer->play_param.len){ + if (buzzer->play_param.pTimes == NULL){ + if (buzzer->play_param.loop == BUZZER_LOOP_ON){ + buzzer->play_param.i %= 2; + } +#ifdef _BUZZER_DERIVER_USE_GPIO + if (buzzer->play_param.i){ + __buzzer_stop_gpio(buzzer); + } + else{ + __buzzer_turn_on_gpio(buzzer); + } +#endif + +#ifdef _BUZZER_DERIVER_USE_PWM + if (buzzer->play_param.i){ + __buzzer_stop_pwm(buzzer); + } + else{ + __buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq); + } +#endif + + } + else{ + buzzer->play_param.time = buzzer->play_param.pTimes[i]; + buzzer->play_param.freq = buzzer->play_param.pFreq[i]; + __buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq); + } + } + else{ +#ifdef _BUZZER_DERIVER_USE_GPIO + __buzzer_stop_gpio(buzzer); +#endif +#ifdef _BUZZER_DERIVER_USE_PWM + __buzzer_stop_pwm(buzzer); +#endif + buzzer_end_callback(buzzer); + buzzer->active = 0; + } + } } buzzer_err_e buzzer_init(buzzer_t *buzzer){ if (buzzer != NULL){ - // nothing to do here yet - if (buzzer->fnx.gpioOut){ - buzzer->type = BUZZER_TYPE_ACTIVE; - buzzer->fnx.gpioOut(0); - - return BUZZER_ERR_OK; - } - else if (buzzer->fnx.pwmOut){ - buzzer->type = BUZZER_TYPE_PASSIVE; - buzzer->fnx.pwmOut(0); - - return BUZZER_ERR_OK; - } + // nothing to do here yet +#ifdef _BUZZER_DERIVER_USE_GPIO + if (buzzer->fnx.gpioOut){ + buzzer->fnx.gpioOut(0); + return BUZZER_ERR_OK; + } +#endif +#ifdef _BUZZER_DERIVER_USE_PWM + if (buzzer->fnx.pwmOut){ + buzzer->fnx.pwmOut(0); + return BUZZER_ERR_OK; + } +#endif + return BUZZER_ERR_FAIL; } - return BUZZER_ERR_PARAMS; } void buzzer_stop(buzzer_t *buzzer){ if (buzzer != NULL){ buzzer->active = BUZZER_IS_NOT_ACTIVE; - if (buzzer->type == BUZZER_TYPE_ACTIVE){ - __buzzer_stop_gpio(buzzer); - } - else if (buzzer->type == BUZZER_TYPE_PASSIVE){ - __buzzer_stop_pwm(buzzer); - } +#ifdef _BUZZER_DERIVER_USE_GPIO + __buzzer_stop_gpio(buzzer); +#endif +#ifdef _BUZZER_DERIVER_USE_PWM + __buzzer_stop_pwm(buzzer); +#endif } } @@ -168,13 +164,14 @@ void buzzer_turn_on(buzzer_t *buzzer, uint16_t freq){ buzzer->active = BUZZER_IS_ACTIVE; buzzer->play_param.loop = 0; buzzer->play_param.len = 0; - if (buzzer->type == BUZZER_TYPE_ACTIVE){ - __buzzer_turn_on_gpio(buzzer); - } - else if (buzzer->type == BUZZER_TYPE_PASSIVE){ - buzzer->play_param.freq = freq; - __buzzer_turn_on_pwm(buzzer, freq); - } + +#ifdef _BUZZER_DERIVER_USE_GPIO + __buzzer_turn_on_gpio(buzzer); +#endif +#ifdef _BUZZER_DERIVER_USE_PWM + buzzer->play_param.freq = freq; + __buzzer_turn_on_pwm(buzzer, freq); +#endif } } @@ -187,31 +184,34 @@ void buzzer_start(buzzer_t *buzzer, uint16_t freq, uint16_t period, buzzer_loop_ buzzer->play_param.pFreq = NULL; buzzer->active = BUZZER_IS_ACTIVE; buzzer->play_param.len = 2 + (loop == BUZZER_LOOP_ON); - if (buzzer->type == BUZZER_TYPE_ACTIVE){ - __buzzer_start_gpio(buzzer); - } - else if (buzzer->type == BUZZER_TYPE_PASSIVE){ - buzzer->play_param.freq = freq; - __buzzer_start_pwm(buzzer); - } + +#ifdef _BUZZER_DERIVER_USE_GPIO + __buzzer_turn_on_gpio(buzzer); +#endif +#ifdef _BUZZER_DERIVER_USE_PWM + buzzer->play_param.freq = freq; + __buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq); +#endif } } void buzzer_start_array(buzzer_t *buzzer, uint16_t *pPeriod, uint16_t *pFreq, uint16_t len){ - if (buzzer != NULL && pPeriod != NULL && - (pFreq != NULL || buzzer->type == BUZZER_TYPE_ACTIVE)){ + if (buzzer != NULL && pPeriod != NULL){ buzzer->play_param.len = len; buzzer->play_param.i = 0; buzzer->play_param.pTimes = pPeriod; - buzzer->play_param.pFreq = pFreq; buzzer->play_param.loop = BUZZER_LOOP_OFF; buzzer->active = BUZZER_IS_ACTIVE; - if (buzzer->type == BUZZER_TYPE_ACTIVE){ - __buzzer_start_array_gpio(buzzer); - } - else if (buzzer->type == BUZZER_TYPE_PASSIVE){ - __buzzer_start_array_pwm(buzzer); - } +#ifdef _BUZZER_DERIVER_USE_GPIO + __buzzer_start_array_gpio(buzzer); +#endif +#ifdef _BUZZER_DERIVER_USE_PWM + if (pFreq != NULL) + { + buzzer->play_param.pFreq = pFreq; + __buzzer_start_array_pwm(buzzer); + } +#endif } } diff --git a/buzzer.h b/buzzer.h index 2b48b81..09f9cd6 100644 --- a/buzzer.h +++ b/buzzer.h @@ -10,33 +10,20 @@ * */ -#ifndef APPLICATION_BUZZER_H_ -#define APPLICATION_BUZZER_H_ +#ifndef _BUZZER_DRIVER_H_ +#define _BUZZER_DRIVER_H_ #include #include #include -#include "notes.h" -#include "ringtones.h" +#define _BUZZER_DERIVER_USE_PWM +#define _BUZZER_DERIVER_USE_GPIO /* * Enumerates */ -/** - * @brief Defines the buzzer type - * - * BUZZER_TYPE_PASSIVE are devices that need PWM to work. - * Can reproduce any frequency - * BUZZER_TYPE_ACTIVE work only with a simple GPIO - * has a fixed frequency - */ -typedef enum{ - BUZZER_TYPE_PASSIVE, - BUZZER_TYPE_ACTIVE -}buzzer_type_e; - /** * @brief when call buzzer_start, you can play only for a fixed * time, or play intermittently @@ -82,9 +69,13 @@ typedef enum{ * @brief Function pointers. For Pwm or GPIO * */ +#ifdef _BUZZER_DERIVER_USE_PWM typedef void (*pwmOutFx)(uint32_t freq); -typedef void (*gpioOutFx)(uint32_t val); +#endif +#ifdef _BUZZER_DERIVER_USE_GPIO +typedef void (*gpioOutFx)(uint8_t val); +#endif /* * Structs and Unions @@ -99,14 +90,17 @@ typedef struct{ * case * USE THIS FOR PASSIVE DEVICES */ +#ifdef _BUZZER_DERIVER_USE_PWM pwmOutFx pwmOut; +#endif /** * @brief Function to handle with GPIO that will * handle the Buzzer. * USE THIS FOR ACTIVE DEVICES */ +#ifdef _BUZZER_DERIVER_USE_GPIO gpioOutFx gpioOut; - +#endif // Jut pick only one function, the other must be NULL }fnx; @@ -116,17 +110,16 @@ typedef struct{ // internal library variables, no need to work with these uint8_t started; - buzzer_type_e type; buzzer_active_e active; uint_fast16_t counting; struct{ - uint16_t *pTimes; - uint16_t *pFreq; + uint16_t *pTimes;/*播放次数数组指针*/ + uint16_t *pFreq;/*播放频率数组指针*/ uint_fast16_t i; uint_fast16_t len; - int_fast32_t time; - uint_fast16_t freq; + int_fast32_t time;/*播放次数*/ + uint_fast16_t freq;/*播放频率*/ buzzer_loop_e loop; }play_param; @@ -233,4 +226,4 @@ void buzzer_interrupt(buzzer_t *buzzer); void buzzer_end_callback(buzzer_t *buzzer); -#endif /* APPLICATION_BUZZER_H_ */ +#endif /* _BUZZER_DRIVER_H_ */