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

杰理可视化SDK开发-音量加/音量减函数讲解

前言现在为止也开发了许多杰理TWS蓝牙耳机、音响项目 SDK的案子在调试案子时不断的向前辈们学习到了很多关于蓝牙音响、蓝牙TWS耳机专业的知识。想在这里做一个学习汇总方便各位同行和对杰理芯片可视化SDK感兴趣的小伙伴们学习本章详细讲解杰理可视化SDK-音量加/音量减函数音量加函数和音量减函数是我们开发时常用的函数几乎是必备开发使用函数之一。本章就详细分析讲解void bt_volume_up(u8 inc)音量加函数void bt_volume_up(u8 dec) { u8 test_box_vol_up 0x41; // 测试盒指令音量加 s8 cur_vol 0; //当前音量 u8 call_status bt_get_call_status(); // 获取当前通话状态 u8 cur_state; // 当前音频状态 (通话/音乐) s16 max_volume; // 当前状态下的最大音量 u8 data[6]; // 存储蓝牙设备地址 a2dp_player_get_btaddr(data); // 获取当前连接的A2DP设备地址 // 场景1: 如果正在播放提示音或铃声 if ((tone_player_runing() || ring_player_runing())) { if (bt_get_call_status() BT_CALL_INCOMING) { // 仅在来电状态下才允许直接调节音量 volume_up_down_direct(1); // 直接调节音量可能绕过某些逻辑 } return; // 其他情况如普通提示音则不响应音量键 } // 场景2: 区分通话状态和音乐状态以确定当前音频上下文和最大音量 /*打电话出去彩铃要可以调音量大小*/ if ((call_status BT_CALL_ACTIVE) || (call_status BT_CALL_OUTGOING)) { cur_state APP_AUDIO_STATE_CALL; // 设置为通话状态 max_volume app_audio_volume_max_query(AppVol_BT_CALL);// 查询通话最大音量 } else { cur_state APP_AUDIO_STATE_MUSIC; // 设置为音乐状态 max_volume app_audio_volume_max_query(AppVol_BT_MUSIC);// 查询音乐最大音量 } cur_vol app_audio_get_volume(cur_state); // 获取当前音量 if (bt_get_remote_test_flag()) { bt_cmd_prepare(USER_CTRL_TEST_KEY, 1, test_box_vol_up); //音量加 } // 场景3: 处理音量已达最大值的情况 /* if (cur_vol app_audio_get_max_volume()) { */ if (cur_vol max_volume) { audio_event_to_user(AUDIO_EVENT_VOL_MAX); //触发vol max事件// 触发“音量最大”事件用于UI提示 if (bt_get_call_status() ! BT_CALL_HANGUP) { // 如果仍在通话中需要同步手机端音量防止显示不同步 /*本地音量最大如果手机音量还没最大继续加以防显示不同步*/ if (g_bt_hdl.phone_vol 15) { // 假设手机最大音量等级为15 if (bt_get_curr_channel_state() HID_CH) { // 如果是HID通道 bt_cmd_prepare(USER_CTRL_HID_VOL_UP, 0, NULL); } else { // 否则是HFP通道 bt_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL); } } return; // 本地音量已达最大不再增加 } #if TCFG_BT_VOL_SYNC_ENABLE // 如果启用了蓝牙音量同步发送同步增加的指令给手机 opid_play_vol_sync_fun(app_var.music_volume, 1); // 更新同步音量变量 bt_cmd_prepare_for_addr(data, USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL); #endif/*TCFG_BT_VOL_SYNC_ENABLE*/ return; } // 场景4: 正常增加音量 #if TCFG_BT_VOL_SYNC_ENABLE opid_play_vol_sync_fun(app_var.music_volume, 1); // 更新同步音量变量 app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.music_volume, 1); // 设置新音量 #else app_audio_volume_up(inc); // 不启用同步时直接调用底层函数增加音量 #endif/*TCFG_BT_VOL_SYNC_ENABLE*/ printf(vol: %d, app_audio_get_volume(APP_AUDIO_CURRENT_STATE)); // 场景5: 音量增加后同步通知手机端 if (bt_get_call_status() ! BT_CALL_HANGUP) { // 如果在通话中 if (bt_get_curr_channel_state() HID_CH) { bt_cmd_prepare(USER_CTRL_HID_VOL_UP, 0, NULL); } else { bt_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL); } } else { // 如果在音乐播放状态 #if TCFG_BT_VOL_SYNC_ENABLE bt_cmd_prepare_for_addr(data, USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL); //使用HID调音量 #endif } }void bt_volume_down(u8 inc)音量减函数void bt_volume_down(u8 dec) { u8 test_box_vol_down 0x42; // 测试盒指令音量减 u8 call_status bt_get_call_status(); // 获取当前通话状态 u8 cur_state; // 当前音频状态 (通话/音乐) u8 data[6]; // 存储蓝牙设备地址 a2dp_player_get_btaddr(data); // 获取当前连接的A2DP设备地址 // 场景1: 如果正在播放提示音或铃声 if ((tone_player_runing() || ring_player_runing())) { if (bt_get_call_status() BT_CALL_INCOMING) { // 仅在来电状态下才允许直接调节音量 volume_up_down_direct(-1); // 直接调节音量可能绕过某些逻辑 } return; // 其他情况如普通提示音则不响应音量键 } if (bt_get_remote_test_flag()) { // 远程测试模式 bt_cmd_prepare(USER_CTRL_TEST_KEY, 1, test_box_vol_down); //音量减 } // 场景2: 区分通话状态和音乐状态以确定当前音频上下文和最大音量 /* 打电话出去彩铃要可以调音量大小 */ if ((call_status BT_CALL_ACTIVE) || (call_status BT_CALL_OUTGOING)) { cur_state APP_AUDIO_STATE_CALL; // 设置为通话状态 } else { cur_state APP_AUDIO_STATE_MUSIC; // 设置为音乐状态 } // 场景3: 处理音量已达最小值的情况 /* if (app_audio_get_volume(APP_AUDIO_CURRENT_STATE) 0) { */ if (app_audio_get_volume(cur_state) 0) { audio_event_to_user(AUDIO_EVENT_VOL_MIN); //触发vol mix事件 if (bt_get_call_status() ! BT_CALL_HANGUP) { /* *本地音量最小如果手机音量还没最小继续减 *注意有些手机通话最小音量是1(GREE G0245D) */ if (g_bt_hdl.phone_vol 1) { if (bt_get_curr_channel_state() HID_CH) { // 如果是HID通道 bt_cmd_prepare(USER_CTRL_HID_VOL_DOWN, 0, NULL); } else { // 否则是HFP通道 bt_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL); } } return; // 本地音量已达最小不再减小 } // 如果启用了蓝牙音量同步发送同步增加的指令给手机 #if TCFG_BT_VOL_SYNC_ENABLE opid_play_vol_sync_fun(app_var.music_volume, 0); // 更新同步音量变量 bt_cmd_prepare_for_addr(data, USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL); #endif return; } // 场景4: 正常减少音量 #if TCFG_BT_VOL_SYNC_ENABLE opid_play_vol_sync_fun(app_var.music_volume, 0); // 更新同步音量变量 app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.music_volume, 1);// 设置新音量 #else app_audio_volume_down(dec); // 不启用同步时直接调用底层函数 #endif/*TCFG_BT_VOL_SYNC_ENABLE*/ printf(vol-: %d, app_audio_get_volume(APP_AUDIO_CURRENT_STATE)); // 场景5: 音量减小后同步通知手机端 if (bt_get_call_status() ! BT_CALL_HANGUP) { // 通话中 if (bt_get_curr_channel_state() HID_CH) { bt_cmd_prepare(USER_CTRL_HID_VOL_DOWN, 0, NULL); } else { bt_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL); } } else { // 音乐中 #if TCFG_BT_VOL_SYNC_ENABLE /* opid_play_vol_sync_fun(app_var.music_volume, 0); */ if (app_audio_get_volume(APP_AUDIO_CURRENT_STATE) 0) { app_audio_volume_down(0); } bt_cmd_prepare_for_addr(data, USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL); #endif } }注意如是TWS蓝牙项目使用上方两个函数需要与bt_tws_sync_volume()一起使用用于在TWS耳机的主设备上获取当前音量设置并将这些设置同步到从设备。void bt_tws_sync_volume() { u8 data[2]; // 定义一个2字节的数组用于存储音量数据 // 获取音乐播放状态的音量并存储在data[0] data[0] app_audio_get_volume(APP_AUDIO_STATE_MUSIC); // 获取通话状态的音量并存储在data[1] data[1] app_audio_get_volume(APP_AUDIO_STATE_CALL); // 通过TWS API将音量数据发送到从设备 // 参数数据指针、数据长度、功能ID(音量同步) tws_api_send_data_to_slave(data, 2, TWS_FUNC_ID_VOL_SYNC); }如图所示代码学习int a2dp_player_get_btaddr(u8 *btaddr) 获取当前连接的A2DP设备地址函数原型int a2dp_player_get_btaddr(u8 *btaddr) { if (g_a2dp_player) { memcpy(btaddr, g_a2dp_player-bt_addr, 6); return 1; } return 0; }int tone_player_runing(); 返回是否有提示音在播放函数原型返回值可以观察到无非就是0或11当前提示音在播放、0未播放int tone_player_runing() { local_irq_disable(); int ret list_empty(g_head) ? 0 : 1; local_irq_enable(); return ret; }int ring_player_runing() 返回是否有铃声在播放函数原型返回值可以观察到无非就是0或11当前铃声在播放、0未播放int ring_player_runing() { return g_ring_player ? 1 : 0; }u8 bt_get_call_status(); 获取当前蓝牙电话状态u8 bt_get_call_status(); 与BT_CALL_IND_STA 枚举的值判断用于获取当前蓝牙电话的状态typedef enum { BT_CALL_BATTERY_CHG 0, //电池电量改变 BT_CALL_SIGNAL_CHG, //网络信号改变 BT_CALL_INCOMING, //电话打入 BT_CALL_OUTGOING, //电话打出 BT_CALL_ACTIVE, //接通电话 BT_CALL_HANGUP, //电话挂断 BT_CALL_ALERT, //远端reach BT_SIRI_STATE, //SIRI状态 BT_CALL_VOL_CHANGED, } BT_CALL_IND_STA;void volume_up_down_direct(s16 value); 直接调节音量函数原型看不到哟小伙伴们在杰理底层不让看哈!s16 app_audio_volume_max_query(audio_vol_index_t index)获取目标最大音量值形参填入音量名称index//音量名称index typedef enum { AppVol_BT_MUSIC 0, AppVol_BT_CALL, AppVol_LINEIN, AppVol_MUSIC, AppVol_FM, AppVol_SPDIF, AppVol_USB, SysVol_TONE, SysVol_KEY_TONE, Vol_NULL, } audio_vol_index_t;函数原型s16 app_audio_volume_max_query(audio_vol_index_t index) { if (index Vol_NULL) { return volume_ioc_get_max_level(audio_vol_str[index]); } else { return volume_ioc_get_max_level(audio_vol_str[Vol_NULL]); } }s16 app_audio_get_volume(u8 state) 获取指定状态对应音量值形参填入#define APP_AUDIO_STATE_IDLE 0 // 空闲状态 #define APP_AUDIO_STATE_MUSIC 1 // 音乐播放状态 #define APP_AUDIO_STATE_CALL 2 // 通话状态 #define APP_AUDIO_STATE_WTONE 3 // 提示音状态 #define APP_AUDIO_STATE_KTONE 4 // 按键音状态 #define APP_AUDIO_STATE_RING 5 // 铃声状态 #define APP_AUDIO_CURRENT_STATE 6 // 当前状态函数原型s16 app_audio_get_volume(u8 state) { s16 volume 0; switch (state) { case APP_AUDIO_STATE_IDLE: // 空闲状态 case APP_AUDIO_STATE_MUSIC: // 音乐播放状态 volume app_var.music_volume; // 使用音乐音量 break; case APP_AUDIO_STATE_CALL: // 通话状态 volume app_var.call_volume; // 使用通话音量 break; case APP_AUDIO_STATE_WTONE: // 提示音状态 volume app_var.wtone_volume; // 使用提示音音量 if (!volume) { // 如果提示音音量为0 volume app_var.music_volume; // 使用音乐音量作为默认值 } break; case APP_AUDIO_STATE_KTONE: // 按键音状态 volume app_var.ktone_volume; // 使用按键音音量 if (!volume) { // 如果按键音音量为0 volume app_var.music_volume; // 使用音乐音量作为默认值 } break; case APP_AUDIO_STATE_RING: // 铃声状态 volume app_var.ring_volume; // 使用铃声音量 if (!volume) { // 如果铃声音量为0 volume app_var.music_volume; // 使用音乐音量作为默认值 } break; case APP_AUDIO_CURRENT_STATE: // 当前状态 volume app_audio_get_volume(__this-state); // 递归获取当前状态音量 break; default: // 默认情况 break; // 不做处理返回0 } return volume; // 返回获取到的音量值 }bool bt_get_remote_test_flag(); 当前连接的设备是不是jl测试盒函数原型返回值为1则为JL测试盒返回值为0则不是u32 bt_cmd_prepare(USER_CMD_TYPE cmd, u16 param_len, u8 *param) ;单个连接的时候不想管地址的命令接口函数原型cmd 用户可以使用USER_CMD_TYPE的枚举值param_len 传参数需要的值或者data包的长度param 传的是要发数据的包指针u32 bt_cmd_prepare_for_addr(u8 *addr, USER_CMD_TYPE cmd, u16 param_len, u8 *param); 发送命令的接口函数原型addr指定就按指定的查找NULL就默认正在使用那个cmd 用户可以使用USER_CMD_TYPE的枚举值param_len 传参数需要的值或者data包的长度param 传的是要发数据的包指针制作不易喜欢的小伙伴给个小赞赞喜欢我的小伙伴点个关注有不懂的地方和需要的资源随时问我哟

相关文章:

杰理可视化SDK开发-音量加/音量减函数讲解

前言现在为止也开发了许多杰理TWS蓝牙耳机、音响项目 SDK的案子,在调试案子时不断的向前辈们学习到了很多关于蓝牙音响、蓝牙TWS耳机专业的知识。想在这里做一个学习汇总,方便各位同行和对杰理芯片可视化SDK感兴趣的小伙伴们学习;本章详细讲解…...

礼物网站开发实战:从构思到上线的完整流程

在数字化时代,礼物网站的兴起不仅满足了人们日益增长的个性化需求,也为商家提供了新的增长点。从构思到上线,一个成功的礼物网站开发项目需要经历一系列精心策划和执行的步骤。本文将详细介绍这一完整流程,为有志于开发礼物网站的…...

Casely:基于AI的测试用例自动化生成工具,从需求文档到TestRail导入

1. 项目概述:从混乱需求到结构化测试用例的自动化革命 如果你是一名QA工程师或者测试负责人,那么下面这个场景你一定不陌生:产品经理甩过来一个压缩包,里面是十几个不同时期、不同人写的PDF和Word文档,有的还是扫描件。…...

【必收藏】网络安全工程师速成攻略:小白如何5个月转行高薪行业

网络安全技术被广泛应用于各个领域,各大企业都在争抢网络安全人才,这使得网络安全人才的薪资一涨再涨,想转行网络安全开发的人也越来越多。而想要顺利转行网络安全开发,首先要学习网络安全技术,那么转行网络安全从何学…...

创业公司如何利用 Taotoken 统一管理多个 AI 模型的成本与用量

创业公司如何利用 Taotoken 统一管理多个 AI 模型的成本与用量 1. 多模型统一接入的挑战与解决方案 创业公司在 AI 应用开发过程中,往往需要根据业务需求调用不同厂商的大模型。这种多模型混用场景下,开发团队面临三个典型问题:API Key 分散…...

辛格迪丨药物警戒解决方案(PVS)

01方案概述辛格迪药物警戒解决方案(Pharmacovigilance Solution,PVS)基于翱泰平台,集成了药物警戒的法规库、药物警戒体系文件、行业相关的培训课件、质量管理体系及管理流程、电子签名及SAE助手等内容,是综合且全面的药物警戒数字化解决方案…...

Framer流体光标组件:Canvas渲染与智能反色技术实现

1. 项目概述:为Framer注入“流体”交互灵魂 在网页和交互原型设计中,光标(Cursor)早已超越了其作为简单指针的原始功能。一个富有表现力的光标,能够瞬间提升产品的质感,传递出微妙的品牌个性,并…...

Docker 27 医疗合规认证速成班(含NIST SP 800-190附录B映射表):从白名单镜像构建到SOC2 Type II容器审计全覆盖

更多请点击: https://intelliparadigm.com 第一章:Docker 27 医疗容器合规认证全景图 Docker 27(即 Docker Engine v27.x)首次将 HIPAA、GDPR 和 ISO/IEC 27001 合规能力深度集成至容器运行时层,为医疗影像分析、电子…...

中小商家营销内卷无解?这套AI全链路方案,搞定内容量产难题

当下很多企业和个体营销从业者,都面临一致的运营困境:营销物料制作效率低下,设计师排期紧张、出图周期长,自制的文案和视觉画面适配度低,想要批量制作种草海报、短视频素材,还要投入高额的人力与时间成本。…...

2026 年网安必读!Metasploit 圣经第 2 版终于来了,AI 渗透直接封神

2026 年网安必读!Metasploit 圣经第 2 版终于来了,AI 渗透直接封神 做网安、学渗透的人,几乎没人不知道Metasploit。 它是渗透测试界的“瑞士军刀”,是红蓝对抗、漏洞验证、安全评估的必备神器,也是从新手到资深工程师…...

sqli-labs通关指南(1-10)

sqli-labs通关指南(1-10) get提交:url类型 数据长度2k35 优点速度非常快 缺点:不安全,明文传输 post提交:请求体传输 数据长度无限制 安全性高 速度比get慢,浏览器不缓存数据 less1 P…...

Windows系统性能优化原理与实战

Windows 系统性能优化原理与实战:从内核调度到网络延迟的全链路调校指南 文章目录Windows 系统性能优化原理与实战:从内核调度到网络延迟的全链路调校指南摘要一、问题的本质:高配置 ≠ 低延迟二、Windows 进程调度机制深度解析2.1 优先级类的…...

开发者技能管理工具:从YAML定义到可视化部署的完整实践

1. 项目概述:一个面向开发者的技能管理工具最近在GitHub上看到一个挺有意思的项目,叫fightZy/simple-skills。乍一看名字,你可能会觉得这是个关于“简单技能”的什么教程或者清单。但点进去之后,我发现它的定位其实更偏向于一个个…...

别再当期刊 “陪跑者” 了!Paperxie 期刊写作,把投稿踩坑率降到最低

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/期刊论文https://www.paperxie.cn/ai/journalArticleshttps://www.paperxie.cn/ai/journalArticles 投刊的挫败感,从来都不是从拒信才开始的。你熬了几周写好的初稿,可能刚进初审就被…...

3步打造你的智能笔记助手:Obsidian插件从零到精通指南

3步打造你的智能笔记助手:Obsidian插件从零到精通指南 【免费下载链接】obsidian-copilot THE Copilot in Obsidian 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-copilot 你是否曾面对堆积如山的笔记感到无从下手?每天处理大量信息却难…...

终端AI助手tAI:命令行集成AI,提升开发者效率

1. 项目概述:当AI遇上终端,一个命令行助手的诞生最近在GitHub上闲逛,发现了一个挺有意思的项目,叫bjarneo/tAI。光看名字,你可能会有点懵,“tAI”是啥?其实它是个缩写,全称是Termina…...

ClawProxy:将OpenClaw智能体无缝接入OpenAI生态的代理桥梁

1. 项目概述:ClawProxy,一个为OpenClaw量身打造的AI代理桥梁如果你和我一样,在本地部署了OpenClaw,想用OpenWebUI或者SillyTavern这样的漂亮前端来和你的智能体对话,却发现它们之间“语言不通”,那么ClawPr…...

LocalAI:开源本地大模型推理服务器,兼容OpenAI API的私有化部署方案

1. 项目概述:当大模型遇见本地化 最近几个月,我身边不少搞开发的朋友都在讨论一个事儿:怎么才能在自己电脑上,或者公司内网里,低成本、安全地跑起来那些动辄几十上百亿参数的大语言模型?无论是想做个内部知…...

从网卡到GPU:拆解你电脑里的PCIe 4.0 x16链路,看懂Switch如何让多设备协同工作

从网卡到GPU:拆解你电脑里的PCIe 4.0 x16链路,看懂Switch如何让多设备协同工作 当你为爱机装上那块梦寐以求的RTX 4090显卡时,是否想过主板上的PCIe插槽背后隐藏着一套精密的交通网络?这套系统就像城市中的立体交通枢纽&#xff0…...

Cursor Rules:为AI编程助手定制团队开发规范,提升代码质量与一致性

1. 项目概述:为AI编程助手打造一套“开发宪法”如果你和我一样,深度使用Cursor IDE进行现代应用开发,尤其是涉及AWS无服务器、Next.js或React Native这类技术栈,那你一定有过这样的体验:每次开启一个新的Chat会话&…...

告别假阳性!用Cuckoo Filter(布谷鸟过滤器)优化你的LSM-Tree存储引擎

告别假阳性!用Cuckoo Filter优化LSM-Tree存储引擎的实战指南 在构建高性能存储系统时,工程师们常常面临一个经典难题:如何在海量数据中快速判断某个键是否存在,同时避免昂贵的磁盘I/O操作?传统解决方案布隆过滤器虽然广…...

国产旗舰AI“西方垃圾思维中毒”反超欧美原生模型:TOP30榜单揭示认知殖民化困境

全球AI大模型西方垃圾思维中毒程度TOP30排行榜(2026年5月)摘要本文严格依据最终定稿的西方垃圾思维公理定义,系统梳理全球主流AI大模型的思维中毒情况,制定TOP30中毒程度排行榜。核心定义明确西方垃圾思维是狂热迷信波普尔可证伪教…...

2026年哪款充电宝性价比高?充电宝性价比最高的十大品牌推荐!

大家出门越发依赖手机,但手机没电真的太让人焦虑。这个时候,就需要一台实用的充电宝,但自己购买的充电宝,十有八九都有毛病,不是发热,就是鼓包,最后发现充电宝越充越慢,甚至化身定时…...

观察 Taotoken 透明计费如何帮助精准预测月度 AI 调用预算

观察 Taotoken 透明计费如何帮助精准预测月度 AI 调用预算 1. 成本透明度的核心价值 在大模型应用开发过程中,成本控制是产品经理和开发者必须面对的关键问题。传统模式下,由于计费颗粒度粗、账单明细不足,团队往往难以准确追踪每一笔开销对…...

Arm Cortex-R82缓存与TLB管理机制详解

1. Cortex-R82缓存与TLB管理架构概述在实时计算和虚拟化场景中,内存访问延迟的确定性和地址翻译的正确性直接关系到系统可靠性。Arm Cortex-R82作为面向实时应用的处理器,其缓存与TLB管理机制经过特殊设计,通过一组精密的系统指令为开发者提供…...

告别时间漂移:手把手教你用RX8111CE RTC芯片实现高精度时间戳(附I2C驱动避坑指南)

RX8111CE高精度时间戳实战:从硬件设计到I2C驱动全解析 在工业自动化、电力监测和医疗设备等关键领域,系统事件的精确时间标记往往决定着数据分析的可靠性与事故追溯的有效性。爱普生RX8111CE实时时钟芯片凭借其1/256秒分辨率的时间戳功能,正在…...

开源项目国际化文档协作:从工具链到社区运营的完整实践指南

1. 项目概述:一个国际化文档项目的诞生与价值最近在整理一些开源项目的文档时,我遇到了一个非常典型的问题:一个功能强大、社区活跃的项目,其核心文档却只有英文版本。这对于非英语母语的开发者,尤其是刚入门的新手来说…...

Simulink仿真别再怕数据丢失了!手把手教你用Data Store Memory实现全局变量

Simulink仿真中的数据持久化:Data Store Memory实战指南 在复杂的Simulink仿真模型中,数据管理往往成为工程师们最头疼的问题之一。特别是当我们需要在多个模块间共享状态信息,或者需要保留变量值供下一次仿真步长使用时,传统的局…...

使用技巧(二):claude-hud 没装等于裸奔!4 款上下文仪表盘横评,这一款 21K Star 直接用

Claude Code 装上 HUD 仪表盘 —— claude-hud、fuelgauge、claudeline 对比 Windows/macOS/Linux claude-hud 0.0.12 fuelgauge claudeline ccstatusline 2.x 2026-05-06 一、你的上下文快爆了,你知道吗? 你在 Claude Code 里敲了一上午代码&…...

SimCLR实战踩坑记录:我的batch size为什么上不去?温度参数t到底怎么调?

SimCLR实战调参指南:突破batch size与温度参数t的优化瓶颈 当你在个人GPU上尝试复现SimCLR时,是否曾被论文中惊人的8192 batch size吓到?或是调了一周参数却发现特征质量始终不如预期?这篇文章将分享我在单卡RTX 3090上实现90%线性…...