PX4模块设计之二十六:BatteryStatus模块
PX4模块设计之二十六:BatteryStatus模块
- 1. BatteryStatus模块简介
- 2. 模块入口函数
- 2.1 主入口battery_status_main
- 2.2 自定义子命令custom_command
- 3. BatteryStatus模块重要函数
- 3.1 task_spawn
- 3.2 instantiate
- 3.3 init
- 3.4 Run
- 4. 硬件配置
- 5. 总结
- 6. 参考资料
1. BatteryStatus模块简介
### DescriptionThe provided functionality includes:
- Read the output from the ADC driver (via ioctl interface) and publish `battery_status`.### Implementation
It runs in its own thread and polls on the currently selected gyro topic.battery_status <command> [arguments...]Commands:startstopstatus print status info
注:print_usage函数是具体对应实现。
class BatteryStatus : public ModuleBase<BatteryStatus>, public ModuleParams, public px4::ScheduledWorkItem
注:battery_status模块采用了ModuleBase和WorkQueue设计。
2. 模块入口函数
2.1 主入口battery_status_main
这里比较简单,继承了ModuleBase,由ModuleBase的main来完成模块入口。
battery_status_main└──> return BatteryStatus::main(argc, argv)
2.2 自定义子命令custom_command
模块仅支持start/stop/status命令,不支持其他自定义命令。
BatteryStatus::custom_command└──> return print_usage("unknown command")
3. BatteryStatus模块重要函数
3.1 task_spawn
这里主要初始化了BatteryStatus对象,后续通过WorkQueue来完成进行轮询。
BatteryStatus::task_spawn├──> BatteryStatus *instance = new BatteryStatus()├──> <instance>│ ├──> _object.store(instance)│ ├──> _task_id = task_id_is_work_queue│ └──> <instance->init()>│ └──> return PX4_OK├──> <else>│ └──> PX4_ERR("alloc failed")├──> delete instance├──> _object.store(nullptr)├──> _task_id = -1└──> return PX4_ERROR
3.2 instantiate
注:鉴于该模块不采用任务(线程),所以ModuleBase::run_trampoline无需执行,所以可以不实现。
3.3 init
在task_spawn中使用,对_adc_report_sub成员变量进行事件回调注册(当有adc_report消息时,会调用SubscriptionCallbackWorkItem::ScheduleNow,再触发BatteryStatus::Run过程)。
BatteryStatus::init└──> return _adc_report_sub.registerCallback()
注:这里真正调用ScheduleNow的不是BatteryStatus类,而是该类内部成员变量_adc_report_sub。
uORB::SubscriptionCallbackWorkItem _adc_report_sub{this, ORB_ID(adc_report)};
3.4 Run
每次WorkQueue执行,会自动调用Run函数,详见:PX4模块设计之十三:WorkQueue设计。
BatteryStatus::Run├──> <should_exit()>│ ├──> exit_and_cleanup()│ └──> return├──> perf_begin(_loop_perf)├──> parameter_update_poll() // check parameters for updates├──> adc_poll() // check battery voltage└──> perf_end(_loop_perf)
注:关于adc_report消息的来由,可参考:PX4模块设计之二十四:内部ADC模块。
4. 硬件配置
鉴于当前硬件板子使用的是Holybro Kakute AIO F7,其硬件配置如下:
- boards/holybro/kakutef7/src/board_config.h
86 #define ADC_RSSI_IN_CHANNEL /* PC5 */ ADC1_CH(15)
87 #define ADC_BATTERY_VOLTAGE_CHANNEL /* PC3 */ ADC1_CH(13)
88 #define ADC_BATTERY_CURRENT_CHANNEL /* PC2 */ ADC1_CH(12)
89
90 #define ADC_CHANNELS \
91 ((1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \
92 (1 << ADC_BATTERY_CURRENT_CHANNEL) | \
93 (1 << ADC_RSSI_IN_CHANNEL))
- platforms/common/include/px4_platform_common/board_common.h
138 #if !defined(BOARD_NUMBER_BRICKS)
139 # define BOARD_NUMBER_BRICKS 1
140 # if !defined(BOARD_ADC_BRICK_VALID)
141 # define BOARD_ADC_BRICK_VALID (1)
142 # endif
143 #endif
144
145 #if BOARD_NUMBER_BRICKS == 0
146 /* allow SITL to disable all bricks */
147 #elif BOARD_NUMBER_BRICKS == 1
148 # define BOARD_BATT_V_LIST {ADC_BATTERY_VOLTAGE_CHANNEL}
149 # define BOARD_BATT_I_LIST {ADC_BATTERY_CURRENT_CHANNEL}
150 # define BOARD_BRICK_VALID_LIST {BOARD_ADC_BRICK_VALID}
151 #elif BOARD_NUMBER_BRICKS == 2
152 # if defined(BOARD_NUMBER_DIGITAL_BRICKS)
153 # define BOARD_BATT_V_LIST {-1, -1}
154 # define BOARD_BATT_I_LIST {-1, -1}
155 # else
156 # define BOARD_BATT_V_LIST {ADC_BATTERY1_VOLTAGE_CHANNEL, ADC_BATTERY2_VOLTAGE_CHANNEL}
157 # define BOARD_BATT_I_LIST {ADC_BATTERY1_CURRENT_CHANNEL, ADC_BATTERY2_CURRENT_CHANNEL}
158 # endif
159 # define BOARD_BRICK_VALID_LIST {BOARD_ADC_BRICK1_VALID, BOARD_ADC_BRICK2_VALID}
160 #elif BOARD_NUMBER_BRICKS == 3
161 # define BOARD_BATT_V_LIST {ADC_BATTERY1_VOLTAGE_CHANNEL, ADC_BATTERY2_VOLTAGE_CHANNEL, ADC_BATTERY3_VOLTAGE_CHANNEL}
162 # define BOARD_BATT_I_LIST {ADC_BATTERY1_CURRENT_CHANNEL, ADC_BATTERY2_CURRENT_CHANNEL, ADC_BATTERY3_CURRENT_CHANNEL}
163 # define BOARD_BRICK_VALID_LIST {BOARD_ADC_BRICK1_VALID, BOARD_ADC_BRICK2_VALID, BOARD_ADC_BRICK3_VALID}
164 #elif BOARD_NUMBER_BRICKS == 4
165 # define BOARD_BATT_V_LIST {ADC_BATTERY1_VOLTAGE_CHANNEL, ADC_BATTERY2_VOLTAGE_CHANNEL, ADC_BATTERY3_VOLTAGE_CHANNEL, ADC_BATTERY4_VOLTAGE_CHANNEL}
166 # define BOARD_BATT_I_LIST {ADC_BATTERY1_CURRENT_CHANNEL, ADC_BATTERY2_CURRENT_CHANNEL, ADC_BATTERY3_CURRENT_CHANNEL, ADC_BATTERY4_CURRENT_CHANNEL}
167 # define BOARD_BRICK_VALID_LIST {BOARD_ADC_BRICK1_VALID, BOARD_ADC_BRICK2_VALID, BOARD_ADC_BRICK3_VALID, BOARD_ADC_BRICK4_VALID}
168 #else
169 # error Unsuported BOARD_NUMBER_BRICKS number.
170 #endif
171
172 /* Choose the source for ADC_SCALED_V5_SENSE */
173 #if defined(ADC_5V_RAIL_SENSE)
174 #define ADC_SCALED_V5_SENSE ADC_5V_RAIL_SENSE
175 #else
176 # if defined(ADC_SCALED_V5_CHANNEL)
177 # define ADC_SCALED_V5_SENSE ADC_SCALED_V5_CHANNEL
178 # endif
179 #endif
5. 总结
模块有对adc数据进行过滤但是命令行没有相应的输出显示,也没有将处理后的adc数据发送到系统中。可能这仅仅如代码中写的,是遗产吧。
platforms/common/include/px4_platform_common/board_common.h
136 /* Legacy default */
6. 参考资料
【1】PX4开源软件框架简明简介
【2】PX4模块设计之十一:Built-In框架
【3】PX4模块设计之十二:High Resolution Timer设计
【4】PX4模块设计之十三:WorkQueue设计
【5】PX4模块设计之十七:ModuleBase模块
【6】PX4 modules_main
【7】PX4模块设计之二十四:内部ADC模块
PX4模块设计之二十六:BatteryStatus模块相关推荐
- BetaFlight模块设计之二十六:接收机任务分析
BetaFlight模块设计之二十六:接收机任务分析 接收机任务 配置情况 硬件配置 软件配置 驱动配置 sbus驱动函数分析 sbusDataReceive函数 sbusFrameStatus函数 ...
- BetaFlight模块设计之二十:CMS菜单模块分析
BetaFlight模块设计之二十:CMS菜单模块分析 CMS菜单模块 CMS菜单按键控制 CMS菜单Elements CMS_Menu OSD_Etnry Element类型 可调Element类型 ...
- BetaFlight模块设计之二十九:滤波模块分析
BetaFlight模块设计之二十九:滤波模块分析 滤波模块 滤波类型 1. slewFilter 2. simpleLowpassFilter 3. laggedMovingAverage 4. p ...
- BetaFlight模块设计之二十四:transponder任务分析
BetaFlight模块设计之二十四:transponder任务分析 transponder任务 配置情况 硬件配置 驱动配置 业务配置 初始化 MSP协议 三种IR transponder type ...
- 第三百二十六节,web爬虫,scrapy模块,解决重复ur——自动递归url
第三百二十六节,web爬虫,scrapy模块,解决重复url--自动递归url 一般抓取过的url不重复抓取,那么就需要记录url,判断当前URL如果在记录里说明已经抓取过了,如果不存在说明没抓取过 ...
- PX4模块设计之二:uORB消息代理
PX4模块设计之二:uORB消息代理 1. uORB模块接口 1.1. uORB服务接口 1.2. uORB消息注册/去注册接口 1.3. uORB消息发布接口 1.4. uORB消息订阅/去订阅接口 ...
- Stduino学习(二十六)水位传感器模块
37种传感器(二十六)水位传感器模块+Stduino Nano&UNO 本文转载自:http://www.stduino.com/forum.php?mod=viewthread&ti ...
- SAP UI5 初学者教程之二十六 - OData 服务配合 Mock 服务器的使用步骤详解试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...
- 模板方法模式 Template method 行为型 设计模式(二十六)
模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...
最新文章
- 为什么要学习源码?学习源码对我们有用吗?
- python如何调用图片-用python简单处理图片(4):图像中的像素访问
- SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可灰度)
- 函数集成redis与Spring集成
- hdfs user 连接_通过API访问HDFS
- SpringBoot 配置 跨域支持
- MySQL 输入任何语句都提示You must reset your password using ALTER USER 解决方法
- Multisim、protel和proteus的区别
- 2018 终了,是时候秀出我的 Git 进化日志了!
- 【OCR三】大批量生成文字训练集(转)
- 《Splunk智能运维实战》——2.8 列出浏览次数最多的产品
- Linux Semaphore
- java俄罗斯方块说明书_俄罗斯方块java代码(java编写俄罗斯方块代码详解)
- JAVA——根据QQ群号得到idkey以及QQ群加群链接[网页版本]解决方案
- ispostback之坑
- Java Http请求工具类
- 文件读取漏洞路径收集
- 记录开发内容demo-java支付宝提现
- 前端实现录音功能插件recorder.js
- pycharm 用鼠标滑轮控制代码放大缩小的设置