当前位置: 首页 > 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…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...