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; } } }