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. Mysql分表的一个考虑

    今天看到一篇博客,讲述的是Mysql的分表方案,内容比较简单,不过有个思路倒是挺好的,记录下,后续分表可以参考 作者主要是说到两种分表,一个是取模,另一个是范围分表 取模:比如用户ID%10,分10张 ...

  2. mysql数据备份之 xtrabackup

    上一篇简单介绍了一下mysqldump进行数据库的备份和恢复,这一篇说一下另一种备份工具xtrabackup,在InnoDB事务引擎泛滥的时代,xtrabackup可以很好的支持数据库的热备份,这就很 ...

  3. vue-cli2、vue-cli3脚手架详细讲解

    前言: vue脚手架指的是vue-cli它是vue官方提供的一个快速构建单页面(SPA)环境配置的工具,cli 就是(command-line-interface  ) 命令行界面 .vue-cli是 ...

  4. C# 添加、修改、删除Excel图表数据标签

    图表中,图表数据标签以数据化形式表现图表中的特定数据,可增强图表的可读性.我们可以对图表添加数据标签,也可以对已有的数据标签进行修改或者删除,下面将通过C#代码形式来实现. 使用工具:Spire.XL ...

  5. 用Python校准本地时间

    目录 1. 概念 1.1 基本概念 1.2 版本演进 2. 示例演示 2.1 前提条件 2.2 完整代码 2.3 其他问题 3. 参考信息: 1. 概念 1.1 基本概念 时间,对于我们来说很重要,什 ...

  6. 用Wireshark抓包分析请求

    前言 有些封装好的API把错误都屏蔽掉,直接返回某一个不明确的具体错误,让人感到困惑. //code in SDK read-only public static Data requestHandle ...

  7. linux端口查询

    常用端口 下面的表格中列举了包括在红帽企业 Linux 中的服务.守护进程.和程序所使用的最常见的通信端口.该列表还可以在 /etc/services 文件中找到.要查看由互联网号码分派局(IANA) ...

  8. Linux命令比较文件内容

    文件准备 创建两个文件,分别为a.txt和b.txt,它们所含内容分别为: a.txt b.txt 1-wfhune2-chdamnsbchj3-uyr92fiubkqw5-cgvdnsb 2-djy ...

  9. LeetCode刷题笔记(2)HashMap相关应用

    1.问题描述 Example 1: Input: A = "this apple is sweet", B = "this apple is sour" Out ...

  10. Java ArrayList底层实现原理源码详细分析Jdk8

    简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用 ...