BES2300X,BES2500X——UI(按键,提示音,指示灯)

2023-11-09

本文是BES2300X,BES2500X系列博文UI部分
一个耳机/音箱,UI是联系使用者与开发者最直接的一个窗口。当然,对于吾等码农而言,UI设计并不是我们最关心的。
我们主要做的是UI实现。
本文!!!
写BES最基础UI:按键,指示灯,提示音

一,按键
按键显然是一个中断,我们需要关注以下3点

1,管脚配置
tgt_hardware.c文件的cfg_hw_gpio_key_c数组用以配置按键管脚。
值得一提的是,按键配置结构体的最后一个成员可以配置按键极性

2,中断函数
hal_key.c文件的hal_key_debounce_handler函数用以处理按键中断
并依次通过以下函数

send_key_event(HAL_KEY_CODE_PWR, key_status.event)
key_event_process(uint32_t key_code, uint8_t key_event)
APP_MODUAL_KEY( app_set_threadhandle(APP_MODUAL_KEY, app_key_handle_process);
)

将按键事件发送至app_thread中处理

具体细节就不说了,看代码的能力大家都有。重点是hal_key_debounce_handler函数中可以自定义按键操作,例如,双击
+长按,10击等等。

3,处理函数

app_thread中,app_key_handle_process会先查注册表,根据不同的按键code和按键event,分别处理。如下图:

既然需要查表处理,那么一定会有注册的位置:

app_key_handle_registration(&app_key_handle_cfg[i]);

此行代码在app_key_init函数中。
app_key_handle_cfg数组中包含了每一个key_code,每一个key_event对应的处理函数。
至此,按键从IO到上层再到初始化,形成通路。

4,TWS模式从耳通路

另外,TWS模式(IBRT)通路会多一条,从耳机的按键会在注册的按键处理函数中,将按键信息发送至主耳处理。
从耳发送:

app_ibrt_if_keyboard_notify(status,param);

主耳接收:

void app_ibrt_keyboard_request_handler(uint16_t rsp_seq, uint8_t *p_buff, uint16_t length)

主从通信相关问题在蓝牙操作及协议连接部分讲解,链接如下:
敬请期待

二,指示灯

tgt_hardware.c文件的cfg_hw_pinmux_pwl数组对指示灯IO进行配置
使用时就这个函数,调用就完了:

app_status_indication_set(APP_STATUS_INDICATION_CHARGENEED);

驱动流程以及呼吸灯有时间再更新

三,提示音

这里只讲如何播放提示音。
播放提示音有两种方式,如下:

1,播放提示音

打断播放:

app_voice_report(APP_STATUS_INDICATION_T status, uint8_t device_id)

混合播放(流程与打断播放近似,需要打开相关宏定义):

media_PlayAudio(AUD_ID_ENUM id,uint8_t device_id)

2,添加提示音

需要将WAV格式音频文件。打断播放通过BES给出的工具,编码并转换成TXT文件。混合播放直接另存为TXT文件。添加至资源文件夹。
打断播放参考该函数:

void media_runtime_audio_prompt_update(uint16_t id, uint8_t** ptr, uint32_t* len)

混合播放参考该函数:

app_ring_merge_start();

偷个懒,具体操作流程先不写了,有时间再完善

关于提示音如何从内存到Speaker,会在数据流及数据编码部分讲解链接如下:
敬请期待


