Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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