Beispiel #1
0
void can_configure_mobs(void) {

	int mob;

	/* Initialize MOBs */
	for (mob = 0; mob < CAN_MOBS; mob++) {
		/* Set MOB */
		CAN_SET_MOB(mob);
		CAN_CLEAR_MOB();

		/* Only RX mobs require special initialization */
		if (mob >= CAN_TX_MOBS) {
			/* Set id and mask */
			CAN_SET_EXT_ID(can_id);
			CAN_SET_EXT_MSK(can_mask);

			/* Accept extended frames */
			CAN_CLEAR_IDEMSK();
			CAN_CONFIG_RX();
		}

	}
}
static void post_cmd(can_cmd_t * cmd) {
    uint8_t mob_handle;
    uint8_t i;

    if(cmd == NULL) return;

    mob_handle = can_get_mob_free();

    // add command to wait queue if there are no free mobs
    if(mob_handle == NO_MOB) {
        cmd->status = MOB_NOT_COMPLETED;
        list_add(can_cmd_list, cmd);
    }
    // add command to table of pending command otherwise
    else {
        can_mob[mob_handle] = cmd;
        cmd->status = MOB_PENDING;
        CAN_SET_MOB(mob_handle);
        CAN_CLEAR_MOB();

        switch(cmd->type) {
            case TX:
                if(cmd->frame->inf.ide) {
                    CAN_SET_EXT_ID(cmd->frame->inf.id);
                } else {
                    CAN_SET_STD_ID(cmd->frame->inf.id);
                }

                for(i = 0; i < cmd->frame->data.len; ++i) {
                    CANMSG = cmd->frame->data.itself[i];
                }

                if(cmd->frame->inf.rtr) {
                    CAN_SET_RTR();
                } else {
                    CAN_CLEAR_RTR();
                }
                CAN_SET_DLC(cmd->frame->data.len);
                CAN_CONFIG_TX();
                break;

            case RX:
                if (cmd->frame->inf.ide) {
                    CAN_SET_EXT_ID(can_masked_id);
                    CAN_SET_IDEMSK();
                    CAN_SET_EXT_MSK(can_mask);
                } else {
                    CAN_SET_STD_ID(can_masked_id);
                    CAN_CLEAR_IDEMSK();
                    CAN_SET_STD_MSK(can_mask);
                }
                CAN_SET_DLC(cmd->frame->data.len);
                CAN_CLEAR_RTRMSK();
                CAN_CONFIG_RX();
                break;

            default:
                cmd->status = STATUS_CLEARED;
                break;
        }
    }
}