- #include "stm32f10x.h"
- #include <stdio.h>
- #include "tsc2046.h"
- #include "GUI.h"
- #include "Time.h"
- #include "WM.h"
- #include "BUTTON.h"
- #include "EDIT.h"
- #include "FRAMEWIN.h"
- #include <stddef.h>
- #include <string.h>
- #include "DIALOG.h"
- #include <stdlib.h>
- #include "Calculator.h"
- #define GUI_ID_BUTTON10 GUI_ID_USER+1
- #define GUI_ID_BUTTON11 GUI_ID_USER+2
- #define GUI_ID_BUTTON12 GUI_ID_USER+3
- #define GUI_ID_BUTTON13 GUI_ID_USER+4
- #define GUI_ID_BUTTON14 GUI_ID_USER+5
- #define GUI_ID_BUTTON15 GUI_ID_USER+6
- #define GUI_ID_BUTTON16 GUI_ID_USER+7
- #define GUI_ID_BUTTON17 GUI_ID_USER+8
- #define GUI_ID_BUTTON18 GUI_ID_USER+9
- #define GUI_ID_BUTTON19 GUI_ID_USER+10
- char DisplayContent[100];
- WM_HWIN CalculatorDlg;
- void OperateLeftToRight(char *buf);
- typedef struct{
- double operate1; //第一個操作數
- double operate2; //第二個操作數
- double result; //操作結果
- uint8_t operatenum; //當前操作數
- #define ADD 0x01 //加法
- #define SUB 0x02 //減法
- #define MUL 0x04 //乘法
- #define DIV 0x08 //除法
- #define EQUAL 0x10 //等于
- #define NUMBER 0x20 //數字
- #define OPERATE 0x40 //運算符
- #define DOT 0x80 //小數點
- uint8_t pressedsymbol; //當前按下的符號
- uint8_t IllegalExpression; //是否是合法的表達式
- char keyval; //當前按下的按鈕
- uint8_t close;
- }CALCULATE;
- CALCULATE Calculate={
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- };
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
- { FRAMEWIN_CreateIndirect, "Calculator", 0, 0, 0, 240,320,FRAMEWIN_CF_ACTIVE,0},
- { BUTTON_CreateIndirect, "7", GUI_ID_BUTTON0, 10, 100, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "8", GUI_ID_BUTTON1, 65, 100, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "9", GUI_ID_BUTTON2, 120, 100, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "*", GUI_ID_BUTTON3, 175, 100, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "4", GUI_ID_BUTTON4, 10, 140, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "5", GUI_ID_BUTTON5, 65, 140, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "6", GUI_ID_BUTTON6, 120, 140, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "/", GUI_ID_BUTTON7, 175, 140, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "1", GUI_ID_BUTTON8, 10, 180, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "2", GUI_ID_BUTTON9, 65, 180, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "3", GUI_ID_BUTTON10, 120, 180, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "+", GUI_ID_BUTTON11, 175, 180, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "0", GUI_ID_BUTTON12, 10, 220, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "=", GUI_ID_BUTTON13, 65, 220, 45, 25, 0,0},
- { BUTTON_CreateIndirect, ".", GUI_ID_BUTTON14, 120, 220, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "-", GUI_ID_BUTTON15, 175, 220, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "Ac", GUI_ID_BUTTON16, 10,260,45, 25, 0,0},
- { BUTTON_CreateIndirect, "", GUI_ID_BUTTON17, 65, 260, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "", GUI_ID_BUTTON18, 120, 260, 45, 25, 0,0},
- { BUTTON_CreateIndirect, "", GUI_ID_BUTTON19, 175,260,45, 25, 0,0},
- { EDIT_CreateIndirect, 0, GUI_ID_EDIT0, 16, 3, 200,38, 0,0}
- };
- static void InitDialog(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = pMsg->hWin;
- //FRAMEWIN
- FRAMEWIN_SetClientColor(hWin,GUI_GREEN);
- FRAMEWIN_SetFont(hWin,&GUI_FontComic18B_1);
- FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
- FRAMEWIN_AddCloseButton(hWin,FRAMEWIN_BUTTON_RIGHT,10);
- FRAMEWIN_SetTitleHeight(hWin,18);
- //GUI_ID_BUTTON0
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),BUTTON_CI_UNPRESSED,GUI_CYAN);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON1
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON1),BUTTON_CI_UNPRESSED,GUI_CYAN);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON1),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON2
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON2),BUTTON_CI_UNPRESSED,GUI_CYAN);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON2),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON3
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON3),BUTTON_CI_UNPRESSED,GUI_RED);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON3),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON4
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON4),BUTTON_CI_UNPRESSED,GUI_CYAN);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON4),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON5
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON5),BUTTON_CI_UNPRESSED,GUI_CYAN);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON5),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON6
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON6),BUTTON_CI_UNPRESSED,GUI_CYAN);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON6),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON7
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON7),BUTTON_CI_UNPRESSED,GUI_RED);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON7),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON8
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON8),BUTTON_CI_UNPRESSED,GUI_CYAN);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON8),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON9
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON9),BUTTON_CI_UNPRESSED,GUI_CYAN);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON9),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON10
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON10),BUTTON_CI_UNPRESSED,GUI_CYAN);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON10),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON11
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON11),BUTTON_CI_UNPRESSED,GUI_RED);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON11),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON12
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),BUTTON_CI_UNPRESSED,GUI_CYAN);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON13
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),BUTTON_CI_UNPRESSED,GUI_CYAN);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON14
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),BUTTON_CI_UNPRESSED,GUI_CYAN);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON15
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),BUTTON_CI_UNPRESSED,GUI_RED);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),&GUI_FontComic24B_1);
- //GUI_ID_BUTTON16
- BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),BUTTON_CI_UNPRESSED,GUI_RED);
- BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),&GUI_FontComic24B_1);
- //GUI_ID_EDIT0
- EDIT_SetMaxLen(WM_GetDialogItem(hWin,GUI_ID_EDIT0),100);
- EDIT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_EDIT0),EDIT_CI_ENABLED,GUI_WHITE);
- EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT0),&GUI_FontComic18B_1);
- EDIT_SetTextAlign(WM_GetDialogItem(hWin,GUI_ID_EDIT0),GUI_TA_VCENTER|GUI_TA_RIGHT);
- EDIT_SetText(WM_GetDialogItem(hWin,GUI_ID_EDIT0),DisplayContent);
- }
- static void _cbCallback(WM_MESSAGE * pMsg)
- {
- uint16_t NCode, Id;
- char str[8];
- uint8_t i;
- WM_HWIN hWin = pMsg->hWin;
- switch (pMsg->MsgId)
- {
- case WM_DELETE:
- Calculate.close=1;
- break;
- case WM_INIT_DIALOG:
- InitDialog(pMsg);
- break;
- case WM_NOTIFY_PARENT:
- Id = WM_GetId(pMsg->hWinSrc); //控件的id
- NCode = pMsg->Data.v; //通知代碼
- switch (Id)
- {
- case GUI_ID_OK:
- if(NCode==WM_NOTIFICATION_RELEASED){
- GUI_EndDialog(hWin, 0);
- }
- break;
- case GUI_ID_CANCEL:
- if(NCode==WM_NOTIFICATION_RELEASED){
- GUI_EndDialog(hWin, 1);
- }
- break;
- case GUI_ID_BUTTON0: // 7
- if(NCode==WM_NOTIFICATION_RELEASED){
- Calculate.keyval='7';
- Calculate.pressedsymbol |= NUMBER;
- }
- break;
- case GUI_ID_BUTTON1: // 8
- if(NCode==WM_NOTIFICATION_RELEASED){
- Calculate.keyval='8';
- Calculate.pressedsymbol |= NUMBER;
- }
- break;
- case GUI_ID_BUTTON2:// 9
- if(NCode==WM_NOTIFICATION_RELEASED){
- Calculate.keyval='9';
- Calculate.pressedsymbol |= NUMBER;
- }
- break;
- case GUI_ID_BUTTON4: // 4
- if(NCode==WM_NOTIFICATION_RELEASED){
- Calculate.keyval='4';
- Calculate.pressedsymbol |= NUMBER;
- }
- break;
- case GUI_ID_BUTTON5: //5
- if(NCode==WM_NOTIFICATION_RELEASED){
- Calculate.keyval='5';
- Calculate.pressedsymbol |= NUMBER;
- }
- break;
- case GUI_ID_BUTTON6:// 6
- if(NCode==WM_NOTIFICATION_RELEASED){
- Calculate.keyval='6';
- Calculate.pressedsymbol |= NUMBER;
- }
- break;
- case GUI_ID_BUTTON8://1
- if(NCode==WM_NOTIFICATION_RELEASED){
- Calculate.keyval='1';
- Calculate.pressedsymbol |= NUMBER;
- }
- break;
- case GUI_ID_BUTTON9://2
- if(NCode==WM_NOTIFICATION_RELEASED){
- Calculate.keyval='2';
- Calculate.pressedsymbol |= NUMBER;
- }
- break;
- case GUI_ID_BUTTON10://3
- if(NCode==WM_NOTIFICATION_RELEASED){
- Calculate.keyval='3';
- Calculate.pressedsymbol |= NUMBER;
- }
- break;
- case GUI_ID_BUTTON12://0
- if(NCode==WM_NOTIFICATION_RELEASED){
- Calculate.keyval='0';
- Calculate.pressedsymbol |= NUMBER;
- }
- break;
- case GUI_ID_BUTTON14:// .
- if(NCode==WM_NOTIFICATION_RELEASED){
- if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&DOT)!=DOT){
- Calculate.keyval='.';
- Calculate.pressedsymbol |= DOT;
- Calculate.pressedsymbol &= ~NUMBER;
- strcat(DisplayContent,&Calculate.keyval);
- EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
- Calculate.keyval=0;
- }
- }
- break;
- case GUI_ID_BUTTON7:// /
- if(NCode==WM_NOTIFICATION_RELEASED){
- if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&OPERATE)!=OPERATE){
- Calculate.keyval='/';
- Calculate.pressedsymbol |= OPERATE;
- Calculate.pressedsymbol &= ~NUMBER;
- Calculate.pressedsymbol &= ~DOT; //接下來可以輸入小數點
- strcat(DisplayContent,&Calculate.keyval);
- EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
- Calculate.keyval=0;
- }
- }
- break;
- case GUI_ID_BUTTON3:// *
- if(NCode==WM_NOTIFICATION_RELEASED){
- if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&OPERATE)!=OPERATE){
- Calculate.keyval='*';
- Calculate.pressedsymbol |= OPERATE;
- Calculate.pressedsymbol &= ~NUMBER;
- Calculate.pressedsymbol &= ~DOT; //接下來可以輸入小數點
- strcat(DisplayContent,&Calculate.keyval);
- EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
- Calculate.keyval=0;
- }
- }
- break;
- case GUI_ID_BUTTON15:// -
- if(NCode==WM_NOTIFICATION_RELEASED){
- if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&OPERATE)!=OPERATE){
- Calculate.keyval='-';
- Calculate.pressedsymbol |= OPERATE;
- Calculate.pressedsymbol &= ~NUMBER;
- Calculate.pressedsymbol &= ~DOT; //接下來可以輸入小數點
- strcat(DisplayContent,&Calculate.keyval);
- EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
- Calculate.keyval=0;
- }
- }
- break;
- case GUI_ID_BUTTON11:// +
- if(NCode==WM_NOTIFICATION_RELEASED){
- if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&OPERATE)!=OPERATE){
- Calculate.keyval='+';
- Calculate.pressedsymbol |= OPERATE;
- Calculate.pressedsymbol &= ~NUMBER;
- Calculate.pressedsymbol &= ~DOT; //接下來可以輸入小數點
- strcat(DisplayContent,&Calculate.keyval);
- EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
- Calculate.keyval=0;
- }
- }
- break;
- case GUI_ID_BUTTON16:// c
- if(NCode==WM_NOTIFICATION_RELEASED){
- strcpy(DisplayContent,"");
- Calculate.result=0;
- EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
- Calculate.pressedsymbol &= ~NUMBER;
- Calculate.keyval=0;
- }
- break;
- case GUI_ID_BUTTON13:// =
- if(NCode==WM_NOTIFICATION_RELEASED)
- {
- if(strlen(DisplayContent)>0)
- {
- OperateLeftToRight(DisplayContent);
- if((Calculate.result-(uint16_t)Calculate.result)!=0)
- {
- strcpy(DisplayContent,"");
- sprintf(DisplayContent,"%d",(uint16_t)Calculate.result);
- strcat(DisplayContent,".");
- sprintf(str,"%d",(uint16_t)((Calculate.result-(uint16_t)Calculate.result)*100000));
- strcat(DisplayContent,str);
- for(i=strlen(DisplayContent)-1;i>=0;i--) //將小數點后多余的0去掉
- {
- if(DisplayContent[i]!='0')
- {
- DisplayContent[i+1]='\0';
- break;
- }
- }
- }
- else
- {
- strcpy(DisplayContent,"");
- sprintf(DisplayContent,"%d",(uint16_t)Calculate.result);
- }
- EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
- Calculate.pressedsymbol &= ~DOT; //接下來可以輸入小數點
- Calculate.keyval=0;
- }
- }
- break;
- }
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
- void Operate(double numb1,double numb2,char symbol)
- {
- switch(symbol)
- {
- case '+':
- numb1 += numb2;
- Calculate.result=numb1;
- //printf("Calculate.result:%f\r\n",result);
- break;
- case '-':
- numb1 -= numb2;
- Calculate.result=numb1;
- //printf("Calculate.result:%f\r\n",result);
- break;
- case '*':
- numb1 *= numb2;
- Calculate.result=numb1;
- //printf("Calculate.result:%f\r\n",result);
- break;
- case '/':
- if(numb2==0)
- {
- Calculate.IllegalExpression = 1;
- }else
- {
- numb1 = (double)numb1/(double)numb2;
- Calculate.result=numb1;
- //printf("Calculate.result:%f\r\n",result);
- }
- break;
- default:
- break;
- }
- }
- /*
- ***************************************************************
- *函數名:IsOperator
- *功能: 判斷此字符是不是運算符
- *參數:
- *返回值:0:是 1:不是
- ****************************************************************
- */
- static uint8_t IsOperator(char opt)
- {
- if(opt=='+'||opt=='-'||opt=='*'||opt=='/')
- {
- return 0;
- }
- return 1;
- }
- /*
- ***************************************************************
- *函數名:OperateLeftToRight
- *功能: 從左到右計算表達式,不考慮優先級 輸入的表達式必須合法
- *參數:
- *返回值:
- ****************************************************************
- */
- void OperateLeftToRight(char *buf)
- {
- char Operatesym;
- double tmpnum1=1,tmpnum2=1,output1=0,output2=0;
- uint8_t i=0;
- //temp = (char*)mem_malloc(100);
- while(*buf)
- {
- if(!IsOperator(*buf)) //判斷是不是運算符
- {
- i++;
- Operatesym = *buf; //得到操作符
- buf++;
- }
- else
- {
- if(i==0) //第一個操作數
- {
- while(*buf>='0' && *buf<='9')
- output1=output1*10+(*buf++)-'0'; //整數部分
- if(*buf=='.')
- {
- buf++;
- while(*buf>='0' && *buf<='9') //*str 是數字
- {
- tmpnum1/=10;
- output1=output1+((*buf++)-'0')*tmpnum1;//小數部分
- }
- }
- }
- if(i==1) //第二個操作數
- {
- i=0;
- while(*buf>='0' && *buf<='9')
- output2=output2*10+(*buf++)-'0'; //整數部分
-
- if(*buf=='.')
- {
- buf++;
- while(*buf>='0' && *buf<='9') //*str 是數字
- {
- tmpnum2/=10;
- output2=output2+((*buf++)-'0')*tmpnum2;//小數部分
- }
- }
- }
- }//else
- }//while
- Operate(output1,output2,Operatesym);
- //mem_free(temp);
- }
- /*
- ***************************************************************
- *函數名:Calculator
- *功能: 計算器功能
- *參數: 無
- *返回值:無
- ****************************************************************
- */
- void Calculator(void)
- {
- strcpy(DisplayContent,"");
- //WM_SetCreateFlags(WM_CF_MEMDEV); ////后面加的
- CalculatorDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback,0, 0, 0);
- while(1){
- if((Calculate.pressedsymbol&NUMBER)==NUMBER)
- {
- strcat(DisplayContent,&Calculate.keyval);
- EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
- Calculate.keyval=0;
- Calculate.pressedsymbol &= ~OPERATE;
- }
- if(Calculate.close){
- Calculate.close = 0;
- break;
- }
- GUI_Delay(10);
- }
- }
復制代碼
|