Ardupilot之cpu外设基础抽象聚合类 HAL.h

2023-05-16

libraries/AP_HAL/HAL.h

定义了所有外设的基础抽象类集合

一个 HAL 抽象类世界,由 HAL 层的cpu外设的抽象类基础组件组聚而成;
也就是一个 HAL 派生类子对象 代表了一个 cpu 的所有外设的集合;这里
借鉴这种面向对象的设计思想。后面一一分析每一个子组件。

#pragma once

class AP_Param;

#include "AP_HAL_Namespace.h"                 ///< 名字空间

#include "AnalogIn.h"                         ///< 模拟输入,抽象基类
#include "GPIO.h"                             ///< gpio,抽象基类
#include "RCInput.h"                          ///< 无线电接收器输入抽象基类
#include "RCOutput.h"                         ///< 无线电接收器输入抽象基类
#include "SPIDevice.h"                        ///< spi 设备 抽象基类
#include "Storage.h"                          ///< 存储设备 抽象基类
#include "UARTDriver.h"                       ///< 串口设备 抽象基类
#include "system.h"                           ///< 系统方法
#include "OpticalFlow.h"                      ///< 光流 抽象基类
#if HAL_WITH_UAVCAN
#include "CAN.h"                              ///< can设备 抽象基类
#endif


#if defined(HAL_NEEDS_PARAM_HELPER)
#include <AP_Param/AP_Param.h>                ///< 参数 抽象基类 
class AP_Param_Helper;
#endif

class AP_HAL::HAL {
public:
    HAL(AP_HAL::UARTDriver* _uartA, // console
        AP_HAL::UARTDriver* _uartB, // 1st GPS
        AP_HAL::UARTDriver* _uartC, // telem1
        AP_HAL::UARTDriver* _uartD, // telem2
        AP_HAL::UARTDriver* _uartE, // 2nd GPS
        AP_HAL::UARTDriver* _uartF, // extra1
        AP_HAL::I2CDeviceManager* _i2c_mgr,            ///< i2c 设备管理器 抽象基类组件
        AP_HAL::SPIDeviceManager* _spi,                ///< spi 设备管理器 抽象基类组件
        AP_HAL::AnalogIn*   _analogin,                 ///< analogin  抽象基类组件
        AP_HAL::Storage*    _storage,                  ///< stroage   抽象基类组件
        AP_HAL::UARTDriver* _console,                  ///< 控制台     抽象基类组件
        AP_HAL::GPIO*       _gpio,                     ///< gpio  抽象基类组件
        AP_HAL::RCInput*    _rcin,                     ///< rcin  抽象基类组件
        AP_HAL::RCOutput*   _rcout,                    ///< rcout 抽象基类组件
        AP_HAL::Scheduler*  _scheduler,                ///< scheduler  抽象基类组件
        AP_HAL::Util*       _util,                     ///< utils 抽象基类组件
        AP_HAL::OpticalFlow *_opticalflow,             ///< opticalflow 抽象基类组件
#if HAL_WITH_UAVCAN
        AP_HAL::CANManager* _can_mgr[MAX_NUMBER_OF_CAN_DRIVERS]) ///< can 设备管理器 抽象基类组件
#else
        AP_HAL::CANManager** _can_mgr)                  
