mirror of
https://git.intern.spaceteamaachen.de/ALPAKA/rtos2-utils.git
synced 2025-06-10 18:15:59 +00:00
170 lines
3.1 KiB
C++
170 lines
3.1 KiB
C++
/**
|
|
* @file
|
|
* @brief Public interface for CAN driver thread.
|
|
*/
|
|
#ifndef STA_RTOS_SYSTEM_CAN_BUS_HPP
|
|
#define STA_RTOS_SYSTEM_CAN_BUS_HPP
|
|
|
|
/**
|
|
* @defgroup STA_RTOS_CanBus CAN driver
|
|
* @ingroup STA_RTOS_API
|
|
* @brief CAN bus system task.
|
|
*
|
|
* Check @ref STA_RTOS_BuildConfig for configuration options.
|
|
*/
|
|
|
|
#ifdef DOXYGEN
|
|
/**
|
|
* @brief Enable module.
|
|
*
|
|
* @ingroup STA_RTOS_BuildConfig
|
|
*/
|
|
# define STA_CAN_BUS_ENABLE
|
|
#endif // DOXYGEN
|
|
|
|
|
|
#include <sta/config.hpp>
|
|
#ifdef STA_CAN_BUS_ENABLE
|
|
|
|
#include <sta/bus/can/controller.hpp>
|
|
#include <sta/devices/stm32/can.hpp>
|
|
#include <sta/rtos/c_api/can_msg.h>
|
|
#include <sta/time.hpp>
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
/**
|
|
* @def STA_RTOS_CAN_BUS_MAX_FILTER
|
|
* @brief Set maximum number of usable filters.
|
|
*
|
|
* @ingroup STA_RTOS_BuildConfig
|
|
*/
|
|
#ifndef STA_RTOS_CAN_BUS_MAX_FILTER
|
|
# error "Must set STA_RTOS_CAN_BUS_MAX_FILTER in <sta/config.hpp>"
|
|
#endif // STA_RTOS_CAN_BUS_MAX_FILTER
|
|
|
|
/**
|
|
* @def STA_RTOS_CAN_BUS_MAX_PAYLOAD_SIZE
|
|
* @brief Set maximum payload size.
|
|
*
|
|
* @ingroup STA_RTOS_BuildConfig
|
|
*/
|
|
#ifndef STA_RTOS_CAN_BUS_MAX_PAYLOAD_SIZE
|
|
# error "Must set STA_RTOS_CAN_BUS_MAX_PAYLOAD_SIZE in <sta/config.hpp>"
|
|
#endif // STA_RTOS_CAN_BUS_MAX_PAYLOAD_SIZE
|
|
|
|
|
|
/**
|
|
* @ingroup STA_RTOS_CanBus
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief CAN frame available.
|
|
*/
|
|
#define STA_RTOS_CAN_FLAG_MSG_AVAIL 0x1U
|
|
/**
|
|
* @brief Send CAN message.
|
|
*/
|
|
#define STA_RTOS_CAN_FLAG_MSG_SEND 0x1U << 1
|
|
/**
|
|
* @brief CAN data message in queue.
|
|
*/
|
|
#define STA_RTOS_CAN_FLAG_DATA_QUEUED 0x1U << 2
|
|
/**
|
|
* @brief CAN system message in queue.
|
|
*/
|
|
#define STA_RTOS_CAN_FLAG_SYS_QUEUED 0x1U << 3
|
|
|
|
/**
|
|
* @brief CAN SID bits used for system messages.
|
|
*/
|
|
#define STA_CAN_SID_SYS_BITS UINT32_C(0x3)
|
|
|
|
#define STA_RTOS_CAN_ANY STA_RTOS_CAN_FLAG_MSG_AVAIL | STA_RTOS_CAN_FLAG_MSG_AVAIL | STA_RTOS_CAN_FLAG_DATA_QUEUED | STA_RTOS_CAN_FLAG_SYS_QUEUED
|
|
|
|
|
|
/** @} */
|
|
|
|
|
|
namespace sta
|
|
{
|
|
namespace rtos
|
|
{
|
|
/**
|
|
* @ingroup STA_RTOS_CanBus
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Initialize CAN bus.
|
|
*/
|
|
void initCanBus();
|
|
|
|
|
|
/**
|
|
* @brief Return CAN_HandleTypeDef for use in CAN system task.
|
|
*
|
|
* Implementation must be provided by application.
|
|
*/
|
|
extern CAN_HandleTypeDef * getCanController();
|
|
|
|
/** @} */
|
|
} // namespace rtos
|
|
} // namespace sta
|
|
|
|
namespace sta
|
|
{
|
|
|
|
class AlpakaCanBus
|
|
{
|
|
public:
|
|
static const uint8_t FIFO_SYS = 0;
|
|
static const uint8_t FIFO_DATA = 1;
|
|
|
|
public:
|
|
AlpakaCanBus(CanController * controller, TimeMsFn timeMs);
|
|
|
|
|
|
/**
|
|
* @brief Send system message.
|
|
*
|
|
* @param msg Message
|
|
*/
|
|
void send(const CanSysMsg & msg);
|
|
|
|
private:
|
|
/**
|
|
* @brief Configure CAN filters.
|
|
*/
|
|
void setupSubscriptions();
|
|
|
|
private:
|
|
CanController * controller_;
|
|
};
|
|
|
|
} // namespace sta
|
|
|
|
namespace debug
|
|
{
|
|
/**
|
|
* @brief Output CAN frame ID to UART.
|
|
*
|
|
* @param id Frame ID
|
|
*/
|
|
void printFrameID(const sta::CanFrameId & id);
|
|
|
|
/**
|
|
* @brief Output CAN frame payload to UART.
|
|
*
|
|
* @param payload Payload buffer
|
|
* @param size Payload size
|
|
*/
|
|
void printPayloadHex(const uint8_t * payload, uint8_t size);
|
|
} // namespace debug
|
|
|
|
#endif // STA_CAN_BUS_ENABLE
|
|
|
|
#endif // STA_RTOS_SYSTEM_CAN_BUS_HPP
|