f211
Fork of OBD21121 by
main.cpp@8:cc3cb620c3bd, 2017-04-28 (annotated)
- Committer:
- takeuz
- Date:
- Fri Apr 28 08:42:35 2017 +0000
- Revision:
- 8:cc3cb620c3bd
- Parent:
- 7:42cb4b01909c
- Child:
- 9:a3bdc9a71466
New Version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
takeuz | 0:ccd2474129f2 | 1 | #include "mbed.h" |
takeuz | 2:d58ef72b4ab0 | 2 | #include "functions.h" |
takeuz | 2:d58ef72b4ab0 | 3 | |
takeuz | 2:d58ef72b4ab0 | 4 | #define PID_REQUEST 0x7DF |
takeuz | 2:d58ef72b4ab0 | 5 | #define PID_REPLY 0x7E8 |
takeuz | 2:d58ef72b4ab0 | 6 | |
takeuz | 8:cc3cb620c3bd | 7 | #define CANSPEED_500 500000 |
takeuz | 8:cc3cb620c3bd | 8 | #define CANSPEED_250 250000 |
takeuz | 8:cc3cb620c3bd | 9 | #define CANSPEED_125 125000 |
takeuz | 2:d58ef72b4ab0 | 10 | #define sendDebugMessage 1 |
takeuz | 2:d58ef72b4ab0 | 11 | #define pushDebugData 1 |
takeuz | 2:d58ef72b4ab0 | 12 | |
takeuz | 8:cc3cb620c3bd | 13 | const int canSpeeds[3]= {CANSPEED_125,CANSPEED_500,CANSPEED_250}; |
takeuz | 8:cc3cb620c3bd | 14 | Serial serialPorts[2] = {Serial(P0_11,P0_13),Serial(P0_15,P0_14)}; |
takeuz | 8:cc3cb620c3bd | 15 | Serial *kLineUART=NULL; |
takeuz | 8:cc3cb620c3bd | 16 | DigitalOut *klineWakeup=new DigitalOut(P0_28); |
takeuz | 8:cc3cb620c3bd | 17 | CAN canBus(P0_22, P0_23); |
takeuz | 2:d58ef72b4ab0 | 18 | |
takeuz | 8:cc3cb620c3bd | 19 | Ticker timeCounter; |
takeuz | 8:cc3cb620c3bd | 20 | Timer OBDTimer; |
takeuz | 8:cc3cb620c3bd | 21 | CANMessage can_MsgRx; |
takeuz | 8:cc3cb620c3bd | 22 | char kLineCmd[6]= {'\0','\0','\0','\0','\0','\0'}; |
takeuz | 7:42cb4b01909c | 23 | |
takeuz | 8:cc3cb620c3bd | 24 | void clearOBDCommand(); |
takeuz | 8:cc3cb620c3bd | 25 | void flushBuffer(); |
takeuz | 7:42cb4b01909c | 26 | void sendCommandToVehicle(char *_cmd); |
takeuz | 8:cc3cb620c3bd | 27 | void setKLineMsg(char *_cmd); |
takeuz | 8:cc3cb620c3bd | 28 | void flushBuffer(); |
takeuz | 8:cc3cb620c3bd | 29 | void kLinekeepalive(); |
takeuz | 8:cc3cb620c3bd | 30 | char tolower(unsigned char ch); |
takeuz | 7:42cb4b01909c | 31 | int findStringLength(char *_cmd); |
takeuz | 2:d58ef72b4ab0 | 32 | |
takeuz | 8:cc3cb620c3bd | 33 | int isPoweredupNow=1; |
takeuz | 2:d58ef72b4ab0 | 34 | int interFace=1; |
takeuz | 7:42cb4b01909c | 35 | int debug=1; |
takeuz | 2:d58ef72b4ab0 | 36 | int currentOBDProtocol=0; |
takeuz | 2:d58ef72b4ab0 | 37 | const int protCan=1; |
takeuz | 7:42cb4b01909c | 38 | const int protkLine9141=2; |
takeuz | 7:42cb4b01909c | 39 | const int protkLine14230=3; |
takeuz | 2:d58ef72b4ab0 | 40 | int canFrequency; |
takeuz | 7:42cb4b01909c | 41 | int cmd; |
takeuz | 2:d58ef72b4ab0 | 42 | char can_msg[8]; |
takeuz | 2:d58ef72b4ab0 | 43 | char *incomingDataInInterFace; |
takeuz | 2:d58ef72b4ab0 | 44 | const int incomingDataInInterFaceSize=256; |
takeuz | 2:d58ef72b4ab0 | 45 | int incomingDataInInterFaceCounter=0; |
takeuz | 8:cc3cb620c3bd | 46 | char * incomingDataInOBD; |
takeuz | 2:d58ef72b4ab0 | 47 | const int incomingDataInOBDSize=256; |
takeuz | 2:d58ef72b4ab0 | 48 | int incomingDataInOBDCounter=0; |
takeuz | 2:d58ef72b4ab0 | 49 | const int waitTimeForOBDComm=2000; |
takeuz | 2:d58ef72b4ab0 | 50 | const int sleepTime=25000; |
takeuz | 2:d58ef72b4ab0 | 51 | const int powerSaveTime=120; |
takeuz | 2:d58ef72b4ab0 | 52 | int OBDCmdReceived=0; |
takeuz | 2:d58ef72b4ab0 | 53 | int interfaceCmdReceived=0; |
takeuz | 2:d58ef72b4ab0 | 54 | int lastOBDCmdRcvdTime=0; |
takeuz | 2:d58ef72b4ab0 | 55 | int lastInterfaceCmdRcvdTime=0; |
takeuz | 8:cc3cb620c3bd | 56 | int KlineReadCount=0; |
takeuz | 8:cc3cb620c3bd | 57 | int isVehicleCommandProcessing=0; |
takeuz | 8:cc3cb620c3bd | 58 | int kLineCommandCount=0; |
takeuz | 8:cc3cb620c3bd | 59 | char kByte=0; |
takeuz | 4:3e1e2b161403 | 60 | |
takeuz | 2:d58ef72b4ab0 | 61 | void readInterface() |
takeuz | 2:d58ef72b4ab0 | 62 | { |
takeuz | 2:d58ef72b4ab0 | 63 | char c; |
takeuz | 2:d58ef72b4ab0 | 64 | while(serialPorts[interFace].readable()) { |
takeuz | 2:d58ef72b4ab0 | 65 | lastInterfaceCmdRcvdTime=0; |
takeuz | 2:d58ef72b4ab0 | 66 | c = serialPorts[interFace].getc(); |
takeuz | 7:42cb4b01909c | 67 | |
takeuz | 7:42cb4b01909c | 68 | serialPorts[debug].putc(c); |
takeuz | 8:cc3cb620c3bd | 69 | |
takeuz | 6:741524d110fe | 70 | if(incomingDataInInterFaceCounter<incomingDataInInterFaceSize && c!='\r' && c!='\n') { |
takeuz | 2:d58ef72b4ab0 | 71 | incomingDataInInterFace[incomingDataInInterFaceCounter] = c; |
takeuz | 2:d58ef72b4ab0 | 72 | } |
takeuz | 2:d58ef72b4ab0 | 73 | incomingDataInInterFaceCounter++; |
takeuz | 4:3e1e2b161403 | 74 | |
takeuz | 7:42cb4b01909c | 75 | if(c=='\r') { |
takeuz | 2:d58ef72b4ab0 | 76 | interfaceCmdReceived=1; |
takeuz | 7:42cb4b01909c | 77 | serialPorts[debug].puts("nl\r\n"); |
takeuz | 2:d58ef72b4ab0 | 78 | } |
takeuz | 2:d58ef72b4ab0 | 79 | |
takeuz | 2:d58ef72b4ab0 | 80 | } |
takeuz | 2:d58ef72b4ab0 | 81 | } |
takeuz | 2:d58ef72b4ab0 | 82 | |
takeuz | 4:3e1e2b161403 | 83 | void canReader() |
takeuz | 4:3e1e2b161403 | 84 | { |
takeuz | 2:d58ef72b4ab0 | 85 | if (canBus.read(can_MsgRx)) { |
takeuz | 2:d58ef72b4ab0 | 86 | lastOBDCmdRcvdTime=0; |
takeuz | 8:cc3cb620c3bd | 87 | if ((can_MsgRx.id == PID_REPLY)) { |
takeuz | 7:42cb4b01909c | 88 | OBDCmdReceived=1; |
takeuz | 8:cc3cb620c3bd | 89 | for (int i = 0; i < (int)can_MsgRx.len && currentOBDProtocol!=0; i++) { |
takeuz | 8:cc3cb620c3bd | 90 | char c[2]; |
takeuz | 8:cc3cb620c3bd | 91 | sprintf(c, "%02X",can_MsgRx.data[i]); |
takeuz | 8:cc3cb620c3bd | 92 | serialPorts[interFace].puts(c); |
takeuz | 2:d58ef72b4ab0 | 93 | } |
takeuz | 2:d58ef72b4ab0 | 94 | } |
takeuz | 2:d58ef72b4ab0 | 95 | } |
takeuz | 2:d58ef72b4ab0 | 96 | } |
takeuz | 2:d58ef72b4ab0 | 97 | |
takeuz | 8:cc3cb620c3bd | 98 | void readKLine() |
takeuz | 8:cc3cb620c3bd | 99 | { |
takeuz | 8:cc3cb620c3bd | 100 | char c; |
takeuz | 8:cc3cb620c3bd | 101 | while(kLineUART->readable()) { |
takeuz | 8:cc3cb620c3bd | 102 | c=kLineUART->getc(); |
takeuz | 8:cc3cb620c3bd | 103 | serialPorts[interFace].printf("%02x",c); |
takeuz | 8:cc3cb620c3bd | 104 | } |
takeuz | 8:cc3cb620c3bd | 105 | } |
takeuz | 8:cc3cb620c3bd | 106 | |
takeuz | 8:cc3cb620c3bd | 107 | |
takeuz | 4:3e1e2b161403 | 108 | void timeCounterFunction() |
takeuz | 4:3e1e2b161403 | 109 | { |
takeuz | 2:d58ef72b4ab0 | 110 | lastInterfaceCmdRcvdTime++; |
takeuz | 2:d58ef72b4ab0 | 111 | lastOBDCmdRcvdTime++; |
takeuz | 7:42cb4b01909c | 112 | KlineReadCount++; |
takeuz | 8:cc3cb620c3bd | 113 | if(currentOBDProtocol==protkLine14230 && KlineReadCount>=3) { |
takeuz | 7:42cb4b01909c | 114 | KlineReadCount=0; |
takeuz | 8:cc3cb620c3bd | 115 | if(incomingDataInInterFaceCounter) { |
takeuz | 7:42cb4b01909c | 116 | return; |
takeuz | 7:42cb4b01909c | 117 | } |
takeuz | 8:cc3cb620c3bd | 118 | kLinekeepalive(); |
takeuz | 7:42cb4b01909c | 119 | } |
takeuz | 8:cc3cb620c3bd | 120 | |
takeuz | 2:d58ef72b4ab0 | 121 | } |
takeuz | 0:ccd2474129f2 | 122 | |
takeuz | 4:3e1e2b161403 | 123 | int main() |
takeuz | 4:3e1e2b161403 | 124 | { |
takeuz | 8:cc3cb620c3bd | 125 | serialPorts[interFace].baud(9600); |
takeuz | 7:42cb4b01909c | 126 | serialPorts[debug].puts("f2119\r\n"); |
takeuz | 2:d58ef72b4ab0 | 127 | incomingDataInInterFace=(char *)malloc(incomingDataInInterFaceSize*sizeof(char)); |
takeuz | 2:d58ef72b4ab0 | 128 | incomingDataInOBD=(char *)malloc(incomingDataInOBDSize*sizeof(char)); |
takeuz | 8:cc3cb620c3bd | 129 | *klineWakeup=0; |
takeuz | 2:d58ef72b4ab0 | 130 | |
takeuz | 2:d58ef72b4ab0 | 131 | clearMemoryLocation(incomingDataInInterFace,incomingDataInInterFaceSize); |
takeuz | 4:3e1e2b161403 | 132 | clearMemoryLocation(incomingDataInOBD,incomingDataInOBDSize); |
takeuz | 8:cc3cb620c3bd | 133 | wait_ms(300); |
takeuz | 2:d58ef72b4ab0 | 134 | timeCounter.attach(&timeCounterFunction, 1.0); |
takeuz | 2:d58ef72b4ab0 | 135 | serialPorts[interFace].attach(&readInterface); |
takeuz | 7:42cb4b01909c | 136 | serialPorts[interFace].puts("TU211 v1.0\r\n"); |
takeuz | 0:ccd2474129f2 | 137 | while(1) { |
takeuz | 7:42cb4b01909c | 138 | if(interfaceCmdReceived && checkForLocalInterfaceCommand()) { |
takeuz | 8:cc3cb620c3bd | 139 | serialPorts[debug].puts("Going to clear UART data\r\n"); |
takeuz | 7:42cb4b01909c | 140 | clearInterfaceCommand(); |
takeuz | 8:cc3cb620c3bd | 141 | serialPorts[debug].puts("UART data cleared\r\n"); |
takeuz | 7:42cb4b01909c | 142 | } |
takeuz | 8:cc3cb620c3bd | 143 | if(currentOBDProtocol==0 && isPoweredupNow) { |
takeuz | 8:cc3cb620c3bd | 144 | isPoweredupNow=0; |
takeuz | 4:3e1e2b161403 | 145 | #if sendDebugMessage |
takeuz | 4:3e1e2b161403 | 146 | serialPorts[debug].puts("Going to figure protocol\r\n"); |
takeuz | 4:3e1e2b161403 | 147 | #endif |
takeuz | 2:d58ef72b4ab0 | 148 | serialPorts[debug].puts("Searching...\r\n"); |
takeuz | 2:d58ef72b4ab0 | 149 | checkCommunicationProtocol(); |
takeuz | 4:3e1e2b161403 | 150 | if(!currentOBDProtocol) { |
takeuz | 4:3e1e2b161403 | 151 | #if sendDebugMessage |
takeuz | 4:3e1e2b161403 | 152 | serialPorts[debug].puts("!Unknownprotocol\r\n"); |
takeuz | 4:3e1e2b161403 | 153 | #endif |
takeuz | 7:42cb4b01909c | 154 | } else if(currentOBDProtocol==protCan) { |
takeuz | 7:42cb4b01909c | 155 | #if sendDebugMessage |
takeuz | 7:42cb4b01909c | 156 | serialPorts[debug].puts("can Protocol\r\n"); |
takeuz | 7:42cb4b01909c | 157 | #endif |
takeuz | 7:42cb4b01909c | 158 | serialPorts[interFace].puts("OK\r\n"); |
takeuz | 8:cc3cb620c3bd | 159 | } else if(currentOBDProtocol==protkLine14230) { |
takeuz | 7:42cb4b01909c | 160 | #if sendDebugMessage |
takeuz | 7:42cb4b01909c | 161 | serialPorts[debug].puts("Kline Protocol\r\n"); |
takeuz | 7:42cb4b01909c | 162 | #endif |
takeuz | 2:d58ef72b4ab0 | 163 | } |
takeuz | 2:d58ef72b4ab0 | 164 | } |
takeuz | 7:42cb4b01909c | 165 | if(interfaceCmdReceived && checkForLocalInterfaceCommand()) { |
takeuz | 7:42cb4b01909c | 166 | serialPorts[debug].puts("Going to clear UART data\r\n"); |
takeuz | 7:42cb4b01909c | 167 | clearInterfaceCommand(); |
takeuz | 7:42cb4b01909c | 168 | serialPorts[debug].puts("UART data cleared\r\n"); |
takeuz | 2:d58ef72b4ab0 | 169 | } |
takeuz | 7:42cb4b01909c | 170 | if(interfaceCmdReceived && currentOBDProtocol) { |
takeuz | 7:42cb4b01909c | 171 | serialPorts[debug].puts("Going to process user command\r\n"); |
takeuz | 7:42cb4b01909c | 172 | clearOBDCommand(); |
takeuz | 8:cc3cb620c3bd | 173 | if(currentOBDProtocol==protCan) { |
takeuz | 7:42cb4b01909c | 174 | processUserCommand(); |
takeuz | 8:cc3cb620c3bd | 175 | } else if(currentOBDProtocol==protkLine14230) { |
takeuz | 7:42cb4b01909c | 176 | while(isVehicleCommandProcessing); |
takeuz | 7:42cb4b01909c | 177 | flushBuffer(); |
takeuz | 8:cc3cb620c3bd | 178 | /*kLineUART->attach(NULL); |
takeuz | 8:cc3cb620c3bd | 179 | kLineUART->attach(&readKLine);*/ |
takeuz | 7:42cb4b01909c | 180 | sendCommandToVehicle(incomingDataInInterFace); |
takeuz | 7:42cb4b01909c | 181 | wait_ms(500); |
takeuz | 7:42cb4b01909c | 182 | serialPorts[debug].printf("\r\n"); |
takeuz | 8:cc3cb620c3bd | 183 | } else { |
takeuz | 8:cc3cb620c3bd | 184 | clearInterfaceCommand(); |
takeuz | 8:cc3cb620c3bd | 185 | serialPorts[interFace].puts("?\r\n"); |
takeuz | 8:cc3cb620c3bd | 186 | #if sendDebugMessage |
takeuz | 8:cc3cb620c3bd | 187 | serialPorts[debug].puts("?\r\n"); |
takeuz | 8:cc3cb620c3bd | 188 | #endif |
takeuz | 2:d58ef72b4ab0 | 189 | } |
takeuz | 8:cc3cb620c3bd | 190 | } else if(interfaceCmdReceived) { |
takeuz | 7:42cb4b01909c | 191 | clearInterfaceCommand(); |
takeuz | 7:42cb4b01909c | 192 | serialPorts[interFace].puts("?\r\n"); |
takeuz | 7:42cb4b01909c | 193 | #if sendDebugMessage |
takeuz | 7:42cb4b01909c | 194 | serialPorts[debug].puts("?\r\n"); |
takeuz | 7:42cb4b01909c | 195 | #endif |
takeuz | 2:d58ef72b4ab0 | 196 | } |
takeuz | 8:cc3cb620c3bd | 197 | sleepProcess(); |
takeuz | 8:cc3cb620c3bd | 198 | /*if(lastOBDCmdRcvdTime> powerSaveTime && lastInterfaceCmdRcvdTime> powerSaveTime ) { |
takeuz | 2:d58ef72b4ab0 | 199 | powerSaveMode(); |
takeuz | 7:42cb4b01909c | 200 | } else { |
takeuz | 7:42cb4b01909c | 201 | sleepProcess(); |
takeuz | 7:42cb4b01909c | 202 | }*/ |
takeuz | 0:ccd2474129f2 | 203 | } |
takeuz | 0:ccd2474129f2 | 204 | } |
takeuz | 4:3e1e2b161403 | 205 | void checkCommunicationProtocol() |
takeuz | 4:3e1e2b161403 | 206 | { |
takeuz | 8:cc3cb620c3bd | 207 | /* #if sendDebugMessage |
takeuz | 8:cc3cb620c3bd | 208 | serialPorts[debug].puts("check Communication protocal ENT\r\n"); |
takeuz | 8:cc3cb620c3bd | 209 | #endif*/ |
takeuz | 2:d58ef72b4ab0 | 210 | int i=0; |
takeuz | 4:3e1e2b161403 | 211 | do { |
takeuz | 4:3e1e2b161403 | 212 | #if sendDebugMessage |
takeuz | 2:d58ef72b4ab0 | 213 | serialPorts[debug].puts("CanBusCheck\r\n"); |
takeuz | 4:3e1e2b161403 | 214 | #endif |
takeuz | 8:cc3cb620c3bd | 215 | canBus.reset(); |
takeuz | 7:42cb4b01909c | 216 | canBus.frequency(canSpeeds[i]); |
takeuz | 8:cc3cb620c3bd | 217 | canBus.attach(NULL); |
takeuz | 7:42cb4b01909c | 218 | canBus.attach(&canReader); |
takeuz | 2:d58ef72b4ab0 | 219 | OBDTimer.reset(); |
takeuz | 2:d58ef72b4ab0 | 220 | OBDTimer.start(); |
takeuz | 2:d58ef72b4ab0 | 221 | OBDCmdReceived=0; |
takeuz | 7:42cb4b01909c | 222 | setCanMessage("010D"); |
takeuz | 2:d58ef72b4ab0 | 223 | if (canBus.write(CANMessage(PID_REQUEST, can_msg, 8))) { |
takeuz | 8:cc3cb620c3bd | 224 | /*#if sendDebugMessage |
takeuz | 8:cc3cb620c3bd | 225 | serialPorts[debug].printf("OBDTIMER:%d\r\n",OBDTimer.read_ms()); |
takeuz | 8:cc3cb620c3bd | 226 | #endif*/ |
takeuz | 4:3e1e2b161403 | 227 | while(OBDTimer.read_ms() < waitTimeForOBDComm) { |
takeuz | 4:3e1e2b161403 | 228 | if(OBDCmdReceived) { |
takeuz | 2:d58ef72b4ab0 | 229 | currentOBDProtocol=protCan; |
takeuz | 4:3e1e2b161403 | 230 | canFrequency=i; |
takeuz | 8:cc3cb620c3bd | 231 | break; |
takeuz | 2:d58ef72b4ab0 | 232 | } |
takeuz | 2:d58ef72b4ab0 | 233 | } |
takeuz | 2:d58ef72b4ab0 | 234 | } |
takeuz | 2:d58ef72b4ab0 | 235 | wait_ms(200); |
takeuz | 4:3e1e2b161403 | 236 | i++; |
takeuz | 8:cc3cb620c3bd | 237 | } while(i<3 && canFrequency==0); |
takeuz | 2:d58ef72b4ab0 | 238 | OBDTimer.stop(); |
takeuz | 8:cc3cb620c3bd | 239 | canBus.attach(NULL); |
takeuz | 8:cc3cb620c3bd | 240 | if(!currentOBDProtocol) { |
takeuz | 7:42cb4b01909c | 241 | //Kline interface check |
takeuz | 7:42cb4b01909c | 242 | initializeKLine(); |
takeuz | 7:42cb4b01909c | 243 | } |
takeuz | 4:3e1e2b161403 | 244 | #if sendDebugMessage |
takeuz | 2:d58ef72b4ab0 | 245 | serialPorts[debug].puts("check Communication protocal EXT\r\n"); |
takeuz | 4:3e1e2b161403 | 246 | #endif |
takeuz | 2:d58ef72b4ab0 | 247 | } |
takeuz | 2:d58ef72b4ab0 | 248 | void clearMemoryLocation( char *base, int _size) |
takeuz | 2:d58ef72b4ab0 | 249 | { |
takeuz | 2:d58ef72b4ab0 | 250 | for(int forCount=0; forCount<_size; forCount++) { |
takeuz | 2:d58ef72b4ab0 | 251 | base[forCount]='\0'; |
takeuz | 2:d58ef72b4ab0 | 252 | } |
takeuz | 2:d58ef72b4ab0 | 253 | } |
takeuz | 7:42cb4b01909c | 254 | void setCanMessage(char* _cmd) |
takeuz | 4:3e1e2b161403 | 255 | { |
takeuz | 8:cc3cb620c3bd | 256 | serialPorts[debug].puts("user Command :"); |
takeuz | 8:cc3cb620c3bd | 257 | serialPorts[debug].puts(_cmd); |
takeuz | 8:cc3cb620c3bd | 258 | serialPorts[debug].puts("\r\n"); |
takeuz | 8:cc3cb620c3bd | 259 | int len=findStringLength(_cmd)/2; |
takeuz | 7:42cb4b01909c | 260 | char _mode[2]=""; |
takeuz | 7:42cb4b01909c | 261 | for(int i=0; i<2; i++) { |
takeuz | 7:42cb4b01909c | 262 | _mode[i]=_cmd[i]; |
takeuz | 7:42cb4b01909c | 263 | } |
takeuz | 7:42cb4b01909c | 264 | int mode=strtol(_mode,NULL, 16); |
takeuz | 7:42cb4b01909c | 265 | cmd=strtol((_cmd+2),NULL, 16); |
takeuz | 8:cc3cb620c3bd | 266 | can_msg[0] = len; |
takeuz | 7:42cb4b01909c | 267 | can_msg[1] = mode; |
takeuz | 7:42cb4b01909c | 268 | can_msg[2] = cmd; |
takeuz | 4:3e1e2b161403 | 269 | can_msg[3] = 0; |
takeuz | 4:3e1e2b161403 | 270 | can_msg[4] = 0; |
takeuz | 4:3e1e2b161403 | 271 | can_msg[5] = 0; |
takeuz | 4:3e1e2b161403 | 272 | can_msg[6] = 0; |
takeuz | 4:3e1e2b161403 | 273 | can_msg[7] = 0; |
takeuz | 2:d58ef72b4ab0 | 274 | } |
takeuz | 7:42cb4b01909c | 275 | void processUserCommand() |
takeuz | 4:3e1e2b161403 | 276 | { |
takeuz | 7:42cb4b01909c | 277 | OBDTimer.reset(); |
takeuz | 7:42cb4b01909c | 278 | setCanMessage(incomingDataInInterFace); |
takeuz | 7:42cb4b01909c | 279 | OBDTimer.start(); |
takeuz | 7:42cb4b01909c | 280 | OBDCmdReceived=0; |
takeuz | 8:cc3cb620c3bd | 281 | canBus.attach(NULL); |
takeuz | 8:cc3cb620c3bd | 282 | canBus.attach(&canReader); |
takeuz | 7:42cb4b01909c | 283 | if (canBus.write(CANMessage(PID_REQUEST, can_msg, 8))) { |
takeuz | 7:42cb4b01909c | 284 | while(OBDTimer.read_ms() < waitTimeForOBDComm) { |
takeuz | 7:42cb4b01909c | 285 | if(OBDCmdReceived) { |
takeuz | 7:42cb4b01909c | 286 | clearInterfaceCommand(); |
takeuz | 7:42cb4b01909c | 287 | break; |
takeuz | 7:42cb4b01909c | 288 | } |
takeuz | 7:42cb4b01909c | 289 | } |
takeuz | 7:42cb4b01909c | 290 | } |
takeuz | 7:42cb4b01909c | 291 | OBDTimer.stop(); |
takeuz | 7:42cb4b01909c | 292 | if(!OBDCmdReceived) { |
takeuz | 7:42cb4b01909c | 293 | clearInterfaceCommand(); |
takeuz | 8:cc3cb620c3bd | 294 | serialPorts[interFace].puts("?"); |
takeuz | 7:42cb4b01909c | 295 | } |
takeuz | 8:cc3cb620c3bd | 296 | serialPorts[interFace].puts("\r\n"); |
takeuz | 2:d58ef72b4ab0 | 297 | } |
takeuz | 4:3e1e2b161403 | 298 | void sleepProcess() |
takeuz | 4:3e1e2b161403 | 299 | { |
takeuz | 4:3e1e2b161403 | 300 | |
takeuz | 2:d58ef72b4ab0 | 301 | #if pushDebugData |
takeuz | 2:d58ef72b4ab0 | 302 | serialPorts[debug].puts("SPe\r\n"); |
takeuz | 2:d58ef72b4ab0 | 303 | #endif |
takeuz | 2:d58ef72b4ab0 | 304 | OBDTimer.reset(); |
takeuz | 2:d58ef72b4ab0 | 305 | OBDTimer.start(); |
takeuz | 4:3e1e2b161403 | 306 | while(OBDTimer.read_ms()<sleepTime && !interfaceCmdReceived) { |
takeuz | 2:d58ef72b4ab0 | 307 | wait_ms(50); |
takeuz | 2:d58ef72b4ab0 | 308 | } |
takeuz | 2:d58ef72b4ab0 | 309 | OBDTimer.stop(); |
takeuz | 2:d58ef72b4ab0 | 310 | } |
takeuz | 2:d58ef72b4ab0 | 311 | |
takeuz | 4:3e1e2b161403 | 312 | void powerSaveMode() |
takeuz | 4:3e1e2b161403 | 313 | { |
takeuz | 2:d58ef72b4ab0 | 314 | #if pushDebugData |
takeuz | 2:d58ef72b4ab0 | 315 | serialPorts[debug].puts("PowerSaveOn\r\n"); |
takeuz | 2:d58ef72b4ab0 | 316 | #endif |
takeuz | 2:d58ef72b4ab0 | 317 | wait(20); |
takeuz | 2:d58ef72b4ab0 | 318 | #if pushDebugData |
takeuz | 2:d58ef72b4ab0 | 319 | serialPorts[debug].puts("PowerSaveOff\r\n"); |
takeuz | 2:d58ef72b4ab0 | 320 | #endif |
takeuz | 2:d58ef72b4ab0 | 321 | } |
takeuz | 7:42cb4b01909c | 322 | int checkForLocalInterfaceCommand() |
takeuz | 4:3e1e2b161403 | 323 | { |
takeuz | 7:42cb4b01909c | 324 | serialPorts[debug].puts("CommandDETECTED\r\n"); |
takeuz | 8:cc3cb620c3bd | 325 | int i=0; |
takeuz | 8:cc3cb620c3bd | 326 | while(incomingDataInInterFace[i]!='\0'){ |
takeuz | 8:cc3cb620c3bd | 327 | incomingDataInInterFace[i]=tolower(incomingDataInInterFace[i]); |
takeuz | 8:cc3cb620c3bd | 328 | i++; |
takeuz | 8:cc3cb620c3bd | 329 | } |
takeuz | 7:42cb4b01909c | 330 | char temp[2]= {incomingDataInInterFace[0],incomingDataInInterFace[1]}; |
takeuz | 8:cc3cb620c3bd | 331 | if(strcmp(temp,"at")!=0) { |
takeuz | 6:741524d110fe | 332 | serialPorts[debug].puts("Not Local Command\r\n"); |
takeuz | 7:42cb4b01909c | 333 | return 0; |
takeuz | 5:53d84cbf9890 | 334 | } |
takeuz | 8:cc3cb620c3bd | 335 | if(strcmp(incomingDataInInterFace,"atz")==0) { |
takeuz | 6:741524d110fe | 336 | NVIC_SystemReset(); |
takeuz | 6:741524d110fe | 337 | } |
takeuz | 8:cc3cb620c3bd | 338 | if(strcmp(incomingDataInInterFace,"atrv")==0) { |
takeuz | 8:cc3cb620c3bd | 339 | serialPorts[interFace].puts("12.1V\r\n"); |
takeuz | 7:42cb4b01909c | 340 | clearMemoryLocation(incomingDataInInterFace,incomingDataInInterFaceSize); |
takeuz | 7:42cb4b01909c | 341 | return 1; |
takeuz | 6:741524d110fe | 342 | } |
takeuz | 6:741524d110fe | 343 | serialPorts[interFace].puts("?\r\n"); |
takeuz | 7:42cb4b01909c | 344 | return 2; |
takeuz | 2:d58ef72b4ab0 | 345 | } |
takeuz | 4:3e1e2b161403 | 346 | void sendResponseToInterface() |
takeuz | 4:3e1e2b161403 | 347 | { |
takeuz | 7:42cb4b01909c | 348 | serialPorts[interFace].puts(incomingDataInOBD); |
takeuz | 7:42cb4b01909c | 349 | serialPorts[interFace].puts("\r\n"); |
takeuz | 7:42cb4b01909c | 350 | } |
takeuz | 7:42cb4b01909c | 351 | |
takeuz | 7:42cb4b01909c | 352 | void clearInterfaceCommand() |
takeuz | 7:42cb4b01909c | 353 | { |
takeuz | 7:42cb4b01909c | 354 | incomingDataInInterFaceCounter=0; |
takeuz | 7:42cb4b01909c | 355 | interfaceCmdReceived=0; |
takeuz | 7:42cb4b01909c | 356 | clearMemoryLocation(incomingDataInInterFace,incomingDataInInterFaceSize); |
takeuz | 7:42cb4b01909c | 357 | } |
takeuz | 7:42cb4b01909c | 358 | |
takeuz | 7:42cb4b01909c | 359 | void clearOBDCommand() |
takeuz | 7:42cb4b01909c | 360 | { |
takeuz | 7:42cb4b01909c | 361 | clearMemoryLocation(incomingDataInOBD,incomingDataInOBDSize); |
takeuz | 8:cc3cb620c3bd | 362 | incomingDataInOBDCounter=0; |
takeuz | 8:cc3cb620c3bd | 363 | OBDCmdReceived=0; |
takeuz | 8:cc3cb620c3bd | 364 | } |
takeuz | 8:cc3cb620c3bd | 365 | int findStringLength(char *_cmd) |
takeuz | 8:cc3cb620c3bd | 366 | { |
takeuz | 8:cc3cb620c3bd | 367 | int i=0; |
takeuz | 8:cc3cb620c3bd | 368 | for(i=0; _cmd[i]!='\0'; ++i); |
takeuz | 8:cc3cb620c3bd | 369 | return i; |
takeuz | 8:cc3cb620c3bd | 370 | } |
takeuz | 8:cc3cb620c3bd | 371 | int initializeKLine() |
takeuz | 8:cc3cb620c3bd | 372 | { |
takeuz | 8:cc3cb620c3bd | 373 | #if sendDebugMessage |
takeuz | 8:cc3cb620c3bd | 374 | serialPorts[debug].puts("K-Line Check\r\n"); |
takeuz | 8:cc3cb620c3bd | 375 | #endif |
takeuz | 8:cc3cb620c3bd | 376 | *klineWakeup=1; |
takeuz | 8:cc3cb620c3bd | 377 | wait_ms(300); |
takeuz | 8:cc3cb620c3bd | 378 | *klineWakeup=0; |
takeuz | 8:cc3cb620c3bd | 379 | wait_ms(25); |
takeuz | 8:cc3cb620c3bd | 380 | *klineWakeup=1; |
takeuz | 8:cc3cb620c3bd | 381 | wait_ms(25); |
takeuz | 8:cc3cb620c3bd | 382 | delete klineWakeup; |
takeuz | 8:cc3cb620c3bd | 383 | kLineUART=new Serial(P0_28,P0_27); |
takeuz | 8:cc3cb620c3bd | 384 | kLineUART->baud(10400); |
takeuz | 8:cc3cb620c3bd | 385 | kLineUART->attach(&readKLine); |
takeuz | 8:cc3cb620c3bd | 386 | uint8_t crc=0; |
takeuz | 8:cc3cb620c3bd | 387 | crc=crc+0xC1; |
takeuz | 8:cc3cb620c3bd | 388 | crc=crc+0x33; |
takeuz | 8:cc3cb620c3bd | 389 | crc=crc+0xF1; |
takeuz | 8:cc3cb620c3bd | 390 | crc=crc+0x81; |
takeuz | 8:cc3cb620c3bd | 391 | kLineUART->putc(0xC1); |
takeuz | 8:cc3cb620c3bd | 392 | kLineUART->putc(0x33); |
takeuz | 8:cc3cb620c3bd | 393 | kLineUART->putc(0xF1); |
takeuz | 8:cc3cb620c3bd | 394 | kLineUART->putc(0x81); |
takeuz | 8:cc3cb620c3bd | 395 | kLineUART->putc(crc); |
takeuz | 8:cc3cb620c3bd | 396 | wait(1); |
takeuz | 8:cc3cb620c3bd | 397 | //have to check K-line Response |
takeuz | 8:cc3cb620c3bd | 398 | currentOBDProtocol=protkLine14230; // have to remove this line |
takeuz | 8:cc3cb620c3bd | 399 | return 0; |
takeuz | 7:42cb4b01909c | 400 | } |
takeuz | 7:42cb4b01909c | 401 | |
takeuz | 8:cc3cb620c3bd | 402 | void setKLineMsg(char *_cmd) |
takeuz | 8:cc3cb620c3bd | 403 | { |
takeuz | 8:cc3cb620c3bd | 404 | for(int i=3; i<6; i++) { |
takeuz | 7:42cb4b01909c | 405 | kLineCmd[i]='\0'; |
takeuz | 7:42cb4b01909c | 406 | } |
takeuz | 7:42cb4b01909c | 407 | int len=findStringLength(_cmd)/2; |
takeuz | 7:42cb4b01909c | 408 | char _mode[2]=""; |
takeuz | 7:42cb4b01909c | 409 | uint8_t crc=0; |
takeuz | 8:cc3cb620c3bd | 410 | if(len==1) { |
takeuz | 7:42cb4b01909c | 411 | crc=crc+0xC1; |
takeuz | 7:42cb4b01909c | 412 | kLineCmd[0]=0xC1; |
takeuz | 7:42cb4b01909c | 413 | crc=crc+0x33; |
takeuz | 7:42cb4b01909c | 414 | kLineCmd[1]=(0x33); |
takeuz | 7:42cb4b01909c | 415 | crc=crc+0xF1; |
takeuz | 7:42cb4b01909c | 416 | kLineCmd[2]=(0xF1); |
takeuz | 7:42cb4b01909c | 417 | crc=crc+strtol((_cmd),NULL, 16); |
takeuz | 7:42cb4b01909c | 418 | kLineCmd[3]=(strtol((_cmd),NULL, 16)); |
takeuz | 7:42cb4b01909c | 419 | kLineCmd[4]=(crc); |
takeuz | 8:cc3cb620c3bd | 420 | } else if(len==2) { |
takeuz | 7:42cb4b01909c | 421 | crc=crc+0xC2; |
takeuz | 7:42cb4b01909c | 422 | kLineCmd[0]=(0xC2); |
takeuz | 7:42cb4b01909c | 423 | crc=crc+0x33; |
takeuz | 7:42cb4b01909c | 424 | kLineCmd[1]=(0x33); |
takeuz | 7:42cb4b01909c | 425 | crc=crc+0xF1; |
takeuz | 7:42cb4b01909c | 426 | kLineCmd[2]=(0xF1); |
takeuz | 7:42cb4b01909c | 427 | for(int i=0; i<2; i++) { |
takeuz | 7:42cb4b01909c | 428 | _mode[i]=_cmd[i]; |
takeuz | 7:42cb4b01909c | 429 | } |
takeuz | 7:42cb4b01909c | 430 | crc=crc+strtol(_mode,NULL, 16); |
takeuz | 7:42cb4b01909c | 431 | kLineCmd[3]=(strtol(_mode,NULL, 16)); |
takeuz | 7:42cb4b01909c | 432 | crc=crc+(strtol((_cmd+2),NULL, 16)); |
takeuz | 7:42cb4b01909c | 433 | kLineCmd[4]=(strtol((_cmd+2),NULL, 16)); |
takeuz | 7:42cb4b01909c | 434 | kLineCmd[5]=(crc); |
takeuz | 7:42cb4b01909c | 435 | } |
takeuz | 7:42cb4b01909c | 436 | } |
takeuz | 8:cc3cb620c3bd | 437 | |
takeuz | 8:cc3cb620c3bd | 438 | void sendCommandToVehicle(char *_cmd) |
takeuz | 8:cc3cb620c3bd | 439 | { |
takeuz | 7:42cb4b01909c | 440 | isVehicleCommandProcessing=1; |
takeuz | 7:42cb4b01909c | 441 | setKLineMsg(_cmd); |
takeuz | 8:cc3cb620c3bd | 442 | for(kLineCommandCount=0; kLineCommandCount<6; kLineCommandCount++) { |
takeuz | 8:cc3cb620c3bd | 443 | if(kLineCmd[kLineCommandCount]=='\0') { |
takeuz | 7:42cb4b01909c | 444 | break; |
takeuz | 7:42cb4b01909c | 445 | } |
takeuz | 7:42cb4b01909c | 446 | kLineUART->putc(kLineCmd[kLineCommandCount]); |
takeuz | 7:42cb4b01909c | 447 | } |
takeuz | 8:cc3cb620c3bd | 448 | wait_ms(500); |
takeuz | 7:42cb4b01909c | 449 | //have to check given and received commands are same. |
takeuz | 7:42cb4b01909c | 450 | //if it is same we have to read the response else just fush buffer and send the command again |
takeuz | 8:cc3cb620c3bd | 451 | clearInterfaceCommand(); |
takeuz | 7:42cb4b01909c | 452 | isVehicleCommandProcessing=0; |
takeuz | 7:42cb4b01909c | 453 | } |
takeuz | 7:42cb4b01909c | 454 | |
takeuz | 8:cc3cb620c3bd | 455 | void flushBuffer() |
takeuz | 8:cc3cb620c3bd | 456 | { |
takeuz | 8:cc3cb620c3bd | 457 | while(kLineUART->readable()) { |
takeuz | 7:42cb4b01909c | 458 | kLineUART->getc(); |
takeuz | 7:42cb4b01909c | 459 | } |
takeuz | 7:42cb4b01909c | 460 | } |
takeuz | 8:cc3cb620c3bd | 461 | void kLinekeepalive() |
takeuz | 8:cc3cb620c3bd | 462 | { |
takeuz | 8:cc3cb620c3bd | 463 | kLineUART->putc(0xc1); |
takeuz | 8:cc3cb620c3bd | 464 | kLineUART->putc(0x33); |
takeuz | 8:cc3cb620c3bd | 465 | kLineUART->putc(0xf1); |
takeuz | 8:cc3cb620c3bd | 466 | kLineUART->putc(0x3e); |
takeuz | 8:cc3cb620c3bd | 467 | kLineUART->putc(0x23); |
takeuz | 8:cc3cb620c3bd | 468 | } |
takeuz | 8:cc3cb620c3bd | 469 | char tolower(unsigned char ch) { |
takeuz | 8:cc3cb620c3bd | 470 | if (ch >= 'A' && ch <= 'Z') |
takeuz | 8:cc3cb620c3bd | 471 | ch = 'a' + (ch - 'A'); |
takeuz | 8:cc3cb620c3bd | 472 | return ch; |
takeuz | 8:cc3cb620c3bd | 473 | } |