#endif
        :                                              ///< 实际中基类指针指向子类对象多态 初始化列表
        uartA(_uartA),
        uartB(_uartB),
        uartC(_uartC),
        uartD(_uartD),
        uartE(_uartE),
        uartF(_uartF),
        i2c_mgr(_i2c_mgr),
        spi(_spi),
        analogin(_analogin),
        storage(_storage),
        console(_console),
        gpio(_gpio),
        rcin(_rcin),
        rcout(_rcout),
        scheduler(_scheduler),
        util(_util),
        opticalflow(_opticalflow)
    {
#if HAL_WITH_UAVCAN
        if (_can_mgr == nullptr) {
            for (uint8_t i = 0; i < MAX_NUMBER_OF_CAN_DRIVERS; i++)
                can_mgr[i] = nullptr;
        } else {
            for (uint8_t i = 0; i < MAX_NUMBER_OF_CAN_DRIVERS; i++)
                can_mgr[i] = _can_mgr[i];
        }
#endif
        // 比如 libraries/AP_HAL_PX4/system.cpp 中的方法
        AP_HAL::init();
    }
    /**< Callbacks 基础抽象类组件 */
    struct Callbacks {
        virtual void setup() = 0; 
        virtual void loop() = 0;
    };
    /**< FunCallbacks 类,派生自 Callbacks 基础抽象类组件 */
    struct FunCallbacks : public Callbacks {
        FunCallbacks(void (*setup_fun)(void), void (*loop_fun)(void));

        void setup() override { _setup(); }
        void loop() override { _loop(); }

    private:
        void (*_setup)(void);
        void (*_loop)(void);
    };

    /**< 一个 HAL 抽象类的 run接口方法 */
    virtual void run(int argc, char * const argv[], Callbacks* callbacks) const = 0;
    /**< 组成一个 HAL 抽象类世界的 (数据)基础(抽象)成员组件(指针) */
    AP_HAL::UARTDriver* uartA;
    AP_HAL::UARTDriver* uartB;
    AP_HAL::UARTDriver* uartC;
    AP_HAL::UARTDriver* uartD;
    AP_HAL::UARTDriver* uartE;
    AP_HAL::UARTDriver* uartF;
    AP_HAL::I2CDeviceManager* i2c_mgr;
    AP_HAL::SPIDeviceManager* spi;
    AP_HAL::AnalogIn*   analogin;
    AP_HAL::Storage*    storage;
    AP_HAL::UARTDriver* console;
    AP_HAL::GPIO*       gpio;
    AP_HAL::RCInput*    rcin;
    AP_HAL::RCOutput*   rcout;
    AP_HAL::Scheduler*  scheduler;
    AP_HAL::Util        *util;
    AP_HAL::OpticalFlow *opticalflow;
#if HAL_WITH_UAVCAN
    AP_HAL::CANManager* can_mgr[MAX_NUMBER_OF_CAN_DRIVERS];
#else
    AP_HAL::CANManager** can_mgr;
