📄 mmiaoc.c
字号:
*/
win_delete (data->service_win);
data->service_win = 0;
FREE_MEMORY ((void *)data, sizeof (T_SERVICES));
}
}
}
/*******************************************************************************
$Function: service_win_cb
$Description:
$Returns:
$Arguments:
*******************************************************************************/
static int service_win_cb (T_MFW_EVENT event, T_MFW_WIN * win)
{
/*
* Top Window has no output
*/
return 1;
}
/*******************************************************************************
$Function: service_dialog_cb
$Description:
$Returns:
$Arguments:
*******************************************************************************/
void service_dialog_cb(T_MFW_HND win, USHORT identifier, UBYTE reason)
{
char buf [40];
TRACE_FUNCTION ("service_dialog_cb()");
switch (reason)
{
case INFO_KCD_LEFT:
/* no break; */
case INFO_TIMEOUT:
/* no break; */
case INFO_KCD_HUP:
/* no break; */
case INFO_KCD_RIGHT:
/* no break; */
case INFO_KCD_CLEAR:
sprintf(buf, "identifier: %d", identifier);
TRACE_EVENT(buf);
if (identifier EQ SERVICES_OUT_OF_RANGE)
{
TRACE_EVENT ("SERVICES_OUT_OF_RANGE");
SEND_EVENT (win, SERVICES_ONE_UNIT, 0, 0);
}
else
{
TRACE_EVENT (" destroy ");
service_Exit(win);
}
break;
}
}
/*******************************************************************************
$Function: service_editor_cb
$Description:
$Returns:
$Arguments:
*******************************************************************************/
static void service_editor_cb (T_MFW_HND win, USHORT Identifier, SHORT reason)
{
T_MFW_WIN * win_data = ((T_MFW_HDR *) win)->data;
T_SERVICES * data = (T_SERVICES *)win_data->user;
UBYTE PWD, i;
int result;
char buf[60];
TRACE_FUNCTION ("service_editor_cb()");
switch (reason)
{
case INFO_KCD_LEFT:
switch (Identifier)
{
case SERVICES_ENTER_CURRENCY:
TRACE_EVENT ("SERVICES_ENTER_CURRENCY");
TRACE_EVENT ("pressed left");
// clear old current currency before overwrite it
memset(data->aocInfo.cur, 0x80, sizeof(data->aocInfo.cur));
if(strlen(data->edt_Buf) NEQ 0)
{
memcpy(data->aocInfo.cur, data->edt_Buf, MAX_ENTER_CURRENCY);
}
//termination from ASCII to GSM default
for (i=0; i< MAX_ENTER_CURRENCY-1; i++)
{
if (data->aocInfo.cur[i] EQ '\0')
data->aocInfo.cur[i] = 0x80;
}
// open the next editor for entering the price per unit
SEND_EVENT (win, SERVICES_ONE_UNIT, 0, 0);
break;
case SERVICES_ONE_UNIT:
TRACE_EVENT ("SERVICES_ONE_UNIT");
TRACE_EVENT ("pressed left");
// clear old current ppu before overwrite it
memset(data->aocInfo.ppu, '\0', sizeof(data->aocInfo.ppu));
if(strlen(data->edt_Buf) NEQ 0)
{
memcpy(data->aocInfo.ppu, data->edt_Buf, strlen(data->edt_Buf));
}
// Password not necessary, Pin2 scenario done
PWD='\0';
// write cur and ppu in AOC
result = cm_set_aoc_value(CM_AOC_PUCT, &data->aocInfo, &PWD);
sprintf(buf, "%s", data->aocInfo.ppu);
TRACE_EVENT(buf);
sprintf(buf, "%s", data->aocInfo.cur);
TRACE_EVENT(buf);
sprintf(buf, "%d", result);
TRACE_EVENT(buf);
if(result EQ CM_OK)
{
SEND_EVENT (win, SERVICES_RATE_CHANGED, 0, 0);
}
else
{
SEND_EVENT (win, SERVICES_OUT_OF_RANGE, 0, 0);
}
break;
case SERVICES_LIMIT_CHANGE:
// string => long
data->aocInfo.acm_max = atol(data->edt_Buf);
// Password not necessary, Pin2 scenario done
PWD='\0';
result = cm_set_aoc_value(CM_AOC_ACMMAX,&data->aocInfo, &PWD); /* save ACMmax in AOC */
sprintf(buf, "%ld", data->aocInfo.acm_max);
TRACE_EVENT(buf);
sprintf(buf, "result of set aoc %d", result);
TRACE_EVENT(buf);
SEND_EVENT (win, SERVICES_LIMIT_CHANGED, 0, 0);
break;
case SERVICES_RESET_CHARGE:
/* MC 12/04/02: Changed ACMMAX to ACM (should fix "broken" SIM problem)*/
result = cm_set_aoc_value(CM_AOC_ACM,&data->aocInfo, &PWD); /* save ACMmax in AOC */
}
break;
case INFO_KCD_RIGHT:
case INFO_KCD_CLEAR:
TRACE_EVENT ("INFO_KCD_RIGHT pressed");
switch (Identifier)
{
case SERVICES_LIMIT_CHANGE:
case SERVICES_ENTER_CURRENCY:
//go back to the previous screen
service_Exit (win);
break;
case SERVICES_ONE_UNIT:
//go back to the previous screen
SEND_EVENT (win, SERVICES_ENTER_CURRENCY, 0, 0);
break;
default:
break;
}
default:
break;
}
}
/*******************************************************************************
$Function: createAOCDialog
$Description: Creates a dialog from 4 input parameters
$Returns:
$Arguments:
*******************************************************************************/
static void createAOCDialog( T_MFW_HND win, USHORT txtId1, USHORT txtId2, char *str2, USHORT event )
{
T_DISPLAY_DATA display_info;
dlg_initDisplayData_TextId( &display_info, TxtNull, TxtNull, txtId1, txtId2, COLOUR_AOC);
dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)service_dialog_cb, THREE_SECS, KEY_CLEAR | KEY_RIGHT | KEY_LEFT );
display_info.Identifier = event;
display_info.TextString2 = str2;
info_dialog (win, &display_info);
}
/*******************************************************************************
$Function: service
$Description:
$Returns:
$Arguments:
*******************************************************************************/
void service (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
T_MFW_WIN * win_data = ((T_MFW_HDR *) win)->data;
T_SERVICES * data = (T_SERVICES *)win_data->user;
char buf[60];
#ifdef NEW_EDITOR
T_AUI_EDITOR_DATA editor_data; /* SPR#1428 - SH - New Editor data */
#else
T_EDITOR_DATA editor_data;
#endif
T_MFW_SIM_PIN_STATUS status;
UBYTE PWD, i, result;
static char line[MAX_LINE];
TRACE_FUNCTION("service()");
switch (event)
{
case SERVICES_CREDIT_REMAINING:
memset(line,'\0',sizeof(line));
//Get the ACM MAX
cm_get_aoc_value(CM_AOC_ACMMAX,&data->aocInfo);
//Get ACM
cm_get_aoc_value(CM_AOC_ACM,&data->aocInfo);
//Get currency and price per unit
cm_get_aoc_value(CM_AOC_PUCT,&data->aocInfo);
sprintf(buf, "ACMMAX: %ld", data->aocInfo.acm_max);
TRACE_EVENT(buf);
sprintf(buf, "ACM: %ld", data->aocInfo.acm);
TRACE_EVENT(buf);
sprintf(buf, "PPU:%s", data->aocInfo.ppu);
TRACE_EVENT(buf);
sprintf(buf, "CUR:%s", data->aocInfo.cur);
TRACE_EVENT(buf);
if ((data->aocInfo.acm_max NEQ '\0') && (data->aocInfo.acm NEQ '\0'))
{
/* special case: It is not possible to have ACM > ACMMAX */
/* this case the mobile has to disconnect */
if(data->aocInfo.acm > data->aocInfo.acm_max)
{
strcpy(line, "????");
}
else
{
/* calculate the credit with ACMAX and PPU */
TRACE_EVENT ("CREDIT :ACMMAX !=0 and PPU !=0");
service_calc_balance (win,(char*)line);
}
}
if ((data->aocInfo.acm_max EQ '\0') && (data->aocInfo.acm NEQ '\0'))
{
/* calculate the cost with ACM and PPU */
TRACE_EVENT ("CREDIT :ACMMAX ==0 and PPU !=0");
service_calculate (win, (char*)line, data->aocInfo.acm);
}
if ((data->aocInfo.acm_max EQ '\0') && (data->aocInfo.acm NEQ '\0') )
{
/* show only ACM */
TRACE_EVENT ("CREDIT :ACMMAX ==0 and PPU ==0");
sprintf(line, "%ld", data->aocInfo.acm); /* */
}
if ((data->aocInfo.acm_max NEQ '\0') && (data->aocInfo.acm NEQ '\0'))
{
/* show only ACMAX */
TRACE_EVENT ("CREDIT :ACMMAX !=0 and PPU ==0");
sprintf(line, "%ld", data->aocInfo.acm_max - data->aocInfo.acm); /* */
}
if (data->aocInfo.acm EQ '\0')
strcpy ((char *)line, "0");
//from ASCII to GSM default
for (i=0; i< MAX_LINE; i++)
{
if (line[i] EQ 0x80 OR line[i] EQ 0xFF )
line[i] = '\0';
}
if (data->aocInfo.acm_max EQ 0)
{
createAOCDialog( win, TxtCost, TxtNull, line, event);
}
else
{
createAOCDialog( win, TxtBalance, TxtNull, line, event);
}
break;
case PIN_REQUEST_FOR_RATE:
//save the status
data->Identifier = SERVICES_ENTER_CURRENCY;
//PIN2 is requested to change the Rate
pin2_check (data->service_win);
break;
case PIN_REQUEST_FOR_LIMIT_CHANGE:
//PIN2 is requested to change the Rate
pin2_check (data->service_win);
//save the status
data->Identifier = SERVICES_LIMIT_CHANGE;
break;
case PIN_REQUEST_FOR_LIMIT_CANCEL:
//PIN2 is requested to change the Rate
pin2_check (data->service_win);
//save the status
data->Identifier = SERVICES_LIMIT_CANCEL;
break;
case PIN_REQUEST_FOR_RESET_CHARGE:
//save the status
data->Identifier = SERVICES_RESET_CHARGE;
//PIN2 is requested to change the Rate
pin2_check (data->service_win);
break;
//it calls from MMI PINS
case PIN2_OK:
TRACE_EVENT("PIN2_OK");
switch (data->Identifier)
{
case SERVICES_ENTER_CURRENCY:
//pin was ok, open now the editor for entering the currency
SEND_EVENT (win, data->Identifier, 0, 0);
break;
case SERVICES_LIMIT_CHANGE:
//pin was ok, open now the editor for entering the currency
SEND_EVENT (win, data->Identifier, 0, 0);
break;
case SERVICES_LIMIT_CANCEL:
//pin was ok, open now the editor for entering the currency
SEND_EVENT (win, data->Identifier, 0, 0);
break;
case SERVICES_RESET_CHARGE:
//pin was ok, open now the editor for entering the currency
SEND_EVENT (win, data->Identifier, 0, 0);
break;
}
break;
case PIN2_ABORT:
createAOCDialog( win, TxtFailed, TxtNull, line, event );
break;
case SERVICES_ENTER_CURRENCY:
//save the status
data->Identifier = SERVICES_ENTER_CURRENCY;
//PUCT (currency and price per unit) is requested
result = cm_get_aoc_value(CM_AOC_PUCT, &data->aocInfo);
sprintf(buf, "result %d", result);
TRACE_EVENT(buf);
//fill up editor-sttribut with default
service_loadEditDefault (&editor_data);
//clear the editor-buffer
memset(data->edt_Buf,'\0',sizeof(data->edt_Buf));
// let to show the current currency, before the user change it */
memcpy(data->edt_Buf, data->aocInfo.cur, MAX_ENTER_CURRENCY);
for (i=0; i< MAX_ENTER_CURRENCY-1; i++)
{
if (data->edt_Buf[i] EQ 0x80 OR data->edt_Buf[i] EQ 0xFF )
data->edt_Buf[i] = '\0';
}
/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, (UBYTE *)data->edt_Buf, MAX_ENTER_CURRENCY);
AUI_edit_SetTextStr(&editor_data, TxtSoftOK, TxtDelete, TxtEnterCurrency, NULL);
AUI_edit_SetEvents(&editor_data, data->Identifier, TRUE, FOREVER, (T_AUI_EDIT_CB)service_editor_cb);
AUI_edit_SetMode(&editor_data, ED_MODE_ALPHA, ED_CURSOR_BAR);
AUI_edit_Start(data->service_win, &editor_data);
#else /* NEW_EDITOR */
editor_data.editor_attr.text = data->edt_Buf; /* buffer to be edited */
editor_data.editor_attr.size = MAX_ENTER_CURRENCY;/* limit to 3 letters */
editor_data.LeftSoftKey = TxtSoftOK;
editor_data.RightSoftKey = TxtDelete;
editor_data.TextId = TxtEnterCurrency;
editor_data.Identifier = data->Identifier;
editor_data.mode = ALPHA_MODE;
editor_data.AlternateLeftSoftKey = TxtNull;
editor_data.min_enter = 1;
/* create the dialog handler */
editor_start(data->service_win, &editor_data); /* start the editor */
#endif /* NEW_EDITOR */
break;
case SERVICES_ONE_UNIT:
//save the status
data->Identifier = SERVICES_ONE_UNIT;
//fill up editor-sttribut with default
service_loadEditDefault (&editor_data);
//clear the editor-buffer
memset(data->edt_Buf,'\0',sizeof(data->edt_Buf));
/* let to show the current price per unit, before the user change it */
memcpy(data->edt_Buf, data->aocInfo.ppu, sizeof(data->aocInfo.ppu));
for (i=0; i< MAX_ENTER_UNIT-1; i++)
{
if (data->edt_Buf[i] EQ 0x80 OR data->edt_Buf[i] EQ 0xFF )
data->edt_Buf[i] = '\0';
}
/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, (UBYTE *)data->edt_Buf, MAX_ENTER_UNIT);
AUI_edit_SetTextStr(&editor_data, TxtSoftOK, TxtDelete, Txt1Unit, NULL);
AUI_edit_SetEvents(&editor_data, data->Identifier, TRUE, FOREVER, (T_AUI_EDIT_CB)service_editor_cb);
AUI_edit_SetMode(&editor_data, 0, ED_CURSOR_BAR);
AUI_calc_Start(data->service_win, &editor_data);
#else /* NEW_EDITOR */
editor_data.editor_attr.text = data->edt_Buf; /* buffer to be edited */
editor_data.editor_attr.size = MAX_ENTER_UNIT;/* limit to 5 numerics */
editor_data.LeftSoftKey = TxtSoftOK;
editor_data.RightSoftKey = TxtDelete;
editor_data.TextId = Txt1Unit;
editor_data.Identifier = data->Identifier;
editor_data.mode = CALC_MODE;
editor_data.AlternateLeftSoftKey = TxtNull;
editor_data.min_enter = 1;
/* create the dialog handler */
editor_start(data->service_win, &editor_data); /* start the editor */
#endif /* NEW_EDITOR */
break;
case SERVICES_RATE_CHANGED:
createAOCDialog( win, TxtRate, TxtChanged, NULL, event);
break;
case SERVICES_LIMIT_VIEW:
memset(line,'\0',sizeof(line));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -