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

【嵌入式开发-按键扫描】

嵌入式开发-按键扫描

  • ■ 1. 按键
    • ■ 按键队列发送后在读取队列处理
    • ■ 定时器30ms扫描一次,并通过MsgAdd(msg); 发送出去。
  • ■ 2. 触摸屏处理

■ 1. 按键

■ 按键队列发送后在读取队列处理

// key queue
#define KEY_QUEUE_MAX 5typedef enum
{KEY_TYPE_IR = 0,KEY_TYPE_ADC,KEY_TYPE_GPIO,
} KEY_TYPE_e;typedef struct
{KEY_MSG_s key_msg[KEY_QUEUE_MAX];int front;int rear;  //队尾指针int size;  //大小
} KEY_QUEUE_s;static KEY_QUEUE_s m_key_queue;static KEY_QUEUE_s m_key_queue;// 初始化队列
void key_queue_init(KEY_QUEUE_s *q)
{q->front = q->rear = 0;q->size = 0;		//队列当前长度为0
}// 判断队列是否为空
bool key_queue_empty(KEY_QUEUE_s *q)
{if (q->size==0)	//队空条件return true;elsereturn false;
}// 入队
bool key_queue_write(KEY_QUEUE_s *q, KEY_MSG_s *x)
{if (q->size == KEY_QUEUE_MAX)return false;		//队列满则报错memcpy(&(q->key_msg[q->rear]), x, sizeof(KEY_MSG_s));	//将x插入(拷贝)队尾q->rear = (q->rear + 1) % KEY_QUEUE_MAX;    //队尾指针后移q->size++;return true;
}// 出队
bool key_queue_read(KEY_QUEUE_s *q, KEY_MSG_s **x)
{if (q->size==0)return false;	//队空则报错*x = &(q->key_msg[q->front]);q->front = (q->front + 1) % KEY_QUEUE_MAX; //队头指针后移q->size--;return true;
}// 获取队头元素
bool key_queue_head_get(KEY_QUEUE_s *q, KEY_MSG_s **x)
{if (q->size==0)return false;	//队空则报错*x = &(q->key_msg[q->front]);return true;
}// 队列中元素的个数
int key_queue_num(KEY_QUEUE_s *q)
{return q->size;
}KEY_MSG_s *api_key_msg_get(void)
{KEY_MSG_s *key_msg = NULL;if (key_queue_read(&m_key_queue, &key_msg))return key_msg;elsereturn NULL;
}void api_key_queue_send(uint32_t act_key, int32_t press)
{KEY_MSG_s key_msg;memset(&key_msg, 0, sizeof(KEY_MSG_s));key_msg.key_type = KEY_TYPE_IR;key_msg.key_event.type = EV_KEY;key_msg.key_event.code = act_key;key_msg.key_event.value = press;  //1: pressed; 0: releasekey_queue_write(&m_key_queue,&key_msg);
}

■ 定时器30ms扫描一次,并通过MsgAdd(msg); 发送出去。

按键h文件定义

#define KEY_DETE_TIME       30
#define KEY_LONG_SENSE      1000
#define KEY_LONG_COUNT      (KEY_LONG_SENSE/KEY_DETE_TIME)typedef enum
{KEY_UP,KEY_DOWN,KEY_LONG_DOWN,
}KeyStatus;typedef enum
{BOL_KEY,  MUTE_KEY, START_KEY,POWER_OFF_KEY,KEY_END=POWER_OFF_KEY,
}KeyType;typedef struct
{uint16_t count;KeyStatus state;
}KeyArgus;typedef struct
{uint32_t value;uint32_t FilterValue;KeyArgus keys[KEY_END];
}KeyInfors;

按键长安短按处理

static KeyInfors key;
static void KeyOperate(void) 
{int8_t i;KeyStatus tmp_state;SysMessage msg = {CONTROL_MODULE, MODEL_MODULE};	//按键的信息传递给model模块,因为没有立即显示需要,不用给view模块if((key.FilterValue ^ key.value) == 0)	//按位运算,异或,两个数据全相同时,返回0for(i=0; i<KEY_END; i++){if(key.FilterValue & (1<<i))	//为1说明有按键按下{tmp_state = KEY_DOWN;if(key.keys[i].count++ >= KEY_LONG_COUNT)	//按下1s钟才算长按{tmp_state = KEY_LONG_DOWN;key.keys[i].count = KEY_LONG_COUNT;}msg.data[0] = i;//按键的值msg.type = (EventType)(KEY_UP_EVENT+tmp_state);//KEY_LONG_DOWN_EVENT或者KEY_DOWN_EVENTMsgAdd(msg);}else{tmp_state = KEY_UP;if(key.keys[i].state != tmp_state)	//按键刚刚释放{msg.data[0] = i;//按键的值msg.type = (EventType)(KEY_UP_EVENT+tmp_state);//KEY_UP_EVENTif(key.keys[i].count < KEY_LONG_COUNT)msg.data[1] = KEY_DOWN;elsemsg.data[1] = KEY_LONG_DOWN;//按键曾经的状态MsgAdd(msg);	//添加按键消息}key.keys[i].count = 0;}key.keys[i].state = tmp_state;}
}//每30ms扫描一次按键
static void KeyScan(int arg)
{key.value = 0;if(M_KEY_Bol_DATA)key.value |= 1<<BOL_KEY;elsekey.value &= ~(1<<BOL_KEY);if(M_KEY_Mute_DATA)key.value |= 1<<MUTE_KEY;elsekey.value &= ~(1<<MUTE_KEY);if(M_KEY_Start_DATA)key.value |= 1<<START_KEY;elsekey.value &= ~(1<<START_KEY);//说明:POWER_OFF_KEY不在这里扫描,其由M0发送的信息来判断KeyOperate();key.FilterValue = key.value;
}//按键初始化
void KeyInit(void)
{key.FilterValue = 0;TimerOnMsRepeatDelay(KeyTimer, KEY_DETE_TIME, KeyScan, 10);
}

获取队列按键处理

void GeneralKeyDeal(SysMessage msg)
{if(msg.type == KEY_UP_EVENT) //松开{switch(msg.data[0]){case MUTE_KEY:if(msg.data[1] == KEY_DOWN){	;}else if(msg.data[1] == KEY_LONG_DOWN){;}break;case START_KEY:break;			case BOL_KEY:break;			}		}else if(msg.type == KEY_LONG_DOWN_EVENT){switch(msg.data[0]){case MUTE_KEY:break;case START_KEY:break;			case BOL_KEY:break;			}}
}

■ 2. 触摸屏处理

触摸中断

