comparison src/ui/bmi/mmiSatInfo.c @ 3:67bfe9f274f6

src/ui: import of src/ui3 from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:33:10 +0000
parents
children c0052fe355d3
comparison
equal deleted inserted replaced
2:3a14ee9a9843 3:67bfe9f274f6
1 /*******************************************************************************
2
3 CONDAT (UK)
4
5 ********************************************************************************
6
7 This software product is the property of Condat (UK) Ltd and may not be
8 disclosed to any third party without the express permission of the owner.
9
10 ********************************************************************************
11
12 $Project name: Basic MMI
13 $Project code: BMI
14 $Module: SMS
15 $File: mmiSatInfo.c
16 $Revision: 1.0
17
18 $Author: Condat(UK)
19 $Date: 25/10/00
20
21 ********************************************************************************
22
23 Description:
24
25 Implementation of MMI SIM Application Toolkit (SAT)
26
27 ********************************************************************************
28
29 $History: mmiSatInfo.c
30
31 July 26, 2005 REF: SPR 29520 x0018858
32 Issue: 27.22.4.5 Proactive SIM Command: PLAY TONE fails
33 Solution: The window which used to come up "Please wait" was not getting destroyed.
34 Care has been taken to check this.
35
36 25/10/00 Original Condat(UK) BMI version.
37 21/02/03 removed all calls to function sat_add_unicode_tag_if_needed()
38 $End
39
40 *******************************************************************************/
41
42 #define ENTITY_MFW
43
44 /* includes */
45 #include <string.h>
46 #include <stdio.h>
47 #include <stdlib.h>
48
49 #if defined (NEW_FRAME)
50
51 #include "typedefs.h"
52 #include "vsi.h"
53 #include "pei.h"
54 #include "custom.h"
55 #include "gsm.h"
56
57 #else
58
59 #include "STDDEFS.H"
60 #include "custom.h"
61 #include "gsm.h"
62 #include "vsi.h"
63
64 #endif
65 #include "mfw_sys.h"
66
67 #include "mfw_mfw.h"
68 #include "mfw_win.h"
69 #include "mfw_kbd.h"
70 /* SPR#1428 - SH - New Editor changes */
71 #ifndef NEW_EDITOR
72 #include "mfw_edt.h"
73 #endif
74 #include "mfw_lng.h"
75 #include "mfw_icn.h"
76 #include "mfw_phb.h"
77 #include "mfw_sim.h"
78 #include "mfw_nm.h"
79 #include "mfw_sms.h"
80 #include "mfw_mnu.h"
81 #include "mfw_sat.h"
82 #include "mfw_tim.h"
83
84 #include "dspl.h"
85
86 #include "MmiMmi.h"
87 #include "MmiDummy.h"
88 #include "MmiDialogs.h"
89 #include "MmiLists.h"
90
91 #include "MmiMain.h"
92 #include "MmiStart.h"
93 #include "MmiPins.h"
94 #include "MmiMenu.h"
95 #include "MmiSoftKeys.h"
96 #include "MmiSounds.h"
97 #include "mmiCall.h"
98
99 #include "gdi.h"
100 #include "audio.h"
101 #include "mmiSat_i.h"
102 /* SPR#1428 - SH - New Editor changes */
103 #ifdef NEW_EDITOR
104 #include "ATBCommon.h"
105 #include "ATBDisplay.h"
106 #include "ATBEditor.h"
107 #include "AUIEditor.h"
108 #else
109 #include "MmiEditor.h"
110 #endif
111 #include "cus_aci.h"
112 #include "prim.h"
113 #ifndef PCM_2_FFS
114 #include "pcm.h"
115 #endif
116
117
118 #include "mmiColours.h"
119
120 static int sat_play_tone_tim_cb (T_MFW_EVENT event, T_MFW_TIM *tc);
121 static void sat_info_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);
122
123
124 /*********************************************************************
125 *
126 * SUB WINDOW SAT_PLAY_TONE
127 *
128 *********************************************************************/
129 /*
130 * Tone Definitions
131 */
132 #define SAT_TONE_DIAL 1
133 #define SAT_TONE_CALL_SUB_BUSY 2
134 #define SAT_TONE_CONGESTION 3
135 #define SAT_TONE_RADIO_PATH_ACK 4
136 #define SAT_TONE_RADIO_PATH_NOT 5
137 #define SAT_TONE_ERROR 6
138 #define SAT_TONE_CALL_WAITING 7
139 #define SAT_TONE_RINGING_TONE 8
140 #define SAT_TONE_GENERAL_BEEP 0x10
141 #define SAT_TONE_POSITIV_ACK 0x11
142 #define SAT_TONE_NEGATIV_ACK 0x12
143
144 typedef struct
145 {
146 T_MMI_CONTROL mmi_control;
147 T_MFW_HND parent_win;
148 T_MFW_HND win;
149 T_MFW_HND tim;
150 T_MFW_HND info;
151 T_SAT_CMD *sat_command; /* pointer to sat_command in parent */
152 T_MFW_HND kbd; /* sbh - keyboard handler, so window can be destroyed by user */
153 char *TextString;
154 UBYTE sound_id; /* sound to play */
155 UBYTE device_id; /* device to play sound on */
156 BYTE volume; /* volume to play */
157 } T_sat_play_tone;
158
159 typedef enum {
160 NOT_SUPPORTED,
161 SINGLE_TONE,
162 DURATION
163 } e_TONE_DURATION;
164
165
166 static e_TONE_DURATION sat_set_selected_sound (SatTone tone_tag, T_sat_play_tone * data);
167 static void sat_play_tone_destroy (T_MFW_HND own_window);
168 static void sat_play_tone_exec (T_MFW_HND win, USHORT event, SHORT value, T_SAT_CMD * sat_command);
169 static ULONG sat_calculate_time (UBYTE unit, UBYTE value);
170
171 /*******************************************************************************
172
173 $Function: sat_play_tone_create
174
175 $Description: Creation of an instance for the SAT PLAY TONE dialog. Window must
176 be available after reception of SAT command, only one instance.
177
178 $Returns: window handle
179
180 $Arguments: own_window - window handler
181
182 *******************************************************************************/
183
184 T_MFW_HND sat_play_tone_create (T_MFW_HND parent_window)
185 {
186 T_sat_play_tone * data = (T_sat_play_tone *)ALLOC_MEMORY (sizeof (T_sat_play_tone));
187 T_MFW_WIN * win;
188
189 data->win = win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)sat_win_cb); // c030 rsa
190
191 if (data->win EQ NULL)
192 return NULL;
193
194 /*
195 * Create window handler
196 */
197 data->mmi_control.dialog = (T_DIALOG_FUNC)sat_play_tone_exec;
198 data->mmi_control.data = data;
199 data->parent_win = parent_window;
200 win = ((T_MFW_HDR *)data->win)->data;
201 win->user = (MfwUserDataPtr)data;
202
203 data->kbd = kbdCreate( data->win, KEY_ALL, (T_MFW_CB) sat_kbd_cb); /* sbh - add keyboard handler */
204
205 /*
206 * return window handle
207 */
208 win_show(data->win);
209 return data->win;
210 }
211
212 /*******************************************************************************
213
214 $Function: sat_play_tone_destroy
215
216 $Description: Destroy the sat play tone dialog.
217
218
219 $Returns: none
220
221 $Arguments: own_window - window handler
222
223 *******************************************************************************/
224 static void sat_play_tone_destroy (T_MFW_HND own_window)
225 {
226 T_MFW_WIN * win_data = ((T_MFW_HDR *)own_window)->data;
227 T_sat_play_tone * data = (T_sat_play_tone *)win_data->user;
228
229 if (own_window == NULL)
230 {
231 TRACE_EVENT ("Error : sat_play_tone_destroy called with NULL Pointer");
232 return;
233 }
234
235 if (data)
236 {
237 /*
238 * Delete WIN Handler
239 */
240 win_delete (data->win);
241 /*
242 * Free Memory
243 */
244 sat_destroy_TEXT_ASCIIZ (data->TextString);
245 FREE_MEMORY ((U8 *)data, sizeof (T_sat_play_tone));
246 }
247 }
248
249 /*******************************************************************************
250
251 $Function: sat_play_tone_exec
252
253 $Description: Dialog function for sat_play_tone_exec window.
254
255 $Returns: none
256
257 $Arguments: win - window handler
258 event -window event
259 value - unique id
260 sat_command - Sat Command.
261
262 *******************************************************************************/
263 static void sat_play_tone_exec (T_MFW_HND win, USHORT event, SHORT value, T_SAT_CMD * sat_command)
264 {
265
266 T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
267 T_sat_play_tone * data = (T_sat_play_tone *)win_data->user;
268
269 T_SAT_TXT * txt;
270 ULONG time = 0; /* x0039928 - Lint warning fix */
271 e_TONE_DURATION res;
272 T_SAT_RES sat_res;
273
274 T_DISPLAY_DATA display_info;
275
276 TRACE_FUNCTION ("sat_play_tone_exec()");
277
278 switch (event)
279 {
280 case SAT_PLAY_TONE:
281 TRACE_EVENT("SAT_PLAY_TONE");
282 data->sat_command = sat_command; /* save a pointer to the parameter for later use in callbacks */
283 data->info = NULL; /* NULL means no info running */
284 data->tim = NULL; /* NULL means no timer running */
285
286 /*
287 * --> Select the right Sound ID, if not supported: return
288 */
289
290 res = sat_set_selected_sound(sat_command->c.tone, data);
291
292 switch (res)
293 {
294 case NOT_SUPPORTED:
295 /* sound not supported */
296 TRACE_EVENT("SAT sound not supported");
297 sat_res[SAT_ERR_INDEX] = SAT_RES_IMPOSSIBLE;
298 sat_res[SAT_AI_INDEX] = SatResAiNoCause;
299 sat_done (sat_command, sat_res);
300 sat_play_tone_destroy (data->win);
301 return;
302 case SINGLE_TONE:
303 /* ignore duration for single tones */
304 TRACE_EVENT("SINGLE_TONE");
305 audio_PlaySoundID(data->device_id, data->sound_id , data->volume, AUDIO_PLAY_ONCE);
306 break;
307 case DURATION:
308 TRACE_EVENT("DURATION");
309 time = sat_calculate_time (sat_command->c.tone.durUnit, sat_command->c.tone.durValue);
310 if (time EQ 0)
311 {
312 /* use default tone duration */
313 audio_PlaySoundID(data->device_id, data->sound_id , data->volume, AUDIO_PLAY_ONCE);
314 res = SINGLE_TONE; /* overruled by default */
315 }
316 else
317 {
318 /* to be stopped by timer */
319 data->tim = tim_create (win, time, (T_MFW_CB)sat_play_tone_tim_cb);
320 tim_start (data->tim);
321 audio_PlaySoundID(data->device_id, data->sound_id , data->volume, AUDIO_PLAY_INFINITE);
322 }
323 break;
324 }
325
326 /*
327 * --> display alpha identifier (if any)
328 */
329 txt = &sat_command->c.tone.alpha;
330
331 /*SPR#2340 - DS - Handle cases where no alpha id and/or duration is present */
332
333 if (txt->len > 0) /* alpha id supplied in command */
334 {
335 int timer=0;
336
337 if (time EQ 0) /* no duration supplied, destroy info_dialog after timeout */
338 timer = TEN_SECS;
339 else /* duration supplied, info_dialog destroyed when audio timer expires */
340 timer = FOREVER;
341
342 data->TextString = sat_create_TEXT_ASCIIZ (txt);
343
344 //July 26, 2005 REF: SPR 29520 x0018858
345 //Function call modified to pass the string as a differant argument(initially 4th arg but now as the 5th arg).
346 dlg_initDisplayData_TextStr( &display_info, TxtNull, TxtCancel, NULL, data->TextString, COLOUR_STATUS);
347
348 dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)sat_info_cb, timer, KEY_LEFT | KEY_RIGHT | KEY_HUP);
349 display_info.Identifier = event;
350 //July 26, 2005 REF: SPR 29520 x0018858
351 //wrapping enabled for the display.
352 display_info.WrapStrings=WRAP_STRING_2;
353
354 /*
355 * Call Info Screen
356 */
357 data->info = info_dialog (win, &display_info);
358 /* destroy when dialog times out */
359 display_info.TextString = data->TextString;
360 }
361 else if (txt->text EQ 0 && res NEQ SINGLE_TONE)
362 {
363 /* no alpha id supplied - show default text */
364 int timer=0;
365
366 if (time EQ 0) /* no duration supplied, destroy info_dialog after timeout */
367 timer = TEN_SECS;
368 else /* duration supplied, info_dialog destroyed when audio timer expires */
369 timer = FOREVER;
370
371 data->TextString = sat_create_TEXT_ASCIIZ (txt);
372 dlg_initDisplayData_TextStr( &display_info, TxtNull, TxtCancel, "Playing tone", NULL, COLOUR_STATUS);
373 dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)sat_info_cb, timer, KEY_LEFT | KEY_RIGHT | KEY_HUP);
374 display_info.Identifier = event;
375 /*
376 * Call Info Screen
377 */
378 data->info = info_dialog (win, &display_info);
379 /* destroy when dialog times out */
380 display_info.TextString = data->TextString;
381 }
382 else if (res EQ SINGLE_TONE)
383 {
384 /* destroy immediately, if SINGLE_TONE and no info */
385 sat_res[SAT_ERR_INDEX] = SatResSuccess;
386 sat_res[SAT_AI_INDEX] = SatResAiNoCause;
387 sat_done (sat_command, sat_res);
388 sat_play_tone_destroy (win);
389 }
390 break;
391
392 /* sbh - all window types are being provided with this event to destroy the window */
393 case SAT_DESTROY_WINDOW:
394 TRACE_EVENT("SAT_DESTROY_WINDOW");
395 sat_play_tone_destroy (win);
396 break;
397 /* ...sbh */
398
399 default:
400 TRACE_EVENT ("sat_play_tone_exec() unexpected event");
401 break;
402 }
403 }
404
405 /*******************************************************************************
406
407 $Function: sat_play_tone_tim_cb
408
409 $Description: Callback function for the play tone timer.
410
411 $Returns: Execution status
412
413 $Arguments: event -window event
414 tc - timer info
415
416 *******************************************************************************/
417
418 static int sat_play_tone_tim_cb (T_MFW_EVENT event, T_MFW_TIM *tc)
419 {
420 T_MFW_HND win = mfw_parent (mfw_header());
421 T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
422 T_sat_play_tone * data = (T_sat_play_tone *)win_data->user;
423 T_SAT_RES sat_res;
424
425 if ((win EQ NULL) || (win_data EQ NULL) || (data EQ NULL))
426 return MFW_EVENT_CONSUMED; /* we have been interrupted by user action */
427
428 TRACE_FUNCTION("sat_play_tone_tim_cb()");
429
430 /* timer elapsed */
431
432 sat_res[SAT_ERR_INDEX] = SatResSuccess;
433 sat_res[SAT_AI_INDEX] = SatResAiNoCause;
434 sat_done (data->sat_command, sat_res);
435 data->sat_command = NULL; /* signal response issued to info */
436
437 /* the last one has to destroy the window */
438 data->tim = NULL; /* signal end of timer to info */
439
440 /* API/DSM - 04/09/03 - SPR2491 - Add a call to stop the play of the continuous AUDIO sound*/
441 audio_StopSoundbyID(data->device_id, data->sound_id);
442 /* API/DSM - 04/09/03 - SPR2491 - END */
443
444
445 /* SPR#2340 - DS - If timer has expired, destroy info_dialog if necessary */
446 if (data->info NEQ NULL)
447 {
448 /* timer has expired therefore destroy info dialog */
449 TRACE_EVENT("Destroy Play Tone dialog and data");
450 // July 26, 2005 REF: SPR 29520 x0018858
451 //The wndow displaying "Please wait was not getting destroyed.
452 //Destroyed the window and initialized to NULL.
453 //Begin 29520
454 //sat_play_tone_destroy(data->info);
455 dialog_info_destroy(data->info);
456 data->info = NULL;
457 //End 29520
458 }
459
460 if (data->info EQ NULL)
461 {
462 /* no info window or info window timed out: we are the last */
463 TRACE_EVENT("Destroy Play Tone win and data");
464 sat_play_tone_destroy (win);
465 }
466 return MFW_EVENT_CONSUMED;
467 }
468
469 /*******************************************************************************
470
471 $Function: sat_calculate_time
472
473 $Description: Calculate timeout value
474
475 $Returns: time out in ms
476
477 $Arguments: unit - number of units
478 value - unit value.
479
480 *******************************************************************************/
481 static ULONG sat_calculate_time (UBYTE unit, UBYTE value)
482 {
483 ULONG result = (ULONG)value;
484
485 TRACE_FUNCTION("sat_calculate_time()");
486
487 switch (unit)
488 {
489 case 0: // Minutes
490 result = result * 60 * 1000;
491 break;
492 case 1: // Seconds
493 result = result * 1000;
494 break;
495 case 2: // tenth of seconds
496 result = result * 100;
497 break;
498 }
499 TRACE_EVENT_P3("unit %d, value %d = result %d ms", unit, value, result);
500 return result;
501 }
502
503 /*******************************************************************************
504
505 $Function: sat_set_selected_sound
506
507 $Description: Choose the Sound IDīs, return appropriate duration and support info
508
509 $Returns: time out
510
511 $Arguments: tone_tag - tone name
512 data - tone info
513
514 *******************************************************************************/
515
516
517 static e_TONE_DURATION sat_set_selected_sound (SatTone tone_tag, T_sat_play_tone * data)
518
519 {
520 e_TONE_DURATION ret;
521
522 TRACE_FUNCTION("sat_set_selected_sound()");
523
524 /* SPR#2340 - DS - Removed code that set ret to NOT_SUPPORTED if durUnit equals zero (i.e. Minutes) */
525
526 /* SPR#2340 - DS - Corrected sound Ids. Use defns rather than magic no.s */
527
528 switch(tone_tag.tone)
529 {
530 case SAT_TONE_CALL_SUB_BUSY:
531 data->sound_id = TONES_BUSY /*17*/;
532 break;
533 case SAT_TONE_CONGESTION:
534 data->sound_id = TONES_CONGEST /*18*/;
535 break;
536 case SAT_TONE_RADIO_PATH_ACK:
537 case SAT_TONE_GENERAL_BEEP:
538 data->sound_id = TONES_ACK /*20*/;
539 break;
540 case SAT_TONE_RADIO_PATH_NOT:
541 data->sound_id = TONES_DROPPED /*19 - also call dropped*/;
542 break;
543 case SAT_TONE_DIAL:
544 case SAT_TONE_CALL_WAITING:
545 data->sound_id = TONES_CW /*21*/;
546 break;
547 case SAT_TONE_POSITIV_ACK:
548 case SAT_TONE_RINGING_TONE:
549 data->sound_id = TONES_RINGING_TONE /*0x27*/;
550 break;
551 case SAT_TONE_ERROR:
552 case SAT_TONE_NEGATIV_ACK:
553 data->sound_id = TONES_ERROR /*16*/;
554 break;
555 default:
556 /* Unknown tone value - default is 'general beep' */
557 data->sound_id = TONES_KEYBEEP /*0x26*/;
558 break;
559 }
560
561 ret = DURATION;
562
563 TRACE_EVENT_P2("tone %d, sound_id %x", tone_tag.tone, data->sound_id);
564
565 return ret;
566 }
567
568 /*******************************************************************************
569
570 $Function: sat_info_cb
571
572 $Description: Callback function information dialog.
573
574 $Returns: none
575
576 $Arguments: win - window
577 identifier - unique id
578 reason - event
579
580 *******************************************************************************/
581
582 static void sat_info_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason)
583 {
584 /* PLAY TONE */
585 T_MFW_WIN * play_win_data = ((T_MFW_HDR *)win)->data;
586 T_sat_play_tone * play_data = (T_sat_play_tone *)play_win_data->user;
587 T_SAT_RES sat_res;
588
589 if (win EQ NULL)
590 return;
591
592 TRACE_FUNCTION("sat_info_cb()");
593
594 TRACE_EVENT_P2("identifier %d, reason %d", identifier, reason);
595
596 /*
597 * Who has initiated the information screen
598 */
599 switch (identifier)
600 {
601 case SAT_PLAY_TONE:
602 if ((play_win_data EQ NULL) || (play_data EQ NULL))
603 return; /* we have been interrupted by sat_play_tone_tim_cb() */
604
605 switch (reason)
606 {
607 case INFO_TIMEOUT:
608 if (play_data->tim NEQ NULL)
609 {
610 /* NOP on short info timeout && infinite:
611 * tone will be stopped and SUCCESS will be signalled by sat_play_tone_tim_cb()
612 */
613 play_data->info = NULL; /* signal the end of info to timer */
614 }
615 else
616 {
617 /* no timer (single tone) or timer timed out: we are the last */
618 if (play_data->sat_command NEQ NULL)
619 {
620 /* response not yet issued, i.e single tone with info */
621 sat_res[SAT_ERR_INDEX] = SatResSuccess;
622 sat_res[SAT_AI_INDEX] = SatResAiNoCause;
623 sat_done (play_data->sat_command, sat_res);
624 }
625
626 /* the last one has to destroy the window */
627 sat_play_tone_destroy (win);
628 }
629 break;
630 case INFO_KCD_LEFT:
631 case INFO_KCD_RIGHT:
632 case INFO_KCD_HUP: /*SPR#2340 - DS - Handle hangup keypress */
633 if (play_data->tim NEQ NULL)
634 {
635 /* timer has not yet elapsed, stop it */
636 tim_stop (play_data->tim);
637 }
638
639 /* API/DSM - 04/09/03 - SPR2491 - Add a call to stop the play of the continuous AUDIO sound*/
640 audio_StopSoundbyID(play_data->device_id, play_data->sound_id);
641 /* API/DSM - 04/09/03 - SPR2491 - END */
642
643 if (play_data->sat_command NEQ NULL)
644 {
645 /* response not yet issued */
646 sat_res[SAT_ERR_INDEX] = SAT_RES_USER_ABORT;
647 sat_res[SAT_AI_INDEX] = SatResAiNoCause;
648 sat_done (play_data->sat_command, sat_res);
649 }
650 sat_play_tone_destroy (win);
651 break;
652 }
653 break;
654
655 default:
656 TRACE_EVENT("sat_info_cb(): unexp. event");
657 break;
658 }
659 }