#endif
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ardupilot之cpu外设基础抽象聚合类 HAL.h 的相关文章

  • Java多sheet模板导出表格

    前言 需求是这样的 xff0c 需要在页面导出列表表格时同时导出每项的详情数据 xff0c 而且详情表格并不是一个常规的二维表格 xff0c 就像图中这样的效果 xff0c 所以要解决的最主要两个问题就是 xff1a 多sheet实现 异形
  • docker容器时间不同步导致在java应用中获取的时间不正确问题

    一 前言 在把Java应用部署到docker容器时 xff0c 发现应用获取到的时间和现实时间相差了8个小时 xff0c 会导致一系列不必要的麻烦 二 解决方案 1 首选需要确保宿主机的时区和时间的准确 现在宿主机上用 date R 看一下
  • Caffeine一级缓存介绍和应用

    Caffeine介绍 redis和caffeine的区别 相同点就不用说 xff0c 广义上都是缓存的方式 咱们就说说不同 redis是将数据存储到内存里 xff1b caffeine是将数据存储在本地应用里caffeine和redis相比
  • Java中使用es条件构造器BoolQueryBuilder

    前言 由于es在java中查询没法像mybatis那样方便 xff0c 而且es的构造器使用也比较繁琐 xff0c 理解不是很方便 xff0c 所以写一篇文章来记录es构造器BoolQueryBuilder查询时各种条件的构造的正确姿势 教
  • 群晖docker容器内mysql部署和远程连接

    群晖docker容器内mysql部署和远程连接 1 docker内Mysql部署2 Mysql远程访问配置 1 docker内Mysql部署 首先在群晖docker内安装ubuntu镜像 xff0c 启用镜像时注意对容器和宿主机的端口映射进
  • eclipse的安装及配置PyDev插件(win10)

    原博文 xff1a Windows下安装Eclipse 43 python2 7 43 Pydev 一 安装eclipse 学习Java第一步就是装eclipse 我每学习一门语言都会先死在安装程序上 这个也一样 一 去eclipse官网下
  • 小微企业技术人员面试流程及常见问题整理分析

    技术人员面试流程 在同一个小的企业做久了 xff0c 当有人员离职后 xff0c 招聘中的面试的工作就落在了资历老一点的员工上 虽然不是专业的HR xff0c 但还是在此记录一下一些人员面试的基本流程步骤及主要内容 一 面试流程 1 接待应
  • Ubuntu 解决触摸板不识别问题

    Ubuntu 解决触摸板不识别问题 span class hljs built in sudo span vi etc default grub span class hljs comment 把GRUB CMDLINE LINUX 61
  • 图像的灰度化、二值化

    目录 1 图像像素点 2 灰度化 3 二值化 4 使用open cv库进行图片的灰度化 二值化 4 1 将图片转换为灰度图 4 2 将灰度图转换为二值化图图片 1 图像像素点 在图像处理中 xff0c 用RGB三个分量 xff08 R xf
  • 【嵌入式】stm32程序跳转实验

    嵌入式 stm32程序跳转实验 菜老越 于 2019 04 23 17 54 56 发布 2888 收藏 22 分类专栏 xff1a 嵌入式 文章标签 xff1a keil stm32 程序跳转 IAP BootLoader 版权 嵌入式
  • C++/C语言实现HTTP的GET和POST请求

    阅读目录 HTTP请求和IP TCP 实现GET请求 实现POST请求 xff1a 参考 xff1a 回到顶部 HTTP请求和IP TCP 所谓的HTTP协议是基于IP TCP协议的 xff0c 所以要获取远端的html数据只要创建sock
  • C++ 简单实现HTTP GET/POST 请求

    HTTP 超文本传输协议 是一种客户端与服务端的传输协议 xff0c 最早用于浏览器和服务器之间的通信 xff0c 后来因为其使用灵活 方便等特点 xff0c 广泛用于客户端与服务端的通信 文章将简单介绍HTTP协议 xff0c 同时以C
  • 分布式系统架构简单介绍

    目录 xff1a 一 什么是分布式系统 xff1f 二 为什么要走分布式系统架构 xff1f 三 系统如何进行拆分 xff1f 四 分布式之后带来的技术挑战 xff1f 一 什么是分布式系统 xff1f 在谈分布式系统架构前 xff0c 我
  • 使用javascript实现对于chineseocr的API调用

    ChineseOCR在线API 网页地址 界面 提供多种接口调用方式 xff0c 比如在线调用 Javascript api调用 curl api调用和python api调用四种方式 xff0c 本次使用javascript api调用的
  • Qt-QMessageBox用法详解

    QMessageBox 是 Qt 框架中常用的一个类 xff0c 可以生成各式各样 各种用途的消息对话框 xff0c 如图 1 所示 图 1 QMessageBox消息对话框 很多 GUI 程序都会用到消息对话框 xff0c 且很多场景中使
  • C++中UDP通讯详解

    C 43 43 Socket编程及TCP UDP通信代码实现 一 简介 Socket编程的目的是使网络的进程进行通信 xff0c 基于TCP IP协议簇 xff0c 通过三元组 xff08 ip地址 协议 端口 xff09 标志进程 xff
  • sphinx写文档的简单尝试--index.rst的内容分析

    先说简单的结论 xff0c rst上手难度远高于markdown 功能扩展完爆markdown 在安装sphinx后 xff0c 开始编写shpinx的第一步 xff0c 就是使用sphinx quickstart来生成配置文件 我的目录结
  • 读书笔记:嵌入式常用算法_note_1

    目录 折线插值 抛物线插值 折线插值 include lt stdio h gt define N 10 折线由10段线段组成 即有11个插值节点 float w 61 10 0 插值节点间隔为10 0 即 w 61 y1 y0 61 10
  • Linux下免费git工具集合

    该博文来自于ieayoio的博客 xff1a http www ieayoio com win和mac下的git图形工具都有挺多的 xff0c 然而对于因git而生的Linux xff0c git的图形工具普遍被认为相当落后 xff0c 然
  • [rospack] Error: package ‘.....‘ not found

    在ros编程中如果报出 rospack Error package 39 39 not found 某个包没有找到 xff0c 则有一下几方面的原因 1 包名写错了2 工作空间真的没有这个包存在3 包所在的ros工作空间没有在ros环境中

随机推荐