#include "zcan.hpp" extern "C" { #ifdef HAL_CAN_MODULE_ENABLED void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_TxMailbox0Complete(hcan); } } void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_TxMailbox1Complete(hcan); } } void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_TxMailbox2Complete(hcan); } } void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_TxMailbox0Abort(hcan); } } void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_TxMailbox1Abort(hcan); } } void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_TxMailbox2Abort(hcan); } } void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_RxFifo0MsgPending(hcan); } } void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_RxFifo0Full(hcan); } } void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_RxFifo1MsgPending(hcan); } } void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_RxFifo1Full(hcan); } } void HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_Sleep(hcan); } } void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_WakeUpFromRxMsg(hcan); } } void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan) { for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) { iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_Error(hcan); } } } using namespace iflytop; void ZCanIRQDispatcher::regListener(ZCanIRQListener *listener) { if (listener == NULL) return; for (int i = 0; i < STM32_HAL_LISTENER_NUM; i++) { if (m_listener[i] == NULL) { m_listener[i] = listener; m_listenerNum++; return; } } ZASSERT(0); } ZCanIRQDispatcher &ZCanIRQDispatcher::instance() { static ZCanIRQDispatcher instance; return instance; } #endif