diff --git a/libraries/AP_BoardConfig/AP_BoardConfig_CAN.cpp b/libraries/AP_BoardConfig/AP_BoardConfig_CAN.cpp index b68d147e25..c2700dccef 100644 --- a/libraries/AP_BoardConfig/AP_BoardConfig_CAN.cpp +++ b/libraries/AP_BoardConfig/AP_BoardConfig_CAN.cpp @@ -34,10 +34,11 @@ #include #elif CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS #include +#include #endif #include - +#include #include #include #include @@ -83,6 +84,13 @@ const AP_Param::GroupInfo AP_BoardConfig_CAN::var_info[] = { AP_SUBGROUPINFO(_drivers[2], "D3_", 6, AP_BoardConfig_CAN, AP_BoardConfig_CAN::Driver), #endif + // @Param: SLCAN_RT + // @DisplayName: SLCAN Route + // @Description: CAN Driver ID to be routed to SLCAN, 0 means no routing + // @Range: 0 3 + // @User: Advanced + AP_GROUPINFO("SLCAN_RT", 7, AP_BoardConfig_CAN, _slcan_rt, 0), + AP_GROUPEND }; @@ -106,7 +114,6 @@ void AP_BoardConfig_CAN::init() for (uint8_t i = 0; i < MAX_NUMBER_OF_CAN_INTERFACES; i++) { // Check the driver number assigned to this physical interface uint8_t drv_num = _interfaces[i]._driver_number_cache = _interfaces[i]._driver_number; - if (drv_num != 0 && drv_num <= MAX_NUMBER_OF_CAN_DRIVERS) { if (hal.can_mgr[drv_num - 1] == nullptr) { // CAN Manager is the driver @@ -123,6 +130,12 @@ void AP_BoardConfig_CAN::init() // For this now existing driver (manager), start the physical interface if (hal.can_mgr[drv_num - 1] != nullptr) { initret = initret && hal.can_mgr[drv_num - 1]->begin(_interfaces[i]._bitrate, i); + #if CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS + if (_slcan_rt == (i+1) && hal.can_mgr[drv_num - 1] != nullptr ) { + ChibiOS_CAN::CanDriver* drv = (ChibiOS_CAN::CanDriver*)hal.can_mgr[drv_num - 1]->get_driver(); + slcan_router().init(drv->getIface(i), drv->getUpdateEvent()); + } + #endif } else { printf("Failed to initialize can interface %d\n\r", i + 1); } @@ -172,8 +185,11 @@ void AP_BoardConfig_CAN::init() } else { continue; } - - _drivers[i]._driver->init(i); + if (_slcan_rt == 0) { + _drivers[i]._driver->init(i, true); + } else { + _drivers[i]._driver->init(i, false); + } } } } diff --git a/libraries/AP_BoardConfig/AP_BoardConfig_CAN.h b/libraries/AP_BoardConfig/AP_BoardConfig_CAN.h index 0ebda82eaa..15b0427502 100644 --- a/libraries/AP_BoardConfig/AP_BoardConfig_CAN.h +++ b/libraries/AP_BoardConfig/AP_BoardConfig_CAN.h @@ -130,7 +130,7 @@ private: Interface _interfaces[MAX_NUMBER_OF_CAN_INTERFACES]; Driver _drivers[MAX_NUMBER_OF_CAN_DRIVERS]; uint8_t _num_drivers; - + AP_Int8 _slcan_rt; static AP_BoardConfig_CAN *_singleton; }; diff --git a/libraries/AP_UAVCAN/AP_UAVCAN_SLCAN.cpp b/libraries/AP_UAVCAN/AP_UAVCAN_SLCAN.cpp index 41e8968cb5..48df87900b 100644 --- a/libraries/AP_UAVCAN/AP_UAVCAN_SLCAN.cpp +++ b/libraries/AP_UAVCAN/AP_UAVCAN_SLCAN.cpp @@ -37,6 +37,7 @@ static uint8_t nibble2hex(uint8_t x) } static bool hex2nibble_error; +SLCAN::SLCANRouter* SLCAN::SLCANRouter::_singleton = nullptr; static uint8_t hex2nibble(char ch) {