FreeCalypso > hg > fc-magnetite
diff src/ui3/mfw/mfw_Btips.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_Btips.c Sun Jan 21 03:09:00 2018 +0000 @@ -0,0 +1,814 @@ +/* ========================================================= +* 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> + + +/* BTIPS Includes */ +#include "me.h" +#include "osapi.h" +#include "btl_common.h" +#include "bthal_btdrv.h" +#include "bthal_fs.h" +#include "bthal_pm.h" +#include "bthal_config.h" +#include "bttypes.h" +#include "goep.h" +#include "bpp.h" +#include "Debug.h" + +/* BTL includes */ +#include "btl_bppsnd.h" +#include "btl_bmg.h" + +#if FM_STACK == XA_ENABLED + +#include "fms_api.h" +#endif + +#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 +#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 */ + +#include "Mfw_Btips.h" +#include "ffs/ffs_api.h" +/*------------------------------------------------------------------------ + * + * Default BT Demo folder fsPath (i.e. \MfwBtDemo) + */ +U8 Bt_DefaultDemoDir[BT_FS_MAX_PATH_LENGTH]; + +#define hCommACI _ENTITY_PREFIXED(hCommACI) + + +#define MFW_BTIPS_RADIO_OFF 0 +#define MFW_BTIPS_RADIO_ON 1 +#define MFW_BTIPS_RADIO_IN_PROGRESS -1 + +EXTERN MfwHdr * current_mfw_elem; + + +/* Declaration of static variables */ +static BOOL isBtRadioEnabled = MFW_BTIPS_RADIO_OFF; /* To check at start-up */ + +static void btips_btlCallBack(const BtlEvent *event); +static void mfw_btips_btlCallBack(T_BTIPS_MMI_IND *btips_mmi_ind); +static void mfw_btips_callBack(T_BTIPS_MMI_IND *btips_mmi_ind ); +static BOOL mfw_btips_createDemoRootDir(const BTHAL_U8 *fsPath); +BOOL mfw_btips_checkStatus(BtStatus btStatus); + +void Btips_ffs_log_clear(void) +{ + ffs_remove((const char*)"/ffslog"); +} +void Btips_ffs_log_message(char *LogMsg,...) +{ +#ifdef FFSLOG + fd_t fd= -1; + char log_ffs_buf[256]; + va_list varpars; + + va_start (varpars, LogMsg); + vsprintf(log_ffs_buf,LogMsg,varpars); + va_end (varpars); + fd = ffs_open((const char*)"/ffslog", FFS_O_APPEND | FFS_O_WRONLY ); + if(fd < 0) + fd=ffs_open((const char*)"/ffslog", FFS_O_CREATE |FFS_O_WRONLY ); + if(fd >= 0) + { + strcat(log_ffs_buf," \n "); + ffs_write(fd, log_ffs_buf, strlen(log_ffs_buf)); + ffs_close(fd); + } +#endif +} +#ifdef FF_MMI_BTIPS_APP + +/************************************************************************ + MFW - ACI Communication Module Start +************************************************************************/ + +/******************************************************************************* + + $Function: mfw_btips_sign_exec + + $Description: This function sends the Mfw BTIPS events from the Mfw to the BMI. + + $Returns: None + + $Arguments: None + +*******************************************************************************/ +BOOL mfw_btips_sign_exec (T_MFW_HDR * cur_elem, T_MFW_EVENT event, T_MFW_BTIPS_PARA * para) +{ + TRACE_FUNCTION("mfw_btips_sign_exec()"); + + while (cur_elem) + { + /* + * event handler is available + */ + TRACE_FUNCTION_P1("mfw_btips_sign_exec - %x", event); + if (cur_elem->type EQ MfwTyBtipsBmg) + { + T_MFW_BTIPS * btips_data; + + TRACE_FUNCTION("mfw_btips_sign_exec() cur_elem->type EQ MfwTyBtipsBmg"); + /* + * handler is CM management handler + */ + btips_data = (T_MFW_BTIPS *)cur_elem->data; + if (btips_data->emask & event) + { + /* + * event is expected by the call back function + */ + btips_data->event = event; + switch (event) + { + /* + ** BTIPS BMG Events + */ + case E_BTIPS_BMG_NAME_RESULT: + case E_BTIPS_BMG_SEARCH_COMPLETE: + case E_BTIPS_BMG_SEARCH_CANCELLED: + case E_BTIPS_BMG_BOND_COMPLETE: + case E_BTIPS_BMG_BOND_CANCELLED: + case E_BTIPS_BMG_DEVICE_SERVICES: + if(para!=NULL) + memcpy (&btips_data->para, para, sizeof (T_MFW_BTIPS_PARA)); + break; + default: + return FALSE; + + } + + /* + * if call back defined, call it + */ + if (btips_data->handler) + { + current_mfw_elem = cur_elem; + + if ((*(btips_data->handler)) (btips_data->event, (void *)&btips_data->para)) + return TRUE; + } + } + } + else if (cur_elem->type EQ MfwTyBtips) + { + T_MFW_BTIPS * btips_data; + + TRACE_FUNCTION("mfw_btips_sign_exec() cur_elem->type EQ MfwTyBtips"); + /* + * handler is CM management handler + */ + btips_data = (T_MFW_BTIPS *)cur_elem->data; + if (btips_data->emask & event) + { + /* + * event is expected by the call back function + */ + btips_data->event = event; + switch (event) + { + /* + ** BTIPS generic Events + */ + case E_BTIPS_POWERON_SUCCESS: + case E_BTIPS_POWERON_FAILURE: + case E_BTIPS_POWEROFF_SUCCESS: + case E_BTIPS_BT_NOT_ON: + case E_BTIPS_FATAL_ERROR: + case E_BTIPS_INCOMING_PIN_REQ: + case E_BTIPS_BMG_PAIRING_COMPLETE: + case E_BTIPS_OPPS_PUSH_EVENT: + case E_BTIPS_OPPS_PULL_EVENT: + case E_BTIPS_FTPS_PUT_EVENT: + case E_BTIPS_FTPS_GET_EVENT: + case E_BTIPS_FTPS_DELETE_EVENT: + case E_BTIPS_FTPS_COMPLETE_EVENT: //sundeep + case E_BTIPS_FTPS_ABORTED_EVENT: + case E_BTIPS_FTPS_PUT_COMP_EVENT: + // case E_BTIPS_FTPS_GET_COMP_EVENT: + case E_BTIPS_FTPS_CONNECT_EVENT: + case E_BTIPS_FTPS_DISCONNECT_EVENT: + case E_BTIPS_FTPS_DELETE_COMP_EVENT: + case E_BTIPS_VG_CONNECT_EVENT: + case E_BTIPS_VG_DISCONNECT_EVENT: + case E_BTIPS_VG_AUDIO_CONNECT_EVENT: + case E_BTIPS_VG_AUDIO_DISCONNECT_EVENT: + case E_BTIPS_BMG_NAME_RESULT: + case E_BTIPS_OPPS_PULL_COMP_EVENT: + case E_BTIPS_OPPS_PUSH_COMP_EVENT: + if(para!=NULL) + memcpy (&btips_data->para, para, sizeof (T_MFW_BTIPS_PARA)); + + break; + default: + return FALSE; + } + + /* + * if call back defined, call it + */ + if (btips_data->handler) + { + current_mfw_elem = cur_elem; + + if ((*(btips_data->handler)) (btips_data->event, (void *)&btips_data->para)) + return TRUE; + } + } + } + + + cur_elem = cur_elem->next; + } + return FALSE; +} + +/******************************************************************************* + + $Function: mfw_btips_signal + + $Description: This function sends the Mfw btipsnts from the Mfw to the BMI. + + $Returns: None + + $Arguments: T_MFW_EVENT : The event to be sent to the BMI + T_BTIPS_MMI_IND * : Pointer to the Event data + +*******************************************************************************/ +void mfw_btips_signal(T_MFW_EVENT event, T_BTIPS_MMI_IND * para) +{ + UBYTE temp; + temp = dspl_Enable(0); + + TRACE_FUNCTION("mfw_btips_signal()"); + + if (mfwSignallingMethod EQ 0) + { + /* + * focus is on a window + */ + if (mfwFocus) + { + /* + * send event to sim management + * handler if available + */ + if (mfw_btips_sign_exec (mfwFocus, event, para)) + { + dspl_Enable(temp); + return; + } + } + + /* + * actual focussed window is not available + * or has no network management registration + * handler, then search all nodes from the root. + */ + if (mfwRoot) + mfw_btips_sign_exec (mfwRoot, event, para); + } + else + { + MfwHdr * h = 0; + + /* + * Focus set, then start here + */ + if (mfwFocus) + h = mfwFocus; + + /* + * Focus not set, then start root + */ + if (!h) + h = mfwRoot; + + /* + * No elements available, return + */ + while (h) + { + /* + * Signal consumed, then return + */ + if (mfw_btips_sign_exec (h, event, para)) + { + dspl_Enable(temp); + return; + } + + /* + * All windows tried inclusive root + */ + if (h == mfwRoot) + { + dspl_Enable(temp); + return; + } + + /* + * get parent window + */ + h = mfwParent(mfwParent(h)); + + if (h) + h = ((MfwWin * )(h->data))->elems; + } + + mfw_btips_sign_exec (mfwRoot, event, para); + + } + + dspl_Enable(temp); + + return; +} + + +/******************************************************************************* + + $Function: mfw_btips_create + + $Description: This function initialises an Mfw BTIPS entity and adds it to the Window Stack + + $Returns: T_MFW_HND : A handle for the entity + + $Arguments: T_MFW_HND : Parent Window Handle + T_MFW_EVENT : Event Mask of the events to be handled + T_MFW_CB : Callback function to handle the events + +*******************************************************************************/ +T_MFW_HND mfw_btips_create(T_MFW_HND hWin, T_MFW_EVENT event, MfwTyp type, T_MFW_CB cbfunc) +{ + T_MFW_HDR *hdr; + T_MFW_BTIPS *btips_para; + + TRACE_FUNCTION_P1("mfw_btips_create TYPE = %x", type); + + hdr = (T_MFW_HDR *) mfwAlloc(sizeof (T_MFW_HDR)); + btips_para = (T_MFW_BTIPS *) mfwAlloc(sizeof (T_MFW_BTIPS)); + + if (!hdr OR !btips_para) + return FALSE; + + /* + * initialisation of the handler + */ + btips_para->emask = event; + btips_para->handler = cbfunc; + + hdr->data = btips_para; + hdr->type = type; + + /* + * installation of the handler + */ + return mfwInsert((T_MFW_HDR *)hWin, hdr); +} + + +/******************************************************************************* + + $Function: mfw_btips_delete + + $Description: This function clears down an Mfw BTIPS entity and removes it from the + Window Stack + + $Returns: T_MFW_RES : The result of the function + + $Arguments: T_MFW_HND : The Handle of the entity to be removed + +*******************************************************************************/ +T_MFW_RES mfw_btips_delete(T_MFW_HND hnd) +{ + TRACE_FUNCTION("mfw_btips_delete()"); + + if (!hnd OR !((T_MFW_HDR *)hnd)->data) + return MFW_RES_ILL_HND; + + if (!mfwRemove((T_MFW_HDR *)hnd)) + return MFW_RES_ILL_HND; + + mfwFree((U8 *)(((T_MFW_HDR *) hnd)->data),sizeof(T_MFW_BTIPS)); + mfwFree((U8 *)hnd,sizeof(T_MFW_HDR)); + + return MFW_RES_OK; +} + + + +/* ++------------------------------------------------------------------------------ +| Function : btipsNotifyMFW ++------------------------------------------------------------------------------ +| Description : Posts the FM Radio events to the MMI task +| +| Parameters : T_FMRADIO_EVENT fmradioevent +| void context - not used now +| +| Return : TRUE/FALSE ++------------------------------------------------------------------------------ +*/ +void btipsNotifyMFW (T_BTIPS_MMI_IND * event) +{ +#if defined (NEW_FRAME) + EXTERN T_HANDLE hCommACI; +#else + EXTERN T_VSI_CHANDLE hCommACI; +#endif + + PALLOC(btips_mmi_ind,BTIPS_MMI_IND); + TRACE_FUNCTION_P1 ("btipsNotifyMFW %x", event->mfwBtipsEventType); + /*Copy required data to btips_mmi_ind*/ + btips_mmi_ind->mfwBtipsEventType = event->mfwBtipsEventType; + btips_mmi_ind->data = event->data; + +#if defined (NEW_FRAME) + PSENDX(ACI,btips_mmi_ind); +#else +#if defined (_TMS470) + vsi_c_send("",hCommACI,D2P(btips_mmi_ind), + sizeof(T_PRIM_HEADER)+sizeof(T_BTIPS_MMI_IND)); +#else + PSEND(ACI,btips_mmi_ind); +#endif +#endif + return; + } +/* ++------------------------------------------------------------------------------ +| Function : btipsPrimHandler ++------------------------------------------------------------------------------ +| Description : This fn is the primitive handler for BTIPS MFW application +| +| Parameters : opc-opc code +| data - data +| +| +| Return : TRUE/FALSE ++------------------------------------------------------------------------------ +*/ +GLOBAL BOOL btipsPrimHandler (USHORT opc, void * data) +{ + TRACE_FUNCTION_P1 ("btipsPrimHandler %x", opc); + + if (opc EQ BTIPS_MMI_IND) + { + T_BTIPS_MMI_IND *btips_mmi_ind = (T_BTIPS_MMI_IND *)data; + mfw_btips_callBack(btips_mmi_ind); + PFREE(btips_mmi_ind); + return TRUE; + } + return FALSE; +} + +/*This function will be invoked in the ACI context and from here the signals will be +passed on to the respective mfw_btips_xxxx_callback()*/ +static void mfw_btips_callBack(T_BTIPS_MMI_IND *btips_mmi_ind ) +{ +/*Todo: implement function pointer callback*/ + switch(btips_mmi_ind->mfwBtipsEventType) + { + case MFW_BTIPS_MAIN_EVENT: + mfw_btips_btlCallBack(btips_mmi_ind); + break; + case MFW_BTIPS_BMG_EVENT: + mfw_btips_bmgCallback(btips_mmi_ind); + break; + + case MFW_BTIPS_OPPS_EVENT: + mfw_btips_oppsCallback(btips_mmi_ind); + break; + + case MFW_BTIPS_FTPS_EVENT: + mfw_btips_ftpsCallback(btips_mmi_ind); + break; + + case MFW_BTIPS_VG_EVENT: + mfw_btips_vgCallback(btips_mmi_ind); + break; + + case MFW_BTIPS_OPPC_EVENT: + mfw_btips_oppcCallback(btips_mmi_ind); + break; + + case MFW_BTIPS_MDG_EVENT: + mfw_btips_mdgCallback(btips_mmi_ind); + break; + + default: + break; + } +} +/************************************************************************ + MFW - ACI Communication Module End +************************************************************************/ + +/*--------------------------------------------------------------------------- + * mfw_btips_init + *--------------------------------------------------------------------------- + * + * Synopsis: To return the current status of BT radio. + * + * Return: TRUE if send PIN code is successful, FALSE otherwise. + * + */ +void mfw_btips_init(void) +{ + +// BTHAL_OS_Sleep(100); + /* Initialize BTIPS basic components: BT stack, BTL layer... */ + TRACE_FUNCTION(("mfw_btips_init: Starting BTL_Init")); + OS_StrCpy(Bt_DefaultDemoDir, BT_DEMO_FOLDER_PATH); + if (TRUE != mfw_btips_createDemoRootDir(Bt_DefaultDemoDir)) + { + Report(("Fatal Error: Could not create BT root folder\n"));; + } + if (BT_STATUS_SUCCESS != BTL_Init(btips_btlCallBack)) + { + mfw_BtipsReport(("Fatal Error: Could not initialize the BTIPS basic components\n")); + } + + /* Initialize application modules */ + mfw_btips_bmgInit(); + mfw_btips_a2dpInit(); + mfw_btips_ftpsInit(); + mfw_btips_vgInit(); + mfw_btips_oppsInit(); + mfw_btips_oppcInit(); +mfw_btips_mdgInit(); + + #if FM_STACK == XA_ENABLED + Assert(FM_STATUS_SUCCESS == FM_Init()); + #endif + + +} + +/*--------------------------------------------------------------------------- + * mfw_btips_getRadioStatus + *--------------------------------------------------------------------------- + * + * Synopsis: To return the current status of BT radio. + * + * Return: TRUE if send PIN code is successful, FALSE otherwise. + * + */ +BOOL mfw_btips_getRadioStatus (void) +{ + return isBtRadioEnabled; +} + + +/*--------------------------------------------------------------------------- + * mfw_btips_radioOn + *--------------------------------------------------------------------------- + * + * Synopsis: Enable BT radio. + * + * Return: TRUE if Enabling BT radio is successful, FALSE otherwise. + * + */ +BOOL mfw_btips_radioOn (void) +{ + BtStatus btStatus; + + TRACE_FUNCTION("mfw_btips_radioOn()"); + + Btips_ffs_log_clear(); + + if (MFW_BTIPS_RADIO_OFF == isBtRadioEnabled) + { + isBtRadioEnabled = MFW_BTIPS_RADIO_IN_PROGRESS; + btStatus = BTL_RadioOn(); + Assert(MFW_BTIPS_SUCCESS == mfw_btips_checkStatus(btStatus)); + } + else + { + TRACE_EVENT_P1("mfw_btips_radioOn -BT radio is already enabled %d", isBtRadioEnabled); + } +} + + +/*--------------------------------------------------------------------------- + * mfw_btips_radioOff + *--------------------------------------------------------------------------- + * + * Synopsis: Disable BT radio. + * + * Return: TRUE if Disabling BT radio is successful, FALSE otherwise. + * + */ +BOOL mfw_btips_radioOff (void) +{ + BtStatus btStatus; + + TRACE_FUNCTION("mfw_btips_radioOff()"); + + if (MFW_BTIPS_RADIO_ON == isBtRadioEnabled) + { + isBtRadioEnabled = MFW_BTIPS_RADIO_IN_PROGRESS; + btStatus = BTL_RadioOff(); + Assert(MFW_BTIPS_SUCCESS == mfw_btips_checkStatus(btStatus)); + } + else + { + mfw_BtipsReport(("APP MAIN: BT radio is already disabled")); + } +} + +/*--------------------------------------------------------------------------- + * btips_btlCallBack + *--------------------------------------------------------------------------- + * + * Synopsis: BTL Main application callback in BTS Context + * + * Return: + * + */ +static void btips_btlCallBack(const BtlEvent *event) +{ + T_BTIPS_MMI_IND btips_mmi_ind; + + TRACE_FUNCTION_P1("btips_btlCallBack %d", event->type); + btips_mmi_ind.mfwBtipsEventType = MFW_BTIPS_MAIN_EVENT; + switch (event->type) + { + case BTL_EVENT_RADIO_OFF_COMPLETE: + isBtRadioEnabled = MFW_BTIPS_RADIO_OFF; + btips_mmi_ind.data.btlBtEvent = BTL_EVENT_RADIO_OFF_COMPLETE; + btipsNotifyMFW(&btips_mmi_ind); + break; + + case BTL_EVENT_RADIO_ON_COMPLETE: + // Display Bluetooth Icon on the opening/default main window + isBtRadioEnabled = MFW_BTIPS_RADIO_ON; + btips_mmi_ind.data.btlBtEvent = BTL_EVENT_RADIO_ON_COMPLETE; + btipsNotifyMFW(&btips_mmi_ind); + break; + } +} + +/*--------------------------------------------------------------------------- + * mfw_btips_radioOff + *--------------------------------------------------------------------------- + * + * Synopsis: Disable BT radio. + * + * Return: TRUE if Disabling BT radio is successful, FALSE otherwise. + * + */ + +static void mfw_btips_btlCallBack(T_BTIPS_MMI_IND * para) +{ + MfwBtMainEvent event = para->data.btlBtEvent; + + TRACE_FUNCTION_P1("mfw_btips_btlCallBack %d", event); + + switch (event) + { + case BTL_EVENT_RADIO_OFF_COMPLETE: + mfw_btips_signal(E_BTIPS_POWEROFF_SUCCESS, NULL); + break; + + case BTL_EVENT_RADIO_ON_COMPLETE: + // Display Bluetooth Icon on the opening/default main window + mfw_btips_signal(E_BTIPS_POWERON_SUCCESS, NULL); + break; + + }; +} + +BOOL mfw_btips_checkStatus(BtStatus btStatus) +{ + BOOL mfwBtStatus = 0; + TRACE_EVENT_P1("mfw_btips_checkStatus : %s", pBT_Status(btStatus)); + switch(btStatus) + { + case BT_STATUS_SUCCESS: + case BT_STATUS_PENDING: + case BT_STATUS_IN_PROGRESS: + mfwBtStatus = MFW_BTIPS_SUCCESS; + break; + + case BTEVENT_HCI_FATAL_ERROR: + mfwBtStatus = MFW_BTIPS_FAILED; + TRACE_ERROR("mfw_btips_checkStatus - Fatal Error"); + mfw_btips_signal(E_BTIPS_FATAL_ERROR, NULL); + break; + + case BT_STATUS_INVALID_PARM: + mfwBtStatus = MFW_BTIPS_FAILED; + TRACE_ERROR("mfw_btips_checkStatus - Invalid Params"); + break; + + case BT_STATUS_DEVICE_NOT_FOUND: + mfwBtStatus = MFW_BTIPS_FAILED; + TRACE_ERROR("mfw_btips_checkStatus - BT_STATUS_DEVICE_NOT_FOUND"); + break; + + case BT_STATUS_HCI_INIT_ERR: + mfwBtStatus = MFW_BTIPS_FAILED; + TRACE_ERROR("mfw_btips_checkStatus - BT_STATUS_HCI_INIT_ERR"); + mfw_btips_signal(E_BTIPS_FATAL_ERROR, NULL); + break; + + default: + mfwBtStatus = MFW_BTIPS_SUCCESS; //For the time being + break; + } + return mfwBtStatus; +} + +static BOOL mfw_btips_createDemoRootDir(const BTHAL_U8 *fsPath) +{ + static char path[BTHAL_FS_MAX_PATH_LENGTH] = {'\0'}; + + BtFsStatus status; + BthalFsStat fileStat; + + if (BT_STATUS_HAL_FS_SUCCESS != BTHAL_FS_Stat((const BTHAL_U8 *)fsPath, &fileStat)) + { + /* First, create the root directory */ + status = BTHAL_FS_Mkdir((const BTHAL_U8 *)fsPath); + if ((status != BT_STATUS_HAL_FS_ERROR_EXISTS) && (status != BT_STATUS_HAL_FS_SUCCESS)) + { + Report(("Error: Unable to create Demo root dir %s\n", path)); + return FALSE; + } + + + } + + return TRUE; +} + +#endif +