当前位置: 首页 > news >正文

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

  • 参考文章
  • 源码下载地址
  • 一、SDL2的创建、初始化、退出
  • 二、系统基本Tick、彩屏刷新、按键事件
  • 三、彩屏获取与设置颜色
  • 四、彩屏填充颜色及清屏
  • 五、彩屏显示中文和英文字符串
  • 六、彩屏显示数字
  • 七、彩屏初始化
  • 八、主函数测试
  • 九、测试效果

参考文章

  • 在CodeBlocks下搭建SDL2开发工程
  • 在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)



源码下载地址

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示


一、SDL2的创建、初始化、退出


typedef struct
{SDL_Window   * MainWindow;  /* 窗口 */SDL_Renderer * MainRender;  /* 渲染器 */SDL_Texture  * MainTexture; /* 纹理 */u8             ExitWindow;  /* 退出窗口 */
}AppGlobal_TypeDef, * AppGlobal_TypeDef_t;static AppGlobal_TypeDef AppSystem = {0};
AppGlobal_TypeDef * pAppSystem = &AppSystem;/* 初始化SDL */
static u8 ubInit_SDL2(void)
{/* 初始化SDL */if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0){SDL_Log("SDL Init Fail......%s\r\n", SDL_GetError());return 1;}/* 创建窗口 */AppSystem.MainWindow = SDL_CreateWindow("Virtual TFT SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_PHY_WIDTH, WINDOW_PHY_HEIGHT, SDL_WINDOW_SHOWN);if (AppSystem.MainWindow == NULL){SDL_Log("SDL Create Window Fail......%s\r\n", SDL_GetError());return 2;}/* 创建渲染器 */AppSystem.MainRender = SDL_CreateRenderer(AppSystem.MainWindow, -1, SDL_RENDERER_ACCELERATED);if (AppSystem.MainRender == NULL){SDL_Log("SDL Create Renderer Fail......%s", SDL_GetError());return 3;}/* 创建纹理 */AppSystem.MainTexture = SDL_CreateTexture(AppSystem.MainRender, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, TFT_LCD_PHY_XWIDTH, TFT_LCD_PHY_YHEIGHT);if (AppSystem.MainTexture == NULL){SDL_Log("SDL Create Texture Fail......%s", SDL_GetError());return 4;}/* 设置纹理模式 */SDL_SetTextureBlendMode(AppSystem.MainTexture, SDL_BLENDMODE_BLEND);memset(TFT_LCD_DIS_MEMORY, 0x99, TFT_LCD_PHY_XWIDTH * TFT_LCD_PHY_YHEIGHT * sizeof(u32));SDL_UpdateTexture(AppSystem.MainTexture, NULL, TFT_LCD_DIS_MEMORY, TFT_LCD_PHY_XWIDTH * sizeof(u32));SDL_RenderClear(AppSystem.MainRender);SDL_RenderCopy(AppSystem.MainRender, AppSystem.MainTexture, NULL, NULL);SDL_RenderPresent(AppSystem.MainRender);return 0;
}/* 退出SDL */
static void vQuit_SDL2(void)
{SDL_Log("Complier Date: %s  %s %d\r\n", __DATE__, __TIME__, ulSuperTimer_GetTick());/* 销毁纹理 */if (AppSystem.MainTexture != NULL) SDL_DestroyTexture(AppSystem.MainTexture);/* 销毁渲染器 */if (AppSystem.MainRender != NULL)  SDL_DestroyRenderer(AppSystem.MainRender);/* 销毁窗口 */if (AppSystem.MainWindow != NULL) SDL_DestroyWindow(AppSystem.MainWindow);/* 退出SDL */SDL_Quit();
}



二、系统基本Tick、彩屏刷新、按键事件


