FreeCalypso > hg > fc-magnetite
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 |