Small project to display some OBD values from the Toyota GT86/ Subaru BRZ/ Scion FRS on an OLED display.

Dependencies:   Adafruit_GFX MODSERIAL mbed-rtos mbed

Committer:
chrta
Date:
Sun May 11 09:05:37 2014 +0000
Revision:
7:a19b63c0a0fa
Parent:
6:506b703a8acf
Changed Adafruit_GFX to my own fork.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chrta 0:6b1f6139fb25 1 #include "mbed.h"
chrta 0:6b1f6139fb25 2 #include "rtos.h"
chrta 0:6b1f6139fb25 3 #include "IsoTpHandler.h"
chrta 2:d3d61d9d323e 4 #include "MODSERIAL.h"
chrta 6:506b703a8acf 5 #include "display.h"
chrta 1:ca506b88b1d6 6
chrta 6:506b703a8acf 7 #include "EngineCoolantTemperature.h"
chrta 6:506b703a8acf 8 #include "OilTemperature.h"
chrta 6:506b703a8acf 9 #include "VehicleSpeed.h"
chrta 6:506b703a8acf 10 #include "Throttle.h"
chrta 6:506b703a8acf 11 #include "EngineRpm.h"
chrta 6:506b703a8acf 12
chrta 6:506b703a8acf 13 //#define CAN1_TEST
chrta 6:506b703a8acf 14 //#define CAN1_OBD_CAR_SIMULATOR
chrta 2:d3d61d9d323e 15
chrta 2:d3d61d9d323e 16 // Make TX buffer 1024bytes and RX buffer use 512bytes.
chrta 2:d3d61d9d323e 17 MODSERIAL pc(USBTX, USBRX, 2 * 1024, 512); // tx, rx
chrta 0:6b1f6139fb25 18 DigitalOut led1(LED1);
chrta 0:6b1f6139fb25 19 DigitalOut led2(LED2);
chrta 2:d3d61d9d323e 20 DigitalOut led3(LED3);
chrta 2:d3d61d9d323e 21 DigitalOut led4(LED4);
chrta 2:d3d61d9d323e 22
chrta 2:d3d61d9d323e 23 CAN can1(p9, p10);
chrta 2:d3d61d9d323e 24 DigitalOut can1_disable(p8);
chrta 0:6b1f6139fb25 25 CAN can2(p30, p29);
chrta 2:d3d61d9d323e 26 DigitalOut can2_disable(p28);
chrta 2:d3d61d9d323e 27
chrta 0:6b1f6139fb25 28 IsoTpHandler tpHandler(&can2);
chrta 4:0e2d6cc31afb 29
chrta 6:506b703a8acf 30 Display display;
chrta 6:506b703a8acf 31
chrta 5:0b229ba8ede5 32 //#define ACTIVATE_DEBUG_OUTPUT
chrta 4:0e2d6cc31afb 33 #ifdef ACTIVATE_DEBUG_OUTPUT
chrta 4:0e2d6cc31afb 34 #define DEBUG_PRINT(format, ...) pc.printf(format, ##__VA_ARGS__)
chrta 4:0e2d6cc31afb 35 #else
chrta 4:0e2d6cc31afb 36 #define DEBUG_PRINT(format, ...)
chrta 4:0e2d6cc31afb 37 #endif
chrta 6:506b703a8acf 38
chrta 0:6b1f6139fb25 39 void led2_thread(void const *args) {
chrta 0:6b1f6139fb25 40 while (true) {
chrta 0:6b1f6139fb25 41 led2 = !led2;
chrta 0:6b1f6139fb25 42 Thread::wait(1000);
chrta 0:6b1f6139fb25 43 }
chrta 0:6b1f6139fb25 44 }
chrta 0:6b1f6139fb25 45
chrta 0:6b1f6139fb25 46 Mail<CANMessage, 16> can_rx_queue;
chrta 0:6b1f6139fb25 47
chrta 0:6b1f6139fb25 48 void can_process_packets(void const *args) {
chrta 0:6b1f6139fb25 49 while (true) {
chrta 4:0e2d6cc31afb 50 //pc.printf("Th wait for can packet\r\n");
chrta 0:6b1f6139fb25 51 osEvent evt = can_rx_queue.get(osWaitForever);
chrta 4:0e2d6cc31afb 52 //pc.printf("Got evt %d\r\n", evt.status);
chrta 0:6b1f6139fb25 53 if (evt.status == osEventMail) {
chrta 4:0e2d6cc31afb 54 //pc.printf("Got can packet\r\n");
chrta 0:6b1f6139fb25 55 CANMessage *msg = (CANMessage*) evt.value.p;
chrta 4:0e2d6cc31afb 56 //pc.printf("Process can packet\r\n");
chrta 0:6b1f6139fb25 57 tpHandler.processCanMessage(msg);
chrta 4:0e2d6cc31afb 58 //pc.printf("Processed can packet\r\n");
chrta 0:6b1f6139fb25 59 can_rx_queue.free(msg);
chrta 4:0e2d6cc31afb 60 //pc.printf("Freed can packet\r\n");
chrta 0:6b1f6139fb25 61 }
chrta 0:6b1f6139fb25 62 }
chrta 0:6b1f6139fb25 63 }
chrta 0:6b1f6139fb25 64
chrta 0:6b1f6139fb25 65
chrta 0:6b1f6139fb25 66 void can_rx_int_handler() {
chrta 2:d3d61d9d323e 67 //pc.printf("can_rx_int_handler\r\n");
chrta 0:6b1f6139fb25 68 CANMessage* msg = can_rx_queue.alloc();
chrta 0:6b1f6139fb25 69 if (!can2.read(*msg))
chrta 0:6b1f6139fb25 70 {
chrta 2:d3d61d9d323e 71 //pc.printf("can_rx_int_handler no read\r\n");
chrta 0:6b1f6139fb25 72 //this should not happen, because this function is called from the rx interrupt
chrta 0:6b1f6139fb25 73 can_rx_queue.free(msg);
chrta 2:d3d61d9d323e 74 //pc.printf("can_rx_int_handler ret 1\r\n");
chrta 2:d3d61d9d323e 75 return;
chrta 2:d3d61d9d323e 76 }
chrta 2:d3d61d9d323e 77 if (msg->id != 0x7E8)
chrta 2:d3d61d9d323e 78 {
chrta 2:d3d61d9d323e 79 //no OBD message
chrta 2:d3d61d9d323e 80 can_rx_queue.free(msg);
chrta 0:6b1f6139fb25 81 return;
chrta 0:6b1f6139fb25 82 }
chrta 2:d3d61d9d323e 83 //pc.printf("can_rx_int_handler got packet\r\n");
chrta 2:d3d61d9d323e 84 osStatus error_code = can_rx_queue.put(msg);
chrta 2:d3d61d9d323e 85 //pc.printf("can_rx_int_handler in queue\r\n");
chrta 2:d3d61d9d323e 86 if (error_code != osOK) {
chrta 2:d3d61d9d323e 87 //pc.printf("can_rx_int_handler failed\r\n");
chrta 2:d3d61d9d323e 88 //error("Putting can message into mailbox failed with code %d!", error);
chrta 2:d3d61d9d323e 89 }
chrta 0:6b1f6139fb25 90
chrta 2:d3d61d9d323e 91 //pc.printf("can_rx_int_handler ok\r\n");
chrta 2:d3d61d9d323e 92 }
chrta 2:d3d61d9d323e 93
chrta 5:0b229ba8ede5 94 Mail<CANMessage, 16> can2_tx_queue;
chrta 5:0b229ba8ede5 95 void can2_send_packets(void const *args) {
chrta 5:0b229ba8ede5 96 DEBUG_PRINT("TX2 start\r\n");
chrta 5:0b229ba8ede5 97 while (true) {
chrta 5:0b229ba8ede5 98 osEvent evt = can2_tx_queue.get(osWaitForever);
chrta 5:0b229ba8ede5 99 if (evt.status == osEventMail) {
chrta 5:0b229ba8ede5 100 CANMessage *msg = (CANMessage*) evt.value.p;
chrta 5:0b229ba8ede5 101 DEBUG_PRINT("TX2 check\r\n");
chrta 5:0b229ba8ede5 102 if (can2.write(*msg))
chrta 5:0b229ba8ede5 103 {
chrta 5:0b229ba8ede5 104 DEBUG_PRINT("TX2 send\r\n");
chrta 5:0b229ba8ede5 105 can2_tx_queue.free(msg);
chrta 5:0b229ba8ede5 106 Thread::wait(150);
chrta 5:0b229ba8ede5 107 }
chrta 5:0b229ba8ede5 108 else
chrta 5:0b229ba8ede5 109 {
chrta 5:0b229ba8ede5 110 DEBUG_PRINT("TX2 wait \r\n");
chrta 5:0b229ba8ede5 111 Thread::wait(150);
chrta 5:0b229ba8ede5 112 }
chrta 5:0b229ba8ede5 113 }
chrta 5:0b229ba8ede5 114 }
chrta 5:0b229ba8ede5 115 }
chrta 5:0b229ba8ede5 116
chrta 5:0b229ba8ede5 117
chrta 5:0b229ba8ede5 118 struct behaviour_t {
chrta 6:506b703a8acf 119 const char *rxData; //[8];
chrta 5:0b229ba8ede5 120 char txData[8];
chrta 5:0b229ba8ede5 121 };
chrta 5:0b229ba8ede5 122
chrta 5:0b229ba8ede5 123
chrta 6:506b703a8acf 124 const char broken_message[] = {0x02, 0x01, 0x21, 0, 0, 0, 0, 0};
chrta 5:0b229ba8ede5 125 behaviour_t behaviour[] =
chrta 5:0b229ba8ede5 126 {
chrta 6:506b703a8acf 127 {OilTemperature::REQUEST_DATA, {0x10, 0x1F, 0x61, 0x01, 0x51, 0, 0x37, 0x01}}, //first oil temp packet
chrta 6:506b703a8acf 128 {OilTemperature::SECOND_MESSAGE, {0x21, 0x1F, 0x61, 0x01, 0x51, 0, 0x37, 0x01}}, //second oil temp packet, TODO more pakets must be sent
chrta 6:506b703a8acf 129 {broken_message, {0x04, 0x41, 0x21, 0, 0, 0, 0, 0}},
chrta 6:506b703a8acf 130 {VehicleSpeed::REQUEST_DATA, {0x03, 0x41, 0x0D, 0x26, 0, 0, 0, 0}},
chrta 6:506b703a8acf 131 {EngineRpm::REQUEST_DATA, {0x04, 0x41, 0x0C, 0x0F, 0xA2, 0, 0, 0}},
chrta 6:506b703a8acf 132 {Throttle::REQUEST_DATA, {0x03, 0x41, 0x11, 0x26, 0, 0, 0, 0}},
chrta 6:506b703a8acf 133 {EngineCoolantTemp::REQUEST_DATA, {0x03, 0x41, 0x05, 0x4D, 0, 0, 0, 0}}, //engine coolant temp
chrta 5:0b229ba8ede5 134 };
chrta 5:0b229ba8ede5 135
chrta 5:0b229ba8ede5 136 void can2_send_requests(void const *args) {
chrta 5:0b229ba8ede5 137 while (true) {
chrta 5:0b229ba8ede5 138 Thread::wait(2000);
chrta 5:0b229ba8ede5 139 CANMessage sendMsg(0x7E0, (char*) behaviour[3].rxData, 8);
chrta 5:0b229ba8ede5 140 CANMessage* msg = can2_tx_queue.alloc();
chrta 5:0b229ba8ede5 141 *msg = sendMsg;
chrta 5:0b229ba8ede5 142 can2_tx_queue.put(msg);
chrta 5:0b229ba8ede5 143 Thread::wait(200);
chrta 5:0b229ba8ede5 144 msg = can2_tx_queue.alloc();
chrta 5:0b229ba8ede5 145 sendMsg.data[2] = behaviour[4].rxData[2];
chrta 5:0b229ba8ede5 146 *msg = sendMsg;
chrta 5:0b229ba8ede5 147 can2_tx_queue.put(msg);
chrta 5:0b229ba8ede5 148 Thread::wait(200);
chrta 5:0b229ba8ede5 149 sendMsg.data[2] = behaviour[5].rxData[2];
chrta 5:0b229ba8ede5 150 *msg = sendMsg;
chrta 5:0b229ba8ede5 151 can2_tx_queue.put(msg);
chrta 5:0b229ba8ede5 152 Thread::wait(200);
chrta 6:506b703a8acf 153 sendMsg.data[2] = behaviour[6].rxData[2];
chrta 6:506b703a8acf 154 *msg = sendMsg;
chrta 6:506b703a8acf 155 can2_tx_queue.put(msg);
chrta 6:506b703a8acf 156 Thread::wait(200);
chrta 5:0b229ba8ede5 157 CANMessage sendMsg2(0x7E0, (char*) behaviour[0].rxData, 8);
chrta 5:0b229ba8ede5 158 msg = can2_tx_queue.alloc();
chrta 5:0b229ba8ede5 159 *msg = sendMsg2;
chrta 5:0b229ba8ede5 160 can2_tx_queue.put(msg);
chrta 5:0b229ba8ede5 161 }
chrta 5:0b229ba8ede5 162 }
chrta 5:0b229ba8ede5 163
chrta 2:d3d61d9d323e 164 #ifdef CAN1_TEST
chrta 2:d3d61d9d323e 165 Mail<CANMessage, 16> can1_rx_queue;
chrta 2:d3d61d9d323e 166 CANMessage msg1;
chrta 2:d3d61d9d323e 167 void can1_rx_int_handler() {
chrta 2:d3d61d9d323e 168 led3 = !led3;
chrta 2:d3d61d9d323e 169 CANMessage* msg = can1_rx_queue.alloc();
chrta 2:d3d61d9d323e 170 if (!can1.read(*msg))
chrta 2:d3d61d9d323e 171 {
chrta 2:d3d61d9d323e 172 can1_rx_queue.free(msg);
chrta 2:d3d61d9d323e 173 return;
chrta 2:d3d61d9d323e 174 }
chrta 3:eb807d330292 175 if ((msg->id != 0x7E8) && (msg->id != 0x7E0))
chrta 3:eb807d330292 176 {
chrta 3:eb807d330292 177 can1_rx_queue.free(msg);
chrta 3:eb807d330292 178 return;
chrta 3:eb807d330292 179 }
chrta 2:d3d61d9d323e 180 can1_rx_queue.put(msg);
chrta 2:d3d61d9d323e 181 led4 = !led4;
chrta 2:d3d61d9d323e 182 }
chrta 2:d3d61d9d323e 183
chrta 2:d3d61d9d323e 184
chrta 2:d3d61d9d323e 185 #ifdef CAN1_OBD_CAR_SIMULATOR
chrta 2:d3d61d9d323e 186
chrta 2:d3d61d9d323e 187 Mail<CANMessage, 16> can1_tx_queue;
chrta 2:d3d61d9d323e 188
chrta 2:d3d61d9d323e 189 void can1_obd_car_simulator_process_packet(CANMessage &msg)
chrta 2:d3d61d9d323e 190 {
chrta 2:d3d61d9d323e 191 if (msg.id != 0x7E0)
chrta 2:d3d61d9d323e 192 {
chrta 2:d3d61d9d323e 193 return;
chrta 2:d3d61d9d323e 194 }
chrta 2:d3d61d9d323e 195
chrta 2:d3d61d9d323e 196 for (unsigned int i = 0; i < sizeof(behaviour) / sizeof (behaviour[0]); i++)
chrta 2:d3d61d9d323e 197 {
chrta 2:d3d61d9d323e 198 if (memcmp(msg.data, behaviour[i].rxData, 8) == 0)
chrta 2:d3d61d9d323e 199 {
chrta 2:d3d61d9d323e 200 CANMessage sendMsg(0x7E8, (char*) behaviour[i].txData, 8);
chrta 2:d3d61d9d323e 201 CANMessage* msg = can1_tx_queue.alloc();
chrta 2:d3d61d9d323e 202 *msg = sendMsg;
chrta 2:d3d61d9d323e 203 can1_tx_queue.put(msg);
chrta 2:d3d61d9d323e 204
chrta 2:d3d61d9d323e 205 if (i == 1)
chrta 2:d3d61d9d323e 206 {
chrta 2:d3d61d9d323e 207 //send additinal packets later
chrta 2:d3d61d9d323e 208 sendMsg.data[0] = 0x22;
chrta 2:d3d61d9d323e 209 msg = can1_tx_queue.alloc();
chrta 2:d3d61d9d323e 210 *msg = sendMsg;
chrta 2:d3d61d9d323e 211 can1_tx_queue.put(msg);
chrta 2:d3d61d9d323e 212 sendMsg.data[0] = 0x23;
chrta 2:d3d61d9d323e 213 msg = can1_tx_queue.alloc();
chrta 2:d3d61d9d323e 214 *msg = sendMsg;
chrta 2:d3d61d9d323e 215 can1_tx_queue.put(msg);
chrta 2:d3d61d9d323e 216 sendMsg.data[0] = 0x24;
chrta 2:d3d61d9d323e 217 msg = can1_tx_queue.alloc();
chrta 2:d3d61d9d323e 218 *msg = sendMsg;
chrta 2:d3d61d9d323e 219 can1_tx_queue.put(msg);
chrta 2:d3d61d9d323e 220 }
chrta 2:d3d61d9d323e 221 }
chrta 0:6b1f6139fb25 222 }
chrta 0:6b1f6139fb25 223 }
chrta 1:ca506b88b1d6 224
chrta 2:d3d61d9d323e 225 #endif //CAN1_OBD_CAR_SIMULATOR
chrta 2:d3d61d9d323e 226
chrta 2:d3d61d9d323e 227 void can1_process_packets(void const *args) {
chrta 2:d3d61d9d323e 228 while (true) {
chrta 2:d3d61d9d323e 229 osEvent evt = can1_rx_queue.get(osWaitForever);
chrta 2:d3d61d9d323e 230 if (evt.status == osEventMail) {
chrta 2:d3d61d9d323e 231 CANMessage *msg = (CANMessage*) evt.value.p;
chrta 2:d3d61d9d323e 232
chrta 2:d3d61d9d323e 233 pc.printf("\r\nRX1: '%d' '%d' '%d' '%x' '", msg->format, msg->type, msg->len, msg->id);
chrta 2:d3d61d9d323e 234 for (unsigned int i = 0; i < msg->len; i++)
chrta 2:d3d61d9d323e 235 {
chrta 2:d3d61d9d323e 236 pc.printf("%x ", msg->data[i]);
chrta 2:d3d61d9d323e 237 }
chrta 2:d3d61d9d323e 238 pc.printf("'\r\n");
chrta 2:d3d61d9d323e 239 #ifdef CAN1_OBD_CAR_SIMULATOR
chrta 2:d3d61d9d323e 240 can1_obd_car_simulator_process_packet(*msg);
chrta 2:d3d61d9d323e 241 #endif //CAN1_OBD_CAR_SIMULATOR
chrta 2:d3d61d9d323e 242 can1_rx_queue.free(msg);
chrta 2:d3d61d9d323e 243 }
chrta 2:d3d61d9d323e 244 }
chrta 2:d3d61d9d323e 245 }
chrta 2:d3d61d9d323e 246
chrta 3:eb807d330292 247 #ifdef CAN1_OBD_CAR_SIMULATOR
chrta 2:d3d61d9d323e 248 void can1_send_packets(void const *args) {
chrta 4:0e2d6cc31afb 249 DEBUG_PRINT("TX1 start\r\n");
chrta 2:d3d61d9d323e 250 while (true) {
chrta 2:d3d61d9d323e 251 osEvent evt = can1_tx_queue.get(osWaitForever);
chrta 2:d3d61d9d323e 252 if (evt.status == osEventMail) {
chrta 2:d3d61d9d323e 253 CANMessage *msg = (CANMessage*) evt.value.p;
chrta 4:0e2d6cc31afb 254 DEBUG_PRINT("TX1 check\r\n");
chrta 2:d3d61d9d323e 255 if (can1.write(*msg))
chrta 2:d3d61d9d323e 256 {
chrta 4:0e2d6cc31afb 257 DEBUG_PRINT("TX1 send\r\n");
chrta 2:d3d61d9d323e 258 can1_tx_queue.free(msg);
chrta 4:0e2d6cc31afb 259 Thread::wait(50);
chrta 2:d3d61d9d323e 260 }
chrta 2:d3d61d9d323e 261 else
chrta 2:d3d61d9d323e 262 {
chrta 4:0e2d6cc31afb 263 DEBUG_PRINT("TX1 wait \r\n");
chrta 2:d3d61d9d323e 264 Thread::wait(50);
chrta 2:d3d61d9d323e 265 }
chrta 2:d3d61d9d323e 266 }
chrta 2:d3d61d9d323e 267 }
chrta 2:d3d61d9d323e 268 }
chrta 3:eb807d330292 269 #endif //CAN1_OBD_CAR_SIMULATOR
chrta 2:d3d61d9d323e 270
chrta 2:d3d61d9d323e 271 #endif //CAN1_TEST
chrta 2:d3d61d9d323e 272
chrta 2:d3d61d9d323e 273 char can_msg[8] = {0};
chrta 2:d3d61d9d323e 274 CANMessage msg(0x7E0, can_msg, 8);
chrta 1:ca506b88b1d6 275 void serial_int_handler() {
chrta 1:ca506b88b1d6 276 if (!pc.readable()) {
chrta 1:ca506b88b1d6 277 return;
chrta 1:ca506b88b1d6 278 }
chrta 1:ca506b88b1d6 279 uint8_t character = pc.getc();
chrta 2:d3d61d9d323e 280 //pc.printf("Received '%c'\r\n", character);
chrta 1:ca506b88b1d6 281
chrta 4:0e2d6cc31afb 282 msg.data[0] = 0x02;
chrta 2:d3d61d9d323e 283 msg.data[1] = 0x01;
chrta 1:ca506b88b1d6 284 char pid = 0;
chrta 1:ca506b88b1d6 285 switch (character)
chrta 1:ca506b88b1d6 286 {
chrta 1:ca506b88b1d6 287 case '1':
chrta 1:ca506b88b1d6 288 pid = 0x0C; //engine rpm
chrta 1:ca506b88b1d6 289 break;
chrta 1:ca506b88b1d6 290 case '2':
chrta 1:ca506b88b1d6 291 pid = 0x11; //throttle
chrta 1:ca506b88b1d6 292 break;
chrta 1:ca506b88b1d6 293 case '3': //oil 1
chrta 2:d3d61d9d323e 294 msg.data[1] = 0x21; //endian
chrta 1:ca506b88b1d6 295 pid = 1;
chrta 1:ca506b88b1d6 296 break;
chrta 1:ca506b88b1d6 297 case '4': //oil 2
chrta 2:d3d61d9d323e 298 msg.data[1] = 1; //endian
chrta 1:ca506b88b1d6 299 pid = 0x21;
chrta 1:ca506b88b1d6 300 break;
chrta 1:ca506b88b1d6 301 default:
chrta 1:ca506b88b1d6 302 pid = 0x05; //engine coolant temp
chrta 1:ca506b88b1d6 303 }
chrta 2:d3d61d9d323e 304 msg.data[2] = pid;
chrta 2:d3d61d9d323e 305 msg.len = 8;
chrta 1:ca506b88b1d6 306
chrta 2:d3d61d9d323e 307 //pc.printf("Sending message\r\n");
chrta 2:d3d61d9d323e 308 int result = can2.write(msg); //or 0x7DF ?
chrta 2:d3d61d9d323e 309 //pc.printf("Can write %d\r\n", result);
chrta 2:d3d61d9d323e 310 //pc.printf("ret 1\r\n");
chrta 1:ca506b88b1d6 311 }
chrta 0:6b1f6139fb25 312
chrta 0:6b1f6139fb25 313 int main() {
chrta 6:506b703a8acf 314 display.clear();
chrta 6:506b703a8acf 315 display.sendTo("Starting...\r\n");
chrta 6:506b703a8acf 316 display.display();
chrta 6:506b703a8acf 317
chrta 2:d3d61d9d323e 318 pc.baud(921600);
chrta 2:d3d61d9d323e 319 //pc.attach(&serial_int_handler);
chrta 2:d3d61d9d323e 320 can2_disable = 0;
chrta 0:6b1f6139fb25 321 can2.frequency(500000);
chrta 2:d3d61d9d323e 322 //mbed can filter is not working? check it later
chrta 2:d3d61d9d323e 323 //can2.filter
chrta 0:6b1f6139fb25 324 can2.attach(can_rx_int_handler);
chrta 0:6b1f6139fb25 325 Thread thread(led2_thread);
chrta 0:6b1f6139fb25 326 Thread can_thread(can_process_packets);
chrta 2:d3d61d9d323e 327 #ifdef CAN1_TEST
chrta 2:d3d61d9d323e 328 can1_disable = 0;
chrta 2:d3d61d9d323e 329 can1.frequency(500000);
chrta 2:d3d61d9d323e 330 can1.attach(&can1_rx_int_handler);
chrta 2:d3d61d9d323e 331 Thread can1_thread(can1_process_packets);
chrta 3:eb807d330292 332 #ifdef CAN1_OBD_CAR_SIMULATOR
chrta 2:d3d61d9d323e 333 Thread can1_tx_thread(can1_send_packets);
chrta 3:eb807d330292 334 #endif //CAN1_OBD_CAR_SIMULATOR
chrta 2:d3d61d9d323e 335 #endif //CAN1_TEST
chrta 5:0b229ba8ede5 336 Thread can2_send_request_thread(can2_send_requests);
chrta 5:0b229ba8ede5 337 Thread can2_tx_thread(can2_send_packets);
chrta 6:506b703a8acf 338 display.sendTo("Init done.\r\n");
chrta 6:506b703a8acf 339 display.display();
chrta 6:506b703a8acf 340
chrta 2:d3d61d9d323e 341 pc.printf("Start\r\n");
chrta 0:6b1f6139fb25 342 while (true) {
chrta 0:6b1f6139fb25 343 led1 = !led1;
chrta 0:6b1f6139fb25 344 Thread::wait(500);
chrta 2:d3d61d9d323e 345 if (pc.readable()) {
chrta 2:d3d61d9d323e 346 serial_int_handler();
chrta 2:d3d61d9d323e 347 }
chrta 0:6b1f6139fb25 348 }
chrta 0:6b1f6139fb25 349 }