Change for HZ program

develop
刘栩丰 2 years ago
parent 8a6062028c
commit d673bc6288

@ -22,48 +22,43 @@
// aux functions // aux functions
void __buzzer_stop_gpio(buzzer_t *buzzer){ #ifdef _BUZZER_DERIVER_USE_PWM
if (buzzer->fnx.gpioOut != NULL)
buzzer->fnx.gpioOut(_LOW);
}
void __buzzer_stop_pwm(buzzer_t *buzzer){ void __buzzer_stop_pwm(buzzer_t *buzzer){
if (buzzer->fnx.pwmOut != NULL) if (buzzer->fnx.pwmOut != NULL)
buzzer->fnx.pwmOut(0); buzzer->fnx.pwmOut(0);
} }
void __buzzer_turn_on_gpio(buzzer_t *buzzer){
if (buzzer->fnx.gpioOut != NULL)
buzzer->fnx.gpioOut(_HIGH);
}
void __buzzer_turn_on_pwm(buzzer_t *buzzer, uint32_t freq){ void __buzzer_turn_on_pwm(buzzer_t *buzzer, uint32_t freq){
if (buzzer->fnx.pwmOut != NULL) if (buzzer->fnx.pwmOut != NULL)
buzzer->fnx.pwmOut(freq); buzzer->fnx.pwmOut(freq);
} }
void __buzzer_start_gpio(buzzer_t *buzzer){ void __buzzer_start_array_pwm(buzzer_t *buzzer){
__buzzer_turn_on_gpio(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){ #endif
__buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq);
}
#ifdef _BUZZER_DERIVER_USE_GPIO
void __buzzer_start_array_gpio(buzzer_t *buzzer){ void __buzzer_stop_gpio(buzzer_t *buzzer){
__buzzer_turn_on_gpio(buzzer); if (buzzer->fnx.gpioOut != NULL)
buzzer->play_param.time = buzzer->play_param.pTimes[0]; 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){ void __buzzer_start_array_gpio(buzzer_t *buzzer){
__buzzer_turn_on_pwm(buzzer, buzzer->play_param.pFreq[0]); __buzzer_turn_on_gpio(buzzer);
buzzer->play_param.time = buzzer->play_param.pTimes[0]; buzzer->play_param.time = buzzer->play_param.pTimes[0];
} }
#endif
/* /*
* Publics * Publics
@ -87,7 +82,6 @@ void buzzer_interrupt(buzzer_t *buzzer){
if (buzzer->active && if (buzzer->active &&
buzzer->play_param.len > 0 && buzzer->play_param.len > 0 &&
buzzer->counting > buzzer->play_param.time){ buzzer->counting > buzzer->play_param.time){
i = buzzer->play_param.i;
buzzer->counting = 0; buzzer->counting = 0;
buzzer->play_param.i++; buzzer->play_param.i++;
if (buzzer->play_param.i < buzzer->play_param.len){ if (buzzer->play_param.i < buzzer->play_param.len){
@ -95,22 +89,24 @@ void buzzer_interrupt(buzzer_t *buzzer){
if (buzzer->play_param.loop == BUZZER_LOOP_ON){ if (buzzer->play_param.loop == BUZZER_LOOP_ON){
buzzer->play_param.i %= 2; buzzer->play_param.i %= 2;
} }
if (buzzer->type == BUZZER_TYPE_ACTIVE){ #ifdef _BUZZER_DERIVER_USE_GPIO
if (buzzer->play_param.i){ if (buzzer->play_param.i){
__buzzer_stop_gpio(buzzer); __buzzer_stop_gpio(buzzer);
} }
else{ else{
__buzzer_turn_on_gpio(buzzer); __buzzer_turn_on_gpio(buzzer);
} }
} #endif
else{
#ifdef _BUZZER_DERIVER_USE_PWM
if (buzzer->play_param.i){ if (buzzer->play_param.i){
__buzzer_stop_pwm(buzzer); __buzzer_stop_pwm(buzzer);
} }
else{ else{
__buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq); __buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq);
} }
} #endif
} }
else{ else{
buzzer->play_param.time = buzzer->play_param.pTimes[i]; buzzer->play_param.time = buzzer->play_param.pTimes[i];
@ -119,12 +115,12 @@ void buzzer_interrupt(buzzer_t *buzzer){
} }
} }
else{ else{
if (buzzer->type == BUZZER_TYPE_ACTIVE){ #ifdef _BUZZER_DERIVER_USE_GPIO
__buzzer_stop_gpio(buzzer); __buzzer_stop_gpio(buzzer);
} #endif
else{ #ifdef _BUZZER_DERIVER_USE_PWM
__buzzer_stop_pwm(buzzer); __buzzer_stop_pwm(buzzer);
} #endif
buzzer_end_callback(buzzer); buzzer_end_callback(buzzer);
buzzer->active = 0; buzzer->active = 0;
} }
@ -134,32 +130,32 @@ void buzzer_interrupt(buzzer_t *buzzer){
buzzer_err_e buzzer_init(buzzer_t *buzzer){ buzzer_err_e buzzer_init(buzzer_t *buzzer){
if (buzzer != NULL){ if (buzzer != NULL){
// nothing to do here yet // nothing to do here yet
#ifdef _BUZZER_DERIVER_USE_GPIO
if (buzzer->fnx.gpioOut){ if (buzzer->fnx.gpioOut){
buzzer->type = BUZZER_TYPE_ACTIVE;
buzzer->fnx.gpioOut(0); buzzer->fnx.gpioOut(0);
return BUZZER_ERR_OK; return BUZZER_ERR_OK;
} }
else if (buzzer->fnx.pwmOut){ #endif
buzzer->type = BUZZER_TYPE_PASSIVE; #ifdef _BUZZER_DERIVER_USE_PWM
if (buzzer->fnx.pwmOut){
buzzer->fnx.pwmOut(0); buzzer->fnx.pwmOut(0);
return BUZZER_ERR_OK; return BUZZER_ERR_OK;
} }
#endif
return BUZZER_ERR_FAIL;
} }
return BUZZER_ERR_PARAMS; return BUZZER_ERR_PARAMS;
} }
void buzzer_stop(buzzer_t *buzzer){ void buzzer_stop(buzzer_t *buzzer){
if (buzzer != NULL){ if (buzzer != NULL){
buzzer->active = BUZZER_IS_NOT_ACTIVE; buzzer->active = BUZZER_IS_NOT_ACTIVE;
if (buzzer->type == BUZZER_TYPE_ACTIVE){ #ifdef _BUZZER_DERIVER_USE_GPIO
__buzzer_stop_gpio(buzzer); __buzzer_stop_gpio(buzzer);
} #endif
else if (buzzer->type == BUZZER_TYPE_PASSIVE){ #ifdef _BUZZER_DERIVER_USE_PWM
__buzzer_stop_pwm(buzzer); __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->active = BUZZER_IS_ACTIVE;
buzzer->play_param.loop = 0; buzzer->play_param.loop = 0;
buzzer->play_param.len = 0; buzzer->play_param.len = 0;
if (buzzer->type == BUZZER_TYPE_ACTIVE){
#ifdef _BUZZER_DERIVER_USE_GPIO
__buzzer_turn_on_gpio(buzzer); __buzzer_turn_on_gpio(buzzer);
} #endif
else if (buzzer->type == BUZZER_TYPE_PASSIVE){ #ifdef _BUZZER_DERIVER_USE_PWM
buzzer->play_param.freq = freq; buzzer->play_param.freq = freq;
__buzzer_turn_on_pwm(buzzer, 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->play_param.pFreq = NULL;
buzzer->active = BUZZER_IS_ACTIVE; buzzer->active = BUZZER_IS_ACTIVE;
buzzer->play_param.len = 2 + (loop == BUZZER_LOOP_ON); buzzer->play_param.len = 2 + (loop == BUZZER_LOOP_ON);
if (buzzer->type == BUZZER_TYPE_ACTIVE){
__buzzer_start_gpio(buzzer); #ifdef _BUZZER_DERIVER_USE_GPIO
} __buzzer_turn_on_gpio(buzzer);
else if (buzzer->type == BUZZER_TYPE_PASSIVE){ #endif
#ifdef _BUZZER_DERIVER_USE_PWM
buzzer->play_param.freq = freq; buzzer->play_param.freq = freq;
__buzzer_start_pwm(buzzer); __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){ void buzzer_start_array(buzzer_t *buzzer, uint16_t *pPeriod, uint16_t *pFreq, uint16_t len){
if (buzzer != NULL && pPeriod != NULL && if (buzzer != NULL && pPeriod != NULL){
(pFreq != NULL || buzzer->type == BUZZER_TYPE_ACTIVE)){
buzzer->play_param.len = len; buzzer->play_param.len = len;
buzzer->play_param.i = 0; buzzer->play_param.i = 0;
buzzer->play_param.pTimes = pPeriod; buzzer->play_param.pTimes = pPeriod;
buzzer->play_param.pFreq = pFreq;
buzzer->play_param.loop = BUZZER_LOOP_OFF; buzzer->play_param.loop = BUZZER_LOOP_OFF;
buzzer->active = BUZZER_IS_ACTIVE; buzzer->active = BUZZER_IS_ACTIVE;
if (buzzer->type == BUZZER_TYPE_ACTIVE){ #ifdef _BUZZER_DERIVER_USE_GPIO
__buzzer_start_array_gpio(buzzer); __buzzer_start_array_gpio(buzzer);
} #endif
else if (buzzer->type == BUZZER_TYPE_PASSIVE){ #ifdef _BUZZER_DERIVER_USE_PWM
if (pFreq != NULL)
{
buzzer->play_param.pFreq = pFreq;
__buzzer_start_array_pwm(buzzer); __buzzer_start_array_pwm(buzzer);
} }
#endif
} }
} }

@ -10,33 +10,20 @@
* *
*/ */
#ifndef APPLICATION_BUZZER_H_ #ifndef _BUZZER_DRIVER_H_
#define APPLICATION_BUZZER_H_ #define _BUZZER_DRIVER_H_
#include <stdint.h> #include <stdint.h>
#include <stddef.h> #include <stddef.h>
#include <string.h> #include <string.h>
#include "notes.h" #define _BUZZER_DERIVER_USE_PWM
#include "ringtones.h" #define _BUZZER_DERIVER_USE_GPIO
/* /*
* Enumerates * 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 * @brief when call buzzer_start, you can play only for a fixed
* time, or play intermittently * time, or play intermittently
@ -82,9 +69,13 @@ typedef enum{
* @brief Function pointers. For Pwm or GPIO * @brief Function pointers. For Pwm or GPIO
* *
*/ */
#ifdef _BUZZER_DERIVER_USE_PWM
typedef void (*pwmOutFx)(uint32_t freq); 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 * Structs and Unions
@ -99,14 +90,17 @@ typedef struct{
* case * case
* USE THIS FOR PASSIVE DEVICES * USE THIS FOR PASSIVE DEVICES
*/ */
#ifdef _BUZZER_DERIVER_USE_PWM
pwmOutFx pwmOut; pwmOutFx pwmOut;
#endif
/** /**
* @brief Function to handle with GPIO that will * @brief Function to handle with GPIO that will
* handle the Buzzer. * handle the Buzzer.
* USE THIS FOR ACTIVE DEVICES * USE THIS FOR ACTIVE DEVICES
*/ */
#ifdef _BUZZER_DERIVER_USE_GPIO
gpioOutFx gpioOut; gpioOutFx gpioOut;
#endif
// Jut pick only one function, the other must be NULL // Jut pick only one function, the other must be NULL
}fnx; }fnx;
@ -116,17 +110,16 @@ typedef struct{
// internal library variables, no need to work with these // internal library variables, no need to work with these
uint8_t started; uint8_t started;
buzzer_type_e type;
buzzer_active_e active; buzzer_active_e active;
uint_fast16_t counting; uint_fast16_t counting;
struct{ struct{
uint16_t *pTimes; uint16_t *pTimes;/*播放次数数组指针*/
uint16_t *pFreq; uint16_t *pFreq;/*播放频率数组指针*/
uint_fast16_t i; uint_fast16_t i;
uint_fast16_t len; uint_fast16_t len;
int_fast32_t time; int_fast32_t time;/*播放次数*/
uint_fast16_t freq; uint_fast16_t freq;/*播放频率*/
buzzer_loop_e loop; buzzer_loop_e loop;
}play_param; }play_param;
@ -233,4 +226,4 @@ void buzzer_interrupt(buzzer_t *buzzer);
void buzzer_end_callback(buzzer_t *buzzer); void buzzer_end_callback(buzzer_t *buzzer);
#endif /* APPLICATION_BUZZER_H_ */ #endif /* _BUZZER_DRIVER_H_ */

Loading…
Cancel
Save