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模块相关推荐

  1. BetaFlight模块设计之二十六:接收机任务分析

    BetaFlight模块设计之二十六:接收机任务分析 接收机任务 配置情况 硬件配置 软件配置 驱动配置 sbus驱动函数分析 sbusDataReceive函数 sbusFrameStatus函数 ...

  2. BetaFlight模块设计之二十:CMS菜单模块分析

    BetaFlight模块设计之二十:CMS菜单模块分析 CMS菜单模块 CMS菜单按键控制 CMS菜单Elements CMS_Menu OSD_Etnry Element类型 可调Element类型 ...

  3. BetaFlight模块设计之二十九:滤波模块分析

    BetaFlight模块设计之二十九:滤波模块分析 滤波模块 滤波类型 1. slewFilter 2. simpleLowpassFilter 3. laggedMovingAverage 4. p ...

  4. BetaFlight模块设计之二十四:transponder任务分析

    BetaFlight模块设计之二十四:transponder任务分析 transponder任务 配置情况 硬件配置 驱动配置 业务配置 初始化 MSP协议 三种IR transponder type ...

  5. 第三百二十六节,web爬虫,scrapy模块,解决重复ur——自动递归url

    第三百二十六节,web爬虫,scrapy模块,解决重复url--自动递归url 一般抓取过的url不重复抓取,那么就需要记录url,判断当前URL如果在记录里说明已经抓取过了,如果不存在说明没抓取过 ...

  6. PX4模块设计之二:uORB消息代理

    PX4模块设计之二:uORB消息代理 1. uORB模块接口 1.1. uORB服务接口 1.2. uORB消息注册/去注册接口 1.3. uORB消息发布接口 1.4. uORB消息订阅/去订阅接口 ...

  7. Stduino学习(二十六)水位传感器模块

    37种传感器(二十六)水位传感器模块+Stduino Nano&UNO 本文转载自:http://www.stduino.com/forum.php?mod=viewthread&ti ...

  8. SAP UI5 初学者教程之二十六 - OData 服务配合 Mock 服务器的使用步骤详解试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  9. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...

最新文章

  1. 为什么要学习源码?学习源码对我们有用吗?
  2. python如何调用图片-用python简单处理图片(4):图像中的像素访问
  3. SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可灰度)
  4. 函数集成redis与Spring集成
  5. hdfs user 连接_通过API访问HDFS
  6. SpringBoot 配置 跨域支持
  7. MySQL 输入任何语句都提示You must reset your password using ALTER USER 解决方法
  8. Multisim、protel和proteus的区别
  9. 2018 终了,是时候秀出我的 Git 进化日志了!
  10. 【OCR三】大批量生成文字训练集(转)
  11. 《Splunk智能运维实战》——2.8 列出浏览次数最多的产品
  12. Linux Semaphore
  13. java俄罗斯方块说明书_俄罗斯方块java代码(java编写俄罗斯方块代码详解)
  14. JAVA——根据QQ群号得到idkey以及QQ群加群链接[网页版本]解决方案
  15. ispostback之坑
  16. Java Http请求工具类
  17. 文件读取漏洞路径收集
  18. 记录开发内容demo-java支付宝提现
  19. 前端实现录音功能插件recorder.js
  20. pycharm 用鼠标滑轮控制代码放大缩小的设置

热门文章

  1. 利用集群技术实现Web服务器负载均衡
  2. 击碎瓶颈《华为项目管理体系最佳实践 》青岛站
  3. 日程规划软件哪个好 2022日程规划便签APP下载
  4. 想要专升本你不得不看的全干货_吐血整理_专升本_计算机文化基础(一)
  5. 【离散】如何利用顶点数求树叶或知树叶求顶点
  6. 轴承故障诊断分类中常用的一些数据集介绍和获取方法
  7. NeuralCD--智能教育系统中的神经认知诊断
  8. 无基础怎么学习java虚拟机,0基础学习Java ——Java 虚拟机结构(上)
  9. 15款值得推荐的思维导图(心智图 )工具
  10. Go语言占位符的使用