⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmiaoc.c

📁 GSM手机设计软件代码
💻 C
📖 第 1 页 / 共 3 页
字号:
       */
      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 + -