line source
+ − /*
+ − +-------------------------------------------------------------------+
+ − | PROJECT: MMI-Framework (8445) $Workfile:: mfw_bt_dm.c $|
+ − | $Author:: NDH $Revision:: 1 $|
+ − | CREATED: 22.04.04 $Modtime:: 22.04.04 11:07 $|
+ − | STATE : code |
+ − +-------------------------------------------------------------------+
+ −
+ −
+ − MODULE : MFW_BT_DM
+ −
+ − PURPOSE : This module contains the functions for MFW Bluetooth Device Manager Profile
+ −
+ −
+ − */
+ −
+ − #define ENTITY_MFW
+ −
+ − #include <string.h>
+ −
+ − #if defined (NEW_FRAME)
+ −
+ − #include "typedefs.h"
+ − #include "vsi.h"
+ − #include "pei.h"
+ − #include "custom.h"
+ − #include "gsm.h"
+ −
+ − #else
+ −
+ − #include "STDDEFS.H"
+ − #include "custom.h"
+ − #include "gsm.h"
+ − #include "vsi.h"
+ −
+ − #endif
+ −
+ − #include "bta_riviera.h"
+ − #include "mfw_bte.h"
+ − #include "mfw_bt_dm.h"
+ − #include "mfw_bt_geh.h"
+ − #include "mfw_bt_flash.h"
+ −
+ −
+ − T_MFW_BT_CB mfw_bt_cb;
+ −
+ − /* file where is stored bd address of the device to connect */
+ − #ifndef MFW_BT_BD_ADDR_FILE
+ − #define MFW_BT_BD_ADDR_FILE "/bt/remote_bd"
+ − #endif
+ −
+ − static T_MFW_BT_STATUS mfw_bt_dm_trust_device(BOOLEAN is_trusted, BD_ADDR bd_addr);
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_set_visibility
+ −
+ − $Description: set visibility of local BT device
+ −
+ − $Returns: T_MFW_BT_STATUS. Success or fail.
+ −
+ − $Arguments: is_visible: new visibility setting. is_temp: define whether it is a temporary
+ − modification ( TRUE ) or a permanent one ( FALSE ).
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_set_visibility( BOOL is_visible, BOOL is_temp)
+ − {
+ − /* other devices will be able to find this device during an inquiry */
+ − if( mfw_bt_cb.is_started == TRUE )
+ − BTA_DmSetVisibility( (is_visible)?BTA_DM_GENERAL_DISC:BTA_DM_NON_DISC,
+ − BTA_DM_CONN);
+ −
+ − if( is_temp == TRUE)
+ − /* it looks like this is only a temporary change => don't store that in flash! */
+ − return MFW_BT_SUCCESS;
+ −
+ − /* update to nvram and mfw_bt_cfg */
+ − return mfw_bt_store_visibility( is_visible );
+ − }
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_get_visibility
+ −
+ − $Description: get visibility of local BT device
+ −
+ − $Returns: TRUE if visible, FALSE if not.
+ −
+ − $Arguments: none
+ −
+ − *******************************************************************************/
+ − BOOL mfw_bt_dm_get_visibility( void )
+ − {
+ − return mfw_bt_read_visibility( );
+ − }
+ −
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_get_local_name
+ −
+ − $Description: read local BT device name
+ −
+ − $Returns: a pointer to a string. NULL if no name available. One should make a copy of
+ − string if he wants to use it/modify it.
+ −
+ − $Arguments: none
+ −
+ − *******************************************************************************/
+ − UINT8 * mfw_bt_dm_get_local_name( void )
+ − {
+ − return mfw_bt_read_local_name();
+ − }
+ −
+ −
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_set_local_name
+ −
+ − $Description: set local BT device name
+ −
+ − $Returns: T_MFW_BT_STATUS
+ −
+ − $Arguments: new name. Pointer to a string. This string is copied locally. Buffer is not freed.
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_set_local_name( INT8 *name )
+ − {
+ − if( strlen((char*)name) == 0 )
+ − {
+ − /* BMI should never ever send back an empty string, except at start-up */
+ − if( mfw_bt_cb.is_name_requested == FALSE )
+ − return MFW_BT_FAIL;
+ −
+ − /* we are here, this means:
+ − - it's a start-up
+ − - apparently, the local name was never set. => it's the first start-up
+ − - the user don't really want to use BT as he cancelled the setting.
+ − => this means we do want to stop BT... So go for it! :o) */
+ − mfw_bt_disable( );
+ − return MFW_BT_SUCCESS;
+ − }
+ −
+ − if( mfw_bt_cb.is_name_requested == TRUE )
+ − mfw_bt_cb.is_name_requested = FALSE;
+ −
+ − if( strlen((char*)name) > MFW_BT_NAME_LENGTH )
+ − return MFW_BT_INVALID_DATA;
+ −
+ − if( mfw_bt_cb.is_started )
+ − BTA_DmSetDeviceName( (char*)name );
+ − /* update to nv memory and mfw_bt_cfg with new name */
+ − return mfw_bt_store_local_name( (char*) name );
+ − }
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_get_bt_status
+ −
+ − $Description: get the status of the local Bluetooth system. Used at start-up to decide whether
+ − or not we want BT to be started by default.
+ −
+ − $Returns: MFW_BT_SUCCESS is BT is started. 0 if OFF
+ −
+ − $Arguments:
+ −
+ − *******************************************************************************/
+ − BOOL mfw_bt_dm_get_bt_status( void )
+ − {
+ − return mfw_bt_read_status( );
+ −
+ − }
+ −
+ −
+ −
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_pin_code
+ −
+ − $Description: used by BMI to send back a pin code
+ −
+ − $Returns: T_MFW_BT_STATUS. MFW_BT_NOT_INITIALISED is BT is not started.
+ −
+ − $Arguments: pin code and pin code length. This data is copied.
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_pin_code(UINT8* pin_code, UINT8 pin_len)
+ − {
+ − BOOLEAN accept = TRUE;
+ −
+ − if( mfw_bt_cb.is_started != TRUE )
+ − return MFW_BT_NOT_INITIALISED;
+ −
+ − if(pin_len == 0)
+ − accept = FALSE;
+ − BTA_DmPinReply( mfw_bt_cb.peer_bdaddr,
+ − accept,
+ − pin_len,
+ − pin_code);
+ −
+ − return MFW_BT_SUCCESS;
+ − }
+ −
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_bond
+ −
+ − $Description: used by BMI to send a pin code in order to establish a bonding with a
+ − remote device.
+ −
+ − $Returns: T_MFW_BT_STATUS. MFW_BT_NOT_INITIALISED is BT is not started.
+ −
+ −
+ − $Arguments: BD_ADDR of the remote device, pin code and pin code length. Data is copied.
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_bond(BD_ADDR bd_addr, UINT8* pin_code, UINT8 pin_len )
+ − {
+ − if( mfw_bt_cb.is_started != TRUE )
+ − return MFW_BT_NOT_INITIALISED;
+ −
+ −
+ − MFW_BT_TRACE("try to bond with stored device");
+ − if(pin_len != 0)
+ − {
+ − /* now tell the BT stack */
+ − BTA_DmBond ( bd_addr, pin_len, pin_code );
+ − return MFW_BT_SUCCESS;
+ − }
+ − else
+ − {
+ − MFW_BT_TRACE(" [ mfw_bt dm bond]: no pin code entered!");
+ − return MFW_BT_FAIL;
+ − }
+ −
+ − }
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_authorize_resp
+ −
+ − $Description: used to answer to an authorization request
+ −
+ − $Returns: T_MFW_BT_STATUS. SUCCESS/FAIL, but also:
+ − MFW_BT_NOT_INITIALISED is BT is not started.
+ − MFW_BT_INVALID_DATA if auth value is not correct.
+ − MFW_BT_UNKNOWN_DEVICE if BD_addr is not recognized.
+ − MFW_BT_DATA_BASE_FULL if there are already too many devices in the DB.
+ −
+ −
+ − $Arguments: MFW_BT_AUTH_FAIL to refuse,
+ − MFW_BT_AUTH_ONCE to grant access temporarily,
+ − MFW_BT_AUTH_ALWAYS to grant permanent access
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_authorize_resp( T_MFW_BT_AUTHORIZE auth)
+ − {
+ − T_MFW_BT_STATUS status;
+ −
+ − if( mfw_bt_cb.is_started != TRUE )
+ − return MFW_BT_NOT_INITIALISED;
+ −
+ − switch (auth)
+ − {
+ − case MFW_BT_AUTH_FAIL:
+ − /* reject */
+ − BTA_DmAuthorizeReply( mfw_bt_cb.peer_bdaddr,
+ − mfw_bt_cb.peer_service,
+ − BTA_DM_NOT_AUTH);
+ − mfw_bt_dm_trust_device( FALSE, mfw_bt_cb.peer_bdaddr );
+ − break;
+ −
+ − case MFW_BT_AUTH_ALWAYS:
+ − /*
+ − ** CQ22024 : Set the device as Trusted, and Authorise it for this an all subsequent connections
+ − ** If writing to the Flash fails, proceed with the authorisation anyway.
+ − */
+ − status = mfw_bt_dm_trust_device( TRUE, mfw_bt_cb.peer_bdaddr );
+ −
+ − /*
+ − ** Even if we fail to write the information to the FLASH, we should continue with the
+ − ** Authorisation procedure. If the device is unknown, the device will remain Authorised as
+ − ** long as the Handset is not powered down (Not ideal, but better than refusing Authorisation all together)
+ − */
+ − BTA_DmAuthorizeReply( mfw_bt_cb.peer_bdaddr,
+ − mfw_bt_cb.peer_service,
+ − BTA_DM_AUTH_PERM);
+ − break;
+ −
+ − case MFW_BT_AUTH_ONCE:
+ − /* CQ22024 : tell the BT stack we authorize the device, but for this connection only */
+ − BTA_DmAuthorizeReply( mfw_bt_cb.peer_bdaddr,
+ − mfw_bt_cb.peer_service,
+ − BTA_DM_AUTH_TEMP);
+ − break;
+ −
+ − default:
+ − return MFW_BT_INVALID_DATA;
+ − }
+ − return MFW_BT_SUCCESS;
+ − }
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_sig_strength
+ −
+ − $Description: ask for the link quality
+ −
+ − $Returns: T_MFW_BT_STATUS. MFW_BT_NOT_INITIALISED if BT is not started.
+ −
+ − $Arguments: T_MFW_BT_DM_SIG_STRENGTH sig_strength, UINT16 period, BOOLEAN is_on
+ − See BTA documentation for more details.
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_sig_strength ( T_MFW_BT_DM_SIG_STRENGTH sig_strength,
+ − UINT16 period,
+ − BOOLEAN is_on )
+ − {
+ − if( mfw_bt_cb.is_started != TRUE )
+ − return MFW_BT_NOT_INITIALISED;
+ − BTA_DmSignalStrength((tBTA_SIG_STRENGTH_MASK) sig_strength, period, is_on);
+ − return MFW_BT_SUCCESS;
+ − }
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_get_known_devices
+ −
+ − $Description: used by BMI to get the list of known devices for a specified condition: either a
+ − service mask, either a bd address ( union ).
+ − MFW will fill in the variables: pp_device => table of known devices
+ − number_of_devices => number of devices.
+ − MFW will allocate memory for each device found. It's up to BMI to free it!
+ −
+ − $Returns: T_MFW_BT_STATUS.
+ − If BD_ADDR is specified, might return MFW_BT_UNKNOWN_DEVICE.
+ − The answers will be returned using BMI signals:
+ − - E_BT_DM_INQ_CMPL with the number of devices
+ − - E_BT_DM_DISC_RES for each device
+ − - then E_BT_DM_DISC_CMPL when it's done.
+ −
+ − $Arguments: BD_ADDR if looking for a particular device. services if looking for a
+ − category of device. If bd_addr is specified, ignore services. If services set
+ − to 0, will return all the known devices.
+ −
+ − *******************************************************************************/
+ − void mfw_bt_dm_get_known_devices ( BD_ADDR bd_addr,
+ − T_MFW_BT_SERVICE_MASK services)
+ − {
+ − T_MFW_BT_REM_DEVICE *ptr_db_device[MFW_BT_NUM_REM_DEVICE];
+ − UINT8 i, number_of_devices;
+ − T_MFW_BT_DM_INQ_CMPL inq_cmpl_res;
+ − T_MFW_BT_STATUS status;
+ − BD_ADDR null_bd_addr;
+ −
+ − number_of_devices = 0;
+ − memset(&null_bd_addr[0], 0x00, sizeof(BD_ADDR));
+ −
+ − /* we have a BT address, try to find the related data */
+ − /* CQ21834 : cannot treat bd_addr as a pointer, because it is passed by value. Use MemCmp */
+ − if( memcmp(&bd_addr[0], &null_bd_addr[0], sizeof(BD_ADDR)) != 0 )
+ − {
+ − ptr_db_device[0] = mfw_bt_get_device_info(bd_addr);
+ −
+ − if(ptr_db_device[0] != NULL)
+ − {
+ − if((ptr_db_device[0])->is_new == FALSE)
+ − number_of_devices = 1;
+ − }
+ − }
+ − else
+ − {
+ − /* Now we want to find all the devices which support the given services */
+ − mfw_bt_get_device_by_service(services, &ptr_db_device[0], &number_of_devices );
+ − }
+ −
+ − /* first send the number of found devices. this is important! BMI shouldn't do anything
+ − before he gets all the answer */
+ − inq_cmpl_res.num_resps = number_of_devices;
+ − mfw_bt_signal( E_BT_DM_INQ_CMPL, (void*)&inq_cmpl_res);
+ −
+ − if (number_of_devices > 0)
+ − {
+ − /*
+ − ** CQ21834 : The incorrect structure was being used for the signal, so the data was never received by the BMI.
+ − */
+ − T_MFW_BT_DM_DISC_RES disc_res;
+ −
+ − /* now for each device found, send a signal to BMI. This will copy the data! */
+ − for( i=0; i<number_of_devices; i++ )
+ − {
+ − memcpy((void *)&disc_res, (void *)ptr_db_device[i], sizeof(disc_res));
+ −
+ − mfw_bt_signal( E_BT_DM_DISC_RES, (void *)&disc_res);
+ − }
+ −
+ − mfw_bt_signal( E_BT_DM_DISC_CMPL, NULL);
+ − }
+ −
+ − return;
+ −
+ − }
+ −
+ −
+ −
+ −
+ −
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_trust_device
+ −
+ − $Description: specify whether a remote device should or not be trusted ( => access granted )
+ −
+ − $Returns: T_MFW_BT_STATUS
+ − success, failure, MFW_BT_UNKNOWN_DEVICE
+ −
+ − $Arguments: BOOLEAN for the permission; BD address of the remote device
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_trust_device(BOOLEAN is_trusted, BD_ADDR bd_addr)
+ − {
+ − T_MFW_BT_REM_DEVICE * p_device;
+ − T_MFW_BT_STATUS status;
+ −
+ − /* check if we know this device*/
+ − if(( p_device = mfw_bt_get_device_info(bd_addr)) == NULL )
+ − /* unknown device... */
+ − return MFW_BT_UNKNOWN_DEVICE;
+ −
+ − p_device->is_trusted = is_trusted;
+ − if (( status = mfw_bt_flash_store_device(p_device)) != MFW_BT_SUCCESS )
+ − return status;
+ −
+ − /* update BTA with new settings */
+ − if( mfw_bt_cb.is_started )
+ − {
+ − if(p_device->link_key_present)
+ − BTA_DmAddDevice(bd_addr, p_device->link_key, BTA_ALL_SERVICE_MASK, is_trusted);
+ − else
+ − BTA_DmAddDevice(bd_addr, NULL, BTA_ALL_SERVICE_MASK, is_trusted);
+ − }
+ −
+ − return MFW_BT_SUCCESS;
+ − }
+ −
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_delete_device
+ −
+ − $Description: remove a device from the local DB
+ −
+ − $Returns: T_MFW_BT_STATUS ( MFW_BT_SUCCESS, MFW_BT_FAIL, MFW_BT_UNKNOWN_DEVICE )
+ −
+ − $Arguments: BD address
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_delete_device(BD_ADDR bd_addr)
+ − {
+ − if( mfw_bt_cb.is_started )
+ − BTA_DmRemoveDevice (bd_addr);
+ − return mfw_bt_flash_delete_device(bd_addr);
+ − }
+ −
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_add_device
+ −
+ − $Description: This will store permanently a device in Flash.
+ −
+ − $Returns: T_MFW_BT_STATUS
+ − errors: MFW_BT_UNKNOWN_DEVICE, MFW_BT_DATA_BASE_FULL,
+ −
+ −
+ − $Arguments: new BD address
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_add_device(BD_ADDR bd_addr)
+ − {
+ − T_MFW_BT_REM_DEVICE *p_device;
+ − T_MFW_BT_STATUS status;
+ −
+ − MFW_BT_TRACE("mfw_bt_dm_add_device()");
+ −
+ − /* get the info about this device */
+ − if( ( p_device = mfw_bt_get_device_info( bd_addr)) == NULL)
+ − return MFW_BT_UNKNOWN_DEVICE;
+ −
+ − if( p_device->is_new == TRUE )
+ − {
+ − /*
+ − ** CQ21834 : Ensure that the is_new value is set before writing the data to Flash, so that it will be
+ − ** set correctly when the handset is restarted.
+ − */
+ − p_device->is_new = FALSE;
+ − if((status = mfw_bt_flash_store_device(p_device))!=MFW_BT_SUCCESS)
+ − return status;
+ − }
+ −
+ − /* update BTA device database */
+ − if( mfw_bt_cb.is_started )
+ − {
+ − if(p_device->link_key_present)
+ − BTA_DmAddDevice(p_device->bd_addr, p_device->link_key,
+ − p_device->trusted_services, p_device->is_trusted);
+ − else
+ − BTA_DmAddDevice(p_device->bd_addr, NULL,
+ − p_device->trusted_services, p_device->is_trusted);
+ − }
+ − return MFW_BT_SUCCESS;
+ −
+ − }
+ −
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_rename_device
+ −
+ − $Description: modify the friendly name of a known ( already stored ) remote device
+ −
+ − $Returns: T_MFW_BT_STATUS.
+ − MFW_BT_UNKNOWN_DEVICE, DATA_BASE_FULL, MFW_BT_INVALID_DATA...
+ −
+ − $Arguments: bd address of the remote device and the new name associated
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_rename_device(BD_ADDR bd_addr, UINT8* new_name)
+ − {
+ − T_MFW_BT_REM_DEVICE *p_device;
+ −
+ − if( ( p_device = mfw_bt_get_device_info( bd_addr)) == NULL )
+ − return MFW_BT_UNKNOWN_DEVICE;
+ − /* if this device is new ( == in the inq DB ), we don't want to do anything */
+ − if( p_device->is_new == TRUE )
+ − return MFW_BT_FAIL;
+ − /* verify the string is OK */
+ − if( strlen( (char*)new_name ) > MFW_BT_NAME_LENGTH )
+ − return MFW_BT_INVALID_DATA;
+ − strcpy(p_device->friendly_name, (char*)new_name );
+ − return mfw_bt_flash_store_device(p_device);
+ −
+ − }
+ −
+ −
+ −
+ −
+ −
+ −
+ − /*
+ − ** Functions used to interact with the BT "search engine"
+ − */
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_discover_device
+ −
+ − $Description: Discovers services on a device
+ −
+ − $Returns: T_MFW_BT_STATUS. MFW_BT_NOT_INITIALISED if BT not started.
+ −
+ − $Arguments: bd address of the remote device to discover
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_discover_device(BD_ADDR bd_addr)
+ − {
+ −
+ − T_MFW_BT_SERVICE_MASK client_services;
+ −
+ − if( mfw_bt_cb.is_started != TRUE )
+ − return MFW_BT_NOT_INITIALISED;
+ −
+ − /* remember it's an inquiry */
+ − mfw_bt_cb.is_discovery = TRUE;
+ −
+ − /* we need to find only services for which we can be in client role, plus HS/HF */
+ − client_services = ((BTA_SUPPORTED_CLIENT_SERVICES & \
+ − ~( BTA_DUN_SERVICE_MASK | BTA_FAX_SERVICE_MASK )) \
+ − | BTA_HSP_SERVICE_MASK | BTA_HFP_SERVICE_MASK );
+ −
+ − BTA_DmDiscover(bd_addr, BTA_ALL_SERVICE_MASK, (tBTA_DM_SEARCH_CBACK*)mfw_bt_dm_search_cb);
+ −
+ − return MFW_BT_SUCCESS;
+ − }
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_is_discover
+ −
+ − $Description: Checks if we are in discovering services process
+ −
+ − $Returns:
+ −
+ − $Arguments: None
+ −
+ − *******************************************************************************/
+ − UINT8 mfw_bt_dm_is_discover(void)
+ − {
+ − return mfw_bt_cb.is_discovery;
+ − }
+ −
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_cancel_search
+ −
+ − $Description: cancel an ongoing search
+ −
+ − $Returns: MFW_BT_NOT_INITIALISED if BT not started.
+ −
+ − $Arguments:
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_cancel_search( void )
+ − {
+ − if( mfw_bt_cb.is_started != TRUE )
+ − return MFW_BT_NOT_INITIALISED;
+ − BTA_DmSearchCancel();
+ − return MFW_BT_SUCCESS;
+ − }
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_search
+ −
+ − $Description: Searches for devices supporting the services specified. If services = 0, will
+ − return all the found devices regardless of their functionalities.
+ −
+ − $Returns: MFW_BT_NOT_INITIALISED if BT not started.
+ −
+ − $Arguments: services. If
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_search(T_MFW_BT_SERVICE_MASK services)
+ − {
+ − tBTA_DM_INQ inq_params;
+ − UINT8 inq_index;
+ −
+ − if( mfw_bt_cb.is_started != TRUE )
+ − return MFW_BT_NOT_INITIALISED;
+ − mfw_bt_cb.is_discovery = FALSE;
+ − inq_params.mode = 0;
+ − inq_params.duration = MFW_BT_DEFAULT_INQ_DURATION;
+ − inq_params.max_resps = MFW_BT_NUM_REM_DEVICE;
+ − inq_params.filter_type = BTA_DM_INQ_CLR;
+ −
+ − /* "initialize" the inquiry data base */
+ − mfw_bt_clean_inq_db( );
+ − /* store the services we are looking for, so that we can filter the results */
+ − mfw_bt_cb.search_services = services;
+ − /* find nearby devices */
+ − BTA_DmSearch(&inq_params, services, mfw_bt_dm_search_cb );
+ − return MFW_BT_SUCCESS;
+ −
+ − }
+ −
+ −
+ −
+ −
+ − /*
+ − ** MFW Bluetooth Device Manager Signal Handler Function Definitions
+ − */
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_security_hndlr
+ −
+ − $Description: This function recieves the BTA DM Security events from the Generic Event Handler
+ − and either processes them in their entirety or passes them to the MMI for further
+ − processing.
+ −
+ − $Returns: MFW_BT_SUCCESS : The signal was handled successfully
+ −
+ − $Arguments: event : Event Id returned from the Bluetooth Module
+ − data : pointer to the relevant data returned from the Mluetooth Module
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_security_hndlr (T_MFW_BT_DM_SEC_EVT event, T_MFW_BT_DM_SEC_SIG_DATA *data)
+ − {
+ − T_MFW_BT_STATUS retVal = MFW_BT_SUCCESS;
+ −
+ − MFW_BT_TRACE("mfw_bt_dm_security_hndlr");
+ −
+ − switch (event)
+ − {
+ − case BTA_DM_SYS_START_EVT:
+ − {
+ − MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_SYS_START_EVT event received");
+ − /* now enable bluetooth functionalities before calling other BTA API */
+ − BTA_EnableBluetooth(&mfw_bt_dm_security_cb);
+ − }
+ − break;
+ −
+ − case BTA_DM_ENABLE_EVT:
+ − {
+ − MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_ENABLE_EVT event received");
+ − /* call the enable call-back */
+ − mfw_bt_enable_cb( );
+ − }
+ − break;
+ −
+ − case BTA_DM_DISABLE_EVT:
+ − {
+ − MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_DISABLE_EVT event received");
+ −
+ − /* stop the BT chipset */
+ − BTA_SysStop();
+ −
+ − /* we won't use BT anymore => free the event handler */
+ − mfw_bt_ge_disable();
+ −
+ − /* store the new settings */
+ − mfw_bt_store_status(FALSE);
+ − mfw_bt_cb.is_started = FALSE;
+ −
+ − /* and tell BMI */
+ − mfw_bt_signal(E_BT_DISABLE_CMPL, (void *)0);
+ − }
+ − break;
+ −
+ − case BTA_DM_PIN_REQ_EVT:
+ − {
+ − /* store the BD ADDR of the remote device */
+ − bdcpy(mfw_bt_cb.peer_bdaddr, data->pin_req.bd_addr);
+ − /* and forward the signal to BMI */
+ − mfw_bt_signal(E_BT_DM_PIN_REQ, data);
+ − MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_PIN_REQ_EVT event received");
+ − }
+ − break;
+ −
+ − case BTA_DM_AUTH_CMPL_EVT:
+ − {
+ − T_MFW_BT_DM_AUTH_CMPL data_auth;
+ − T_MFW_BT_REM_DEVICE device;
+ − T_MFW_BT_REM_DEVICE *p_device;
+ −
+ − MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_AUTH_CMPL_EVT event received");
+ − /* first, give some feedback to BMI */
+ − /* => copy data */
+ − memcpy(data_auth.bd_addr, data->auth_cmpl.bd_addr, BD_ADDR_LEN);
+ − if( strlen((char*)data->auth_cmpl.bd_name) != 0 )
+ − mfwStrncpy((char*)data_auth.bd_name, (const char*)data->auth_cmpl.bd_name, MFW_BT_NAME_LENGTH);
+ − data_auth.is_success = data->auth_cmpl.success;
+ − /* and forward it */
+ − mfw_bt_signal(E_BT_DM_AUTH_CMPL, (void*)&data_auth);
+ −
+ − /* now see if we have to update our data base */
+ − p_device = mfw_bt_get_device_info(data->auth_cmpl.bd_addr);
+ − if( p_device == NULL )
+ − {
+ − /* we don't know this device ... */
+ − if ( data->auth_cmpl.success == FALSE )
+ − /* ... and auth has been rejected: get away from here... */
+ − break;
+ −
+ − /* ... but it's trusted. So add it to our DB. This means we have to create a
+ − real T_MFW_BT_REM_DEVICE entity, which will be copied */
+ − p_device = &device;
+ − memset(&device, 0, sizeof( T_MFW_BT_REM_DEVICE ) );
+ − }
+ −
+ − /* ok, now update our local DB: get the info we received */
+ − memcpy(p_device->bd_addr, data->auth_cmpl.bd_addr, BD_ADDR_LEN);
+ − if( strlen((char*)data->auth_cmpl.bd_name) != 0 )
+ − mfwStrncpy((char*)p_device->name, (const char*)data->auth_cmpl.bd_name, MFW_BT_NAME_LENGTH);
+ − memcpy(p_device->link_key, data->auth_cmpl.key, LINK_KEY_LEN );
+ − p_device->link_key_present = data->auth_cmpl.key_present;
+ −
+ − /* we don't modify the other fields => either the already stored ones will be used,
+ − either for a new device they will be set to zero. */
+ −
+ − mfw_bt_flash_store_device( p_device );
+ − }
+ − break;
+ −
+ − case BTA_DM_AUTHORIZE_EVT:
+ − {
+ − /* keep a trace of the information??? */
+ − bdcpy(mfw_bt_cb.peer_bdaddr, data->authorize.bd_addr);
+ − strncpy((char*)mfw_bt_cb.peer_name, (char*)data->authorize.bd_name, MFW_BT_NAME_LENGTH);
+ − mfw_bt_cb.peer_service = data->authorize.service;
+ − /*and forward it to BMI */
+ − mfw_bt_signal(E_BT_DM_AUTHORIZE_REQ, data );
+ − MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_AUTHORIZE_EVT event received");
+ − }
+ − break;
+ −
+ − case BTA_DM_LINK_UP_EVT:
+ − {
+ − /* this is only a "HW" connection, so no service or name needed. Just show BT is busy */
+ − MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_LINK_UP_EVT event received");
+ − mfw_bt_signal(E_BT_DM_LINK_UP, data );
+ − }
+ − break;
+ −
+ − case BTA_DM_LINK_DOWN_EVT:
+ − {
+ − /* just to know BT is idle again */
+ − MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_LINK_DOWN_EVT event received");
+ − mfw_bt_signal(E_BT_DM_LINK_DOWN, data );
+ − }
+ − break;
+ −
+ − case BTA_DM_SIG_STRENGTH_EVT:
+ − {
+ − /* ok, we receive a signal strength indication. Great. */
+ − MFW_BT_TRACE("mfw_bt_dm_security_hndlr > BTA_DM_SIG_STRENGTH_EVT event received");
+ − mfw_bt_signal(E_BT_DM_SIG_STRENGTH_IND, data );
+ − }
+ − break;
+ −
+ − default:
+ − {
+ − /*
+ − ** Unexpected Event, set the data sized to -1 to exit with no further action
+ − */
+ − MFW_BT_TRACE_P1("mfw_bt_dm_security_b > Unexpected Event %d", event);
+ − retVal = MFW_BT_INVALID_EVENT;
+ − }
+ − break;
+ −
+ − }
+ −
+ − return retVal;
+ − }
+ −
+ −
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_search_hndlr
+ −
+ − $Description: This function recieves the BTA DM Search events from the Generic Event Handler
+ − and either processes them in their entirety or passes them to the MMI for further
+ − processing.
+ −
+ − $Returns: MFW_BT_SUCCESS : The signal was handled successfully
+ −
+ − $Arguments: event : Event Id returned from the Bluetooth Module
+ − data : pointer to the relevant data returned from the Mluetooth Module
+ −
+ − *******************************************************************************/
+ − T_MFW_BT_STATUS mfw_bt_dm_search_hndlr (T_MFW_BT_DM_SRCH_EVT event, T_MFW_BT_DM_SRCH_SIG_DATA *data)
+ − {
+ − T_MFW_BT_STATUS retVal = MFW_BT_SUCCESS;
+ −
+ − MFW_BT_TRACE("mfw_bt_dm_search_hndlr");
+ −
+ − /*
+ − ** Set the expected data size according to the received event
+ − */
+ − switch (event)
+ − {
+ − case BTA_DM_INQ_RES_EVT:
+ − {
+ − MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_INQ_RES_EVT event received");
+ − /* we just received a BD address... Don't even forward this to BMI */
+ − MFW_BT_TRACE_P6("DB_ADDR: msg_str%02x:%02x:%02x:%02x:%02x:%02x\n",
+ − data->inq_res.bd_addr[0], data->inq_res.bd_addr[1],
+ − data->inq_res.bd_addr[2], data->inq_res.bd_addr[3],
+ − data->inq_res.bd_addr[4], data->inq_res.bd_addr[5]);
+ − mfw_bt_add_inq_device( &(data->inq_res) );
+ − }
+ − break;
+ −
+ − case BTA_DM_INQ_CMPL_EVT:
+ − mfw_bt_signal( E_BT_DM_INQ_CMPL, (void*)&data->inq_cmpl);
+ − MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_INQ_CMPL_EVT event received");
+ − break;
+ −
+ − case BTA_DM_DISC_RES_EVT:
+ − {
+ − T_MFW_BT_DM_DISC_RES disc_res_data;
+ − T_MFW_BT_REM_DEVICE *p_device_rec = NULL; /*CQ21834 : Not Just needed for discovery, but search also */
+ −
+ − /*
+ − ** Do some preliminary initialisation, so that if nothing changes we send the right information
+ − */
+ − memset(&disc_res_data, 0x00, sizeof(T_MFW_BT_DM_DISC_RES));
+ −
+ − memcpy(disc_res_data.bd_addr, data->disc_res.bd_addr, sizeof(BD_ADDR));
+ − memcpy(disc_res_data.name, data->disc_res.bd_name, MFW_BT_NAME_LENGTH);
+ − disc_res_data.services = data->disc_res.services;
+ − disc_res_data.is_new = TRUE;
+ −
+ − /* if we are doing a discovery on a device */
+ − if(mfw_bt_cb.is_discovery == TRUE)
+ − {
+ − if(data->disc_res.services == 0 )
+ − {
+ − MFW_BT_TRACE("No service found");
+ − }
+ − else
+ − {
+ − p_device_rec = mfw_bt_get_device_info(data->disc_res.bd_addr );
+ − if(p_device_rec)
+ − {
+ − /* we really should find our device! */
+ − p_device_rec->services = data->disc_res.services;
+ −
+ − if( p_device_rec->is_new)
+ − mfw_bt_add_disc_device((T_MFW_BT_DM_DISC_RES*) p_device_rec);
+ − else
+ − mfw_bt_flash_store_device(p_device_rec);
+ − /* forward the info to BMI */
+ −
+ − /*
+ − ** Reset the information for the signal from the known or already discovered database
+ − */
+ − memcpy(&disc_res_data, p_device_rec, sizeof(T_MFW_BT_DM_DISC_RES));
+ − }
+ − }
+ − }
+ − /* we are doing device search. We receive the information about all the found devices.
+ − Let's verify if we specified services to look for => if yes, filter the results */
+ − else if( mfw_bt_cb.search_services == 0 ||
+ − (mfw_bt_cb.search_services & data->disc_res.services))
+ − {
+ − /*
+ − ** CQ21834 : Check to determine whether the device is already known, if so get (and update)
+ − ** the information in th eKnown Devices Database
+ − */
+ − p_device_rec = mfw_bt_get_device_info(data->disc_res.bd_addr );
+ −
+ − /*
+ − ** p_device_rec should not be NULL because the device was added to the inquiry database when the inq result
+ − ** was recieved if it was not already in the known device database.
+ − */
+ − if (p_device_rec->is_new == FALSE)
+ − {
+ − MFW_BT_TRACE("BTA_DM_DISC_RES_EVT > This device is known");
+ −
+ − if (strncmp(p_device_rec->name, (char *)&data->disc_res.bd_name, MFW_BT_NAME_LENGTH) != 0)
+ − {
+ − mfwStrncpy(p_device_rec->name, (char *)&data->disc_res.bd_name, MFW_BT_NAME_LENGTH);
+ − }
+ −
+ − /* Update the device details! */
+ − p_device_rec->services |= data->disc_res.services;
+ − mfw_bt_flash_store_device(p_device_rec);
+ −
+ − memcpy(&disc_res_data, p_device_rec, sizeof(T_MFW_BT_DM_DISC_RES));
+ − }
+ −
+ − /*
+ − ** CQ21834: update our database whether the device is known or not, so that if the user removes it from the
+ − ** known device database, we will still have the details available.
+ − */
+ − mfw_bt_add_disc_device( (T_MFW_BT_DM_DISC_RES*) &disc_res_data);
+ − }
+ −
+ − MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_DISC_RES_EVT event received");
+ − /* and forward the event to BMI */
+ − mfw_bt_signal( E_BT_DM_DISC_RES, (void*)&disc_res_data);
+ − }
+ − break;
+ −
+ − case BTA_DM_DISC_CMPL_EVT:
+ − mfw_bt_signal( E_BT_DM_DISC_CMPL, NULL );
+ − MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_DISC_CMPL_EVT event received");
+ − break;
+ −
+ − case BTA_DM_SEARCH_CANCEL_CMPL_EVT:
+ − /* currently, we don't do anything when a search is cancelled. Should we? */
+ − MFW_BT_TRACE("mfw_bt_dm_search_hndlr > BTA_DM_SEARCH_CANCEL_CMPL_EVT event received");
+ − break;
+ −
+ − default:
+ − /*
+ − ** Unexpected Event, setthe data sized to -1 to exit with no further action
+ − */
+ − MFW_BT_TRACE_P1("mfw_bt_dm_search_hndlr > Unexpected Event %d", event);
+ − retVal = MFW_BT_INVALID_EVENT;
+ −
+ − }
+ −
+ − return retVal;
+ − }
+ −
+ −
+ −
+ −
+ −
+ − /*
+ − ** MFW Bluetooth Device Manager Callback Function Definitions
+ − */
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_dm_security_b
+ −
+ − $Description: This is the Device Manager Security Callback function, a pointer to it is passed
+ − to the Bluetooth Module in the BTA DM Enable function and it is used to return
+ − information from the Bluetooth Module
+ −
+ − $Returns: None
+ −
+ − $Arguments: event : Event Id returned from the Bluetooth Module
+ − data : pointer to the relevant data returned from the Mluetooth Module
+ −
+ − *******************************************************************************/
+ − void mfw_bt_dm_security_cb(T_MFW_BT_DM_SEC_EVT event, T_MFW_BT_DM_SEC_SIG_DATA *data)
+ − {
+ − int dataLen;
+ − T_MFW_BT_STATUS geRetVal = MFW_BT_SUCCESS;
+ −
+ − MFW_BT_TRACE("mfw_bt_dm_security_b");
+ −
+ − /*
+ − ** Set the expected data size according to the received event
+ − */
+ − switch (event)
+ − {
+ − case BTA_DM_SYS_START_EVT:
+ − dataLen = 0;
+ − break;
+ − case BTA_DM_ENABLE_EVT:
+ − dataLen = sizeof(tBTA_DM_ENABLE);
+ − break;
+ −
+ − case BTA_DM_DISABLE_EVT:
+ − dataLen = 0;
+ − break;
+ −
+ − case BTA_DM_PIN_REQ_EVT:
+ − dataLen = sizeof(tBTA_DM_PIN_REQ);
+ − break;
+ −
+ − case BTA_DM_AUTH_CMPL_EVT:
+ − dataLen = sizeof(tBTA_DM_AUTH_CMPL);
+ − break;
+ −
+ − case BTA_DM_AUTHORIZE_EVT:
+ − dataLen = sizeof(tBTA_DM_AUTHORIZE);
+ − break;
+ −
+ − case BTA_DM_LINK_UP_EVT:
+ − dataLen = sizeof(tBTA_DM_LINK_UP);
+ − break;
+ −
+ − case BTA_DM_LINK_DOWN_EVT:
+ − dataLen = sizeof(tBTA_DM_LINK_DOWN);
+ − break;
+ −
+ − case BTA_DM_SIG_STRENGTH_EVT:
+ − dataLen = sizeof(tBTA_DM_SIG_STRENGTH);
+ − break;
+ −
+ − default:
+ − /*
+ − ** Unexpected Event, setthe data sized to -1 to exit with no further action
+ − */
+ − MFW_BT_TRACE_P1("mfw_bt_dm_security_b > Unexpected Event %d", event);
+ − dataLen = -1;
+ −
+ − }
+ −
+ −
+ − if (dataLen > 0)
+ − {
+ − /*
+ − ** Data is expected with the received signal
+ − */
+ − if ((void *)data == (void *)0)
+ − {
+ − /*
+ − ** The data pointer is NULL, report the error
+ − */
+ − MFW_BT_TRACE_P1("mfw_bt_dm_security_b > Event : %d, Data Pointer is NULL, but data is expected", event);
+ − }
+ − else
+ − {
+ − /*
+ − ** Post the event and data to the Generic event handler
+ − */
+ − geRetVal = mfw_bt_ge_post_event(MFW_BT_DM_SECURITY, (ULONG)event, (void *)data, dataLen);
+ − }
+ − }
+ − else if (dataLen == 0)
+ − {
+ − /*
+ − ** There is no expected data with the received signal, post the event to the Generic event handler
+ − */
+ − geRetVal = mfw_bt_ge_post_event(MFW_BT_DM_SECURITY, (ULONG)event, (void *)0, 0);
+ − }
+ −
+ − if (geRetVal != MFW_BT_SUCCESS)
+ − {
+ − /*
+ − ** There is an error, but there is nothing that can be done other than to report it.
+ − */
+ − MFW_BT_TRACE_P1("mfw_bt_dm_security_b > Failed to post the event. Error %d", geRetVal);
+ − }
+ −
+ − return;
+ − }
+ −
+ −
+ − /*******************************************************************************
+ −
+ − $Function: mfw_bt_Dm_Search_Cb
+ −
+ − $Description: This is the Device Manager Search Callback function, a pointer to it is passed
+ − to the Bluetooth Module in the BTA DM Search and Discover functions and it is
+ − used to return information from the Bluetooth Module
+ −
+ − $Returns: None
+ −
+ − $Arguments: event : Event Id returned from the Bluetooth Module
+ − data : pointer to the relevant data returned from the Mluetooth Module
+ −
+ − *******************************************************************************/
+ − void mfw_bt_dm_search_cb(T_MFW_BT_DM_SRCH_EVT event, T_MFW_BT_DM_SRCH_SIG_DATA *data)
+ − {
+ − int dataLen;
+ − T_MFW_BT_STATUS geRetVal = MFW_BT_SUCCESS;
+ −
+ − MFW_BT_TRACE("mfw_bt_Dm_Search_Cb");
+ −
+ − /*
+ − ** Set the expected data size according to the received event
+ − */
+ − switch (event)
+ − {
+ − case BTA_DM_INQ_RES_EVT:
+ − dataLen = sizeof(tBTA_DM_INQ_RES);
+ − break;
+ −
+ − case BTA_DM_INQ_CMPL_EVT:
+ − dataLen = sizeof(tBTA_DM_INQ_CMPL);
+ − break;
+ −
+ − case BTA_DM_DISC_RES_EVT:
+ − dataLen = sizeof(tBTA_DM_DISC_RES);
+ − break;
+ −
+ − case BTA_DM_DISC_CMPL_EVT:
+ − dataLen = 0;
+ − break;
+ −
+ − case BTA_DM_SEARCH_CANCEL_CMPL_EVT:
+ − dataLen = 0;
+ − break;
+ −
+ −
+ − default:
+ − /*
+ − ** Unexpected Event, setthe data sized to -1 to exit with no further action
+ − */
+ − MFW_BT_TRACE_P1("mfw_bt_Dm_Search_Cb > Unexpected Event %d", event);
+ − dataLen = -1;
+ −
+ − }
+ −
+ −
+ − if (dataLen > 0)
+ − {
+ − /*
+ − ** Data is expected with the received signal
+ − */
+ − if ((void *)data == (void *)0)
+ − {
+ − /*
+ − ** The data pointer is NULL, report the error
+ − */
+ − MFW_BT_TRACE_P1("mfw_bt_Dm_Search_Cb > Event : %d, Data Pointer is NULL, but data is expected", event);
+ − }
+ − else
+ − {
+ − /*
+ − ** Post the event and data to the Generic event handler
+ − */
+ − geRetVal = mfw_bt_ge_post_event(MFW_BT_DM_SEARCH, (ULONG)event, (void *)data, dataLen);
+ − }
+ − }
+ − else if (dataLen == 0)
+ − {
+ − /*
+ − ** There is no expected data with the received signal, post the event to the Generic event handler
+ − */
+ − geRetVal = mfw_bt_ge_post_event(MFW_BT_DM_SEARCH, (ULONG)event, (void *)0, 0);
+ − }
+ −
+ − if (geRetVal != MFW_BT_SUCCESS)
+ − {
+ − /*
+ − ** There is an error, but there is nothing that can be done other than to report it.
+ − */
+ − MFW_BT_TRACE_P1("mfw_bt_Dm_Search_Cb > Failed to post the event. Error %d", geRetVal);
+ − }
+ −
+ − return;
+ − }
+ −
+ −