car chassis
Dependencies: Servo mbed-rtos mbed
can.cpp@1:79b1ee0f97ef, 2015-08-31 (annotated)
- Committer:
- mariob
- Date:
- Mon Aug 31 22:25:57 2015 +0000
- Revision:
- 1:79b1ee0f97ef
- Parent:
- net.cpp@0:ce6055872f4e
- Child:
- 2:7dfc8dd6aab3
first commit with the following features: CAN driver (it works), eeprom (it works but it is not used)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mariob | 0:ce6055872f4e | 1 | #include "mbed.h" |
mariob | 1:79b1ee0f97ef | 2 | #include "can.hpp" |
mariob | 0:ce6055872f4e | 3 | #include "rtos.h" |
mariob | 0:ce6055872f4e | 4 | |
mariob | 0:ce6055872f4e | 5 | /* |
mariob | 0:ce6055872f4e | 6 | * COMMON |
mariob | 0:ce6055872f4e | 7 | */ |
mariob | 0:ce6055872f4e | 8 | |
mariob | 0:ce6055872f4e | 9 | CAN can(p9, p10); |
mariob | 0:ce6055872f4e | 10 | |
mariob | 0:ce6055872f4e | 11 | uint8 can_missing[CAN_RX_PERIODIC_MSG]; |
mariob | 0:ce6055872f4e | 12 | |
mariob | 0:ce6055872f4e | 13 | void init_can() |
mariob | 0:ce6055872f4e | 14 | { |
mariob | 0:ce6055872f4e | 15 | printf("RECOVERY: %d\r\n", CAN_MISSING_DETECTION); |
mariob | 0:ce6055872f4e | 16 | for (int i = 0; i < CAN_RX_PERIODIC_MSG; i++) |
mariob | 0:ce6055872f4e | 17 | can_missing[i] = CAN_MISSING_DETECTION; |
mariob | 0:ce6055872f4e | 18 | } |
mariob | 0:ce6055872f4e | 19 | |
mariob | 0:ce6055872f4e | 20 | /* |
mariob | 0:ce6055872f4e | 21 | * RECEIVER |
mariob | 0:ce6055872f4e | 22 | */ |
mariob | 0:ce6055872f4e | 23 | |
mariob | 0:ce6055872f4e | 24 | can_cmd_engine_t can_cmd_engine; |
mariob | 0:ce6055872f4e | 25 | can_cmd_body_t can_cmd_body; |
mariob | 0:ce6055872f4e | 26 | can_cmd_time_t can_cmd_time; |
mariob | 0:ce6055872f4e | 27 | can_cmd_driver_t can_cmd_driver; |
mariob | 0:ce6055872f4e | 28 | |
mariob | 0:ce6055872f4e | 29 | void can_rx() |
mariob | 0:ce6055872f4e | 30 | { |
mariob | 0:ce6055872f4e | 31 | bool ret = false; |
mariob | 0:ce6055872f4e | 32 | CANMessage message; |
mariob | 0:ce6055872f4e | 33 | |
mariob | 0:ce6055872f4e | 34 | do{ |
mariob | 0:ce6055872f4e | 35 | ret = can.read(message); |
mariob | 0:ce6055872f4e | 36 | |
mariob | 0:ce6055872f4e | 37 | if (ret == 0) |
mariob | 0:ce6055872f4e | 38 | break; |
mariob | 0:ce6055872f4e | 39 | |
mariob | 0:ce6055872f4e | 40 | switch(message.id) { |
mariob | 0:ce6055872f4e | 41 | case CAN_CMD_ENGINE_ID: |
mariob | 0:ce6055872f4e | 42 | can_cmd_engine.payload.buf[0] = message.data[0]; |
mariob | 0:ce6055872f4e | 43 | can_cmd_engine.payload.buf[1] = message.data[1]; |
mariob | 0:ce6055872f4e | 44 | can_cmd_engine.payload.buf[2] = message.data[2]; |
mariob | 0:ce6055872f4e | 45 | can_cmd_engine.payload.buf[3] = message.data[3]; |
mariob | 0:ce6055872f4e | 46 | can_cmd_engine.flag = CAN_FLAG_RECEIVED; |
mariob | 0:ce6055872f4e | 47 | can_missing[CAN_MISSING_ENGINE_ID] = CAN_MISSING_DETECTION+1; |
mariob | 0:ce6055872f4e | 48 | break; |
mariob | 0:ce6055872f4e | 49 | case CAN_CMD_BODY_ID: |
mariob | 0:ce6055872f4e | 50 | can_cmd_body.payload.buf[0] = message.data[0]; |
mariob | 0:ce6055872f4e | 51 | can_cmd_body.payload.buf[1] = message.data[1]; |
mariob | 0:ce6055872f4e | 52 | can_cmd_body.payload.buf[2] = message.data[2]; |
mariob | 0:ce6055872f4e | 53 | can_cmd_body.payload.buf[3] = message.data[3]; |
mariob | 0:ce6055872f4e | 54 | can_cmd_body.flag = CAN_FLAG_RECEIVED; |
mariob | 0:ce6055872f4e | 55 | can_missing[CAN_MISSING_BODY_ID] = CAN_MISSING_DETECTION+1; |
mariob | 0:ce6055872f4e | 56 | break; |
mariob | 0:ce6055872f4e | 57 | case CAN_CMD_TIME_ID: |
mariob | 0:ce6055872f4e | 58 | can_cmd_time.payload.buf[0] = message.data[0]; |
mariob | 0:ce6055872f4e | 59 | can_cmd_time.payload.buf[1] = message.data[1]; |
mariob | 0:ce6055872f4e | 60 | can_cmd_time.payload.buf[2] = message.data[2]; |
mariob | 0:ce6055872f4e | 61 | can_cmd_time.payload.buf[3] = message.data[3]; |
mariob | 0:ce6055872f4e | 62 | can_cmd_time.flag = CAN_FLAG_RECEIVED; |
mariob | 0:ce6055872f4e | 63 | can_missing[CAN_MISSING_TIME_ID] = CAN_MISSING_DETECTION+1; |
mariob | 0:ce6055872f4e | 64 | break; |
mariob | 0:ce6055872f4e | 65 | case CAN_CMD_DRIVER_ID: |
mariob | 0:ce6055872f4e | 66 | can_cmd_driver.payload.buf[0] = message.data[0]; |
mariob | 0:ce6055872f4e | 67 | can_cmd_driver.payload.buf[1] = message.data[1]; |
mariob | 0:ce6055872f4e | 68 | can_cmd_driver.payload.buf[2] = message.data[2]; |
mariob | 0:ce6055872f4e | 69 | can_cmd_driver.payload.buf[3] = message.data[3]; |
mariob | 0:ce6055872f4e | 70 | can_cmd_driver.payload.buf[4] = message.data[4]; |
mariob | 0:ce6055872f4e | 71 | can_cmd_driver.payload.buf[5] = message.data[5]; |
mariob | 0:ce6055872f4e | 72 | can_cmd_driver.payload.buf[6] = message.data[6]; |
mariob | 0:ce6055872f4e | 73 | can_cmd_driver.payload.buf[7] = message.data[7]; |
mariob | 0:ce6055872f4e | 74 | can_cmd_driver.flag = CAN_FLAG_RECEIVED; |
mariob | 0:ce6055872f4e | 75 | break; |
mariob | 0:ce6055872f4e | 76 | }; |
mariob | 0:ce6055872f4e | 77 | } while(1); |
mariob | 0:ce6055872f4e | 78 | |
mariob | 0:ce6055872f4e | 79 | for (int i = 0; i < CAN_RX_PERIODIC_MSG; i++) |
mariob | 0:ce6055872f4e | 80 | if (can_missing[i]>0) |
mariob | 0:ce6055872f4e | 81 | can_missing[i]--; |
mariob | 0:ce6055872f4e | 82 | } |
mariob | 0:ce6055872f4e | 83 | |
mariob | 0:ce6055872f4e | 84 | /* |
mariob | 0:ce6055872f4e | 85 | * SENDER |
mariob | 0:ce6055872f4e | 86 | */ |
mariob | 0:ce6055872f4e | 87 | can_sts_body_t can_sts_body; |
mariob | 0:ce6055872f4e | 88 | can_sts_driver_t can_sts_driver; |
mariob | 0:ce6055872f4e | 89 | |
mariob | 0:ce6055872f4e | 90 | void can_tx () |
mariob | 0:ce6055872f4e | 91 | { |
mariob | 0:ce6055872f4e | 92 | /** periodic messages */ |
mariob | 0:ce6055872f4e | 93 | if (can_sts_body.flag == 0) { |
mariob | 1:79b1ee0f97ef | 94 | if (!can.write(CANMessage(CAN_STS_BODY_ID, (char*)(&(can_sts_body.payload.buf)), CAN_STS_PAYLOAD_BODY))) |
mariob | 1:79b1ee0f97ef | 95 | // printf("SEND STS_BODY OK\r\n"); |
mariob | 1:79b1ee0f97ef | 96 | // else |
mariob | 0:ce6055872f4e | 97 | printf("SEND STS_BODY NOT OK\r\n"); |
mariob | 0:ce6055872f4e | 98 | can_sts_body.flag = CAN_STS_BODY_PERIOD; |
mariob | 0:ce6055872f4e | 99 | } |
mariob | 0:ce6055872f4e | 100 | can_sts_body.flag--; |
mariob | 0:ce6055872f4e | 101 | |
mariob | 0:ce6055872f4e | 102 | /** event messages */ |
mariob | 0:ce6055872f4e | 103 | if (can_sts_driver.flag == CAN_FLAG_SEND) { |
mariob | 1:79b1ee0f97ef | 104 | if (!can.write(CANMessage(CAN_STS_DRIVER_ID, (char*)(&(can_sts_driver.payload.buf)), CAN_STS_PAYLOAD_DRIVER))) |
mariob | 1:79b1ee0f97ef | 105 | // printf("SEND STS_DRIVER OK\r\n"); |
mariob | 1:79b1ee0f97ef | 106 | // else |
mariob | 0:ce6055872f4e | 107 | printf("SEND STS_DRIVER NOT OK\r\n"); |
mariob | 0:ce6055872f4e | 108 | can_sts_driver.flag = CAN_FLAG_EMPTY; |
mariob | 0:ce6055872f4e | 109 | } |
mariob | 0:ce6055872f4e | 110 | } |
mariob | 0:ce6055872f4e | 111 | |
mariob | 0:ce6055872f4e | 112 | /* |
mariob | 0:ce6055872f4e | 113 | * THREAD |
mariob | 0:ce6055872f4e | 114 | */ |
mariob | 0:ce6055872f4e | 115 | |
mariob | 0:ce6055872f4e | 116 | void thread_can (void const *args) |
mariob | 0:ce6055872f4e | 117 | { |
mariob | 0:ce6055872f4e | 118 | while(1) { |
mariob | 0:ce6055872f4e | 119 | can_rx(); |
mariob | 0:ce6055872f4e | 120 | can_tx(); |
mariob | 0:ce6055872f4e | 121 | Thread::wait(CAN_THREAD_PERIOD); |
mariob | 0:ce6055872f4e | 122 | } |
mariob | 0:ce6055872f4e | 123 | } |
mariob | 0:ce6055872f4e | 124 | |
mariob | 0:ce6055872f4e | 125 | bool can_msg_is_missing (uint8 msg_id) |
mariob | 0:ce6055872f4e | 126 | { |
mariob | 0:ce6055872f4e | 127 | if (msg_id < CAN_RX_PERIODIC_MSG) |
mariob | 0:ce6055872f4e | 128 | return (can_missing[msg_id]==0); |
mariob | 0:ce6055872f4e | 129 | return true; |
mariob | 0:ce6055872f4e | 130 | } |