car chassis
Dependencies: Servo mbed-rtos mbed
can.cpp
- Committer:
- mariob
- Date:
- 2015-08-31
- Revision:
- 1:79b1ee0f97ef
- Parent:
- net.cpp@ 0:ce6055872f4e
- Child:
- 2:7dfc8dd6aab3
File content as of revision 1:79b1ee0f97ef:
#include "mbed.h" #include "can.hpp" #include "rtos.h" /* * COMMON */ CAN can(p9, p10); uint8 can_missing[CAN_RX_PERIODIC_MSG]; void init_can() { printf("RECOVERY: %d\r\n", CAN_MISSING_DETECTION); for (int i = 0; i < CAN_RX_PERIODIC_MSG; i++) can_missing[i] = CAN_MISSING_DETECTION; } /* * RECEIVER */ can_cmd_engine_t can_cmd_engine; can_cmd_body_t can_cmd_body; can_cmd_time_t can_cmd_time; can_cmd_driver_t can_cmd_driver; void can_rx() { bool ret = false; CANMessage message; do{ ret = can.read(message); if (ret == 0) break; switch(message.id) { case CAN_CMD_ENGINE_ID: can_cmd_engine.payload.buf[0] = message.data[0]; can_cmd_engine.payload.buf[1] = message.data[1]; can_cmd_engine.payload.buf[2] = message.data[2]; can_cmd_engine.payload.buf[3] = message.data[3]; can_cmd_engine.flag = CAN_FLAG_RECEIVED; can_missing[CAN_MISSING_ENGINE_ID] = CAN_MISSING_DETECTION+1; break; case CAN_CMD_BODY_ID: can_cmd_body.payload.buf[0] = message.data[0]; can_cmd_body.payload.buf[1] = message.data[1]; can_cmd_body.payload.buf[2] = message.data[2]; can_cmd_body.payload.buf[3] = message.data[3]; can_cmd_body.flag = CAN_FLAG_RECEIVED; can_missing[CAN_MISSING_BODY_ID] = CAN_MISSING_DETECTION+1; break; case CAN_CMD_TIME_ID: can_cmd_time.payload.buf[0] = message.data[0]; can_cmd_time.payload.buf[1] = message.data[1]; can_cmd_time.payload.buf[2] = message.data[2]; can_cmd_time.payload.buf[3] = message.data[3]; can_cmd_time.flag = CAN_FLAG_RECEIVED; can_missing[CAN_MISSING_TIME_ID] = CAN_MISSING_DETECTION+1; break; case CAN_CMD_DRIVER_ID: can_cmd_driver.payload.buf[0] = message.data[0]; can_cmd_driver.payload.buf[1] = message.data[1]; can_cmd_driver.payload.buf[2] = message.data[2]; can_cmd_driver.payload.buf[3] = message.data[3]; can_cmd_driver.payload.buf[4] = message.data[4]; can_cmd_driver.payload.buf[5] = message.data[5]; can_cmd_driver.payload.buf[6] = message.data[6]; can_cmd_driver.payload.buf[7] = message.data[7]; can_cmd_driver.flag = CAN_FLAG_RECEIVED; break; }; } while(1); for (int i = 0; i < CAN_RX_PERIODIC_MSG; i++) if (can_missing[i]>0) can_missing[i]--; } /* * SENDER */ can_sts_body_t can_sts_body; can_sts_driver_t can_sts_driver; void can_tx () { /** periodic messages */ if (can_sts_body.flag == 0) { if (!can.write(CANMessage(CAN_STS_BODY_ID, (char*)(&(can_sts_body.payload.buf)), CAN_STS_PAYLOAD_BODY))) // printf("SEND STS_BODY OK\r\n"); // else printf("SEND STS_BODY NOT OK\r\n"); can_sts_body.flag = CAN_STS_BODY_PERIOD; } can_sts_body.flag--; /** event messages */ if (can_sts_driver.flag == CAN_FLAG_SEND) { if (!can.write(CANMessage(CAN_STS_DRIVER_ID, (char*)(&(can_sts_driver.payload.buf)), CAN_STS_PAYLOAD_DRIVER))) // printf("SEND STS_DRIVER OK\r\n"); // else printf("SEND STS_DRIVER NOT OK\r\n"); can_sts_driver.flag = CAN_FLAG_EMPTY; } } /* * THREAD */ void thread_can (void const *args) { while(1) { can_rx(); can_tx(); Thread::wait(CAN_THREAD_PERIOD); } } bool can_msg_is_missing (uint8 msg_id) { if (msg_id < CAN_RX_PERIODIC_MSG) return (can_missing[msg_id]==0); return true; }