【LVGL-文件系统移植】

LVGL-文件系统移植

  • ■ LVGL-文件系统移植
    • ■ 示例一:
    • ■ 示例二:视频实例
    • ■ 综合示例:

■ LVGL-文件系统移植

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

■ 示例一:

在这里插入代码片

■ 示例二:视频实例

在这里插入代码片

在这里插入图片描述

■ 综合示例:

/******************************************************************************************************* @file        lv_mainstart.c* @author      正点原子团队(ALIENTEK)* @version     V1.0* @date        2022-03-23* @brief       LVGL 文件管理系统 实验* @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司***************************************************************************************************** @attention** 实验平台:正点原子 探索者 F407开发板* 在线视频:www.yuanzige.com* 技术论坛:www.openedv.com* 公司网址:www.alientek.com* 购买地址:openedv.taobao.com******************************************************************************************************/#include "LVGL/GUI_APP/lv_mainstart.h"
#include "./FATFS/exfuns/exfuns.h"
#include "./MALLOC/malloc.h"
#include "./BSP/LCD/lcd.h"
#include "./SYSTEM/usart/usart.h"
#include "lvgl.h"
#include <stdio.h>LV_FONT_DECLARE(myFont24)
LV_FONT_DECLARE(myFont18)
LV_FONT_DECLARE(myFont14)lv_file_struct lv_flie;
/* 文件的后缀名,可以在这个数组添加未知的后缀 */
char *lv_suffix [] ={".txt",".avi",".png","jpeg",".jpg",".bin",".gif",".bmp",".FON",".dat",".sif",".BIN",".xbf",".ttf"};
#define LV_SUFFIX(x)    (int)(sizeof(x)/sizeof(x[0])) /* 计算lv_suffix数组的大小 */uint16_t lv_scan_files (const char* path,lv_obj_t *parent);
void lv_del_list(lv_obj_t *parent);
void lv_create_list(lv_obj_t *parent);
void lv_mainstart(void);
void list_init(lv_obj_t *parent);
lv_obj_t * lv_create_page(lv_obj_t *parent);
char * lv_pash_joint(void);/*** @brief  告诉文件的位置* @param  fd:文件指针* @return 返回位置*/
long lv_tell(lv_fs_file_t *fd)
{uint32_t pos = 0;lv_fs_tell(fd, &pos);printf("\nlv_tcur pos is: %d\n", pos);return pos;
}/*** @brief  读取文件内容* @param  path:文件路径* @return LV_FS_RES_OK:读取成功*/
lv_fs_res_t lv_file_read(const char *path)
{uint32_t rsize = 0;lv_fs_file_t fd;lv_fs_res_t res;res = lv_fs_open(&fd, path, LV_FS_MODE_RD);if (res != LV_FS_RES_OK){printf("open %s ERROR\n",path);return LV_FS_RES_UNKNOWN;}lv_tell(&fd);lv_fs_seek(&fd,0,LV_FS_SEEK_SET);lv_tell(&fd);res = lv_fs_read(&fd, lv_flie.rbuf, FILE_SEZE, &rsize);if (res != LV_FS_RES_OK){printf("read %s ERROR\n",path);return LV_FS_RES_UNKNOWN;}lv_tell(&fd);lv_fs_close(&fd);return LV_FS_RES_OK;
}/*** @brief  页面返回按键回调函数* @param  obj  : 对象* @param  event: 事件* @retval 无*/
void lv_btn_close_event(lv_event_t *event)
{lv_event_code_t code = lv_event_get_code(event);lv_obj_t * obj = lv_event_get_target(event);if (code == LV_EVENT_RELEASED){if (lv_flie.lv_image_read != NULL)     /* 判断图片路径释放为空 */{lv_obj_del(lv_flie.lv_image_read); /* 删除图片对象 */lv_flie.lv_image_read = NULL;      /* 设置图片对象为空 */}lv_flie.lv_prev_file_flag -- ;         /* 文件返回标志位减一 */lv_obj_del(lv_flie.lv_page_cont);      /* 当按下返回时,删除页面 */}
}/*** @brief  创建page页面* @param  parent:父类* @retval 无*/
lv_obj_t * lv_create_page(lv_obj_t *parent)
{lv_flie.lv_page_cont = lv_obj_create(parent);    /* 创建容器 */lv_obj_set_size(lv_flie.lv_page_cont, lcddev.width, lcddev.height);lv_obj_set_style_radius(lv_flie.lv_page_cont,0,LV_STATE_DEFAULT);/* 设置圆半径为0 */lv_obj_clear_flag(lv_flie.lv_page_cont,LV_OBJ_FLAG_SCROLL_CHAIN_HOR);lv_obj_clear_flag(lv_flie.lv_page_cont,LV_OBJ_FLAG_SCROLL_CHAIN_VER);lv_obj_align_to(lv_flie.lv_page_cont,parent,LV_ALIGN_CENTER,0,0);lv_obj_t *lv_page_obj = lv_obj_create(lv_flie.lv_page_cont); /* 创建返回按键的区域 */lv_obj_set_style_bg_color(lv_page_obj,lv_palette_main(LV_PALETTE_BLUE),LV_STATE_DEFAULT);lv_obj_align(lv_page_obj,LV_ALIGN_BOTTOM_MID,0,10);lv_obj_set_size(lv_page_obj, lcddev.width, myFont24.line_height);lv_obj_t * lv_page_back_btn = lv_label_create(lv_page_obj);  /* 创建lable作为返回的对象 */lv_obj_set_style_text_font(lv_page_back_btn,&myFont24,LV_STATE_DEFAULT);lv_label_set_text(lv_page_back_btn,"返回");lv_obj_align_to(lv_page_back_btn,NULL,LV_ALIGN_CENTER,0,0);lv_obj_add_flag(lv_page_back_btn,LV_OBJ_FLAG_CLICKABLE); /* 设置标签可点击 */lv_obj_add_event_cb(lv_page_back_btn,lv_btn_close_event,LV_EVENT_ALL,NULL); /* 设置回调函数 */return lv_flie.lv_page_cont;
}/*** @brief  显示.txt文件* @param  parent:父类* @retval 无*/
void lv_show_filetxt(lv_obj_t *parent)
{lv_obj_t * label = lv_label_create(parent);lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP);lv_obj_set_style_text_font(label,&lv_font_montserrat_18,LV_STATE_DEFAULT);lv_obj_set_width(label, lv_obj_get_width(parent));lv_label_set_text(label, (char *)lv_flie.rbuf); /* 显示读取的数据 */memset(lv_flie.rbuf,0,sizeof(lv_flie.rbuf));
}/*** @brief  显示.bin图片* @param  parent:父类* @param  path:路径* @retval 无*/
void lv_show_imgbin(lv_obj_t *parent,const char *path)
{lv_flie.lv_image_read = lv_img_create(parent);                     /* 创建 image 控件 */   lv_img_set_src(lv_flie.lv_image_read,path);                        /* 为控件设置图片 */
//    lv_img_set_auto_size(lv_flie.lv_image_read, true);                 /* 自动设置大小 */lv_obj_align_to(lv_flie.lv_image_read,parent,LV_ALIGN_CENTER,0,0); /* 设置控件的对齐方式,相对坐标 */
}/*** @brief  文件路径拼接* @param  无* @retval 无*/
char * lv_pash_joint(void)
{lv_flie.lv_prev_file[lv_flie.lv_prev_file_flag] = (char *)lv_flie.lv_pash;/* 把上一个路径保存到这个数组里 */lv_flie.lv_prev_file_flag ++;                              /* 前一个路径数量标志位加一 */strcpy((char *)lv_flie.pname, lv_flie.lv_pash);            /* 复制路径(目录) */ strcat((char *)lv_flie.pname, "/");                        /* 复制路径(目录) */ strcat((char *)lv_flie.pname, (char *)lv_flie.lv_pname);   /* 将文件名接在后面 */return lv_flie.pname;
}/*** @brief  列表按键回调函数* @param  obj  : 对象* @param  event: 事件* @retval 无*/
static void lv_list_btn_event(lv_event_t *event)
{lv_event_code_t code = lv_event_get_code(event);lv_obj_t * obj = lv_event_get_target(event);if(code == LV_EVENT_CLICKED){for (int i = 0; i <= lv_flie.list_flie_nuber ;i++)  /* 轮询列表项 */{if (obj == lv_flie.list_btn[i]) /* 判断列表项的那个按键按下 */{lv_flie.lv_pname = mymalloc(SRAMIN, sizeof(lv_flie.lv_pname));         /* 获取文件名分配内存 */lv_flie.pname = mymalloc(SRAMIN, sizeof(lv_flie.pname));               /* 为带路径的文件名分配内存 */lv_flie.lv_pname = (char *)lv_list_get_btn_text(lv_flie.list,lv_flie.list_btn[i]);  /* 获取列表项的值 */for (int suffix = 0;suffix < LV_SUFFIX(lv_suffix) ;suffix ++)     /* 轮询文件后缀 */{if (strstr(lv_flie.lv_pname,lv_suffix[suffix]) != NULL)       /* 如果不是文件夹 */{lv_flie.lv_suffix_flag = 0;                               /* 设置后缀的标志位为0 */break;}}if (lv_flie.lv_suffix_flag == 1)                                  /* 该标志位不为0就是文件夹操作 */{   lv_flie.lv_pash = lv_pash_joint();                            /* 把文件路径转递给lv_pash参数 */lv_del_list(lv_flie.list);                                    /* 删除列表 */lv_scan_files(lv_flie.pname,lv_scr_act());                    /* 重新创建文件列表 */}else{if (strstr(lv_flie.lv_pname,".txt") != NULL)                  /* 如果不是文件夹且是txt文件 */{if (lv_file_read(lv_pash_joint()) == LV_FS_RES_OK)        /* 判断读取txt文件是否成功 */{lv_flie.lv_return_page = lv_create_page(lv_scr_act());/* 创建页面 */lv_show_filetxt(lv_flie.lv_return_page);              /* 在页面显示txt文件数据 */}}else if (strstr(lv_flie.lv_pname,".bin") != NULL)             /* 如果不是文件夹且是bin文件 */{lv_flie.lv_return_page = lv_create_page(lv_scr_act());    /* 创建页面 */lv_show_imgbin(lv_flie.lv_return_page,lv_pash_joint());   /* 显示bin图片 */}lv_flie.lv_suffix_flag = 1; /* 恢复文件夹点击 */}}}}
}/*** @brief  读取文件名* @param  char* path: 要扫描的文件路径* @retval FR_OK:成功,否则失败*/
uint16_t lv_scan_files (const char* path,lv_obj_t *parent)
{lv_flie.fr = f_opendir(&lv_flie.lv_dir, path);         /* 打开文件目录* */memset(lv_flie.list_btn,0,sizeof(lv_flie.list_btn));   /* 清除列表项的数组 */lv_flie.list_flie_nuber = 0;                           /* 设置文件索引为0 */lv_create_list(parent);                                /* 创建列表 */if (lv_flie.pname != NULL||lv_flie.lv_pname != NULL){myfree(SRAMIN, lv_flie.pname);                    /* 释放pname内存 */myfree(SRAMIN, lv_flie.lv_pname);                 /* 释放lv_pname_shift内存 */}if (lv_flie.fr == FR_OK){   /* 如果打开成功循环读出文件名字到buff中 */while(1){   /* 循环读出文件名字,循环次数等于SD卡根目录下的文件数目 */lv_flie.fr = f_readdir(&lv_flie.lv_dir, &lv_flie.SD_fno);        /* 读取文件名* */if (lv_flie.fr != LV_FS_RES_OK||lv_flie.SD_fno.fname[0] == 0) break;  /* 读取错误或者读完所有文件结束就跳出循环 */lv_flie.list_flie_nuber ++;     /* 文件数量加1 */if (lv_flie.SD_fno.fattrib& AM_DIR) /* 读取的是文件夹名字 */{/* 复制文件名字到缓存并打印文件名 */lv_flie.list_btn[lv_flie.list_flie_nuber] = lv_list_add_btn(lv_flie.list, LV_SYMBOL_DIRECTORY, lv_flie.SD_fno.fname);      /* 添加列表项(文件夹) */lv_obj_set_style_img_recolor_filtered(lv_flie.list_btn[lv_flie.list_flie_nuber],lv_color_hex(0xFFD700),LV_STATE_DEFAULT);  /* 设置文件夹重新着色 */}else /* 读取的是文件名称 */{if (strstr(lv_flie.SD_fno.fname,".png") != NULL    /* 判断文件名称 */||strstr(lv_flie.SD_fno.fname,".jpeg") != NULL||strstr(lv_flie.SD_fno.fname,".jpg") != NULL||strstr(lv_flie.SD_fno.fname,".bmp") != NULL||strstr(lv_flie.SD_fno.fname,".gif") != NULL||strstr(lv_flie.SD_fno.fname,".avi") != NULL){lv_flie.image_scr = LV_SYMBOL_IMAGE;}else{lv_flie.image_scr = LV_SYMBOL_FILE;}lv_flie.list_btn[lv_flie.list_flie_nuber] = lv_list_add_btn(lv_flie.list, lv_flie.image_scr, lv_flie.SD_fno.fname);         /* 添加列表项(文件) */ lv_obj_set_style_img_recolor_filtered(lv_flie.list_btn[lv_flie.list_flie_nuber],lv_color_hex(0x87CEFA),LV_STATE_DEFAULT);   /* 设置文件重新着色 */}lv_obj_set_style_pad_left(lv_flie.list_btn[lv_flie.list_flie_nuber],5,LV_STATE_DEFAULT);   /* 设置列表项与列表左边的距离 */lv_obj_set_style_pad_right(lv_flie.list_btn[lv_flie.list_flie_nuber],5,LV_STATE_DEFAULT);  /* 设置列表项与列表右边的距离 */lv_obj_add_event_cb(lv_flie.list_btn[lv_flie.list_flie_nuber], lv_list_btn_event,LV_EVENT_ALL,NULL); /* 设置列表回调函数 */}f_closedir(&lv_flie.lv_dir); /* 关闭文件目录 */}return lv_flie.fr;                   /* 返回 */
}/*** @brief  删除列表* @param  parent: 父类* @retval 无*/
void lv_del_list(lv_obj_t *parent)
{lv_obj_del(parent);   /* 删除对象 */lv_flie.list = NULL;  /* 设置列表为空 */
}/*** @brief  设置列表动画* @param  parent: 父类* @retval 无*/
void lv_animation(lv_obj_t *parent)
{lv_anim_t a;                                                /* 第一步:定义一个动画 */lv_anim_init(&a);                                           /* 第二步初始化动画 */lv_anim_set_var(&a, parent);                                /* 第三步:设置实施动画效果的控件 */lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_x);  /* 设置动画功能 var */int32_t start = lv_obj_get_width(lv_scr_act());int32_t end = 0;lv_anim_set_values(&a, start, end);                         /* 设置开始值和结束值。例如0,150 */lv_anim_set_time(&a, 300);                                  /* 动画的长度[ms]设置300mS */lv_anim_start(&a);                                          /* 第四步:创建动画 */
}/*** @brief  创建列表* @param  parent: 父类* @retval 无*/
void lv_create_list(lv_obj_t *parent)
{lv_flie.list = lv_list_create(parent);  /* 创建列表 */lv_animation(lv_flie.list);lv_obj_set_size(lv_flie.list, lcddev.width, lcddev.height - myFont24.line_height*2 - 10);  /* 设置列表的大小 */lv_obj_align_to(lv_flie.list,lv_flie.lv_page_obj,LV_ALIGN_OUT_BOTTOM_LEFT,0,0);            /* 设置列表的对齐模式 */lv_obj_set_style_text_font(lv_flie.list,&lv_font_montserrat_24,LV_STATE_DEFAULT);          /* 设置字体 */lv_obj_set_style_radius(lv_flie.list,0,LV_STATE_DEFAULT);/* 设置圆半径为0 */
}/*** @brief  创建页面标题* @param  parent: 父类* @retval 无*/
void lv_page_tile(lv_obj_t *parent)
{lv_flie.lv_page_obj = lv_obj_create(parent);lv_obj_set_size(lv_flie.lv_page_obj,lcddev.width,myFont24.line_height);lv_obj_set_style_bg_color(lv_flie.lv_page_obj,lv_palette_main(LV_PALETTE_GREY),LV_STATE_DEFAULT);lv_obj_set_style_radius(lv_flie.lv_page_obj,0,LV_STATE_DEFAULT);/* 设置圆半径为0 */lv_obj_align_to(lv_flie.lv_page_obj,parent,LV_ALIGN_TOP_LEFT,0,0);lv_obj_t *lv_page_label = lv_label_create(lv_flie.lv_page_obj);lv_label_set_text(lv_page_label,"文件管理系统");lv_obj_set_style_text_color(lv_page_label,lv_palette_main(LV_PALETTE_RED),LV_STATE_DEFAULT);lv_obj_set_style_text_font(lv_page_label,&myFont24,LV_STATE_DEFAULT);lv_obj_align_to(lv_page_label,lv_flie.lv_page_obj,LV_ALIGN_CENTER,0,0);
}/*** @brief  返回按键回调函数* @param  obj:对象* @param  event:事件* @retval 无*/
void lv_back_btn_event_handler(lv_event_t *event)
{lv_event_code_t code = lv_event_get_code(event);lv_obj_t * obj = lv_event_get_target(event);if(code == LV_EVENT_SHORT_CLICKED){if (obj == lv_flie.lv_back_btn){lv_del_list(lv_flie.list);         /* 删除列表 */list_init(lv_scr_act());           /* 返回菜单 */}if (obj == lv_flie.lv_prev_btn){ lv_flie.lv_prev_file_flag -- ;     /* 文件返回标志位减一 */if (lv_flie.lv_prev_file_flag <= 0){lv_flie.lv_prev_file_flag = 0; /* 如果小于等于0,就强制设置为0 */}lv_del_list(lv_flie.list);         /* 立刻删除列表控件 */lv_flie.lv_pash = lv_flie.lv_prev_file[lv_flie.lv_prev_file_flag]; /* 上级路径复制到lv_pash参数 */lv_scan_files(lv_flie.lv_prev_file[lv_flie.lv_prev_file_flag],lv_scr_act());/* 读取文件路径 */}}
}/*** @brief  返回按键* @param  parent:父类* @retval 无*/
void lv_general_win_create(lv_obj_t *parent)
{lv_flie.lv_back_btn = lv_label_create(parent);lv_obj_set_style_text_font(lv_flie.lv_back_btn,&myFont24,LV_STATE_DEFAULT); /* 设置字体 */lv_label_set_text(lv_flie.lv_back_btn,"菜单");lv_obj_align_to(lv_flie.lv_back_btn,parent,LV_ALIGN_RIGHT_MID,-10,0);lv_obj_add_flag(lv_flie.lv_back_btn,LV_OBJ_FLAG_CLICKABLE); /* 设置标签可点击 */lv_obj_add_event_cb(lv_flie.lv_back_btn,lv_back_btn_event_handler,LV_EVENT_ALL,NULL); /* 设置回调函数 */lv_flie.lv_prev_btn = lv_label_create(parent);lv_obj_set_style_text_font(lv_flie.lv_prev_btn,&myFont24,LV_STATE_DEFAULT);lv_label_set_text(lv_flie.lv_prev_btn,"返回");lv_obj_align_to(lv_flie.lv_prev_btn,parent,LV_ALIGN_LEFT_MID,10,0);lv_obj_add_flag(lv_flie.lv_prev_btn,LV_OBJ_FLAG_CLICKABLE); /* 设置标签可点击 */lv_obj_add_event_cb(lv_flie.lv_prev_btn,lv_back_btn_event_handler,LV_EVENT_ALL,NULL);
}/*** @brief  文件系统返回/菜单按键的区域* @param  parent: 父类* @retval 无*/
void lv_page_back(lv_obj_t *parent)
{lv_flie.lv_back_obj = lv_obj_create(parent);                                                            /* 创建文件返回对象区域 */lv_obj_set_size(lv_flie.lv_back_obj,lcddev.width,myFont24.line_height+10);                              /* 设置改区域的大小 */lv_obj_set_style_bg_color(lv_flie.lv_back_obj,lv_palette_main(LV_PALETTE_GREY),LV_STATE_DEFAULT);       /* 设置该区域的颜色为灰色 */lv_obj_set_style_radius(lv_flie.lv_back_obj,0,LV_STATE_DEFAULT);                                        /* 设置圆半径为0 */lv_obj_align_to(lv_flie.lv_back_obj,parent,LV_ALIGN_BOTTOM_MID,0,0);                                    /* 设置对齐模式 */lv_general_win_create(lv_flie.lv_back_obj);                                                             /* 创建返回和菜单按键 */
}/*** @brief  列表初始化* @param  parent: 父类* @retval 无*/
void list_init(lv_obj_t *parent)
{lv_flie.lv_pash = "0:";                                 /* 初始路径 */lv_flie.lv_prev_file_flag = 0;                          /* 上一个文件路径标志位清0 */lv_flie.lv_prev_file[lv_flie.lv_prev_file_flag] = "0:"; /* 初始上个文件夹路径 */lv_flie.list_flie_nuber = 0;                            /* 初始文件数量 */lv_flie.lv_suffix_flag = 1;                             /* 文件后缀标志位 */lv_scan_files(lv_flie.lv_pash,parent);                  /* 读取文件路径 */
}/*** @brief  控件测试函数* @param  无* @retval 无*/
void lv_mainstart(void)
{lv_page_tile(lv_scr_act());         /* 设置页面标题 */lv_page_back(lv_scr_act());         /* 设置页面返回 */list_init(lv_scr_act());            /* 列表初始化 */
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust基本类型

数值类型 整数类型 无符号整数只能取正数和0&#xff0c;有符号整数可以取正数负数和0。isize和usize类型取决于程序运行的计算机CPU类型&#xff0c;若CPU是32位的&#xff0c;则这两个类型是32位的&#xff0c;若CPU是64位的&#xff0c;则它们是64位的。rust整型 默认使用…

为响应国家号召,搜维尔科技开启虚拟仿真实验室设备升级改造服务

近日&#xff0c;国务院发布了关于《推动大规模设备更新和消费品以旧换新行动方案》&#xff0c;该通知的发布表现出国家对于科技创新事业的高度重视。各行各业都在积极响应国家号召&#xff0c;加快数字化转型和设备升级与更新步伐。搜维尔科技为响应国家号召&#xff0c;将开…

Redission 分布式锁原理分析

一、前言 我们先来说说分布式锁&#xff0c;为啥要有分布式锁呢? 像 JDK 提供的 synchronized、Lock 等实现锁不香吗&#xff1f;这是因为在单进程情况下&#xff0c;多个线程访问同一资源&#xff0c;可以使用 synchronized 和 Lock 实现&#xff1b;在多进程情况下&#xff…

单链表交叉分离,运用头插法,尾插法(算法库应用)

原文博客链接:单链表分离(头插法和尾插法的结合,理解指针变换)_3.对任务1或者2中创建的某一个单链表{a1,b1,a2,b2,...,an,bn},编写一个算法将-CSDN博客 函数实现: /************************************************** 函数名:separate_LinkList 功 能: 把一个链表,交叉新建…

电机控制杂谈——永磁同步电机中的永磁体谐波反电势

1.问题的引出 在我的谐波抑制专题中&#xff0c;讲了三种谐波抑制的策略。当时是通过增大逆变器死区来产生较大的谐波。但是在实际电机里面&#xff0c;我感觉死区的影响基本上没有。。。课题组的驱动器中&#xff0c;逆变器的非线性其实基本可以忽略不计了。 但是&#xff0…

langchin-chatchat部分开发笔记(持续更新)

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径及一点个人思考大模型应用开发实用开源项目汇总大模型问答项目…

SpringBoot中处理校验逻辑的两种方式:Hibernate Validator+全局异常处理

最近正在开发一个校园管理系统&#xff0c;需要对请求参数进行校验&#xff0c;比如说非空啊、长度限制啊等等&#xff0c;可选的解决方案有两种&#xff1a; 一种是用 Hibernate Validator 来处理一种是用全局异常来处理 两种方式&#xff0c;我们一一来实践体验一下。 一、…

AXI4-Stream Interconnect IP核(1)——原理

一、概述 AXI4-Stream Interconnect 是复杂片上系统&#xff08;SoC&#xff09;和现场可编程门阵列&#xff08;FPGA&#xff09;应用设计中的关键组件&#xff0c;它负责在系统内部不同模块之间路由数据流。AXI4-Stream协议是ARM引入的AMBA&#xff08;高级微控制器总线架构&…

插入排序和希尔排序:

插入排序 1. 算法思想&#xff1a; 由数组下标为1 开始的数值作为判断依据&#xff0c;与之前的数据从后往前比较定义tmp 暂存判断的数值&#xff0c;若前面的数据大于tmp&#xff0c;则将前面的数据向后移动 : arr[j1]arr[j]若对比的数据比tmp 大&#xff0c;则往后移&#…

JavaIO流与字节输出流OutputStream

1 概述 1.1 什么是IO流 IO流是存储和读取数据的解决方案&#xff0c;用于读写文件中的数据&#xff08;包括本地文件、网络等&#xff09; IO流的参照是程序或内存&#xff0c;即使程序在读&#xff0c;程序在写。 1.2 IO的分类 根据流的方向分为&#xff1a;输入流和输出流…

C++STL学习之unordered_map与unordered_set(底层Hash)

前言&#xff1a;我们前面已经学习论map和set&#xff0c;现在又冒出来一个unordered_map和unordered_set&#xff0c;这两个有啥差别吗&#xff1f;前面我们已经说过&#xff0c;map和set的底层是红黑树&#xff0c;那unordered_map和unordered_set的底层是什么呢&#xff1f;…

esp32CAM环境搭建(arduino+MicroPython+thonny+固件)

arduino ide 开发工具 arduino版本&#xff1a;1.8.19 arduino ide 中文设置&#xff1a;​ file >> preferences >> ​ arduino IDE 获取 ESP32 开发环境&#xff1a;打开 Arduino IDE &#xff0c;找到 文件>首选项 ,将 ESP32 的配置链接填入附加开发板管理网…

【Canvas与艺术】简约式胡萝卜配色汽车速度表

【效果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>胡萝卜色汽车速度仪表盘简化版</title><style type"…

2月京东天猫淘宝茗茶电商数据分析(茗茶行业未来趋势分析)

随着消费者对健康饮食和品质生活的追求&#xff0c;茗茶行业受到许多青睐和关注。 根据鲸参谋数据显示&#xff0c;今年2月&#xff0c;茗茶行业在某东平台上销售数据呈现出一种特殊的趋势。销售量总计约450万件&#xff0c;同比去年下滑了7%。&#xff1b;销售额总计6.4亿元&…

Linux安装Maven

一、下载安装Maven 1.1 下载地址 官网下载地址: https://maven.apache.org/download.cgi 1.2 安装版本下载 进入下载页面选择需要的版本进行下载。 1.3 版本安装 将下载完的安装包&#xff0c;上传到Linux服务器上某个目录下&#xff0c;将其解压出来就好。 ## 创建安装…

《无名之辈》新手攻略:抢先领取神秘礼包!

欢迎来到《无名之辈》&#xff01;在这个丰富多彩的冒险世界里&#xff0c;你将踏上一段充满挑战与机遇的旅程。以下是针对新手玩家的详尽攻略&#xff0c;助你快速提升实力&#xff0c;成为一名优秀的冒险者。 第一步&#xff1a;迅速起步 当你第一次踏入《无名之辈》的世界时…

文献速递:基于SAM的医学图像分割--SAMUS:适应临床友好型和泛化的超声图像分割的Segment Anything模型

Title 题目 SAMUS: Adapting Segment Anything Model for Clinically-Friendly and Generalizable Ultrasound Image Segmentation SAMUS&#xff1a;适应临床友好型和泛化的超声图像分割的Segment Anything模型 01 文献速递介绍 医学图像分割是一项关键技术&#xff0c;用…

ubuntu卸载Anaconda

1. 删除配置的环境变量 sudo gedit ~/.bashrc # >>> conda initialize >>> # !! Contents within this block are managed by conda init !! __conda_setup"$(/work3/ai_tool/anaconda3/bin/conda shell.bash hook 2> /dev/null)" if [ $? -…

edge浏览器彻底删除用户账号

效果图 操作教程 -- 这个教程里面比较重要的是3,5,8 -- 如果不执行第8步&#xff0c;还是没有任何效果。 -- 教程地址 https://blog.csdn.net/qq_37579133/article/details/128777770 继续删除windows凭据 结束 -----华丽的分割线&#xff0c;以下是凑字数&#xff0c;大家不…

《无名之辈》天涯镖局攻略:高效拉镖窍门!

《无名之辈》天涯镖局开启要注意什么&#xff0c;在这里&#xff0c;每一次运镖都是一次刺激的冒险&#xff0c;而掌握合适的策略将让你事半功倍。以下是天涯镖局的开启攻略&#xff0c;助你在危机四伏的路途上赢得胜利。 ① 拉取适当级别的包子和加速卡 在天涯镖局中&#xf…