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的更多相关文章

  1. 前端开发中SEO的十二条总结

    一. 合理使用title, description, keywords二. 合理使用h1 - h6, h1标签的权重很高, 注意使用频率三. 列表代码使用ul, 重要文字使用strong标签四. 图片 ...

  2. CRL快速开发框架系列教程十二(MongoDB支持)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. 我的MYSQL学习心得(十二) 触发器

    我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...

  4. Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】

    2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...

  5. 第十二章Fundamental Data Types 基本数据类型

    目录: 12.1 数值概论 12.2整数 12.3浮点数 12.4 字符和字符串 12.5布尔变量 12.6枚举类型 12.7具名常量 12.8数组 12.9创建你自己的类型 12.1   数值概论 ...

  6. [分享] IT天空的二十二条军规

    Una 发表于 2014-9-19 20:25:06 https://www.itsk.com/thread-335975-1-1.html IT天空的二十二条军规 第一条.你不是什么都会,也不是什么 ...

  7. Bootstrap <基础三十二>模态框(Modal)插件

    模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用  ...

  8. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  9. Bootstrap <基础十二>下拉菜单(Dropdowns)

    Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现. 如需使用下列菜单,只需要在 ...

  10. AngularJs的UI组件ui-Bootstrap分享(十二)——Rating

    Rating是一个用于打分或排名的控件.看一个最简单的例子: <!DOCTYPE html> <html ng-app="ui.bootstrap.demo" x ...

随机推荐

  1. 【Autofac打标签模式】Component和Autowired

    [ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki Componet标签把类型注册到DI容器 1. 把 ...

  2. ubuntu 虚拟机设置静态ip

    $ sudo vim /etc/network/interfaces auto ens33   # 使用的网络接口,之前查询接口是为了这里     iface ens33 inet static    ...

  3. 后台添加Textbox

    /// <summary> /// behind add textbox /// </summary> private void AddTextToTextBox() { Te ...

  4. Kafka 权威指南阅读笔记(第三章,第四章)

    Kafka 第三章,第四章阅读笔记 Kafka 发送消息有三种方式:不关心结果的,同步方式,异步方式. Kafka 的异常主要有两类:一种是可重试异常,一种是无需重试异常. 生产者的配置: acks ...

  5. unity发布ios高通AR的问题

    1)缺少引用,无法找到vuforiaBehavior 原因:Windows下的工程,直接考到mac下,导致unity自带插件(2017)有问题 解决:首先在playerSettings-xrSetti ...

  6. django-VIews之HttpResponse(一)

    HttpResponse(content,conent_type=None,status=None,charset=None,*args,**kwargst) content:返回给视图的内容 con ...

  7. vue-route动态路由

    配置子路由: 路由的视图都需要使用view-router 子路由也可以嵌套路由使用: children来做嵌套如上图 使用location.页面name就可以做页面跳转 mounted:挂载,延迟跳转 ...

  8. JAVA基础知识注意事项

    JAVA核心技术卷一 (第十版) 下面是需要注意的: 只有方法名和参数类型叫做方法的签名, 不同的返回类型值不能作为方法的签名.(4.6.1) 这是域与局部变量的主要不同点. 必须明确地初始化方法中的 ...

  9. javadoc的使用

    在进行项目开发过程中,项目接口文档是很重要的一块内容,在java项目中我们可以用swagger,asciidoc,javadoc等方式来生产文档,而其中最基本的文档生成方式就是javadoc,它一般用 ...

  10. yum安装PHP升级到7.1版本

    yum安装PHP升级到7.2版本卸载原来低版本的PHP rpm -qa |grep php|xargs rpm -e 更新yum源 //CentOS/RHEL 7.xrpm -Uvh https:// ...