MiaoUI/examples/STM32F103C8T6/lib/general-buzzer/buzzer.c

326 lines
11 KiB
C
Raw Normal View History

2024-11-11 15:52:12 +00:00
/*
* buzzer.c
*
* Created on: 9 de fev de 2022
* Author: pablo.jean
*/
#include "buzzer.h"
/**
* Macros
*/
#define _HIGH 1
#define _LOW 0
/**
* privates
*/
void __buzzer_stop_gpio(buzzer_t *buzzer){
if (buzzer->fnx.gpioOut != NULL)
buzzer->fnx.gpioOut(_LOW);
}
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);
}
void __buzzer_turn_on_pwm(buzzer_t *buzzer, uint32_t freq){
if (buzzer->fnx.pwmOut != NULL)
buzzer->fnx.pwmOut(freq);
}
void __buzzer_play_loop_gpio(buzzer_t *buzzer){
__buzzer_turn_on_gpio(buzzer);
}
void __buzzer_play_loop_pwm(buzzer_t *buzzer){
__buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq);
}
void __buzzer_play_loop_array_gpio(buzzer_t *buzzer){
__buzzer_turn_on_gpio(buzzer);
buzzer->play_param.time = buzzer->play_param.pTimes[0];
}
void __buzzer_play_loop_array_pwm(buzzer_t *buzzer){
__buzzer_turn_on_pwm(buzzer, buzzer->play_param.pFreq[0]);
buzzer->play_param.time = buzzer->play_param.pTimes[0];
}
/*
* Publics
*/
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param buzzer <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
* ע<EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>ʵ<EFBFBD>֡<EFBFBD>
*/
void __attribute__((weak)) buzzer_end_callback(buzzer_t *buzzer) {
// Ĭ<><C4AC>ʵ<EFBFBD><CAB5>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><C2B6>岢ʵ<E5B2A2><CAB5><EFBFBD>ض<EFBFBD><D8B6>IJ<EFBFBD><C4B2><EFBFBD>
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
*/
void buzzer_proc(buzzer_t *buzzer) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t i;
// <20><><EFBFBD>Ӽ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
buzzer->counting += buzzer->interruptMs;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ڻ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>Ҽ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
if (buzzer->active &&
buzzer->play_param.len > 0 &&
buzzer->counting > buzzer->play_param.time) {
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i = buzzer->play_param.i;
// <20><><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
buzzer->counting = 0;
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
buzzer->play_param.i++;
// <20><><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>С<EFBFBD><D0A1><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>
if (buzzer->play_param.i < buzzer->play_param.len) {
// <20><><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>
// <20><><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ƶ<EFBFBD><C6B5>
if (buzzer->play_param.pTimes == NULL) {
// δʹ<CEB4><CAB9><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ƶ<EFBFBD><C6B5>
// <20><><EFBFBD>ѭ<EFBFBD><D1AD>ģʽΪѭ<CEAA><D1AD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><31><D6AE>
if (buzzer->play_param.loop == BUZZER_LOOP_ON) {
buzzer->play_param.i %= 2;
}
// <20><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>Ӧ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
if (buzzer->type == BUZZER_TYPE_ACTIVE) {
if (buzzer->play_param.i % 2 != 0) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<CEAA><31><EFBFBD><EFBFBD>ֹͣ GPIO <20><><EFBFBD><EFBFBD>
__buzzer_stop_gpio(buzzer);
} else {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD> GPIO
__buzzer_turn_on_gpio(buzzer);
}
}
else {
if (buzzer->play_param.i % 2 != 0) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<CEAA><31><EFBFBD><EFBFBD>ֹͣ PWM <20><><EFBFBD><EFBFBD>
__buzzer_stop_pwm(buzzer);
} else {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD> PWM
__buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq);
}
}
}
else {
// ʹ<><CAB9><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ƶ<EFBFBD><C6B5>
// <20><>ȡ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ƶ<EFBFBD><C6B5>
buzzer->play_param.time = buzzer->play_param.pTimes[i];
buzzer->play_param.freq = buzzer->play_param.pFreq[i];
// <20><> PWM <20><>ʹ<EFBFBD><CAB9><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
__buzzer_turn_on_pwm(buzzer, buzzer->play_param.freq);
}
}
else {
// <20><><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD>ﵽָ<EFB5BD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
if (buzzer->type == BUZZER_TYPE_ACTIVE) {
// ֹͣ GPIO <20><><EFBFBD><EFBFBD>
__buzzer_stop_gpio(buzzer);
} else {
// ֹͣ PWM <20><><EFBFBD><EFBFBD>
__buzzer_stop_pwm(buzzer);
}
// ִ<>н<EFBFBD><D0BD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
buzzer_end_callback(buzzer);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>Ϊ<EFBFBD>ǻ״̬
buzzer->active = 0;
}
}
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param buzzer <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
* @return <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󡣸<EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ򱻶<EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ij<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ջ<EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>Ĺ<EFBFBD><EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʧ<EFBFBD>ܡ<EFBFBD>
* <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BUZZER_ERR_OK<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣬷<EFBFBD><EFBFBD><EFBFBD> BUZZER_ERR_PARAMS<EFBFBD><EFBFBD>
*/
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;
}
}
return BUZZER_ERR_PARAMS;
}
/**
* @brief ֹͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD>š<EFBFBD>
*
* @param buzzer <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
*
* <EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD>š<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ǻ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<EFBFBD><EFBFBD>Ӧ<EFBFBD>IJ<EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ע<EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD>øú<EFBFBD><EFBFBD><EFBFBD>֮ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
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);
}
}
}
/**
* @brief <EFBFBD>򿪷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʡ<EFBFBD>
*
* @param buzzer <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
* @param freq <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ򿪷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>
* ע<EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD>øú<EFBFBD><EFBFBD><EFBFBD>֮ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void buzzer_turn_on(buzzer_t *buzzer, uint16_t freq){
if (buzzer != NULL){
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);
}
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param buzzer <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
* @param freq <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param period <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>
* @param loop ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>
*/
void buzzer_play_loop(buzzer_t *buzzer, uint16_t freq, uint16_t period, buzzer_loop_e loop){
if (buzzer != NULL){
buzzer->play_param.i = 0;
buzzer->counting = 0;
buzzer->play_param.time = period;
buzzer->play_param.loop = loop;
buzzer->play_param.pTimes = NULL;
buzzer->play_param.pFreq = NULL;
buzzer->play_param.len = 2 + (loop == BUZZER_LOOP_ON);
buzzer->active = BUZZER_IS_ACTIVE;
if (buzzer->type == BUZZER_TYPE_ACTIVE){
__buzzer_play_loop_gpio(buzzer);
}
else if (buzzer->type == BUZZER_TYPE_PASSIVE){
buzzer->play_param.freq = freq;
__buzzer_play_loop_pwm(buzzer);
}
}
}
void buzzer_play_times(buzzer_t *buzzer, uint16_t freq, uint16_t period, uint8_t count) {
if (buzzer != NULL) {
buzzer->play_param.i = 0;
buzzer->counting = 0;
buzzer->play_param.time = period;
buzzer->play_param.loop = BUZZER_LOOP_OFF;
buzzer->play_param.pTimes = NULL;
buzzer->play_param.pFreq = NULL;
buzzer->active = BUZZER_IS_ACTIVE;
buzzer->play_param.len = count * 2;
if (buzzer->type == BUZZER_TYPE_ACTIVE) {
__buzzer_play_loop_gpio(buzzer);
}
else if (buzzer->type == BUZZER_TYPE_PASSIVE) {
buzzer->play_param.freq = freq;
__buzzer_play_loop_pwm(buzzer);
}
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param buzzer <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
* @param pPeriod <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
* @param pFreq <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param len <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD>ȡ<EFBFBD>
*/
void buzzer_play_loop_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)){
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_play_loop_array_gpio(buzzer);
}
else if (buzzer->type == BUZZER_TYPE_PASSIVE){
__buzzer_play_loop_array_pwm(buzzer);
}
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD>ڻ״̬<EFBFBD><EFBFBD>
*
* @param buzzer <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ״̬<EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD> @ref buzzer_active_e ö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĻ״̬<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ NULL<EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD> @ref BUZZER_IS_NOT_ACTIVE<EFBFBD><EFBFBD>
*/
buzzer_active_e buzzer_is_active(buzzer_t *buzzer) {
if (buzzer != NULL) {
return buzzer->active;
}
return BUZZER_IS_NOT_ACTIVE;
}