/******************************************************************************* * File Name : AIR780ELBS.c * Description : * Created on : 2018Äê5ÔÂ23ÈÕ * Author : ¶Å¼ü *******************************************************************************/ /******************************************************************************* * Include Files * *******************************************************************************/ #include "AIR780EAudio.h" #include "string.h" #include "stdlib.h" #include "Module.h" #include "Module.h" #include "AIR780EDriver.h" #include "AIR780EFSM.h" #include "HIDO_Util.h" #include "HIDO_FSM.h" #include "HIDO_Timer.h" #include "HIDO_ATLite.h" #include "HIDO_Debug.h" #include "ATConfig.h" #include "TTS.h" #include "TONE.h" #include "Audio.h" /******************************************************************************* * Macro * *******************************************************************************/ /******************************************************************************* * Type Definition * *******************************************************************************/ /******************************************************************************* * Local Variable * *******************************************************************************/ HIDO_FSM_DETACHED_STATE(AIR780EAudioTTSPlay) HIDO_FSM_DETACHED_STATE(AIR780EAudioTTSStop) HIDO_FSM_DETACHED_STATE(AIR780EAudioSetVolume) HIDO_FSM_DETACHED_STATE(AIR780EAudioTONEPlay) HIDO_FSM_DETACHED_STATE(AIR780EAudioTONEStop) static HIDO_BOOL l_bIsTTSBusy = HIDO_FALSE; static HIDO_BOOL l_bIsTTSOver = HIDO_FALSE; static HIDO_BOOL l_bIsTONEBusy = HIDO_FALSE; static HIDO_BOOL l_bIsTONEOver = HIDO_FALSE; static HIDO_UINT16 l_u16Volume = 3; static HIDO_VLQMemberStruct *l_pstTTSData = HIDO_NULL; static HIDO_VLQMemberStruct *l_pstTONEData = HIDO_NULL; extern int Open_TTS; /******************************************************************************* * Local Function Declaration * *******************************************************************************/ /******************************************************************************* * Local Function * *******************************************************************************/ /******************************************************************************* * State Name : AIR780EAudioTTSPlay * Parent State : * Description : * Author : ¶Å¼ü * Modified Date: : 2018-05-01 *******************************************************************************/ HIDO_FSM_DETACHED_STATE_IMPLEMENT(AIR780EAudioTTSPlay, HIDO_NULL, HIDO_NULL) { static const HIDO_StateStruct *l_pstAfterState = HIDO_NULL; HIDO_ATLiteDeviceStruct *_pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; switch (_u32Event) { case HIDO_EVENT_ENTRY: { HIDO_StateArgStruct *pstStateArg = (HIDO_StateArgStruct *)_pArg; l_bIsTTSBusy = HIDO_TRUE; l_pstAfterState = pstStateArg->m_pstAfterState; HIDO_ATLiteCmdSend(_pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CTTS=2,\"%.*s\"\r\n", l_pstTTSData->m_u32DataLen, l_pstTTSData->m_pDataAddr); TTS_ReleaseData(l_pstTTSData); break; } case HIDO_EVENT_EXIT: { HIDO_ATLiteCmdSendOver(_pstATDevice); break; } case HIDO_AT_EVENT_OK: case HIDO_AT_EVENT_ERROR: { HIDO_FSMStateChange(_pstFSM, l_pstAfterState, HIDO_NULL); break; } default: { return HIDO_EVENT_NO_PROC; } } return HIDO_EVENT_OK; } /******************************************************************************* * State Name : AIR780EAudioTTSStop * Parent State : * Description : * Author : ¶Å¼ü * Modified Date: : 2018-05-01 *******************************************************************************/ HIDO_FSM_DETACHED_STATE_IMPLEMENT(AIR780EAudioTTSStop, HIDO_NULL, HIDO_NULL) { static const HIDO_StateStruct *l_pstAfterState = HIDO_NULL; HIDO_ATLiteDeviceStruct *_pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; switch (_u32Event) { case HIDO_EVENT_ENTRY: { HIDO_StateArgStruct *pstStateArg = (HIDO_StateArgStruct *)_pArg; l_pstAfterState = pstStateArg->m_pstAfterState; HIDO_ATLiteCmdSend(_pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CTTS=0\r\n"); GPIOD->BSRR = 0x0004 << 16; //¹Ø±ÕTTSµçÔ´ break; } case HIDO_EVENT_EXIT: { l_bIsTTSBusy = HIDO_FALSE; l_bIsTTSOver = HIDO_FALSE; HIDO_ATLiteCmdSendOver(_pstATDevice); break; } case HIDO_AT_EVENT_OK: case HIDO_AT_EVENT_ERROR: { HIDO_FSMStateChange(_pstFSM, l_pstAfterState, HIDO_NULL); break; } default: { return HIDO_EVENT_NO_PROC; } } return HIDO_EVENT_OK; } /******************************************************************************* * State Name : AIR780EAudioSetVolume * Parent State : * Description : * Author : ¶Å¼ü * Modified Date: : 2018-05-01 *******************************************************************************/ HIDO_FSM_DETACHED_STATE_IMPLEMENT(AIR780EAudioSetVolume, HIDO_NULL, HIDO_NULL) { static const HIDO_StateStruct *l_pstAfterState = HIDO_NULL; HIDO_ATLiteDeviceStruct *_pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; switch (_u32Event) { case HIDO_EVENT_ENTRY: { HIDO_StateArgStruct *pstStateArg = (HIDO_StateArgStruct *)_pArg; l_u16Volume = Audio_GetVolume(); l_pstAfterState = pstStateArg->m_pstAfterState; HIDO_ATLiteCmdSend(_pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CRSL=%u\r\n", l_u16Volume); break; } case HIDO_EVENT_EXIT: { HIDO_ATLiteCmdSendOver(_pstATDevice); break; } case HIDO_AT_EVENT_OK: case HIDO_AT_EVENT_ERROR: { HIDO_FSMStateChange(_pstFSM, l_pstAfterState, HIDO_NULL); break; } default: { return HIDO_EVENT_NO_PROC; } } return HIDO_EVENT_OK; } /******************************************************************************* * State Name : AIR780EAudioTONEPlay * Parent State : * Description : * Author : ¶Å¼ü * Modified Date: : 2018-05-01 *******************************************************************************/ HIDO_FSM_DETACHED_STATE_IMPLEMENT(AIR780EAudioTONEPlay, HIDO_NULL, HIDO_NULL) { static const HIDO_StateStruct *l_pstAfterState = HIDO_NULL; HIDO_ATLiteDeviceStruct *_pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; switch (_u32Event) { case HIDO_EVENT_ENTRY: { HIDO_StateArgStruct *pstStateArg = (HIDO_StateArgStruct *)_pArg; l_bIsTONEBusy = HIDO_TRUE; l_pstAfterState = pstStateArg->m_pstAfterState; HIDO_ATLiteCmdSend(_pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+QLTONE=1,%.*s\r\n", l_pstTONEData->m_u32DataLen, l_pstTONEData->m_pDataAddr); TONE_ReleaseData(l_pstTONEData); break; } case HIDO_EVENT_EXIT: { HIDO_ATLiteCmdSendOver(_pstATDevice); break; } case HIDO_AT_EVENT_OK: case HIDO_AT_EVENT_ERROR: { HIDO_FSMStateChange(_pstFSM, l_pstAfterState, HIDO_NULL); break; } default: { return HIDO_EVENT_NO_PROC; } } return HIDO_EVENT_OK; } /******************************************************************************* * State Name : AIR780EAudioTONEStop * Parent State : * Description : * Author : ¶Å¼ü * Modified Date: : 2018-05-01 *******************************************************************************/ HIDO_FSM_DETACHED_STATE_IMPLEMENT(AIR780EAudioTONEStop, HIDO_NULL, HIDO_NULL) { static const HIDO_StateStruct *l_pstAfterState = HIDO_NULL; HIDO_ATLiteDeviceStruct *_pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; switch (_u32Event) { case HIDO_EVENT_ENTRY: { HIDO_StateArgStruct *pstStateArg = (HIDO_StateArgStruct *)_pArg; l_pstAfterState = pstStateArg->m_pstAfterState; HIDO_ATLiteCmdSend(_pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+QLTONE=0\r\n"); GPIOD->BSRR = 0x0004 << 16; //¹Ø±ÕTTSµçÔ´ break; } case HIDO_EVENT_EXIT: { l_bIsTONEBusy = HIDO_FALSE; l_bIsTONEOver = HIDO_FALSE; HIDO_ATLiteCmdSendOver(_pstATDevice); break; } case HIDO_AT_EVENT_OK: case HIDO_AT_EVENT_ERROR: { HIDO_FSMStateChange(_pstFSM, l_pstAfterState, HIDO_NULL); break; } default: { return HIDO_EVENT_NO_PROC; } } return HIDO_EVENT_OK; } /******************************************************************************* * Function Name : AIR780EAudio_TTSPlay * Description : * Input : * Output : * Return : * Author : ¶Å¼ü *******************************************************************************/ static HIDO_INT32 AIR780EAudio_TTSPlay(HIDO_ATLiteDeviceStruct *_pstATDevice) { HIDO_StateArgStruct stStateArg; stStateArg.m_pArg = HIDO_NULL; stStateArg.m_pstAfterState = _pstATDevice->m_pstFSM->m_pstCurrentState; HIDO_FSM_DETACHED_STATE_SETTLE(AIR780EAudioTTSPlay, _pstATDevice->m_pstFSM->m_pstCurrentState->m_pstParent, HIDO_NULL); HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780EAudioTTSPlay), &stStateArg); return HIDO_OK; } /******************************************************************************* * Function Name : AIR780EAudio_TTSStop * Description : * Input : * Output : * Return : * Author : ¶Å¼ü *******************************************************************************/ static HIDO_INT32 AIR780EAudio_TTSStop(HIDO_ATLiteDeviceStruct *_pstATDevice) { HIDO_StateArgStruct stStateArg; stStateArg.m_pArg = HIDO_NULL; stStateArg.m_pstAfterState = _pstATDevice->m_pstFSM->m_pstCurrentState; HIDO_FSM_DETACHED_STATE_SETTLE(AIR780EAudioTTSStop, _pstATDevice->m_pstFSM->m_pstCurrentState->m_pstParent, HIDO_NULL); HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780EAudioTTSStop), &stStateArg); return HIDO_OK; } /******************************************************************************* * Function Name : AIR780EAudio_TONEPlay * Description : * Input : * Output : * Return : * Author : ¶Å¼ü *******************************************************************************/ static HIDO_INT32 AIR780EAudio_TONEPlay(HIDO_ATLiteDeviceStruct *_pstATDevice) { HIDO_StateArgStruct stStateArg; stStateArg.m_pArg = HIDO_NULL; stStateArg.m_pstAfterState = _pstATDevice->m_pstFSM->m_pstCurrentState; HIDO_FSM_DETACHED_STATE_SETTLE(AIR780EAudioTONEPlay, _pstATDevice->m_pstFSM->m_pstCurrentState->m_pstParent, HIDO_NULL); HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780EAudioTONEPlay), &stStateArg); return HIDO_OK; } /******************************************************************************* * Function Name : AIR780EAudio_TONEStop * Description : * Input : * Output : * Return : * Author : ¶Å¼ü *******************************************************************************/ static HIDO_INT32 AIR780EAudio_TONEStop(HIDO_ATLiteDeviceStruct *_pstATDevice) { HIDO_StateArgStruct stStateArg; stStateArg.m_pArg = HIDO_NULL; stStateArg.m_pstAfterState = _pstATDevice->m_pstFSM->m_pstCurrentState; HIDO_FSM_DETACHED_STATE_SETTLE(AIR780EAudioTONEStop, _pstATDevice->m_pstFSM->m_pstCurrentState->m_pstParent, HIDO_NULL); HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780EAudioTONEStop), &stStateArg); return HIDO_OK; } /******************************************************************************* * Function Name : AIR780EAudio_SetVolume * Description : * Input : * Output : * Return : * Author : ¶Å¼ü *******************************************************************************/ static HIDO_INT32 AIR780EAudio_SetVolume(HIDO_ATLiteDeviceStruct *_pstATDevice) { HIDO_StateArgStruct stStateArg; stStateArg.m_pArg = HIDO_NULL; stStateArg.m_pstAfterState = _pstATDevice->m_pstFSM->m_pstCurrentState; HIDO_FSM_DETACHED_STATE_SETTLE(AIR780EAudioSetVolume, _pstATDevice->m_pstFSM->m_pstCurrentState->m_pstParent, HIDO_NULL); HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780EAudioSetVolume), &stStateArg); return HIDO_OK; } /******************************************************************************* * Global Function * *******************************************************************************/ /******************************************************************************* * Function Name : AIR780EAudio_Poll * Description : * Input : * Output : * Return : * Author : ¶Å¼ü * Modified Date: : 2018Äê5ÔÂ22ÈÕ *******************************************************************************/ HIDO_INT32 AIR780EAudio_Poll(HIDO_ATLiteDeviceStruct *_pstATDevice) { if(l_u16Volume != Audio_GetVolume()) { AIR780EAudio_SetVolume(_pstATDevice); return HIDO_OK; } if(HIDO_FALSE == l_bIsTTSBusy) { l_pstTTSData = TTS_GetNextData(); if(l_pstTTSData != HIDO_NULL) { AIR780EAudio_TTSPlay(_pstATDevice); return HIDO_OK; } } else { if(HIDO_TRUE == l_bIsTTSOver) { AIR780EAudio_TTSStop(_pstATDevice); return HIDO_OK; } } if(HIDO_FALSE == l_bIsTONEBusy) { l_pstTONEData = TONE_GetNextData(); if(l_pstTONEData != HIDO_NULL) { AIR780EAudio_TONEPlay(_pstATDevice); return HIDO_OK; } } else { if(HIDO_TRUE == l_bIsTONEOver) { AIR780EAudio_TONEStop(_pstATDevice); return HIDO_OK; } } return HIDO_ERR; } /******************************************************************************* * Function Name : AIR780EAudio_TTSOver * Description : * Input : * Output : * Return : * Author : ¶Å¼ü * Modified Date: : 2018Äê5ÔÂ22ÈÕ *******************************************************************************/ HIDO_INT32 AIR780EAudio_TTSOver(HIDO_VOID) { l_bIsTTSOver = HIDO_TRUE; return HIDO_OK; } /******************************************************************************* * Function Name : AIR780EAudio_TONEOver * Description : * Input : * Output : * Return : * Author : ¶Å¼ü * Modified Date: : 2018Äê5ÔÂ22ÈÕ *******************************************************************************/ HIDO_INT32 AIR780EAudio_TONEOver(HIDO_VOID) { l_bIsTONEOver = HIDO_TRUE; return HIDO_OK; }