FreeCalypso > hg > fc-tourmaline
view src/ui/bmi/mmiSatInfo.c @ 261:841a848ba762
SPI SWE: clear any pending boot-time interrupts in spi_init()
Charger plug/unplug hw logic in the Iota ABB has no built-in debouncing,
thus electrical contact bounce on the charging power connection interface
produces a lot of charger plug/unplug interrupts. When we boot in
charging mode (charging power present at boot time and is presumably
the cause of Switch-ON), some bounce may occur between the initial
Iota Switch-ON action and Calypso firmware booting. By clearing any
accumulated ITSTATREG interrupts on boot, we prevent these pre-boot
interrupts from generating charger plug/unplug events to FCHG, which
would upset smooth from-boot charging.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 14 May 2021 02:49:05 +0000 |
parents | 0b8ebd4dd2ef |
children |
line wrap: on
line source
/******************************************************************************* 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 = 0; /* x0039928 - Lint warning fix */ 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 IDs, 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; } }