Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed LCD_DISCO_F469NI BSP_DISCO_F469NI
main.cpp
00001 #include "mbed.h" 00002 #include "LCD_DISCO_F469NI.h" 00003 00004 // define all CAN IDs in the vehicle 00005 // DTA ID are fixed and cannot be changed 00006 #define DTA_1 0x2000 00007 #define DTA_2 0x2001 00008 #define DTA_3 0x2002 00009 #define DTA_4 0x2003 00010 #define DTA_5 0x2004 00011 #define DTA_6 0x2006 00012 // This IDs can be changed as they are our own IDs 00013 #define LVDT_FRONT 0x1000 00014 #define LVDT_REAR 0x1001 00015 #define BRAKES 0x1002 00016 // If we add some other IDs in the vehicle add them here 00017 00018 // Receive Flag 00019 uint32_t rx_flag=0x00000000; 00020 Serial pc(USBTX, USBRX); 00021 00022 // CAN Message variables, one variable for each ID 00023 // If new IDs are added, add variables for them 00024 CANMessage msgDTA1; // RPM, TPS %, Water temp C, Air temp C 00025 uint8_t msgDTA2[8]; // MAP Kpa, Lambda x1000, KPH x10, Oil P Kpa 00026 uint8_t msgDTA3[8]; // Fuel P Kpa, Oil temp C, Volts x10, Fuel Con. L/Hr x10 00027 uint8_t msgDTA4[8]; // Gear, Advance Deg x10, Injection ms x100, Fuel Con L/100km x10 00028 uint8_t msgDTA5[8]; // Ana1 mV, Ana2 mV, Ana3 mV, Cam Advance x10 00029 uint8_t msgDTA6[8]; // Cam Targ x10, Cam PWM x10, Crank Errors, Cam Errors 00030 uint8_t msgLVDTFront[8]; // Left, Right, Steering Wheel 00031 uint8_t msgLVDTRear[8]; // Left, Right 00032 uint8_t msgBrakes[8]; // Brake system preassure, Braking On/Off 00033 00034 // CAN Variables 00035 uint16_t rpm,tps,waterTemp, airTemp, map, Lambda, Volts, oilTemp, KPH, oilPress, Gear, lvdtFL, lvdtFR, lvdtRL, lvdtRR, steeringWheel, brakePress, BrakeOn; 00036 00037 // number of different IDs 00038 int noID=9; 00039 00040 // initialize LCD 00041 LCD_DISCO_F469NI lcd; 00042 // initialize internal LEDs 00043 DigitalOut led1(LED1); 00044 DigitalOut led2(LED2); 00045 // initialize CAN object 00046 CAN can1(PB_8, PB_9); 00047 00048 // CAN RX Interrupt Function 00049 void CAN_Msg_Receive(){ 00050 CANMessage tmpMsg; 00051 if (can1.read(tmpMsg)) { 00052 pc.printf("%x\n",tmpMsg.id); 00053 switch(tmpMsg.id){ 00054 case(0): 00055 rx_flag|=(1<<0); 00056 //for(int k=0;k<8;k++){ 00057 msgDTA1=tmpMsg; 00058 //}; 00059 break; 00060 case(DTA_2): 00061 rx_flag|=(1<<1); 00062 for(int k=0;k<8;k++){ 00063 msgDTA2[k]=tmpMsg.data[k]; 00064 }; 00065 break; 00066 case(DTA_3): 00067 rx_flag|=(1<<2); 00068 for(int k=0;k<8;k++){ 00069 msgDTA3[k]=tmpMsg.data[k]; 00070 }; 00071 break; 00072 case(DTA_4): 00073 rx_flag|=(1<<3); 00074 for(int k=0;k<8;k++){ 00075 msgDTA4[k]=tmpMsg.data[k]; 00076 }; 00077 break; 00078 case(DTA_5): 00079 rx_flag|=(1<<4); 00080 for(int k=0;k<8;k++){ 00081 msgDTA5[k]=tmpMsg.data[k]; 00082 }; 00083 break; 00084 case(DTA_6): 00085 rx_flag|=(1<<5); 00086 for(int k=0;k<8;k++){ 00087 msgDTA6[k]=tmpMsg.data[k]; 00088 }; 00089 break; 00090 case(LVDT_FRONT): 00091 rx_flag|=(1<<6); 00092 for(int k=0;k<8;k++){ 00093 msgLVDTFront[k]=tmpMsg.data[k]; 00094 }; 00095 break; 00096 case(LVDT_REAR): 00097 rx_flag|=(1<<7); 00098 for(int k=0;k<8;k++){ 00099 msgLVDTRear[k]=tmpMsg.data[k]; 00100 }; 00101 break; 00102 case(BRAKES): 00103 rx_flag|=(1<<8); 00104 for(int k=0;k<8;k++){ 00105 msgBrakes[k]=tmpMsg.data[k]; 00106 }; 00107 break; 00108 }; 00109 printf("%x\n",rx_flag); 00110 }; 00111 }; 00112 00113 void parse_DTA1(); 00114 void parse_DTA2(); 00115 void parse_DTA3(); 00116 void parse_DTA4(); 00117 void parse_DTA5(); 00118 void parse_DTA6(); 00119 void parse_LVDTFRONT(); 00120 void parse_LVDTREAR(); 00121 void parse_BRAKES(); 00122 00123 int main(){ 00124 // attach interrupt function to CAN RX 00125 can1.attach(&CAN_Msg_Receive,CAN::RxIrq); 00126 lcd.DisplayStringAt(0,50,(uint8_t*)"Initialised",LEFT_MODE); 00127 while(1){ 00128 // the code which checks the CAN RX Flags, and call appropriate data handler function 00129 for (int i=0;i<noID;i++){ 00130 uint8_t flagBit; 00131 flagBit = rx_flag & (1<<i); 00132 //printf("i=%d\n",i); 00133 if (flagBit==1) { 00134 00135 switch(i){ 00136 case(0): 00137 parse_DTA1(); 00138 rx_flag = rx_flag ^ (1<<0); 00139 break; 00140 case(1): 00141 parse_DTA2(); 00142 rx_flag = rx_flag ^ (1<<1); 00143 break; 00144 case(2): 00145 parse_DTA3(); 00146 rx_flag = rx_flag ^ (1<<2); 00147 break; 00148 case(3): 00149 parse_DTA4(); 00150 rx_flag = rx_flag ^ (1<<3); 00151 break; 00152 case(4): 00153 parse_DTA5(); 00154 rx_flag = rx_flag ^ (1<<4); 00155 break; 00156 case(5): 00157 parse_DTA6(); 00158 rx_flag = rx_flag ^ (1<<5); 00159 break; 00160 case(6): 00161 parse_LVDTFRONT(); 00162 rx_flag = rx_flag ^ (1<<6); 00163 break; 00164 case(7): 00165 parse_LVDTREAR(); 00166 rx_flag = rx_flag ^ (1<<7); 00167 break; 00168 case(8): 00169 parse_BRAKES(); 00170 rx_flag = rx_flag ^ (1<<8); 00171 break; 00172 // for each new id add new case statement 00173 00174 } 00175 } 00176 } 00177 00178 } 00179 }; 00180 00181 void parse_DTA1(){ 00182 rpm=(msgDTA1.data[1]<<8) | msgDTA1.data[0]; 00183 tps=(msgDTA1.data[3]<<8) | msgDTA1.data[2]; 00184 waterTemp=(msgDTA1.data[5]<<8) | msgDTA1.data[4]; 00185 airTemp=(msgDTA1.data[7]<<8) | msgDTA1.data[6]; 00186 lcd.DisplayStringAt(0,0,(uint8_t*)"DTA1",LEFT_MODE); 00187 printf("rpm=%x%x, tps=%x%x, waterTemp=%x%x, airTemp=%x%x\n",msgDTA1.data[1],msgDTA1.data[0],msgDTA1.data[3],msgDTA1.data[2],msgDTA1.data[5],msgDTA1.data[4],msgDTA1.data[7],msgDTA1.data[6]); 00188 }; 00189 00190 void parse_DTA2(){ 00191 printf("DTA2\n"); 00192 }; 00193 00194 void parse_DTA3(){ 00195 oilTemp=(msgDTA3[3]<<8) | msgDTA3[2]; 00196 Volts=(msgDTA3[5]<<8) | msgDTA3[4]; 00197 lcd.DisplayStringAt(0,0,(uint8_t*)"DTA3",LEFT_MODE); 00198 printf("oilTemp=%d, Volts=%d\n",oilTemp,Volts); 00199 }; 00200 00201 void parse_DTA4(){ 00202 printf("DTA4\n"); 00203 }; 00204 00205 void parse_DTA5(){ 00206 printf("DTA5\n"); 00207 }; 00208 00209 void parse_DTA6(){ 00210 printf("DTA6\n"); 00211 }; 00212 00213 void parse_LVDTFRONT(){ 00214 // add function which parses the received data 00215 }; 00216 00217 void parse_LVDTREAR(){ 00218 // add function which parses the received data 00219 }; 00220 00221 void parse_BRAKES(){ 00222 // add function which parses the received data 00223 }; 00224 00225 00226
Generated on Fri Jul 15 2022 11:42:44 by
1.7.2