为OLED屏增加GUI支持7:综合实例

来源:互联网 发布:jk淘宝天猫评价采集 编辑:程序博客网 时间:2024/05/22 08:01

为OLED屏增加GUI支持7:综合实例


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

 

环境:

主机:WIN10

开发环境:MDK5.13

MCU:STM32F103


说明:
前面的文章已经介绍了本GUI的基本功能,目前有的控件有文本控件,图片控件,以及进度条控件,这是我项目中所需要的,读者可以参考这些代码增加自己所需的控件。本文展示一个综合实例,显示一个完整的界面。文中用到调度框架pt-thread。

实现效果:


源代码:

gui.h:gui头文件

/*** Copyright (c), 2015-2025* @file gui.h* @brief gui头文件* @author jdh* @version 1.0* @date 2015/9/6*/#ifndef _GUI_H_#define _GUI_H_/**********************************************************************头文件**********************************************************************/#include "gui_interface.h"#include "gui_text_lib.h"#include "gui_2d_lib.h"#include "gui_widget_text.h"#include "gui_widget_image.h"#include "gui_widget_progbar.h"/**********************************************************************函数**********************************************************************//*** @brief 初始化gui*/void gui_init(void);/*** @brief 销毁控件* @param handle:控件句柄*/void gui_widget_delete(void *handle);#endif

gui.c:gui主文件

/*** Copyright (c), 2015-2025* @file gui.c* @brief gui主文件* @author jdh* @date 2015/9/6*//**********************************************************************头文件**********************************************************************/#include "gui.h"#include "stdlib.h"/**********************************************************************函数**********************************************************************//*** @brief 初始化gui*/void gui_init(void){////初始化字库//font_init();}/*** @brief 销毁控件* @param handle:控件句柄*/void gui_widget_delete(void *handle){free(handle);handle = (void *)0;}

实例:

gui_mode_fence.h

/*** Copyright (c), 2015-2025* @file gui_mode_fence.h* @brief 围栏界面模块头文件* @author jdh* @date 2015/11/22*/#ifndef _GUI_MODE_FENCE_H_#define _GUI_MODE_FENCE_H_/**********************************************************************头文件**********************************************************************/#include "world.h" /**********************************************************************宏定义**********************************************************************//*** @brief 工作间隔,单位:ms*/#define INTERVAL_GUI_MODE_FENCE100  /**********************************************************************函数**********************************************************************//*** @brief 模块载入*/void gui_mode_fence_load(void);/*** @brief 模块运行*/void gui_mode_fence_run(void);/*** @brief 设置显示状态* @param enable:0:关闭显示,1:打开显示*/void gui_mode_fence_show(uint8_t enable);/*** @brief 得到当前的显示状态* @retval 0:关闭显示,1:打开显示*/uint8_t gui_mode_fence_get_show(void);#endif

gui_mode_fence.c

