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

📄 mmicalculator.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/*******************************************************************************

                    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 (6349)                                                           
 $Module:		Calculator
 $File:		    MmiCalculator.c
 $Revision:		1.0                                                       
                                                                              
 $Author:		Condat(UK)                                                         
 $Date:		    25/10/00                                                      
                                                                               
********************************************************************************
                                                                              
 Description

    This provides the main calculator functionality

  
********************************************************************************
 $History: MmiCalculatorMain.c

    25/10/00			Original Condat(UK) BMI version.	
    27/08/02            gdy add
       
 $End

*******************************************************************************/


/******************************************************************************
                                                                              
                                Include Files
                                                                              
*******************************************************************************/
//extern const unsigned char calculatorbmp[];

#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 "mmibookshared.h"
#include "MmiEditor.h"
#include "Mfw_edt.h"
#include "MmiDialogs.h"

#include "p_sim.h"

#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_edt.h"
#include "mfw_tim.h"
#include "mfw_phb.h"
#include "ksd.h"
#include "psa.h"
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_lng.h"
#include "mfw_sat.h"
#include "mfw_kbd.h"
#include "mfw_nm.h"
#include "mfw_sms.h"

#include "dspl.h"

#include "MmiMmi.h"
#include "MmiDummy.h"
#include "MmiDialogs.h"
#include "MmiLists.h"
#include "MmiIdle.h"
#include "MmiSoftkeys.h"
#include "MmiIcons.h"
#include "MmiMenu.h"
#include "MmiMain.h"
#include "MmiStart.h"
#include "MmiPins.h"
#include "MmiSettings.h"
#include "Mmiicons.h"
#include "MmiEditor.h"
#include "MmiBookShared.h"
#include "MmiSmsMenu.h"
#include "Mmiicons.h"
#include "mmiusersymbolinput.h"
#include "GameDisplay.h"
//#include "Mmischedule.h"



#include "cus_aci.h"
#include "p_sim.h"
#include "pcm.h"
#include "MmiCalculator.h"
//#include "mmiicndialogs.h"
#include "mmiicons.h"
/*******************************************************************************
                                                                              
                                Function Prototypes
                                                                              
*******************************************************************************/
#define HUNDRED_MILLION 100000000
#define DIV_LEN 6
#define MAX_OPTNUMBER 13

#define MAX_CALC_TOTAL 999999999
#define MIN_CALC_TOTAL -99999999
#define MAX_NUMBER   14

static T_MFW_HND calc_win = NULL;


static T_MFW_HND calculator_create(MfwHnd parent_window);
static int calculator_win_cb(T_MFW_EVENT event,T_MFW_WIN * win);
static void calculator_DialogCB(T_MFW_HND win, USHORT event,  SHORT identifier, void *parameter);
void calculator_destroy(MfwHnd own_window);
static int calculator_kbd_cb (MfwEvt e, MfwKbd *kc);
//void CalclatorSetEditor(T_MFW_HND win);
void calcDisplay(CalcData* data);
void calculate(char str1[MAXLEN],char str2[MAXLEN],char mark[2],char result_s[MAXLEN+MAXLEN]);
//char getoperator(int c);
static game_Line set_Line(int x1,int y1,int x2,int y2,int color);
void reset_calculator(CalcData* data);
int calculate1(char str1[MAXLEN],char str2[MAXLEN],char mark[2],char result_s[MAXLEN+MAXLEN]);
int stringchange(char *fi,char *ff,char *si,char *sf,char *mark);
void stringexchange(char *from,char *to);
static long pow10(int i);
void convert(char a[MAXLEN],char b[MAXLEN+MAXLEN]);


int calculator_new(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_HND           parent_win       = mfwParent(mfw_header());
    T_MFW_HND          win=calculator_create(parent_win);

    if( win NEQ NULL )
        SEND_EVENT(win, CALCULATOR_INIT, 0, 0);

    return MFW_EVENT_CONSUMED;
}

static T_MFW_HND calculator_create(MfwHnd parent_window)
{
    CalcData     * data = (CalcData *)ALLOC_MEMORY (sizeof (CalcData ));
    T_MFW_WIN  * win;

    if( data EQ NULL )
    {
        return NULL;
    }

    // Create window handler
    data->win = win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)calculator_win_cb);
    if( data->win EQ NULL )
    {

        return NULL;
    }
    // connect the dialog data to the MFW-window
    data->mmi_control.dialog = (T_DIALOG_FUNC)calculator_DialogCB;
    data->mmi_control.data   = data;
    win                      = ((T_MFW_HDR *)data->win)->data;
    win->user                = (void *)data;
    data->parent_win         = parent_window;
    //calculator_win = data->win;
    data->kbd =kbd_create(data->win,KEY_ALL,(T_MFW_CB)calculator_kbd_cb);
    //calc_win=data->win;

    winShow(data->win);

    return data->win;
}

