58536454b11438b10515b9aa2fe3eb4b50cdc875
[goodfet] / client / FordExperiments.py
1 import sys;
2 import binascii;
3 import array;
4 import csv, time, argparse;
5 import datetime
6 import os
7 from random import randrange
8 from GoodFETMCPCAN import GoodFETMCPCAN;
9 from GoodFETMCPCANCommunication import GoodFETMCPCANCommunication
10 from intelhex import IntelHex;
11 import Queue
12 import math
13
14 tT = time
15 class FordExperiments(GoodFETMCPCANCommunication):
16     
17     def __init__(self):
18         GoodFETMCPCANCommunication.__init__(self)
19         #super(FordExperiments,self).__init__(self) #initialize chip
20         self.freq = 500;
21
22     def mimic1056(self,packetData,runTime):
23         #setup chip
24         self.client.serInit()
25         self.spitSetup(self.freq)
26         #FIGURE out how to clear buffers
27         self.addFilter([1056, 1056, 1056, 1056,1056, 1056], verbose=False)
28         packet1 = self.client.rxpacket();
29         if(packet1 != None):
30             packetParsed = self.client.packet2parsed(packet1);
31         #keep sniffing till we read a packet
32         while( packet1 == None or packetParsed.get('sID') != 1056 ):
33             packet1 = self.client.rxpacket()
34             if(packet1 != None):
35                 packetParsed = self.client.packet2parsed(packet1)
36         recieveTime = time.time()
37         packetParsed = self.client.packet2parsed(packet1)
38         if( packetParsed['sID'] != 1056):
39             print "Sniffed wrong packet"
40             return
41         countInitial = ord(packetParsed['db3']) #initial count value
42         packet = []
43         #set data packet to match what was sniffed or at least what was input
44         for i in range(0,8):
45             idx = "db%d"%i
46             if(packetData.get(idx) == None):
47                 packet.append(ord(packetParsed.get(idx)))
48             else:
49                 packet.append(packetData.get(idx))
50         print packet
51         #### split SID into different regs
52         SIDlow = (1056 & 0x07) << 5;  # get SID bits 2:0, rotate them to bits 7:5
53         SIDhigh = (1056 >> 3) & 0xFF; # get SID bits 10:3, rotate them to bits 7:0
54         packet = [SIDhigh, SIDlow, 0x00,0x00, # pad out EID regs
55                   0x08, # bit 6 must be set to 0 for data frame (1 for RTR) 
56                   # lower nibble is DLC                   
57                  packet[0],packet[1],packet[2],packet[3],packet[4],packet[5],packet[6],packet[7]]
58         packetCount = 1;
59         self.client.txpacket(packet);
60         tpast = time.time()
61         while( (time.time()-recieveTime) < runTime):
62             #care about db3 or packet[8] that we want to count at the rate that it is
63             dT = time.time()-tpast
64             if( dT/0.2 >= 1):
65                 db3 = (countInitial + math.floor((time.time()-recieveTime)/0.2))%255
66                 packet[8] = db3
67                 self.client.txpacket(packet)
68                 packetCount += 1
69             else:
70                 packetCount += 1
71                 self.client.MCPrts(TXB0=True)
72             tpast = time.time()  #update our transmit time on the one before   
73             
74                 
75          
76     def cycledb1_1056(self,runTime):
77         #setup chip
78         self.client.serInit()
79         self.spitSetup(500)
80         #FIGURE out how to clear buffers
81         self.addFilter([1056, 1056, 1056, 1056,1056, 1056], verbose=False)
82         packet1 = self.client.rxpacket();
83         if(packet1 != None):
84             packetParsed = self.client.packet2parsed(packet1);
85         #keep sniffing till we read a packet
86         while( packet1 == None or packetParsed.get('sID') != 1056 ):
87             time.sleep(.1)
88             packet1 = self.client.rxpacket()
89             if(packet1 != None):
90                 packetParsed = self.client.packet2parsed(packet1)
91         recieveTime = time.time()
92         packetParsed = self.client.packet2parsed(packet1)
93         if( packetParsed['sID'] != 1056):
94             print "Sniffed wrong packet"
95             return
96         packet = []
97         #set data packet to match what was sniffed or at least what was input
98         for i in range(0,8):
99             idx = "db%d"%i
100             packet.append(ord(packetParsed.get(idx)))
101         packetValue = 0
102         packet[1] = packetValue;
103         
104         print packet
105         #### split SID into different regs
106         SIDlow = (1056 & 0x07) << 5;  # get SID bits 2:0, rotate them to bits 7:5
107         SIDhigh = (1056 >> 3) & 0xFF; # get SID bits 10:3, rotate them to bits 7:0
108         packet = [SIDhigh, SIDlow, 0x00,0x00, # pad out EID regs
109                   0x08, # bit 6 must be set to 0 for data frame (1 for RTR) 
110                   # lower nibble is DLC                   
111                  packet[0],packet[1],packet[2],packet[3],packet[4],packet[5],packet[6],packet[7]]
112         packetCount = 1;
113         self.client.txpacket(packet);
114         tpast = time.time()
115         while( (time.time()-recieveTime) < runTime):
116             #care about db3 or packet[8] that we want to count at the rate that it is
117             dT = time.time()-tpast
118             packetValue += 1
119             pV = packetValue%255
120             #temp = ((packetValue+1))%2
121             #if( temp == 1):
122             #    pV = packetValue%255
123             #else:
124             #    pV = 0
125             packet[6] = pV
126             #packet[6] = 1
127             print packet
128             self.client.txpacket(packet)
129             packetCount += 1
130             tpast = time.time()  #update our transmit time on the one before   
131         print packetCount;
132         
133     def getBackground(self,sId):
134         packet1 = self.client.rxpacket();
135         if(packet1 != None):
136             packetParsed = self.client.packet2parsed(packet1);
137         #keep sniffing till we read a packet
138         while( packet1 == None or packetParsed.get('sID') != sId ):
139             packet1 = self.client.rxpacket()
140             if(packet1 != None):
141                 packetParsed = self.client.packet2parsed(packet1)
142             
143         #recieveTime = time.time()
144         return packetParsed
145         
146         
147     def oscillateTemperature(self,time):
148         #setup chip
149         self.client.serInit()
150         self.spitSetup(500)
151         #FIGURE out how to clear buffers
152         self.addFilter([1056, 1056, 1056, 1056,1056, 1056], verbose=False)
153         packetParsed = self.getBackground(1056)
154         packet = []
155         #set data packet to match what was sniffed or at least what was input
156         for i in range(0,8):
157             idx = "db%d"%i
158             packet.append(ord(packetParsed.get(idx)))
159         packetValue = 0
160         packet[1] = packetValue;
161         
162         print packet
163         #### split SID into different regs
164         SIDlow = (1056 & 0x07) << 5;  # get SID bits 2:0, rotate them to bits 7:5
165         SIDhigh = (1056 >> 3) & 0xFF; # get SID bits 10:3, rotate them to bits 7:0
166         packet = [SIDhigh, SIDlow, 0x00,0x00, # pad out EID regs
167                   0x08, # bit 6 must be set to 0 for data frame (1 for RTR) 
168                   # lower nibble is DLC                   
169                  packet[0],packet[1],packet[2],packet[3],packet[4],packet[5],packet[6],packet[7]]
170         packetCount = 1;
171         self.client.txpacket(packet);
172         startTime = tT.time()
173         while( (tT.time()-startTime) < runTime):
174             dt = tT.time()-startTime
175             inputValue = ((2.0*math.pi)/20.0)*dt
176             value = 30*math.sin(inputValue)+130
177             print value
178             #packet[5] = int(value)
179             if( value > 130 ):
180                 packet[5] = 160
181             else:
182                 packet[5] = 100
183             #packet[6] = 1
184             print packet
185             self.client.txpacket(packet)
186             packetCount += 1
187             #tpast = time.time()  #update our transmit time on the one before   
188         print packetCount;
189         
190         
191 if __name__ == "__main__":
192     fe = FordExperiments();
193     packetData = {}
194     packetData['db4'] = 4;
195     runTime = 100;
196     #fe.mimic1056(packetData, runTime)
197     #fe.cycledb1_1056(runTime)
198     fe.oscillateTemperature(runTime)