/* 系统基本Tick */
static void vSystem_BasicTick(void)
{static Uint64 oldTick = 0;Uint64 curTick = SDL_GetTicks64();if (oldTick == curTick) return;vSuperTimer_IncTick((u16)(curTick - oldTick));oldTick = curTick;
}/* 屏幕刷新+按键事件处理 */
static void vRefresh_KeyEvent_Handler(void)
{static Uint64 oldTick = 0;Uint64 curTick  = SDL_GetTicks64();SDL_Event event = {0};if ((curTick - oldTick) >= 20){SDL_UpdateTexture(AppSystem.MainTexture, NULL, TFT_LCD_DIS_MEMORY, TFT_LCD_PHY_XWIDTH * sizeof(u32));SDL_RenderClear(AppSystem.MainRender);SDL_RenderCopy(AppSystem.MainRender, AppSystem.MainTexture, NULL, NULL);SDL_RenderPresent(AppSystem.MainRender);oldTick = curTick;}while (SDL_PollEvent(&event)){switch (event.type){case SDL_QUIT: AppSystem.ExitWindow = EXIT_WINDOW_TYPE_QUIT; break;case SDL_KEYDOWN:{switch (event.key.keysym.sym){case SDLK_UP:    SDL_Log("SDLK_UP......\r\n");    break;case SDLK_DOWN:  SDL_Log("SDLK_DOWN......\r\n");  break;case SDLK_LEFT:  SDL_Log("SDLK_LEFT......\r\n");  break;case SDLK_RIGHT: SDL_Log("SDLK_RIGHT......\r\n"); break;default: break;}}break;default: break;}}
}



三、彩屏获取与设置颜色


/* 设置颜色 */
void vTFT_LCD_SetColor(u32 x, u32 y, ColorType color)
{/* 越界 */if (x > (AppDevTFT.xWidth  - 1)) return;if (y > (AppDevTFT.yHeight - 1)) return;AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(color);
}/* 获取颜色 */
ColorType xTFT_LCD_GetColor(u32 x, u32 y)
{/* 越界 */if (x > (AppDevTFT.xWidth  - 1)) return 0;if (y > (AppDevTFT.yHeight - 1)) return 0;return RGB_DEV(AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x]);
}



四、彩屏填充颜色及清屏


/* 填充矩形(单色) */
void vTFT_LCD_FillRect_SinColor(u32 x1, u32 y1, u32 x2, u32 y2, ColorType color)
{u32 x = 0, y = 0;/* 越界 */if (x1 > (AppDevTFT.xWidth  - 1)) return;if (y1 > (AppDevTFT.yHeight - 1)) return;/* 最大范围 */if (x2 > (AppDevTFT.xWidth  - 1)) x2 = (AppDevTFT.xWidth - 1);if (y2 > (AppDevTFT.yHeight - 1)) y2 = (AppDevTFT.yHeight - 1);/* 填充颜色 */for (x = x1; x <= x2; x++){for (y = y1; y <= y2; ++y){AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(color);}}
}/* 填充矩形(多色) */
void vTFT_LCD_FillRect_MultColor(u32 x1, u32 y1, u32 x2, u32 y2, ColorType * pColor)
{u32 x = 0, y = 0, ex = 0, ey = 0;/* 越界 */if (x1 > (AppDevTFT.xWidth  - 1)) return;if (y1 > (AppDevTFT.yHeight - 1)) return;/* 最大范围 */ex = (x2 > (AppDevTFT.xWidth  - 1)) ? (AppDevTFT.xWidth  - 1) : x2;ey = (y2 > (AppDevTFT.yHeight - 1)) ? (AppDevTFT.yHeight - 1) : y2;for (y = y1; y <= ey; y++){for (x = x1; x <= ex; ++x){AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(*pColor);}pColor += (x2 - ex);}
}/* 清屏幕 */
void vTFT_LCD_ClearScreen(ColorType color)
{u32 x = 0, y = 0;for (x = 0; x <= (AppDevTFT.xWidth - 1); x++){for (y = 0; y <= (AppDevTFT.yHeight - 1); ++y){AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(color);}}
}



五、彩屏显示中文和英文字符串


