ArduPilot开源代码之AP_DAL_Airspeed

1. 源由

AP_DAL_Airspeed是用于管理和监控多个空速传感器的状态和数据,提供了一系列方法来获取和操作传感器的健康状态、使用状态、空速数据和更新时间。

2. 框架设计

2.1 构造函数和成员变量

  • 类中定义了 _RASH_RASI 成员变量,分别是 log_RASHlog_RASI 结构体的实例。 //Replay Air Speed Head
  • _RASI 是一个数组,其大小为 AIRSPEED_MAX_SENSORS,用于存储多个传感器的空速数据。//Replay Air Speed Instance

2.2 成员函数

  • healthy(uint8_t i)healthy():用于检查指定或主要传感器的健康状态。
  • use(uint8_t i)use():用于检查指定或主要传感器是否启用。
  • get_airspeed(uint8_t i)get_airspeed():返回指定或主要传感器的当前空速(单位是米每秒)。
  • last_update_ms(uint8_t i)last_update_ms():返回指定或主要传感器的最后更新时间(毫秒)。
  • get_num_sensors():返回传感器的数量。
  • get_primary():返回当前主要传感器的索引。

2.3 其他方法

  • start_frame():可能是一个未提供实现的方法,用于开始一个帧或处理数据的初始操作。
  • handle_message(const log_RASH &msg)handle_message(const log_RASI &msg):用于处理传感器状态和数据更新的消息。

2.4 结构体 log_RASHlog_RASI

  • 这些结构体可能定义了传感器状态和数据的存储格式,但在提供的代码中没有具体展示其定义。

3. 重要例程

3.1 应用函数

3.1.1 healthy

获取指定 或 主 空速传感器实例健康状态

    bool healthy(uint8_t i) const {
        return _RASI[i].healthy;
    }

    bool healthy() const {
        return healthy(get_primary());
    }

3.1.2 use

获取指定 或 主 空速传感器实例使能状态

    bool use(uint8_t i) const {
        return _RASI[i].use;
    }
    bool use() const {
        return use(get_primary());
    }

3.1.3 get_airspeed

获取指定 或 主 空速传感器实例空速

    float get_airspeed(uint8_t i) const {
        return _RASI[i].airspeed;
    }
    float get_airspeed() const {
        return get_airspeed(get_primary());
    }

3.1.4 last_update_ms

获取指定 或 主 空速传感器实例最近一次更新时间

    uint32_t last_update_ms(uint8_t i) const { return _RASI[i].last_update_ms; }
    uint32_t last_update_ms() const { return last_update_ms(get_primary()); }

3.1.5 get_num_sensors

获取空速传感器数量

    uint8_t get_num_sensors(void) const { return _RASH.num_sensors; }

3.1.6 get_primary

获取当前主空速传感器序号(实例)

    uint8_t get_primary(void) const { return _RASH.primary; }

3.2 其他函数

3.2.1 AP_DAL_Airspeed

构造函数,初始化实例序号

AP_DAL_Airspeed::AP_DAL_Airspeed()
{
#if AP_AIRSPEED_ENABLED
    for (uint8_t i=0; i<ARRAY_SIZE(_RASI); i++) {
        _RASI[i].instance = i;
    }
#endif
}

3.2.2 start_frame

AP_DAL::start_frame
 └──> AP_DAL_Airspeed::start_frame
void AP_DAL_Airspeed::start_frame()
{
#if AP_AIRSPEED_ENABLED
    const auto *airspeed = AP::airspeed();
    if (airspeed == nullptr) {
        return;
    }

    const log_RASH old = _RASH;
    _RASH.num_sensors = airspeed->get_num_sensors();
    _RASH.primary = airspeed->get_primary();
    WRITE_REPLAY_BLOCK_IFCHANGED(RASH, _RASH, old);

    for (uint8_t i=0; i<ARRAY_SIZE(_RASI); i++) {
        log_RASI &RASI = _RASI[i];
        log_RASI old_RASI = RASI;
        RASI.last_update_ms = airspeed->last_update_ms(i);
        RASI.healthy = airspeed->healthy(i);
        RASI.use = airspeed->use(i);
        RASI.airspeed = airspeed->get_airspeed(i);
        WRITE_REPLAY_BLOCK_IFCHANGED(RASI, RASI, old_RASI);
    }
#endif
}

3.2.3 handle_message

AP_DAL::handle_message
 └──> AP_DAL_Airspeed::handle_message
    void handle_message(const log_RASH &msg) {
        _RASH = msg;
    }
    void handle_message(const log_RASI &msg) {
        _RASI[msg.instance] = msg;
    }

4. 总结

AP_DAL_Airspeed 的类,用于处理空速传感器数据,管理和访问多个空速传感器实例的状态和数据。

5. 参考资料

【1】ArduPilot开源飞控系统之简单介绍
【2】ArduPilot之开源代码Task介绍
【3】ArduPilot飞控启动&运行过程简介
【4】ArduPilot之开源代码Library&Sketches设计
【5】ArduPilot之开源代码Sensor Drivers设计
【6】ArduPilot开源代码之EKF系列研读

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的三层架构DAL代码示例: 1. 数据访问层接口 ```csharp public interface IProductRepository { IEnumerable<Product> GetAllProducts(); Product GetProductById(int id); void AddProduct(Product product); void UpdateProduct(Product product); void DeleteProduct(int id); } ``` 2. 数据访问层实现 ```csharp public class ProductRepository : IProductRepository { private readonly IDbConnection _connection; public ProductRepository(IDbConnection connection) { _connection = connection; } public IEnumerable<Product> GetAllProducts() { return _connection.Query<Product>(&quot;SELECT * FROM Products&quot;); } public Product GetProductById(int id) { return _connection.QuerySingle<Product>(&quot;SELECT * FROM Products WHERE Id = @Id&quot;, new { Id = id }); } public void AddProduct(Product product) { _connection.Execute(&quot;INSERT INTO Products (Name, Price) VALUES (@Name, @Price)&quot;, product); } public void UpdateProduct(Product product) { _connection.Execute(&quot;UPDATE Products SET Name = @Name, Price = @Price WHERE Id = @Id&quot;, product); } public void DeleteProduct(int id) { _connection.Execute(&quot;DELETE FROM Products WHERE Id = @Id&quot;, new { Id = id }); } } ``` 3. 依赖注入配置 ```csharp services.AddTransient<IDbConnection>(sp => new SqlConnection(Configuration.GetConnectionString(&quot;Default&quot;))); services.AddTransient<IProductRepository, ProductRepository>(); ``` 上述代码中,数据访问层接口定义了对产品实体进行增删改查的方法;数据访问层实现通过连接到数据库并执行SQL语句来实现接口的方法;依赖注入配置将数据访问层接口与具体实现关联起来,使其可以在应用程序中被使用。注意,这里使用了Dapper库来简化数据访问层的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值