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
main.cpp@7:a19b63c0a0fa, 2014-05-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |