APM-3.5.2 UAVCAN笔记

20180402:
    UAVCAN使用的主要逻辑代码,在AP_UAVCAN.cpp文件中,AP_UAVCAN类的任务是在硬件配置支持的情况下使用UAVCAN协议,进行数据的收发。UAVCAN协议的收发逻辑代码太过于复杂,看了几天仍然云里雾里,所以我决定转换思路,不再过深的去了解协议的收发逻辑代码,转而去了解需要经过哪些步骤,使用哪些UAVCAN协议提供的API,可以完成收发任务。
    接下来以GPS数据为例,来梳理使用UAVCAN协议完成数据收发的过程:
    飞控要通过UAVCAN使用GPS信息,需要添加使用UAVCAN协议中GPS数据的类,APM中此类在AP_GPS_UAVCAN.cpp和AP_GPS_UAVCAN.h中。AP_UAVCAN类读到UAVCAN协议的GPS信息后,存储在_gps_node_state[AP_UAVCAN_MAX_GPS_NODES]结构体数组中,通过update_gps_state函数,将GPS信息传递给AP_GPS_UAVCAN类。
    AP_UAVCAN构造函数:
    _gps_nodes[AP_UAVCAN_MAX_GPS_NODES]:存放着发送GPS信息的节点(下文简称为GPS信息源)ID
    _gps_node_taken[AP_UAVCAN_MAX_GPS_NODES]
    _gps_listener_to_node[AP_UAVCAN_MAX_LISTENERS]
    _gps_listeners[AP_UAVCAN_MAX_LISTENERS]
    注:宏定义见附录。

AP_UAVCAN::AP_UAVCAN() :
    _node_allocator(
        UAVCAN_NODE_POOL_SIZE, UAVCAN_NODE_POOL_SIZE)
{
    AP_Param::setup_object_defaults(this, var_info);


    for (uint8_t i = 0; i < UAVCAN_RCO_NUMBER; i++) {
        _rco_conf[i].active = false;
    }


    for (uint8_t i = 0; i < AP_UAVCAN_MAX_GPS_NODES; i++) {
        _gps_nodes[i] = UINT8_MAX;
        _gps_node_taken[i] = 0;
    }


    for (uint8_t i = 0; i < AP_UAVCAN_MAX_BARO_NODES; i++) {
        _baro_nodes[i] = UINT8_MAX;
        _baro_node_taken[i] = 0;
    }


    for (uint8_t i = 0; i < AP_UAVCAN_MAX_MAG_NODES; i++) {
        _mag_nodes[i] = UINT8_MAX;
        _mag_node_taken[i] = 0;
    }


    for (uint8_t i = 0; i < AP_UAVCAN_MAX_LISTENERS; i++) {
        _gps_listener_to_node[i] = UINT8_MAX;
        _gps_listeners[i] = nullptr;


        _baro_listener_to_node[i] = UINT8_MAX;
        _baro_listeners[i] = nullptr;


        _mag_listener_to_node[i] = UINT8_MAX;
        _mag_listeners[i] = nullptr;
    }


    _rc_out_sem = hal.util->new_semaphore();


    debug_uavcan(2, "AP_UAVCAN constructed\n\r");
}

    这些变量在构造函数中赋值为空或空闲,_gps_nodes[]在AP_UAVCAN.cpp的gnss_fix_cb函数中被调用的find_gps_node函数赋值。

AP_GPS::GPS_State *AP_UAVCAN::find_gps_node(uint8_t node)
{
    // Check if such node is already defined
    for (uint8_t i = 0; i < AP_UAVCAN_MAX_GPS_NODES; i++) {
        if (_gps_nodes[i] == node) {
            return &_gps_node_state[i];
        }
    }


    // If not - try to find free space for it
    for (uint8_t i = 0; i < AP_UAVCAN_MAX_GPS_NODES; i++) {
        if (_gps_nodes[i] == UINT8_MAX) {
            _gps_nodes[i] = node;
            return &_gps_node_state[i];
        }
    }


    // If no space is left - return nullptr
    return nullptr;
}

    find_gps_node函数完成两个功能,一、如果_gps_node[]中有存放GPS信息源的节点ID,则返回,与节点ID对应的_gps_node_state[]的指针。二、如果_gps_node中并没有存放GPS信息源的节点ID,则遍历_gps_node[]中处于空闲的成员,将GPS信息源的节点ID赋值给找到的第一个空闲的_gps_node[]。并返回与之对应的_gps_node_state[]指针。_gps_node[]与_gps_node_state[]是一一对应的。但_gps_node[]存放着哪个GPS信息源是不固定的,是程序运行时确定的,相应的_gps_node_state[]存放这那个GPS信息源的GPS数据也是不固定的,是程序运行时确定的。


    _gps_node_taken[]、_gps_listener_to_node[]、_gps_listeners[]这些变量在AP_GPS.cpp的detect_instance函数中被调用的AP_UAVCAN中的函数赋有含义的值。

