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

Function模块

0 Preface/Foreword

1 数据结构 

1.1 func_cb_t 

//task control block
typedef struct {u8 sta;                                         //cur working task numberu8 last;                                        //lask task number
#if BT_BACKSTAGE_ENu8 sta_break;                                   //被中断的任务
#endifvoid (*mp3_res_play)(u32 addr, u32 len);        //各任务的语音播报函数接口void (*set_vol_callback)(u8 dir);               //设置音量的回调函数,用于各任务的音量事件处理。
} func_cb_t;

cbControl Block,控制块。

1.2 task number

//task number
enum {FUNC_NULL = 0,FUNC_MUSIC,FUNC_FMRX,FUNC_CLOCK,FUNC_BT,FUNC_BTHID,FUNC_USBDEV,FUNC_AUX,FUNC_SPDIF,FUNC_FMAM_FREQ,FUNC_SPEAKER,FUNC_PWROFF,FUNC_SLEEPMODE,FUNC_EXSPIFLASH_MUSIC,FUNC_BT_DUT,                        //CBT测试模式FUNC_BT_FCC,                        //FCC测试模式FUNC_BT_IODM,                       //IODM测试模式FUNC_IDLE,FUNC_I2S,FUNC_GACTIVITY,FUNC_GBLOOD_OXYGEN,FUNC_GBREATH,FUNC_GHEARTRATE,FUNC_GMENU,FUNC_GMUSIC,FUNC_GNMC,FUNC_GSLEEP,FUNC_GMSG,FUNC_GQRCODE,FUNC_GSETUP,FUNC_GDORMANCY,FUNC_GSTOPWATCH,FUNC_GWEATHER,FUNC_GWATCHFACE_CHOOSE,FUNC_GWORKOUT_GOAL,FUNC_GWORKOUT_CHOOSE,FUNC_GWATCHFACE_SHOW,FUNC_GEMIT,FUNC_MENU_STAR,
};

2 代码分析

2.0 func_run

AT(.text.func)
void func_run(void)
{printf("[OHZ]%s, %d\n", __func__, __LINE__);func_bt_chk_off();func_cb.sta = FUNC_GWATCHFACE_SHOW;while (1) {func_enter();switch (func_cb.sta) {
#if 0//FUNC_MUSIC_ENcase FUNC_MUSIC:func_music();break;
#endif // FUNC_MUSIC_ENcase FUNC_GWATCHFACE_SHOW:printf("[OHZ]%s, %d\n", __func__, __LINE__);func_gwatchface_show();break;
#if BT_EMIT_ENcase FUNC_GEMIT:func_gemit();break;
#endif
#if FUNC_BT_ENFUNC_MENU_STARcase FUNC_BT:func_bt();break;
#endif#if FUNC_BTHID_ENcase FUNC_BTHID:func_bthid();break;
#endif // FUNC_BTHID_EN#if FUNC_AUX_ENcase FUNC_AUX:func_aux();break;
#endif // FUNC_AUX_EN#if FUNC_USBDEV_ENcase FUNC_USBDEV:func_usbdev();break;
#endif#if FUNC_SPDIF_ENcase FUNC_SPDIF:func_spdif();break;
#endif#if FUNC_FMAM_FREQ_ENcase FUNC_FMAM_FREQ:func_fmam_freq();break;
#endif // FUNC_FMAM_FREQ_EN#if FUNC_SPEAKER_ENcase FUNC_SPEAKER:func_speaker();break;
#endif // FUNC_SPEAKER_EN#if FUNC_IDLE_ENcase FUNC_IDLE:func_idle();break;
#endif // FUNC_IDLE_EN#if FUNC_BT_DUT_ENcase FUNC_BT_DUT:func_bt_dut();break;
#endif
#if FUNC_BT_FCC_ENcase FUNC_BT_FCC:func_bt_fcc();break;
#endifcase FUNC_MENU_STAR:func_menu_star();break;case FUNC_PWROFF:func_pwroff(sys_cb.pwrdwn_tone_en);break;default:func_exit();break;}}
}

 

2.1 func_enter

///进入一个功能的总入口
AT(.text.func)
void func_enter(void)
{printf("[OHZ]%s, %d\n", __func__, __LINE__);param_sync();reset_sleep_delay();reset_pwroff_delay();func_cb.mp3_res_play = func_bt_mp3_res_play;func_cb.set_vol_callback = NULL;bsp_clr_mute_sta();sys_cb.voice_evt_brk_en = 1;    //播放提示音时,快速响应事件。
}

2.2 func_process

AT(.text.func.process)
void func_process(void)
{WDT_CLR();motor_process();#if USE_CO_TIMERco_timer_pro();
#endif
#if VBAT_DETECT_ENlowpower_vbat_process();
#endif // VBAT_DETECT_EN#if VUSB_TBOX_QTEST_ENif(qtest_get_mode()){qtest_process();}qtest_other_usage_process();
#endif#if USER_NTCif(sys_cb.ntc_2_pwrdwn_flag){sys_cb.pwrdwn_tone_en = 1;func_cb.sta = FUNC_PWROFF;
//        printf("hello WIKI\n");sys_cb.ntc_2_pwrdwn_flag = 0;}
#endif#if CHARGE_ENif (xcfg_cb.charge_en) {charge_detect(1);
//        bsp_charge_inbox_process();}
#endif // CHARGE_EN#if SYS_KARAOK_ENkaraok_process();
#endif#if LE_APP_ENbsp_ble_process();
#endif
#if FOT_ENbsp_fot_process();
#endif// gsensor_process();if (BT_DUAL_MODE_EN && xcfg_cb.ble_en) {platform_ble_process();}sleep_process(bt_is_sleep);#if FUNC_MUSIC_ENif ((dev_is_online(DEV_UDISK)) || (dev_is_online(DEV_SDCARD)) || (dev_is_online(DEV_SDCARD1))) {music_process_do();}
#endif
}

2.3 func_watch_bt_process

AT(.text.func.process)
void func_watch_bt_process(void)
{func_bt_status();if(f_bt.disp_status == BT_STA_INCOMING) {sfunc_bt_ring();reset_sleep_delay();reset_pwroff_delay();} else if(f_bt.disp_status == BT_STA_OTA) {sfunc_bt_ota();reset_sleep_delay();reset_pwroff_delay();} else if(f_bt.disp_status >= BT_STA_OUTGOING) {sfunc_bt_call();reset_sleep_delay();reset_pwroff_delay();}
}

2.4 func_message

//func common message process
AT(.text.func.msg)
void func_message(u16 msg)
{switch (msg) {case EVT_KNOB_FORWARD:printf("EVT_KNOB_FORWARD\n");break;default:break;
}

2.5 func_exit

AT(.text.func)
void func_exit(void)
{u8 func_num;u8 funcs_total = get_funcs_total();for (func_num = 0; func_num != funcs_total; func_num++) {if (func_cb.last == func_sort_table[func_num]) {break;}}func_num++;                                     //切换到下一个任务if (func_num >= funcs_total) {func_num = 0;}func_cb.sta = func_sort_table[func_num];        //新的任务
#if SYS_MODE_BREAKPOINT_ENparam_sys_mode_write(func_cb.sta);
#endif // SYS_MODE_BREAKPOINT_EN
}

相关文章:

Function模块

0 Preface/Foreword 1 数据结构 1.1 func_cb_t //task control block typedef struct {u8 sta; //cur working task numberu8 last; //lask task number #if BT_BACKSTAGE_ENu8 sta_break…...

Prometheus PromQL数据查询语言

PromQL 简介 PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言。支持用户进行实时的数据查询及聚合操作。 Prometheus 基于指标名称(metrics name)以及附属的标签集(labelset)唯一定义一…...

如何将转换器应用于时序模型

一、说明 在机器学习的广阔环境中,变压器作为建筑奇迹屹立不倒,以其复杂的设计和捕获复杂关系的能力重塑了我们处理和理解大量数据的方式。 自 2017 年创建第一台变压器以来,变压器类型呈爆炸式增长,包括强大的生成 AI 模型&#…...

数据结构:队列

文章目录 队列一,概述二,添加数据三,删除数据 队列 一,概述 队列是一种特殊的数据结构,它遵循先进先出(FIFO)的原则。在队列中,元素被添加到末尾,并从头部移除。队列只…...

AUTOSAR汽车电子嵌入式编程精讲300篇-基于AUTOSAR架构的AT控制系统研究与实现

目录 前言 国内外研究现状 国外研究现状 国内研究现状 2 AUTOSAR规范及开发流程...

计网第五章(运输层)(四)(TCP的流量控制)

一、基本概念 流量控制就是指让发送方的发送速率不要太快,使得接收方来得及接收。可以使用滑动窗口机制在TCP连接上实现对发送方的流量控制。 注意:之前在讨论可靠传输时,讨论过选择重传协议和回退N帧协议都是基于滑动窗口的机制上进行实现…...

【华为OD机试python】查找众数及中位数【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 众数是指一组数据中出现次数最多的那个数,众数可以是多个。 中位数是指把一组数据从小到大排序后,如果这组数据的总数是奇数, 那最中间的那个数就是中位数; 如果这组数据总数是偶数,那…...

阿里云无影云电脑详细介绍:价格、使用和功能优势说明

什么是阿里云无影云电脑?无影云电脑(原云桌面)是一种快速构建、高效管理桌面办公环境,无影云电脑可用于远程办公、多分支机构、安全OA、短期使用、专业制图等使用场景,阿里云百科分享无影云桌面的详细介绍、租用价格、…...

【实践篇】MySQL执行计划详解

文章目录 本文知识大纲速览1. 前言2. 基本介绍1. 什么是执行计划2. 如何查看执行计划3. 执行计划的组成部分 3. 执行计划的关键元素1. id2. select_type3. table:4. type:5. possible_keys:6. key:7. key_len8. ref:9. rows:10. Extra 4. 底层原理5. 执行计划示例解读本文知识图…...

二维凸包(Graham) 模板 + 详解

(闲话) 上了大学后没怎么搞oi,从土木跑路到通信了(提桶开润大成功!),但是一年上两年的课(补的),保研也寄掉了( 说起来自从博客被大学同学发现并…...

ElasticSearch(ES)简单介绍

ES简介 Elasticsearch(通常简称为ES)是一个开源的分布式搜索和分析引擎,旨在处理各种类型的数据,包括结构化、半结构化和非结构化数据。它最初是为全文搜索而设计的,但随着时间的推移,它已经演变成一个功能…...

OpenCV(三十五):凸包检测

1.凸包检测介绍 凸包检测是计算凸包的一种技术,凸包就是:给定二维平面上的点集,将最外层的点连接起来构成的凸边形,它是包含点集中所有的点。 2.凸包检测函数convexHull() void cv::convexHull ( InputArray points, OutputArra…...

PS 透视裁剪工具

上文 PS 裁剪工具及工具栏配置讲解 我们讲完了裁剪工具 然后 我们继续来研究 透视裁剪工具 切换到 透视裁剪工具 后 我们先点击左上方的清除 先不要这些多的配置 然后 我们可以先用鼠标在图像上 画出一个局域 然后 我们去拖他四个角中的其中一个 就能拖出一些不同的形状 然…...

每日一个C库函数-#1-memset()

每日一个C库函数-#1-memset() 来源 C 标准库 - <string.h> 声明 void *memset(void *str, int c, size_t n);str&#xff1a;要填充的内存块&#xff1b;c&#xff1a;要被设置的值&#xff08;以何值填充&#xff09;。该值以 int 形式传递&#xff0c;填充内存块时…...

GraphQL基础知识与Spring for GraphQL使用教程

文章目录 1、数据类型1.1、标量类型1.2. 高级数据类型 基本操作2、Spring for GraphQL实例2.1、项目目录2.2、数据库表2.3、GraphQL的schema.graphql2.4、Java代码 3、运行效果3.1、添加用户3.2、添加日志3.3、查询所有日志3.4、查询指定用户日志3.5、数据订阅 4、总结 GraphQL…...

【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析

【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析 一、QNX AIS Server 框架分析二、QNX Hypervisor / Android GVM 方案介绍三、Camera APP 调用流程分析四、QCarCam 状态转换过程介绍五、Camera 加串-解串 硬件链路分析六、摄像头初始化检测过程介绍…...

威胁的数量、复杂程度和扩散程度不断上升

Integrity360 宣布了针对所面临的网络安全威胁、数量以及事件响应挑战的独立研究结果。 数据盗窃、网络钓鱼、勒索软件和 APT 是最令人担忧的问题 这项调查于 2023 年 8 月 9 日至 14 日期间对 205 名 IT 安全决策者进行了调查&#xff0c;强调了他们的主要网络安全威胁和担忧…...

NSSCTF web 刷题记录2

文章目录 前言题目[广东强网杯 2021 团队组]love_Pokemon[NCTF 2018]Easy_Audit[安洵杯 2019]easy_web[NCTF 2018]全球最大交友网站prize_p2[羊城杯 2020]easyser[FBCTF 2019]rceservice方法一方法二 前言 今天是2023年9月13号&#xff0c;刷题记录2正式开始。时间来到九月十七…...

Linux驱动之INPUT子系统框架

目录 一、input 子系统简介 二、input 驱动编写流程 1、注册 input_dev 2、上报输入事件 三、input_event 结构体 按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c; Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设…...

Long类型雪花算法ID返回前端后三位精度缺失问题解决

目录 一、问题描述二、问题复现1.Maven依赖2.application.yml 配置3.DemoController.java4.snowflakePage.html 页面5.DemoControllerAdvice.java 监听6.问题复现 三、原因分析四、问题解决方案一方案二 一、问题描述 Java 后端使用雪花算法生成 Long 类型的主键 ID&#xff0…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...