Last active
June 14, 2023 19:36
-
-
Save swkim101/5b39bf81218d19db5bab61344093c7e3 to your computer and use it in GitHub Desktop.
cybertruck challenge 2021
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
For CyberTruck Challenge 2021 | |
https://www.cybertruckchallenge.org/participate/truck-challenges/ | |
""" | |
from enum import Enum | |
class dotdict(dict): | |
"""dot.notation access to dictionary attributes""" | |
__getattr__ = dict.get | |
__setattr__ = dict.__setitem__ | |
__delattr__ = dict.__delitem__ | |
mask = { | |
"priority": 0b11100000000000000000000000000, | |
"reserved": 0b00010000000000000000000000000, | |
"dp": 0b00001000000000000000000000000, | |
"pdu": 0b00000111111110000000000000000, | |
"destination": 0b00000000000001111111100000000, | |
"group_extension": 0b00000000000001111111100000000, | |
"source": 0b00000000000000000000011111111, | |
"pgn": 0b00011111111111111111100000000, | |
} | |
mask = dotdict(mask) | |
class Canid: | |
def __init__(self, value): | |
self.value = value | |
@property | |
def priority(self): | |
return (self.value & mask.priority) >> 26 | |
@property | |
def reserved(self): | |
return (self.value & mask.reserved) >> 25 | |
@property | |
def dp(self): | |
return (self.value & mask.dp) >> 24 | |
@property | |
def pdu(self): | |
return (self.value & mask.pdu) >> 16 | |
@property | |
def destination(self): | |
return (self.value & mask.destination) >> 8 | |
@property | |
def group_extension(self): | |
return (self.value & mask.group_extension) >> 8 | |
@property | |
def source(self): | |
return self.value & mask.source | |
@property | |
def pgn(self): | |
return (self.value & mask.pgn) >> 8 | |
# pgn65256 - Vehicle Direction/Speed - VDS | |
class PGN65215: | |
def __init__(self, value): | |
self.value = value | |
@property | |
def front_axle_speed(self): | |
return (self.value >> 48) / 256 | |
@property | |
def front_axle_speed_left(self): | |
offset = self.value & 0xFF0000000000 | |
diff = -7.8125 | |
diff = (offset >> 40) / 16 + diff | |
return self.front_axle_speed + diff | |
@property | |
def front_axle_speed_right(self): | |
offset = self.value & 0xFF00000000 | |
diff = -7.8125 | |
diff = (offset >> 32) / 16 + diff | |
return self.front_axle_speed + diff | |
@property | |
def front_axle_speed_left(self): | |
offset = self.value & 0xFF0000000000 | |
diff = -7.8125 | |
diff = (offset >> 40) / 16 + diff | |
return self.front_axle_speed + diff | |
@property | |
def front_axle_speed_right(self): | |
offset = self.value & 0xFF00000000 | |
diff = -7.8125 | |
diff = (offset >> 32) / 16 + diff | |
return self.front_axle_speed + diff | |
@property | |
def rear_axle_speed_left(self): | |
offset = self.value & 0xFF000000 | |
diff = -7.8125 | |
diff = (offset >> 24) / 16 + diff | |
return self.front_axle_speed + diff | |
@property | |
def rear_axle_speed_right(self): | |
offset = self.value & 0xFF0000 | |
diff = -7.8125 | |
diff = (offset >> 16) / 16 + diff | |
return self.front_axle_speed + diff | |
class PGN61444: | |
def __init__(self, value): | |
self.value = value | |
@property | |
def engine_speed(self): | |
offset = self.value & 0xFFFF000000 | |
a = 0.125 #rpm per bit | |
return (offset >> 24) * a | |
class PGN65265: | |
def __init__(self, value): | |
self.value = value | |
@property | |
def cruise_control_states(self): | |
offset = self.value & 0b11100000000 | |
offset = offset >> 8 | |
status_table = [ | |
"Off/Disabled", | |
"Hold", | |
"Accelerate", | |
"Decelerate/Coast", | |
"Resume", | |
"Set", | |
"Accelerate override", | |
"Not available", | |
] | |
# 0b000 = "Off/Disabled" | |
# 0b001 = "Hold" | |
# 0b010 = "Accelerate" | |
# 0b011 = "Decelerate/Coast" | |
# 0b100 = "Resume" | |
# 0b101 = "Set" | |
# 0b110 = "Accelerate override" | |
# 0b111 = "Not available" | |
return status_table[offset] | |
@property | |
def brake_switch_states(self): | |
offset = self.value >> 32 | |
offset = offset & 0b1100 | |
offset = offset >> 2 | |
status_table = [ | |
"Brake pedal released", | |
"Brake pedal depressed", | |
"Error", | |
"Not available", | |
] | |
# 0b00 = "Brake pedal released" | |
# 0b01 = "Brake pedal depressed" | |
# 0b10 = "Error" | |
# 0b11 = "Not available" | |
return status_table[offset] | |
with open("j1939.raw", "r") as f: | |
pgnset = set() | |
sourceset = set() | |
topspeed = 0 | |
lowestrpm = 9999 | |
is_cruised = False | |
is_braked = False | |
for line in f: | |
canid = Canid(int(line.split("#")[0], 16)) | |
data = int(line.split("#")[1], 16) | |
pgnset.add(canid.pgn) | |
sourceset.add(canid.source) | |
if (canid.pgn == 65215): | |
data = PGN65215(data) | |
topspeed = topspeed if topspeed > data.front_axle_speed else data.front_axle_speed | |
continue | |
if (canid.pgn == 61444): | |
data = PGN61444(data) | |
lowestrpm = lowestrpm if lowestrpm < data.engine_speed else data.engine_speed | |
continue | |
if (canid.pgn == 65265): | |
data = PGN65265(data) | |
if data.cruise_control_states not in ["Off/Disabled", "Not available"]: | |
is_cruised = True | |
if data.brake_switch_states == "Brake pedal released": | |
is_braked = True | |
continue | |
# if (canid.pdu >= 240): | |
# print (" priority | pdu2 | gext | src | pgn") | |
# pgnset.add(canid.pgn) | |
# if (canid.pdu < 240): | |
# print (" priority | pdu1 | dest | src") | |
pgnset_list = list(pgnset) | |
sourceset_list = list(sourceset) | |
print("What was the top speed in whole miles per hour of the truck during this time period?") | |
print(topspeed, " mph") # 98.07421875 mph | |
print("What was the lowest engine speed in RPM during this time period?") | |
print(lowestrpm, " rpm") # 579.625 rpm | |
print("Did the driver have the cruise control set during this time?") | |
print(is_cruised) # False | |
print("Did the driver press the service brake pedal during this time?") | |
print(is_braked) # True | |
print("How many different controller applications broadcasting data on the J1939 network during this time?") | |
print(len(sourceset_list)) # 9 | |
print("How many parameter group numbers are on the network at this time?") | |
print(len(pgnset_list)) # 54 | |
print("What is the CAN bus load during this time?") | |
print("24.8327%") # 24.8327%, manual | |
# Related PGNs | |
# mph, top speed | |
# pgn65134 - High Resolution Wheel Speed - HRW | |
# pgn65215 - Wheel Speed Information - EBC2 | |
# pgn65256 - Vehicle Direction/Speed - VDS | |
# pgn65217 - High Resolution Vehicle Distance - VDHR | |
# pgn65248 - Vehicle Distance - VD | |
# RPM, lowest engine speed | |
# pgn65108 | |
# pgn65170 - Engine Information - EI -> NO RPM | |
# pgn65207 - Engine Speed/Load Factor Information | |
# Y / N, cruise control | |
# pgn65206 - Trip Vehicle Speed/Cruise Distance Information - TVI | |
# pgn65105 - Adaptive Cruise Control, Operator Input - ACC2 | |
# pgn65265 - Cruise Control/Vehicle Speed - CCVS | |
# pgn65261 - Cruise Control/Vehicle Speed Setup - CCSS | |
# pgn65135 - Adaptive Cruise Control - ACC1 | |
# Y / N, press service brake pedal | |
# pgn65212 - Compression/Service Brake Information - CBI | |
# pgn61441 - Electronic Brake Controller 1 - EBC1 | |
# pgn65274 - Brakes - B | |
# count, How many different controller applications? | |
# count, How many parameter group numbers? | |
# ??, CAN bus load during | |
# Bus load = Used capacity / Max capacity | |
""" | |
What was the top speed in whole miles per hour of the truck during this time period? | |
98.07421875 mph | |
What was the lowest engine speed in RPM during this time period? | |
579.625 rpm | |
Did the driver have the cruise control set during this time? | |
False | |
Did the driver press the service brake pedal during this time? | |
True | |
How many different controller applications broadcasting data on the J1939 network during this time? | |
9 | |
How many parameter group numbers are on the network at this time? | |
54 | |
What is the CAN bus load during this time? | |
24.8327 % | |
62.093kbps / 250kbps = | |
load: 24.8327 % | |
""" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
18FEF200#180194018502FFFF | |
1CFE9201#FF24C6FFFFFFFFFF | |
14F00031#CFFFFFFFFFFFFFFF | |
0C000F0B#FCFFFA00FFFFFFFF | |
0CF00400#F1D0CD5A1D00FFCD | |
18FEDF00#860013FF7EFFFFFF | |
18FEF600#FF0F5F41FFA033FF | |
14F00131#FFFFFFFF00FFFFFF | |
10FF2121#72551FC0C0FFFFE1 | |
0C00100B#FCFFFA00FFFFFFFF | |
0CF00400#F1D0CC451D00FFCC | |
14FF3131#0030030000FFFFFF | |
14FEF121#F3FFFF0FFFFFFFFF | |
14FF2321#000CE1FFFFFFFFFF | |
0C00290B#FCFFFA00FFFFFFFF | |
0CF00400#F1D0CD2F1D00FFCD | |
18FF3000#0000FFFFFFFFFFFF | |
18FEF500#C6FFFF10265FFFFF | |
18FEF117#F3FFFFFFFFFFFFFF | |
18F00F3D#A00FFFFFFFFFFFFF | |
14FEF131#CFFFFFF300FFFF30 | |
14FF0121#FFFFFFFFFFFFFCFF | |
18FE4F3E#0400FFFFFFFFFFFF | |
0CF00400#F1D0CC2A1D00FFCC | |
14FFA000#FCFFFFFFFFFFFFFF | |
18FEF000#FFFFFF0000F000FF | |
0CF00421#FFFFFFFFFFFFFFFF | |
0CF00A01#C01F822BFFFFFFFF | |
10F01A01#0000FFFFFFFFFFFF | |
14FF0221#FFFFFFFFFFFFFFFF | |
18F0010B#C0FFF0FFFF0DFF3F | |
0CF00400#F1D0CD2E1D00FFCD | |
0CF00300#DCF15FFFFFFFC8FF | |
18FEF100#C36C140000000030 | |
18FEE000#1BC9A8001BC9A800 | |
14FDA421#FFFFFFFFFFFFFFFF | |
0CF00400#F1D0CC251D00FFCC | |
18FEDF00#860013FF7FFFFFFF | |
14FEF031#FFFFFFFFFFFC00FF | |
10FF2121#72551FC0C0FFFFE1 | |
18FF2221#0355C30701F3FFFF | |
0CF00400#F1D0CC181D00FFCC | |
18F00100#FFFFFFFFFFFFFFFF | |
18FEEE00#7F56802CFFFF5FFF | |
0CF00400#F1D0CC161D00FFCC | |
18F0000F#007DFFFF0F7DFFFF | |
18FEA400#FFFFFFFFFFFFFFFF | |
18F00F3D#A00FFFFFFFFFFFFF | |
18FDB23D#FFFFC0321B00FFFF | |
18FDB400#0934C032FFFFFFFF | |
18FD8C3D#26000A00FFFFFFFF | |
18FECA3D#03FF00000000FFFF | |
18FFA53D#000A750088357F32 | |
18FFA43D#000000000000FDFF | |
18FFA33D#9807E80357125046 | |
18FFA23D#0000CF261E041810 | |
18FFA13D#2807730723000050 | |
0CF00400#F1D0CC1A1D00FFCC | |
18FFA03D#2322220028001CFF | |
10FE6F00#FFFFFFFFFFFFFFFF | |
18FEBD00#FA0B4A24FFFFFFFF | |
0C00000B#FCFFFAFAFFFFFFFF | |
0CF00A01#D71D902BFFFFFFFF | |
10F01A01#0000FFFFFFFFFFFF | |
10FDA301#FFFFFFFFFFFFFFFF | |
18FDD001#FFFFFF4141FFFFFF | |
18FEDB01#B321B321B321FFFF | |
18FD9401#0007FFFFFFFFFFFF | |
0CF00400#F1D0CC201D00FFCC | |
18FEBF0B#33137E7B827FFFFF | |
0CF00300#DCF660FFFFFFC8FF | |
1CFE9201#FFE8C4FFFFFFFFFF | |
18FEF200#180194018502FFFF | |
18FF7400#D600FFFFFFFFFFFF | |
14F00031#CFFFFFFFFFFFFFFF | |
0CF00400#F1D0CC1A1D00FFCC | |
18FEDF00#860013FF7FFFFFFF | |
18FD7C00#F8F3C074FDFFE3FF | |
14F00131#FFFFFFFF00FFFFFF | |
10FF2121#72551FC0C0FFFFE1 | |
0CF00400#F1D0CD121D00FFCD | |
18FEE400#007FFFFC033FFFFF | |
14FF3131#0030030000FFFFFF | |
14FEF121#F3FFFF0FFFFFFFFF | |
14FF2321#000CE1FFFFFFFFFF | |
0CF00400#F1D0CD131D00FFCD | |
18FF3000#0000FFFFFFFFFFFF | |
18FEF117#F3FFFFFFFFFFFFFF | |
18F00F3D#A00FFFFFFFFFFFFF | |
14FEF131#CFFFFFF300FFFF30 | |
14FF0121#FFFFFFFFFFFFFCFF | |
18FE4F3E#0400FFFFFFFFFFFF | |
0CF00400#F1D0CD201D00FFCD | |
14FFA000#FCFFFFFFFFFFFFFF | |
18FEF000#FFFFFF0000F000FF | |
0CF00421#FFFFFFFFFFFFFFFF | |
0CF00A01#881DAD2BFFFFFFFF | |
10F01A01#0000FFFFFFFFFFFF | |
14FF0221#FFFFFFFFFFFFFFFF | |
18F0010B#C0FFF0FFFF0DFF3F | |
0CF00400#F1D0CD251D00FFCD | |
0CF00300#DCF860FFFFFFC8FF | |
18FEF100#C336140000000030 | |
18FEE000#1BC9A8001BC9A800 | |
14FDA421#FFFFFFFFFFFFFFFF | |
0CF00400#F1D0CD2A1D00FFCD | |
18FEDF00#860013FF7FFFFFFF | |
14FEF031#FFFFFFFFFFFC00FF | |
10FF2121#72551FC0C0FFFFE1 | |
0CF00400#F8D0CD321D00FFCD | |
18F00100#FFFFFFFFFFFFFFFF | |
18FE5600#F840FFFF1FFFFFFF | |
18FF2421#EDF0FFFFFFFFFFFF | |
0CF00400#F8D0CD4E1D00FFCD | |
18F0000F#007DFFFF0F7DFFFF | |
18FEC100#AFA37B10AFA37B10 | |
18F00F3D#A00FFFFFFFFFFFFF | |
18FDB23D#FFFFC0321B00FFFF | |
18FDB400#0934C032FFFFFFFF | |
18FD8C3D#26000A00FFFFFFFF | |
0CF00400#F8D0CD611D00FFCD | |
10FE6F00#FFFFFFFFFFFFFFFF | |
18FEF700#FFFFFFFF17011701 | |
0C00000B#FCFFFAFAFFFFFFFF | |
0CF00A01#961DEE2BFFFFFFFF | |
10F01A01#0000FFFFFFFFFFFF | |
10FDA301#FFFFFFFFFFFFFFFF | |
18FDD001#FFFFFF4141FFFFFF | |
18FEDB01#B321B321B321FFFF | |
18FD9401#5008FFFFFFFFFFFF | |
0CF00400#F8D0CE6E1D00FFCE | |
18FEBF0B#62137F7A807EFFFF | |
0CF00300#DCFA60FFFFFFC8FF | |
1CFE9201#FF8CC4FFFFFFFFFF | |
18FEF200#1801C1028502FFFF | |
14F00031#CFFFFFFFFFFFFFFF | |
0C000F0B#FCFFFA00FFFFFFFF | |
0CF00400#F8D0CE7D1D00FFCE | |
18FEDF00#860013FF7FFFFFFF | |
14F00131#FFFFFFFF00FFFFFF | |
10FF2121#72551FC0C0FFFFE1 | |
0C00100B#FCFFFA00FFFFFFFF | |
0CF00400#F8D0CE931D00FFCE | |
14FF3131#0030030000FFFFFF | |
14FEF121#F3FFFF0FFFFFFFFF | |
14FF2321#000CE1FFFFFFFFFF | |
0C00290B#FCFFFA00FFFFFFFF | |
0CF00400#F8D0CEA81D00FFCE | |
18FF3000#0000FFFFFFFFFFFF | |
18FEF117#F3FFFFFFFFFFFFFF | |
18F00F3D#A00FFFFFFFFFFFFF | |
14FEF131#CFFFFFF300FFFF30 | |
14FF0121#FFFFFFFFFFFFFCFF | |
18FE4F3E#0400FFFFFFFFFFFF | |
0CF00400#F8D0CFB61D00FFCF | |
14FFA000#FCFFFFFFFFFFFFFF | |
18FEF000#FFFFFF0000F000FF | |
0CF00421#FFFFFFFFFFFFFFFF | |
0CF00A01#2D1E5A2CFFFFFFFF | |
10F01A01#0000FFFFFFFFFFFF | |
14FF0221#FFFFFFFFFFFFFFFF | |
18F0010B#C0FFF0FFFF0DFF3F | |
0CF00400#F8D1CFB31D00FFCF | |
0CF00300#DCFA62FFFFFFCDFF | |
18FEF100#C394140000000030 | |
18FEE000#1BC9A8001BC9A800 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment