十二、powerManager
PowerManger模块主要负责电池工作状态,电量监测,充放电管理。
1.1 初始化
在PowerInit()接口中完成了powerManager模块的初始化,在初始化的末端,进行了多个ADC请求,分别读取vref,vthm,vchg,vbat。当这些ADC请求返回时,置位相应的标志位,并获得vref,vthm,vchg,vbat等初始值,当四个变量的初次请求结果都成功返回后,powerinit的四个步骤都已经完成,之后调用PowerInitComplete()通知模块初始化完成。
InitEarlyUserFeatures()à
configManagerInit(TRUE)à
configManagerPower()à
powerManagerConfig()à
PowerInit(&theSink.task, config)à
powerMonitorInit();
PowerChargerMonitor();
powerMonitorInit()à
power->task.handler = powerMonitorHandler;
powerMonitorStart()à
powerMonitorReadAdc(&power->task, POWER_INTERNAL_VREF_REQ, 0);
powerMonitorReadAdc(&power->task, POWER_INTERNAL_VTHM_SETUP, 0);
powerMonitorReadAdc(&power->task, POWER_INTERNAL_VCHG_REQ, 0);
powerMonitorReadAdc(&power->task, POWER_INTERNAL_VBAT_REQ, 0);à
powerMonitorReadAdc()à
AdcRequest(); /*#MESSAGE_ADC_RESULT message will be sent*/
powerMonitorReadAdc(task, id, period); /* Successful, queue next monitor */
powerMonitor模块handler在接收到ADC请求返回的结果,即MESSAGE_ADC_RESULT时,根据message携带的附加信息,获取当前ADC请求的结果是Vref,temperaure,battery还是charger来进行不同分支处理。如果模块初始化已经完成,且power_init_cfm_sent标志未置位,则调用PowerInitComplete,通知clientTask模块初始化完成。
powerMonitorHandler()àcase MESSAGE_ADC_RESULTà
powerBatteryHandleTemperatureReading()
||powerBatteryHandleVoltageReading()
|| powerChargerHandleVoltageReading()
PowerInitComplete(power->clientTask, TRUE);
PowerInitComplete()à
POWER_INIT_SET(power_init_cfm_sent);
MessageSend(clientTask, POWER_INIT_CFM)à
handlePowerMessage()àPOWER_INIT_CFMà
powerManagerHandleVbat(battery_level_initial_reading)à
event = setting.event;
MessageSend(&theSink.task, event, NULL);
powerManagerHandleVbatCritical();
||powerManagerHandleVbatLow();
|| powerManagerHandleVbatNormal();
powerBatteryHandleVoltageReading()à
powerBatterySmoothVoltageReading();
if(new_level != old_level)
powerBatterySendVoltageInd();à
MessageSend(power->clientTask, POWER_BATTERY_VOLTAGE_IND)à
handlePowerMessage()àPOWER_BATTERY_VOLTAGE_INDà
powerManagerHandleVbat(ind->vbat, battery_level_automatic);
最终由powerManagerHandleVbat()负责将电量值反馈给上层客户,当然是通过message的方式进行传递的。当检测到电量低或者进入critical状态时,进行紧急处理。
1.2 持续监测
如何保证电量监测工作连续持久地进行下去呢?在ADC请求之后,立即进行下一次检测请求。这也是用信号机制的好处,连续持久地进行某项操作变得非常简单。
powerMonitorReadAdc()à
AdcRequest(); /*#MESSAGE_ADC_RESULT message will be sent*/
powerMonitorReadAdc(task, id, period); /* Successful, queue next monitor */
1.3 GATT客户通知
当GATT客户开启了电量通知时,GATT battery server又是如何通知客户的呢?在客户连接后,gattClientAdd()中,如果发现通知开启,则向ble_task发送#BATTERY_READ_TIMER消息,msgHandler在收到该消息后,通过powerManagerBatteryLevelAsPercentage()获取当前的电量值,注意该接口不会进行ADC请求获取电压值,而是直接使用上一次获取的电压值。在该接口中完成电压值到电量值的映射,如果你希望修改这种映射机制,可以在该接口中完成。
另外,当修改battery server的battery level notification属性,即从失能到使能时,也会发送BLE_INTERNAL_MESSAGE_BATTERY_READ_TIMER给bletask。
sinkGattManagerMsgHandlerà GATT_MANAGER_REMOTE_CLIENT_CONNECT_CFMà
handleGattManagerRemoteClientConnectCfm()à
gattClientAdd(cfm->cid, &cfm->taddr, ble_gap_role_peripheral)à
MessageSend(BleTask, BLE_INTERNAL_MESSAGE_BATTERY_READ_TIMER, 0 );à
sinkGattManagerMsgHandlerà GATT_BATTERY_SERVER_WRITE_CLIENT_CONFIG_INDà
handleWriteBatteryLevelClientConfig()à
MessageSend(BleTask, BLE_INTERNAL_MESSAGE_BATTERY_READ_TIMER, 0 );
bleInternalMsgHandler()àBLE_INTERNAL_MESSAGE_BATTERY_READ_TIMERà
sinkBleBatteryLevelReadSendAndRepeat()à
GattBatteryServerSendLevelNotification(powerManagerBatteryLevelAsPercentage)à
GattManagerRemoteClientNotify(&battery_level);
MessageSendLater(BleTask, BLE_INTERNAL_MESSAGE_BATTERY_READ_TIMER, 30000 );
十二、powerManager的更多相关文章
- 前端开发中SEO的十二条总结
一. 合理使用title, description, keywords二. 合理使用h1 - h6, h1标签的权重很高, 注意使用频率三. 列表代码使用ul, 重要文字使用strong标签四. 图片 ...
- CRL快速开发框架系列教程十二(MongoDB支持)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 我的MYSQL学习心得(十二) 触发器
我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...
- Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】
2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...
- 第十二章Fundamental Data Types 基本数据类型
目录: 12.1 数值概论 12.2整数 12.3浮点数 12.4 字符和字符串 12.5布尔变量 12.6枚举类型 12.7具名常量 12.8数组 12.9创建你自己的类型 12.1 数值概论 ...
- [分享] IT天空的二十二条军规
Una 发表于 2014-9-19 20:25:06 https://www.itsk.com/thread-335975-1-1.html IT天空的二十二条军规 第一条.你不是什么都会,也不是什么 ...
- Bootstrap <基础三十二>模态框(Modal)插件
模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用 ...
- Bootstrap <基础二十二>超大屏幕(Jumbotron)
Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...
- Bootstrap <基础十二>下拉菜单(Dropdowns)
Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现. 如需使用下列菜单,只需要在 ...
- AngularJs的UI组件ui-Bootstrap分享(十二)——Rating
Rating是一个用于打分或排名的控件.看一个最简单的例子: <!DOCTYPE html> <html ng-app="ui.bootstrap.demo" x ...
随机推荐
- pytest4-单文件使用fixture(Fixtures as Function arguments)
Fixtures as Function arguments (fixture作为函数参数传入)Test functions can receive fixture objects by naming ...
- python字符的各种处理,不用内置函数总结
一.字符的逆序,可变字符长度的最大值,自然数列表相加 # e=input("输入自然数字字符串:") # result=0 # for x in e: # result+=eval ...
- F#周报2019年第43期
新闻 F# eXchange 2020--征文通知 FSSF在忙什么?2019年第三季度版本 Miguel强烈推荐使用TensorFlow.NET 运行在ASP.NET Core 3上的SAFE-Bo ...
- 使用SQLserver Management Studio连接VS2012自带数据库
下载 Microsoft® SQL Server® 2008 Management Studio Express http://www.microsoft.com/zh-CN/download/det ...
- MySQL基础篇(3)常用函数和运算符
一.字符串函数(索引位置都从1开始) CONCAT(S1,S2,...Sn): 连接S1,S2,...Sn为一个字符串,任何字符串与NULL进行连接的结果都是NULL INSERT(str,x,y,i ...
- django-模板之include标签(十五)
就是将一些常用的html代码分离出来,使其可以重复利用,减少代码量 index.html <!DOCTYPE html> <html lang="en"> ...
- 前端技术之:如何创建一个NodeJs命令行交互项目
方法一:通过原生的NodeJs API,方法如下: #!/usr/bin/env node # test.js var argv = process.argv; console.log(argv) ...
- android 7.0 pm install 失败问题
这两天,把app内置成系统文件或者系统签名取得系统权限,发现使用pm install path在低版本上可行,在高版本就安装失败 抛出 NullPointException,查看了一下源码,发现对包名 ...
- 「分治」-cdq分治
cdq分治是一种分治算法: 一种分治思想,必须离线,可以用来处理序列上的问题(比如偏序问题),还可以优化1D/1D类型的DP.• 算法的大体思路我们可以用点对来描述.假定我们有一个长度为n的序列,要处 ...
- 【倒腾HTTPS】Nginx for Docker自签名SSL证书
前言 合格的web程序员, 必须能自由在 IIS. Nginx. Nginx for Docker上配置Https服务, 博客最近将专题记录 Https & Hsts 如何申请适用于生产 ...