FreeCalypso > hg > fc-magnetite
diff src/ui3/mfw/mfw_BtipsVg.c @ 420:e8ddbb0837ed
src/ui3: initial import of TCS3/LoCosto BMI & MFW code
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 21 Jan 2018 03:09:00 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ui3/mfw/mfw_BtipsVg.c Sun Jan 21 03:09:00 2018 +0000 @@ -0,0 +1,480 @@ +/* ========================================================= +* Texas Instruments OMAP(TM) Platform Software +* (c) Copyright Texas Instruments, Incorporated. All Rights Reserved. +* +* Use of this software is controlled by the terms and conditions found +* in the license agreement under which this software has been supplied. +* ========================================================== */ +/* + $Project name: Basic Bluetooth MMI + $Project code: + $Module: Bluetooth BMG MFW + $File: Mfw_Btips.c + $Revision: 1.0 + $Author: Texas Instruments + $Date: 26/06/07 + +******************************************************************************** + + Description: + + This module provides the BTIPS BMG APPlication functionality. + +******************************************************************************** + $History: Mfw_Btips.c + + 26/06/07 Sasken original version + + $End + +*******************************************************************************/ + + + + +/******************************************************************************* + + Include files + +*******************************************************************************/ + +#define ENTITY_MFW +/* includes */ + +#include <string.h> + +#if defined (NEW_FRAME) + +#include "typedefs.h" +#include "vsi.h" +#include "pei.h" +#include "custom.h" +#include "gsm.h" +#include "prim.h" + +#else + +#include "STDDEFS.H" +#include "custom.h" +#include "gsm.h" +#include "vsi.h" + +#endif + +#ifdef FF_MMI_BTIPS_APP + +#include "osapi.h" + +/* GPF Includes */ +#include "typedefs.h" +#include "vsi.h" +//#include "../p_btt.h" + +#if BT_STACK == XA_ENABLED +#include <me.h> +#include <bttypes.h> +#include <sec.h> +#endif + +#include "btl_common.h" +#include "btl_bmg.h" +#include "debug.h" + +#include "bthal_fs.h" +#include "mfw_mfw.h" +#include "mfw_win.h" +#include "mfw_icn.h" /* included for mfw_mnu.h */ +#include "mfw_mnu.h" +#include "mfw_tim.h" +#include "mfw_kbd.h" +#include "mfw_sat.h" /* included for MmiDummy.h, included for MmiMenu.h */ + +/* BTL inclides */ +#include "hfg.h" +#include "btl_vg.h" +#include "btl_vgi.h" +#include "Mfw_Btips.h" +#include "Mfw_BtipsBmg.h" +#include "mfw_BtipsVg.h" + +static void btips_vgCallback(const BtlVgEvent *event); + +static const BtSecurityLevel noSecurity = BSL_NO_SECURITY; +static const BtlVgAudioSourcesAction noActions = {0}; +static AtAgFeatures features = HFG_FEATURE_REJECT | HFG_FEATURE_RING_TONE; + +static BOOL closingVoiceGateway = FALSE; + +static BtlVgChannelId mfwBtipsVgChannelId = BTL_VG_CHANNEL_ID_NONE; +static BtlVgContext *mfwBtipsVgContext =0; +static int audio_on_hands_free = 0; + +/*--------------------------------------------------------------------------- + * mfw_btips_vgInit + *--------------------------------------------------------------------------- + * + * Synopsis: VG application initialization. + * + * Return: NONE. + * + */ + +void mfw_btips_vgInit ( ) +{ + if (BT_STATUS_SUCCESS != BTL_VG_Create(0, btips_vgCallback, &noSecurity, &mfwBtipsVgContext)) + { + TRACE_FUNCTION("BTL_VG_Create failed"); + } + + if (BT_STATUS_PENDING != BTL_VG_Enable(mfwBtipsVgContext, 0, &features, &noActions)) + { + TRACE_FUNCTION("BTL_VG_Enable failed"); + } +} + +BOOL mfw_btips_vgGetConnectedDevice (BD_ADDR *bdAddr, U8 *name) +{ + BtStatus status; + + TRACE_FUNCTION("mfw_btips_vgGetConnectedDevice"); + + status = BTL_VG_GetConnectedDevice (mfwBtipsVgContext, mfwBtipsVgChannelId, bdAddr); + + if (status == BT_STATUS_SUCCESS) + { + mfw_btips_bmgGetDeviceName (bdAddr, name); + return TRUE; + } + return FALSE; +} + +BOOL mfw_btips_vgIsDeviceConnected (BD_ADDR bdAddr) +{ + BtRemDevState state; + + TRACE_FUNCTION("mfw_btips_vgIsDeviceConnected"); + + if (mfwBtipsVgChannelId != BTL_VG_CHANNEL_ID_NONE) + { +#if 0 + BD_ADDR connectedDev; + BTL_VG_GetConnectedDevice (mfwBtipsVgContext, mfwBtipsVgChannelId, &connectedDev) +#endif + mfw_btips_bmgGetDeviceState (&bdAddr, &state); + if (state == BDS_CONNECTED) + { + return TRUE; + } + } + return FALSE; + +} + +BOOL mfw_btips_vgConnect (BD_ADDR bdAddr) +{ + BtStatus btStatus; + + TRACE_FUNCTION("mfw_btips_vgConnect"); + + btStatus = BTL_VG_Connect (mfwBtipsVgContext, &bdAddr, BTL_VG_AUDIO_SOURCE_MODEM); + + if (BT_STATUS_IN_USE == btStatus) + { + TRACE_FUNCTION("VG APP: An SLC to a remote device already exists"); + TRACE_FUNCTION("VG APP: Disconnect or perform handover to connect to a new device"); + } + return mfw_btips_checkStatus(btStatus); +} + +BOOL mfw_btips_vgDisconnect (BD_ADDR bdAddr) +{ + BtStatus btStatus; + + TRACE_FUNCTION("mfw_btips_vgDisconnect"); + + btStatus = BTL_VG_Disconnect (mfwBtipsVgContext, mfwBtipsVgChannelId); + return mfw_btips_checkStatus(btStatus); +} + +BOOL mfw_btips_vgTransferAudioToPhone (void) +{ + BtStatus btStatus; + + TRACE_FUNCTION("mfw_btips_vgTransferAudioToPhone"); + + if ((mfwBtipsVgChannelId != BTL_VG_CHANNEL_ID_NONE) && (audio_on_hands_free == 1)) + { + btStatus = BTL_VG_DisconnectAudio (mfwBtipsVgContext, mfwBtipsVgChannelId); + } + return mfw_btips_checkStatus(btStatus); +} + +BOOL mfw_btips_vgTransferAudioToHF (void) +{ + BtStatus btStatus; + + TRACE_FUNCTION_P1("mfw_btips_vgTransferAudioToHF audio_on_hands_free=%d", audio_on_hands_free); + + if ((mfwBtipsVgChannelId != BTL_VG_CHANNEL_ID_NONE) && (audio_on_hands_free == 0)) + { + btStatus = BTL_VG_ConnectAudio (mfwBtipsVgContext, mfwBtipsVgChannelId); + } + return mfw_btips_checkStatus(btStatus); +} + +BOOL mfw_btips_vgIsAudioOnPhone (void) +{ + + TRACE_FUNCTION("mfw_btips_vgIsAudioOnPhone"); + if (audio_on_hands_free == 0) + { + return TRUE; + } + else if (mfwBtipsVgChannelId != BTL_VG_CHANNEL_ID_NONE) + { + return FALSE; + } + else + { + return TRUE; + } +} + +BOOL mfw_btips_vgIsAudioOnHF (void) +{ + if (audio_on_hands_free == 1) + { + return TRUE; + } + else if (mfwBtipsVgChannelId != BTL_VG_CHANNEL_ID_NONE) + { + return FALSE; + } + else + { + return TRUE; + } +} + +BOOL mfw_btips_vgIsHandOverPossible (void) +{ + if (audio_on_hands_free == 1) + { + return TRUE; + } + else + { + return FALSE; + } +} + +void btips_vgCallback(const BtlVgEvent *event) +{ + T_BTIPS_MMI_IND btips_mmi_ind; + BtStatus status; + char str[MFW_VG_APP_AT_STR_LEN]; + U16 strLen; + U16 scoHandle = 0; + + TRACE_FUNCTION_P1("btips_vgCallback %d", event->type); + + btips_mmi_ind.mfwBtipsEventType = MFW_BTIPS_VG_EVENT; + + switch (event->type) + { + case BTL_VG_EVENT_SLC_REQUEST: + TRACE_EVENT("VG APP: SLC request from device:"); + break; + + case BTL_VG_EVENT_ADDITIONAL_SERVICE_CONNECT_REQ: + TRACE_EVENT("VG APP: Addtional SLC request received from device:"); + break; + + case BTL_VG_EVENT_SLC_CONNECTED: + mfwBtipsVgChannelId = event->channelId; + TRACE_EVENT("VG APP: Connection established"); + /* turn off inband ring tone */ + if (BT_STATUS_SUCCESS != BTL_VG_EnableInbandRingTone(mfwBtipsVgContext, event->channelId, FALSE)) + { + TRACE_EVENT("VG_APP: Error disabling inband ring tone after SLC established"); + } + btips_mmi_ind.data.vgBtEvent.event = MFW_BTIPS_VG_CONNECT_EVENT; + + status = BTL_VG_GetConnectedDevice (mfwBtipsVgContext, event->channelId, + &(btips_mmi_ind.data.vgBtEvent.bdAddr)); + if (status == BT_STATUS_SUCCESS) + { + mfw_btips_bmgGetDeviceName (&(btips_mmi_ind.data.vgBtEvent.bdAddr), + btips_mmi_ind.data.vgBtEvent.deviceName); + + btipsNotifyMFW (&btips_mmi_ind); + } + + break; + + case BTL_VG_EVENT_SLC_DISCONNECTED: + mfwBtipsVgChannelId = BTL_VG_CHANNEL_ID_NONE; + TRACE_EVENT("VG APP: Connection lost"); + btips_mmi_ind.data.vgBtEvent.event = MFW_BTIPS_VG_DISCONNECT_EVENT; + #ifdef FF_MMI_FMRADIO_APP + if(mfw_fmRadio_isFmOverBT()) + { + /*Inform FM module of the SLC disconnection*/ + mfw_fmRadio_listenViaBT(FALSE); + mfw_fmRadio_setFmOverBT(FALSE, 0); + } + #endif + + btipsNotifyMFW (&btips_mmi_ind); + + break; + + case BTL_VG_EVENT_HANDOVER_COMPLETED: + mfwBtipsVgChannelId = event->channelId; + TRACE_EVENT("VG APP: Handover completed"); + break; + + case BTL_VG_EVENT_AUDIO_CONNECTED: + { + HfgChannel *handsfreeChannel; + BtlVgChannel *vgChannel; + CmgrHandler cmgrHandler; + scoHandle = 0x101; + btips_mmi_ind.data.vgBtEvent.event = MFW_BTIPS_VG_AUDIO_CONNECT_EVENT; +#if 0 + vgChannel = &(event->context->channels[event->channelId]); + handsfreeChannel = &(vgChannel->c.handsfreeChannel); + cmgrHandler = handsfreeChannel->cmgrHandler; + scoHandle = cmgrHandler.scoConnect->scoHciHandle; + + TRACE_EVENT_P1("VG APP: Audio connection established, scoHandle = %x", scoHandle); +#endif + audio_on_hands_free = 1; + +#ifdef FF_MMI_FMRADIO_APP + if(mfw_fmRadio_isFmOverBT()) + { + /*Send VS commands to BRF for routing FM audio to BT headset*/ + mfw_fmRadio_setFmOverBT(TRUE, scoHandle); + } +#endif + btipsNotifyMFW (&btips_mmi_ind); + + } break; + + case BTL_VG_EVENT_AUDIO_DISCONNECTED: + TRACE_EVENT("VG APP: Audio conenction lost"); + btips_mmi_ind.data.vgBtEvent.event = MFW_BTIPS_VG_AUDIO_DISCONNECT_EVENT; + + audio_on_hands_free = 0; +#ifdef FF_MMI_FMRADIO_APP + if(mfw_fmRadio_isFmOverBT()) + { + /*Inform FM module of the SLC disconnection*/ + mfw_fmRadio_listenViaBT(FALSE); + mfw_fmRadio_setFmOverBT(FALSE, 0); + } +#endif + + btipsNotifyMFW (&btips_mmi_ind); + + break; + + case BTL_VG_EVENT_PHONE_NUMBER_REQUESTED: + TRACE_EVENT("VG APP: unsupported event: BTL_VG_EVENT_PHONE_NUMBER_REQUESTED"); + break; + + case BTL_VG_EVENT_MICROPHONE_VOLUME: + TRACE_EVENT_P1("VG APP: microphone volume: %u", event->p.volume); + break; + + case BTL_VG_EVENT_SPEAKER_VOLUME: + TRACE_EVENT_P1("VG APP: speaker volume: %u", event->p.volume); + break; + + case BTL_VG_EVENT_VOICE_RECOGNITION_STATUS: + TRACE_EVENT_P1("VG APP: voice recognition is :%s", (event->p.enabled ? "enabled" : "disabled")); + break; + +#if HFG_FEATURE_RING_TONE & HFG_SDK_FEATURES + + case BTL_VG_EVENT_INBAND_RING_STATUS: + TRACE_EVENT_P1("VG APP: inband ringing is: %s", (event->p.enabled ? "enabled" : "disabled")); + break; +#endif + + case BTL_VG_EVENT_UNRECOGNIZED_AT_COMMAND: + strLen = event->p.atCommand->commandLength; + if (strLen > MFW_VG_APP_AT_STR_LEN ) + { + TRACE_EVENT("VG APP: AT Command string is too long"); + strLen = MFW_VG_APP_AT_STR_LEN - 1; + } + OS_MemCopy((U8*)str, (const U8*) event->p.atCommand->atCommand, strLen); + str[strLen] = '\0'; + TRACE_EVENT_P1("VG APP: unrecognized AT command: %s", str); + if (BT_STATUS_SUCCESS != BTL_VG_SentAtError(event->context, event->channelId, ATCME_OP_NOT_SUPPORTED)) + { + TRACE_EVENT("VG APP: BTL_VG_SentAtError failed"); + } + break; + + case BTL_VG_EVENT_VG_CONTEXT_ENABLED: + TRACE_EVENT("VG APP: VG is enabled"); + break; + + case BTL_VG_EVENT_VG_CONTEXT_DISABLED: + TRACE_EVENT("VG APP: VG is disabled"); + if (TRUE == closingVoiceGateway) + { + BtStatus status; + + status = BTL_VG_Destroy(&mfwBtipsVgContext); + TRACE_EVENT_P1("BTL_VG_Destroy returned: %s", pBT_Status(status)); + closingVoiceGateway = FALSE; + } + break; + + default: + TRACE_EVENT_P1("VG APP: Unexpected VG event: %u", event->type); + break; + } + +} +void mfw_btips_vgCallback (T_BTIPS_MMI_IND * mmiInd) +{ + MfwBtVgEvent vgBtEvent = mmiInd->data.vgBtEvent; + + TRACE_FUNCTION_P1("mfw_btips_vgCallback: Event %d", vgBtEvent.event); + + switch (vgBtEvent.event) + { + case MFW_BTIPS_VG_CONNECT_EVENT: + #ifdef FF_MMI_FMRADIO_APP + if(mfw_fmRadio_isFmOverBT()) + { + /*Automatically create the SCO for FM Radio routing + In this case Modem Audio will not be routed to the MSCI port, hence + all GSM calls will be answered on the Phone Handset ONLY*/ + mfw_btips_vgTransferAudioToHF(); + } + #endif + mfw_btips_signal(E_BTIPS_VG_CONNECT_EVENT, mmiInd); + break; + + case MFW_BTIPS_VG_DISCONNECT_EVENT: + mfw_btips_signal(E_BTIPS_VG_DISCONNECT_EVENT, mmiInd); + break; + + case MFW_BTIPS_VG_AUDIO_CONNECT_EVENT: + mfw_btips_signal(E_BTIPS_VG_AUDIO_CONNECT_EVENT, mmiInd); + break; + + case MFW_BTIPS_VG_AUDIO_DISCONNECT_EVENT: + mfw_btips_signal(E_BTIPS_VG_AUDIO_DISCONNECT_EVENT, mmiInd); + break; + } +} + +#endif +