版权声明:本文为CSDN博主「hoaquin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hoaquin/article/details/112759323

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BES2300X,BES2500X——UI(按键,提示音,指示灯) 的相关文章

  • 机器学习集成模型学习——投票集成Voting(二)

    Voting集成 投票机制就是多个模型分别预测 然后投票 票数最高的就是整个模型最后的效果 案例代码 from sklearn linear model import LogisticRegression from sklearn naiv
  • github访问很慢的问题

    github访问很慢的问题 公司一直用着svn 之前也的确用过github的版本管理 但是一直都是可视化的操作 这几天面试了几名前端 问了一下发现他们在之前的公司里都是用git的 于是今天好好温故了一下怎么用命令行进行一下git操作 首先要
  • R语言合并数据框的行与列

    合并数据框的行与列 大家好 这里是想做生信大恐龙 的生信小白 先赞后看养成习惯 还没关注的小伙伴点点关注不迷路 今天熟悉数据操作中的数据合并 数据合并 合并数据框的行与列 一 rbind 和cbind 函数 二 merge 函数 总结 一
  • 【日常实用】git rebase合并多笔为一笔提交

    前言 在日常开发中 经常会遇到master分支和自己的分支已经渐行渐远 分叉久已 此时并不能用get merge 的方式合并代码了 这个时候想要将多笔提交合并成一笔并解决好冲突提交话 get rebase 就派上了用场了 举例说明 一 新建
  • kibana使用

    数据导出 查询完数据后 数据量很大 我们要对数据进行分析 可以导出来用excel分析 导出很简单 就是先保存后分享就可以了 使用kibana界面导出数据 我们要进行重复行统计的时候 可以使用excel的数据透视表 很强大 excel如何快速
  • EM算法

    尽管最大似然估计 MLE 和EM都可以找到 最佳拟合 参数 但是它们查找模型的方式却大不相同 MLE首先累积所有数据 然后使用该数据构建最可能的模型 EM首先对参数进行猜测 考虑丢失的数据 然后对模型进行调整以适合猜测和观察到的数据 该算法
  • 【IDEA】IDEA git log 点击 没有代码变更

    文章目录 1 概述 1 概述 Git log 下查看分支提交的信息 结果只有提交信息 没有代码变更信息 如下图 这里有坑 不是消失了 是下拉框拉倒最上面了 这里有条线 往下拉就能看到了
  • 使用kubeadm工具升级kubernetes

    一 背景 kubeadm部署的kubernetes集群进行升级 通常先升级控制节点 控制节点升级完成后再升级工作节点 本博文只升级了控制节点 工作节点按照相同的流程进行升级即可 环境说明 主机名 节点 11 0 1 200 k8s客户端操控
  • show_space存储过程脚本

    CREATE OR REPLACE PROCEDURE show space p segname 1 IN VARCHAR2 p type 1 IN VARCHAR2 DEFAULT TABLE p space IN VARCHAR2 DE
  • 程序下载微云

    https share weiyun com 5OxmUiI
  • python/sympy计算施密特正交化向量

    sympy的符号计算功能很强大 学习矩阵分析 重温了线性代数中施密特正交化的方法 正好可以用sympy解决一些计算问题 施密特正交化 也称 Gram Schmidt 正交化过程 Gram Schmidt Orthogonalization
  • 【linux】01 dnf 命令安装(新的代替yum 的安装方式)

    一 dnf 介绍 参考文章 DNF 是新一代的 rpm 软件包管理器 他首先出现在 Fedora 18 这个发行版中 而最近 它取代了 yum 正式成为 Fedora 22 的包管理器 DNF 包管理器克服了 YUM 包管理器的一些瓶颈 提
  • jdk8特性Collections.sort()的使用

    Java中Collections sort 的使用学习记录 在日常开发中 很多时候都需要对一些数据进行排序的操作 然而那些数据一般都是放在一个集合中如 Map Set List 等集合中 他们都提共了一个排序方法 sort 要对数据排序直接
  • k8s服务(service)详解

    目录 1 Service介绍 1 1 kube proxy支持的工作模式 userspace 模式 iptables 模式 ipvs 模式 2 Service类型 3 Service使用 3 1 实验环境准备 3 2 ClusterIP类型
  • vue3中使用jsx报错React is not defined和h is not defined

    js项目中jsx的使用 js项目引入Vue 3 Babel JSX 插件 修改vite config js import defineConfig from vite import vue from vitejs plugin vue im
  • python定时器

    一 定时器 在实际应用中 我们需要使用定时器去触发一些事件 Python中的定时器是timer 首先看个例子 import datetime 导入datetime模块 import threading 导入threading模块 def r
  • Hbase Java API 介绍

    Hbase Java API 介绍 几个主要 Hbase API 类和数据模型之间的对应关系 1 HBaseAdmin 关系 org apache hadoop hbase client HBaseAdmin 作用 提供了一个接口来管理 H
  • 超详细的人脸检测:MTCNN代码分析,手把手带你从零开始码代码

    前言 之前我发过MTCNN的原理分析 不了解的朋友可以看看深刻理解MTCNN原理 超级详细 从零开始做人脸检测 Tensorflow2实现 授人以鱼 不如授人以渔 本文与其他代码分析的文章不一样 本文不会涉及原理过多的东西 原理参照我的上一
  • react 安装

    安装react脚手架 npm i g create react app 创建react项目 npx create react app react project react project为项目名
  • 使用ping检测MTU值

    ping ping Packet Internet Groper 是一种因特网包探索器 用于测试网络连接量的程序 Ping是工作在 TCP IP网络体系结构中应用层的一个服务命令 主要是向特定的目的主机发送 ICMP Internet Co

