Ejemplo n.º 1
0
/*
 * 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);
}
Ejemplo n.º 2
0
/*
 * 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);
}