comparison 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
comparison
equal deleted inserted replaced
419:59143cd42ec7 420:e8ddbb0837ed
1 /* =========================================================
2 * Texas Instruments OMAP(TM) Platform Software
3 * (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
4 *
5 * Use of this software is controlled by the terms and conditions found
6 * in the license agreement under which this software has been supplied.
7 * ========================================================== */
8 /*
9 $Project name: Basic Bluetooth MMI
10 $Project code:
11 $Module: Bluetooth BMG MFW
12 $File: Mfw_Btips.c
13 $Revision: 1.0
14 $Author: Texas Instruments
15 $Date: 26/06/07
16
17 ********************************************************************************
18
19 Description:
20
21 This module provides the BTIPS BMG APPlication functionality.
22
23 ********************************************************************************
24 $History: Mfw_Btips.c
25
26 26/06/07 Sasken original version
27
28 $End
29
30 *******************************************************************************/
31
32
33
34
35 /*******************************************************************************
36
37 Include files
38
39 *******************************************************************************/
40
41 #define ENTITY_MFW
42 /* includes */
43
44 #include <string.h>
45
46 #if defined (NEW_FRAME)
47
48 #include "typedefs.h"
49 #include "vsi.h"
50 #include "pei.h"
51 #include "custom.h"
52 #include "gsm.h"
53 #include "prim.h"
54
55 #else
56
57 #include "STDDEFS.H"
58 #include "custom.h"
59 #include "gsm.h"
60 #include "vsi.h"
61
62 #endif
63
64 #ifdef FF_MMI_BTIPS_APP
65
66 #include "osapi.h"
67
68 /* GPF Includes */
69 #include "typedefs.h"
70 #include "vsi.h"
71 //#include "../p_btt.h"
72
73 #if BT_STACK == XA_ENABLED
74 #include <me.h>
75 #include <bttypes.h>
76 #include <sec.h>
77 #endif
78
79 #include "btl_common.h"
80 #include "btl_bmg.h"
81 #include "debug.h"
82
83 #include "bthal_fs.h"
84 #include "mfw_mfw.h"
85 #include "mfw_win.h"
86 #include "mfw_icn.h" /* included for mfw_mnu.h */
87 #include "mfw_mnu.h"
88 #include "mfw_tim.h"
89 #include "mfw_kbd.h"
90 #include "mfw_sat.h" /* included for MmiDummy.h, included for MmiMenu.h */
91
92 /* BTL inclides */
93 #include "hfg.h"
94 #include "btl_vg.h"
95 #include "btl_vgi.h"
96 #include "Mfw_Btips.h"
97 #include "Mfw_BtipsBmg.h"
98 #include "mfw_BtipsVg.h"
99
100 static void btips_vgCallback(const BtlVgEvent *event);
101
102 static const BtSecurityLevel noSecurity = BSL_NO_SECURITY;
103 static const BtlVgAudioSourcesAction noActions = {0};
104 static AtAgFeatures features = HFG_FEATURE_REJECT | HFG_FEATURE_RING_TONE;
105
106 static BOOL closingVoiceGateway = FALSE;
107
108 static BtlVgChannelId mfwBtipsVgChannelId = BTL_VG_CHANNEL_ID_NONE;
109 static BtlVgContext *mfwBtipsVgContext =0;
110 static int audio_on_hands_free = 0;
111
112 /*---------------------------------------------------------------------------
113 * mfw_btips_vgInit
114 *---------------------------------------------------------------------------
115 *
116 * Synopsis: VG application initialization.
117 *
118 * Return: NONE.
119 *
120 */
121
122 void mfw_btips_vgInit ( )
123 {
124 if (BT_STATUS_SUCCESS != BTL_VG_Create(0, btips_vgCallback, &noSecurity, &mfwBtipsVgContext))
125 {
126 TRACE_FUNCTION("BTL_VG_Create failed");
127 }
128
129 if (BT_STATUS_PENDING != BTL_VG_Enable(mfwBtipsVgContext, 0, &features, &noActions))
130 {
131 TRACE_FUNCTION("BTL_VG_Enable failed");
132 }
133 }
134
135 BOOL mfw_btips_vgGetConnectedDevice (BD_ADDR *bdAddr, U8 *name)
136 {
137 BtStatus status;
138
139 TRACE_FUNCTION("mfw_btips_vgGetConnectedDevice");
140
141 status = BTL_VG_GetConnectedDevice (mfwBtipsVgContext, mfwBtipsVgChannelId, bdAddr);
142
143 if (status == BT_STATUS_SUCCESS)
144 {
145 mfw_btips_bmgGetDeviceName (bdAddr, name);
146 return TRUE;
147 }
148 return FALSE;
149 }
150
151 BOOL mfw_btips_vgIsDeviceConnected (BD_ADDR bdAddr)
152 {
153 BtRemDevState state;
154
155 TRACE_FUNCTION("mfw_btips_vgIsDeviceConnected");
156
157 if (mfwBtipsVgChannelId != BTL_VG_CHANNEL_ID_NONE)
158 {
159 #if 0
160 BD_ADDR connectedDev;
161 BTL_VG_GetConnectedDevice (mfwBtipsVgContext, mfwBtipsVgChannelId, &connectedDev)
162 #endif
163 mfw_btips_bmgGetDeviceState (&bdAddr, &state);
164 if (state == BDS_CONNECTED)
165 {
166 return TRUE;
167 }
168 }
169 return FALSE;
170
171 }
172
173 BOOL mfw_btips_vgConnect (BD_ADDR bdAddr)
174 {
175 BtStatus btStatus;
176
177 TRACE_FUNCTION("mfw_btips_vgConnect");
178
179 btStatus = BTL_VG_Connect (mfwBtipsVgContext, &bdAddr, BTL_VG_AUDIO_SOURCE_MODEM);
180
181 if (BT_STATUS_IN_USE == btStatus)
182 {
183 TRACE_FUNCTION("VG APP: An SLC to a remote device already exists");
184 TRACE_FUNCTION("VG APP: Disconnect or perform handover to connect to a new device");
185 }
186 return mfw_btips_checkStatus(btStatus);
187 }
188
189 BOOL mfw_btips_vgDisconnect (BD_ADDR bdAddr)
190 {
191 BtStatus btStatus;
192
193 TRACE_FUNCTION("mfw_btips_vgDisconnect");
194
195 btStatus = BTL_VG_Disconnect (mfwBtipsVgContext, mfwBtipsVgChannelId);
196 return mfw_btips_checkStatus(btStatus);
197 }
198
199 BOOL mfw_btips_vgTransferAudioToPhone (void)
200 {
201 BtStatus btStatus;
202
203 TRACE_FUNCTION("mfw_btips_vgTransferAudioToPhone");
204
205 if ((mfwBtipsVgChannelId != BTL_VG_CHANNEL_ID_NONE) && (audio_on_hands_free == 1))
206 {
207 btStatus = BTL_VG_DisconnectAudio (mfwBtipsVgContext, mfwBtipsVgChannelId);
208 }
209 return mfw_btips_checkStatus(btStatus);
210 }
211
212 BOOL mfw_btips_vgTransferAudioToHF (void)
213 {
214 BtStatus btStatus;
215
216 TRACE_FUNCTION_P1("mfw_btips_vgTransferAudioToHF audio_on_hands_free=%d", audio_on_hands_free);
217
218 if ((mfwBtipsVgChannelId != BTL_VG_CHANNEL_ID_NONE) && (audio_on_hands_free == 0))
219 {
220 btStatus = BTL_VG_ConnectAudio (mfwBtipsVgContext, mfwBtipsVgChannelId);
221 }
222 return mfw_btips_checkStatus(btStatus);
223 }
224
225 BOOL mfw_btips_vgIsAudioOnPhone (void)
226 {
227
228 TRACE_FUNCTION("mfw_btips_vgIsAudioOnPhone");
229 if (audio_on_hands_free == 0)
230 {
231 return TRUE;
232 }
233 else if (mfwBtipsVgChannelId != BTL_VG_CHANNEL_ID_NONE)
234 {
235 return FALSE;
236 }
237 else
238 {
239 return TRUE;
240 }
241 }
242
243 BOOL mfw_btips_vgIsAudioOnHF (void)
244 {
245 if (audio_on_hands_free == 1)
246 {
247 return TRUE;
248 }
249 else if (mfwBtipsVgChannelId != BTL_VG_CHANNEL_ID_NONE)
250 {
251 return FALSE;
252 }
253 else
254 {
255 return TRUE;
256 }
257 }
258
259 BOOL mfw_btips_vgIsHandOverPossible (void)
260 {
261 if (audio_on_hands_free == 1)
262 {
263 return TRUE;
264 }
265 else
266 {
267 return FALSE;
268 }
269 }
270
271 void btips_vgCallback(const BtlVgEvent *event)
272 {
273 T_BTIPS_MMI_IND btips_mmi_ind;
274 BtStatus status;
275 char str[MFW_VG_APP_AT_STR_LEN];
276 U16 strLen;
277 U16 scoHandle = 0;
278
279 TRACE_FUNCTION_P1("btips_vgCallback %d", event->type);
280
281 btips_mmi_ind.mfwBtipsEventType = MFW_BTIPS_VG_EVENT;
282
283 switch (event->type)
284 {
285 case BTL_VG_EVENT_SLC_REQUEST:
286 TRACE_EVENT("VG APP: SLC request from device:");
287 break;
288
289 case BTL_VG_EVENT_ADDITIONAL_SERVICE_CONNECT_REQ:
290 TRACE_EVENT("VG APP: Addtional SLC request received from device:");
291 break;
292
293 case BTL_VG_EVENT_SLC_CONNECTED:
294 mfwBtipsVgChannelId = event->channelId;
295 TRACE_EVENT("VG APP: Connection established");
296 /* turn off inband ring tone */
297 if (BT_STATUS_SUCCESS != BTL_VG_EnableInbandRingTone(mfwBtipsVgContext, event->channelId, FALSE))
298 {
299 TRACE_EVENT("VG_APP: Error disabling inband ring tone after SLC established");
300 }
301 btips_mmi_ind.data.vgBtEvent.event = MFW_BTIPS_VG_CONNECT_EVENT;
302
303 status = BTL_VG_GetConnectedDevice (mfwBtipsVgContext, event->channelId,
304 &(btips_mmi_ind.data.vgBtEvent.bdAddr));
305 if (status == BT_STATUS_SUCCESS)
306 {
307 mfw_btips_bmgGetDeviceName (&(btips_mmi_ind.data.vgBtEvent.bdAddr),
308 btips_mmi_ind.data.vgBtEvent.deviceName);
309
310 btipsNotifyMFW (&btips_mmi_ind);
311 }
312
313 break;
314
315 case BTL_VG_EVENT_SLC_DISCONNECTED:
316 mfwBtipsVgChannelId = BTL_VG_CHANNEL_ID_NONE;
317 TRACE_EVENT("VG APP: Connection lost");
318 btips_mmi_ind.data.vgBtEvent.event = MFW_BTIPS_VG_DISCONNECT_EVENT;
319 #ifdef FF_MMI_FMRADIO_APP
320 if(mfw_fmRadio_isFmOverBT())
321 {
322 /*Inform FM module of the SLC disconnection*/
323 mfw_fmRadio_listenViaBT(FALSE);
324 mfw_fmRadio_setFmOverBT(FALSE, 0);
325 }
326 #endif
327
328 btipsNotifyMFW (&btips_mmi_ind);
329
330 break;
331
332 case BTL_VG_EVENT_HANDOVER_COMPLETED:
333 mfwBtipsVgChannelId = event->channelId;
334 TRACE_EVENT("VG APP: Handover completed");
335 break;
336
337 case BTL_VG_EVENT_AUDIO_CONNECTED:
338 {
339 HfgChannel *handsfreeChannel;
340 BtlVgChannel *vgChannel;
341 CmgrHandler cmgrHandler;
342 scoHandle = 0x101;
343 btips_mmi_ind.data.vgBtEvent.event = MFW_BTIPS_VG_AUDIO_CONNECT_EVENT;
344 #if 0
345 vgChannel = &(event->context->channels[event->channelId]);
346 handsfreeChannel = &(vgChannel->c.handsfreeChannel);
347 cmgrHandler = handsfreeChannel->cmgrHandler;
348 scoHandle = cmgrHandler.scoConnect->scoHciHandle;
349
350 TRACE_EVENT_P1("VG APP: Audio connection established, scoHandle = %x", scoHandle);
351 #endif
352 audio_on_hands_free = 1;
353
354 #ifdef FF_MMI_FMRADIO_APP
355 if(mfw_fmRadio_isFmOverBT())
356 {
357 /*Send VS commands to BRF for routing FM audio to BT headset*/
358 mfw_fmRadio_setFmOverBT(TRUE, scoHandle);
359 }
360 #endif
361 btipsNotifyMFW (&btips_mmi_ind);
362
363 } break;
364
365 case BTL_VG_EVENT_AUDIO_DISCONNECTED:
366 TRACE_EVENT("VG APP: Audio conenction lost");
367 btips_mmi_ind.data.vgBtEvent.event = MFW_BTIPS_VG_AUDIO_DISCONNECT_EVENT;
368
369 audio_on_hands_free = 0;
370 #ifdef FF_MMI_FMRADIO_APP
371 if(mfw_fmRadio_isFmOverBT())
372 {
373 /*Inform FM module of the SLC disconnection*/
374 mfw_fmRadio_listenViaBT(FALSE);
375 mfw_fmRadio_setFmOverBT(FALSE, 0);
376 }
377 #endif
378
379 btipsNotifyMFW (&btips_mmi_ind);
380
381 break;
382
383 case BTL_VG_EVENT_PHONE_NUMBER_REQUESTED:
384 TRACE_EVENT("VG APP: unsupported event: BTL_VG_EVENT_PHONE_NUMBER_REQUESTED");
385 break;
386
387 case BTL_VG_EVENT_MICROPHONE_VOLUME:
388 TRACE_EVENT_P1("VG APP: microphone volume: %u", event->p.volume);
389 break;
390
391 case BTL_VG_EVENT_SPEAKER_VOLUME:
392 TRACE_EVENT_P1("VG APP: speaker volume: %u", event->p.volume);
393 break;
394
395 case BTL_VG_EVENT_VOICE_RECOGNITION_STATUS:
396 TRACE_EVENT_P1("VG APP: voice recognition is :%s", (event->p.enabled ? "enabled" : "disabled"));
397 break;
398
399 #if HFG_FEATURE_RING_TONE & HFG_SDK_FEATURES
400
401 case BTL_VG_EVENT_INBAND_RING_STATUS:
402 TRACE_EVENT_P1("VG APP: inband ringing is: %s", (event->p.enabled ? "enabled" : "disabled"));
403 break;
404 #endif
405
406 case BTL_VG_EVENT_UNRECOGNIZED_AT_COMMAND:
407 strLen = event->p.atCommand->commandLength;
408 if (strLen > MFW_VG_APP_AT_STR_LEN )
409 {
410 TRACE_EVENT("VG APP: AT Command string is too long");
411 strLen = MFW_VG_APP_AT_STR_LEN - 1;
412 }
413 OS_MemCopy((U8*)str, (const U8*) event->p.atCommand->atCommand, strLen);
414 str[strLen] = '\0';
415 TRACE_EVENT_P1("VG APP: unrecognized AT command: %s", str);
416 if (BT_STATUS_SUCCESS != BTL_VG_SentAtError(event->context, event->channelId, ATCME_OP_NOT_SUPPORTED))
417 {
418 TRACE_EVENT("VG APP: BTL_VG_SentAtError failed");
419 }
420 break;
421
422 case BTL_VG_EVENT_VG_CONTEXT_ENABLED:
423 TRACE_EVENT("VG APP: VG is enabled");
424 break;
425
426 case BTL_VG_EVENT_VG_CONTEXT_DISABLED:
427 TRACE_EVENT("VG APP: VG is disabled");
428 if (TRUE == closingVoiceGateway)
429 {
430 BtStatus status;
431
432 status = BTL_VG_Destroy(&mfwBtipsVgContext);
433 TRACE_EVENT_P1("BTL_VG_Destroy returned: %s", pBT_Status(status));
434 closingVoiceGateway = FALSE;
435 }
436 break;
437
438 default:
439 TRACE_EVENT_P1("VG APP: Unexpected VG event: %u", event->type);
440 break;
441 }
442
443 }
444 void mfw_btips_vgCallback (T_BTIPS_MMI_IND * mmiInd)
445 {
446 MfwBtVgEvent vgBtEvent = mmiInd->data.vgBtEvent;
447
448 TRACE_FUNCTION_P1("mfw_btips_vgCallback: Event %d", vgBtEvent.event);
449
450 switch (vgBtEvent.event)
451 {
452 case MFW_BTIPS_VG_CONNECT_EVENT:
453 #ifdef FF_MMI_FMRADIO_APP
454 if(mfw_fmRadio_isFmOverBT())
455 {
456 /*Automatically create the SCO for FM Radio routing
457 In this case Modem Audio will not be routed to the MSCI port, hence
458 all GSM calls will be answered on the Phone Handset ONLY*/
459 mfw_btips_vgTransferAudioToHF();
460 }
461 #endif
462 mfw_btips_signal(E_BTIPS_VG_CONNECT_EVENT, mmiInd);
463 break;
464
465 case MFW_BTIPS_VG_DISCONNECT_EVENT:
466 mfw_btips_signal(E_BTIPS_VG_DISCONNECT_EVENT, mmiInd);
467 break;
468
469 case MFW_BTIPS_VG_AUDIO_CONNECT_EVENT:
470 mfw_btips_signal(E_BTIPS_VG_AUDIO_CONNECT_EVENT, mmiInd);
471 break;
472
473 case MFW_BTIPS_VG_AUDIO_DISCONNECT_EVENT:
474 mfw_btips_signal(E_BTIPS_VG_AUDIO_DISCONNECT_EVENT, mmiInd);
475 break;
476 }
477 }
478
479 #endif
480