car chassis

Dependencies:   Servo mbed-rtos mbed

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?

UserRevisionLine numberNew 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 }