/* 获取字符数据源地址 */
static void vGet_CharSrc(u8 chr, u8 charSize, u8 ** pSrc)
{switch (charSize){case ASCII_FONT_TYPE_1206 : *pSrc = (u8 *)(&ASCII_FONT_1206[chr - ' ']); break;case ASCII_FONT_TYPE_1608 : *pSrc = (u8 *)(&ASCII_FONT_1608[chr - ' ']); break;case ASCII_FONT_TYPE_2412 : *pSrc = (u8 *)(&ASCII_FONT_2412[chr - ' ']); break;default: *pSrc = NULL; break;}
}/* 显示字符 */
static void vTFT_LCD_DisplayChar(u32 x, u32 y, u8 chr, u8 charSize, ColorType backColor, ColorType foreColor)
{ColorType color = foreColor;u8 charByte = 0, k = 0, i = 0;u8 dat = 0, * pSrcDat = NULL;u32 y0 = y;//获取字符数据源地址vGet_CharSrc(chr, charSize, &pSrcDat);if (pSrcDat == NULL) return;// 字符点阵占用字节数charByte = ((charSize >> 3) + ((charSize & 0x07) ? 1 : 0)) * (charSize >> 1);// 遍历字符点阵数据for(k = 0; k < charByte; ++k){dat = pSrcDat[k];for(i = 0; i < 8; ++i){// 显示有效范围if ((x < AppDevTFT.xWidth) && (y < AppDevTFT.yHeight)){//低位在前if ((dat >> i) & 0x01) color = foreColor;else                   color = backColor;vTFT_LCD_SetColor(x, y, color);}y++;// 纵坐标自加if (XABS2(y , y0) >= charSize)//纵坐标偏移量等于字符点阵高度{y = y0;x++;break;}}}
}/* 显示字符串 */
void vTFT_LCD_DisplayString(u32 x, u32 y, u8 * pStr, u8 strSize, ColorType backColor, ColorType foreColor)
{//显示ASCII常规字符while ((*pStr >= ' ') && (*pStr <= '~')){/* 剩余的横纵小于字体宽度 换行显示 */if ((x + (strSize >> 1)) >= AppDevTFT.xWidth){y += strSize;x  = 0;}/* 剩余纵轴小于字体高度 */// if ((y + strSize) >= AppDevTFT.yHeight)if (y >= AppDevTFT.yHeight){return;}vTFT_LCD_DisplayChar(x, y, *pStr, strSize, backColor, foreColor);x += (strSize >> 1);pStr++;}
}/* 显示中文字符 */
static void vTFT_LCD_Display_ChineseChar(u32 x, u32 y, u32 xWidth, u32 yHeight, const u8 * pData, ColorType backColor, ColorType foreColor)
{ColorType color = foreColor;u16 k = 0, j = 0, n = 0, i = 0;u32 y0 = y, yMax = 0;u8 dat = 0;yMax = (yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0); //高度y0   = y; //原始纵坐标for(k = 0; k < xWidth; k++){for(j = 0; j < yMax; j++){dat = pData[n++];for(i = 0; i < 8; i++){if ((y < AppDevTFT.yHeight) && (x < AppDevTFT.xWidth)){//低位在前if ((dat >> i) & 0x01) color = foreColor;else                   color = backColor;vTFT_LCD_SetColor(x, y, color);}y++;//纵坐标处理if (XABS2(y , y0) >= yHeight){y = y0;x++;//横坐标处理break;}}}}
}/* 显示中文字符串 */
void vTFT_LCD_Display_ChineseString(u32 x, u32 y, u32 xWidth, u32 yHeight, u8 * pData, u16 num, ColorType backColor, ColorType foreColor)
{u16 i = 0;u8 charByte = 0;u8 * pMem = pData;/* 异常 */if ((!num) || (pData == NULL)) return;// 字符点阵占用字节数charByte = ((yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0)) * xWidth;for (i = 0; i < num; ++i){/* 剩余的横纵小于字体宽度 换行显示 */if ((x + xWidth) > AppDevTFT.xWidth){y += yHeight;x  = 0;}/* 剩余纵轴小于字体高度 */// if ((y + yHeight) >= AppDevTFT.yHeight)if (y >= AppDevTFT.yHeight){return;}pMem = pData + (charByte * i);vTFT_LCD_Display_ChineseChar(x, y, xWidth, yHeight, pMem, backColor, foreColor);x += xWidth;}
}



六、彩屏显示数字


