Skip to content

Instantly share code, notes, and snippets.

@swkim101
Last active June 14, 2023 19:36
Show Gist options
  • Save swkim101/5b39bf81218d19db5bab61344093c7e3 to your computer and use it in GitHub Desktop.
Save swkim101/5b39bf81218d19db5bab61344093c7e3 to your computer and use it in GitHub Desktop.
cybertruck challenge 2021
"""
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 %
"""
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