#include "Buzzer.h" #include "config/ConfigManager.h" Buzzer::Buzzer() :m_Thread(INVALID_HANDLE_VALUE) , m_RunFlag(false) , m_StopAlarmFlag(false) , m_PauseAlarmFlag(false) { } Buzzer::~Buzzer() { EnterCriticalSection(&m_Cs); m_RunFlag = false; m_StopAlarmFlag = false; m_PauseAlarmFlag = false; WakeConditionVariable(&m_Cv); LeaveCriticalSection(&m_Cs); Sleep(400); DeleteCriticalSection(&m_Cs); } void Buzzer::Init() { m_BuzzerCfg = ConfigManager::GetInstance()->GetIoCfgWrapper()->m_Buzzer; InitializeCriticalSection(&m_Cs); InitializeConditionVariable(&m_Cv); m_RunFlag = true; m_Thread = AtlCreateThread(BuzzerProc, this); } DWORD WINAPI Buzzer::BuzzerProc(Buzzer* _this) { if (_this) { _this->BuzzerRun(); } return 0; } void Buzzer::BuzzerRun() { while (m_RunFlag) { EnterCriticalSection(&m_Cs); while (!m_StopAlarmFlag && !m_PauseAlarmFlag) { SleepConditionVariableCS(&m_Cv, &m_Cs, INFINITE); } LeaveCriticalSection(&m_Cs); while (m_StopAlarmFlag) { m_BuzzerCfg->SetActive(true); Sleep(500); m_BuzzerCfg->SetActive(false); Sleep(500); } while (m_PauseAlarmFlag) { m_BuzzerCfg->SetActive(true); Sleep(1000); m_BuzzerCfg->SetActive(false); Sleep(1000); } Sleep(100); } } void Buzzer::SetStopAlarmEnable() { EnterCriticalSection(&m_Cs); m_StopAlarmFlag = true; WakeConditionVariable(&m_Cv); LeaveCriticalSection(&m_Cs); } void Buzzer::SetStopAlarmDisable() { EnterCriticalSection(&m_Cs); m_StopAlarmFlag = false; LeaveCriticalSection(&m_Cs); } void Buzzer::SetPauseAlarmEnable() { EnterCriticalSection(&m_Cs); m_PauseAlarmFlag = true; WakeConditionVariable(&m_Cv); LeaveCriticalSection(&m_Cs); } void Buzzer::SetPauseAlarmDisable() { EnterCriticalSection(&m_Cs); m_PauseAlarmFlag = false; LeaveCriticalSection(&m_Cs); }