/*** Copyright (c), 2015-2025* @file gui_mode_fence.c* @brief 围栏模式界面模块主文件* @author jdh* @date 2015/11/22* @update 2015/12/11*//**********************************************************************头文件**********************************************************************/#include "gui_mode_fence.h"#include "status_bar.h"#include "gui_schedule.h"#include "para_manage.h"#include "slave_manage.h"/**********************************************************************数据结构**********************************************************************//*** @brief 按键状态*/struct _Key_State{uint8_t ok;uint8_t cancel;uint8_t left;uint8_t right;};/**********************************************************************静态变量**********************************************************************//*** @brief pt任务变量*/static struct pt pt_task;/*** @brief 当前显示状态.0:未显示,1显示*/static uint8_t State_Show = 0;/*** @brief 控件*///警报距离static Widget_Text_Handle Widget_Text_Alarm_Distance;//状态static Widget_Text_Handle Widget_Text_State;//距离static Widget_Text_Handle Widget_Text_Distance;/*** @brief 按键状态*/static struct _Key_State Key_State = {.ok = 0,.cancel = 0,.left = 0,.right = 0};/*** @brief 从机信息*/static struct _Slave_Info Slave_Info_Show;/**********************************************************************静态函数**********************************************************************//*** @brief 任务运行* @retval 任务状态*/static int pt_run(struct pt *pt);/*** @brief 按键处理*/static void deal_key(void);/*** @brief 更新界面*/static void refresh_ui(void);/**********************************************************************函数**********************************************************************//*** @brief 模块载入*/void gui_mode_fence_load(void){//载入任务PT_INIT(&pt_task);}/*** @brief 模块运行*/void gui_mode_fence_run(void){//启动任务pt_run(&pt_task);}/*** @brief 设置显示状态* @param enable:0:关闭显示,1:打开显示*/void gui_mode_fence_show(uint8_t enable){uint8_t distance_alarm = 0;char str[32] = {0};//判断当前状态if (State_Show == enable){return;}State_Show = enable;if (State_Show){//清屏gui_fill_rect(0,0,LCD_WIDTH - 1,LCD_HEIGHT - 1,0);//显示状态栏status_bar_show(ON);//显示其他控件//读取报警距离distance_alarm = para_manage_read_distance_alarm();sprintf(str,"%dm",distance_alarm);Widget_Text_Alarm_Distance = gui_widget_text_create(93,20,30,20,GB18030_20X20,str);Widget_Text_State = gui_widget_text_create(93,40,30,20,GB18030_20X20,"正常");Widget_Text_Distance = gui_widget_text_create(0,27,87,30,GB18030_37X37B,"0.0m");refresh_ui();}else{status_bar_show(OFF);gui_widget_delete(Widget_Text_Alarm_Distance);gui_widget_delete(Widget_Text_State);gui_widget_delete(Widget_Text_Distance);}}/*** @brief 得到当前的显示状态* @retval 0:关闭显示,1:打开显示*/uint8_t gui_mode_fence_get_show(void){return State_Show;}/*** @brief 任务运行* @retval 任务状态*/static int pt_run(struct pt *pt){static T_Time time_delay;PT_BEGIN(pt);//等待显示PT_WAIT_UNTIL(pt,State_Show);//等待time_delay = get_time();PT_WAIT_UNTIL(pt,sub_time_safe(get_time(),&time_delay) > INTERVAL_GUI_MODE_FENCE * 1000 || State_Show == OFF);if (State_Show){//更新状态栏status_bar_refresh();//更新界面refresh_ui();//处理按键deal_key();}PT_END(pt);}/*** @brief 按键处理*/static void deal_key(void){uint8_t distance_alarm = 0;char str[32] = {0};if (inf_key_detect_hold(KEY_CANCEL)){if (Key_State.cancel == 0){Key_State.cancel = 1;return;}}else{if (Key_State.cancel == 1){Key_State.cancel = 0;return;}}if (inf_key_detect_hold(KEY_OK)){if (Key_State.ok == 0){Key_State.ok = 1;distance_alarm = para_manage_read_distance_alarm();switch (distance_alarm){case 5:{distance_alarm = 10;break;}case 10:{distance_alarm = 20;break;}case 20:{distance_alarm = 30;break;}case 30:{distance_alarm = 5;break;}default:{distance_alarm = 10;break;}}para_manage_earase_para(2);para_manage_save_valid(2);para_manage_save_distance_alarm(distance_alarm);sprintf(str,"%dm",distance_alarm);gui_widget_text_set_text(Widget_Text_Alarm_Distance,GB18030_20X20,str);return;}}else{if (Key_State.ok == 1){Key_State.ok = 0;return;}}if (inf_key_detect_hold(KEY_LEFT)){if (Key_State.left == 0){Key_State.left = 1;//设置为停止中模式para_manage_save_work_mode(MODE_STOPING);//切换到停止进度界面gui_schedule_switch(GUI_STOP_PROGRESS);return;}}else{if (Key_State.left == 1){Key_State.left = 0;return;}}if (inf_key_detect_hold(KEY_RIGHT)){if (Key_State.right == 0){Key_State.right = 1;//设置为搜索模式para_manage_save_work_mode(MODE_SEARCH);//切换到搜索模式界面gui_schedule_switch(GUI_MODE_SEARCH);return;}}else{if (Key_State.right == 1){Key_State.right = 0;return;}}}/*** @brief 更新界面*/static void refresh_ui(void){char str[32] = {0};uint16_t slave_id = 0;struct _Slave_Info slave_info;//从机数量if (para_manage_read_slave_num() == 0){return;}//读取从机idslave_id = para_manage_read_slave_id(1);//读取从机信息slave_info = slave_manage_read_slave(slave_id);//状态if (Slave_Info_Show.state != slave_info.state){Slave_Info_Show.state = slave_info.state;switch (Slave_Info_Show.state){case 0:{gui_widget_text_set_text(Widget_Text_State,GB18030_20X20,"正常");break;}case 1:{gui_widget_text_set_text(Widget_Text_State,GB18030_20X20,"低电");break;}case 2:{gui_widget_text_set_text(Widget_Text_State,GB18030_20X20,"超距");break;}case 3:{gui_widget_text_set_text(Widget_Text_State,GB18030_20X20,"失踪");break;}}}//距离if (Slave_Info_Show.distance != slave_info.distance){Slave_Info_Show.distance = slave_info.distance;sprintf(str,"%.1fm",Slave_Info_Show.distance);gui_widget_text_set_text(Widget_Text_Distance,GB18030_37X37B,str);}}



1 0
原创粉丝点击