You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

230 lines
5.6 KiB
C

/*
* buzzer.c
*
* Created on: 9 de fev de 2022
* Author: pablo.jean
*/
#include "buzzer.h"
/**
* Macros
*/
#define _HIGH 1
#define _LOW 0
/**
* privates
*/
// aux functions
#ifdef _BUZZER_DERIVER_USE_PWM
void __buzzer_stop_pwm(buzzer_t *buzzer){
if (buzzer->pwmOut != NULL)
buzzer->pwmOut(0);
}
void __buzzer_turn_on_pwm(buzzer_t *buzzer, uint16_t freq){
if (buzzer->pwmOut != NULL)
buzzer->pwmOut(freq);
}
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];
}
#endif
#ifdef _BUZZER_DERIVER_USE_GPIO
void __buzzer_stop_gpio(buzzer_t *buzzer){
if (buzzer->gpioOut != NULL)
buzzer->gpioOut(_LOW);
}
void __buzzer_turn_on_gpio(buzzer_t *buzzer){
if (buzzer->gpioOut != NULL)
buzzer->gpioOut(_HIGH);
}
void __buzzer_start_array_gpio(buzzer_t *buzzer){
__buzzer_turn_on_gpio(buzzer);
buzzer->play_param.time = buzzer->play_param.pTimes[0];
}
#endif
/*
* Publics
*/
// callback
void __attribute__((weak)) buzzer_end_callback(buzzer_t *buzzer){
}
// interrupts
void buzzer_interrupt(buzzer_t *buzzer){
uint16_t i;
if (buzzer->active)
buzzer->counting += buzzer->cycleMsInterval;
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_time > 0){
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
if (buzzer->play_param.loop_time == 0){
buzzer_end_callback(buzzer);
buzzer->active = BUZZER_IS_NOT_ACTIVE;
}else
buzzer->play_param.loop_time--;
}
else{
buzzer->play_param.time = buzzer->play_param.pTimes[i];
buzzer->play_param.freq = buzzer->play_param.pFreq[i];
#ifdef _BUZZER_DERIVER_USE_GPIO
if((i%2) == 0)
__buzzer_turn_on_gpio(buzzer);
else
__buzzer_stop_gpio(buzzer);
#endif
#ifdef _BUZZER_DERIVER_USE_PWM
__buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq);
#endif
}
}
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 = BUZZER_IS_NOT_ACTIVE;
}
}
}
buzzer_err_e buzzer_init(buzzer_t *buzzer){
if (buzzer != NULL){
// nothing to do here yet
#ifdef _BUZZER_DERIVER_USE_GPIO
if (buzzer->gpioOut){
buzzer->gpioOut(0);
return BUZZER_ERR_OK;
}
#endif
#ifdef _BUZZER_DERIVER_USE_PWM
if (buzzer->pwmOut){
buzzer->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;
#ifdef _BUZZER_DERIVER_USE_GPIO
__buzzer_stop_gpio(buzzer);
#endif
#ifdef _BUZZER_DERIVER_USE_PWM
__buzzer_stop_pwm(buzzer);
#endif
}
}
void buzzer_turn_on(buzzer_t *buzzer, uint16_t freq){
if (buzzer != NULL){
buzzer->active = BUZZER_IS_ACTIVE;
buzzer->play_param.loop_time = 0;
buzzer->play_param.len = 0;
#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
}
}
void buzzer_start(buzzer_t *buzzer, uint16_t freq, uint16_t period, uint16_t loop_time){
if (buzzer != NULL){
buzzer->play_param.i = 0;
buzzer->play_param.time = period;//cycleMsInterval
buzzer->play_param.loop_time = loop_time*2;
buzzer->play_param.pTimes = NULL;
buzzer->play_param.pFreq = NULL;
buzzer->active = BUZZER_IS_ACTIVE;
buzzer->play_param.len = 2 + (loop_time>0?1:0);
#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){
buzzer->play_param.len = len;
buzzer->play_param.i = 0;
buzzer->play_param.pTimes = pPeriod;
buzzer->play_param.loop_time = 0;
buzzer->active = BUZZER_IS_ACTIVE;
#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
}
}
buzzer_active_e buzzer_is_active(buzzer_t *buzzer){
if (buzzer != NULL){
return buzzer->active;
}
return BUZZER_IS_NOT_ACTIVE;
}