static int calculator_win_cb(T_MFW_EVENT event,T_MFW_WIN * win)
{


    CalcData * data = (CalcData *)win->user;//tida edt data
    T_MFW_WIN * win_timer =((T_MFW_HDR *)data->parent_win)->data;
    int old_color,i;


    TRACE_EVENT("calculator_win_cb");

    if( event EQ MfwWinVisible )
    {
		DRAW_ICON(ICON_SPECIAL_BG);
        //drawIconByIcnAttr((MfwIcnAttr*)&icnSpBkgAttr,0);
        /******end**********/
        if( !strlen(data->result) )
        {
            strcpy(data->result,"0");
        }
        calcDisplay(data);
        // old_color=dspl_GetBkgColor();
        // dspl_SetBkgColor(0x00ffff);
        // dspl_Clear(0, 141, 120, 160);
        if( (data->result[0]=='0')&&(strlen((char*)data->result)==1) )
        {
            i=0;
        }
        else
        {
            i=strlen((char*)data->result);
        }
        /* 2004/05/18 yhf modify */
#if ( MAIN_LCD_SIZE==4 )
        if( strlen((char*)data->operate_number1)&&!((strlen(data->operate_number1)==1)&&(data->operate_number1[0]=='0'))&&!i )
            displaySoftKeys(TxtResult, TxtDelete);
        else
            displaySoftKeys(0, TxtSoftBack);
#endif
        //if(strlen((char*)data->operate_number1)&&!((strlen(data->operate_number1)==1)&&(data->operate_number1[0]=='0'))&&!i)
        //	displaySoftKeys(TxtResult, TxtDelete);
        //else
        //    displaySoftKeys(0, TxtSoftBack);
        // dspl_SetBkgColor(old_color);

        return 1;
    }
    return 0;  
}

static void calculator_DialogCB(T_MFW_HND win, USHORT event,  SHORT identifier, void *parameter)
{   
    T_MFW_WIN           *win_data   = ( (T_MFW_HDR *) win )->data;
    CalcData* data = (CalcData *) win_data->user;

    switch( event )
    {
    case CALCULATOR_INIT:
        reset_calculator(data);
        data->continues=FALSE;
        data->resultflag=TRUE;
        memset((char*)data->result,0,sizeof(data->result));
        memset((char*)data->SpecialResult,0,sizeof(data->SpecialResult));
        // 	strcpy((char*)data->result,"0");

        winShow(win);
        break;
    case CALC_EXIT:
        calculator_destroy(win);
        break;
    }
}

void calculator_destroy(MfwHnd own_window)
{
    T_MFW_WIN * win_data;
    CalcData   * data = NULL; 

    if( own_window )
    {

        win_data = ((T_MFW_HDR *)own_window)->data;
        if( win_data != NULL ) //PATCH TB
            data = (CalcData *)win_data->user;

        if( data )
        {

            win_delete (data->win);
            // Free Memory
            FREE_MEMORY ((void *)data, sizeof (CalcData));

        }
        else
        {

        }
    }
}

static int calculator_kbd_cb (MfwEvt e, MfwKbd *kc)
{

    T_MFW_HND win = mfw_parent(mfw_header());
    T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
    T_DISPLAY_DATA    display_info;
    CalcData* data = (CalcData *)win_data->user;//data
    char string[MAXLEN+MAXLEN];
    char tem_str[MAXLEN];
    char exponent[2];
    int i,j,k,l,EndOfPoint;
    BOOL t;

    switch( kc->code )
    {
    case KCD_0:
    case KCD_1:
    case KCD_2:
    case KCD_3:
    case KCD_4:
    case KCD_5:
    case KCD_6:
    case KCD_7:
    case KCD_8:
    case KCD_9:         
        if( !data->flag )
        {
            if( data->continues==TRUE )
            {
                data->continues=FALSE;
                memset((char*)data->result,0,sizeof(data->result));
            }
            TRACE_EVENT("data->flag==FALSE");
            if( strlen(data->operate_number1)<MAX_OPTNUMBER )
                if( !data->pointflag )
                {
                    if( data->index<MAX_NUMBER )
                    {
                        if( (data->operate_number1[0]=='0')&&data->index )
                            data->index--;
                        data->operate_number1[data->index]='0'+kc->code;
                        data->index++;
                    }
                }
                else
                {
                    if( data->afterpoint<5 )
                    {
                        data->operate_number1[data->index]='0'+kc->code;
                        data->afterpoint++;
                        data->index++;
                    }
                    else break;
                }
            //data->opera='\0';
        }
        else
        {
            TRACE_EVENT("data->flag==TRUE");
            if( strlen(data->operate_number2)<15 )
                if( !data->pointflag )
                {
                    if( data->index<MAX_NUMBER )
                    {
                        if( (data->operate_number2[0]=='0')&&data->index )
                            data->index--;
                        data->operate_number2[data->index]='0'+kc->code;
                        data->index++;
                    }
                }
                else
                {
                    if( data->afterpoint<5 )
                    {
                        data->operate_number2[data->index]='0'+kc->code;
                        data->afterpoint++;
                        data->index++;
                    }
                }
        }
        data->resultflag=FALSE;
        data->operaflag=FALSE;
        winShow(win);
        break;
    case KCD_STAR:
        if( data->flag==FALSE )
        {
            if( (!strlen(data->operate_number1))&&(data->index) )
            {
                data->operate_number1[data->index]='-';
                data->index++;

            }
            else
            {
                memset(tem_str,0,sizeof(tem_str));
                if( data->operate_number1[0]=='-' )
                {
                    strcpy( tem_str,data->operate_number1+1);
                    strcpy(data->operate_number1,tem_str);
                    data->index--;
                }
                else
                {
                    strcpy(tem_str,"-");
                    strcat(tem_str,data->operate_number1);
                    strcpy(data->operate_number1,tem_str);
                    data->index++;
                }
            }
        }
        else
        {
            if( (!strlen(data->operate_number2))&&(data->index) )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -