f211

Dependencies:   mbed-dev1

Fork of OBD21121 by Surendar S

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?

UserRevisionLine numberNew 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 }