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;
	}
}