Open OBC / e36obd

Dependents:   obdtest

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers DS2.cpp Source File

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 }