sasasa
/***************************************************************************************** 文件:app_touch.c 编者:张永辉 2013年6月24日 2013年6月25日 去掉了开机密码 *****************************************************************************************/ #include "includes.h" #include "GUI.h" #include "bsp.h" #include "bsptouch.h" #include "bspdbg.h" #include "jpgfile.h" #include "JpegToBmp.h" #include "\embed\source\lib\basetype.h" #include "fun.h" #include "app_touch.h" /***************************************************************************************** 触摸屏按下检测 *****************************************************************************************/ #define TOUCHC_NUM 17 //检测点数目 static struct g_CheakPiontChekd { u32 beIsin; //上次是否在本范围内 u32 x0; u32 y0; u32 x1; u32 y1; }chd[TOUCHC_NUM]; //***********************设置要检测的点*************************************************** void TouchcSet(u32 index,u32 x0,u32 y0,u32 x1,u32 y1) { chd[index].x0 = x0; chd[index].y0 = y0; chd[index].x1 = x1; chd[index].y1 = y1; } /*************************检测某个点的按下,或者放开事件********************************** 返回: 0没有发生 1有进入该区域 2有离开该区域 */ int TouchcClickUpDown(u32 index) { u32 x,y; u32 yes = 0; if (index >= TOUCHC_NUM) { return 0; } x = BspTouchGetX(); y = BspTouchGetY(); //本次在范围内 if((x > chd[index].x0 && x < chd[index].x1) && (y > chd[index].y0 && y < chd[index].y1)) { //若上次不在范围内===被按下了 if(chd[index].beIsin == 0) { yes = 1; if(index !=0) //0号测试用的,不叫 { //蜂鸣器声音 BspBeepOne(); } } chd[index].beIsin = 1; }else //本次不在范围内 { //若上次在范围内===被按松开了 if(chd[index].beIsin == 1) { yes = 2; } chd[index].beIsin = 0; //不在范围内 } return yes; } /*************************显示图片,并与某个键号绑定************************************** 参数:keyNum == 0时表示不帮键号 注: 绑定后,便可以根据键号,查询是否按下或放开了 VS2008使用函数此处不能命中,于是用宏了 */ GUI_JPEG_INFO jpeginfo; #define TouchcJpeg(pDATA,X0,Y0,keyNum)\ {\ if(keyNum>=0)\ {\ GUI_JPEG_Draw(pDATA,sizeof(pDATA),X0,Y0);\ if(keyNum > 0 )\ {\ GUI_JPEG_GetInfo(pDATA,sizeof(pDATA),&jpeginfo);\ TouchcSet(keyNum,X0,Y0,(X0+jpeginfo.XSize),(Y0+jpeginfo.YSize));\ }\ }\ } //从内存调用解码后的数据,直接显示,在M3上显示速度明显提高 //参数:keyNum == 0时表示不绑定键号 //换成本函数后,毛击VS2008会死机,原因不明 void TouchcBmp(GUI_BITMAP * pBMP,int X0,int Y0,int keyNum) //TouchcBmp(BMP { int x1; int y1; x1 = X0 + pBMP->XSize; y1 = Y0+pBMP->YSize; if (keyNum >= 0) { //从内存显示图片 GUI_DrawBitmap(pBMP,X0,Y0); if (keyNum > 0) { //绑定建号 TouchcSet(keyNum,X0,Y0,x1,y1); } } } //输入框 void TouchcInput(int X0,int Y0,int X1,int Y1,int keyNum) { //实验 //GUI_DrawLine(X0,Y0,X1,Y0); //GUI_DrawLine(X1,Y0,X1,Y1); //GUI_DrawLine(X0,Y0,X0,Y1); //GUI_DrawLine(X0,Y1,X1,Y1); TouchcSet(keyNum,X0,Y0,X1,Y1); } /***************************************************************************************** 功能函数支持 *****************************************************************************************/ void StateFun_j_jar_n(void); void TouchcJpeg_beep(void); u32 StateFun_PreSent_Covert(u32 i);//将百分比转换成指针的角度 void StateFun_Press_n(void); //主页面要显示的指针和数值 void StateFun_Press_4page(void); //4页面要显示的 指针和数值 void StateFun_GasCheck(void); //气体检测时要显示的数值 bool StateFun_GasCheck_isAlm(void); bool StateHardErrCheck_fun_IsAnyErr(void); bool StateSysAlarm_fun_IsAnyAlm(void); void StateFun_DisAllFunKey(u32 KeyIndex); //显示功能按键 void TouchcJpeg_LngChromaAlm(u32 Index); //气体浓度报警图标,报警时显示红色图标 void TouchcJpeg_HardCheck(u32 KeyIndex); //硬件故障,报警时显示红色图标 void TouchcBmp_SysAlm(u32 KeyIndex); //系统报警,报警时显示红色图标 void TouchcJpeg_Red_bmp_alm(void); void BeepForAllAlm(void); /***************************************************************************************** 状态机 *****************************************************************************************/ //------------------状态定义------------ #define C_SETUP_LOG 1 //启动显示LOG #define C_MAIN_PAGE 2 //主页面状态 #define C_PASSWD 3 //输入密码状态 #define C_GAS_CHECK 4 //检测 #define C_SYS_ALARM 5 //系统报警 #define C_HARD_ERR_CHECK 6 // #define C_4PAGE 7 //4页面 #define C_PASSWD_SET 8 //密码设置 #define C_4PAGE_SET 9 //气瓶参数设置 #define C_SYS_SET 10 //系统设置 #define C_IDLE 11 //启动显示LOG #define C_KEYBORD 12 //启动键盘输入 //------------------状态声明------------ u32 StateSetUp(void); u32 StateMainPage(void); u32 StatePassWd(void); u32 StateGasCheck(void); u32 StateSysAlarm(void); u32 StateHardErrCheck(void); u32 State4page(void); u32 StatePasswdSet(void); u32 State4pageSet(void); u32 StateSysSet(void); u32 StateKeyBord(void); //------------------变量---------------- u32 StateBc = C_SETUP_LOG; //前一个状态 u32 State = C_SETUP_LOG; //当前状态 u32 MainPageJarNum = 1; //在主页面显示的瓶号 u32 StatNum = 0; //进入某个状态的计数器,刚进入时等于0。 u32 StateChgReq = 0; //状态切换申请,由子状态发起,主状态在切换前清除 u32 StateMsgForm = 0; //消息发出者 == 状态值(状态间消息传递) u32 StateMsg1; //消息内容 u32 StateMsg2; u32 StateMsg3; u32 refurbish1; //需要刷新的量 u32 refurbish2; u32 refurbish3; u32 refurbish4; float refurbish1f; float refurbish2f; float refurbish3f; float refurbish4f; float refurbish5f; float refurbish6f; float refurbish7f; float refurbish8f; //**************************************状态机调度函数************************************ //调用总入口,每20ms调用一次 void app_touch_test(void) { //---------------按键测试函数------- u32 x,y; BspTouchBeginOnce(); x = BspTouchGetX(); y = BspTouchGetY(); TouchcSet(0,0,0,480,272); if(TouchcClickUpDown(0)) { DBG_S("xxx = ");DBG_U32N(x); DBG_S("yyy = ");DBG_U32N(y); } //--------------状态机开始---------- switch(State) { case C_SETUP_LOG: State = StateSetUp(); break; case C_IDLE: case C_MAIN_PAGE: State = StateMainPage(); break; case C_PASSWD: State = StatePassWd(); break; case C_GAS_CHECK: State = StateGasCheck(); break; case C_SYS_ALARM: State = StateSysAlarm(); break; case C_HARD_ERR_CHECK: State = StateHardErrCheck(); break; case C_4PAGE: State = State4page(); break; case C_PASSWD_SET: State = StatePasswdSet(); break; case C_4PAGE_SET: State = State4pageSet(); break; case C_SYS_SET: State= StateSysSet(); break; case C_KEYBORD: State= StateKeyBord(); break; default: State = C_MAIN_PAGE; break; } //--------------状态改变时的操作---- if(StateBc != State) { StateBc = State; StatNum = 0; //保证刚进入状态时为0 }else { StatNum++; } } /***************************************键盘输入*****************************************/ /* 入参: StateMsgForm, 键盘输入结束后要返回的地方 StateMsg1 键盘X位置 StateMsg2 键盘Y位置 输出: StateMsgForm = C_KEYBORD StateMsg1 = 0 取消 StateMsg1 = 1 确定 StateMsg2; 确定时,键盘输入的数值 */ #define KEYH 40 //每个键盘格子的长,宽 #define KEYL 40 static int keyvaule = 0; static int keyvaulelen = 0; u32 StateKeyBord(void) { u32 Click; u32 i; //在此可以检测 StateMsgForm 判断键盘请求来源 //刚开始进本状态 if (StatNum==0) { //显示背景 TouchcBmp(&BMP.j_keybord,StateMsg1,StateMsg2,0); TouchcInput(StateMsg1+137,StateMsg2+0,StateMsg1+167,StateMsg2+22,16);//关闭 //格子开始的相对位置 StateMsg1 +=3; StateMsg2 +=50; TouchcInput(StateMsg1 ,StateMsg2,StateMsg1+KEYH ,StateMsg2+KEYL,1); //按键1 TouchcInput(StateMsg1+KEYH ,StateMsg2,StateMsg1+KEYH*2,StateMsg2+KEYL,2); //按键2 TouchcInput(StateMsg1+KEYH*2,StateMsg2,StateMsg1+KEYH*3,StateMsg2+KEYL,3); //按键3 TouchcInput(StateMsg1+KEYH*3,StateMsg2,StateMsg1+KEYH*4,StateMsg2+KEYL,11); //按键 CLR StateMsg2 +=KEYL; TouchcInput(StateMsg1 ,StateMsg2,StateMsg1+KEYH ,StateMsg2+KEYL,4); //按键4 TouchcInput(StateMsg1+KEYH ,StateMsg2,StateMsg1+KEYH*2,StateMsg2+KEYL,5); //按键5 TouchcInput(StateMsg1+KEYH*2,StateMsg2,StateMsg1+KEYH*3,StateMsg2+KEYL,6); //按键6 TouchcInput(StateMsg1+KEYH*3,StateMsg2,StateMsg1+KEYH*4,StateMsg2+KEYL,12); //按键 回退 StateMsg2 +=KEYL; TouchcInput(StateMsg1 ,StateMsg2,StateMsg1+KEYH ,StateMsg2+KEYL,7); //按键7 TouchcInput(StateMsg1+KEYH ,StateMsg2,StateMsg1+KEYH*2,StateMsg2+KEYL,8); //按键8 TouchcInput(StateMsg1+KEYH*2,StateMsg2,StateMsg1+KEYH*3,StateMsg2+KEYL,9); //按键9 TouchcInput(StateMsg1+KEYH*3,StateMsg2,StateMsg1+KEYH*4,StateMsg2+KEYL,13); //按键 - 取消 StateMsg2 +=KEYL; TouchcInput(StateMsg1 ,StateMsg2,StateMsg1+KEYH ,StateMsg2+KEYL,10); //按键10 0 TouchcInput(StateMsg1+KEYH ,StateMsg2,StateMsg1+KEYH*2,StateMsg2+KEYL,14); //按键11 . TouchcInput(StateMsg1+KEYH*2,StateMsg2,StateMsg1+KEYH*3+KEYH,StateMsg2+KEYL,15);//按键12 确定 占2个格子 //还原其值 StateMsg1 -= 3; StateMsg2 -=50; StateMsg2 -=KEYL*3; GUI_SetTextMode(GUI_TEXTMODE_NORMAL); GUI_SetColor(0); GUI_SetBkColor((GUI_COLOR)-1); // //GUI_SetTextMode(GUI_TEXTMODE_TRANS); //文本模式==透明模式 GUI_SetFont(&GUI_Font16B_ASCII); //数字大小 DBG_S("State = StateKeyBord.\n"); //键值初始化 keyvaulelen = 0; keyvaule = 0; } //输入数字检测 for (i = 1;i<= 10;i++) { Click = TouchcClickUpDown(i); if(Click==1) { //密码长度限制 if (keyvaulelen>=6) { break; } keyvaulelen++; keyvaule = keyvaule*10 + i%10; //10代表0 DBG_U32N(i); GUI_DispDecAt(keyvaule,StateMsg1+20,StateMsg2+30,keyvaulelen); } } //清除 Click = TouchcClickUpDown(11); if(Click==1) { DBG_U32N(11); keyvaule = 0; keyvaulelen = 0; GUI_DispStringAt(" ",StateMsg1+20,StateMsg2+30); } //回退 Click = TouchcClickUpDown(12); if(Click==1) { //密码长度限制 if (keyvaulelen > 0) { keyvaule = keyvaule/10; keyvaulelen--; DBG_U32N(11); GUI_DispStringAt(" ",StateMsg1+20,StateMsg2+30); GUI_DispDecAt(keyvaule,StateMsg1+20,StateMsg2+30,keyvaulelen); //GUI_SetTextMode(GUI_TEXTMODE_TRANS); //文本模式==透明模式 } } //取消 Click = TouchcClickUpDown(13); if(Click==1) { StateChgReq = StateMsgForm; //返回原来的状态 StateMsgForm = C_KEYBORD; StateMsg1 = 0; //表示取消 return C_IDLE; } //关闭按钮 Click = TouchcClickUpDown(16); //返回原来的状态 if(Click==1) { StateChgReq = StateMsgForm; //返回原来的状态 StateMsgForm = C_KEYBORD; StateMsg1 = 0; //表示取消 return C_IDLE; } //确定 Click = TouchcClickUpDown(15); //返回原来的状态 if(Click==1) { StateChgReq = StateMsgForm; StateMsgForm = C_KEYBORD; StateMsg1 = 1; //表示确定 StateMsg2 = keyvaule; //返回键值 return C_IDLE; } return C_KEYBORD; } //**************************************主页面******************************************** u32 StateMainPage(void) { u32 Click; //状态切换申请 if(StateChgReq != 0) { switch(StateChgReq) { //此三个状态会相互转移,或回到主界面 case C_SYS_SET: StateChgReq = 0; return C_SYS_SET; case C_4PAGE_SET: StateChgReq = 0; return C_4PAGE_SET; case C_PASSWD_SET: StateChgReq = 0; return C_PASSWD_SET; case C_KEYBORD: StateChgReq = 0; return C_KEYBORD; case C_PASSWD: StateChgReq = 0; return C_PASSWD; case C_MAIN_PAGE: StateChgReq = 0; return C_MAIN_PAGE; default: StateChgReq = 0; break; } } //显示主页面 if (StatNum==0) { //主页面 TouchcBmp(&BMP.j_manpage,0,0,0); StateFun_j_jar_n(); //显示第n瓶 JarSetnSet(MainPageJarNum); //设置瓶号 StateFun_Press_n(); //显示瓶子压力,应该有刷新 //显示功能按钮,并绑定按键号 TouchcBmp(&BMP.j_but_forward_up, 0 ,226,1); TouchcBmp(&BMP.j_but_back_up , 60 ,226,2); TouchcBmp(&BMP.j_but_4page_up , 120,226,3); TouchcJpeg_LngChromaAlm(4);//TouchcBmp(&BMP.j_but_gas_up , 180,226,4); TouchcJpeg_HardCheck(5);//TouchcJpeg( j_but_had_check_up, 240,226,5); TouchcBmp_SysAlm(6);//TouchcBmp(&BMP.j_but_alarm_up, 300,226,6); TouchcJpeg_beep(); //显示声音是否关闭 TouchcBmp(&BMP.j_but_set_up, 420,226,8); DBG_S("State = StateMainPage\n"); } //界面刷新 if (StatNum%25==10) { StateFun_Press_n(); //是否显示红色图标刷新 //TouchcJpeg_Red_bmp_alm(); TouchcJpeg_LngChromaAlm(0); TouchcJpeg_HardCheck(0); TouchcBmp_SysAlm(0); //检测是否有异常,然后蜂鸣器报警 BeepForAllAlm(); } //根据按键号,检测每个按键的按下、放开状态 //【按键1】 瓶号切换:递增 Click = TouchcClickUpDown(1); if(Click==1) //按下 { TouchcBmp(&BMP.j_but_forward_down,0,226,0); } if(Click==2) //放开 { TouchcBmp(&BMP.j_but_forward_up,0,226,0); MainPageJarNum++; //MainPageJarNum=[1 4] if(MainPageJarNum > JarNumberGet()) //根据设置,最多显示不同的号 { MainPageJarNum = 1; } StatNum = (u32)-1; //如此,会刷新本界面 } //【按键2】瓶号切换:递减 Click = TouchcClickUpDown(2); if(Click==1) //按下 { TouchcBmp(&BMP.j_but_back_down,60,226,0); } if(Click==2) //放开 { TouchcBmp(&BMP.j_but_back_up,60,226,0); MainPageJarNum--; if(MainPageJarNum <= 0) { MainPageJarNum = JarNumberGet(); } StatNum = (u32)-1; //如此,会刷新本界面 } //【按键3】显示4个页面 Click = TouchcClickUpDown(3); if(Click==1) //按下 { TouchcBmp(&BMP.j_but_4page_down , 120,226,0); } if(Click==2) //放开 { return C_4PAGE; } //【按键4】气体检测 Click = TouchcClickUpDown(4); if(Click==1) //按下 { TouchcBmp(&BMP.j_but_gas_down , 180,226,0); } if(Click==2) //放开 { return C_GAS_CHECK; } //【按键5】 硬件故障检测 Click = TouchcClickUpDown(5); if(Click==1) //按下 { TouchcBmp(&BMP.j_but_had_check_down,240,226,0); } if(Click==2) //放开 { return C_HARD_ERR_CHECK; } //【按键6 】系统报警检测 Click = TouchcClickUpDown(6); if(Click==1) //按下 { TouchcBmp(&BMP.j_but_alarm_down, 300,226,0); } if(Click==2) //放开状态转移 { return C_SYS_ALARM; } //【按键7】 关闭/开启声音 Click = TouchcClickUpDown(7); if(Click==1) //按下 { if (BeepIsOnGet()) { BeepSet(false); }else { BeepSet(true); } TouchcJpeg_beep(); } //【按键8】 系统设置 Click = TouchcClickUpDown(8); if(Click==1) //按下 { TouchcBmp(&BMP.j_but_set_down, 420,226,0); } if(Click==2) //放开 { //return C_SYS_SET; //可以直接进入该界面 return C_PASSWD; } return C_IDLE; } //**************************************系统设置****************************************** #define CC 3 //是否显示指针 void StateSysSet_IsDisplayPointer(bool yes) { if(yes == false) { TouchcBmp(&BMP.j_but_no,135,145,13); TouchcBmp(&BMP.j_but_yes,213,145,14); }else { TouchcBmp(&BMP.j_but_yes,135,145,13); TouchcBmp(&BMP.j_but_no,213,145,14); } } //是否可燃气体检测 void StateSysSet_IsGasCkeck(bool yes) { if(yes == false) { TouchcBmp(&BMP.j_but_no,135,113,11); TouchcBmp(&BMP.j_but_yes,213,113,12); }else { TouchcBmp(&BMP.j_but_yes,135,113,11); TouchcBmp(&BMP.j_but_no,213,113,12); } } //是否低液位报警 void StateSysSet_IsLowAlarm(bool yes) { if(yes == false) { TouchcBmp(&BMP.j_but_no,135,81,9); TouchcBmp(&BMP.j_but_yes,213,81,10); }else { TouchcBmp(&BMP.j_but_yes,135,81,9); TouchcBmp(&BMP.j_but_no,213,81,10); } } //复选框:瓶子个数 void StateSysSet_JarNumber(u32 num) { //瓶个数选择 TouchcBmp(&BMP.j_but_no,135,48,3); TouchcBmp(&BMP.j_but_no,213,48,4); TouchcBmp(&BMP.j_but_no,289,48,5); TouchcBmp(&BMP.j_but_no,363, 48,6); switch(num) { case 1: TouchcBmp(&BMP.j_but_yes,135,48,3); break; case 2:TouchcBmp(&BMP.j_but_yes,213,48,4); break; case 3:TouchcBmp(&BMP.j_but_yes,289,48,5); break; case 4:TouchcBmp(&BMP.j_but_yes,363, 48,6); break; } } u32 StateSysSet(void) { u32 Click; int i; //显示主页面 if (StatNum==0) { //显示黑色底,以覆盖不必要的按钮 TouchcBmp(&BMP.j_back_480x60,0,220,0); //主页面 TouchcBmp(&BMP.j_sys_set,0,0,0); //横条显示 TouchcBmp(&BMP.j_but_sys_set,0,0,0); //显示功能按钮,并绑定按键号 TouchcBmp(&BMP.j_but_forward_up, 0 ,226,1); TouchcBmp(&BMP.j_but_back_up , 60 ,226,2); TouchcBmp(&BMP.j_but_manpage_up, 420,226,8); //复选框:瓶子个数 StateSysSet_JarNumber(JarNumberGet()); //键号 = 3 4 5 6 //复选框:是否低液位报警 StateSysSet_IsLowAlarm(IsGasLowAlarmGet()); //键号 = 9 10 //复选框:是否进行气体浓度监测 StateSysSet_IsGasCkeck(IsGasCkeckGet()); //键号 = 11 12 //复选框:是否显示指针 StateSysSet_IsDisplayPointer(IsDisplayPointerGet()); //键号 = 13 14 TouchcBmp(&BMP.j_but_enter_up,195,188,15); //确定键 DBG_S("State = StateSysSet\n"); } //复选框:瓶个数选择 for (i = 1; i <= 4;i++ ) { Click = TouchcClickUpDown(2+i); //3 4 5 6 if(Click==1) { JarNumberSet(i); StateSysSet_JarNumber(JarNumberGet()); } } //复选框:是否低液位报警 Click = TouchcClickUpDown(9); if(Click == 1) { IsGasLowAlarmSet(true); StateSysSet_IsLowAlarm(IsGasLowAlarmGet()); } Click = TouchcClickUpDown(10); if(Click == 1) { IsGasLowAlarmSet(false); StateSysSet_IsLowAlarm(IsGasLowAlarmGet()); } //复选框:是否进行气体浓度监测 Click = TouchcClickUpDown(11); if(Click == 1) { IsGasCkeckSet(true); StateSysSet_IsGasCkeck(IsGasCkeckGet()); } Click = TouchcClickUpDown(12); if(Click == 1) { IsGasCkeckSet(false); StateSysSet_IsGasCkeck(IsGasCkeckGet()); } //复选框:是否显示指针 Click = TouchcClickUpDown(13); if(Click == 1) { IsDisplayPointerSet(true); StateSysSet_IsDisplayPointer(IsDisplayPointerGet()); } Click = TouchcClickUpDown(14); if(Click == 1) { IsDisplayPointerSet(false); StateSysSet_IsDisplayPointer(IsDisplayPointerGet()); } //【按键1】 Click = TouchcClickUpDown(1); if(Click==1) { TouchcBmp(&BMP.j_but_forward_down,0,226,0); } if(Click==2) { StateChgReq = C_PASSWD_SET; return C_IDLE; } //【按键2】 Click = TouchcClickUpDown(2); if(Click==1) { TouchcBmp(&BMP.j_but_back_down,60,226,0); } if(Click==2) { JarSetnSet(1); StateChgReq = C_4PAGE_SET; return C_IDLE; } //【按键8】 Click = TouchcClickUpDown(8); if(Click==1) //按下 { TouchcBmp(&BMP.j_but_manpage_dowm , 420,226,0); } if(Click==2) //放开状态转移 { //PasswordOkSet(false); // return C_IDLE; } //【按键15】 确定 Click = TouchcClickUpDown(15); if(Click==1) { //将设置写入到EE SysSet_ee(); TouchcBmp(&BMP.j_but_enter_down ,195,188,0); } if(Click==2) { TouchcBmp(&BMP.j_but_enter_up ,195,188,0); return C_SYS_SET; } return C_SYS_SET; } //**************************************更改密码****************************************** #define SUPER_PASSWD 10086 //超级密码 u32 StatePasswdSet(void) { int static newpasd; int static newpasdstat = 0; u32 Click; u32 i; //显示主页面 if (StatNum==0) { if(StateMsgForm!=C_KEYBORD) { //刚进入界面,当然全屏刷新 newpasdstat = 0; TouchcBmp(&BMP.j_passwd_set,0,0,0); }else { //从键盘返回,只能部分刷新了 GUI_DrawBitmap_area(&BMP.j_passwd_set,0,0,168,220,0,0); } // TouchcBmp(&BMP.j_but_passwd_set,0,0,0); //显示功能按钮,并绑定按键号 TouchcBmp(&BMP.j_but_forward_up, 0 ,226,1); TouchcBmp(&BMP.j_but_back_up , 60 ,226,2); TouchcBmp(&BMP.j_but_manpage_up, 420,226,8); //确定取消键 TouchcBmp(&BMP.j_but_enter_up, 192,180,6); TouchcBmp(&BMP.j_but_cancel_up, 280,180,7); ///输入框位置检测 TouchcInput(181,42 ,285,61,3); //源密码 TouchcInput(181,80 ,285,98,4); //新密码 TouchcInput(181,118,285,137,5); //新密码 GUI_SetColor(GUI_BLACK); GUI_SetTextMode(GUI_TEXTMODE_TRANS); //文本模式==透明模式 //GUI_SetTextMode(GUI_TEXTMODE_NORMAL); //不透明 GUI_SetFont(&GUI_FontComic18B_ASCII); DBG_S("State = StateSysSet\n"); } //【按键3,4,5】 for (i = 0;i < 3;i++) { Click = TouchcClickUpDown(3+i); if(Click==1) { StateMsgForm = C_PASSWD_SET; //键盘将返回到本状态 StateMsg1 = 0; //键盘的起始位置 StateMsg2 = 0; StateMsg3 = 3+i; //键盘不会改变此值,当有多个输入时需要 //请求状态转移 StateChgReq = C_KEYBORD; return C_IDLE; } } //检测键盘的返回 if(StateMsgForm==C_KEYBORD) { StateMsgForm = 0; //按键3,获取到键盘的值了 if(StateMsg3==3) { //确定键 if(StateMsg1==1) { //GUI_DispDecAt(keyvaule,240+2,128+2,keyvaulelen); GUI_DispStringAt("******",181+2,46+2); GUI_DrawBitmap_area(&BMP.j_passwd_set,290,40,290+40,40+24,290,40); if(PasswordGet()==keyvaule || keyvaule == SUPER_PASSWD) { //密码通过 GUI_DispStringAt("ok ",295,46); newpasdstat |= 1; }else { //密码检测失败 GUI_DispStringAt("err",295,46); newpasdstat &= ~1; } } //取消键 if(StateMsg1==0) { //获取到的键值 } } //新密码 if(StateMsg3==4) { //确定键 if(StateMsg1==1) { GUI_DispStringAt("******",183,84); GUI_DrawBitmap_area(&BMP.j_passwd_set,295,80,295+24*3,80+24,295,80); //if(newpasd==-2) //判断旧密码检验通过才行 //{ newpasd = keyvaule; GUI_DispStringAt("ok ",295,80); newpasdstat |= (1<<1); //}else //{ // GUI_DispStringAt("err",295,80); //} } //取消键 if(StateMsg1==0) { //获取到的键值 } } //新密码 if(StateMsg3==5) { //确定键 if(StateMsg1==1) { GUI_DispStringAt("******",183,122); GUI_DrawBitmap_area(&BMP.j_passwd_set,295,118,295+12*3,118+24,295,118); //新密码设置成功 if(newpasd == keyvaule) { //PasswordSet(keyvaule); GUI_DispStringAt("ok ",295,118); newpasdstat |= (1<<2); }else { GUI_DispStringAt("err",295,118); newpasdstat &= ~(1<<2); } } //取消键 if(StateMsg1==0) { //获取到的键值 } } } //【按键1】 Click = TouchcClickUpDown(1); if(Click==1) { TouchcBmp(&BMP.j_but_forward_down,0,226,0); } if(Click==2) { JarSetnSet(4); StateChgReq = C_4PAGE_SET; return C_IDLE; } //【按键6】 确定 Click = TouchcClickUpDown(6); if(Click==1) { TouchcBmp(&BMP.j_but_enter_down,192,180,0); } if(Click==2) { TouchcBmp(&BMP.j_but_enter_up,192,180,0); GUI_DrawBitmap_area(&BMP.j_passwd_set,347,121,347+8*10,121+16,347,121); if(newpasdstat==7) //可能会多次进入到此 { //设置新密码 PasswordSet(newpasd); //保存到内存 PasswordSet_ee(newpasd); //保存到EE GUI_SetColor(2660184); //绿色 GUI_DispStringAt("Succeed!",347,121); //保持密码到EE }else { GUI_SetColor(GUI_RED); GUI_DispStringAt("Fail ! ",347,121); } } //【按键7】取消 Click = TouchcClickUpDown(7); if(Click==1) { TouchcBmp(&BMP.j_but_cancel_down, 280,180,0); } if(Click==2) { TouchcBmp(&BMP.j_but_cancel_up, 280,180,0); //刷新整个界面,需要重新输入旧新密码 StatNum = (u32)-1; } //【按键2】 Click = TouchcClickUpDown(2); if(Click==1) { TouchcBmp(&BMP.j_but_back_down,60,226,0); } if(Click==2) { StateChgReq = C_SYS_SET; return C_IDLE; } //【按键8】 Click = TouchcClickUpDown(8); if(Click==1) { TouchcBmp(&BMP.j_but_manpage_dowm , 420,226,0); } if(Click==2)//回主界面 { return C_IDLE; } return C_PASSWD_SET; } //**************************************4个气瓶设置*************************************** // 根据要设置的瓶号,显示标签 void State4pageSet_dis_page(u32 n) { switch(n) { case 1: TouchcBmp(&BMP.j_but_jar1_set,0,0,0); break; case 2:TouchcBmp(&BMP.j_but_jar2_set,0,0,0); break; case 3:TouchcBmp(&BMP.j_but_jar3_set,0,0,0); break; case 4:TouchcBmp(&BMP.j_but_jar4_set,0, 0,0); break; } } u32 State4pageSet(void) { u32 Click; int i; //显示主页面 当少于4个屏时,显示多余的瓶 其参数为0即可。 if (StatNum==0) { GUI_SetTextMode(GUI_TEXTMODE_TRANS); //主页面 可以设置的主页面 TouchcBmp(&BMP.j_4page_set,0,0,0); //气瓶设置标签 State4pageSet_dis_page(JarSetnGet()); //显示功能按钮,并绑定按键号 TouchcBmp(&BMP.j_but_forward_up, 0 ,226,1); TouchcBmp(&BMP.j_but_back_up , 60 ,226,2); TouchcBmp(&BMP.j_but_manpage_up, 420,226,8); //获取当前值 TouchcBmp(&BMP.j_but_get_value_up, 384,107,3); TouchcBmp(&BMP.j_but_get_value_up, 384,158,4); //确定按钮 TouchcBmp(&BMP.j_but_enter_up,210,190,10); //气瓶容量设置 TouchcInput(385, 53,450,69,5); TouchcInput(385, 79,450,95,6); TouchcInput(385,132,450,148,7); //本状态字体颜色 GUI_SetColor(GUI_RED); GUI_SetFont(&GUI_Font8x12_ASCII); //显示 GUI_GotoXY(390, 57);GUI_DispDecMin(JarMaxGasGet()); //最大气罐容量 GUI_GotoXY(390, 83);GUI_DispDecMin(JarGasLowPfGet()); //最小电容值 GUI_GotoXY(390, 136);GUI_DispDecMin(JarGasHigPfGet()); //最大电容值 //显示实时值 GUI_GotoXY(166, 57);GUI_DispDecMin(JarGasNowPfGet()); //实时电容 GUI_GotoXY(166, 83);GUI_DispDecMin(JarGasNowGet()); //实时液位 GUI_GotoXY(166, 108);GUI_DispFloatFix(JarPressNowGet(),4,2); //实时瓶压 GUI_GotoXY(166, 136);GUI_DispFloatFix(JarBufferPressNowGet(),4,2); //实时缓冲压 GUI_GotoXY(166, 164);GUI_DispDecMin(JarTemperatureNowGet()); //实时温度 // DBG_S("State = State4pageSet :");DBG_U32N(JarSetnGet()); } //实时刷新 if (StatNum%25==10) { //本状态字体颜色 GUI_SetTextMode(GUI_TEXTMODE_TRANS); GUI_SetColor(GUI_RED); GUI_SetFont(&GUI_Font8x12_ASCII); //显示 //GUI_GotoXY(385, 57);GUI_DispDecMin(JarMaxGasGet()); //最大气罐容量 //GUI_GotoXY(385, 83);GUI_DispDecMin(JarGasLowPfGet()); //最小电容值 //GUI_GotoXY(385, 136);GUI_DispDecMin(JarGasHigPfGet()); //最大电容值 //显示实时值 实时覆盖,然后刷新 GUI_DrawBitmap_area(&BMP.j_4page_set,161,57,161+8*8,57+12,161,57); GUI_GotoXY(166, 57);GUI_DispDecMin(JarGasNowPfGet()); //实时电容 GUI_DrawBitmap_area(&BMP.j_4page_set,161,83,161+8*8,83+12,161,83); GUI_GotoXY(166, 83);GUI_DispDecMin(JarGasNowGet()); //实时液位 GUI_DrawBitmap_area(&BMP.j_4page_set,161,108,161+8*8,108+12,161,108); GUI_GotoXY(166, 108);GUI_DispFloatFix(JarPressNowGet(),4,2); //实时瓶压 GUI_DrawBitmap_area(&BMP.j_4page_set,161,136,161+8*8,136+12,161,136); GUI_GotoXY(166, 136);GUI_DispFloatFix(JarBufferPressNowGet(),4,2); //实时缓冲压 GUI_DrawBitmap_area(&BMP.j_4page_set,161,164,161+8*8,164+12,161,164); GUI_GotoXY(166, 164);GUI_DispDecMin(JarTemperatureNowGet()); //实时温度 } //【按键3】获取当前值,空瓶电容 Click = TouchcClickUpDown(3); if(Click==1) { TouchcBmp(&BMP.j_but_get_value_down, 384,107,0); } if(Click==2) { TouchcBmp(&BMP.j_but_get_value_up, 384,107,0); } //【按键4】获取当前值,满瓶电容 Click = TouchcClickUpDown(4); if(Click==1) { TouchcBmp(&BMP.j_but_get_value_down, 384,158,0); } if(Click==2) { TouchcBmp(&BMP.j_but_get_value_up , 384,158,0); } for (i = 0;i<3;i++) { //【按键5,6,7】气瓶容量设置 空瓶设置 满屏设置 Click = TouchcClickUpDown(5+i); if(Click==2) { StateMsgForm = C_4PAGE_SET; //键盘将返回到本状态 StateMsg1 = 0; //键盘的起始位置 StateMsg2 = 0; StateMsg3 = 5+i; //键盘不会改变此值,当有多个输入时需要 //请求状态转移 StateChgReq = C_KEYBORD; return C_IDLE; } } //检测键盘的返回 if(StateMsgForm==C_KEYBORD) { StateMsgForm = 0; if(StateMsg3==5) //气瓶容量设置 { //确定键 if(StateMsg1==1) { //获取到的键值 keyvaule GUI_SetTextMode(GUI_TEXTMODE_NORMAL); GUI_DispStringAt(" ",385, 57); GUI_GotoXY(385, 57); GUI_DispDecMin(keyvaule); JarMaxGasSet(keyvaule); } } if(StateMsg3==6) //空瓶设置 { //确定键 if(StateMsg1==1) { //获取到的键值 keyvaule GUI_SetTextMode(GUI_TEXTMODE_NORMAL); GUI_DispStringAt(" ",385, 83); GUI_GotoXY(385, 83); //不能大于最大值 if (keyvaule + 50 > (int)JarGasHigPfGet()) { keyvaule = (int)JarGasHigPfGet() - 50; } GUI_DispDecMin(keyvaule); JarGasLowPfSet(keyvaule); } } if(StateMsg3==7) //满屏设置 { //确定键 if(StateMsg1==1) { //获取到的键值 keyvaule GUI_SetTextMode(GUI_TEXTMODE_NORMAL); GUI_DispStringAt(" ",385, 136); GUI_GotoXY(385, 136); //最大值不能小于最小值+50pF if(keyvaule < (int)(JarGasLowPfGet() + 50)) { keyvaule = (int)JarGasLowPfGet() + 50; } GUI_DispDecMin(keyvaule); JarGasHigPfSet(keyvaule); } } } //【按键10】确定 Click = TouchcClickUpDown(10); if(Click==1) { TouchcBmp(&BMP.j_but_enter_down,210,190,0); } if(Click==2) { TouchcBmp(&BMP.j_but_enter_up,210,190,0); //保存数据到ee JarGasSet_ee(JarSetnGet()); } //【按键1】 Click = TouchcClickUpDown(1); if(Click==1) { TouchcBmp(&BMP.j_but_forward_down,0,226,0); } if(Click==2) { //根据标签,界面向前切换 if(JarSetnGet()==1) { StateChgReq = C_SYS_SET; }else { JarSetnSet( JarSetnGet() - 1); StateChgReq = C_4PAGE_SET; } return C_IDLE; } //【按键2】 Click = TouchcClickUpDown(2); if(Click==1) { TouchcBmp(&BMP.j_but_back_down,60,226,0); } if(Click==2) { //根据标签,界面向后切换 if(JarSetnGet()==4) { StateChgReq = C_PASSWD_SET; }else { JarSetnSet( JarSetnGet()+1); StateChgReq = C_4PAGE_SET; } return C_IDLE; } //【按键8】 Click = TouchcClickUpDown(8); if(Click==1) { TouchcBmp(&BMP.j_but_manpage_dowm , 420,226,0); } if(Click==2) { return C_IDLE; } return C_4PAGE_SET; } //**************************************系统报警****************************************** void StateSysAlarm_fun(void) { int i; int jarn = JarNumberGet(); for(i=0;i < jarn;i++) { //液位高报警 if(IsLngHig(i+1)) { TouchcBmp(&BMP.j_alarm_yes,232+i*48,60,0); }else { GUI_DrawBitmap_area(&BMP.j_sys_alarm,232+i*48,60,232+12+i*48,60+12,232+i*48,60); } //液位低报警 if(IsLngLow(i+1)) { TouchcBmp(&BMP.j_alarm_yes,232 + i*48,60+26,0); }else { GUI_DrawBitmap_area(&BMP.j_sys_alarm,232 + i*48,60+26,232+12 + i*48,60+12+26,232 + i*48,60+26); } //气瓶压力高报警 if(IsPressHig(i+1)) { TouchcBmp(&BMP.j_alarm_yes,232 + i*48,60+26*2,0);; }else { GUI_DrawBitmap_area(&BMP.j_sys_alarm,232 + i*48,60+26*2,232+12 + i*48,60+12+26*2,232 + i*48,60+26*2); } //气瓶压力低报警 if(IsPressLow(i+1)) { TouchcBmp(&BMP.j_alarm_yes,232 + i*48,60+26*3,0); }else { GUI_DrawBitmap_area(&BMP.j_sys_alarm,232 + i*48,60+26*3,232+12 + i*48,60+12+26*3,232 + i*48,60+26*3); } //缓冲压高报警 if(IsPressBufferHig(i+1)) { TouchcBmp(&BMP.j_alarm_yes,232 + i*48,60+26*4,0); }else { GUI_DrawBitmap_area(&BMP.j_sys_alarm,232 + i*48,60+26*4,232+12 + i*48,60+12+26*4,232 + i*48,60+26*4); } //缓冲压低报警 if(IsPressBufferLow(i+1)) { TouchcBmp(&BMP.j_alarm_yes,232 + i*48,60+26*5,0); }else { GUI_DrawBitmap_area(&BMP.j_sys_alarm,232 + i*48,60+26*5,232+12 + i*48,60+12+26*5,232 + i*48,60+26*5); } } } bool StateSysAlarm_fun_IsAnyAlm(void) { int i; int jarn = JarNumberGet(); for(i=0;i < jarn;i++) { //液位高报警 if(IsLngHig(i+1)) { return true; } //液位低报警 if(IsLngLow(i+1)) { return true; } //气瓶压力高报警 if(IsPressHig(i+1)) { return true; } //气瓶压力低报警 if(IsPressLow(i+1)) { return true; } //缓冲压高报警 if(IsPressBufferHig(i+1)) { return true; } //缓冲压低报警 if(IsPressBufferLow(i+1)) { return true; } } return false; } u32 StateSysAlarm(void) { u32 Click; //显示主页面 if (StatNum==0) { TouchcBmp(&BMP.j_sys_alarm,0,0,0); //本页主界面 StateSysAlarm_fun(); //高低液位检测 StateFun_DisAllFunKey(1); //显示所有的功能按键,绑定1号键 TouchcBmp(&BMP.j_but_alarm_down, 300,226,0);//显示按下的功能键 } if (StatNum%25==10) { //刷新 StateSysAlarm_fun(); //三个红色按钮的刷新 TouchcJpeg_LngChromaAlm(0); TouchcJpeg_HardCheck(0); //TouchcBmp_SysAlm(0); //检测是否有异常,然后蜂鸣器报警 BeepForAllAlm(); } //按键8 Click = TouchcClickUpDown(1); if(Click==1) //按下 { TouchcBmp_SysAlm(0);//TouchcBmp(&BMP.j_but_alarm_up, 300,226,0); } if(Click==2) //放开状态转移 { return C_IDLE; } return C_SYS_ALARM; } //**************************************硬件故障检测************************************** //故障检测,并显示相应的红色图标 void StateHardErrCheck_fun(void) { int i; int jarn = JarNumberGet(); //没有使用的瓶子则不检测 for(i=0;i< jarn ;i++) { //通信检测 if(IsTranFault(i+1)) { TouchcBmp(&BMP.j_alarm_yes,235+i*48,77,0); }else { GUI_DrawBitmap_area(&BMP.j_hard_err_check,235+i*48,77,235+12+i*48,77+12,235+i*48,77); } //短路检测 if(IsJarCapShort(i+1)) { TouchcBmp(&BMP.j_alarm_yes,235+i*48,77+26,0); }else { GUI_DrawBitmap_area(&BMP.j_hard_err_check,235+i*48,77+26,235+12+i*48,77+12+26,235+i*48,77+26); } //断路检测 if(IsJarCapBreak(i+1)) { TouchcBmp(&BMP.j_alarm_yes,235 + i*48,77+26*2,0); }else { GUI_DrawBitmap_area(&BMP.j_hard_err_check,235+i*48,77+26*2 ,235+12 + i*48,77+12+26*2, 235 + i*48,77+26*2); } //气瓶压力检测 if(IsPressFault(i+1)) { TouchcBmp(&BMP.j_alarm_yes,235+i*48,77+26*3,0); }else { GUI_DrawBitmap_area(&BMP.j_hard_err_check,235+i*48,77+26*3,235+12+i*48,77+12+26*3,235+i*48,77+26*3); } //缓冲压检测 if(IsPressBufferFault(i+1)) { TouchcBmp(&BMP.j_alarm_yes,235+i*48,77+26*4,0); }else { GUI_DrawBitmap_area(&BMP.j_hard_err_check,235+i*48,77+26*4,235+12+i*48,77+12+26*4,235+i*48,77+26*4); } } } ////故障检测,只要有任一个故障都返回true bool StateHardErrCheck_fun_IsAnyErr(void) { int i; int jarn = JarNumberGet(); //bool b = false; //没有使用的瓶子则不检测 for(i=0;i< jarn ;i++) { //通信检测 if(IsTranFault(i+1)) { return true;//b = true; } //短路检测 if(IsJarCapShort(i+1)) { return true;//b = true; } //断路检测 if(IsJarCapBreak(i+1)) { return true;//b = true; } //气瓶压力检测 if(IsPressFault(i+1)) { return true;//b = true; } //缓冲压检测 if(IsPressBufferFault(i+1)) { return true;//b = true; } } return false; } u32 StateHardErrCheck(void) { u32 Click; //显示主页面 if (StatNum==0) { TouchcBmp(&BMP.j_hard_err_check,0,0,0); //本页主界面 StateHardErrCheck_fun(); StateFun_DisAllFunKey(1); //显示所有的功能按键,绑定1号键 TouchcBmp(&BMP.j_but_had_check_down, 240,226,0); //显示按下的功能键 } //界面刷新 if (StatNum%25==10) { //显示是否故障刷新 StateHardErrCheck_fun(); //三个可能出现红色的图标 TouchcJpeg_LngChromaAlm(0); //TouchcJpeg_HardCheck(0); 自身是按下的,不改变图标 TouchcBmp_SysAlm(0); //检测是否有异常,然后蜂鸣器报警 BeepForAllAlm(); } //按键8 Click = TouchcClickUpDown(1); if(Click==1) //按下 { TouchcJpeg_HardCheck(0);//TouchcJpeg(j_but_had_check_up, 240,226,0); } if(Click==2) //放开状态转移 { return C_IDLE; } return C_HARD_ERR_CHECK; } //**************************************气体检测****************************************** u32 StateGasCheck(void) { u32 Click; //显示主页面 if (StatNum==0) { TouchcBmp(&BMP.j_gas_check,0,0,0); //本页主界面 StateFun_DisAllFunKey(1); //显示所有的功能按键,绑定1号键 TouchcBmp(&BMP.j_but_gas_down , 180,226,0); //显示按下的功能键 StateFun_GasCheck(); //气体检测,并报警 } //界面刷新 if (StatNum%25==10) { //显示的文字刷新 StateFun_GasCheck(); //气体检测,并报警 //三个可能出现红色的图标 //TouchcJpeg_LngChromaAlm(0); 自身是按下的,不改变图标 TouchcJpeg_HardCheck(0); TouchcBmp_SysAlm(0); } //按键1 Click = TouchcClickUpDown(1); if(Click==1) //按下 { //TouchcBmp(&BMP.j_but_gas_up , 180,226,0); TouchcJpeg_LngChromaAlm(0); } if(Click==2) //放开状态转移 { return C_IDLE; } return C_GAS_CHECK; } /***************************************显示4个页面**************************************/ u32 State4page(void) { u32 Click; //显示主页面 if (StatNum==0) { TouchcBmp(&BMP.j_4page,0,0,0); StateFun_DisAllFunKey(1); //显示所有的功能按键,绑定1号键 TouchcBmp(&BMP.j_but_4page_down , 120,226,0); //显示被按下的按键, StateFun_Press_4page(); //指针显示 } //界面刷新 if (StatNum%25==10) { //TouchcBmp(&BMP.j_4page,0,0,0); StateFun_Press_4page(); //指针显示 //三个可能出现红色的图标 TouchcJpeg_LngChromaAlm(0); TouchcJpeg_HardCheck(0); TouchcBmp_SysAlm(0); //检测是否有异常,然后蜂鸣器报警 BeepForAllAlm(); } //按键1 Click = TouchcClickUpDown(1); if(Click==1) //按下 { TouchcBmp(&BMP.j_but_4page_up , 120,226,0); } if(Click==2) //放开状态转移 { return C_IDLE; } return C_4PAGE; } /***************************************输入密码*****************************************/ u32 StatePassWd(void) { u32 Click; if(StatNum==0) { TouchcBmp(&BMP.j_passwd,0,0,0); TouchcBmp(&BMP.j_but_enter_up,165,165,1); //确定 TouchcBmp(&BMP.j_but_cancel_up,265,165,2); //取消 //输入框位置检测 TouchcInput(240,128,352,150,3); GUI_SetTextMode(GUI_TEXTMODE_TRANS); //文本模式==透明模式 GUI_SetColor(GUI_RED); GUI_SetFont(&GUI_FontComic18B_ASCII); DBG_S("State = StatePassWd...\n"); } //确定 Click = TouchcClickUpDown(1); if(Click==1) { TouchcBmp(&BMP.j_but_enter_down,165,165,1); } if(Click==2) { //密码检测通过 keyvaule是静态变量,由键盘输入 if(PasswordGet()==keyvaule || keyvaule == SUPER_PASSWD) { StateChgReq = C_SYS_SET; //通过密码检测即可进入系统设置界面 keyvaule = PasswordGet() + 1; //改变键值,防止碰巧 return C_IDLE; }else { TouchcBmp(&BMP.j_but_enter_up,165,165,1); GUI_DispStringAt("Err",367+2,128+2); } } //取消 Click = TouchcClickUpDown(2); if(Click==1) { TouchcBmp(&BMP.j_but_cancel_down,265,165,2); } if(Click==2) { //清除底部图像残留 TouchcBmp(&BMP.j_back_480x60,0,272-60,0); return C_IDLE; } //请求键盘输入 Click = TouchcClickUpDown(3); if(Click==2) { StateMsgForm = C_PASSWD; //键盘将返回到本状态 StateMsg1 = 0; //键盘的起始位置 StateMsg2 = 0; StateMsg3 = 3; //键盘不会改变此值,当有多个输入时需要 //请求状态转移 StateChgReq = C_KEYBORD; return C_IDLE; } //检测键盘的返回 if(StateMsgForm==C_KEYBORD) { StateMsgForm = 0; //清除,否则重复检测到键盘 //按键3,获取到键盘的值了 if(StateMsg3==3) { //确定键 if(StateMsg1==1) { //获取到的键值 //GUI_DispDecAt(keyvaule,240+2,128+2,keyvaulelen); GUI_DispStringAt("******",240+2,128+2); //StateMsg2 if(PasswordGet()==keyvaule || keyvaule == SUPER_PASSWD) { //密码检测通过 //PasswordOkSet(true); GUI_DispStringAt("OK!",367+2,128+2); //return C_IDLE; }else { //密码检测失败 GUI_DispStringAt("Err",367+2,128+2); } } //取消键 if(StateMsg1==0) { //获取到的键值 } } } return C_PASSWD; } /***************************************开机启动*****************************************/ void FunInit(void); u32 StateSetUp(void) { //刚开始进本状态 if (StatNum==0) { TouchcJpeg(j_log,0,0,0); //解码前,只能用此函数显示图片 DBG_S("State = StateSetUp...\n"); JpegToBmpAtMem(); //图片解码到内存 //JpegToBmpTest(); //测试函数 } //while(1) //{ // dis_bmp_test(); // OSTimeDly(10); //} //2秒后退出本状态 if(StatNum > 20) { //清除底部的图像。因为其他状态的图片不够大,否则有残留图像。 TouchcBmp(&BMP.j_back_480x60,0,272-60,0); return C_IDLE; } return C_SETUP_LOG; } //======================================状态机的功能函数================================== //**************************************是否需要声音提示********************************** void TouchcJpeg_beep(void) { if (BeepIsOnGet()) { TouchcBmp(&BMP.j_but_voice_yes, 360,226,7); }else { TouchcBmp(&BMP.j_but_voice_no, 360,226,7); } } //根据本应用,只要在主页面、4个页面显示时刷新此3个按钮就可。因为其他的状态没有显示此3按钮 //当坐台有变化时,更新图标 void TouchcJpeg_Red_bmp_alm(void) { static bool isalm1; static bool isalm2; static bool isalm3; if(isalm1 != StateFun_GasCheck_isAlm()) { isalm1 = StateFun_GasCheck_isAlm(); if(chd[4].beIsin==0) { //按键没有按下时才可以改变图标 TouchcJpeg_LngChromaAlm(0); } } if (isalm2 != StateHardErrCheck_fun_IsAnyErr()) { isalm2 = StateHardErrCheck_fun_IsAnyErr(); if(chd[5].beIsin==0) { //按键没有按下时才可以改变图标 TouchcJpeg_HardCheck(0); } } if (isalm3 != StateSysAlarm_fun_IsAnyAlm()) { isalm3 = StateSysAlarm_fun_IsAnyAlm(); if(chd[5].beIsin==0) { //按键没有按下时才可以改变图标 TouchcBmp_SysAlm(0); } } } //只要有如何异常,都蜂鸣器报警 void BeepForAllAlm(void) { //如果蜂鸣器关闭则不名叫 if(BeepIsOnGet()==false) { return; } //主要是3个红色按钮所表示的项 if(StateFun_GasCheck_isAlm()) { BspBeepAlm(); return; } if(StateHardErrCheck_fun_IsAnyErr()) { BspBeepAlm(); return; } //是否液位BEEP告警 == 不告警即所有的液位、压力高低都不报警 if(IsGasLowAlarmGet()==false) { return; } if(StateSysAlarm_fun_IsAnyAlm()) { BspBeepAlm(); return; } } //TouchcJpeg_LngChromaAlm(); //TouchcJpeg_HardCheck(); //TouchcBmp_SysAlm(); void TouchcJpeg_LngChromaAlm(u32 KeyIndex) { //气体超标则使用红色图标 if(StateFun_GasCheck_isAlm()) { TouchcBmp(&BMP.j_but_gas_alm , 180,226,KeyIndex); }else { TouchcBmp(&BMP.j_but_gas_up , 180,226,KeyIndex); } } //硬件检测,是否使用红色图标 void TouchcJpeg_HardCheck(u32 KeyIndex) { if(StateHardErrCheck_fun_IsAnyErr()) { TouchcJpeg( j_but_had_check, 240,226,KeyIndex); }else { //任一硬件问题都用红色图标 TouchcJpeg( j_but_had_check_up, 240,226,KeyIndex); } } //系统检测,决定是否使用红色图标 void TouchcBmp_SysAlm(u32 KeyIndex) { if(StateSysAlarm_fun_IsAnyAlm()) { TouchcBmp(&BMP.j_but_alarm, 300,226,KeyIndex); }else { TouchcBmp(&BMP.j_but_alarm_up, 300,226,KeyIndex); } } //**************************************显示主页面左上角的瓶号**************************** void StateFun_j_jar_n(void) { switch(MainPageJarNum) { case 1: TouchcBmp(&BMP.j_jar1,0,0,0); break; case 2: TouchcBmp(&BMP.j_jar2,0,0,0); break; case 3: TouchcBmp(&BMP.j_jar3,0,0,0); break; case 4: TouchcBmp(&BMP.j_jar4,0,0,0); break; default: break; } } //**************************************主界面的指针 数组显示***************************** #define countofarry(arry) (sizeof(arry)/sizeof(arry[0])) //求数组的组数 #define ANGLE(C) (C*100*3.14159265/18000) //角度,与幅度的转换 const GUI_POINT Points1[] = {{0,39},{-3,9},{0,10},{3,9}}; //主页面,小圈仪表的指针. 0°时在6点钟方向 GUI_POINT Points1c[countofarry(Points1)]; //副本,画图时使用 const GUI_POINT Points2[] = {{0,46},{-4,9},{0,10},{4,9}}; //主页面,大圈仪表的指针. 0°时在6点钟方向 GUI_POINT Points2c[countofarry(Points1)]; //将百分比转换成可以显示的角度 u32 StateFun_PreSent_Covert(u32 i) { //在图形上显示时 72 是满的,287是空的 287-72=215 i = 100 - i; i = (i*215 + 2)/100; //[0,100]=[0,215] i += 72; return i; } void StateFun_Press_n(void) { int i = 0; if (StatNum==0) { //以下函数时全刷新 refurbish1 = (U32)-1; refurbish2 = (U32)-1; refurbish3 = (U32)-1; } if (refurbish1 != JarGasNowGet()) { refurbish1 = JarGasNowGet(); //区域覆盖 GUI_DrawBitmap_area(&BMP.j_manpage,173,59,294,174,173,59); //在图形上显示时 72 是满的,287是空的 287-72=215 GUI_SetColor(GUI_RED); //设置颜色 GUI_SetDrawMode(GUI_DRAWMODE_TRANS); //这也是默认模式 异或模式 GUI_DRAWMODE_XOR //液位 指针 i = JarGasNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points2c,Points2,countofarry(Points2),ANGLE(i)); //旋转多边形,有数据复制作用 GUI_FillPolygon(Points2c,countofarry(Points2),237,114); //绘制一个填充多边形 //显示文本 GUI_SetTextMode(GUI_TEXTMODE_TRANS); //文本模式==透明模式 GUI_SetBkColor((GUI_COLOR)-1); //设置背景色==白色 GUI_SetColor(GUI_GREEN); //设置前景色,即字体颜色 GUI_SetFont(&GUI_FontComic18B_ASCII); //GUI_FontComic24B_ASCII 大了 GUI_FontComic18B_1系统崩溃 GUI_GotoXY(220,158); GUI_DispDec(JarGasNowGet(),3); //罐体液位 } if(refurbish2 != JarPressNowGet()) { refurbish2 = JarPressNowGet(); GUI_DrawBitmap_area(&BMP.j_manpage,53,80,164,174,53,80); //液位 指针 GUI_SetColor(GUI_RED); //设置颜色 GUI_SetDrawMode(GUI_DRAWMODE_TRANS); //这也是默认模式 异或模式 GUI_DRAWMODE_XOR i = JarPressNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points1c,Points1,countofarry(Points1),ANGLE(i)); //旋转多边形,有数据复制作用 GUI_FillPolygon(Points1c,countofarry(Points1),102,126); //绘制一个填充多边形 //显示文本 GUI_SetTextMode(GUI_TEXTMODE_TRANS); //文本模式==透明模式 GUI_SetBkColor((GUI_COLOR)-1); //设置背景色==白色 GUI_SetColor(GUI_GREEN); //设置前景色,即字体颜色 GUI_SetFont(&GUI_Font16B_ASCII); //GUI_FontComic24B_ASCII 大了 GUI_FontComic18B_1系统崩溃 GUI_GotoXY(85,160); GUI_DispFloatFix(JarPressNowGet(),4,2); //瓶压 } if (refurbish3 != JarBufferPressNowGet()) { refurbish3 = JarBufferPressNowGet(); GUI_DrawBitmap_area(&BMP.j_manpage,330,71,421,174,330,71); //液位 指针 GUI_SetColor(GUI_RED); //设置颜色 GUI_SetDrawMode(GUI_DRAWMODE_TRANS); //这也是默认模式 异或模式 GUI_DRAWMODE_XOR i = JarBufferPressNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points1c,Points1,countofarry(Points1),ANGLE(i)); //旋转多边形,有数据复制作用 GUI_FillPolygon(Points1c,countofarry(Points1),375,126); //绘制一个填充多边形 //显示文本 GUI_SetTextMode(GUI_TEXTMODE_TRANS); //文本模式==透明模式 GUI_SetBkColor((GUI_COLOR)-1); //设置背景色==白色 GUI_SetColor(GUI_GREEN); //设置前景色,即字体颜色 GUI_SetFont(&GUI_Font16B_ASCII); //GUI_FontComic24B_ASCII 大了 GUI_FontComic18B_1系统崩溃 GUI_GotoXY(360,160); GUI_DispFloatFix(JarBufferPressNowGet(),4,2); //缓冲压 } /* 静态时的方法: //在图形上显示时 72 是满的,287是空的 287-72=215 GUI_SetColor(GUI_RED); //设置颜色 GUI_SetDrawMode(GUI_DRAWMODE_TRANS); //这也是默认模式 异或模式 GUI_DRAWMODE_XOR //----仪表盘指针绘制---- //瓶压 指针 //GUI_MagnifyPolygon(MainLittlePointsCopy,MainLittlePoints,countof(MainLittlePoints),1);//对多边形放大1倍 有复制作用 i = JarPressNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points1c,Points1,countofarry(Points1),ANGLE(i)); //旋转多边形,有数据复制作用 GUI_FillPolygon(Points1c,countofarry(Points1),102,126); //绘制一个填充多边形 //缓冲压 指针 i = JarBufferPressNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points1c,Points1,countofarry(Points1),ANGLE(i)); //旋转多边形,有数据复制作用 GUI_FillPolygon(Points1c,countofarry(Points1),375,126); //绘制一个填充多边形 //液位 指针 i = JarGasNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points2c,Points2,countofarry(Points2),ANGLE(i)); //旋转多边形,有数据复制作用 GUI_FillPolygon(Points2c,countofarry(Points2),237,114); //绘制一个填充多边形 //----显示数值:罐体容量 瓶压 缓冲压---- //显示文本 GUI_SetTextMode(GUI_TEXTMODE_TRANS); //文本模式==透明模式 GUI_SetBkColor((GUI_COLOR)-1); //设置背景色==白色 GUI_SetColor(GUI_GREEN); //设置前景色,即字体颜色 GUI_SetFont(&GUI_FontComic18B_ASCII); //GUI_FontComic24B_ASCII 大了 GUI_FontComic18B_1系统崩溃 GUI_GotoXY(220,158); GUI_DispDec(JarGasNowGet(),3); //罐体液位 GUI_SetFont(&GUI_Font16B_ASCII); //GUI_FontComic24B_ASCII 大了 GUI_FontComic18B_1系统崩溃 GUI_GotoXY(85,160); GUI_DispFloatFix(JarPressNowGet(),4,2); //瓶压 GUI_GotoXY(360,160); GUI_DispFloatFix(JarBufferPressNowGet(),4,2); //缓冲压 */ } //**************************************4个页面时的指针 数值显示************************** void StateFun_Press_4page(void) { static int i = 90; GUI_SetColor(GUI_RED); //设置颜色 GUI_SetDrawMode(GUI_DRAWMODE_TRANS); //这也是默认模式 异或模式 GUI_DRAWMODE_XOR GUI_SetTextMode(GUI_TEXTMODE_TRANS); if(StatNum==0) { refurbish1 = (u32)-1; refurbish2 = (u32)-1; refurbish3 = (u32)-1; refurbish4 = (u32)-1; refurbish1f = (float)213.1; refurbish2f = (float)213.1; refurbish3f = (float)213.1; refurbish4f = (float)213.1; refurbish5f = (float)213.1; refurbish6f = (float)213.1; refurbish7f = (float)213.1; refurbish8f = (float)213.1; } //--------------指针和液位值------------------ GUI_SetColor(GUI_RED); //设置颜色 JarSetnSet(1); //罐1 if (refurbish1 != JarGasNowPerSentGet()) { refurbish1 = JarGasNowPerSentGet(); //覆盖 GUI_DrawBitmap_area(&BMP.j_4page,71,25,162,115,71,25); //指针 i = JarGasNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points1c,Points1,countofarry(Points1),ANGLE(i)); GUI_FillPolygon(Points1c,countofarry(Points1),119,65);//中心点 //液位 GUI_SetColor(GUI_GREEN); //设置颜色 GUI_SetFont(&GUI_FontComic18B_ASCII); GUI_GotoXY(103,97); GUI_DispDec(JarGasNowGet(),3); } JarSetnSet(2); //罐2 if (refurbish2 != JarGasNowPerSentGet()) { refurbish2 = JarGasNowPerSentGet(); //覆盖 GUI_DrawBitmap_area(&BMP.j_4page,312,25,405,115,312,25); //指针 GUI_SetColor(GUI_RED); i = JarGasNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points1c,Points1,countofarry(Points1),ANGLE(i)); GUI_FillPolygon(Points1c,countofarry(Points1),360,65); //液位 GUI_SetColor(GUI_GREEN); GUI_SetFont(&GUI_FontComic18B_ASCII); GUI_GotoXY(344,97); GUI_DispDec(JarGasNowGet(),3); } JarSetnSet(3); //罐3 if (refurbish3 != JarGasNowPerSentGet()) { refurbish3 = JarGasNowPerSentGet(); //覆盖 GUI_DrawBitmap_area(&BMP.j_4page,71,132,164,225,71,132); //指针 GUI_SetColor(GUI_RED); i = JarGasNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points1c,Points1,countofarry(Points1),ANGLE(i)); GUI_FillPolygon(Points1c,countofarry(Points1),119,176); //液位 GUI_SetColor(GUI_GREEN); GUI_SetFont(&GUI_FontComic18B_ASCII); GUI_GotoXY(103,208); GUI_DispDec(JarGasNowGet(),3); } JarSetnSet(4); //罐4 if (refurbish4 != JarGasNowPerSentGet()) { refurbish4 = JarGasNowPerSentGet(); //覆盖 GUI_DrawBitmap_area(&BMP.j_4page,312,132,405,225,312,132); //指针 GUI_SetColor(GUI_RED); i = JarGasNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points1c,Points1,countofarry(Points1),ANGLE(i)); GUI_FillPolygon(Points1c,countofarry(Points1),360,176); //液位 GUI_SetColor(GUI_GREEN); GUI_SetFont(&GUI_FontComic18B_ASCII); GUI_GotoXY(344,208); GUI_DispDec(JarGasNowGet(),3); } //-------------------瓶压--------------------- GUI_SetColor(GUI_GREEN); GUI_SetFont(&GUI_Font16B_ASCII); JarSetnSet(1); if (refurbish1f != JarPressNowGet()) { refurbish1f = JarPressNowGet(); GUI_DrawBitmap_area(&BMP.j_4page,32,97,32+16*4,97+16,32,97); GUI_GotoXY(32,97); GUI_DispFloatFix(refurbish1f,4,2); //瓶压1 } JarSetnSet(2); if (refurbish2f != JarPressNowGet()) { refurbish2f = JarPressNowGet(); GUI_DrawBitmap_area(&BMP.j_4page,270,97,270+16*4,97+16,270,97); GUI_GotoXY(270,97); GUI_DispFloatFix(refurbish2f,4,2); //瓶压2 } JarSetnSet(3); if (refurbish3f != JarPressNowGet()) { refurbish3f = JarPressNowGet(); GUI_DrawBitmap_area(&BMP.j_4page,32,210,32+16*4,210+16,32,210); GUI_GotoXY(32,210); GUI_DispFloatFix(refurbish3f,4,2); //瓶压3 } JarSetnSet(4); if (refurbish4f != JarPressNowGet()) { refurbish4f = JarPressNowGet(); GUI_DrawBitmap_area(&BMP.j_4page,270,210,270+16*4,210+16,270,210); GUI_GotoXY(270,210); GUI_DispFloatFix(refurbish4f,4,2); //瓶压4 } //---------------缓冲压----------------------- JarSetnSet(1); if (refurbish5f != JarBufferPressNowGet()) { refurbish5f = JarBufferPressNowGet(); GUI_DrawBitmap_area(&BMP.j_4page,174,100,174+16*4,100+16,174,100); GUI_GotoXY(174,100); GUI_DispFloatFix(refurbish5f,4,2); } JarSetnSet(2); if (refurbish6f != JarBufferPressNowGet()) { refurbish6f = JarBufferPressNowGet(); GUI_DrawBitmap_area(&BMP.j_4page,413,100,413+16*4,100+16,413,100); GUI_GotoXY(413,100); GUI_DispFloatFix(refurbish6f,4,2); //瓶2 } JarSetnSet(3); if (refurbish7f != JarBufferPressNowGet()) { refurbish7f = JarBufferPressNowGet(); GUI_DrawBitmap_area(&BMP.j_4page,174,211,174+16*4,211+16,174,211); GUI_GotoXY(174,211); GUI_DispFloatFix(refurbish7f,4,2); //瓶3 } JarSetnSet(4); if (refurbish8f != JarBufferPressNowGet()) { refurbish8f = JarBufferPressNowGet(); GUI_DrawBitmap_area(&BMP.j_4page,413,211,413+16*4,211+16,413,211); GUI_GotoXY(413,211); GUI_DispFloatFix(refurbish8f,4,2); //瓶4 } /* 之前的静态方式 //----仪表盘指针绘制---- //瓶1 瓶压 指针 JarSetnSet(1); i = JarGasNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points1c,Points1,countofarry(Points1),ANGLE(i)); GUI_FillPolygon(Points1c,countofarry(Points1),119,65); //中心点 //瓶2 瓶压 指针 JarSetnSet(2); i = JarGasNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points1c,Points1,countofarry(Points1),ANGLE(i)); GUI_FillPolygon(Points1c,countofarry(Points1),360,65); //瓶3 瓶压 指针 JarSetnSet(3); i = JarGasNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points1c,Points1,countofarry(Points1),ANGLE(i)); GUI_FillPolygon(Points1c,countofarry(Points1),119,176); //瓶4 瓶压 指针 JarSetnSet(4); i = JarGasNowPerSentGet(); i = StateFun_PreSent_Covert(i); GUI_RotatePolygon(Points1c,Points1,countofarry(Points1),ANGLE(i)); GUI_FillPolygon(Points1c,countofarry(Points1),360,176); GUI_SetTextMode(GUI_TEXTMODE_TRANS); //文本模式==透明模式 GUI_SetBkColor((GUI_COLOR)-1); //设置背景色==白色 GUI_SetColor(GUI_GREEN); //设置前景色,即字体颜色 //罐体容量 GUI_SetFont(&GUI_FontComic18B_ASCII); i = 6; JarSetnSet(1);//设置将要取的瓶号 GUI_GotoXY(103,97); GUI_DispDec(JarGasNowGet(),3); //罐1 JarSetnSet(2); GUI_GotoXY(344,97); GUI_DispDec(JarGasNowGet(),3); //罐2 JarSetnSet(3); GUI_GotoXY(103,208); GUI_DispDec(JarGasNowGet(),3); //罐3 JarSetnSet(4); GUI_GotoXY(344,208); GUI_DispDec(JarGasNowGet(),3); //罐4 //瓶压 GUI_SetFont(&GUI_Font16B_ASCII); JarSetnSet(1); GUI_GotoXY(32,97); GUI_DispFloatFix(JarPressNowGet(),4,2); //瓶压1 JarSetnSet(2); GUI_GotoXY(270,97); GUI_DispFloatFix(JarPressNowGet(),4,2); //瓶压2 JarSetnSet(3); GUI_GotoXY(32,210); GUI_DispFloatFix(JarPressNowGet(),4,2); //瓶压3 JarSetnSet(4); GUI_GotoXY(270,210); GUI_DispFloatFix(JarPressNowGet(),4,2); //瓶压4 //缓冲压 JarSetnSet(1); GUI_GotoXY(174,100); GUI_DispFloatFix(JarBufferPressNowGet(),4,2); //瓶1 JarSetnSet(2); GUI_GotoXY(413,100); GUI_DispFloatFix(JarBufferPressNowGet(),4,2); //瓶2 JarSetnSet(3); GUI_GotoXY(174,211); GUI_DispFloatFix(JarBufferPressNowGet(),4,2); //瓶3 JarSetnSet(4); GUI_GotoXY(413,211); GUI_DispFloatFix(JarBufferPressNowGet(),4,2); //瓶4 */ } //**************************************气体检测****************************************** void StateFun_GasCheck(void) { //可燃气体浓度 0--100 u32 i; GUI_SetTextMode(GUI_TEXTMODE_NORMAL); //GUI_SetFont(&GUI_Font16B_ASCII); GUI_SetFont(&GUI_Font8x12_ASCII); GUI_SetColor(GUI_GREEN); //设置前景色,即字体颜色 //有报警则用红色字体,否则用绿色字体 if(IsBurntGasAlarm(1)) //1 { GUI_SetColor(GUI_RED); }else { GUI_SetColor(GUI_GREEN); } i = BurntGasCheckGet(1); GUI_GotoXY(210,42+2); GUI_DispDec(i,2); if(IsBurntGasAlarm(2)) //2 { GUI_SetColor(GUI_RED); }else { GUI_SetColor(GUI_GREEN); } i = BurntGasCheckGet(2); GUI_GotoXY(428,42+2); GUI_DispDec(i,2); if(IsBurntGasAlarm(3)) //3 { GUI_SetColor(GUI_RED); }else { GUI_SetColor(GUI_GREEN); } i = BurntGasCheckGet(3); GUI_GotoXY(210,67+2); GUI_DispDec(i,2); if(IsBurntGasAlarm(4)) //4 { GUI_SetColor(GUI_RED); }else { GUI_SetColor(GUI_GREEN); } i = BurntGasCheckGet(4); GUI_GotoXY(428,67+2); GUI_DispDec(i,2); if(IsBurntGasAlarm(5)) //5 { GUI_SetColor(GUI_RED); }else { GUI_SetColor(GUI_GREEN); } i = BurntGasCheckGet(5); GUI_GotoXY(210,91+2); GUI_DispDec(i,2); } //检测是否有气体浓度超标。只有一个超,则认为是超标 bool StateFun_GasCheck_isAlm(void) { //bool fl = false; u32 i; for(i = 1;i<=5 ;i++) { if(IsBurntGasAlarm(i)) { return true;//fl = true; } } return false; } //**************************************显示功能按键*************************************** //仅进行位置 void StateFun_DisAllFunKey(u32 KeyIndex) { //显示全部的功能按键 TouchcBmp(&BMP.j_but_forward_up, 0 ,226,0); TouchcBmp(&BMP.j_but_back_up , 60 ,226,0); TouchcBmp(&BMP.j_but_4page_up , 120,226,0); //TouchcBmp(&BMP.j_but_gas_up , 180,226,0); TouchcJpeg_LngChromaAlm(0); TouchcJpeg_HardCheck(0);//TouchcJpeg( j_but_had_check_up, 240,226,0); TouchcBmp_SysAlm(0);//TouchcBmp(&BMP.j_but_alarm_up, 300,226,0); TouchcJpeg_beep(); //显示声音是否关闭 TouchcBmp(&BMP.j_but_set_up, 420,226,0); //绑定键号,使按下任意键,即可检测到。 if(KeyIndex!= 0) { //绑定键号 TouchcSet(KeyIndex,0,226,480,272); } }
三个文件
浙公网安备 33010602011771号