bmw ds2 for e36
Embed:
(wiki syntax)
Show/hide line numbers
DS2.cpp
00001 #include "DS2.h" 00002 00003 00004 DS2Packet::DS2Packet(int maxlength) 00005 { 00006 has8BitAddr = 0; 00007 rawdata = (char*)malloc(maxlength); 00008 address = (unsigned short*)rawdata; 00009 length = rawdata + 2; 00010 data = rawdata + 3; 00011 checksum = rawdata + maxlength - 1; 00012 00013 *length = 0; 00014 } 00015 00016 DS2Packet::DS2Packet(int address, const char* data, int length) 00017 { 00018 has8BitAddr = 0; 00019 rawdata = (char*)malloc(length + 4); 00020 this->address = (unsigned short*)rawdata; 00021 this->length = rawdata + 2; 00022 this->data = rawdata + 3; 00023 this->checksum = rawdata + 3 + length; 00024 00025 rawdata[0] = address & 0xff; 00026 rawdata[1] = (address >> 8) & 0xff; 00027 rawdata[2] = length + 4; 00028 memcpy(rawdata + 3, data, length); 00029 00030 updateChecksum(); 00031 } 00032 00033 DS2Packet::~DS2Packet() 00034 { 00035 free(rawdata); 00036 } 00037 00038 void DS2Packet::has8BitAddress(bool b) 00039 { 00040 if(b && !has8BitAddr) 00041 { 00042 *address <<= 8; 00043 *length -= 1; 00044 rawdata += 1; 00045 updateChecksum(); 00046 } 00047 else if(!b && has8BitAddr) 00048 { 00049 *address >>= 8; 00050 *length += 1; 00051 rawdata -= 1; 00052 updateChecksum(); 00053 } 00054 has8BitAddr = b; 00055 } 00056 00057 void DS2Packet::updateChecksum() 00058 { 00059 *checksum = 0; 00060 for(int i = 0; i < *length - 1; i++) 00061 *checksum ^= rawdata[i]; 00062 } 00063 00064 00065 DS2::DS2(Bus* KLine, Bus* LLine) : 00066 k(KLine), l(LLine) 00067 { 00068 k->baud(9600); 00069 l->baud(9600); 00070 k->format(8, Serial::Even, 1); 00071 l->format(8, Serial::Even, 1); 00072 } 00073 00074 DS2::~DS2() 00075 { 00076 00077 } 00078 00079 int DS2::sendPacket(DS2Packet* packet, Bus* bus) 00080 { 00081 dbg.printf("sent: "); 00082 for(int i = 0; i < packet->getLength(); i++) 00083 { 00084 dbg.printf("%02x ", packet->getRawData()[i]); 00085 } 00086 dbg.printf("on %s bus\r\n", (bus == k)? "k":"l"); 00087 00088 return bus->send(packet->getRawData(), packet->getLength()); 00089 } 00090 00091 //reads in a whole packet without verification; assumes the whole packet is in the uart buffer 00092 DS2Packet* DS2::getPacket(Bus* bus) 00093 { 00094 DS2Packet* packet = new DS2Packet(DS2_MTU); 00095 int count = bus->get(packet->getRawData(), DS2_MTU); 00096 00097 dbg.printf("received: "); 00098 for(int i = 0; i < count; i++) 00099 dbg.printf("%02x ", packet->getRawData()[i]); 00100 dbg.printf("on %s bus\r\n", (bus == k)? "k":"l"); 00101 00102 return packet; 00103 } 00104 00105 DS2Packet* DS2::getPacket8(Bus* bus) 00106 { 00107 DS2Packet* packet = new DS2Packet(DS2_MTU); 00108 packet->has8BitAddress(1); 00109 int count = bus->get(packet->getRawData(), DS2_MTU); 00110 00111 dbg.printf("received: "); 00112 for(int i = 0; i < count; i++) 00113 dbg.printf("%02x ", packet->getRawData()[i]); 00114 dbg.printf("on %s bus\r\n", (bus == k)? "k":"l"); 00115 00116 return packet; 00117 } 00118 00119 //snoop k and l traffic and print it to dbg 00120 //doesn't return 00121 void DS2::snoop() 00122 { 00123 dbg.printf("sniffing data on k and l\r\n"); 00124 dbg.printf("k = <0x??>\r\nl = [0x??]\r\n"); 00125 dbg.printf("begin INPA traffic now\r\n"); 00126 int squelch = 0; 00127 while(1) 00128 { 00129 if(k->readable()) 00130 { 00131 dbg.printf("<%02x>", k->getc()); 00132 squelch = 10000; 00133 } 00134 else if(l->readable()) 00135 { 00136 dbg.printf("[%02x]", l->getc()); 00137 squelch = 10000; 00138 } 00139 else if(squelch) 00140 { 00141 if(!--squelch) 00142 dbg.printf("\r\n"); 00143 } 00144 } 00145 } 00146 00147 //try to query a module on the two different buses and with the two different packet types 00148 void DS2::testModule(int address) 00149 { 00150 //assemble an identification request packet 00151 DS2Packet *packet = new DS2Packet(address, DS2_IDENTIFY, sizeof(DS2_IDENTIFY)); 00152 00153 //try on k first 00154 dbg.printf("trying module with 16 bit address 0x%02x on k bus\r\n", packet->getAddress()); 00155 sendPacket(packet, k); 00156 wait(0.5); 00157 if(k->readable()) //the module sent a reply 00158 { 00159 DS2Packet* reply = getPacket(k); 00160 dbg.printf("***received %i bytes from module at 0x%02x on k bus\r\n", reply->getLength(), reply->getAddress()); 00161 delete reply; 00162 00163 } 00164 00165 //then try with 8 bit address 00166 packet->has8BitAddress(1); 00167 dbg.printf("trying module with 8 bit address 0x%02x on k bus\r\n", packet->getAddress()); 00168 sendPacket(packet, k); 00169 wait(0.5); 00170 if(k->readable()) 00171 { 00172 DS2Packet* reply = getPacket8(k); 00173 dbg.printf("***received %i bytes from module at 0x%02x on k bus\r\n", reply->getLength(), reply->getAddress()); 00174 delete reply; 00175 } 00176 00177 //now try on l 00178 packet->has8BitAddress(0); 00179 dbg.printf("trying module with 16 bit address 0x%02x on l bus\r\n", packet->getAddress()); 00180 sendPacket(packet, l); 00181 wait(0.5); 00182 if(k->readable()) 00183 { 00184 DS2Packet* reply = getPacket(k); 00185 dbg.printf("***received %i bytes from module at 0x%02x on k bus\r\n", reply->getLength(), reply->getAddress()); 00186 delete reply; 00187 } 00188 00189 //8 bit address again 00190 packet->has8BitAddress(1); 00191 dbg.printf("trying module with 8 bit address 0x%02x on l bus\r\n", packet->getAddress()); 00192 sendPacket(packet, l); 00193 wait(0.5); 00194 if(k->readable()) 00195 { 00196 DS2Packet* reply = getPacket8(k); 00197 reply->has8BitAddress(1); 00198 dbg.printf("***received %i bytes from module at 0x%02x on k bus\r\n", reply->getLength(), reply->getAddress()); 00199 delete reply; 00200 } 00201 00202 00203 delete packet; 00204 } 00205 00206 //if I knew of a module that was guaranteed to be the same in every car I'd test querying it here 00207 bool DS2::test() 00208 { 00209 return 1; 00210 }
Generated on Fri Jul 22 2022 12:21:05 by
1.7.2