FreeCalypso > hg > fc-tourmaline
view src/ui/bmi/mmiBand.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 | 63dffa10b00a |
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: Frequency band selection $File: MmiBand.c $Revision: 1.0 $Author: Condat(UK) $Date: 03/04/02 ******************************************************************************** Description: This provides the functionality for menu options to select and display the current band used. ******************************************************************************** $History: MmiBand.c 03/04/02 Original Condat(UK) BMI version. $End *******************************************************************************/ /******************************************************************************* Include files *******************************************************************************/ #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 "cus_aci.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_tim.h" #include "mfw_icn.h" #include "mfw_mnu.h" #include "mfw_phb.h" #include "mfw_cm.h" #include "mfw_sim.h" #include "mfw_nm.h" #include "mfw_sat.h" #include "mfw_ss.h" /*for convert*/ #include "mfw_phb.h" #include "ksd.h" #include "psa.h" #include "mfw_sms.h" #include "mfw_cphs.h" #include "mfw_sat.h" #include "Mfw_band.h" #include "mfw_ffs.h" #include "dspl.h" #include "MmiMmi.h" #include "MmiDialogs.h" #include "MmiLists.h" #include "MmiBand.h" #include "MmiCPHS.h" #include "mmiColours.h" /***********************************Macros**********************************************/ #define MAX_NUMBER_OF_FREQS 5 #define NO_OF_BAND_MODES 2 #define BAND_INIT 1 #define BAND_DESTROY 2 /*********************Structure Definitions********************************************************/ typedef struct { T_MMI_CONTROL mmi_control; T_MFW_HND freq_win; /* MFW win handler */ T_MFW_HND parent; UBYTE available_freqs; UBYTE selected_freqs; /* SPR#998 - SH - Used to store list of selected frequencies */ T_MFW_BAND_MODE mode; /* SPR#998 - SH */ UBYTE type[MAX_NUMBER_OF_FREQS]; ListMenuData * menu_list_data; UBYTE no_of_entries; } T_FREQ_INFO; static const MfwMnuAttr Freq_menuAttrib = { &melody_menuArea, MNU_LEFT | MNU_LIST | MNU_CUR_LINE, /* centered page menu */ (U8)-1, /* use default font */ NULL, /* with these items */ 0, /* number of items */ COLOUR_LIST_SMS, TxtNull, MNUATTRSPARE}; /* List of all possible frequencies */ static const int band_list[MAX_NUMBER_OF_FREQS] = { MFW_BAND_GSM_900, MFW_BAND_DCS_1800, MFW_BAND_PCS_1900, MFW_BAND_E_GSM, MFW_BAND_GSM_850 }; /* SPR#998 - SH - Static handle to allow callback functions to access data */ static T_FREQ_INFO *current_data = NULL; /*********************************Function Prototypes*****************************/ char* Freq2Str(int freq); int Freq2StrID(int freq); static T_MFW_HND mmi_band_build_freq_list( MfwHnd parent_window, UBYTE available_freqs); static int mmi_band_display_status(T_MFW_HND parent); static int mmi_band_display_status_cb(T_MFW_HND parent, USHORT identifier, USHORT reason); void mmi_band_freq_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter); void mmi_band_freq_list_cb(T_MFW_HND * Parent, ListMenuData * ListData); static void mmi_band_freq_list_destroy(MfwHnd own_window); static int mmi_band_freq_win_cb (MfwEvt e, MfwWin *w); /* SPR#998 - SH - Functions used by new checkbox menus */ int mmi_band_menu_func(MfwMnu* menu, MfwMnuItem* item); USHORT mmi_band_menu_flag( struct MfwMnuTag *menu, struct MfwMnuAttrTag *attr, struct MfwMnuItemTag *item ); /************************************Public Functions************************/ /************************************************************************* $Function: mmi_band_radio_mode_change_auto $Description: Changes multiband mode to automatic. Selected from menu. $Returns: status int $Arguments: menu and menu item (not used) *******************************************************************************/ int mmi_band_radio_mode_change_auto(MfwMnu* m, MfwMnuItem* i) { T_MFW_HND parent = mfwParent( mfw_header()); // T_MFW_BAND_MODE mode; // RAVI TRACE_FUNCTION("mmi_band_radio_mode_change_auto"); if (band_radio_mode_switch(MFW_BAND_MODE_Auto, 0) >= MFW_BAND_OK) { ShowMessage(parent, TxtDone, TxtNull); } else ShowMessage(parent, TxtFailed, TxtNull); return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: mmi_band_radio_mode_change_manual $Description: Gets a list of available manual bands. Selected from menu. $Returns: status int $Arguments: menu and menu item (not used) *******************************************************************************/ int mmi_band_radio_mode_change_manual(MfwMnu* m, MfwMnuItem* i) { T_MFW_HND parent = mfwParent( mfw_header()); T_MFW_BAND_MODE maxMode; UBYTE available_freqs; T_MFW_HND win; if (band_get_radio_modes(&maxMode, &available_freqs) >= MFW_BAND_OK) { if (maxMode >= MFW_BAND_MODE_Manual) /* Make sure manual is an accepted mode */ { win = mmi_band_build_freq_list(parent, available_freqs); if (win NEQ NULL) { SEND_EVENT (win, BAND_INIT, 0, 0); } else ShowMessage(parent, TxtManual, TxtNotSupported); } } return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: mmi_band_radio_mode_info $Description: Get current band setting $Returns: status int $Arguments: menu and menu item (not used) *******************************************************************************/ int mmi_band_radio_mode_info(MfwMnu* m, MfwMnuItem* i) { T_MFW_HND parent = mfwParent( mfw_header()); mmi_band_display_status(parent); return MFW_EVENT_CONSUMED; } /*******************************Private Functions**********************************/ /******************************************************************************* $Function: Freq2Str $Description: Converts the band enum into an appropraite string $Returns: string $Arguments: Band (integer) *******************************************************************************/ char* Freq2Str(int freq) { switch (freq) { case MFW_BAND_DCS_1800: return MmiRsrcGetText(TxtDCS_1800); //break; // RAVI case MFW_BAND_PCS_1900: return MmiRsrcGetText(TxtPCS_1900); //break; // RAVI case MFW_BAND_E_GSM: return MmiRsrcGetText(TxtE_GSM); //break; // RAVI case MFW_BAND_GSM_850: return MmiRsrcGetText(TxtGSM_850); // break; // RAVI case MFW_BAND_GSM_900: return MmiRsrcGetText(TxtGSM_900); // break; // RAVI default: return MmiRsrcGetText(TxtError); // break; // RAVI } } /******************************************************************************* $Function: Freq2Str $Description: Converts the band enum into an appropraite string ID $Returns: string ID $Arguments: Band (integer) *******************************************************************************/ int Freq2StrID(int freq) { switch (freq) { case MFW_BAND_DCS_1800: return TxtDCS_1800; //break; // RAVI case MFW_BAND_PCS_1900: return TxtPCS_1900; //break; // RAVI case MFW_BAND_E_GSM: return TxtE_GSM; //break; // RAVI case MFW_BAND_GSM_850: return TxtGSM_850; // break; // RAVI case MFW_BAND_GSM_900: return TxtGSM_900; //break; // RAVI default: return TxtError; //break; // RAVI } } /******************************************************************************* $Function: mmi_band_display_status $Description: Displays the current band status $Returns: none $Arguments: parent - parent window *******************************************************************************/ static int mmi_band_display_status(T_MFW_HND parent) { /* SPR#998 - SH - Now store mode in data->mode */ T_MFW_WIN *win_data = ((T_MFW_HDR *) parent)->data; T_FREQ_INFO *data = (T_FREQ_INFO *)win_data->user; if (band_get_current_radio_mode(&data->mode, &data->selected_freqs) >= MFW_BAND_OK) { if (data->mode == MFW_BAND_MODE_Auto) { ShowMessage(parent, TxtAutomatic, TxtNull); } else { ShowMessage(parent, TxtManual, TxtNull); } } else { ShowMessage(parent, TxtReadError, TxtNull); } return 1; // RAVI - Changed return to return 1. } #if(0) /* x0039298 - Lint warning fix */ /******************************************************************************* $Function: mmi_band_display_status_cb $Description: Callback for status list window - currently does nothing $Returns: none $Arguments: parent - parent window identifier - length of status string reason - not used *******************************************************************************/ static int mmi_band_display_status_cb(T_MFW_HND parent, USHORT identifier, USHORT reason) { return 1; // RAVI - Changed return to return 1. } #endif /******************************************************************************* $Function: mmi_band_build_freq_list $Description: Creates window for frequency list $Returns: window created $Arguments: parent window *******************************************************************************/ static T_MFW_HND mmi_band_build_freq_list( MfwHnd parent_window, UBYTE available_freqs) { T_FREQ_INFO *data = (T_FREQ_INFO *)ALLOC_MEMORY (sizeof (T_FREQ_INFO)); T_MFW_WIN *win; // int index; // RAVI TRACE_FUNCTION("mmi_band_build_freq_list()"); /* * Create window handler */ data->freq_win = win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)mmi_band_freq_win_cb); if (data->freq_win EQ NULL) { return NULL; } current_data = data; /* SPR#998 - SH - Store handle for data; used by callbacks */ /* * connect the dialog data to the MFW-window */ data->mmi_control.dialog = (T_DIALOG_FUNC)mmi_band_freq_exec_cb; data->mmi_control.data = data; win = ((T_MFW_HDR *)data->freq_win)->data; win->user = (void *)data; data->parent = parent_window; data->available_freqs = available_freqs; winShow(data->freq_win); /* * return window handle */ return data->freq_win; } /******************************************************************************* $Function: mmi_band_freq_exec_cb $Description: Exec callback function of the information Numbers window $Returns: none $Arguments: win - window handler event - mfw event parameter - optional data. *******************************************************************************/ void mmi_band_freq_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter) { T_MFW_WIN *win_data = ((T_MFW_HDR *) win)->data; T_FREQ_INFO *data = (T_FREQ_INFO *)win_data->user; UBYTE numberOfEntries; int index; T_MFW_BAND_MODE maxMode; // char *menuItem; // RAVI /* SPR#998 - SH - Remove code that implements custom checkbox implementaton, * as checkboxes now handled by mfw */ TRACE_FUNCTION ("mmi_band_freq_exec_cb()"); switch (event) { case BAND_INIT: TRACE_EVENT("mmi_band_freq_exec_cb() Event:BAND_INIT"); /* initialization of administrative data */ data->menu_list_data = (ListMenuData *)ALLOC_MEMORY(sizeof(ListMenuData)); if(!data->menu_list_data) { TRACE_EVENT("Failed memory alloc 1 "); return; } band_get_radio_modes(&maxMode, &data->available_freqs); /* Run through the list of possible frequencies first to obtain the number of frequencies permitted (how many will be in the menu) */ /* SPR#998 - SH - Removed custom checkbox implementation */ numberOfEntries = 0; for (index=0; index<MAX_NUMBER_OF_FREQS; index++) { if (data->available_freqs & band_list[index]) { data->type[numberOfEntries] = band_list[index]; numberOfEntries++; } } /* If there are no entries, show "Empty List" message and exit */ if (numberOfEntries==0) { ShowMessage(data->parent, TxtEmptyList, TxtNull); mmi_band_freq_list_destroy(win); return; } /* Get the status of all the frequencies */ /* SPR#998 - SH - Use data->mode */ if (band_get_current_radio_mode(&data->mode, &data->selected_freqs) >= MFW_BAND_OK) { /* If we're not in manual choose manual */ if (data->mode!=MFW_BAND_MODE_Manual) { data->selected_freqs = data->available_freqs; /* SH - default when choosing manual is all */ band_radio_mode_switch(MFW_BAND_MODE_Manual, data->selected_freqs); } /* Allocate the memory for the list structure */ data->no_of_entries = numberOfEntries; data->menu_list_data->List = (T_MFW_MNU_ITEM *)ALLOC_MEMORY( numberOfEntries * sizeof(T_MFW_MNU_ITEM) ); if(!data->menu_list_data->List) { TRACE_EVENT("Failed memory alloc 2"); return; } /* Allocate memory for the menu texts, and populate the list structure */ numberOfEntries = 0; for (index=0; index<MAX_NUMBER_OF_FREQS; index++) { if (data->available_freqs & band_list[index]) { /* SPR#998 - SH - Removed code, checkboxes now handled by MFW */ mnuInitDataItem(&data->menu_list_data->List[numberOfEntries]); /* Here we specify the function that checks and unchecks the checkboxes */ data->menu_list_data->List[numberOfEntries].func = mmi_band_menu_func; data->menu_list_data->List[numberOfEntries].str = (char *)Freq2StrID(band_list[index]); /* Here we specify the function that returns the checkbox status of any menu item */ data->menu_list_data->List[numberOfEntries].flagFunc = mmi_band_menu_flag; numberOfEntries++; } } data->menu_list_data->ListLength =numberOfEntries; data->menu_list_data->ListPosition = 1; data->menu_list_data->CursorPosition = 1; data->menu_list_data->SnapshotSize = numberOfEntries; data->menu_list_data->Font = 0; data->menu_list_data->LeftSoftKey = TxtSoftSelect; data->menu_list_data->RightSoftKey = TxtSoftBack; data->menu_list_data->KeyEvents = KEY_ALL; data->menu_list_data->Reason = 0; data->menu_list_data->Strings = FALSE; /* SPR#998 - SH - We no longer alter the menu strings */ data->menu_list_data->Attr = (MfwMnuAttr*)&Freq_menuAttrib; data->menu_list_data->autoDestroy = FALSE; /* Create the dynamic menu window */ listDisplayListMenu(win, data->menu_list_data,(ListCbFunc)mmi_band_freq_list_cb,0); } else /* We haven't been able to read the status */ { ShowMessage(win, TxtReadError, TxtNull); } break; case BAND_DESTROY: TRACE_EVENT("mmi_band_freq_exec_cb() Event:BAND_DESTROY"); /* * Free Memory */ /* SPR#998 - SH - No longer free allocated strings here */ numberOfEntries = data->no_of_entries; if (data->menu_list_data != NULL) { FREE_MEMORY ((void *)data->menu_list_data->List, numberOfEntries * sizeof (T_MFW_MNU_ITEM)); FREE_MEMORY ((void *)data->menu_list_data, sizeof (ListMenuData)); } FREE_MEMORY ((void *)data, sizeof (T_FREQ_INFO)); break; default: break; } } /******************************************************************************* $Function: mmi_band_freq_list_cb $Description: Callback function for the info num list. $Returns: none $Arguments: Parent - parent window. ListData - Menu item list *******************************************************************************/ void mmi_band_freq_list_cb(T_MFW_HND * Parent, ListMenuData * ListData) { /* SPR#998 - SH - Selecting a checkbox is handled now by the checkbox functions, * so much less is required here */ T_MFW_WIN *win_data = ((T_MFW_HDR *)Parent)->data; T_FREQ_INFO *data = (T_FREQ_INFO *)win_data->user; TRACE_FUNCTION("mmi_band_freq_list_cb"); if ((ListData->Reason EQ LISTS_REASON_BACK) || (ListData->Reason EQ LISTS_REASON_CLEAR)) { listsDestroy(ListData->win); mmi_band_freq_list_destroy(data->freq_win); } else if(ListData->Reason EQ LISTS_REASON_SELECT) { winShow(Parent); } } /******************************************************************************* $Function: mmi_band_freq_list_destroy $Description: Destroy the info num window. $Returns: none $Arguments: own_window- current window *******************************************************************************/ static void mmi_band_freq_list_destroy(MfwHnd own_window) { T_MFW_WIN *win_data; T_FREQ_INFO *data; TRACE_FUNCTION ("mmi_band_freq_list_destroy()"); if (own_window) { win_data = ((T_MFW_HDR *)own_window)->data; data = (T_FREQ_INFO *)win_data->user; if (data) { /* * Free Memory */ SEND_EVENT (own_window, BAND_DESTROY, 0, 0); /* * Delete WIN handler */ win_delete (own_window); current_data = NULL; /* SPR#998 - SH - Set the data handle to NULL */ } else { TRACE_EVENT ("mmi_band_freq_list_destroy() called twice"); } } } /******************************************************************************* $Function: mmi_band_freq_win_cb $Description: Window callback function for the info numbers window. $Returns: none $Arguments: w - mfw window handler e - mfw event *******************************************************************************/ static int mmi_band_freq_win_cb (MfwEvt e, MfwWin *w) /* yyy window event handler */ { TRACE_FUNCTION ("mmi_band_freq_win_cb()"); switch (e) { case MfwWinVisible: /* window is visible */ break; case MfwWinFocussed: /* input focus / selected */ case MfwWinDelete: /* window will be deleted */ default: return MFW_EVENT_REJECTED; } return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: mmi_band_menu_func $Description: SPR#998 - SH - Added Select or deselect a checkbox item. The appropriate band function is called, to ensure that the selection is valid. $Returns: None. $Arguments: m, ma, mi - not used *******************************************************************************/ int mmi_band_menu_func(MfwMnu* menu, MfwMnuItem* item) { T_FREQ_INFO *data = current_data; TRACE_FUNCTION("mmi_band_menu_func"); data->selected_freqs ^= data->type[menu->lCursor[menu->level]]; /* Toggle this band */ if (band_radio_mode_switch(MFW_BAND_MODE_Manual, data->selected_freqs) >= MFW_BAND_OK) { mnuUpdate(menu); } else { data->selected_freqs ^= data->type[menu->lCursor[menu->level]]; /* Undo change */ ShowMessage(data->freq_win, TxtFailed, TxtNull); } return 1; } /******************************************************************************* $Function: mmi_band_menu_flag $Description: Attribut function for menu entries. $Returns: Checked or unchecked $Arguments: m, ma, mi - not used *******************************************************************************/ USHORT mmi_band_menu_flag( struct MfwMnuTag *menu, struct MfwMnuAttrTag *attr, struct MfwMnuItemTag *item ) { T_FREQ_INFO *data = current_data; /* SPR#998 - SH - Get data from static handle */ int currentOption; TRACE_FUNCTION("mmi_band_menu_flag()"); TRACE_EVENT_P1("Freq info data: %x", data); /* Identify current menu option */ currentOption = mnuIdentify(attr, item); /* If we find it, work out if it's checked or not */ if (currentOption>-1) { if (data->selected_freqs & data->type[currentOption]) return MNU_ITEM_CHECKED; else return MNU_ITEM_UNCHECKED; } return 0; }