/* * Attach a CanObserver. Can frames which match the id/mask will be forwarded to the observer * via the method handleCanFrame(RX_CAN_FRAME). * Sets up a can bus mailbox if necessary. * * \param observer - the observer object to register (must implement CanObserver class) * \param id - the id of the can frame to listen to * \param mask - the mask to be applied to the frames * \param extended - set if extended frames must be supported */ void CanHandler::attach(CanObserver* observer, uint32_t id, uint32_t mask, bool extended) { int8_t pos = findFreeObserverData(); if (pos == -1) { Logger::error("no free space in CanHandler::observerData, increase its size via CFG_CAN_NUM_OBSERVERS"); return; } int8_t mailbox = findFreeMailbox(); if (mailbox == -1) { Logger::error("no free CAN mailbox on bus %d", canBusNode); return; } observerData[pos].id = id; observerData[pos].mask = mask; observerData[pos].extended = extended; observerData[pos].mailbox = mailbox; observerData[pos].observer = observer; bus->mailbox_set_mode(mailbox, CAN_MB_RX_MODE); bus->mailbox_set_accept_mask(mailbox, mask, extended); bus->mailbox_set_id(mailbox, id, extended); bus->enable_interrupt(getMailboxIer(mailbox)); Logger::debug("attached CanObserver (%X) for id=%X, mask=%X, mailbox=%d", observer, id, mask, mailbox); }
/* * Attach a CanObserver. Can frames which match the id/mask will be forwarded to the observer * via the method handleCanFrame(RX_CAN_FRAME). * Sets up a can bus mailbox if necessary. * * \param observer - the observer object to register (must implement CanObserver class) * \param id - the id of the can frame to listen to * \param mask - the mask to be applied to the frames * \param extended - set if extended frames must be supported */ void CanHandler::attach(CanObserver* observer, uint32_t id, uint32_t mask, bool extended) { int8_t pos = findFreeObserverData(); if (pos == -1) { Logger::error("no free space in CanHandler::observerData, increase its size via CFG_CAN_NUM_OBSERVERS"); return; } int mailbox = bus->findFreeRXMailbox(); if (mailbox == -1) { Logger::error("no free CAN mailbox on bus %d", canBusNode); return; } observerData[pos].id = id; observerData[pos].mask = mask; observerData[pos].extended = extended; observerData[pos].mailbox = mailbox; observerData[pos].observer = observer; bus->setRXFilter((uint8_t) mailbox, id, mask, extended); Logger::debug("attached CanObserver (%X) for id=%X, mask=%X, mailbox=%d", observer, id, mask, mailbox); }