/* * 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; }