You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
3.6 KiB

  1. #include "zcan.hpp"
  2. extern "C" {
  3. #ifdef HAL_CAN_MODULE_ENABLED
  4. void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) {
  5. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  6. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_TxMailbox0Complete(hcan);
  7. }
  8. }
  9. void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) {
  10. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  11. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_TxMailbox1Complete(hcan);
  12. }
  13. }
  14. void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) {
  15. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  16. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_TxMailbox2Complete(hcan);
  17. }
  18. }
  19. void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan) {
  20. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  21. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_TxMailbox0Abort(hcan);
  22. }
  23. }
  24. void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan) {
  25. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  26. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_TxMailbox1Abort(hcan);
  27. }
  28. }
  29. void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan) {
  30. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  31. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_TxMailbox2Abort(hcan);
  32. }
  33. }
  34. void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
  35. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  36. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_RxFifo0MsgPending(hcan);
  37. }
  38. }
  39. void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan) {
  40. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  41. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_RxFifo0Full(hcan);
  42. }
  43. }
  44. void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan) {
  45. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  46. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_RxFifo1MsgPending(hcan);
  47. }
  48. }
  49. void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan) {
  50. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  51. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_RxFifo1Full(hcan);
  52. }
  53. }
  54. void HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan) {
  55. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  56. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_Sleep(hcan);
  57. }
  58. }
  59. void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan) {
  60. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  61. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_WakeUpFromRxMsg(hcan);
  62. }
  63. }
  64. void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan) {
  65. for (int i = 0; i < iflytop::ZCanIRQDispatcher::instance().m_listenerNum; i++) {
  66. iflytop::ZCanIRQDispatcher::instance().m_listener[i]->STM32_HAL_onCAN_Error(hcan);
  67. }
  68. }
  69. }
  70. using namespace iflytop;
  71. void ZCanIRQDispatcher::regListener(ZCanIRQListener *listener) {
  72. if (listener == NULL) return;
  73. for (int i = 0; i < STM32_HAL_LISTENER_NUM; i++) {
  74. if (m_listener[i] == NULL) {
  75. m_listener[i] = listener;
  76. m_listenerNum++;
  77. return;
  78. }
  79. }
  80. ZASSERT(0);
  81. }
  82. ZCanIRQDispatcher &ZCanIRQDispatcher::instance() {
  83. static ZCanIRQDispatcher instance;
  84. return instance;
  85. }
  86. #endif