view src/ui3/mfw/mfw_Btips.c @ 686:59f07d67eb45

luna target split into luna1 and luna2 luna1 is FC Luna based on iWOW DSK v4.0 or v5.0 motherboard luna2 is FC Luna based on FC Caramel2 MB
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 12 Oct 2020 18:51:24 +0000
parents e8ddbb0837ed
children
line wrap: on
line source

/* =========================================================
*             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