#if HAL_WITH_UAVCAN
    // user has to explicitly set the UAVCAN type, do not use AUTO
    case GPS_TYPE_UAVCAN:
        dstate->auto_detected_baud = false; // specified, not detected
        if (AP_BoardConfig_CAN::get_can_num_ifaces() >= 1) {
            for (uint8_t i = 0; i < MAX_NUMBER_OF_CAN_DRIVERS; i++) {
                if (hal.can_mgr[i] != nullptr) {
                    AP_UAVCAN *uavcan = hal.can_mgr[i]->get_UAVCAN();


                    if (uavcan != nullptr) {
                        uint8_t gps_node = uavcan->find_gps_without_listener();


                        if (gps_node != UINT8_MAX) {
                            new_gps = new AP_GPS_UAVCAN(*this, state[instance], nullptr);
                            ((AP_GPS_UAVCAN*) new_gps)->set_uavcan_manager(i);
                            if (uavcan->register_gps_listener_to_node(new_gps, gps_node)) {
                                if (AP_BoardConfig_CAN::get_can_debug() >= 2) {
                                    printf("AP_GPS_UAVCAN registered\n\r");
                                }
                                goto found_gps;
                            } else {
                                delete new_gps;
                            }
                        }
                    }
                }
            }
        }
        return;
#endif

 


    




附录


#define AP_UAVCAN_MAX_GPS_NODES 4
#define AP_UAVCAN_MAX_LISTENERS 4
AP_BoardConfig_CAN::get_can_num_ifaces(),返回启用的CAN接口总数。

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: mybatis-plus-code-generator-3.5.2.x.jar是一个用于MyBatis Plus框架的代码生成器工具。MyBatis Plus是一个开源的持久层框架,它是在传统的MyBatis框架的基础上进行了扩展和增强。它提供了许多便捷的功能,使得开发者可以更快速、更高效地进行数据库操作。 通过使用mybatis-plus-code-generator-3.5.2.x.jar工具,开发者可以根据数据库中的表结构自动生成对应的实体类、Mapper接口以及SQL映射文件,并且可以自定义生成规则,灵活地生成满足自己需求的代码。这样,开发者就无需手动编写大量的重复性代码,提高了开发效率。 mybatis-plus-code-generator-3.5.2.x.jar提供了丰富的配置选项,包括数据源配置、代码生成路径配置、包名配置、生成策略配置等等,开发者可以根据自己的项目需求进行相应的配置。同时,该工具还支持生成基于注解的代码,以及支持生成Controller、Service和ServiceImpl等常见的层级代码。 总之,mybatis-plus-code-generator-3.5.2.x.jar是一个功能强大、使用便捷的代码生成器工具,可以大大提升开发效率,减少重复工作,使得开发者能够更专注于业务逻辑的实现。无论是对于初学者还是有经验的开发者来说,该工具都是一个十分实用的助手。 ### 回答2: MyBatis-Plus-Code-Generator是一个用于生成MyBatis-Plus代码的工具,版本号为3.5.2.x。 MyBatis-Plus是一个优秀的持久层框架,它在MyBatis框架的基础上进行了扩展和增强,提供了更多的功能和便利性。这个代码生成器是MyBatis-Plus的一个子项目,用于自动化生成DAO(数据访问对象)代码。 使用MyBatis-Plus-Code-Generator可以极大地提高开发效率。开发者只需要配置好数据库连接信息和相关选项,然后运行生成器,就能自动生成实体类、Mapper接口、XML映射文件等各种代码文件。这样的话,开发者就不需要手动编写繁琐的重复代码,大大减轻了开发负担。 除了基本的代码生成功能,MyBatis-Plus-Code-Generator还提供了很多有用的选项和扩展功能。例如,可以根据数据库表的命名规则自动转换成Java类的命名规则,还可以自定义生成代码的包结构、注释等。此外,它还支持生成分页查询代码、根据外键生成关联查询代码等高级功能,进一步简化了开发过程。 总而言之,MyBatis-Plus-Code-Generator是一个非常实用的代码生成工具,能够极大地提高开发效率,减少重复劳动,可以快速生成符合MyBatis-Plus规范的代码文件,是MyBatis-Plus框架的重要辅助工具。 ### 回答3: Mybatis-Plus是一个基于Mybatis的增强工具库,主要用于简化Mybatis的开发流程。而Mybatis-Plus Code Generator是其中的一个模块,它提供了一个可视化的代码生成工具,方便开发者根据数据表自动生成相应的实体类、Mapper接口、Service接口及其实现类等代码。 相对于手动编写这些代码,使用Mybatis-Plus Code Generator能够减少重复劳动和出错的几率,提高开发效率。它的使用非常简单,只需配置好数据库连接信息和代码生成的路径,选择要生成的表,点击生成按钮即可。 Mybatis-Plus Code Generator支持多种代码风格的生成,可以根据自己的项目需求进行配置,例如实体类是否生成字段注解、是否生成 Swagger 注解等。此外,它还支持自定义代码模板,开发者可以根据自己的规范定制代码生成的模板,从而满足项目的特殊需求。 除了简化开发流程,Mybatis-Plus Code Generator还提供了一些常用的增删改查方法的默认实现,使得开发者在编写Service接口和实现类时可以更加便捷。同时,它还支持生成的代码的增量更新,当数据表结构有变化时,只需重新生成代码即可,无需手动修改已有的代码。 总之,Mybatis-Plus Code Generator是一个非常实用的代码生成工具,可以大大提高开发效率,并且提供了丰富的配置选项和自定义功能,可以满足不同项目的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值