Making a BMW E90 instrument cluster alive for demonstration purposes

Dependencies:   mbed

Committer:
gume
Date:
Thu Mar 09 12:20:25 2017 +0000
Revision:
1:a582aeb10c32
Parent:
0:830e074c92d5
Child:
2:ef9a8a114395
Serial interface

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gume 0:830e074c92d5 1 #include "mbed.h"
gume 0:830e074c92d5 2 #include "T15Msg.h"
gume 0:830e074c92d5 3
gume 0:830e074c92d5 4 Ticker ticker;
gume 0:830e074c92d5 5
gume 1:a582aeb10c32 6 Serial pc(USBTX, USBRX);
gume 0:830e074c92d5 7 DigitalOut led1(PA_5);
gume 0:830e074c92d5 8 CAN can1(PB_8, PB_9); // rd, td Transmitter
gume 0:830e074c92d5 9 T15Msg t15;
gume 0:830e074c92d5 10
gume 0:830e074c92d5 11 /*
gume 0:830e074c92d5 12 0x130 (CAS) T15 signal, 100 ms
gume 0:830e074c92d5 13 0x1B4 (Kombi) OUT? Speed status, 100 ms
gume 0:830e074c92d5 14 */
gume 0:830e074c92d5 15
gume 1:a582aeb10c32 16
gume 0:830e074c92d5 17 void sendT15() {
gume 1:a582aeb10c32 18 if (!t15.sendMessage(&can1)) {
gume 1:a582aeb10c32 19 pc.printf("Cannot send T15!\n");
gume 1:a582aeb10c32 20 }
gume 0:830e074c92d5 21 /*
gume 0:830e074c92d5 22 char data_130 [] = { 0x45, 0x42, 0x8F, 0xE2, 0xFE };
gume 0:830e074c92d5 23 char data_130 [] = { 0x45, 0x40, 0x21, 0x8F, 0x00 };
gume 0:830e074c92d5 24 */
gume 0:830e074c92d5 25 }
gume 0:830e074c92d5 26
gume 1:a582aeb10c32 27 void tick100() {
gume 1:a582aeb10c32 28 sendT15();
gume 1:a582aeb10c32 29 led1 = !led1;
gume 1:a582aeb10c32 30 }
gume 1:a582aeb10c32 31
gume 0:830e074c92d5 32 void sendLight(char mode) {
gume 0:830e074c92d5 33
gume 0:830e074c92d5 34 /*
gume 0:830e074c92d5 35 // Light
gume 0:830e074c92d5 36 CAN ID-----DATA
gume 0:830e074c92d5 37 ===== ----====
gume 0:830e074c92d5 38 21A-------00 20 F7 OFF
gume 0:830e074c92d5 39 21A-------04 22 F7 Parking light / angel eyes
gume 0:830e074c92d5 40 21A-------05 22 F7 Light on
gume 0:830e074c92d5 41 */
gume 0:830e074c92d5 42
gume 0:830e074c92d5 43 char *data;
gume 0:830e074c92d5 44 char data_21A_0 [] = { 0x00, 0x20, 0xF7 };
gume 0:830e074c92d5 45 char data_21A_1 [] = { 0x04, 0x22, 0xF7 };
gume 0:830e074c92d5 46 char data_21A_2 [] = { 0x05, 0x22, 0xF7 };
gume 0:830e074c92d5 47
gume 0:830e074c92d5 48 switch (mode) {
gume 0:830e074c92d5 49 case 1:
gume 0:830e074c92d5 50 data = data_21A_1;
gume 0:830e074c92d5 51 break;
gume 0:830e074c92d5 52 case 2:
gume 0:830e074c92d5 53 data = data_21A_2;
gume 0:830e074c92d5 54 break;
gume 0:830e074c92d5 55 default:
gume 0:830e074c92d5 56 data = data_21A_0;
gume 0:830e074c92d5 57 break;
gume 0:830e074c92d5 58 }
gume 0:830e074c92d5 59 if (can1.write(CANMessage(0x21A, data, 3))) {
gume 1:a582aeb10c32 60 pc.printf("Light sent %d\n", mode);
gume 0:830e074c92d5 61 }
gume 0:830e074c92d5 62 }
gume 0:830e074c92d5 63
gume 0:830e074c92d5 64 //Ignition status
gume 0:830e074c92d5 65 /*
gume 0:830e074c92d5 66 0[7]: engine runinng
gume 0:830e074c92d5 67 1[7]: ignition || engine running
gume 0:830e074c92d5 68 2[7]: ignition || engine running
gume 0:830e074c92d5 69 2[654312]: 111111
gume 0:830e074c92d5 70 3: 0x50
gume 0:830e074c92d5 71 4-7: 0xff
gume 0:830e074c92d5 72 */
gume 0:830e074c92d5 73
gume 0:830e074c92d5 74 /*
gume 0:830e074c92d5 75 // Ignition
gume 0:830e074c92d5 76 char data_26E [] = { 0x40, 0x40, 0x4F, 0x50, 0xFF, 0xFF, 0xFF, 0xFF };
gume 0:830e074c92d5 77 if(can1.write(CANMessage(0x26E, data_26E, 8))) {
gume 0:830e074c92d5 78 printf("Ignition sent \n");
gume 0:830e074c92d5 79 }
gume 0:830e074c92d5 80 */
gume 0:830e074c92d5 81
gume 0:830e074c92d5 82 /*
gume 0:830e074c92d5 83 // RPM
gume 0:830e074c92d5 84 char data_0A5 [] = { 0xCD, 0xD5, 0xEC, 0xC7, 0x7E, 0x34, 0x0C, 0xF1 };
gume 0:830e074c92d5 85 if(can1.write(CANMessage(0x0A5, data_0A5, 8))) {
gume 0:830e074c92d5 86 printf("RPM sent \n");
gume 0:830e074c92d5 87 }
gume 0:830e074c92d5 88 */
gume 0:830e074c92d5 89
gume 0:830e074c92d5 90 /*
gume 0:830e074c92d5 91 // Speed
gume 0:830e074c92d5 92 char data_1A6 [] = { 0x13, 0x4D, 0x46, 0x4D, 0x33, 0x4D, 0xD0, 0xFF };
gume 0:830e074c92d5 93 if(can1.write(CANMessage(0x1A6, data_1A6, 8))) {
gume 0:830e074c92d5 94 printf("Speed sent \n");
gume 0:830e074c92d5 95 }
gume 0:830e074c92d5 96 */
gume 0:830e074c92d5 97
gume 0:830e074c92d5 98 /*
gume 0:830e074c92d5 99 // Door
gume 0:830e074c92d5 100 char data_2FC [] = { 0x81, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF };
gume 0:830e074c92d5 101 if(can1.write(CANMessage(0x2FC, data_2FC, 7))) {
gume 0:830e074c92d5 102 printf("Door sent \n");
gume 0:830e074c92d5 103 }
gume 0:830e074c92d5 104 */
gume 0:830e074c92d5 105
gume 0:830e074c92d5 106 /*
gume 0:830e074c92d5 107 // HB
gume 0:830e074c92d5 108 char data_34F [] = { 0xFE, 0xFF };
gume 0:830e074c92d5 109 //data_34F[0] = counter;
gume 0:830e074c92d5 110 if(can1.write(CANMessage(0x34F, data_34F, 2))) {
gume 0:830e074c92d5 111 printf("HB sent \n");
gume 0:830e074c92d5 112 }
gume 0:830e074c92d5 113 */
gume 0:830e074c92d5 114
gume 0:830e074c92d5 115 /*
gume 0:830e074c92d5 116 //char data_349 [] = { 0x76, 0x0F, 0xBE, 0x1A, 0x00 };
gume 0:830e074c92d5 117 char data_349 [] = { 0x00, 0x00, 0xBE, 0x1A, 0x00 };
gume 0:830e074c92d5 118 //data_349[0] = timer14_v;
gume 0:830e074c92d5 119 //data_349[1] = timer14_v;
gume 0:830e074c92d5 120 // data_349[0] = counter;
gume 0:830e074c92d5 121 if(can1.write(CANMessage(0x349, data_349, 5))) {
gume 0:830e074c92d5 122 printf("Fuel sent \n");
gume 0:830e074c92d5 123 }
gume 0:830e074c92d5 124 */
gume 0:830e074c92d5 125
gume 1:a582aeb10c32 126 bool sendMessage(int id, char *data, int len) {
gume 1:a582aeb10c32 127
gume 1:a582aeb10c32 128 pc.printf("Sending message: %01X:%02X, ", id >> 8, id & 0xff);
gume 1:a582aeb10c32 129 for (int i = 0; i < len; i++) pc.printf("%02X ", data[i]);
gume 1:a582aeb10c32 130 pc.printf("\r\n");
gume 1:a582aeb10c32 131
gume 1:a582aeb10c32 132 return can1.write(CANMessage(id, data, len));
gume 1:a582aeb10c32 133 }
gume 1:a582aeb10c32 134
gume 1:a582aeb10c32 135
gume 0:830e074c92d5 136 //**********The main program*********************
gume 1:a582aeb10c32 137
gume 1:a582aeb10c32 138 void doCommand(char *command) {
gume 1:a582aeb10c32 139
gume 1:a582aeb10c32 140 pc.printf("Command: %s\r\n", command);
gume 1:a582aeb10c32 141 for (int j = 0;;j++) {
gume 1:a582aeb10c32 142 pc.printf("%02x ", command[j]);
gume 1:a582aeb10c32 143 if (command[j] == 0) break;
gume 1:a582aeb10c32 144 }
gume 1:a582aeb10c32 145 pc.printf("\r\n");
gume 1:a582aeb10c32 146
gume 1:a582aeb10c32 147 if (strcmp(command, "START") == 0) {
gume 1:a582aeb10c32 148 pc.printf("Start\r\n");
gume 1:a582aeb10c32 149 t15.start();
gume 1:a582aeb10c32 150 }
gume 1:a582aeb10c32 151
gume 1:a582aeb10c32 152 else if (strcmp(command, "STOP") == 0) {
gume 1:a582aeb10c32 153 pc.printf("Stop\n");
gume 1:a582aeb10c32 154 t15.stop();
gume 1:a582aeb10c32 155 }
gume 1:a582aeb10c32 156
gume 1:a582aeb10c32 157 else if (command[0] == 'L') {
gume 1:a582aeb10c32 158 int mode = command[1] - '0';
gume 1:a582aeb10c32 159 sendLight(mode);
gume 1:a582aeb10c32 160 }
gume 1:a582aeb10c32 161
gume 1:a582aeb10c32 162 else if (command[0] == 'M') {
gume 1:a582aeb10c32 163 int i = 1, l = 0;
gume 1:a582aeb10c32 164 char hexmsg[20];
gume 1:a582aeb10c32 165 char canmsg[8];
gume 1:a582aeb10c32 166 int id;
gume 1:a582aeb10c32 167
gume 1:a582aeb10c32 168 while (i < strlen(command)) {
gume 1:a582aeb10c32 169 char h = command[i++];
gume 1:a582aeb10c32 170 if (h < '0' || h > 'F') continue;
gume 1:a582aeb10c32 171 if (h >= 'A') hexmsg[l++] = 10 + (h - 'A');
gume 1:a582aeb10c32 172 else hexmsg[l++] = h - '0';
gume 1:a582aeb10c32 173 }
gume 1:a582aeb10c32 174 i = 0;
gume 1:a582aeb10c32 175 id = (int) (hexmsg[0] & 0x0f) << 8 + (int) (hexmsg[1] & 0x0f) << 4 + (hexmsg[2] & 0x0f);
gume 1:a582aeb10c32 176 while (i < (l-3) / 2) {
gume 1:a582aeb10c32 177 canmsg[i] = ((hexmsg[3 + i * 2] & 0x0f) << 4) | (hexmsg[3 + i * 2 + 1] & 0x0f);
gume 1:a582aeb10c32 178 i++;
gume 1:a582aeb10c32 179 }
gume 1:a582aeb10c32 180 sendMessage(id, canmsg, (l-3) / 2);
gume 1:a582aeb10c32 181 }
gume 1:a582aeb10c32 182 }
gume 1:a582aeb10c32 183
gume 0:830e074c92d5 184 int main() {
gume 0:830e074c92d5 185
gume 1:a582aeb10c32 186 pc.baud(115200);
gume 0:830e074c92d5 187 can1.frequency(100000);
gume 1:a582aeb10c32 188 ticker.attach(&tick100, 0.1); //Send messages every 100 msec
gume 1:a582aeb10c32 189 pc.printf("T15 started\r\n");
gume 1:a582aeb10c32 190
gume 1:a582aeb10c32 191 char buffer[128];
gume 1:a582aeb10c32 192 int bufferlen = 0;
gume 0:830e074c92d5 193
gume 1:a582aeb10c32 194 while (1) {
gume 1:a582aeb10c32 195 if (pc.readable()) {
gume 1:a582aeb10c32 196 char c = pc.getc();
gume 1:a582aeb10c32 197 pc.putc(c); // Local ECHO
gume 1:a582aeb10c32 198 if (c == '\r') {
gume 1:a582aeb10c32 199 buffer[bufferlen] = 0;
gume 1:a582aeb10c32 200 doCommand(buffer);
gume 1:a582aeb10c32 201 bufferlen = 0;
gume 1:a582aeb10c32 202 } else {
gume 1:a582aeb10c32 203 buffer[bufferlen++] = c;
gume 1:a582aeb10c32 204 }
gume 1:a582aeb10c32 205 }
gume 1:a582aeb10c32 206 }
gume 1:a582aeb10c32 207
gume 0:830e074c92d5 208 }