f211
Fork of OBD21121 by
main.cpp@17:8c76a8b1f46f, 2017-08-10 (annotated)
- Committer:
- takeuz
- Date:
- Thu Aug 10 11:38:15 2017 +0000
- Revision:
- 17:8c76a8b1f46f
- Parent:
- 16:02f94a84e211
updated OBD code
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 | 14:03fd47f2b21d | 5 | //#define PID_REQUEST 0x18DB33F1 |
takeuz | 2:d58ef72b4ab0 | 6 | #define PID_REPLY 0x7E8 |
takeuz | 14:03fd47f2b21d | 7 | //#define PID_REPLY 0x18DAF110 |
takeuz | 2:d58ef72b4ab0 | 8 | |
takeuz | 8:cc3cb620c3bd | 9 | #define CANSPEED_500 500000 |
takeuz | 8:cc3cb620c3bd | 10 | #define CANSPEED_250 250000 |
takeuz | 8:cc3cb620c3bd | 11 | #define CANSPEED_125 125000 |
takeuz | 2:d58ef72b4ab0 | 12 | #define sendDebugMessage 1 |
takeuz | 2:d58ef72b4ab0 | 13 | #define pushDebugData 1 |
takeuz | 2:d58ef72b4ab0 | 14 | |
takeuz | 8:cc3cb620c3bd | 15 | const int canSpeeds[3]= {CANSPEED_125,CANSPEED_500,CANSPEED_250}; |
takeuz | 10:fe1b976a3f9c | 16 | //Serial serialPorts[2] = {Serial(P0_11,P0_13),Serial(P0_15,P0_14)}; |
takeuz | 10:fe1b976a3f9c | 17 | Serial *serialPorts[2] = {NULL,NULL}; |
takeuz | 8:cc3cb620c3bd | 18 | Serial *kLineUART=NULL; |
takeuz | 10:fe1b976a3f9c | 19 | DigitalOut *klineWakeup=NULL; |
takeuz | 10:fe1b976a3f9c | 20 | DigitalOut *canDisableKey=NULL; |
takeuz | 10:fe1b976a3f9c | 21 | CAN *canBus=NULL; |
takeuz | 2:d58ef72b4ab0 | 22 | |
takeuz | 8:cc3cb620c3bd | 23 | Ticker timeCounter; |
takeuz | 8:cc3cb620c3bd | 24 | Timer OBDTimer; |
takeuz | 8:cc3cb620c3bd | 25 | CANMessage can_MsgRx; |
takeuz | 15:47abd7926beb | 26 | CANMessage can_MsgTx; |
takeuz | 15:47abd7926beb | 27 | char kLineCmd[7]= {'\0','\0','\0','\0','\0','\0'}; |
takeuz | 7:42cb4b01909c | 28 | |
takeuz | 8:cc3cb620c3bd | 29 | void clearOBDCommand(); |
takeuz | 8:cc3cb620c3bd | 30 | void flushBuffer(); |
takeuz | 10:fe1b976a3f9c | 31 | void processUserCommand(char *_incomingDataInInterFace); |
takeuz | 7:42cb4b01909c | 32 | void sendCommandToVehicle(char *_cmd); |
takeuz | 8:cc3cb620c3bd | 33 | void setKLineMsg(char *_cmd); |
takeuz | 8:cc3cb620c3bd | 34 | void flushBuffer(); |
takeuz | 8:cc3cb620c3bd | 35 | void kLinekeepalive(); |
takeuz | 8:cc3cb620c3bd | 36 | char tolower(unsigned char ch); |
takeuz | 7:42cb4b01909c | 37 | int findStringLength(char *_cmd); |
takeuz | 10:fe1b976a3f9c | 38 | int checkCarStatus(); |
takeuz | 10:fe1b976a3f9c | 39 | void initPins(); |
takeuz | 2:d58ef72b4ab0 | 40 | |
takeuz | 10:fe1b976a3f9c | 41 | int _powerSaveFlag=0; |
takeuz | 10:fe1b976a3f9c | 42 | int isKeepAliveCommand=0; |
takeuz | 8:cc3cb620c3bd | 43 | int isPoweredupNow=1; |
takeuz | 17:8c76a8b1f46f | 44 | int interFace=1; |
takeuz | 7:42cb4b01909c | 45 | int debug=1; |
takeuz | 2:d58ef72b4ab0 | 46 | int currentOBDProtocol=0; |
takeuz | 2:d58ef72b4ab0 | 47 | const int protCan=1; |
takeuz | 7:42cb4b01909c | 48 | const int protkLine9141=2; |
takeuz | 7:42cb4b01909c | 49 | const int protkLine14230=3; |
takeuz | 2:d58ef72b4ab0 | 50 | int canFrequency; |
takeuz | 7:42cb4b01909c | 51 | int cmd; |
takeuz | 2:d58ef72b4ab0 | 52 | char can_msg[8]; |
takeuz | 2:d58ef72b4ab0 | 53 | char *incomingDataInInterFace; |
takeuz | 2:d58ef72b4ab0 | 54 | const int incomingDataInInterFaceSize=256; |
takeuz | 2:d58ef72b4ab0 | 55 | int incomingDataInInterFaceCounter=0; |
takeuz | 8:cc3cb620c3bd | 56 | char * incomingDataInOBD; |
takeuz | 2:d58ef72b4ab0 | 57 | const int incomingDataInOBDSize=256; |
takeuz | 2:d58ef72b4ab0 | 58 | int incomingDataInOBDCounter=0; |
takeuz | 2:d58ef72b4ab0 | 59 | const int waitTimeForOBDComm=2000; |
takeuz | 16:02f94a84e211 | 60 | const int sleepTime=10000; |
takeuz | 11:853d12fe7ec0 | 61 | const int powerSaveTime=30; |
takeuz | 2:d58ef72b4ab0 | 62 | int OBDCmdReceived=0; |
takeuz | 2:d58ef72b4ab0 | 63 | int interfaceCmdReceived=0; |
takeuz | 2:d58ef72b4ab0 | 64 | int lastOBDCmdRcvdTime=0; |
takeuz | 2:d58ef72b4ab0 | 65 | int lastInterfaceCmdRcvdTime=0; |
takeuz | 8:cc3cb620c3bd | 66 | int KlineReadCount=0; |
takeuz | 8:cc3cb620c3bd | 67 | int isVehicleCommandProcessing=0; |
takeuz | 8:cc3cb620c3bd | 68 | int kLineCommandCount=0; |
takeuz | 8:cc3cb620c3bd | 69 | char kByte=0; |
takeuz | 4:3e1e2b161403 | 70 | |
takeuz | 10:fe1b976a3f9c | 71 | void flip() |
takeuz | 10:fe1b976a3f9c | 72 | { |
takeuz | 10:fe1b976a3f9c | 73 | // led = !led; |
takeuz | 10:fe1b976a3f9c | 74 | } |
takeuz | 15:47abd7926beb | 75 | |
takeuz | 2:d58ef72b4ab0 | 76 | void readInterface() |
takeuz | 2:d58ef72b4ab0 | 77 | { |
takeuz | 2:d58ef72b4ab0 | 78 | char c; |
takeuz | 10:fe1b976a3f9c | 79 | while(serialPorts[interFace]->readable()) { |
takeuz | 2:d58ef72b4ab0 | 80 | lastInterfaceCmdRcvdTime=0; |
takeuz | 10:fe1b976a3f9c | 81 | c = serialPorts[interFace]->getc(); |
takeuz | 7:42cb4b01909c | 82 | |
takeuz | 10:fe1b976a3f9c | 83 | serialPorts[debug]->putc(c); |
takeuz | 8:cc3cb620c3bd | 84 | |
takeuz | 6:741524d110fe | 85 | if(incomingDataInInterFaceCounter<incomingDataInInterFaceSize && c!='\r' && c!='\n') { |
takeuz | 2:d58ef72b4ab0 | 86 | incomingDataInInterFace[incomingDataInInterFaceCounter] = c; |
takeuz | 2:d58ef72b4ab0 | 87 | } |
takeuz | 2:d58ef72b4ab0 | 88 | incomingDataInInterFaceCounter++; |
takeuz | 4:3e1e2b161403 | 89 | |
takeuz | 7:42cb4b01909c | 90 | if(c=='\r') { |
takeuz | 2:d58ef72b4ab0 | 91 | interfaceCmdReceived=1; |
takeuz | 10:fe1b976a3f9c | 92 | serialPorts[debug]->puts("nl\r\n"); |
takeuz | 2:d58ef72b4ab0 | 93 | } |
takeuz | 2:d58ef72b4ab0 | 94 | |
takeuz | 2:d58ef72b4ab0 | 95 | } |
takeuz | 2:d58ef72b4ab0 | 96 | } |
takeuz | 2:d58ef72b4ab0 | 97 | |
takeuz | 4:3e1e2b161403 | 98 | void canReader() |
takeuz | 4:3e1e2b161403 | 99 | { |
takeuz | 10:fe1b976a3f9c | 100 | // serialPorts[debug]->puts("a"); |
takeuz | 17:8c76a8b1f46f | 101 | // serialPorts[debug]->printf("can Reader\r\n"); |
takeuz | 10:fe1b976a3f9c | 102 | if (canBus->read(can_MsgRx)) { |
takeuz | 17:8c76a8b1f46f | 103 | // serialPorts[debug]->printf("one : %s\r\n",can_MsgRx); |
takeuz | 2:d58ef72b4ab0 | 104 | lastOBDCmdRcvdTime=0; |
takeuz | 17:8c76a8b1f46f | 105 | if (can_MsgRx.id == PID_REPLY) { |
takeuz | 10:fe1b976a3f9c | 106 | for (int i = 0; i < (int)can_MsgRx.len && currentOBDProtocol!=0; i++) { |
takeuz | 10:fe1b976a3f9c | 107 | char c; |
takeuz | 10:fe1b976a3f9c | 108 | // sprintf(c, "%02X",can_MsgRx.data[i]); |
takeuz | 10:fe1b976a3f9c | 109 | // serialPorts[interFace].puts(c); |
takeuz | 10:fe1b976a3f9c | 110 | if(incomingDataInOBDCounter< incomingDataInOBDSize) { |
takeuz | 10:fe1b976a3f9c | 111 | incomingDataInOBD[incomingDataInOBDCounter]=can_MsgRx.data[i]; |
takeuz | 10:fe1b976a3f9c | 112 | incomingDataInOBDCounter++; |
takeuz | 10:fe1b976a3f9c | 113 | } |
takeuz | 10:fe1b976a3f9c | 114 | } |
takeuz | 7:42cb4b01909c | 115 | OBDCmdReceived=1; |
takeuz | 2:d58ef72b4ab0 | 116 | } |
takeuz | 2:d58ef72b4ab0 | 117 | } |
takeuz | 2:d58ef72b4ab0 | 118 | } |
takeuz | 2:d58ef72b4ab0 | 119 | |
takeuz | 8:cc3cb620c3bd | 120 | void readKLine() |
takeuz | 8:cc3cb620c3bd | 121 | { |
takeuz | 8:cc3cb620c3bd | 122 | char c; |
takeuz | 8:cc3cb620c3bd | 123 | while(kLineUART->readable()) { |
takeuz | 8:cc3cb620c3bd | 124 | c=kLineUART->getc(); |
takeuz | 14:03fd47f2b21d | 125 | serialPorts[debug]->printf("%02X",c); |
takeuz | 10:fe1b976a3f9c | 126 | lastOBDCmdRcvdTime=0; |
takeuz | 10:fe1b976a3f9c | 127 | if(incomingDataInOBDCounter< incomingDataInOBDSize) { |
takeuz | 10:fe1b976a3f9c | 128 | incomingDataInOBD[incomingDataInOBDCounter]=c; |
takeuz | 10:fe1b976a3f9c | 129 | incomingDataInOBDCounter++; |
takeuz | 10:fe1b976a3f9c | 130 | } |
takeuz | 8:cc3cb620c3bd | 131 | } |
takeuz | 8:cc3cb620c3bd | 132 | } |
takeuz | 8:cc3cb620c3bd | 133 | |
takeuz | 8:cc3cb620c3bd | 134 | |
takeuz | 4:3e1e2b161403 | 135 | void timeCounterFunction() |
takeuz | 4:3e1e2b161403 | 136 | { |
takeuz | 2:d58ef72b4ab0 | 137 | lastInterfaceCmdRcvdTime++; |
takeuz | 2:d58ef72b4ab0 | 138 | lastOBDCmdRcvdTime++; |
takeuz | 10:fe1b976a3f9c | 139 | /*KlineReadCount++; |
takeuz | 8:cc3cb620c3bd | 140 | if(currentOBDProtocol==protkLine14230 && KlineReadCount>=3) { |
takeuz | 7:42cb4b01909c | 141 | KlineReadCount=0; |
takeuz | 8:cc3cb620c3bd | 142 | if(incomingDataInInterFaceCounter) { |
takeuz | 7:42cb4b01909c | 143 | return; |
takeuz | 7:42cb4b01909c | 144 | } |
takeuz | 8:cc3cb620c3bd | 145 | kLinekeepalive(); |
takeuz | 10:fe1b976a3f9c | 146 | }*/ |
takeuz | 8:cc3cb620c3bd | 147 | |
takeuz | 2:d58ef72b4ab0 | 148 | } |
takeuz | 0:ccd2474129f2 | 149 | |
takeuz | 4:3e1e2b161403 | 150 | int main() |
takeuz | 4:3e1e2b161403 | 151 | { |
takeuz | 10:fe1b976a3f9c | 152 | //Serial serialPorts[2] = {Serial(P0_11,P0_13),Serial(P0_15,P0_14)}; |
takeuz | 10:fe1b976a3f9c | 153 | |
takeuz | 10:fe1b976a3f9c | 154 | initPins(); |
takeuz | 10:fe1b976a3f9c | 155 | serialPorts[debug]->puts("f2120\r\n"); |
takeuz | 2:d58ef72b4ab0 | 156 | incomingDataInInterFace=(char *)malloc(incomingDataInInterFaceSize*sizeof(char)); |
takeuz | 2:d58ef72b4ab0 | 157 | incomingDataInOBD=(char *)malloc(incomingDataInOBDSize*sizeof(char)); |
takeuz | 10:fe1b976a3f9c | 158 | |
takeuz | 8:cc3cb620c3bd | 159 | *klineWakeup=0; |
takeuz | 2:d58ef72b4ab0 | 160 | clearMemoryLocation(incomingDataInInterFace,incomingDataInInterFaceSize); |
takeuz | 4:3e1e2b161403 | 161 | clearMemoryLocation(incomingDataInOBD,incomingDataInOBDSize); |
takeuz | 11:853d12fe7ec0 | 162 | wait_ms(800); |
takeuz | 2:d58ef72b4ab0 | 163 | timeCounter.attach(&timeCounterFunction, 1.0); |
takeuz | 10:fe1b976a3f9c | 164 | serialPorts[interFace]->attach(&readInterface); |
takeuz | 10:fe1b976a3f9c | 165 | serialPorts[interFace]->puts("+TU211 v1.0\r"); |
takeuz | 10:fe1b976a3f9c | 166 | serialPorts[interFace]->puts("OK\r\n"); |
takeuz | 15:47abd7926beb | 167 | wait_ms(300); //????? suren : have to remove wait |
takeuz | 0:ccd2474129f2 | 168 | while(1) { |
takeuz | 7:42cb4b01909c | 169 | if(interfaceCmdReceived && checkForLocalInterfaceCommand()) { |
takeuz | 10:fe1b976a3f9c | 170 | serialPorts[debug]->puts("Going to clear UART data\r\n"); |
takeuz | 7:42cb4b01909c | 171 | clearInterfaceCommand(); |
takeuz | 10:fe1b976a3f9c | 172 | serialPorts[debug]->puts("UART data cleared\r\n"); |
takeuz | 7:42cb4b01909c | 173 | } |
takeuz | 11:853d12fe7ec0 | 174 | if(currentOBDProtocol==0/* && isPoweredupNow*/) { |
takeuz | 11:853d12fe7ec0 | 175 | // isPoweredupNow=0; |
takeuz | 4:3e1e2b161403 | 176 | #if sendDebugMessage |
takeuz | 10:fe1b976a3f9c | 177 | serialPorts[debug]->puts("Going to figure protocol\r\n"); |
takeuz | 15:47abd7926beb | 178 | serialPorts[debug]->puts("Searching...\r\n"); |
takeuz | 4:3e1e2b161403 | 179 | #endif |
takeuz | 2:d58ef72b4ab0 | 180 | checkCommunicationProtocol(); |
takeuz | 4:3e1e2b161403 | 181 | if(!currentOBDProtocol) { |
takeuz | 4:3e1e2b161403 | 182 | #if sendDebugMessage |
takeuz | 10:fe1b976a3f9c | 183 | serialPorts[debug]->puts("!Unknownprotocol\r\n"); |
takeuz | 4:3e1e2b161403 | 184 | #endif |
takeuz | 7:42cb4b01909c | 185 | } else if(currentOBDProtocol==protCan) { |
takeuz | 10:fe1b976a3f9c | 186 | *canDisableKey=0; |
takeuz | 7:42cb4b01909c | 187 | #if sendDebugMessage |
takeuz | 10:fe1b976a3f9c | 188 | serialPorts[debug]->puts("can Protocol\r\n"); |
takeuz | 7:42cb4b01909c | 189 | #endif |
takeuz | 8:cc3cb620c3bd | 190 | } else if(currentOBDProtocol==protkLine14230) { |
takeuz | 10:fe1b976a3f9c | 191 | *canDisableKey=1; |
takeuz | 7:42cb4b01909c | 192 | #if sendDebugMessage |
takeuz | 10:fe1b976a3f9c | 193 | serialPorts[debug]->puts("Kline Protocol\r\n"); |
takeuz | 7:42cb4b01909c | 194 | #endif |
takeuz | 2:d58ef72b4ab0 | 195 | } |
takeuz | 2:d58ef72b4ab0 | 196 | } |
takeuz | 7:42cb4b01909c | 197 | if(interfaceCmdReceived && checkForLocalInterfaceCommand()) { |
takeuz | 10:fe1b976a3f9c | 198 | serialPorts[debug]->puts("Going to clear UART data\r\n"); |
takeuz | 7:42cb4b01909c | 199 | clearInterfaceCommand(); |
takeuz | 10:fe1b976a3f9c | 200 | serialPorts[debug]->puts("UART data cleared\r\n"); |
takeuz | 2:d58ef72b4ab0 | 201 | } |
takeuz | 7:42cb4b01909c | 202 | if(interfaceCmdReceived && currentOBDProtocol) { |
takeuz | 10:fe1b976a3f9c | 203 | serialPorts[debug]->puts("Going to process user command\r\n"); |
takeuz | 7:42cb4b01909c | 204 | clearOBDCommand(); |
takeuz | 8:cc3cb620c3bd | 205 | if(currentOBDProtocol==protCan) { |
takeuz | 14:03fd47f2b21d | 206 | while(isVehicleCommandProcessing) {} |
takeuz | 10:fe1b976a3f9c | 207 | processUserCommand(incomingDataInInterFace); |
takeuz | 8:cc3cb620c3bd | 208 | } else if(currentOBDProtocol==protkLine14230) { |
takeuz | 14:03fd47f2b21d | 209 | while(isVehicleCommandProcessing) {} |
takeuz | 7:42cb4b01909c | 210 | flushBuffer(); |
takeuz | 8:cc3cb620c3bd | 211 | /*kLineUART->attach(NULL); |
takeuz | 8:cc3cb620c3bd | 212 | kLineUART->attach(&readKLine);*/ |
takeuz | 7:42cb4b01909c | 213 | sendCommandToVehicle(incomingDataInInterFace); |
takeuz | 7:42cb4b01909c | 214 | wait_ms(500); |
takeuz | 10:fe1b976a3f9c | 215 | serialPorts[debug]->printf("\r\n"); |
takeuz | 8:cc3cb620c3bd | 216 | } else { |
takeuz | 8:cc3cb620c3bd | 217 | clearInterfaceCommand(); |
takeuz | 10:fe1b976a3f9c | 218 | serialPorts[interFace]->puts("?\r\n"); |
takeuz | 8:cc3cb620c3bd | 219 | #if sendDebugMessage |
takeuz | 10:fe1b976a3f9c | 220 | serialPorts[debug]->puts("?\r\n"); |
takeuz | 8:cc3cb620c3bd | 221 | #endif |
takeuz | 2:d58ef72b4ab0 | 222 | } |
takeuz | 8:cc3cb620c3bd | 223 | } else if(interfaceCmdReceived) { |
takeuz | 7:42cb4b01909c | 224 | clearInterfaceCommand(); |
takeuz | 10:fe1b976a3f9c | 225 | serialPorts[interFace]->puts("?\r\n"); |
takeuz | 7:42cb4b01909c | 226 | #if sendDebugMessage |
takeuz | 10:fe1b976a3f9c | 227 | serialPorts[debug]->puts("?\r\n"); |
takeuz | 7:42cb4b01909c | 228 | #endif |
takeuz | 2:d58ef72b4ab0 | 229 | } |
takeuz | 10:fe1b976a3f9c | 230 | // sleepProcess(); |
takeuz | 11:853d12fe7ec0 | 231 | if(lastOBDCmdRcvdTime> powerSaveTime /*&& lastInterfaceCmdRcvdTime> powerSaveTime */) { |
takeuz | 14:03fd47f2b21d | 232 | // powerSaveMode(); |
takeuz | 10:fe1b976a3f9c | 233 | } else { |
takeuz | 10:fe1b976a3f9c | 234 | sleepProcess(); |
takeuz | 10:fe1b976a3f9c | 235 | } |
takeuz | 8:cc3cb620c3bd | 236 | /*if(lastOBDCmdRcvdTime> powerSaveTime && lastInterfaceCmdRcvdTime> powerSaveTime ) { |
takeuz | 2:d58ef72b4ab0 | 237 | powerSaveMode(); |
takeuz | 7:42cb4b01909c | 238 | } else { |
takeuz | 7:42cb4b01909c | 239 | sleepProcess(); |
takeuz | 7:42cb4b01909c | 240 | }*/ |
takeuz | 0:ccd2474129f2 | 241 | } |
takeuz | 0:ccd2474129f2 | 242 | } |
takeuz | 4:3e1e2b161403 | 243 | void checkCommunicationProtocol() |
takeuz | 4:3e1e2b161403 | 244 | { |
takeuz | 8:cc3cb620c3bd | 245 | /* #if sendDebugMessage |
takeuz | 8:cc3cb620c3bd | 246 | serialPorts[debug].puts("check Communication protocal ENT\r\n"); |
takeuz | 8:cc3cb620c3bd | 247 | #endif*/ |
takeuz | 2:d58ef72b4ab0 | 248 | int i=0; |
takeuz | 4:3e1e2b161403 | 249 | do { |
takeuz | 15:47abd7926beb | 250 | |
takeuz | 4:3e1e2b161403 | 251 | #if sendDebugMessage |
takeuz | 10:fe1b976a3f9c | 252 | serialPorts[debug]->puts("CanBusCheck\r\n"); |
takeuz | 4:3e1e2b161403 | 253 | #endif |
takeuz | 10:fe1b976a3f9c | 254 | canBus->reset(); |
takeuz | 10:fe1b976a3f9c | 255 | canBus->frequency(canSpeeds[i]); |
takeuz | 10:fe1b976a3f9c | 256 | canBus->attach(NULL); |
takeuz | 10:fe1b976a3f9c | 257 | canBus->attach(&canReader); |
takeuz | 2:d58ef72b4ab0 | 258 | OBDTimer.reset(); |
takeuz | 2:d58ef72b4ab0 | 259 | OBDTimer.start(); |
takeuz | 2:d58ef72b4ab0 | 260 | OBDCmdReceived=0; |
takeuz | 15:47abd7926beb | 261 | |
takeuz | 15:47abd7926beb | 262 | // can_MsgTx.format = CANStandard;//CANStandard;// or CANExtended; // standard or extended ID (can be skipped for standard) |
takeuz | 15:47abd7926beb | 263 | // can_MsgTx.id = PID_REQUEST; |
takeuz | 15:47abd7926beb | 264 | // can_MsgTx.len = 8;//length in bytes (1 to 8); |
takeuz | 15:47abd7926beb | 265 | // can_MsgTx.data[0]=0x42; |
takeuz | 7:42cb4b01909c | 266 | setCanMessage("010D"); |
takeuz | 15:47abd7926beb | 267 | |
takeuz | 10:fe1b976a3f9c | 268 | if (canBus->write(CANMessage(PID_REQUEST, can_msg, 8))) { |
takeuz | 15:47abd7926beb | 269 | // if (canBus->write(can_MsgTx)) { |
takeuz | 4:3e1e2b161403 | 270 | while(OBDTimer.read_ms() < waitTimeForOBDComm) { |
takeuz | 4:3e1e2b161403 | 271 | if(OBDCmdReceived) { |
takeuz | 2:d58ef72b4ab0 | 272 | currentOBDProtocol=protCan; |
takeuz | 4:3e1e2b161403 | 273 | canFrequency=i; |
takeuz | 8:cc3cb620c3bd | 274 | break; |
takeuz | 2:d58ef72b4ab0 | 275 | } |
takeuz | 2:d58ef72b4ab0 | 276 | } |
takeuz | 2:d58ef72b4ab0 | 277 | } |
takeuz | 2:d58ef72b4ab0 | 278 | wait_ms(200); |
takeuz | 4:3e1e2b161403 | 279 | i++; |
takeuz | 8:cc3cb620c3bd | 280 | } while(i<3 && canFrequency==0); |
takeuz | 2:d58ef72b4ab0 | 281 | OBDTimer.stop(); |
takeuz | 10:fe1b976a3f9c | 282 | canBus->attach(NULL); |
takeuz | 8:cc3cb620c3bd | 283 | if(!currentOBDProtocol) { |
takeuz | 7:42cb4b01909c | 284 | //Kline interface check |
takeuz | 7:42cb4b01909c | 285 | initializeKLine(); |
takeuz | 7:42cb4b01909c | 286 | } |
takeuz | 4:3e1e2b161403 | 287 | #if sendDebugMessage |
takeuz | 10:fe1b976a3f9c | 288 | serialPorts[debug]->puts("check Communication protocal EXT\r\n"); |
takeuz | 4:3e1e2b161403 | 289 | #endif |
takeuz | 2:d58ef72b4ab0 | 290 | } |
takeuz | 2:d58ef72b4ab0 | 291 | void clearMemoryLocation( char *base, int _size) |
takeuz | 2:d58ef72b4ab0 | 292 | { |
takeuz | 2:d58ef72b4ab0 | 293 | for(int forCount=0; forCount<_size; forCount++) { |
takeuz | 2:d58ef72b4ab0 | 294 | base[forCount]='\0'; |
takeuz | 2:d58ef72b4ab0 | 295 | } |
takeuz | 2:d58ef72b4ab0 | 296 | } |
takeuz | 7:42cb4b01909c | 297 | void setCanMessage(char* _cmd) |
takeuz | 4:3e1e2b161403 | 298 | { |
takeuz | 10:fe1b976a3f9c | 299 | serialPorts[debug]->puts("user Command :"); |
takeuz | 10:fe1b976a3f9c | 300 | serialPorts[debug]->puts(_cmd); |
takeuz | 10:fe1b976a3f9c | 301 | serialPorts[debug]->puts("\r\n"); |
takeuz | 8:cc3cb620c3bd | 302 | int len=findStringLength(_cmd)/2; |
takeuz | 7:42cb4b01909c | 303 | char _mode[2]=""; |
takeuz | 7:42cb4b01909c | 304 | for(int i=0; i<2; i++) { |
takeuz | 7:42cb4b01909c | 305 | _mode[i]=_cmd[i]; |
takeuz | 7:42cb4b01909c | 306 | } |
takeuz | 7:42cb4b01909c | 307 | int mode=strtol(_mode,NULL, 16); |
takeuz | 7:42cb4b01909c | 308 | cmd=strtol((_cmd+2),NULL, 16); |
takeuz | 17:8c76a8b1f46f | 309 | can_msg[0] = len; |
takeuz | 7:42cb4b01909c | 310 | can_msg[1] = mode; |
takeuz | 7:42cb4b01909c | 311 | can_msg[2] = cmd; |
takeuz | 4:3e1e2b161403 | 312 | can_msg[3] = 0; |
takeuz | 4:3e1e2b161403 | 313 | can_msg[4] = 0; |
takeuz | 4:3e1e2b161403 | 314 | can_msg[5] = 0; |
takeuz | 4:3e1e2b161403 | 315 | can_msg[6] = 0; |
takeuz | 17:8c76a8b1f46f | 316 | can_msg[7] = 0; |
takeuz | 15:47abd7926beb | 317 | |
takeuz | 17:8c76a8b1f46f | 318 | /*can_MsgTx.len = len; |
takeuz | 15:47abd7926beb | 319 | can_MsgTx.data[0] = mode; |
takeuz | 15:47abd7926beb | 320 | can_MsgTx.data[1] = cmd; |
takeuz | 17:8c76a8b1f46f | 321 | can_MsgTx.data[3] = 0; |
takeuz | 15:47abd7926beb | 322 | can_MsgTx.data[4] = 0; |
takeuz | 15:47abd7926beb | 323 | can_MsgTx.data[5] = 0; |
takeuz | 15:47abd7926beb | 324 | can_MsgTx.data[6] = 0; |
takeuz | 15:47abd7926beb | 325 | can_MsgTx.data[7] = 0;*/ |
takeuz | 2:d58ef72b4ab0 | 326 | } |
takeuz | 10:fe1b976a3f9c | 327 | void processUserCommand(char *_incomingDataInInterFace) |
takeuz | 4:3e1e2b161403 | 328 | { |
takeuz | 11:853d12fe7ec0 | 329 | isVehicleCommandProcessing=1; |
takeuz | 7:42cb4b01909c | 330 | OBDTimer.reset(); |
takeuz | 10:fe1b976a3f9c | 331 | setCanMessage(_incomingDataInInterFace); |
takeuz | 7:42cb4b01909c | 332 | OBDTimer.start(); |
takeuz | 7:42cb4b01909c | 333 | OBDCmdReceived=0; |
takeuz | 10:fe1b976a3f9c | 334 | clearOBDCommand(); |
takeuz | 10:fe1b976a3f9c | 335 | canBus->attach(NULL); |
takeuz | 10:fe1b976a3f9c | 336 | canBus->attach(&canReader); |
takeuz | 10:fe1b976a3f9c | 337 | if (canBus->write(CANMessage(PID_REQUEST, can_msg, 8))) { |
takeuz | 7:42cb4b01909c | 338 | while(OBDTimer.read_ms() < waitTimeForOBDComm) { |
takeuz | 7:42cb4b01909c | 339 | if(OBDCmdReceived) { |
takeuz | 7:42cb4b01909c | 340 | clearInterfaceCommand(); |
takeuz | 10:fe1b976a3f9c | 341 | if(_powerSaveFlag) { |
takeuz | 10:fe1b976a3f9c | 342 | serialPorts[interFace]->printf("+TUAWAKE\r\n"); |
takeuz | 10:fe1b976a3f9c | 343 | _powerSaveFlag=0; |
takeuz | 10:fe1b976a3f9c | 344 | break; |
takeuz | 10:fe1b976a3f9c | 345 | } |
takeuz | 10:fe1b976a3f9c | 346 | int len=incomingDataInOBD[0]; |
takeuz | 10:fe1b976a3f9c | 347 | for(int i=1; i<=len; i++) { |
takeuz | 10:fe1b976a3f9c | 348 | if(incomingDataInOBD[i]!=0x00) { |
takeuz | 10:fe1b976a3f9c | 349 | serialPorts[interFace]->printf("%02X",incomingDataInOBD[i]); |
takeuz | 10:fe1b976a3f9c | 350 | } else { |
takeuz | 10:fe1b976a3f9c | 351 | serialPorts[interFace]->printf("%02X",00); |
takeuz | 10:fe1b976a3f9c | 352 | } |
takeuz | 10:fe1b976a3f9c | 353 | } |
takeuz | 7:42cb4b01909c | 354 | break; |
takeuz | 7:42cb4b01909c | 355 | } |
takeuz | 7:42cb4b01909c | 356 | } |
takeuz | 7:42cb4b01909c | 357 | } |
takeuz | 7:42cb4b01909c | 358 | OBDTimer.stop(); |
takeuz | 7:42cb4b01909c | 359 | if(!OBDCmdReceived) { |
takeuz | 7:42cb4b01909c | 360 | clearInterfaceCommand(); |
takeuz | 10:fe1b976a3f9c | 361 | if(!_powerSaveFlag) { |
takeuz | 10:fe1b976a3f9c | 362 | serialPorts[interFace]->puts("?"); |
takeuz | 10:fe1b976a3f9c | 363 | } |
takeuz | 7:42cb4b01909c | 364 | } |
takeuz | 10:fe1b976a3f9c | 365 | clearOBDCommand(); |
takeuz | 10:fe1b976a3f9c | 366 | if(!_powerSaveFlag) { |
takeuz | 10:fe1b976a3f9c | 367 | serialPorts[interFace]->puts("\r\n"); |
takeuz | 10:fe1b976a3f9c | 368 | } |
takeuz | 11:853d12fe7ec0 | 369 | isVehicleCommandProcessing=0; |
takeuz | 2:d58ef72b4ab0 | 370 | } |
takeuz | 4:3e1e2b161403 | 371 | void sleepProcess() |
takeuz | 4:3e1e2b161403 | 372 | { |
takeuz | 4:3e1e2b161403 | 373 | |
takeuz | 2:d58ef72b4ab0 | 374 | #if pushDebugData |
takeuz | 10:fe1b976a3f9c | 375 | serialPorts[debug]->puts("SPe\r\n"); |
takeuz | 2:d58ef72b4ab0 | 376 | #endif |
takeuz | 2:d58ef72b4ab0 | 377 | OBDTimer.reset(); |
takeuz | 2:d58ef72b4ab0 | 378 | OBDTimer.start(); |
takeuz | 4:3e1e2b161403 | 379 | while(OBDTimer.read_ms()<sleepTime && !interfaceCmdReceived) { |
takeuz | 2:d58ef72b4ab0 | 380 | wait_ms(50); |
takeuz | 10:fe1b976a3f9c | 381 | KlineReadCount=KlineReadCount+50; |
takeuz | 10:fe1b976a3f9c | 382 | if(currentOBDProtocol==protkLine14230 && KlineReadCount>=3000) { |
takeuz | 10:fe1b976a3f9c | 383 | KlineReadCount=0; |
takeuz | 11:853d12fe7ec0 | 384 | if(isVehicleCommandProcessing) { |
takeuz | 10:fe1b976a3f9c | 385 | continue; |
takeuz | 10:fe1b976a3f9c | 386 | } |
takeuz | 10:fe1b976a3f9c | 387 | kLinekeepalive(); |
takeuz | 10:fe1b976a3f9c | 388 | } |
takeuz | 2:d58ef72b4ab0 | 389 | } |
takeuz | 2:d58ef72b4ab0 | 390 | OBDTimer.stop(); |
takeuz | 2:d58ef72b4ab0 | 391 | } |
takeuz | 2:d58ef72b4ab0 | 392 | |
takeuz | 4:3e1e2b161403 | 393 | void powerSaveMode() |
takeuz | 4:3e1e2b161403 | 394 | { |
takeuz | 2:d58ef72b4ab0 | 395 | #if pushDebugData |
takeuz | 10:fe1b976a3f9c | 396 | serialPorts[debug]->puts("Ignition test\r\n"); |
takeuz | 2:d58ef72b4ab0 | 397 | #endif |
takeuz | 10:fe1b976a3f9c | 398 | clearInterfaceCommand(); |
takeuz | 10:fe1b976a3f9c | 399 | clearOBDCommand(); |
takeuz | 10:fe1b976a3f9c | 400 | strcpy(incomingDataInInterFace,"010D"); |
takeuz | 10:fe1b976a3f9c | 401 | _powerSaveFlag=1; |
takeuz | 10:fe1b976a3f9c | 402 | if(currentOBDProtocol==protCan) { |
takeuz | 14:03fd47f2b21d | 403 | while(isVehicleCommandProcessing) {} |
takeuz | 10:fe1b976a3f9c | 404 | processUserCommand(incomingDataInInterFace); |
takeuz | 10:fe1b976a3f9c | 405 | } else if(currentOBDProtocol==protkLine14230) { |
takeuz | 10:fe1b976a3f9c | 406 | while(isVehicleCommandProcessing); |
takeuz | 10:fe1b976a3f9c | 407 | flushBuffer(); |
takeuz | 10:fe1b976a3f9c | 408 | sendCommandToVehicle(incomingDataInInterFace); |
takeuz | 10:fe1b976a3f9c | 409 | wait_ms(500); |
takeuz | 10:fe1b976a3f9c | 410 | serialPorts[debug]->printf("\r\n"); |
takeuz | 10:fe1b976a3f9c | 411 | } |
takeuz | 2:d58ef72b4ab0 | 412 | #if pushDebugData |
takeuz | 10:fe1b976a3f9c | 413 | serialPorts[debug]->puts("Ignition test done\r\n"); |
takeuz | 2:d58ef72b4ab0 | 414 | #endif |
takeuz | 10:fe1b976a3f9c | 415 | if(!_powerSaveFlag) { |
takeuz | 10:fe1b976a3f9c | 416 | #if pushDebugData |
takeuz | 10:fe1b976a3f9c | 417 | serialPorts[debug]->puts("Vehicle is in Power mode\r\n"); |
takeuz | 10:fe1b976a3f9c | 418 | #endif |
takeuz | 10:fe1b976a3f9c | 419 | return; |
takeuz | 8:cc3cb620c3bd | 420 | } |
takeuz | 10:fe1b976a3f9c | 421 | #if pushDebugData |
takeuz | 10:fe1b976a3f9c | 422 | serialPorts[debug]->puts("Power save On\r\n"); |
takeuz | 10:fe1b976a3f9c | 423 | #endif |
takeuz | 10:fe1b976a3f9c | 424 | if(currentOBDProtocol==protkLine14230) { |
takeuz | 10:fe1b976a3f9c | 425 | kLineUART->attach(NULL); |
takeuz | 5:53d84cbf9890 | 426 | } |
takeuz | 10:fe1b976a3f9c | 427 | serialPorts[debug]->attach(NULL); |
takeuz | 10:fe1b976a3f9c | 428 | serialPorts[interFace]->attach(NULL); |
takeuz | 10:fe1b976a3f9c | 429 | timeCounter.detach(); |
takeuz | 10:fe1b976a3f9c | 430 | *canDisableKey=1; |
takeuz | 10:fe1b976a3f9c | 431 | |
takeuz | 10:fe1b976a3f9c | 432 | // LPC_SYSCON->SYSAHBCLKCTRL1 |= (1<<7); |
takeuz | 16:02f94a84e211 | 433 | LPC_SWM->PINASSIGN0 = 0xffffffffUL; |
takeuz | 9:a3bdc9a71466 | 434 | LPC_SWM->PINASSIGN1 = 0xffffffffUL; |
takeuz | 9:a3bdc9a71466 | 435 | LPC_SWM->PINASSIGN2 = 0xffffffffUL; |
takeuz | 9:a3bdc9a71466 | 436 | LPC_SWM->PINASSIGN3 = 0xffffffffUL; |
takeuz | 9:a3bdc9a71466 | 437 | LPC_SWM->PINASSIGN4 = 0xffffffffUL; |
takeuz | 9:a3bdc9a71466 | 438 | LPC_SWM->PINASSIGN5 = 0xffffffffUL; |
takeuz | 9:a3bdc9a71466 | 439 | LPC_SWM->PINASSIGN8 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 440 | // LPC_SYSCON->SYSAHBCLKCTRL1 |= (0<<7); |
takeuz | 10:fe1b976a3f9c | 441 | clearInterfaceCommand(); |
takeuz | 11:853d12fe7ec0 | 442 | // serialPorts[interFace]->attach(&readInterface); // it will not work |
takeuz | 10:fe1b976a3f9c | 443 | InterruptIn in2(P0_22); |
takeuz | 10:fe1b976a3f9c | 444 | InterruptIn in3(P0_27); |
takeuz | 10:fe1b976a3f9c | 445 | in2.rise(&flip); |
takeuz | 10:fe1b976a3f9c | 446 | in3.rise(&flip); |
takeuz | 10:fe1b976a3f9c | 447 | while(1) { |
takeuz | 10:fe1b976a3f9c | 448 | // serialPorts[debug]->printf("Waiting for interupt..\r\n"); |
takeuz | 10:fe1b976a3f9c | 449 | __WFI(); |
takeuz | 10:fe1b976a3f9c | 450 | int waitTime=3000; |
takeuz | 10:fe1b976a3f9c | 451 | while(waitTime>0) { |
takeuz | 10:fe1b976a3f9c | 452 | if(interfaceCmdReceived) { |
takeuz | 10:fe1b976a3f9c | 453 | break; |
takeuz | 10:fe1b976a3f9c | 454 | } |
takeuz | 10:fe1b976a3f9c | 455 | wait_ms(50); |
takeuz | 10:fe1b976a3f9c | 456 | waitTime=(waitTime-50); |
takeuz | 10:fe1b976a3f9c | 457 | } |
takeuz | 10:fe1b976a3f9c | 458 | if(interfaceCmdReceived) { |
takeuz | 10:fe1b976a3f9c | 459 | // serialPorts[debug]->printf("%s\r\n",incomingDataInInterFace); |
takeuz | 10:fe1b976a3f9c | 460 | if(checkForLocalInterfaceCommand()) { |
takeuz | 10:fe1b976a3f9c | 461 | clearInterfaceCommand(); |
takeuz | 10:fe1b976a3f9c | 462 | } else { |
takeuz | 11:853d12fe7ec0 | 463 | serialPorts[interFace]->printf("?\r\n"); // here ahave to send "TTUF" // sleep command |
takeuz | 10:fe1b976a3f9c | 464 | } |
takeuz | 10:fe1b976a3f9c | 465 | clearInterfaceCommand(); |
takeuz | 10:fe1b976a3f9c | 466 | } else { |
takeuz | 10:fe1b976a3f9c | 467 | break; |
takeuz | 10:fe1b976a3f9c | 468 | } |
takeuz | 10:fe1b976a3f9c | 469 | } |
takeuz | 10:fe1b976a3f9c | 470 | NVIC_SystemReset(); |
takeuz | 10:fe1b976a3f9c | 471 | #if pushDebugData |
takeuz | 10:fe1b976a3f9c | 472 | serialPorts[debug]->puts("PowerSaveOff\r\n"); |
takeuz | 10:fe1b976a3f9c | 473 | #endif |
takeuz | 10:fe1b976a3f9c | 474 | } |
takeuz | 10:fe1b976a3f9c | 475 | int checkForLocalInterfaceCommand() |
takeuz | 10:fe1b976a3f9c | 476 | { |
takeuz | 10:fe1b976a3f9c | 477 | serialPorts[debug]->puts("CommandDETECTED\r\n"); |
takeuz | 10:fe1b976a3f9c | 478 | int i=0; |
takeuz | 10:fe1b976a3f9c | 479 | while(incomingDataInInterFace[i]!='\0') { |
takeuz | 10:fe1b976a3f9c | 480 | incomingDataInInterFace[i]=tolower(incomingDataInInterFace[i]); |
takeuz | 10:fe1b976a3f9c | 481 | i++; |
takeuz | 10:fe1b976a3f9c | 482 | } |
takeuz | 10:fe1b976a3f9c | 483 | char temp[2]= {incomingDataInInterFace[0],incomingDataInInterFace[1]}; |
takeuz | 10:fe1b976a3f9c | 484 | if(strcmp(temp,"at")!=0) { |
takeuz | 10:fe1b976a3f9c | 485 | serialPorts[debug]->puts("Not Local Command\r\n"); |
takeuz | 10:fe1b976a3f9c | 486 | return 0; |
takeuz | 10:fe1b976a3f9c | 487 | } |
takeuz | 10:fe1b976a3f9c | 488 | if(strcmp(incomingDataInInterFace,"atz")==0) { |
takeuz | 6:741524d110fe | 489 | NVIC_SystemReset(); |
takeuz | 6:741524d110fe | 490 | } |
takeuz | 8:cc3cb620c3bd | 491 | if(strcmp(incomingDataInInterFace,"atrv")==0) { |
takeuz | 10:fe1b976a3f9c | 492 | serialPorts[interFace]->puts("12.1V\r\n"); |
takeuz | 7:42cb4b01909c | 493 | clearMemoryLocation(incomingDataInInterFace,incomingDataInInterFaceSize); |
takeuz | 7:42cb4b01909c | 494 | return 1; |
takeuz | 6:741524d110fe | 495 | } |
takeuz | 10:fe1b976a3f9c | 496 | serialPorts[interFace]->puts("?\r\n"); |
takeuz | 7:42cb4b01909c | 497 | return 2; |
takeuz | 2:d58ef72b4ab0 | 498 | } |
takeuz | 4:3e1e2b161403 | 499 | void sendResponseToInterface() |
takeuz | 4:3e1e2b161403 | 500 | { |
takeuz | 10:fe1b976a3f9c | 501 | serialPorts[interFace]->puts(incomingDataInOBD); |
takeuz | 10:fe1b976a3f9c | 502 | serialPorts[interFace]->puts("\r\n"); |
takeuz | 7:42cb4b01909c | 503 | } |
takeuz | 7:42cb4b01909c | 504 | |
takeuz | 7:42cb4b01909c | 505 | void clearInterfaceCommand() |
takeuz | 7:42cb4b01909c | 506 | { |
takeuz | 7:42cb4b01909c | 507 | incomingDataInInterFaceCounter=0; |
takeuz | 7:42cb4b01909c | 508 | interfaceCmdReceived=0; |
takeuz | 7:42cb4b01909c | 509 | clearMemoryLocation(incomingDataInInterFace,incomingDataInInterFaceSize); |
takeuz | 7:42cb4b01909c | 510 | } |
takeuz | 7:42cb4b01909c | 511 | |
takeuz | 7:42cb4b01909c | 512 | void clearOBDCommand() |
takeuz | 7:42cb4b01909c | 513 | { |
takeuz | 7:42cb4b01909c | 514 | clearMemoryLocation(incomingDataInOBD,incomingDataInOBDSize); |
takeuz | 8:cc3cb620c3bd | 515 | incomingDataInOBDCounter=0; |
takeuz | 8:cc3cb620c3bd | 516 | OBDCmdReceived=0; |
takeuz | 8:cc3cb620c3bd | 517 | } |
takeuz | 8:cc3cb620c3bd | 518 | int findStringLength(char *_cmd) |
takeuz | 8:cc3cb620c3bd | 519 | { |
takeuz | 8:cc3cb620c3bd | 520 | int i=0; |
takeuz | 8:cc3cb620c3bd | 521 | for(i=0; _cmd[i]!='\0'; ++i); |
takeuz | 8:cc3cb620c3bd | 522 | return i; |
takeuz | 8:cc3cb620c3bd | 523 | } |
takeuz | 8:cc3cb620c3bd | 524 | int initializeKLine() |
takeuz | 8:cc3cb620c3bd | 525 | { |
takeuz | 8:cc3cb620c3bd | 526 | #if sendDebugMessage |
takeuz | 10:fe1b976a3f9c | 527 | serialPorts[debug]->puts("K-Line Check\r\n"); |
takeuz | 8:cc3cb620c3bd | 528 | #endif |
takeuz | 16:02f94a84e211 | 529 | LPC_SWM->PINASSIGN2 = 0xffffffffUL; |
takeuz | 8:cc3cb620c3bd | 530 | *klineWakeup=1; |
takeuz | 15:47abd7926beb | 531 | wait_ms(25); |
takeuz | 8:cc3cb620c3bd | 532 | *klineWakeup=0; |
takeuz | 8:cc3cb620c3bd | 533 | wait_ms(25); |
takeuz | 8:cc3cb620c3bd | 534 | *klineWakeup=1; |
takeuz | 8:cc3cb620c3bd | 535 | wait_ms(25); |
takeuz | 16:02f94a84e211 | 536 | //delete klineWakeup; |
takeuz | 16:02f94a84e211 | 537 | LPC_SWM->PINASSIGN2 = 0x1B1CFFFFUL; |
takeuz | 16:02f94a84e211 | 538 | #if sendDebugMessage |
takeuz | 16:02f94a84e211 | 539 | serialPorts[debug]->puts("Bitbang done\r\n"); |
takeuz | 16:02f94a84e211 | 540 | serialPorts[debug]->printf("%X",LPC_SWM->PINASSIGN2 ); |
takeuz | 16:02f94a84e211 | 541 | #endif |
takeuz | 16:02f94a84e211 | 542 | // klineWakeup = new DigitalOut(P0_28); |
takeuz | 16:02f94a84e211 | 543 | |
takeuz | 10:fe1b976a3f9c | 544 | clearOBDCommand(); |
takeuz | 8:cc3cb620c3bd | 545 | kLineUART->baud(10400); |
takeuz | 8:cc3cb620c3bd | 546 | kLineUART->attach(&readKLine); |
takeuz | 8:cc3cb620c3bd | 547 | uint8_t crc=0; |
takeuz | 8:cc3cb620c3bd | 548 | crc=crc+0xC1; |
takeuz | 8:cc3cb620c3bd | 549 | crc=crc+0x33; |
takeuz | 8:cc3cb620c3bd | 550 | crc=crc+0xF1; |
takeuz | 8:cc3cb620c3bd | 551 | crc=crc+0x81; |
takeuz | 8:cc3cb620c3bd | 552 | kLineUART->putc(0xC1); |
takeuz | 8:cc3cb620c3bd | 553 | kLineUART->putc(0x33); |
takeuz | 8:cc3cb620c3bd | 554 | kLineUART->putc(0xF1); |
takeuz | 8:cc3cb620c3bd | 555 | kLineUART->putc(0x81); |
takeuz | 8:cc3cb620c3bd | 556 | kLineUART->putc(crc); |
takeuz | 10:fe1b976a3f9c | 557 | wait(2); |
takeuz | 10:fe1b976a3f9c | 558 | if(incomingDataInOBD[5]!='\0') { |
takeuz | 10:fe1b976a3f9c | 559 | currentOBDProtocol=protkLine14230; |
takeuz | 10:fe1b976a3f9c | 560 | } |
takeuz | 16:02f94a84e211 | 561 | |
takeuz | 16:02f94a84e211 | 562 | #if sendDebugMessage |
takeuz | 16:02f94a84e211 | 563 | serialPorts[debug]->puts("K-Line Check2\r\n"); |
takeuz | 16:02f94a84e211 | 564 | #endif |
takeuz | 16:02f94a84e211 | 565 | kLineUART->attach(NULL); |
takeuz | 16:02f94a84e211 | 566 | /*if(currentOBDProtocol!=protkLine14230){ |
takeuz | 16:02f94a84e211 | 567 | delete kLineUART; |
takeuz | 16:02f94a84e211 | 568 | kLineUART=NULL; |
takeuz | 16:02f94a84e211 | 569 | LPC_SWM->PINASSIGN2 = 0xffffffffUL; |
takeuz | 16:02f94a84e211 | 570 | klineWakeup = new DigitalOut(P0_28); |
takeuz | 16:02f94a84e211 | 571 | }*/ |
takeuz | 8:cc3cb620c3bd | 572 | return 0; |
takeuz | 7:42cb4b01909c | 573 | } |
takeuz | 7:42cb4b01909c | 574 | |
takeuz | 8:cc3cb620c3bd | 575 | void setKLineMsg(char *_cmd) |
takeuz | 8:cc3cb620c3bd | 576 | { |
takeuz | 15:47abd7926beb | 577 | for(int i=3; i<7; i++) { |
takeuz | 7:42cb4b01909c | 578 | kLineCmd[i]='\0'; |
takeuz | 7:42cb4b01909c | 579 | } |
takeuz | 7:42cb4b01909c | 580 | int len=findStringLength(_cmd)/2; |
takeuz | 7:42cb4b01909c | 581 | char _mode[2]=""; |
takeuz | 7:42cb4b01909c | 582 | uint8_t crc=0; |
takeuz | 8:cc3cb620c3bd | 583 | if(len==1) { |
takeuz | 7:42cb4b01909c | 584 | crc=crc+0xC1; |
takeuz | 7:42cb4b01909c | 585 | kLineCmd[0]=0xC1; |
takeuz | 7:42cb4b01909c | 586 | crc=crc+0x33; |
takeuz | 7:42cb4b01909c | 587 | kLineCmd[1]=(0x33); |
takeuz | 7:42cb4b01909c | 588 | crc=crc+0xF1; |
takeuz | 7:42cb4b01909c | 589 | kLineCmd[2]=(0xF1); |
takeuz | 7:42cb4b01909c | 590 | crc=crc+strtol((_cmd),NULL, 16); |
takeuz | 7:42cb4b01909c | 591 | kLineCmd[3]=(strtol((_cmd),NULL, 16)); |
takeuz | 7:42cb4b01909c | 592 | kLineCmd[4]=(crc); |
takeuz | 8:cc3cb620c3bd | 593 | } else if(len==2) { |
takeuz | 7:42cb4b01909c | 594 | crc=crc+0xC2; |
takeuz | 7:42cb4b01909c | 595 | kLineCmd[0]=(0xC2); |
takeuz | 7:42cb4b01909c | 596 | crc=crc+0x33; |
takeuz | 7:42cb4b01909c | 597 | kLineCmd[1]=(0x33); |
takeuz | 7:42cb4b01909c | 598 | crc=crc+0xF1; |
takeuz | 7:42cb4b01909c | 599 | kLineCmd[2]=(0xF1); |
takeuz | 7:42cb4b01909c | 600 | for(int i=0; i<2; i++) { |
takeuz | 7:42cb4b01909c | 601 | _mode[i]=_cmd[i]; |
takeuz | 7:42cb4b01909c | 602 | } |
takeuz | 7:42cb4b01909c | 603 | crc=crc+strtol(_mode,NULL, 16); |
takeuz | 7:42cb4b01909c | 604 | kLineCmd[3]=(strtol(_mode,NULL, 16)); |
takeuz | 14:03fd47f2b21d | 605 | if(_cmd[2]==0&&_cmd[3]==0) { |
takeuz | 14:03fd47f2b21d | 606 | crc=crc+0; |
takeuz | 14:03fd47f2b21d | 607 | kLineCmd[4]=0; |
takeuz | 14:03fd47f2b21d | 608 | } else { |
takeuz | 14:03fd47f2b21d | 609 | crc=crc+(strtol((_cmd+2),NULL, 16)); |
takeuz | 14:03fd47f2b21d | 610 | kLineCmd[4]=(strtol((_cmd+2),NULL, 16)); |
takeuz | 14:03fd47f2b21d | 611 | } |
takeuz | 7:42cb4b01909c | 612 | kLineCmd[5]=(crc); |
takeuz | 15:47abd7926beb | 613 | }else if(len==3) { |
takeuz | 15:47abd7926beb | 614 | char _cmd1[2]=""; |
takeuz | 15:47abd7926beb | 615 | crc=crc+0xC3; |
takeuz | 15:47abd7926beb | 616 | kLineCmd[0]=(0xC3); |
takeuz | 15:47abd7926beb | 617 | crc=crc+0x33; |
takeuz | 15:47abd7926beb | 618 | kLineCmd[1]=(0x33); |
takeuz | 15:47abd7926beb | 619 | crc=crc+0xF1; |
takeuz | 15:47abd7926beb | 620 | kLineCmd[2]=(0xF1); |
takeuz | 15:47abd7926beb | 621 | for(int i=0; i<2; i++) { |
takeuz | 15:47abd7926beb | 622 | _mode[i]=_cmd[i]; |
takeuz | 15:47abd7926beb | 623 | } |
takeuz | 15:47abd7926beb | 624 | crc=crc+strtol(_mode,NULL, 16); |
takeuz | 15:47abd7926beb | 625 | kLineCmd[3]=(strtol(_mode,NULL, 16)); |
takeuz | 15:47abd7926beb | 626 | for(int i=2,j=0; i<4,j<2; i++,j++) { |
takeuz | 15:47abd7926beb | 627 | _cmd1[j]=_cmd[i]; |
takeuz | 15:47abd7926beb | 628 | } |
takeuz | 15:47abd7926beb | 629 | crc=crc+strtol(_cmd1,NULL, 16); |
takeuz | 15:47abd7926beb | 630 | kLineCmd[4]=(strtol(_cmd1,NULL, 16)); |
takeuz | 15:47abd7926beb | 631 | crc=crc+(strtol((_cmd+2),NULL, 16)); |
takeuz | 15:47abd7926beb | 632 | kLineCmd[5]=(strtol((_cmd+2),NULL, 16)); |
takeuz | 15:47abd7926beb | 633 | /*if(_cmd[2]==0&&_cmd[3]==0) { |
takeuz | 15:47abd7926beb | 634 | crc=crc+0; |
takeuz | 15:47abd7926beb | 635 | kLineCmd[4]=0; |
takeuz | 15:47abd7926beb | 636 | } else { |
takeuz | 15:47abd7926beb | 637 | crc=crc+(strtol((_cmd+2),NULL, 16)); |
takeuz | 15:47abd7926beb | 638 | kLineCmd[4]=(strtol((_cmd+2),NULL, 16)); |
takeuz | 15:47abd7926beb | 639 | }*/ |
takeuz | 15:47abd7926beb | 640 | kLineCmd[6]=(crc); |
takeuz | 7:42cb4b01909c | 641 | } |
takeuz | 7:42cb4b01909c | 642 | } |
takeuz | 8:cc3cb620c3bd | 643 | |
takeuz | 8:cc3cb620c3bd | 644 | void sendCommandToVehicle(char *_cmd) |
takeuz | 8:cc3cb620c3bd | 645 | { |
takeuz | 7:42cb4b01909c | 646 | isVehicleCommandProcessing=1; |
takeuz | 14:03fd47f2b21d | 647 | int cmdLen=((findStringLength(_cmd)/2)+4); |
takeuz | 7:42cb4b01909c | 648 | setKLineMsg(_cmd); |
takeuz | 10:fe1b976a3f9c | 649 | clearOBDCommand(); |
takeuz | 10:fe1b976a3f9c | 650 | flushBuffer(); |
takeuz | 10:fe1b976a3f9c | 651 | kLineUART->attach(&readKLine); |
takeuz | 14:03fd47f2b21d | 652 | for(kLineCommandCount=0; kLineCommandCount<cmdLen; kLineCommandCount++) { |
takeuz | 14:03fd47f2b21d | 653 | /*if(kLineCmd[kLineCommandCount]=='\0' && cmdLen) { |
takeuz | 7:42cb4b01909c | 654 | break; |
takeuz | 14:03fd47f2b21d | 655 | }*/ |
takeuz | 7:42cb4b01909c | 656 | kLineUART->putc(kLineCmd[kLineCommandCount]); |
takeuz | 7:42cb4b01909c | 657 | } |
takeuz | 11:853d12fe7ec0 | 658 | wait_ms(1000); |
takeuz | 14:03fd47f2b21d | 659 | serialPorts[debug]->printf("\r\n"); |
takeuz | 10:fe1b976a3f9c | 660 | serialPorts[debug]->printf("Got Data\r\n"); |
takeuz | 7:42cb4b01909c | 661 | //have to check given and received commands are same. |
takeuz | 10:fe1b976a3f9c | 662 | //if it is same we have to read the response else just flush buffer and send the command again |
takeuz | 14:03fd47f2b21d | 663 | /* for(int i=0; i<strlen(incomingDataInOBD); i++) { |
takeuz | 14:03fd47f2b21d | 664 | if(incomingDataInOBD[i]==0) { |
takeuz | 14:03fd47f2b21d | 665 | serialPorts[debug]->printf("00"); |
takeuz | 14:03fd47f2b21d | 666 | } else { |
takeuz | 14:03fd47f2b21d | 667 | serialPorts[debug]->printf("%02X",incomingDataInOBD[i]); |
takeuz | 14:03fd47f2b21d | 668 | } |
takeuz | 14:03fd47f2b21d | 669 | }*/ |
takeuz | 10:fe1b976a3f9c | 670 | kLineUART->attach(NULL); |
takeuz | 14:03fd47f2b21d | 671 | /* strcpy(incomingDataInOBD,(incomingDataInOBD+kLineCommandCount)); //cut request from hole response |
takeuz | 14:03fd47f2b21d | 672 | for(int i=0; i<strlen(incomingDataInOBD); i++) { |
takeuz | 14:03fd47f2b21d | 673 | serialPorts[debug]->printf("%02X",incomingDataInOBD[i]); |
takeuz | 10:fe1b976a3f9c | 674 | } |
takeuz | 14:03fd47f2b21d | 675 | serialPorts[debug]->printf("\r\n"); |
takeuz | 14:03fd47f2b21d | 676 | serialPorts[debug]->printf("%02X\r\n",incomingDataInOBD[0]); |
takeuz | 14:03fd47f2b21d | 677 | int len=(incomingDataInOBD[0]%16);//convert first char to integer and find kength of the response |
takeuz | 14:03fd47f2b21d | 678 | serialPorts[debug]->printf("Response Length : %d\r\n",len); |
takeuz | 14:03fd47f2b21d | 679 | serialPorts[debug]->printf("Response Length : %d\r\n",strlen(incomingDataInOBD)); |
takeuz | 14:03fd47f2b21d | 680 | // strcpy(incomingDataInOBD,(incomingDataInOBD+3)); //again cut first three byte |
takeuz | 14:03fd47f2b21d | 681 | serialPorts[debug]->printf("Response Length : %d\r\n",strlen(incomingDataInOBD)); |
takeuz | 14:03fd47f2b21d | 682 | int obdDataLength=strlen(incomingDataInOBD); |
takeuz | 14:03fd47f2b21d | 683 | int count=0; |
takeuz | 14:03fd47f2b21d | 684 | while(count<len) { |
takeuz | 14:03fd47f2b21d | 685 | if(_powerSaveFlag) { |
takeuz | 14:03fd47f2b21d | 686 | serialPorts[interFace]->printf("+TUAWAKE"); |
takeuz | 14:03fd47f2b21d | 687 | _powerSaveFlag=0; |
takeuz | 14:03fd47f2b21d | 688 | break; |
takeuz | 14:03fd47f2b21d | 689 | } |
takeuz | 14:03fd47f2b21d | 690 | if(incomingDataInOBD[count]!=0){ |
takeuz | 14:03fd47f2b21d | 691 | serialPorts[interFace]->printf("%02X",incomingDataInOBD[count]); |
takeuz | 14:03fd47f2b21d | 692 | // serialPorts[debug]->printf("%02X",incomingDataInOBD[count]); |
takeuz | 14:03fd47f2b21d | 693 | }else{ |
takeuz | 14:03fd47f2b21d | 694 | serialPorts[interFace]->printf("%02X",0x00); |
takeuz | 14:03fd47f2b21d | 695 | // serialPorts[debug]->printf("%02X",0x00); |
takeuz | 14:03fd47f2b21d | 696 | } |
takeuz | 14:03fd47f2b21d | 697 | |
takeuz | 14:03fd47f2b21d | 698 | if(obdDataLength>0) { // have to recheck this condition |
takeuz | 14:03fd47f2b21d | 699 | serialPorts[interFace]->printf("%02X",incomingDataInOBD[count]); |
takeuz | 14:03fd47f2b21d | 700 | serialPorts[debug]->printf("%02X",incomingDataInOBD[count]); |
takeuz | 14:03fd47f2b21d | 701 | } else { |
takeuz | 14:03fd47f2b21d | 702 | serialPorts[interFace]->printf("%02X",0x00); |
takeuz | 14:03fd47f2b21d | 703 | serialPorts[debug]->printf("%02X",0x00); |
takeuz | 14:03fd47f2b21d | 704 | } |
takeuz | 14:03fd47f2b21d | 705 | count++; |
takeuz | 14:03fd47f2b21d | 706 | obdDataLength--; |
takeuz | 10:fe1b976a3f9c | 707 | } |
takeuz | 14:03fd47f2b21d | 708 | |
takeuz | 14:03fd47f2b21d | 709 | |
takeuz | 14:03fd47f2b21d | 710 | //????? suren: Have to recheck the following lines |
takeuz | 14:03fd47f2b21d | 711 | if(len==0) { |
takeuz | 14:03fd47f2b21d | 712 | if(!_powerSaveFlag) { |
takeuz | 14:03fd47f2b21d | 713 | serialPorts[interFace]->printf("?"); |
takeuz | 14:03fd47f2b21d | 714 | serialPorts[debug]->printf("?"); |
takeuz | 14:03fd47f2b21d | 715 | } |
takeuz | 14:03fd47f2b21d | 716 | } |
takeuz | 10:fe1b976a3f9c | 717 | if(!_powerSaveFlag) { |
takeuz | 14:03fd47f2b21d | 718 | serialPorts[interFace]->printf("\r\n"); |
takeuz | 14:03fd47f2b21d | 719 | serialPorts[debug]->printf("\r\n"); |
takeuz | 14:03fd47f2b21d | 720 | serialPorts[debug]->printf("Done\r\n"); |
takeuz | 14:03fd47f2b21d | 721 | } |
takeuz | 14:03fd47f2b21d | 722 | */ |
takeuz | 11:853d12fe7ec0 | 723 | wait_ms(300); |
takeuz | 8:cc3cb620c3bd | 724 | clearInterfaceCommand(); |
takeuz | 10:fe1b976a3f9c | 725 | clearOBDCommand(); |
takeuz | 7:42cb4b01909c | 726 | isVehicleCommandProcessing=0; |
takeuz | 7:42cb4b01909c | 727 | } |
takeuz | 7:42cb4b01909c | 728 | |
takeuz | 8:cc3cb620c3bd | 729 | void flushBuffer() |
takeuz | 8:cc3cb620c3bd | 730 | { |
takeuz | 8:cc3cb620c3bd | 731 | while(kLineUART->readable()) { |
takeuz | 7:42cb4b01909c | 732 | kLineUART->getc(); |
takeuz | 7:42cb4b01909c | 733 | } |
takeuz | 7:42cb4b01909c | 734 | } |
takeuz | 8:cc3cb620c3bd | 735 | void kLinekeepalive() |
takeuz | 8:cc3cb620c3bd | 736 | { |
takeuz | 10:fe1b976a3f9c | 737 | serialPorts[debug]->printf("KeepAlive ENT\r\n"); |
takeuz | 8:cc3cb620c3bd | 738 | kLineUART->putc(0xc1); |
takeuz | 8:cc3cb620c3bd | 739 | kLineUART->putc(0x33); |
takeuz | 8:cc3cb620c3bd | 740 | kLineUART->putc(0xf1); |
takeuz | 8:cc3cb620c3bd | 741 | kLineUART->putc(0x3e); |
takeuz | 8:cc3cb620c3bd | 742 | kLineUART->putc(0x23); |
takeuz | 10:fe1b976a3f9c | 743 | serialPorts[debug]->printf("EXT\r\n"); |
takeuz | 8:cc3cb620c3bd | 744 | } |
takeuz | 10:fe1b976a3f9c | 745 | char tolower(unsigned char ch) |
takeuz | 10:fe1b976a3f9c | 746 | { |
takeuz | 8:cc3cb620c3bd | 747 | if (ch >= 'A' && ch <= 'Z') |
takeuz | 8:cc3cb620c3bd | 748 | ch = 'a' + (ch - 'A'); |
takeuz | 8:cc3cb620c3bd | 749 | return ch; |
takeuz | 10:fe1b976a3f9c | 750 | } |
takeuz | 10:fe1b976a3f9c | 751 | |
takeuz | 10:fe1b976a3f9c | 752 | int checkCarStatus() |
takeuz | 10:fe1b976a3f9c | 753 | { |
takeuz | 10:fe1b976a3f9c | 754 | // LPC_SYSCON->SYSAHBCLKCTRL1 |= (1<<7); |
takeuz | 10:fe1b976a3f9c | 755 | LPC_SWM->PINASSIGN0 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 756 | LPC_SWM->PINASSIGN1 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 757 | LPC_SWM->PINASSIGN2 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 758 | LPC_SWM->PINASSIGN3 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 759 | LPC_SWM->PINASSIGN4 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 760 | LPC_SWM->PINASSIGN5 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 761 | LPC_SWM->PINASSIGN8 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 762 | // LPC_SYSCON->SYSAHBCLKCTRL1 |= (0<<7); |
takeuz | 15:47abd7926beb | 763 | DigitalIn kLine(P0_27); |
takeuz | 15:47abd7926beb | 764 | DigitalIn canLine(P0_22); |
takeuz | 10:fe1b976a3f9c | 765 | if(kLine.read()) { |
takeuz | 10:fe1b976a3f9c | 766 | return 1; |
takeuz | 10:fe1b976a3f9c | 767 | } |
takeuz | 10:fe1b976a3f9c | 768 | if(canLine.read()) { |
takeuz | 10:fe1b976a3f9c | 769 | return 2; |
takeuz | 10:fe1b976a3f9c | 770 | } |
takeuz | 10:fe1b976a3f9c | 771 | return 0; |
takeuz | 10:fe1b976a3f9c | 772 | } |
takeuz | 10:fe1b976a3f9c | 773 | |
takeuz | 10:fe1b976a3f9c | 774 | void initPins() |
takeuz | 10:fe1b976a3f9c | 775 | { |
takeuz | 10:fe1b976a3f9c | 776 | // LPC_SYSCON->SYSAHBCLKCTRL1 |= (1<<7); |
takeuz | 10:fe1b976a3f9c | 777 | LPC_SWM->PINASSIGN0 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 778 | LPC_SWM->PINASSIGN1 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 779 | LPC_SWM->PINASSIGN2 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 780 | LPC_SWM->PINASSIGN3 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 781 | LPC_SWM->PINASSIGN4 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 782 | LPC_SWM->PINASSIGN5 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 783 | LPC_SWM->PINASSIGN8 = 0xffffffffUL; |
takeuz | 10:fe1b976a3f9c | 784 | // LPC_SYSCON->SYSAHBCLKCTRL1 |= (0<<7); |
takeuz | 17:8c76a8b1f46f | 785 | serialPorts[0] = new Serial(P0_11,P0_13); |
takeuz | 17:8c76a8b1f46f | 786 | serialPorts[1] = new Serial(P0_15,P0_14); |
takeuz | 17:8c76a8b1f46f | 787 | /* serialPorts[0] = new Serial(P0_16,P0_12); |
takeuz | 17:8c76a8b1f46f | 788 | serialPorts[1] = new Serial(USBTX,USBRX);*/ |
takeuz | 10:fe1b976a3f9c | 789 | klineWakeup = new DigitalOut(P0_28); |
takeuz | 10:fe1b976a3f9c | 790 | canBus = new CAN(P0_22, P0_23); |
takeuz | 10:fe1b976a3f9c | 791 | canDisableKey=new DigitalOut(P0_0,0); |
takeuz | 16:02f94a84e211 | 792 | kLineUART=new Serial(P0_28,P0_27); |
takeuz | 16:02f94a84e211 | 793 | serialPorts[interFace]->baud(9600); |
takeuz | 16:02f94a84e211 | 794 | serialPorts[debug]->baud(9600); |
takeuz | 10:fe1b976a3f9c | 795 | } |