void PORTA_IRQHandler(void)  
{if(TsArgu.port->ISFR & (1<<TsArgu.PinNum)){TimerOnMsOnceCallBack(TsTimer, 100, TsWork, 0);//延时去抖动NVIC_DisableIRQ(PORTA_IRQn);}TsArgu.port->ISFR |= PORT_ISFR_ISF_MASK;//每次中断仅可执行一次
}//有触摸屏按下时,每隔5ms执行一次
//#ifdef TSC2007
static void TsWork(int argu)
{int8_t pin_status;if(M_TSC_INT_DATA) pin_status = GPIO_HIGH_LEVEL;else pin_status = GPIO_LOW_LEVEL;if(pin_status== GPIO_LOW_LEVEL)//touch down{TsRead_XYvalues();	//获取坐标值和Z值TsDisADC_EnPENIRQ();//为下一次读取数据做准备TsFilter();			//做滤波处理,其平均值再赋给x_value和y_valueif(TsArgu.point.data.x_value && TsArgu.point.data.y_value){		if(++TsArgu.LongPressCount >= TS_LONG_PRESS_TIMES_COUNT+TS_LONG_PRESS_INTERVAL_COUNT)	//长按为至少1700ms{TsSendMsg(4, TsArgu.point.datas, TOUCH_LONG_DOWN_EVENT);//发送长按消息和坐标TsArgu.LongPressCount = TS_LONG_PRESS_TIMES_COUNT; }else if(TsArgu.LongPressCount < TS_LONG_PRESS_TIMES_COUNT){TsSendMsg(4, TsArgu.point.datas, TOUCH_DOWN_EVENT);		//发送按下消息和坐标}}TimerOnMsOnceCallBack(TsTimer, TOUCH_SCREEN_CHECK_TIME, TsWork, 0);//继续执行TsWork函数}else	//touch up{	if(TsArgu.point.data.x_value && TsArgu.point.data.y_value){		if(TsArgu.LongPressCount >= TS_LONG_PRESS_TIMES_COUNT){TsSendMsg(4, TsArgu.point.datas, TOUCH_LONG_DOWN_UP_EVENT);	//发送从长按释放的消息}else{TsSendMsg(4, TsArgu.point.datas, TOUCH_UP_EVENT);	//发送释放触摸屏的消息}}//清空x和y的坐标记录,清空滤波器TsArgu.point.data.x_value = 0;TsArgu.point.data.y_value = 0;memset(TsArgu.filter, 0 ,sizeof(TsArgu.filter));//打开中断,等待下一次正确处理TsArgu.LongPressCount = 0;NVIC_EnableIRQ(PORTA_IRQn);}
}//把触摸屏的触发事件添加到消息队列中去
static void TsSendMsg(int8_t len, uint8_t *data, EventType type)
{SysMessage msg = {CONTROL_MODULE, VIEW_MODULE};	//由控制模块传递到显示模块的消息msg.type = type;  memcpy((char *)msg.data, (char *)data, 4);MsgAdd(msg);	//添加到消息队列
}//数组内数据左移,刚到来的数据放在最后一个位置
static void filter(int8_t type, uint16_t *value)
{int8_t i;int32_t min, max, average, sum;sum = 0;max = min = *value;for(i=0; i<TOUCH_SCREEN_FILTER_NUM; i++){if(i < TOUCH_SCREEN_FILTER_NUM-1){if(TsArgu.filter[i+1].value[type] == 0)TsArgu.filter[i].value[type] = *value;	//若是数组为空,就填充刚进来的值else				//如果数组已有值,就让数据左移TsArgu.filter[i].value[type] = TsArgu.filter[i+1].value[type];}else {TsArgu.filter[i].value[type] = *value;}sum += TsArgu.filter[i].value[type];if(TsArgu.filter[i].value[type] > max)max = TsArgu.filter[i].value[type];if(TsArgu.filter[i].value[type] < min)min = TsArgu.filter[i].value[type];    }sum -= (max + min);	//去掉最大值和最小值average = sum / (TOUCH_SCREEN_FILTER_NUM-2);*value = average;	//求取平均值
}static void TsFilter(void)
{filter(0, &TsArgu.point.data.x_value);filter(1, &TsArgu.point.data.y_value);    
}

相关文章:

【嵌入式开发-按键扫描】

嵌入式开发-按键扫描 ■ 1. 按键■ 按键队列发送后在读取队列处理■ 定时器30ms扫描一次&#xff0c;并通过MsgAdd(msg); 发送出去。 ■ 2. 触摸屏处理■■ ■ 1. 按键 ■ 按键队列发送后在读取队列处理 // key queue #define KEY_QUEUE_MAX 5typedef enum {KEY_TYPE_IR 0,K…...

NineData 社区版 V4.1.0 正式发布,新增 4 条迁移链路,本地化数据管理能力再升级

NineData 社区版 V4.1.0 正式更新发布。本次通过新增 4 条迁移链路扩展、国产数据库深度适配、敏感数据保护增强‌等升级&#xff0c;进一步巩固了其作为高效、安全、易用的数据管理工具的定位。无论是开发测试、数据迁移&#xff0c;还是多环境的数据管理&#xff0c;NineData…...

TypeScript装饰器:从入门到精通

TypeScript装饰器&#xff1a;从入门到精通 什么是装饰器&#xff1f; 装饰器&#xff08;Decorator&#xff09;是TypeScript中一个非常酷的特性&#xff0c;它允许我们在不修改原有代码的情况下&#xff0c;给类、方法、属性等添加额外的功能。想象一下装饰器就像给你的代码…...

R语言学习--Day02--实战经验反馈

最近在做需要用R语言做数据清洗的项目&#xff0c;在网上看再多的技巧与语法&#xff0c;都不如在项目中实战学习的快&#xff0c;下面是我通过实战得来的经验。 判断Rstudio是否卡死 很多时候&#xff0c;我们在运行R语言代码时&#xff0c;即使只是运行框选的几行代码&#…...

《AI驱动的智能推荐系统:原理、应用与未来》

一、引言 在当今信息爆炸的时代&#xff0c;用户面临着海量的信息选择&#xff0c;从购物平台上的商品推荐到流媒体服务中的影视推荐&#xff0c;智能推荐系统已经成为我们日常生活中不可或缺的一部分。AI驱动的智能推荐系统通过分析用户的行为和偏好&#xff0c;为用户提供个性…...

AR禁毒:科技赋能,筑牢防毒新防线

过去&#xff0c;传统禁毒宣传教育方式对普及禁毒知识、提高禁毒意识意义重大。但随着时代和社会环境变化&#xff0c;其困境逐渐显现。传统宣传方式单一&#xff0c;主要依靠讲座、发传单、办展览。讲座形式枯燥&#xff0c;对青少年吸引力不足&#xff1b;发传单易被丢弃&…...

Ubuntu摄像头打开失败

如果遇见上面Ubuntu连接摄像头但无法打开如以上 先安装cheese apt install cheese 打开终端控制台&#xff0c;输入以下命令 ls /dev/video* 出现以上有设备的情况&#xff0c;我们采用以下解决 &#xff1a; 1、点击虚拟机->点击设置 2、 进入设置界面点击USB控制器&a…...

Ascend的aclgraph(七)AclConcreteGraph:capture_begin

1 回顾 在上一章Ascend的aclgraph&#xff08;六&#xff09;AclConcreteGraph中提到了capture_begin和capture_end两个函数&#xff0c;这2个函数是pybind形式&#xff0c;调用到torch_npu中去执行。 大概流程图如下: def __enter__(self):# Free as much memory as we can…...

JT/T 808 各版本协议字段级别对比与解析适配建议

文章目录 一、概述二、字段级对比表&#xff08;以核心消息为例&#xff09;三、版本文档结构差异分析四、Java 协议解析适配建议4.1、协议版本识别策略&#xff1a;4.2、可扩展消息体结构设计&#xff1a;4.3、字段兼容处理建议&#xff1a;4.4、推荐使用解析库或框架&#xf…...

Kafka 消费者组进度监控方法解析

#作者&#xff1a;张桐瑞 文章目录 前言一、使用 Kafka 自带命令行工具 kafka-consumer-groups 脚本二、使用 Kafka Java Consumer API 编程三、使用 Kafka 自带的 JMX 监控指标 前言 在 Kafka 消息队列系统中&#xff0c;对于 Kafka 消费者而言&#xff0c;监控其消费进度&a…...

国产大模型 “五强争霸”,决战 AGI

中国 AI 大模型市场正经历一场史无前例的洗牌&#xff01;曾经 “百模混战” 的局面已落幕&#xff0c;字节、阿里、阶跃星辰、智谱和 DeepSeek 五大巨头强势崛起&#xff0c;形成 “基模五强” 新格局。这场竞争不仅是技术实力的较量&#xff0c;更是资源、人才与生态的全面博…...

lesson01-PyTorch初见(理论+代码实战)

一、初识PyTorch 二、同类框架 PyTorchVSTensorFlow 三、参数 对比 四、PyTorch生态 四、常用的网络层 五、代码分析 import torch from torch import autogradx torch.tensor(1.) a torch.tensor(1., requires_gradTrue) b torch.tensor(2., requires_gradTrue) c tor…...

几种运放典型应用电路

运算放大器简称:OP、OPA、OPAMP、运放。 一、电压跟随器 电压跟随器顾名思义运放的输入端电压与运放的输出电压相等 这个电路一般应用目的是增加电压驱动能力: 比如说有个3V电源,借一个负载,随着负载电流变大,3V就会变小说明3V电源带负载能力小,驱动能力弱,这个时候…...

Mybatis——动态sql

<if> 实现方式 动态标签 <if> 条件判断&#xff0c;进行sql语句拼接 成立则拼接 <where> 进行条件子句拼接&#xff0c;防止and重复 if案例 crtl alt L 格式化 <foreach>——用于批量操作&#xff08;删除&#xff09; <include>...

技术社区集锦

推荐地址 社区汇总地址 https://juejin.cn/post/7468935497799286834 社区 项目ValueValueGitHubgithub.com-----Giteegitee.com-----StackOverflowstackoverflow.com全球知名的技术问答网站博客园www.cnblogs.com开发者的知识分享社区稀土掘金juejin.cn技术内容分享与交流平…...

【Elasticsearch】DSL 篇

Elasticsearch 之 DSL 篇 介绍 Elasticsearch 提供了基于 JSON 的 DSL 语句来定义查询条件&#xff0c;其 JavaAPI 就是在组织 DSL 条件。 先学习 DSL 的查询语法&#xff0c;然后再基于 DSL 来对照学习 JavaAPI&#xff0c;就会事半功倍 json 格式&#xff0c;好理解&#…...

常见 RPC 协议类别对比

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;协议是分布式系统中实现跨进程通信的核心机制之一。它允许客户端像调用本地函数一样调用远端服务器上的函数。 根据通信方式、数据编码方式和平台兼容性不同&#xff0c;常见的 RPC 协议分为以下几类…...

React系列——nvm、node、npm、yarn(MAC)

nvm&#xff0c;node&#xff0c;npm之间的区别 1、nvm&#xff1a;nodejs版本管理工具。nvm 可以管理很多 node 版本和 npm 版本。 2、nodejs&#xff1a;在项目开发时的所需要的代码库 3、npm&#xff1a;nodejs包管理工具。nvm、nodejs、npm的关系 nvm 管理 nodejs 和 npm…...

LeetCode 热题 100 230. 二叉搜索树中第 K 小的元素

LeetCode 热题 100 | 230. 二叉搜索树中第 K 小的元素 大家好&#xff0c;今天我们来解决一道经典的二叉搜索树问题——二叉搜索树中第 K 小的元素。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求查找二叉搜索树中的第 K 小的元素。 问题描述 给定一个二叉搜索树的根…...

vscode - 笔记

1 IDE就用vscode&#xff0c;安装Remote-SSH插件通过SSH访问树莓派里的文件夹 写在开始&#xff1a;阿尔法Linux开发板学习开始 - 银色的音色 - 博客园 2 VSCode之Linux C/C开发和调试 VSCode之Linux C/C开发和调试 CMake代码编译 json配置_哔哩哔哩_bilibili 3 VS Code 凭…...

使用VSCode编辑Markdown+PlantUml

vscode :https://code.visualstudio.com/ 什么是markdown&#xff1a; Markdown 是一种轻量级标记语言&#xff0c;它允许人们使用易读易写的纯文本格式编写文档。 Markdown 编写的文档可以导出 HTML 、Word、图像、PDF、Epub 等多种格式的文档。 在vscode上安装MarkDown相关…...

关于 Golang GC 机制的一些细节:什么是根对象?GC 机制的触发时机?

文章目录 关于 Golang GC 机制的一些细节&#xff1a;什么是根对象&#xff1f;GC 机制的触发时机&#xff1f;简要回顾 Golang GC 三色标记法的工作流程什么是根对象&#xff1f;GC 的触发时机&#xff1f; 关于 Golang GC 机制的一些细节&#xff1a;什么是根对象&#xff1f…...

内存虚拟盘(RAMDisk)是什么?

内存虚拟盘&#xff08;RAMDisk&#xff09;是一种通过软件将计算机的部分物理内存&#xff08;RAM&#xff09;模拟为硬盘驱动器的技术&#xff0c;利用内存的高速读写特性显著提升数据访问效率。以下从原理、优势、实现方式及应用场景等方面详细解析&#xff1a; ​1. 技术原…...

深入浅出入侵检测系统(IDS)的工作原理与应用场景

网络安全界的“火眼金睛”&#xff1a;入侵检测系统IDS 一、IDS简介&#xff1a;网络安全界的“火眼金睛” 在计算机安全领域&#xff0c;有一个“火眼金睛”的角色&#xff0c;它能在网络世界中识破各种“妖魔鬼怪”的伪装&#xff0c;及时发出警报&#xff0c;保护我们的数…...

AISBench benchmark评测工具实操-精度评测场景-采用命令行指定模型和数据集的方式

一、环境信息 1.1.硬件设备 昇腾Atlas800 I A2:910A 01:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d801 (rev 20) 1.2.软件信息 1.2.1模型: DeepSeek-R1-Distill-Qwen-1.5B 1.2.2.物理机系统: NAME="EulerOS" VERSION="2.0 …...

HTTP GET报文解读

考虑当浏览器发送一个HTTP GET报文时&#xff0c;通过Wireshark 俘获到下列ASCII字符串&#xff1a; GET /cs453/index.html HTTP/1.1 Host: gaia.cs.umass.edu User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) Acc…...

南审计院考研分享会 经验总结

汪学长 – 中科大 计科专硕 初试准备 数学先做真题&#xff0c;模拟题刷的越多分越高&#xff1b;408真题最重要&#xff0c;模拟题辅助&#xff1b;英语只做真题&#xff1b;政治9月份开始背 代码能力在低年级培养的重要性和路径 考研不选择机构原因 因为机构里面学习的框…...

Android多媒体——媒体解码流程分析(十四)

NuPlayer 的解码模块相对比较简单,统一使用了一个基类 NuPlayerDecoderBase 管理,该类中包含了一个 MediaCodec 的对象,实际解码工作全靠 MediaCodec。 一、解码器创建 解码器创建的入口在 NuPlayer 的 NuPlayer::instantiateDecoder() 函数调用时。NuPlayer 在执行 start(…...

学习threejs,使用Physijs物理引擎,通过控制重力,实现多米诺骨牌效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…...

自由学习记录(60)

Lecture 16 Ray Tracing 4_哔哩哔哩_bilibili 老师说的“高频采样”问题是什么&#xff1f; 现在考虑一个特殊情况&#xff1a; ❗ 一个像素内&#xff0c;图像信号变化很剧烈&#xff08;高频&#xff09;&#xff1a; 比如&#xff1a; 细网格纹理 马赛克背景 很高频的…...

Gartner《分布式和微服务架构中数据架构》学习心得

一、简介 随着信息技术的不断发展,软件架构也在持续演变以适应不断变化的业务需求。从传统的单体架构向分布式和微服务架构转变,给数据的管理带来了新的挑战和机遇。《Working With Data in Distributed and Microservices Architectures》研究针对在分布式和微服务架构中处…...

谷歌web第三方登录

1.在谷歌控制台创建客户端信息 https://console.cloud.google.com/auth/clients 注&#xff1a;在重定向的url中一定要是https开头的。 创建完成之后主要获取三个信息 clientID、secret、redirctUrl 2.配置pom <dependency><groupId>com.google.auth</group…...

ConfigMap 和 Secret 是否支持热更新

在 Kubernetes 中&#xff0c;ConfigMap 和 Secret 是否支持热更新取决于它们的使用方式和应用程序的行为。以下是详细分析&#xff1a; 1. ConfigMap 的热更新 场景 1&#xff1a;通过 Volume 挂载到 Pod 支持热更新&#xff1a; 如果 Pod 通过 volume 挂载 ConfigMap&#…...

时序数据库IoTDB分布式系统监控基础概述

在分布式系统环境中&#xff0c;系统性能调优与瓶颈定位一直是工程实践与架构设计中的关键挑战。面对诸如系统性能无法提升、查询延迟增加等问题&#xff0c;需要一套有效的监控体系来洞察系统的内部状态与运行情况。 可观测性概念 随着分布式架构的普及&#xff0c;可观测性…...

【乱码】前端js流式输出因为Uint8Array字节不完整导致乱码问题

【乱码】流式输出因为Uint8Array字节不完整导致乱码问题 function push() {reader.read().then(({ done, value }) > {if (done) { 问题代码 var a new Uint8Array([115,44,32,115,101,114,105,102,34,62,230]) var b new Uint8Array([156,136,60,47,115,112,97,110,62…...

PDF Base64格式字符串转换为PDF文件临时文件

需求描述&#xff1a; 在对接电子病历系统与河北CA&#xff0c;进行免密文件签章的时候&#xff0c;两者系统入参不同&#xff0c;前者是pdf文件&#xff0c;base64格式&#xff1b;后者要求File类型的PDF文件。 在业务中间层开发时&#xff0c;则需要接收EMR侧提供的base64格式…...

ClickHouse详解

ClickHouse 是一款开源的列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;由 Yandex 开发&#xff0c;专为联机分析处理&#xff08;OLAP&#xff09;设计&#xff0c;具备高性能、低延迟、海量数据处理能力&#xff0c;广泛应用于日志分析、用户行为分析、指标监控…...

Go语言中的函数类型参数:深入理解`func()`

在Go语言中&#xff0c;函数是一等公民&#xff0c;可以作为参数传递、作为返回值&#xff0c;甚至赋值给变量。其中&#xff0c;func()作为一种特殊的函数类型&#xff0c;在Go的并发编程、回调机制和接口设计中扮演着重要角色。本文将全面解析func()的用法、原理和最佳实践。…...

deepseek梳理java高级开发工程师微服务面试题-进阶版

高级Java微服务面试题与深度解析 一、Spring Cloud核心组件深度剖析 1. Eureka服务注册发现机制 题目&#xff1a;详细分析Eureka的AP特性实现原理&#xff0c;包括服务注册、续约、剔除和自我保护机制&#xff0c;并说明与Nacos的CP模式区别。 答案&#xff1a; Eureka A…...

Math工具类全面指南

Math工具类全面指南 前言一、Math 类的基础特性1.1 类的声明与常量1.2 数据类型支持 二、基础算术运算2.1 绝对值运算2.2 取整运算2.2.1 floor()&#xff1a;向下取整2.2.2 ceil()&#xff1a;向上取整2.2.3 round()&#xff1a;四舍五入取整 2.3 最大值与最小值 三、三角函数与…...

为什么 Linux 上默认没有 host.docker.internal

在 Linux 环境中&#xff0c;host.docker.internal 是 Docker 为容器提供的一个特殊 DNS 名称&#xff0c;用于指向宿主机的 IP 地址&#xff08;类似 macOS/Windows 中的行为&#xff09;。但这个功能在 Linux 上默认不启用&#xff0c;需要手动配置才能使用。以下是详细解释和…...

HTML 颜色全解析:从命名规则到 RGBA/HSL 值,附透明度设置与场景应用指南

一、HTML 颜色系统详解 HTML 中的颜色可以通过多种方式定义&#xff0c;包括颜色名称、RGB 值、十六进制值、HSL 值等&#xff0c;同时支持透明度调整。以下是详细分类及应用场景&#xff1a; 1. 颜色名称&#xff08;预定义关键字&#xff09; HTML 预定义了 140 个标准颜色名…...

HTTP / HTTPS 协议

目录 一、前言&#xff1a; 二、Fiddler 抓包工具&#xff1a; 三、http 协议&#xff1a; 1、http 请求&#xff1a; 1.&#xff08;1&#xff09;请求行&#xff1a; 1、(2) 请求头&#xff1a; 1、(3) 请求正文: 2、http 响应&#xff1a; 2、(1) 状态码&#x…...

使用GRPO训练调度事件的语言模型!

参考&#xff1a;https://huggingface.co/blog/anakin87/qwen-scheduler-grpo 现在是2025年&#xff0c;在DeepSeek热潮之后&#xff0c;每个人都想使用GRPO训练自己的推理模型。 作为一名实践者&#xff0c;我也想这样做&#xff1a;仅使用提示和奖励来训练语言模型是一件非常…...

关于 js:9. Node.js 后端相关

一、Node 环境搭建与执行流程 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它让 JS 不再局限于浏览器内&#xff0c;而是可以在服务器、终端、本地脚本中运行。 核心定位&#xff1a;让我们可以用 JS 写本地程序、脚本、爬虫、加密逻辑、hook 工具、…...

More Effective C++:改善编程与设计(上)

More Effective C&#xff1a; 目录 More Effective C&#xff1a; 条款1&#xff1a;仔细区别pointers和 references 条款2:最好使用C转型操作符 条款3:绝对不要以多态方式处理数组 条款4:非必要不要提供default constructor 条款5:对定制的“类型转换函数”保持警觉 …...

SCDN如何有效防护网站免受CC攻击?——安全加速网络的实战解析

在互联网安全威胁日益复杂化的今天&#xff0c;CC&#xff08;Challenge Collapsar&#xff09;攻击已成为网站运营者面临的主要挑战之一。这种攻击通过模拟大量合法用户请求&#xff0c;消耗服务器资源&#xff0c;导致正常用户无法访问。而**安全内容分发网络&#xff08;SCD…...

关于并发编程AQS的学习

目录 1. AQS的核心作用 2. AQS的核心结构 3. 关键方法 4. AQS的应用示例 4.1、ReentrantLock的实现 4.2、CountDownLatch的实现 5. AQS的优势 6. 对比其他同步机制 前言 AQS&#xff08;AbstractQueuedSynchronizer&#xff09; 是Java并发编程中一个核心的同步器框架…...

16S18S基础知识(1)

相关内容&#xff1a; https://blog.csdn.net/weixin_34315189/article/details/86397125?fromshareblogdetail&sharetypeblogdetail&sharerId86397125&sharereferPC&sharesource2302_80012625&sharefromfrom_link https://metagenome.blog.csdn.net/art…...

Java Spring Boot 控制器中处理用户数据详解

目录 一、获取请求参数1.1 获取查询参数1.2 获取路径参数 二、处理表单提交2.1 处理表单数据 三、处理 JSON 数据3.1 接收 JSON 数据 四、返回 JSON 数据五、处理文件上传5.1 单文件上传5.2 多文件上传 六、总结 在 Spring Boot 应用开发中&#xff0c;控制器&#xff08;Contr…...