/*
*******************************************************************************************************
*
* 文件名称 : gui_user.c
* 版    本 : V1.0
* 作    者 : OpenRabbit
* 说    明 : GUI 与 RTOS 和硬件的交互文件,使用时注意区分 MCU 端和模拟器端
*
*******************************************************************************************************
*//* 头文件 -----------------------------------------------------------*/
#include "gui_user.h"
#include <stdio.h>
#include <stdlib.h>/* 定义中文字体样式 */
lv_style_t style_cn_12;
lv_style_t style_cn_16;
lv_style_t style_cn_24;
lv_style_t style_cn_32;/* user_img 描述信息结构体 */
typedef struct
{lv_img_dsc_t *icon_img;        /* 图片变量的指针 */const char *icon_fname;        /* 文件名 */}user_img_item;/* 桌面图片变量定义 */
lv_img_dsc_t img_desktop;
lv_img_dsc_t icon_led;
lv_img_dsc_t icon_key;
lv_img_dsc_t icon_beep;
lv_img_dsc_t icon_album;
lv_img_dsc_t icon_wireless;
lv_img_dsc_t icon_wifi;
lv_img_dsc_t icon_wechat;
lv_img_dsc_t icon_weather;
lv_img_dsc_t icon_temp;
lv_img_dsc_t icon_set;
lv_img_dsc_t icon_note;
lv_img_dsc_t icon_mall;
lv_img_dsc_t icon_light;
lv_img_dsc_t icon_ir;
lv_img_dsc_t icon_folder;
lv_img_dsc_t icon_tiaotu;
lv_img_dsc_t icon_triaxial;
lv_img_dsc_t icon_nbiot;
lv_img_dsc_t icon_onenet;
lv_img_dsc_t icon_touchpad;
/* 微信图片 */
/* 微信 */
lv_img_dsc_t wechat_aliyun;
lv_img_dsc_t wechat_armfly;
lv_img_dsc_t wechat_ebf;
lv_img_dsc_t wechat_esp;
lv_img_dsc_t wechat_huxiaozhi;
lv_img_dsc_t wechat_mi;
lv_img_dsc_t wechat_myir;
lv_img_dsc_t wechat_nuclei;
lv_img_dsc_t wechat_onenet;
lv_img_dsc_t wechat_quectel;
lv_img_dsc_t wechat_rtt;
lv_img_dsc_t wechat_st;
lv_img_dsc_t wechat_tiaotu;
lv_img_dsc_t wechat_asus;
lv_img_dsc_t wechat_21ic;
lv_img_dsc_t wechat_jingdong;
lv_img_dsc_t wechat_grouphelp;
lv_img_dsc_t wechat_shunfeng;
lv_img_dsc_t wechat_exmail;
lv_img_dsc_t wechat_lcsc;/* 通讯录 */
lv_img_dsc_t wechat_newfriend;
lv_img_dsc_t wechat_groupchat;
lv_img_dsc_t wechat_label;
lv_img_dsc_t wechat_public;
/* 发现 */
lv_img_dsc_t wechat_moments;
lv_img_dsc_t wechat_scan;
lv_img_dsc_t wechat_shake;
lv_img_dsc_t wechat_top_stories;
lv_img_dsc_t wechat_search;
lv_img_dsc_t wechat_people_nearby;
lv_img_dsc_t wechat_games;
lv_img_dsc_t wechat_mini_programs;
/* 我 */
lv_img_dsc_t wechat_id;
lv_img_dsc_t wechat_pay;
lv_img_dsc_t wechat_favorites;
lv_img_dsc_t wechat_my_posts;
lv_img_dsc_t wechat_cards_offers;
lv_img_dsc_t wechat_sticker_gallery;
lv_img_dsc_t wechat_settings;
/* 标题栏 */
lv_img_dsc_t wechat_chats0;
lv_img_dsc_t wechat_contacts0;
lv_img_dsc_t wechat_discover0;
lv_img_dsc_t wechat_me0;
lv_img_dsc_t wechat_chats1;
lv_img_dsc_t wechat_contacts1;
lv_img_dsc_t wechat_discover1;
lv_img_dsc_t wechat_me1;/* 蜂鸣器APP */
lv_img_dsc_t beep_open;/* 设置APP */
lv_img_dsc_t set_backlight;
lv_img_dsc_t set_calendar;
lv_img_dsc_t set_theme;
lv_img_dsc_t set_wallpaper;
lv_img_dsc_t set_wlan;
lv_img_dsc_t set_about;
lv_img_dsc_t set_system;
lv_img_dsc_t set_wireless;
lv_img_dsc_t set_screen;
lv_img_dsc_t set_ram;
lv_img_dsc_t set_memory;
lv_img_dsc_t set_mcu;
lv_img_dsc_t set_bat;
lv_img_dsc_t set_clock;
lv_img_dsc_t set_system_update;
lv_img_dsc_t set_reset_device;/* 跳兔 */
lv_img_dsc_t tiaotu_logo400x300;
lv_img_dsc_t tiaotu_qrcode;/* weather */
lv_img_dsc_t weather_bg0;
lv_img_dsc_t weather_sunny;
lv_img_dsc_t weather_wind;
lv_img_dsc_t weather_mi;
lv_img_dsc_t weather_iconfont;
lv_img_dsc_t weather_tiaotu;
lv_img_dsc_t weather_shower;
lv_img_dsc_t weather_snow;
lv_img_dsc_t weather_windbreaker;
lv_img_dsc_t weather_umbrella;
lv_img_dsc_t weather_sun_protection;
lv_img_dsc_t weather_car;
lv_img_dsc_t weather_motion;
lv_img_dsc_t weather_sunny_big;static const user_img_item user_img[]=
{/* desktop *//* page1 */{ &icon_tiaotu, "0:/lvgl/icon_tiaotu.bin" },{ &icon_led, "0:/lvgl/icon_led.bin" },{ &icon_key, "0:/lvgl/icon_key.bin" },{ &icon_beep, "0:/lvgl/icon_beep.bin" },{ &icon_album, "0:/lvgl/icon_album.bin" },{ &icon_wireless, "0:/lvgl/icon_wireless.bin" },{ &icon_wechat, "0:/lvgl/icon_wechat.bin" },{ &icon_wifi, "0:/lvgl/icon_wifi.bin" },{ &icon_weather, "0:/lvgl/icon_weather.bin" },{ &icon_set, "0:/lvgl/icon_set.bin" },{ &icon_folder, "0:/lvgl/icon_folder.bin" },{ &icon_note, "0:/lvgl/icon_note.bin" },{ &icon_nbiot, "0:/lvgl/icon_nbiot.bin" },{ &icon_onenet, "0:/lvgl/icon_onenet.bin" },{ &icon_touchpad, "0:/lvgl/icon_touchpad.bin" },/* page2 */{ &icon_mall, "0:/lvgl/icon_mall.bin"},{ &icon_light, "0:/lvgl/icon_light.bin"},{ &icon_temp, "0:/lvgl/icon_temp.bin"},/* page3 */{ &icon_ir, "0:/lvgl/icon_ir.bin"},{ &icon_triaxial, "0:/lvgl/icon_triaxial.bin"},/* set */{ &set_backlight, "0:/lvgl/set_backlight.bin"},{ &set_theme, "0:/lvgl/set_theme.bin"},{ &set_wallpaper, "0:/lvgl/set_wallpaper.bin" },{ &set_clock,"0:/lvgl/set_clock.bin"},{ &set_wlan, "0:/lvgl/set_wlan.bin"},{ &set_calendar, "0:/lvgl/set_calendar.bin" },{ &set_about, "0:/lvgl/set_about.bin"},{ &set_system_update, "0:/lvgl/set_system_update.bin" },{ &set_reset_device, "0:/lvgl/set_reset_device.bin" },/* set_about_device */{ &set_system, "0:/lvgl/set_system.bin"},{ &set_mcu, "0:/lvgl/set_mcu.bin"},{ &set_memory, "0:/lvgl/set_memory.bin"},{ &set_ram, "0:/lvgl/set_ram.bin"},{ &set_screen, "0:/lvgl/set_screen.bin"},{ &set_bat, "0:/lvgl/set_bat.bin"},{ &set_wireless,"0:/lvgl/set_wireless.bin"},/* wechat *//* page_chats */{ &wechat_tiaotu, "0:/lvgl/wechat_tiaotu.bin" },{ &wechat_aliyun, "0:/lvgl/wechat_aliyun.bin" },{ &wechat_armfly, "0:/lvgl/wechat_armfly.bin" },{ &wechat_ebf, "0:/lvgl/wechat_ebf.bin" },{ &wechat_esp, "0:/lvgl/wechat_esp.bin" },{ &wechat_huxiaozhi, "0:/lvgl/wechat_huxiaozhi.bin" },{ &wechat_mi, "0:/lvgl/wechat_mi.bin" },{ &wechat_myir, "0:/lvgl/wechat_myir.bin" },{ &wechat_nuclei, "0:/lvgl/wechat_nuclei.bin" },{ &wechat_onenet, "0:/lvgl/wechat_onenet.bin" },{ &wechat_quectel, "0:/lvgl/wechat_quectel.bin" },{ &wechat_rtt, "0:/lvgl/wechat_rtt.bin"},{ &wechat_st, "0:/lvgl/wechat_st.bin"},{ &wechat_asus, "0:/lvgl/wechat_asus.bin" },{ &wechat_21ic, "0:/lvgl/wechat_21ic.bin"},{ &wechat_jingdong, "0:/lvgl/wechat_jingdong.bin" },{ &wechat_grouphelp, "0:/lvgl/wechat_grouphelp.bin" },{ &wechat_shunfeng, "0:/lvgl/wechat_shunfeng.bin" },{ &wechat_exmail, "0:/lvgl/wechat_exmail.bin" },{ &wechat_lcsc, "0:/lvgl/wechat_lcsc.bin"},/* page_contacts */{ &wechat_newfriend, "0:/lvgl/wechat_newfriend.bin" },{ &wechat_groupchat,"0:/lvgl/wechat_groupchat.bin" },{ &wechat_label, "0:/lvgl/wechat_label.bin" },{ &wechat_public, "0:/lvgl/wechat_public.bin" },/* page_contacts1 *//* page_discover */{ &wechat_moments,"0:/lvgl/wechat_moments.bin" },{ &wechat_scan, "0:/lvgl/wechat_scan.bin" },{ &wechat_shake, "0:/lvgl/wechat_shake.bin" },{ &wechat_top_stories, "0:/lvgl/wechat_top_stories.bin" },{ &wechat_search, "0:/lvgl/wechat_search.bin" },{ &wechat_people_nearby, "0:/lvgl/wechat_people_nearby.bin" },{ &wechat_games, "0:/lvgl/wechat_games.bin"},{ &wechat_mini_programs, "0:/lvgl/wechat_mini_programs.bin"},/* page_me */{ &wechat_id, "0:/lvgl/wechat_id.bin" },{ &wechat_pay, "0:/lvgl/wechat_pay.bin" },{ &wechat_favorites, "0:/lvgl/wechat_favorites.bin" },{ &wechat_my_posts, "0:/lvgl/wechat_my_posts.bin" },{ &wechat_cards_offers, "0:/lvgl/wechat_cards_offers.bin" },{ &wechat_sticker_gallery, "0:/lvgl/wechat_sticker_gallery.bin" },{ &wechat_settings, "0:/lvgl/wechat_settings.bin" },/* header */{ &wechat_chats0, "0:/lvgl/wechat_chats0.bin" },{ &wechat_contacts0, "0:/lvgl/wechat_contacts0.bin" },{ &wechat_discover0, "0:/lvgl/wechat_discover0.bin" },{ &wechat_me0, "0:/lvgl/wechat_me0.bin" },{ &wechat_chats1, "0:/lvgl/wechat_chats1.bin"},{ &wechat_contacts1, "0:/lvgl/wechat_contacts1.bin" },{ &wechat_discover1, "0:/lvgl/wechat_discover1.bin" },{ &wechat_me1, "0:/lvgl/wechat_me1.bin" },/* beep */{ &beep_open, "0:/lvgl/beep_open.bin" },/* tiaotu */{ &tiaotu_logo400x300, "0:/lvgl/tiaotu_logo400x300.bin" },{ &tiaotu_qrcode, "0:/lvgl/tiaotu_qrcode.bin" },/* weather */{ &weather_bg0, "0:/lvgl/weather_bg0.bin" }, { &weather_sunny, "0:/lvgl/weather_sunny.bin" },{ &weather_wind, "0:/lvgl/weather_wind.bin" },{ &weather_mi, "0:/lvgl/weather_mi.bin" },{ &weather_iconfont, "0:/lvgl/weather_iconfont.bin" },{ &weather_tiaotu, "0:/lvgl/weather_tiaotu.bin" },{ &weather_shower, "0:/lvgl/weather_shower.bin" },{ &weather_snow, "0:/lvgl/weather_snow.bin" },{ &weather_windbreaker, "0:/lvgl/weather_windbreaker.bin" },{ &weather_umbrella, "0:/lvgl/weather_umbrella.bin" },{ &weather_sun_protection, "0:/lvgl/weather_sun_protection.bin" },{ &weather_car, "0:/lvgl/weather_car.bin" },{ &weather_motion, "0:/lvgl/weather_motion.bin" },{ &weather_sunny_big, "0:/lvgl/weather_sunny_big.bin" },};/**
* @brief 从文件系统加载所有图片到内存
* @param None
* @retval  0-加载成功 非0-加载失败
*/
uint8_t lv_load_user_img_from_file(void)
{uint16_t i = 0;for (i = 0; i < sizeof(user_img) / sizeof(user_img[0]); ++i){if (lv_load_img_bin_from_file(user_img[i].icon_img, user_img[i].icon_fname) != 0)return 1;}return 0;
}/**
* @brief 初始化中文字体
* @param None
* @retval  0-加载成功 非0-加载失败
*/
void lv_font_cn_style_init(void)
{/* 复制style的属性 */lv_style_copy(&style_cn_12, &lv_style_pretty_color);lv_style_copy(&style_cn_16, &lv_style_pretty_color);lv_style_copy(&style_cn_24, &lv_style_pretty_color);lv_style_copy(&style_cn_32, &lv_style_pretty_color);style_cn_12.text.font = &gb2312_puhui12;style_cn_16.text.font = &gb2312_puhui16;style_cn_24.text.font = &gb2312_puhui24;style_cn_32.text.font = &gb2312_puhui32;}/**
* @brief 颜色转换函数
* @param color-原颜色
* @retval  EMWIN需要的颜色
* @note 大小端转换
*/
uint32_t color_change(uint32_t color)
{uint32_t ret_color = 0;uint8_t r, g, b;b = color & 0X000000FF;g = (color & 0X0000FF00) >> 8;r = (color & 0X00FF0000) >> 16;ret_color |= b;ret_color <<= 8;ret_color |= g;ret_color <<= 8;ret_color |= r;return ret_color;
}/**
* @brief 从文件系统加载字体
* @param None
* @retval  0-加载成功 非0-加载失败
*/
uint8_t lv_load_user_font_from_file(void)
{
#if defined (__CC_ARM)uint8_t res;uint32_t br;uint8_t *pfont;pfont = (uint8_t *)LV_USER_FONT_ADDR;res = f_open(&SDFile, "0:/lvgl/gb2312_font.bin", FA_OPEN_EXISTING | FA_READ);if (res != FR_OK){return 1;}if (SDFile.obj.objsize > LV_USER_FONT_MAX_SIZE){/* 文件过大了 */f_close(&SDFile);return 2;}res = f_read(&SDFile, pfont, SDFile.obj.objsize, &br);if ((res != FR_OK) || (br == 0)){f_close(&SDFile);return 3;}f_close(&SDFile);return 0;
#elif defined (_MSC_VER)return 0;
#endif
}/**
* @brief 从文件系统获取bmp图片
* @param image-存储图片信息的指针
* @param file_name-文件名
* @retval  0-加载成功 非0-加载失败
*/
uint8_t lv_load_img_bin_from_file(lv_img_dsc_t *image, const char *file_name)
{
#if defined (__CC_ARM)uint8_t res;uint32_t br;uint8_t *pbuf;        //读取数据缓冲区uint8_t *pbmp;uint32_t i;uint32_t header;uint32_t file_size;if (image == NULL)return 1;if (file_name == NULL)return 1;res = f_open(&SDFile, (const TCHAR*)file_name, FA_OPEN_EXISTING | FA_READ);if (res != FR_OK){return 1;}file_size = SDFile.obj.objsize;if (file_size > 1 * 1024 * 1024){/* 文件过大了 */f_close(&SDFile);return 2;}/* 为图片申请内存,如果图片需要一直显示,内存不用释放 */pbuf = lv_mem_alloc(file_size);if (pbuf == NULL)return 1;res = f_read(&SDFile, pbuf, file_size, &br);if ((res != FR_OK) || (br == 0)){f_close(&SDFile);return 3;}/* 获取头 */header = (uint32_t)pbuf[3] << 24;header |= (uint32_t)pbuf[2] << 16;header |= (uint32_t)pbuf[1] << 8;header |= (uint32_t)pbuf[0];//rt_kprintf("header:0X%X\r\n",header);//rt_kprintf("width:%d height:%d\r\n", (uint16_t)(header >> 10), header >> 21);/* 获取图片数据流 */pbmp = (uint8_t *)pbuf + 4;image->header.cf = pbuf[0];image->header.always_zero = 0;image->header.w = (uint16_t)(header >> 10);image->header.h = (uint16_t)(header >> 21);image->data_size = file_size - 4;        //去掉4字节的头,剩余的就是图片数据流长度image->data = pbmp;f_close(&SDFile);return 0;
#elif defined (_MSC_VER)uint8_t res;uint32_t br;uint8_t *pbuf;      //读取数据缓冲区uint8_t *pbmp;uint32_t i;uint32_t header;int file_size;uint8_t fname[256];if (image == NULL)return 1;if (file_name == NULL)return 1;sprintf(fname, "../../sd_add_file/%s", file_name + 2);//printf("fname:%s\n", fname);FILE *fp = NULL;fp = fopen(fname, "rb");if (fp == NULL){printf("open file failed!\r\n");return 1;}//获取文件长度fseek(fp, 0, SEEK_END);     /* 定位到文件末 */file_size = ftell(fp);     /* 文件长度 */fseek(fp, 0, SEEK_SET);       /* 恢复到文件头 */if (file_size > 1 * 1024 * 1024){/* 文件过大了 */fclose(fp);return 2;}pbuf = lv_mem_alloc(file_size);if (pbuf == NULL)return 1;//printf("file_size:%d\n", file_size);if (fread(pbuf, 1, file_size, fp) < file_size){printf("read file failed!\r\n");fclose(fp);return 3;}//printf("file:%x", pbuf[0]);/* 获取头 */header = (uint32_t)pbuf[3] << 24;header |= (uint32_t)pbuf[2] << 16;header |= (uint32_t)pbuf[1] << 8;header |= (uint32_t)pbuf[0];//printf("header:0X%X\r\n", header);//printf("width:%d height:%d\r\n", (uint16_t)(header >> 10), header >> 21);/* 获取图片数据流 */pbmp = (uint8_t *)pbuf + 4;image->header.cf = pbuf[0];image->header.always_zero = 0;image->header.w = (uint16_t)(header >> 10);image->header.h = (uint16_t)(header >> 21);image->data_size = file_size - 4;        //去掉4字节的头,剩余的就是图片数据流长度image->data = pbmp;fclose(fp);return 0;#endif}/* 存储当前APP的obj指针,NULL表示当前在桌面 */
lv_obj_t * current_app_obj_user = NULL;
/**
* @brief 退出APP
* @param obj-事件对象
* @param event-事件类型
* @retval  None
*/
static void lv_app_btn_back_event_cb(lv_obj_t * obj, lv_event_t event)
{if (event == LV_EVENT_PRESS_LOST){lv_style_t *style;style = lv_label_get_style(lv_obj_get_child(obj, NULL), LV_LABEL_STYLE_MAIN);style->text.color = LV_COLOR_BLACK;}else if (event == LV_EVENT_PRESSED){lv_style_t *style;style = lv_label_get_style(lv_obj_get_child(obj,NULL),LV_LABEL_STYLE_MAIN);style->text.color = LV_COLOR_GRAY;}else if (event == LV_EVENT_CLICKED){current_app_obj_user = NULL;/* 退出窗口 */lv_obj_del(lv_obj_get_parent(obj));}}/**
* @brief APP公用初始化
* @param parent-父对象
* @param title-APP标题
* @retval  创建的APP的对象
*/
lv_obj_t * lv_app_common_int(lv_obj_t *parent, const char *title)
{static lv_style_t style_btn_back;static lv_style_t style_label_back;static lv_style_t style_label_title;static lv_style_t style_bg;lv_style_copy(&style_btn_back, &lv_style_transp);lv_style_copy(&style_label_title, &lv_style_plain_color);lv_style_copy(&style_label_back, &lv_style_plain_color);if (gui_current_theme == THEME_NEMO)style_label_back.text.color = LV_COLOR_WHITE;elsestyle_label_back.text.color = LV_COLOR_BLACK;style_label_back.text.font = &lv_font_roboto_28;if (gui_current_theme == THEME_NEMO)style_label_title.text.color = LV_COLOR_WHITE;elsestyle_label_title.text.color = LV_COLOR_BLACK;style_label_title.text.font = &gb2312_puhui16;lv_obj_t *obj = lv_obj_create(parent, NULL);lv_obj_set_size(obj, LV_HOR_RES, LV_VER_RES);lv_obj_t *btn_back = lv_btn_create(obj, NULL);lv_obj_set_size(btn_back, 100, 60);lv_btn_set_layout(btn_back, LV_LAYOUT_OFF);     /* 设置布局 */lv_obj_set_event_cb(btn_back, lv_app_btn_back_event_cb);lv_btn_set_style(btn_back, LV_BTN_STYLE_REL, &style_btn_back);lv_btn_set_style(btn_back, LV_BTN_STYLE_PR, &style_btn_back);lv_obj_t *label_back = lv_label_create(btn_back, NULL);lv_label_set_style(label_back, LV_LABEL_STYLE_MAIN, &style_label_back);lv_label_set_text(label_back, LV_SYMBOL_LEFT);lv_obj_align(label_back, btn_back, LV_ALIGN_IN_LEFT_MID, 20, 0);lv_obj_t *label_title = lv_label_create(obj, NULL);lv_label_set_style(label_title, LV_LABEL_STYLE_MAIN, &style_label_title);lv_label_set_text(label_title, title);lv_obj_align(label_title, obj, LV_ALIGN_IN_TOP_MID, 0, 16);current_app_obj_user = obj;return obj;
}/**
* @brief LED变换
* @param None
* @retval  None
*/
void gui_hal_led_toggle(void)
{
#if defined (__CC_ARM)led_toggle();
#elif defined (_MSC_VER)#endif
}#if defined (_MSC_VER)
static uint32_t led_color_temp;
#endif
/**
* @brief LED颜色设置
* @param color-LED颜色,注意大小端
* @retval  None
*/
void gui_hal_led_set_color(uint32_t color)
{
#if defined (__CC_ARM)led_color(color);
#elif defined (_MSC_VER)led_color_temp = color;
#endif
}/**
* @brief LED获取颜色
* @param None
* @retval  None
*/
uint32_t gui_hal_led_get_current_color(void)
{
#if defined (__CC_ARM)return led_current_color();
#elif defined (_MSC_VER)return led_color_temp;
#endif}/**
* @brief 背光调节
* @param light-背光亮度
* @retval  None
*/
void gui_hal_backlight(uint8_t light)
{#if defined (__CC_ARM)if (light <= 5)light = 5;lcd_backlight(light);
#elif defined (_MSC_VER)#endif}/**
* @brief 获取光敏ADC的百分比值
* @param light-背光亮度
* @retval  None
*/
uint8_t gui_hal_adc_light_get_ratio(void)
{#if defined (__CC_ARM)uint8_t res = 0;res = (float)adc_light_get() / 4096 * 100;return res;#elif defined (_MSC_VER)return rand() % 100;
#endif}/**
* @brief 获取CPU利用率
* @param light-背光亮度
* @retval  None
*/
uint8_t gui_hal_cpuusage_get(void)
{#if defined (__CC_ARM)static uint8_t cpu_major = 0;extern void cpu_usage_get(rt_uint8_t *major, rt_uint8_t *minor);cpu_usage_get(&cpu_major, NULL);return cpu_major;#elif defined (_MSC_VER)return rand() % 100;
#endif}/**
* @brief 获取CPU时钟
* @param None
* @retval  CPU时钟
* @note STM32F429经常会工作在非180MHz的标称频率,所以此函数有必要
*/
uint32_t gui_hal_get_sysclk(void)
{
#if defined ( __CC_ARM   )return (uint32_t)SystemCoreClock;
#elif defined (_MSC_VER)return 240 * 1000 * 1000;
#endif
}/**
* @brief 控制无源蜂鸣器的PWM开关
* @param sw 0-关闭 1-打开
* @retval  None
*/
void gui_hal_beep_switch(uint8_t sw)
{
#if defined ( __CC_ARM   )if (sw)beep_enable(1);elsebeep_enable(0);#elif defined (_MSC_VER)#endif
}/**
* @brief 调节无源蜂鸣器的占空比
* @param cycle-占空比
* @retval  None
*/
void gui_hal_beep_duty_cycle(uint8_t cycle)
{
#if defined ( __CC_ARM   )beep_adjust(cycle);
#elif defined (_MSC_VER)#endif
}/**
* @brief 获取硬件RTC时间
* @param None
* @retval  时间结构体
* @note WIN32获取的是真实时间
*/
void gui_hal_get_time(gui_rtc_date_time *date_time)
{
#if defined ( __CC_ARM   )static RTC_DateTypeDef current_date = { 0 };static RTC_TimeTypeDef current_time = { 0 };rtc_current(&current_date, &current_time);gui_rtc_date_time current;date_time->Year = current_date.Year;date_time->Month = current_date.Month;date_time->Date = current_date.Date;date_time->Hours = current_time.Hours;date_time->Minutes = current_time.Minutes;date_time->Seconds = current_time.Seconds;#elif defined (_MSC_VER)/* WIN32端获取的是真实时间 */gui_rtc_date_time current_time;time_t nowtime;nowtime = time(NULL); //获取日历时间  struct tm *local;local = localtime(&nowtime);  //获取当前系统时间  date_time->Year = (local->tm_year - 100); //tm_year是从1900开始的 Yeay是从2000年开始的date_time->Month = local->tm_mon+1;date_time->Date = local->tm_mday;    //这里读到的日期比实际大1天,原因未知date_time->Hours = local->tm_hour;date_time->Minutes = local->tm_min;date_time->Seconds = local->tm_sec;#endif
}/**
* @brief 设置RTC时间
* @param DateTime-需要设置的时间的结构体指针
* @retval  None
* @note WIN32上没有任何操作
*/
void gui_hal_set_time(gui_rtc_date_time *date_time)
{
#if defined ( __CC_ARM   )rtc_set_date(date_time->Year, date_time->Month, date_time->Date, 1);rtc_set_time(date_time->Hours, date_time->Minutes, date_time->Seconds);
#elif defined (_MSC_VER)#endif
}#if defined (_MSC_VER)
static gui_setting gui_setting_temp;
#endif
/**
* @brief 读取配置信息
* @param *gui_read_setting-存储配置信息的地址
* @retval  None
* @note GUI_SETTING结构体请跟硬件的_SETTING保持一致
*/
void gui_hal_setting_read(gui_setting *gui_read_setting)
{
#if defined (__CC_ARM)_SETTING setting = { 0 };setting_read(&setting);gui_read_setting->wlan_ssid = setting.wlan_ssid;gui_read_setting->wlan_pwd = setting.wlan_pwd;gui_read_setting->server_ip = setting.server_ip;gui_read_setting->server_port = setting.server_port;gui_read_setting->backlight = setting.backlight;gui_read_setting->wlan_power = setting.wlan_power;gui_read_setting->wallpaper_index = setting.wallpaper_index;gui_read_setting->theme_index = setting.theme_index;gui_read_setting->sysclk = setting.sysclk;gui_read_setting->system_update = setting.system_update;#elif defined (_MSC_VER)static uint8_t ssid[] = "openrabbit";static uint8_t pwd[] = "openrabbit";static uint8_t ip[] = "192.168.0.110";static uint8_t port[] = "1500";static uint8_t backlight = 100;static uint8_t wlan_power = 1;static uint8_t theme_index = 0;static uint8_t wallpaper_index = 4;static uint8_t sysclk = 1;static uint8_t init = 0;if (init == 0){gui_setting_temp.wlan_ssid = ssid;gui_setting_temp.wlan_pwd = pwd;gui_setting_temp.server_ip = ip;gui_setting_temp.server_port = port;gui_setting_temp.backlight = backlight;gui_setting_temp.wlan_power = wlan_power;gui_setting_temp.theme_index = theme_index;gui_setting_temp.wallpaper_index = wallpaper_index;gui_setting_temp.sysclk = sysclk;gui_setting_temp.system_update = 0;init = 1;}gui_read_setting->wlan_ssid = gui_setting_temp.wlan_ssid;gui_read_setting->wlan_pwd = gui_setting_temp.wlan_pwd;gui_read_setting->server_ip = gui_setting_temp.server_ip;gui_read_setting->server_port = gui_setting_temp.server_port;gui_read_setting->backlight = gui_setting_temp.backlight;gui_read_setting->wlan_power = gui_setting_temp.wlan_power;gui_read_setting->theme_index = gui_setting_temp.theme_index;gui_read_setting->wallpaper_index = gui_setting_temp.wallpaper_index;gui_read_setting->sysclk = gui_setting_temp.sysclk;gui_read_setting->system_update = gui_setting_temp.system_update;#endif}/**
* @brief 保存配置信息
* @param *gui_write_setting-待保存的配置信息的存储地址
* @retval  None
*/
void gui_hal_setting_write(gui_setting *gui_write_setting)
{
#if defined (__CC_ARM)_SETTING setting = { 0 };setting.wlan_ssid = gui_write_setting->wlan_ssid;setting.wlan_pwd = gui_write_setting->wlan_pwd;setting.server_ip = gui_write_setting->server_ip;setting.server_port = gui_write_setting->server_port;setting.backlight = gui_write_setting->backlight;setting.wlan_power = gui_write_setting->wlan_power;setting.wallpaper_index = gui_write_setting->wallpaper_index;setting.theme_index = gui_write_setting->theme_index;setting.sysclk = gui_write_setting->sysclk;setting.system_update = gui_write_setting->system_update;setting_write(&setting);#elif defined (_MSC_VER)gui_setting_temp.wlan_ssid = gui_write_setting->wlan_ssid;gui_setting_temp.wlan_pwd = gui_write_setting->wlan_pwd;gui_setting_temp.server_ip = gui_write_setting->server_ip;gui_setting_temp.server_port = gui_write_setting->server_port;gui_setting_temp.backlight = gui_write_setting->backlight;gui_setting_temp.wlan_power = gui_write_setting->wlan_power;gui_setting_temp.wallpaper_index = gui_write_setting->wallpaper_index;gui_setting_temp.theme_index = gui_write_setting->theme_index;gui_setting_temp.sysclk = gui_write_setting->sysclk;gui_setting_temp.system_update = gui_write_setting->system_update;#endif
}/**
* @brief 获取RTOS的消息队列的数据
* @param pBuffer-数据存储区
* @param len-需要获取的长度
* @retval  0-有消息 1-无消息
*/
uint8_t gui_hal_message_recv(uint8_t *pbuffer, uint8_t len)
{
#if defined ( __CC_ARM   )return rt_mq_recv(gui_mq, pbuffer, MQ_MAX_LEN, RT_WAITING_NO);
#elif defined (_MSC_VER)static uint8_t mq_buf[MQ_MAX_LEN] = { 0 };mq_buf[0] = GUI_MQ_WLAN_STATUS;mq_buf[1] = 1;memcpy(pbuffer, mq_buf, MQ_MAX_LEN);return 0;
#endif
}/**
* @brief 向RTOS的消息队列发送消息
* @param pBuffer-数据存储区
* @param len-数据长度
* @retval  0-发送成功 1-发送失败
*/
uint8_t gui_hal_message_send(uint8_t *pbuffer, uint8_t len)
{
#if defined ( __CC_ARM   )switch (pbuffer[0]){case MQ_WLAN_UPDATA_SET:rt_mq_send(wlan_mq, pbuffer, len);break;}return 0;#elif defined (_MSC_VER)return 1;
#endif
}#if defined (_MSC_VER)
static uint8_t ir_code_temp = 0;
#endif
/**
* @brief 红外发送
* @param addr-地址码
* @param key-控制码
* @param times-控制码连发次数
* @retval  None
*/
void gui_hal_ir_send(uint8_t addr, uint8_t key, uint8_t times)
{
#if defined ( __CC_ARM   )ir_send_data(addr, key, times);
#elif defined (_MSC_VER)ir_code_temp = key;#endif
}/**
* @brief 红外接收
* @param None
* @retval  None
*/
uint8_t gui_hal_ir_receive(void)
{
#if defined ( __CC_ARM   )return ir_receive_scan();
#elif defined (_MSC_VER)//return rand()%10;uint8_t ret = ir_code_temp;ir_code_temp = 0;return ret;#endif
}/**
* @brief 开启接收
* @param None
* @retval  None
*/
void gui_hal_ir_receive_start_scan(void)
{
#if defined ( __CC_ARM   )ir_receive_start_scan();
#elif defined (_MSC_VER)#endif
}
/**
* @brief 关闭红外接收
* @param None
* @retval  None
*/
void gui_hal_ir_receive_stop_scan(void)
{
#if defined ( __CC_ARM   )ir_receive_stop_scan();
#elif defined (_MSC_VER)#endif
}/**
* @brief 获取电池信息
* @param *ele-电量存储指针0-100
* @param *stdby-充满标识存储指针
* @param *chrg-充电标识存储指针
* @retval  None
*/
void gui_hal_bat_get(uint8_t *ele, bool *stdby, bool *chrg)
{
#if defined ( __CC_ARM   )static BAT_TypeDef current_bat = { 0 };bat_manage_ele_get();bat_manage_current(&current_bat);*ele = current_bat.ele;*chrg = current_bat.chrg;*stdby = current_bat.stdby;#elif defined (_MSC_VER)*ele = 100;*chrg = false;*stdby = false;#endif
}/**
* @brief 复位设备进入boot
* @param None
* @retval  None
*/
void gui_hal_reset_device_of_update(void)
{
#if defined ( __CC_ARM   )#include "cmsis_armcc.h"gui_setting setting;gui_hal_setting_read(&setting);setting.system_update = 1;gui_hal_setting_write(&setting);HAL_Delay(50);__set_FAULTMASK(1);HAL_NVIC_SystemReset();
#elif defined (_MSC_VER)printf("reset_device_of_update\n");#endif
}/**
* @brief 复位设备
* @param None
* @retval  None
*/
void gui_hal_reset_device(void)
{
#if defined ( __CC_ARM   )#include "cmsis_armcc.h"__set_FAULTMASK(1);HAL_NVIC_SystemReset();
#elif defined (_MSC_VER)printf("reset_device\n");
#endif
}/**
* @brief 延时
* @param ms-延时的ms数
* @retval  None
*/
void gui_hal_delay_ms(uint16_t ms)
{
#if defined ( __CC_ARM   )rt_thread_delay(ms);
#elif defined (_MSC_VER)Sleep(ms);
#endif
}/**
* @brief 获取固件版本
* @param None
* @retval  None
*/
char * gui_hal_get_firmware_version(void)
{
#if defined ( __CC_ARM   )static uint8_t buf[32];sprintf((char*)buf,"Firmware Version:%s",FIRMWARE_VERSION);return buf;
#elif defined (_MSC_VER)static uint8_t buf[32];sprintf((char*)buf, "Firmware Version:%s", "V1.0");return buf;
#endif
}/**
* @brief 获取CPU温度
* @param None
* @retval  None
*/
float gui_hal_get_cpu_temperature(void)
{
#if defined ( __CC_ARM   )float value = 0;value = adc_tempsensor_get();value=(float)value*(3.3/4096);    value=(value-0.76)/0.0025 + 25; //转换为温度值 return value;
#elif defined (_MSC_VER)return rand() % 60;
#endif
}/**
* @brief 获取MPU6050温度
* @param None
* @retval  None
*/
float gui_hal_get_mpu6050_temperature(void)
{
#if defined ( __CC_ARM   )return rand() % 60;
#elif defined (_MSC_VER)return rand() % 60;
#endif
}#ifdef NB_IOT
/**
* @brief 获取RTOS的消息队列的数据
* @param pBuffer-数据存储区
* @param len-需要获取的长度
* @retval  0-有消息 1-无消息
*/
uint8_t gui_hal_nb_message_recv(uint8_t *pbuffer, uint16_t len)
{
#if defined ( __CC_ARM   )return rt_mq_recv(gui_nb_mq, pbuffer, len, RT_WAITING_NO);
#elif defined (_MSC_VER)return 1;
#endif
}/**
* @brief 向RTOS的消息队列发送消息
* @param pBuffer-数据存储区
* @param len-数据长度
* @retval  0-发送成功 1-发送失败
*/
uint8_t gui_hal_nb_message_send(uint8_t *pbuffer, uint8_t len)
{
#if defined ( __CC_ARM   )rt_mq_send(nb_mq, pbuffer, len);return 0;#elif defined (_MSC_VER)return 1;
#endif
}#endif

LVGL-gui_user.c相关推荐

  1. 启明云端分享|LVGL官方认证的开发板,到底有多牛

    近日,由启明云端出品的IDO-SMLCD72-V1-2EC 获得了 Professinal LVGL 板卡认证,这意味着它是具有高性能.质量和稳健性的顶级板卡. i.MX RT595-EVK 的标准 ...

  2. 小明分享|LVGL调试日志

    LVGL仿真调试日志-内存溢出 错误日志: Warn: Couldn't allocate memory (lv_mem.c #208 lv_mem_alloc()) Warn: Couldn't a ...

  3. arduino tft 方向_ESP32在Arduino环境下玩转 LVGL,ESP32移植LVGL详细教程

    微信关注 "DLGG创客DIY"设为"星标",重磅干货,第一时间送达. ❝ 转载自慕容流年 https://me.csdn.net/qq_41868901 ❞ ...

  4. lvgl的区别 qt_LVGL分析-画面刷新

    LVGL分析 1 littlevgl线程 littlevgl有几个线程,作用是什么? 三个,主线程一个,和在主线程的hal_init函数中创建的另两个sdl线程. 主线程完成一系列初始化工作后,循环每 ...

  5. LVGL(2)Visual Studio模拟器使用

    Visual Studio   Visual Studio只需安装C++工具.VS2019.VS2022社区版都测试过,均可正常运行LVGL模拟器.   vs2022社区版下载 LVGL模拟器运行 L ...

  6. ESP32+st7789/ili9341运行LVGL例程,依赖ESP-IDF编译lv_port_esp32官方Demo(1)

      LVGL是一个C语言编写的免费的开源图形库,其提供了用于嵌入式GUI的各种元素.用户可以利用丰富的图形库资源,在消耗极低内存的情况下构建视觉效果丰富多彩的GUI .只需 64kB 闪存和 8kB ...

  7. 关于LVGL下物理按键的使用

    当时有一个想法,想用我珍藏3年全新未开封的mini开发板,使用LVGL显示,然后用物理按键控制,最终制作一个...好吧我编不下去了.其实就是想在LVGL界面下使用物理按键控制. 然后就在网上疯狂找使用 ...

  8. LVGL的PC端移植和STM32F429阿波罗开发板移植

    LVGL 8.1_学习总结 LVGL介绍 LVGL开发环境 LVGL的GitHub的代码介绍 LVGL8.1 在F429上面的移植 准备 修改lv_port_disp.c文件中的 修改lv_port_ ...

  9. 嵌入式GUI LVGL『Tableview选项卡控件』介绍

    一. LVGL GUI开关控件的概念 选项卡视图对象可用于组织选项卡中的内容. 二. LVGL GUI开关小部件和样式 Tab 视图对象包含几个部分.主要是 LV_TABVIEW_PART_BG .它 ...

  10. ESP32 开发笔记(四)LVGL控件学习 ColorPicker 颜色选择器控件

    先看效果,创建一个颜色选择器控件,设置事件回调动态显示当前选择的颜色值 开发板购买链接https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.5 ...

最新文章

  1. vue java 使用AES 前后端加密解密
  2. 你不知道的JavaScript-0
  3. SQL Server 批量更新字段值为ROW_NUMBER()+列名称
  4. android界面初始化设计,界面数据初始化及各个按钮功能的实现
  5. 转载的ActiveRecord Sql Server中文问题2
  6. Java基础学习总结(145)——Java SPI(Service Provider Interface)简介
  7. 局域网限制网速软件_大文件传输工具,比微信、QQ文件传输还好用的传输软件,关键还不限速!...
  8. PL-SVO: Semi-Direct Monocular Visual Odometry by Combining Points and Line Segments
  9. Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构
  10. Android2.2 新特性
  11. “元宇宙”火了,这玩意到底是啥?
  12. MATLAB实现两序列平移,MATLAB实现图像平移
  13. QQ浏览器微信版抢先玩!变QQ微信电脑版
  14. 设备冗余技术——链路聚合
  15. mysql 父子排序_mysql 父子结构排序
  16. 利用tftp服务器进行IOS备份升级
  17. 《呼吸法门精要》南师所讲。读后感
  18. win10找不到便签(便利贴)怎么办,Win10找回便签功能的方法
  19. 同步机构应遵循哪些基本准则
  20. python利用pyinstaller打包文件

热门文章

  1. Win7系统应用技巧集锦
  2. Unix timestamp时间 与 普通时间 转换方法
  3. 今天AWS北京区域挂了近12个小时,您的业务做热备了么?
  4. Go语言的panic详解
  5. IntelliJ Idea入门教程:如何新建项目
  6. matlab 矩阵的n次,用matlab的for循环产生N个矩阵,怎么取第N次的矩阵?
  7. Java GridBagLayout(网格包布局管理器)
  8. windous 向日葵连接 ubuntu 向日葵失败
  9. 软件测试人员能力矩阵
  10. Omnibus GitLab 使用说明