随机推荐

  • sql语句-如何以一个表中的数据为条件据查询另一个表中的数据

    下面这个是SQL语句的一个基本样式 select from 表2 where 姓名 in select 姓名 from 表1 where 条件 实例需求 在项目中是这样应用的 我需要根据库位编号去查找库位信息表里查找库位上放的的料箱编号 我
  • C++-----动态规划

    目录 一 动态规划的基本思想 二 设计动态规划法的步骤 三 动态规划问题的特征 4 1 矩阵连乘积问题 4 1 1 分析最优解的结构 4 1 2 建立递归关系 4 1 3 计算最优值 4 1 3 计算最优值 4 1 3 构造最优解 4 2
  • 面向对象设计原则——单一职责原则

    单一职责原则是最简单的面向对象设计原则 它用于控制类的粒度大小 单一职责原则 Single Responsibility Principle SRP 一个类只负责一个功能领域中的相应职责 或者可以定义为 就一个类而言 应该只有一个引起它变化
  • 移植python到小米路由器记录。

    最近抢了一个小米路由器 研究了一下 总的来说现在看起来功能还很少 现在比较有用的功能就是 远程下载功能 支持迅雷 电驴等 不过现在看电影啥的都是直接在线看的 基本上也很少用 检测连接的智能设备 这个功能可以随时查看是否有人曾网 当然也可以用
  • git项目初次push提示 error: failed to push some refs to ‘https://github.com/xxx

    问题描述 当你的项目不是先从远程仓库pull下来 再push的话 可能会出现 push被拒绝问题 rejected cfj gt cfj non fast forward error failed to push some refs to
  • 定义样式并获取上传文件路径及指定文件类型

  • dataframe显示数据处理进度

    显示效果如下 tqdm搭配progress apply使用 from tqdm import tqdm tqdm pandas desc pandas bar df result df score progress apply lambda
  • 发现一个bug如何定位是前端还是后台问题?

    1 经验法 软件测试人员应不断精进自己的技能 负责的项目多了 自然对功能的实现过程有了解 也就明白如何分类bug了 例如 网页上的某个图片的分辨率不对 如果我们了解实现过程 可以想到一般情况下 是根据某个地址去服务器取图片的 数据库一般只保
  • c/c++ 力扣LeetCode 645.错误的集合

    题目链接 力扣 645 错误的集合 不想戳的看下图 解题思路 循环嵌套 对于这道题 有很多种方法 首先想到的 应是循环嵌套 直接for循环两边寻找相同 并求得丢失的整数 代码就不展示了 想必大家都会写 但时间复杂度O n2 是相当高的 对于
  • ios html mail,在Ios上的html电子邮件中显示base64图像

    我生成一个包含base64图像的html字符串 当MFMailComposeViewController打开时 我会看到生成的电子邮件中的图像 当我发送并打开它时 图像不会显示 只有空方块 我的代码 IBAction actionShare
  • VSCode无法登录leetcode,报[ERROR] invalid password?错误

    原因 leetcode cn的用户名是手机或者邮箱 不能用昵称登录 在官网退出登陆后发现用昵称登录不了 换成邮箱或者手机号后 登录成功 login node 960 Warning Accessing non existent proper
  • SQL Server主流版本生命周期管理

    SQL Server 生命周期 每个版本的 SQL Server 都有至少 10 年的支持期限 其中包括五年的主要支持和五年的扩展支持 主要支持 包括功能 性能 可伸缩性和安全更新 扩展支持 仅包含安全更新 终止支持 有时也称为生命周期结束
  • 2020年高教社杯全国大学生数学建模竞赛赛题 C题分析与思路!(持续更新)

    C题 中小微企业的信贷决策 1 C题题目背景 分析 在实际中 由于中小微企业规模相对较小 也缺少抵押资产 因此银行通常是依据信贷政策 企业的交易票据信息和上下游企业的影响力 向实力强 供求关系稳定的企业提供贷款 并可以对信誉高 信贷风险小的
  • 【nginx编译-zierror: ‘struct crypt_data‘ has no member named ‘current_salt‘】

    nginx编译 src os unix ngx user c In function ngx libc crypt src os unix ngx user c 26 7 error struct crypt data has no mem
  • C#中Class与Struct区别

    C 中Class与Struct区别 1 class 是引用类型 继承自System Object stuce是值类型 继承自System ValueType类 因此不具多态性 但是注意 System ValueType是个引用类型 2 从职
  • 如何用SPSS对数据进行标准化处理?

    SPSS统计分析软件是我最早接触的数据分析工具 我的博客将陆续介绍SPSS统计分析软件的相关内容 这类文章将统一按照在标题或者正文第一段出现 SPSS案例分析 编号 的形式组织 便于读者朋友们快速查询 收集 今天是第一篇 即 SPSS案例分
  • python循环与文件操作

    if 语句语法结构 if 条件 elif 条件 else 1 如果表达式的值 非0 或者为布尔值 True 则代码组 if suite 被执行 否则就去执行 else suite 2 只要表达式数字为 非零值 即为 True 3 空字符串
  • 移植使用tslib 库

    目录 tslib 简介 tslib 移植 下载tslib 源码 编译tslib 源码 tslib 安装目录下的文件夹介绍 在开发板上测试tslib tslib 库函数介绍 打开触摸屏设备 配置触摸屏设备 读取触摸屏数据 基于tslib 编写
  • STL库的使用之容器模板类QVector使用

    Qt中提供了一组通用的基于模板的容器类 对比C 中的STL库的容器类 Qt的这些容器类更轻量 更安全并且容易使用同时在速度 内存消耗 内联代码等方面进行了优化 存储在Qt的容器中数据必须是可赋值的数据类型 数据类型必须提供一个默认的构造函数
  • BES2300X,BES2500X——UI(按键,提示音,指示灯)

    本文是BES2300X BES2500X系列博文UI部分 一个耳机 音箱 UI是联系使用者与开发者最直接的一个窗口 当然 对于吾等码农而言 UI设计并不是我们最关心的 我们主要做的是UI实现 本文 写BES最基础UI 按键 指示灯 提示音