static u8 ubGet_EveryBit_Digit(u8 * pDat, u32 num)
{u8 i = 0;while (1){pDat[i++] = num % 10;num = num / 10;if (!num){break;}}u8 temp = 0;for (num = 0; num < (i >> 1); ++num){temp = pDat[num];pDat[num] = pDat[i - num - 1];pDat[i - num - 1] = temp;}return i;
}/* 显示数字 */
void vTFT_LCD_DisplayNumber(u32 x, u32 y, u32 num, u8 charSize, ColorType backColor, ColorType foreColor)
{u8 mem[20] = {0};u8 chr = 0, i = 0, len = ubGet_EveryBit_Digit(mem, num);for (i = 0; i < len; ++i){/* 剩余的横纵小于字体宽度 换行显示 */if ((x + (charSize >> 1)) >= AppDevTFT.xWidth){y += charSize;x  = 0;}/* 剩余纵轴小于字体高度 */// if ((y + charSize) >= AppDevTFT.yHeight)if (y >= AppDevTFT.yHeight){return;}chr = mem[i] + 0x30;vTFT_LCD_DisplayChar(x, y, chr, charSize, backColor, foreColor);x += (charSize >> 1);}
}



七、彩屏初始化


/* 初始化TFT */
void vTFT_Init(void)
{AppDevTFT.xWidth  = TFT_LCD_PHY_XWIDTH;AppDevTFT.yHeight = TFT_LCD_PHY_YHEIGHT;AppDevTFT.pDisMem = TFT_LCD_DIS_MEMORY;AppDevTFT.BackColor = 0xDCDCDC;AppDevTFT.ForeColor = 0xFFFFFF;vTFT_LCD_ClearScreen(AppDevTFT.BackColor);vTFT_LCD_DisplayString(10,  10, (const u8 *)"Compiler: ", ASCII_FONT_TYPE_1608, 0, 0x00FF00);vTFT_LCD_DisplayString(90,  10, (const u8 *)__DATE__,     ASCII_FONT_TYPE_1608, 0, 0x00FF00);vTFT_LCD_DisplayString(178, 10, (const u8 *)"  ",         ASCII_FONT_TYPE_1608, 0, 0x00FF00);vTFT_LCD_DisplayString(194, 10, (const u8 *)__TIME__,     ASCII_FONT_TYPE_1608, 0, 0x00FF00);vTFT_LCD_DisplayString(10, 50,  (const u8 *)"xDemo TFT1...123ABC~!@#$%^&*()-=", ASCII_FONT_TYPE_1206, 0, 0xFFFF00);vTFT_LCD_DisplayString(10, 70,  (const u8 *)"xDemo TFT2...123ABC", ASCII_FONT_TYPE_1608, 0xFFFFFF, 0x0000FF);vTFT_LCD_DisplayString(10, 100, (const u8 *)"xDemo TFT3...123ABC", ASCII_FONT_TYPE_2412, 0, 0xF59A23);vTFT_LCD_Display_ChineseString(10, 140, 18, 18, (u8 *)&ChineseDemo[1], 9, 0, 0xFF0000);vTFT_LCD_DisplayNumber(10, 200, 985, ASCII_FONT_TYPE_2412, 0xDCDCDC, 0xFF0000);
}



八、主函数测试


int main( int argc, char * argv[] )
{if (ubInit_SDL2()){SDL_Log("Init SDL Fail......%s\r\n", SDL_GetError());vQuit_SDL2();return -1;}vTFT_Init();xSuperTimer_Init();AppSystem.ExitWindow = EXIT_WINDOW_TYPE_RUN;ubSuperTimer_Start(xDemo, 1000);while (AppSystem.ExitWindow){vRefresh_KeyEvent_Handler();vSystem_BasicTick();vSuperTimer_RunHandler();}vQuit_SDL2();return 0;
}



九、测试效果

在这里插入图片描述

在这里插入图片描述

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

相关文章:

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示 参考文章源码下载地址一、SDL2的创建、初始化、退出二、系统基本Tick、彩屏刷新、按键事件三、彩屏获取与设置颜色四、彩屏填充颜色及清屏五、彩屏显示中文和英文字符串六、彩屏显示数字七、彩屏初始化八、主函数测…...

BurstAttention:高效的分布式注意力计算框架

BurstAttention&#xff1a;高效的分布式注意力计算框架 在现代大型语言模型&#xff08;LLMs&#xff09;的应用中&#xff0c;提升注意力机制的计算效率已成为研究的热点。当前&#xff0c;提升计算效率主要有两种方法&#xff1a;一种是优化单设备的计算和存储能力&#xf…...

sentinel集成nacos启动报[check-update] get changed dataId error, code: 403错误排查及解决

整合nacos报403错误 因为平台写的一个限流代码逻辑有问题&#xff0c;所以准备使用sentinel来限流。平台依赖里面已经引入了&#xff0c;之前也测试过&#xff0c;把sentinel关于nacos的配置加上后&#xff0c;启动一直输出403错误 [fixed-10.0.20.188_8848-test] [check-upda…...

[TOTP]android kotlin实现 totp身份验证器 类似Google身份验证器

背景&#xff1a;自己或者公司用一些谷歌身份验证器或者microsoft身份验证器&#xff0c;下载来源不明&#xff0c;或者有广告&#xff0c;使用不安全。于是自己写一个&#xff0c;安全放心使用。 代码已开源&#xff1a;shixiaotian/sxt-android-totp: android totp authenti…...

IDEA+Docker一键部署项目SpringBoot项目

文章目录 1. 部署项目的传统方式2. 前置工作3. SSH配置4. 连接Docker守护进程5. 创建简单的SpringBoot应用程序6. 编写Dockerfile文件7. 配置远程部署 7.1 创建配置7.2 绑定端口7.3 添加执行前要运行的任务 8. 部署项目9. 开放防火墙的 11020 端口10. 访问项目11. 可能遇到的问…...

【发票提取明细+发票号改名】批量提取PDF电子发票明细导出Excel表格并改名技术难点,批量PDF多区域内容识别提取明细并用内容改名的小结

1、图片版的发票提取表格改名 【批量图片发票识别表格】批量图片发票的提取Excel表格和提取字段改名&#xff0c;扫描发票识别表格&#xff0c;拍照发票识别表格&#xff0c;图片发票识别改名我们在工作中很多扫描发票&#xff0c;拍照发票&#xff0c;需要整理成excel表格&am…...

pyQT + OpenCV相关练习

一、设计思路 1、思路分析与设计 本段代码是一个使用 PyQt6 和 OpenCV 创建的图像处理应用程序。其主要功能是通过一个图形界面让用户对图片进行基本的图像处理操作&#xff0c;如灰度化、翻转、旋转、亮度与对比度调整&#xff0c;以及一些滤镜效果&#xff08;模糊、锐化、边…...

石岩路边理发好去处

周末带娃去罗租公园玩&#xff0c;罗租公园旁边就是百佳华和如意豪庭小区&#xff0c;发现如意豪庭小区对面挺多路边理发摊点 理发摊点聚焦在这里的原因是刚好前面城管来了暂时避避&#xff0c;例如还有一个阿姨剪到一半就跟着过来。这里的城管只是拍了一处没有摊位的地方&…...

音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件

一、错误的命令 通过FFmpeg命令可以将mp4文件转换为ps文件&#xff0c;PS文件中包含PS流数据。 由于PS流/PS文件对应的FFInputFormat结构为&#xff1a; const FFInputFormat ff_mpegps_demuxer {.p.name "mpeg",.p.long_name NULL_IF_CONFIG_SMALL…...

整合版canal ha搭建--基于1.1.4版本

开启MySql Binlog&#xff08;1&#xff09;修改MySql配置文件&#xff08;2&#xff09;重启MySql服务,查看配置是否生效&#xff08;3&#xff09;配置起效果后&#xff0c;创建canal用户&#xff0c;并赋予权限安装canal-admin&#xff08;1&#xff09;解压 canal.admin-1…...

[python SQLAlchemy数据库操作入门]-15.联合查询,跨表获取股票数据

哈喽,大家好,我是木头左! 在开始探讨如何利用SQLAlchemy实现复杂的联合查询之前,首先需要深入理解其核心组件——对象关系映射(ORM)。ORM允许开发者使用Python类来表示数据库中的表,从而以一种更直观、面向对象的方式来操作数据库。 SQLAlchemy中的JOIN操作详解 在SQLA…...

PTA数据结构作业一

6-1 链表的插入算法 本题要求实现一个插入函数&#xff0c;实现在链表llist中的元素x之后插入一个元素y的操作。 函数接口定义&#xff1a; int InsertPost_link(LinkList llist, DataType x, DataType y); 其中 llist是操作的链表&#xff0c;x是待插入元素y的前驱节点元素…...

前端(九)js介绍(2)

js介绍(2) 文章目录 js介绍(2)一、函数1.1函数的两种形式1.2函数的作用域1.3声明与提升 二、bom操作三、dom操作 一、函数 1.1函数的两种形式 //有参函数 //js中的函数只能返回一个值&#xff0c;如果要返回多个需要放在数组或对象中 function func(a,b){return ab } func(1,…...

CUTLASS:高性能 CUDA 线性代数模板库详解

CUTLASS&#xff1a;高性能 CUDA 线性代数模板库详解 引言什么是 CUTLASS&#xff1f;CUTLASS 的主要特点&#xff1a; CUTLASS 的用途如何安装 CUTLASS1. 环境准备2. 下载 CUTLASS3. 构建 CUTLASS4. 设置环境变量5. 验证安装 使用 CUTLASSCUTLASS 的优势总结 引言 在深度学习…...

关于CISP报名费用详情

CISP即“注册信息安全专业人员”&#xff0c;是中国信息安全测评中心实施的国家认证项目&#xff0c;旨在培养信息安全领域的专业人才。对于有意报考CISP的考生而言&#xff0c;了解报名考试费用是备考过程中不可或缺的一环。 CISP的报名考试费用主要包括培训费用、考试费用、…...

css 关于flex布局中子元素的属性flex

css flex布局中子元素的属性flex 1. flex 是 flex-grow、flex-shrink 和 flex-basis 的简写 语法格式&#xff1a; flex: [flex-grow] [flex-shrink] [flex-basis];各属性解析&#xff1a; flex-grow: 子元素如何按比例分配父元素的 剩余空间。 默认值&#xff1a;0&#…...

功率器件热设计基础(四)——功率半导体芯片温度和测试方法

/ 前言 / 功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础&#xff0c;只有掌握功率半导体的热设计基础知识&#xff0c;才能完成精确热设计&#xff0c;提高功率器件的利用率&#xff0c;降低系统成本&#xff0c;并保证系统的可靠性。 功率器件热设计基础系列文章会…...

OpenStack系列第四篇:云平台基础功能与操作(Dashboard)

文章目录 1. 镜像&#xff08;Image&#xff09;添加镜像查看镜像删除镜像 2. 卷&#xff08;Volume&#xff09;创建卷查看卷删除卷 3. 网络&#xff08;虚拟网络&#xff09;创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对&#xff08…...

WebSocket封装

提示:记录工作中遇到的需求及解决办法 文章目录 前言二、背景三、WebSocket3.1 什么是 WebSocket ?为什么使用他?四、封装 WebSocket4.1 Javascript 版本4.2 Typescript 版本4.3 如何使用?五、我的痛点如何处理前言 本文将介绍 WebSocket 的封装,比如:心跳机制,重连和一…...

面试题解,JVM的运行时数据区

一、请简述JVM运行时数据区的组成结构及各部分作用 总览 从线程持有的权限来看 线程私有区 虚拟机栈 虚拟机栈是一个栈结构&#xff0c;由许多个栈帧组成&#xff0c;一个方法分配一个栈帧&#xff0c;线程每执行一个方法时都会有一个栈帧入栈&#xff0c;方法执行结束后栈帧…...

【Ubuntu使用技巧】Ubuntu22.04无人值守Crontab工具实战详解

一个愿意伫立在巨人肩膀上的农民...... Crontab是Linux和类Unix操作系统下的一个任务调度工具&#xff0c;用于周期性地执行指定的任务或命令。Crontab允许用户创建和管理计划任务&#xff0c;以便在特定的时间间隔或时间点自动运行命令或脚本。这些任务可以按照分钟、小时、日…...

Caffeine Cache Java缓存组件

缓存组件Caffeine Cache 定义介绍整合springboot用法整合spring-boot-starter-cache用法 定义介绍 特性 高性能&#xff1a;基于高效并发设计和 TinyLFU 算法&#xff0c;命中率高。 丰富策略&#xff1a;支持容量限制、过期时间、异步加载、自定义清理策略。 统计监控&#x…...

电子电气架构 --- 什么是自动驾驶技术中的域控制单元(DCU)?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

Redis核心技术知识点全集

Redis数据结构和常用命令 1. String字符串2. Hash哈希3. List列表4. Set集合5. Sorted Set有序集合6. Redis常用命令参考Redis事务机制...

【每日学点鸿蒙知识】文件读写、屏幕宽度亮度、扫一扫权限、编码器问题、wlan设置

1、参照文档&#xff0c;在操作文件时&#xff0c;读取不到内容或出现程序闪退&#xff1f; 参照文档&#xff0c;进行文件写入和读取时&#xff0c;出现读取不到或闪退 export function createFile() {// 获取应用文件路径let context getContext(this) as common.UIAbilit…...

后端开发-Maven

环境说明&#xff1a; windows系统&#xff1a;11版本 idea版本&#xff1a;2023.3.2 Maven 介绍 Apache Maven 是一个 Java 项目的构建管理和理解工具。Maven 使用一个项目对象模型&#xff08;POM&#xff09;&#xff0c;通过一组构建规则和约定来管理项目的构建&#xf…...

LiteFlow 流程引擎引入Spring boot项目集成pg数据库

文章目录 官网地址简要项目引入maven 所需jar包配置 PostgreSQL 数据库表使用LiteFlow配置 yml 文件通过 代码方式使用 liteflow数据库sql 数据在流程中周转 官网地址 https://liteflow.cc/ 简要 如果你要对复杂业务逻辑进行新写或者重构&#xff0c;用LiteFlow最合适不过。…...

电子电气架构 --- 汽车电子电器设计概述

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

API 设计:从基础到最佳实践

https://levelup.gitconnected.com/api-design-101-from-basics-to-best-practices-a0261cdf8886 在本次深入研究中&#xff0c;我们将从基础开始&#xff0c;逐步了解 API 设计&#xff0c;并逐步实现定义卓越 API 的最佳实践。 作为开发人员&#xff0c;您可能熟悉其中的许多…...

简易内存池(中)

提示&#xff1a;文章 文章目录 前言一、背景二、第二版代码用例2用例3用例4用例5 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 最近 二、 针对上述失败用例&#xff0c;修改代码如下 第二版代码 #include <stdbool.h> #include <stdio.h>…...

svn不能添加.a文件

解决办法 在home目录下有一个.subversion文件夹&#xff0c;文件夹内有个config文件&#xff0c;里面可以修改过滤的文件类型 在使用命令svn add的时候带上参数–no-ignore&#xff0c;这样就会不顾config中的规则&#xff0c;将指定路径的文件都添加到版本库中 rockyrocky:/e…...

PH47代码框架 24241231 重要更新

仪式感一下&#xff1a;2024年最后一天&#xff0c;发布 PH47 代码框架的一次重要更新。当然这并不是有意的&#xff0c;而是直到现在才把更新的所有工作全部做完&#xff08;希望确实如此&#xff09;。 本次更新要点&#xff1a; 1、加入多IMU支持。本次更新正式加入对 MPU65…...

小程序信息收集(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…...

用户界面的UML建模07

4.2 抽象表示层的行为&#xff08;Abstract Presentation Behaviour&#xff09; AbstractForm 类定义了一组如下所示的四种操作&#xff1a; showForm() &#xff0c; getData() &#xff0c; sendConfirmation() 和sendCancellation()。在该阶段的设计过程&#xff08;desig…...

LabVIEW手部运动机能实验系统

在运动科学、人机交互和康复训练等领域&#xff0c;手部运动功能的研究具有重要的应用价值。开发了一个基于LabVIEW的手部运动机能实验系统设计&#xff0c;该系统利用力量作为关键参数&#xff0c;通过实时数据采集和反馈帮助受试者完成精确的手部动作&#xff0c;同时为研究人…...

Java Map 源码解析:核心原理与应用

Java Map 源码解析&#xff1a;核心原理与应用 Java 的 Map 接口是集合框架中一个重要的组成部分&#xff0c;专门用于存储键值对。其强大的功能和灵活的实现使其在各种应用场景中得到了广泛的使用。本文面向对 Java 集合框架有一定了解的开发者&#xff0c;通过对 Map 接口及…...

基于Mosquito源码理解MQTT5.0的属性概念

MQTT 5.0协议相比之前的版本(如MQTT 3.1.1)增加了很多属性,这些属性分布于报文的可变头部(Variable Header)和有效载荷(Payload)中。这些属性大大增强了协议的可扩展性和灵活性,使其能够更好地适应现代物联网应用的复杂需求。 属性的定义在源码包mosquitto-2.0.18/inc…...

easyui textbox使用placeholder无效

easyui textbox使用placeholder无效 在easyui 的textbox控件&#xff0c;请使用data-options 设定 示例 <input type text class easyui-textbox data-options "prompt:请输入您的邮箱"/>...

java AQS

什么是AQS AQS&#xff08;AbstractQueuedSynchronizer&#xff0c;抽象队列同步器&#xff09;是 Java 中并发控制的一种机制&#xff0c;位于 java.util.concurrent.locks 包下&#xff0c;它为构建锁、信号量等同步工具提供了一个框架。AQS 通过 队列 来管理多个线程之间的…...

机器人对物体重定向操作的发展简述

物体重定向操作的发展简述 前言1、手内重定向和外部重定向2、重定向原语3、重定向状态转换网络4、连续任意姿态的重定向5、利用其他环境约束重定向总结Reference 前言 对于一些特殊的任务&#xff08;如装配和打包&#xff09;&#xff0c;对物体放置的位姿由明确的要求&#…...

数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)

编辑距离 https://leetcode.cn/problems/edit-distance/description/ 描述 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1 输入&…...

vue3 Teleport瞬移组件

Teleport是瞬移组件&#xff0c;也称为传送门组件 它是一个可以使元素从一个组件转到另一个组件的组件。 如对话框、自定义菜单、警告提示、徽章&#xff0c;以及许多其他需要出现在特殊位置的自定义UI组件。假设现在页面中有两个元素&#xff0c;分别为div元素和button按钮元…...

Go语言学习路线

以下是一个较为系统的Go语言学习路线&#xff1a; 一、基础阶段 环境搭建与工具链熟悉 安装Go语言开发环境。在Go官方网站&#xff08;https://golang.org/dl/&#xff09;下载适合您操作系统的安装包并完成安装。 配置Go环境变量&#xff0c;如GOPATH和GOROOT。GOROOT是Go语…...

摄像头监视脚本

摄像头监视脚本&#xff0c;若检测到摄像头画面有变化&#xff0c;保存这一段视频 一、使用方法 1.运行脚本 默认参数Threshold3, Period3, path./recordings python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值…...

【Leecode】Leecode刷题之路第97天之交错字符串

题目出处 97-交错字符串-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 97-交错字符串-官方解法 方法1&#xff1a;动态规划 思路&#xff1a; class Solution {public boolean isInte…...

MAC环境安装(卸载)软件

MAC环境安装&#xff08;卸载&#xff09;软件 jdknode安装node&#xff0c;并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净&#xff0c;可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…...

Spring Boot + Redisson 封装分布式锁

目标&#xff1a;一行代码调用&#xff0c;简单粗暴。 基操&#xff1a;自动加锁&#xff0c;自动解锁&#xff0c;自动处理异常&#xff0c;自动处理锁超时等。 安装 redis redisson <dependency><groupId>org.springframework.boot</groupId><artifac…...

从零开发一套UWB定位系统需要多长时间?UWB超宽带定位系统源码

从零开发一套UWB定位系统需要多长时间&#xff1f; 从零开发一套UWB定位系统所需的时间会受到多种因素的影响&#xff0c;以下是详细分析&#xff1a; 一、系统复杂度 1、基本功能定位系统 如果只是开发一个简单的UWB定位系统&#xff0c;仅实现基本的定位功能&#xff0c;如在…...

DataCap 2024.4.1 版本发布:MongoDB 驱动支持、工作流引擎升级

尊敬的 DataCap 用户&#xff1a; DataCap 2024.4.1 版本现已正式发布。本次更新包含多项重要功能升级和性能优化&#xff0c;现将主要更新内容公布如下&#xff1a; 核心功能升级 数据库功能增强 (实现功能) 新增数据库管理功能&#xff1a;支持创建、删除和切换数据库完善表…...

常见端口(22、25、53、80、443、110、143、3306、6379、21)和服务的安装与配置手册

文章目录 一、系统初始设置1. 系统与工具的基础配置1.1 系统更新1.2 网络连接测试1.3 工具安装 2. 防火墙配置2.1 启用防火墙服务2.2 检查默认规则2.3 开放常用端口2.4 查看已开放端口 二、常见端口及其用途1. 端口 22&#xff08;SSH&#xff09;2. 端口 25&#xff08;SMTP&a…...