FreeCalypso > hg > tcs211-fcmodem
diff g23m/condat/ms/src/bmi/mmiSatInfo.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/g23m/condat/ms/src/bmi/mmiSatInfo.c Mon Jun 01 03:24:05 2015 +0000 @@ -0,0 +1,659 @@ +/******************************************************************************* + + CONDAT (UK) + +******************************************************************************** + + This software product is the property of Condat (UK) Ltd and may not be + disclosed to any third party without the express permission of the owner. + +******************************************************************************** + + $Project name: Basic MMI + $Project code: BMI + $Module: SMS + $File: mmiSatInfo.c + $Revision: 1.0 + + $Author: Condat(UK) + $Date: 25/10/00 + +******************************************************************************** + + Description: + + Implementation of MMI SIM Application Toolkit (SAT) + +******************************************************************************** + + $History: mmiSatInfo.c + + July 26, 2005 REF: SPR 29520 x0018858 + Issue: 27.22.4.5 Proactive SIM Command: PLAY TONE fails + Solution: The window which used to come up "Please wait" was not getting destroyed. + Care has been taken to check this. + + 25/10/00 Original Condat(UK) BMI version. + 21/02/03 removed all calls to function sat_add_unicode_tag_if_needed() + $End + +*******************************************************************************/ + +#define ENTITY_MFW + +/* includes */ +#include <string.h> +#include <stdio.h> +#include <stdlib.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 "mfw_sys.h" + +#include "mfw_mfw.h" +#include "mfw_win.h" +#include "mfw_kbd.h" +/* SPR#1428 - SH - New Editor changes */ +#ifndef NEW_EDITOR +#include "mfw_edt.h" +#endif +#include "mfw_lng.h" +#include "mfw_icn.h" +#include "mfw_phb.h" +#include "mfw_sim.h" +#include "mfw_nm.h" +#include "mfw_sms.h" +#include "mfw_mnu.h" +#include "mfw_sat.h" +#include "mfw_tim.h" + +#include "dspl.h" + +#include "MmiMmi.h" +#include "MmiDummy.h" +#include "MmiDialogs.h" +#include "MmiLists.h" + +#include "MmiMain.h" +#include "MmiStart.h" +#include "MmiPins.h" +#include "MmiMenu.h" +#include "MmiSoftKeys.h" +#include "MmiSounds.h" +#include "mmiCall.h" + +#include "gdi.h" +#include "audio.h" +#include "mmiSat_i.h" +/* SPR#1428 - SH - New Editor changes */ +#ifdef NEW_EDITOR +#include "ATBCommon.h" +#include "ATBDisplay.h" +#include "ATBEditor.h" +#include "AUIEditor.h" +#else +#include "MmiEditor.h" +#endif +#include "cus_aci.h" +#include "prim.h" +#ifndef PCM_2_FFS +#include "pcm.h" +#endif + + +#include "mmiColours.h" + +static int sat_play_tone_tim_cb (T_MFW_EVENT event, T_MFW_TIM *tc); +static void sat_info_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason); + + +/********************************************************************* + * + * SUB WINDOW SAT_PLAY_TONE + * + *********************************************************************/ +/* + * Tone Definitions + */ +#define SAT_TONE_DIAL 1 +#define SAT_TONE_CALL_SUB_BUSY 2 +#define SAT_TONE_CONGESTION 3 +#define SAT_TONE_RADIO_PATH_ACK 4 +#define SAT_TONE_RADIO_PATH_NOT 5 +#define SAT_TONE_ERROR 6 +#define SAT_TONE_CALL_WAITING 7 +#define SAT_TONE_RINGING_TONE 8 +#define SAT_TONE_GENERAL_BEEP 0x10 +#define SAT_TONE_POSITIV_ACK 0x11 +#define SAT_TONE_NEGATIV_ACK 0x12 + +typedef struct +{ + T_MMI_CONTROL mmi_control; + T_MFW_HND parent_win; + T_MFW_HND win; + T_MFW_HND tim; + T_MFW_HND info; + T_SAT_CMD *sat_command; /* pointer to sat_command in parent */ + T_MFW_HND kbd; /* sbh - keyboard handler, so window can be destroyed by user */ + char *TextString; + UBYTE sound_id; /* sound to play */ + UBYTE device_id; /* device to play sound on */ + BYTE volume; /* volume to play */ +} T_sat_play_tone; + +typedef enum { + NOT_SUPPORTED, + SINGLE_TONE, + DURATION +} e_TONE_DURATION; + + +static e_TONE_DURATION sat_set_selected_sound (SatTone tone_tag, T_sat_play_tone * data); +static void sat_play_tone_destroy (T_MFW_HND own_window); +static void sat_play_tone_exec (T_MFW_HND win, USHORT event, SHORT value, T_SAT_CMD * sat_command); +static ULONG sat_calculate_time (UBYTE unit, UBYTE value); + +/******************************************************************************* + + $Function: sat_play_tone_create + + $Description: Creation of an instance for the SAT PLAY TONE dialog. Window must + be available after reception of SAT command, only one instance. + + $Returns: window handle + + $Arguments: own_window - window handler + +*******************************************************************************/ + +T_MFW_HND sat_play_tone_create (T_MFW_HND parent_window) +{ + T_sat_play_tone * data = (T_sat_play_tone *)ALLOC_MEMORY (sizeof (T_sat_play_tone)); + T_MFW_WIN * win; + + data->win = win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)sat_win_cb); // c030 rsa + + if (data->win EQ NULL) + return NULL; + + /* + * Create window handler + */ + data->mmi_control.dialog = (T_DIALOG_FUNC)sat_play_tone_exec; + data->mmi_control.data = data; + data->parent_win = parent_window; + win = ((T_MFW_HDR *)data->win)->data; + win->user = (MfwUserDataPtr)data; + + data->kbd = kbdCreate( data->win, KEY_ALL, (T_MFW_CB) sat_kbd_cb); /* sbh - add keyboard handler */ + + /* + * return window handle + */ + win_show(data->win); + return data->win; +} + +/******************************************************************************* + + $Function: sat_play_tone_destroy + + $Description: Destroy the sat play tone dialog. + + + $Returns: none + + $Arguments: own_window - window handler + +*******************************************************************************/ +static void sat_play_tone_destroy (T_MFW_HND own_window) +{ + T_MFW_WIN * win_data = ((T_MFW_HDR *)own_window)->data; + T_sat_play_tone * data = (T_sat_play_tone *)win_data->user; + + if (own_window == NULL) + { + TRACE_EVENT ("Error : sat_play_tone_destroy called with NULL Pointer"); + return; + } + + if (data) + { + /* + * Delete WIN Handler + */ + win_delete (data->win); + /* + * Free Memory + */ + sat_destroy_TEXT_ASCIIZ (data->TextString); + FREE_MEMORY ((U8 *)data, sizeof (T_sat_play_tone)); + } +} + +/******************************************************************************* + + $Function: sat_play_tone_exec + + $Description: Dialog function for sat_play_tone_exec window. + + $Returns: none + + $Arguments: win - window handler + event -window event + value - unique id + sat_command - Sat Command. + +*******************************************************************************/ +static void sat_play_tone_exec (T_MFW_HND win, USHORT event, SHORT value, T_SAT_CMD * sat_command) +{ + + T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; + T_sat_play_tone * data = (T_sat_play_tone *)win_data->user; + + T_SAT_TXT * txt; + ULONG time; + e_TONE_DURATION res; + T_SAT_RES sat_res; + + T_DISPLAY_DATA display_info; + + TRACE_FUNCTION ("sat_play_tone_exec()"); + + switch (event) + { + case SAT_PLAY_TONE: + TRACE_EVENT("SAT_PLAY_TONE"); + data->sat_command = sat_command; /* save a pointer to the parameter for later use in callbacks */ + data->info = NULL; /* NULL means no info running */ + data->tim = NULL; /* NULL means no timer running */ + + /* + * --> Select the right Sound ID, if not supported: return + */ + + res = sat_set_selected_sound(sat_command->c.tone, data); + + switch (res) + { + case NOT_SUPPORTED: + /* sound not supported */ + TRACE_EVENT("SAT sound not supported"); + sat_res[SAT_ERR_INDEX] = SAT_RES_IMPOSSIBLE; + sat_res[SAT_AI_INDEX] = SatResAiNoCause; + sat_done (sat_command, sat_res); + sat_play_tone_destroy (data->win); + return; + case SINGLE_TONE: + /* ignore duration for single tones */ + TRACE_EVENT("SINGLE_TONE"); + audio_PlaySoundID(data->device_id, data->sound_id , data->volume, AUDIO_PLAY_ONCE); + break; + case DURATION: + TRACE_EVENT("DURATION"); + time = sat_calculate_time (sat_command->c.tone.durUnit, sat_command->c.tone.durValue); + if (time EQ 0) + { + /* use default tone duration */ + audio_PlaySoundID(data->device_id, data->sound_id , data->volume, AUDIO_PLAY_ONCE); + res = SINGLE_TONE; /* overruled by default */ + } + else + { + /* to be stopped by timer */ + data->tim = tim_create (win, time, (T_MFW_CB)sat_play_tone_tim_cb); + tim_start (data->tim); + audio_PlaySoundID(data->device_id, data->sound_id , data->volume, AUDIO_PLAY_INFINITE); + } + break; + } + + /* + * --> display alpha identifier (if any) + */ + txt = &sat_command->c.tone.alpha; + + /*SPR#2340 - DS - Handle cases where no alpha id and/or duration is present */ + + if (txt->len > 0) /* alpha id supplied in command */ + { + int timer=0; + + if (time EQ 0) /* no duration supplied, destroy info_dialog after timeout */ + timer = TEN_SECS; + else /* duration supplied, info_dialog destroyed when audio timer expires */ + timer = FOREVER; + + data->TextString = sat_create_TEXT_ASCIIZ (txt); + +//July 26, 2005 REF: SPR 29520 x0018858 +//Function call modified to pass the string as a differant argument(initially 4th arg but now as the 5th arg). + dlg_initDisplayData_TextStr( &display_info, TxtNull, TxtCancel, NULL, data->TextString, COLOUR_STATUS); + + dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)sat_info_cb, timer, KEY_LEFT | KEY_RIGHT | KEY_HUP); + display_info.Identifier = event; +//July 26, 2005 REF: SPR 29520 x0018858 +//wrapping enabled for the display. + display_info.WrapStrings=WRAP_STRING_2; + + /* + * Call Info Screen + */ + data->info = info_dialog (win, &display_info); + /* destroy when dialog times out */ + display_info.TextString = data->TextString; + } + else if (txt->text EQ 0 && res NEQ SINGLE_TONE) + { + /* no alpha id supplied - show default text */ + int timer=0; + + if (time EQ 0) /* no duration supplied, destroy info_dialog after timeout */ + timer = TEN_SECS; + else /* duration supplied, info_dialog destroyed when audio timer expires */ + timer = FOREVER; + + data->TextString = sat_create_TEXT_ASCIIZ (txt); + dlg_initDisplayData_TextStr( &display_info, TxtNull, TxtCancel, "Playing tone", NULL, COLOUR_STATUS); + dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)sat_info_cb, timer, KEY_LEFT | KEY_RIGHT | KEY_HUP); + display_info.Identifier = event; + /* + * Call Info Screen + */ + data->info = info_dialog (win, &display_info); + /* destroy when dialog times out */ + display_info.TextString = data->TextString; + } + else if (res EQ SINGLE_TONE) + { + /* destroy immediately, if SINGLE_TONE and no info */ + sat_res[SAT_ERR_INDEX] = SatResSuccess; + sat_res[SAT_AI_INDEX] = SatResAiNoCause; + sat_done (sat_command, sat_res); + sat_play_tone_destroy (win); + } + break; + + /* sbh - all window types are being provided with this event to destroy the window */ + case SAT_DESTROY_WINDOW: + TRACE_EVENT("SAT_DESTROY_WINDOW"); + sat_play_tone_destroy (win); + break; + /* ...sbh */ + + default: + TRACE_EVENT ("sat_play_tone_exec() unexpected event"); + break; + } +} + +/******************************************************************************* + + $Function: sat_play_tone_tim_cb + + $Description: Callback function for the play tone timer. + + $Returns: Execution status + + $Arguments: event -window event + tc - timer info + +*******************************************************************************/ + +static int sat_play_tone_tim_cb (T_MFW_EVENT event, T_MFW_TIM *tc) +{ + T_MFW_HND win = mfw_parent (mfw_header()); + T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; + T_sat_play_tone * data = (T_sat_play_tone *)win_data->user; + T_SAT_RES sat_res; + + if ((win EQ NULL) || (win_data EQ NULL) || (data EQ NULL)) + return MFW_EVENT_CONSUMED; /* we have been interrupted by user action */ + + TRACE_FUNCTION("sat_play_tone_tim_cb()"); + + /* timer elapsed */ + + sat_res[SAT_ERR_INDEX] = SatResSuccess; + sat_res[SAT_AI_INDEX] = SatResAiNoCause; + sat_done (data->sat_command, sat_res); + data->sat_command = NULL; /* signal response issued to info */ + + /* the last one has to destroy the window */ + data->tim = NULL; /* signal end of timer to info */ + + /* API/DSM - 04/09/03 - SPR2491 - Add a call to stop the play of the continuous AUDIO sound*/ + audio_StopSoundbyID(data->device_id, data->sound_id); + /* API/DSM - 04/09/03 - SPR2491 - END */ + + + /* SPR#2340 - DS - If timer has expired, destroy info_dialog if necessary */ + if (data->info NEQ NULL) + { + /* timer has expired therefore destroy info dialog */ + TRACE_EVENT("Destroy Play Tone dialog and data"); +// July 26, 2005 REF: SPR 29520 x0018858 +//The wndow displaying "Please wait was not getting destroyed. +//Destroyed the window and initialized to NULL. +//Begin 29520 + //sat_play_tone_destroy(data->info); + dialog_info_destroy(data->info); + data->info = NULL; +//End 29520 + } + + if (data->info EQ NULL) + { + /* no info window or info window timed out: we are the last */ + TRACE_EVENT("Destroy Play Tone win and data"); + sat_play_tone_destroy (win); + } + return MFW_EVENT_CONSUMED; +} + +/******************************************************************************* + + $Function: sat_calculate_time + + $Description: Calculate timeout value + + $Returns: time out in ms + + $Arguments: unit - number of units + value - unit value. + +*******************************************************************************/ +static ULONG sat_calculate_time (UBYTE unit, UBYTE value) +{ + ULONG result = (ULONG)value; + + TRACE_FUNCTION("sat_calculate_time()"); + + switch (unit) + { + case 0: // Minutes + result = result * 60 * 1000; + break; + case 1: // Seconds + result = result * 1000; + break; + case 2: // tenth of seconds + result = result * 100; + break; + } + TRACE_EVENT_P3("unit %d, value %d = result %d ms", unit, value, result); + return result; +} + +/******************************************************************************* + + $Function: sat_set_selected_sound + + $Description: Choose the Sound IDīs, return appropriate duration and support info + + $Returns: time out + + $Arguments: tone_tag - tone name + data - tone info + +*******************************************************************************/ + + +static e_TONE_DURATION sat_set_selected_sound (SatTone tone_tag, T_sat_play_tone * data) + +{ + e_TONE_DURATION ret; + + TRACE_FUNCTION("sat_set_selected_sound()"); + + /* SPR#2340 - DS - Removed code that set ret to NOT_SUPPORTED if durUnit equals zero (i.e. Minutes) */ + + /* SPR#2340 - DS - Corrected sound Ids. Use defns rather than magic no.s */ + + switch(tone_tag.tone) + { + case SAT_TONE_CALL_SUB_BUSY: + data->sound_id = TONES_BUSY /*17*/; + break; + case SAT_TONE_CONGESTION: + data->sound_id = TONES_CONGEST /*18*/; + break; + case SAT_TONE_RADIO_PATH_ACK: + case SAT_TONE_GENERAL_BEEP: + data->sound_id = TONES_ACK /*20*/; + break; + case SAT_TONE_RADIO_PATH_NOT: + data->sound_id = TONES_DROPPED /*19 - also call dropped*/; + break; + case SAT_TONE_DIAL: + case SAT_TONE_CALL_WAITING: + data->sound_id = TONES_CW /*21*/; + break; + case SAT_TONE_POSITIV_ACK: + case SAT_TONE_RINGING_TONE: + data->sound_id = TONES_RINGING_TONE /*0x27*/; + break; + case SAT_TONE_ERROR: + case SAT_TONE_NEGATIV_ACK: + data->sound_id = TONES_ERROR /*16*/; + break; + default: + /* Unknown tone value - default is 'general beep' */ + data->sound_id = TONES_KEYBEEP /*0x26*/; + break; + } + + ret = DURATION; + + TRACE_EVENT_P2("tone %d, sound_id %x", tone_tag.tone, data->sound_id); + + return ret; +} + +/******************************************************************************* + + $Function: sat_info_cb + + $Description: Callback function information dialog. + + $Returns: none + + $Arguments: win - window + identifier - unique id + reason - event + +*******************************************************************************/ + +static void sat_info_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason) +{ + /* PLAY TONE */ + T_MFW_WIN * play_win_data = ((T_MFW_HDR *)win)->data; + T_sat_play_tone * play_data = (T_sat_play_tone *)play_win_data->user; + T_SAT_RES sat_res; + + if (win EQ NULL) + return; + + TRACE_FUNCTION("sat_info_cb()"); + + TRACE_EVENT_P2("identifier %d, reason %d", identifier, reason); + + /* + * Who has initiated the information screen + */ + switch (identifier) + { + case SAT_PLAY_TONE: + if ((play_win_data EQ NULL) || (play_data EQ NULL)) + return; /* we have been interrupted by sat_play_tone_tim_cb() */ + + switch (reason) + { + case INFO_TIMEOUT: + if (play_data->tim NEQ NULL) + { + /* NOP on short info timeout && infinite: + * tone will be stopped and SUCCESS will be signalled by sat_play_tone_tim_cb() + */ + play_data->info = NULL; /* signal the end of info to timer */ + } + else + { + /* no timer (single tone) or timer timed out: we are the last */ + if (play_data->sat_command NEQ NULL) + { + /* response not yet issued, i.e single tone with info */ + sat_res[SAT_ERR_INDEX] = SatResSuccess; + sat_res[SAT_AI_INDEX] = SatResAiNoCause; + sat_done (play_data->sat_command, sat_res); + } + + /* the last one has to destroy the window */ + sat_play_tone_destroy (win); + } + break; + case INFO_KCD_LEFT: + case INFO_KCD_RIGHT: + case INFO_KCD_HUP: /*SPR#2340 - DS - Handle hangup keypress */ + if (play_data->tim NEQ NULL) + { + /* timer has not yet elapsed, stop it */ + tim_stop (play_data->tim); + } + + /* API/DSM - 04/09/03 - SPR2491 - Add a call to stop the play of the continuous AUDIO sound*/ + audio_StopSoundbyID(play_data->device_id, play_data->sound_id); + /* API/DSM - 04/09/03 - SPR2491 - END */ + + if (play_data->sat_command NEQ NULL) + { + /* response not yet issued */ + sat_res[SAT_ERR_INDEX] = SAT_RES_USER_ABORT; + sat_res[SAT_AI_INDEX] = SatResAiNoCause; + sat_done (play_data->sat_command, sat_res); + } + sat_play_tone_destroy (win); + break; + } + break; + + default: + TRACE_EVENT("sat_info_cb(): unexp. event"); + break; + } +}