首页 技术 正文
技术 2022年11月14日
0 收藏 359 点赞 3,526 浏览 3298 个字

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 );

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,083
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,558
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,407
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,180
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,816
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,899