Enable more flake8 checks (#1602)

* enable some more flake8 checks

* some more quick ones

* bump opendbc

* e401

* e711 e712

* e115 e116

* e222

* e301

* remove that

* e129

* e701 e702

* e125 e131

* e227

* e306

* e262

* W503

* e713

* e704

* e731

* bump opendbc

* fix some e722
albatross
Adeeb 2020-05-30 20:14:58 -07:00 committed by GitHub
parent 4fcf47812b
commit d9bf9f0a40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
79 changed files with 179 additions and 164 deletions

View File

@ -17,7 +17,8 @@ repos:
- id: flake8
exclude: '^(pyextra)|(external)|(cereal)|(rednose)|(panda)|(laika)|(laika_repo)|(rednose_repo)/'
args:
- --select=F
- --ignore=E111,E114,E121,E122,E123,E124,E126,E127,E128,E201,E202,E203,E221,E225,E226,E231,E241,E251,E261,E265,E266,E302,E303,E305,E402,E501,E502,E722,E741,W504
- --statistics
- repo: local
hooks:
- id: pylint

View File

@ -25,7 +25,7 @@ def get_imei(slot):
ret = parse_service_call_string(service_call(["iphonesubinfo", "3" ,"i32", str(slot)]))
if not ret:
# allow non android to be identified differently
ret = "%015d" % random.randint(0, 1<<32)
ret = "%015d" % random.randint(0, 1 << 32)
return ret
def get_serial():
@ -132,6 +132,7 @@ def get_network_type():
def get_network_strength(network_type):
network_strength = NetworkStrength.unknown
# from SignalStrength.java
def get_lte_level(rsrp, rssnr):
INT_MAX = 2147483647

View File

@ -39,4 +39,3 @@ def api_get(endpoint, method='GET', timeout=None, access_token=None, **params):
headers['User-Agent'] = "openpilot-" + version
return requests.request(method, backend+endpoint, timeout=timeout, headers = headers, params=params)

View File

@ -8,4 +8,3 @@ if ANDROID:
else:
PERSIST = os.path.join(BASEDIR, "persist")
PARAMS = os.path.join(BASEDIR, "persist", "params")

View File

@ -44,7 +44,8 @@ class AutoMoveTempdir():
def close(self):
os.rename(self._path, self._target_path)
def __enter__(self): return self
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
if type is None:
@ -63,7 +64,8 @@ class NamedTemporaryDir():
def close(self):
shutil.rmtree(self._path)
def __enter__(self): return self
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
self.close()

View File

@ -68,8 +68,11 @@ class SwagErrorFilter(logging.Filter):
def filter(self, record):
return record.levelno < logging.ERROR
_tmpfunc = lambda: 0
_srcfile = os.path.normcase(_tmpfunc.__code__.co_filename)
def _tmpfunc():
return 0
def _srcfile():
return os.path.normcase(_tmpfunc.__code__.co_filename)
class SwagLogger(logging.Logger):
def __init__(self):

View File

@ -6,6 +6,7 @@ def clip(x, lo, hi):
def interp(x, xp, fp):
N = len(xp)
def get_interp(xv):
hi = 0
while hi < N and xv > xp[hi]:
@ -14,8 +15,8 @@ def interp(x, xp, fp):
return fp[-1] if hi == N and xv > xp[low] else (
fp[0] if hi == 0 else
(xv - xp[low]) * (fp[hi] - fp[low]) / (xp[hi] - xp[low]) + fp[low])
return [get_interp(v) for v in x] if hasattr(
x, '__iter__') else get_interp(x)
return [get_interp(v) for v in x] if hasattr(x, '__iter__') else get_interp(x)
def mean(x):
return sum(x) / len(x)

View File

@ -195,7 +195,8 @@ class DBReader(DBAccessor):
finally:
lock.release()
def __exit__(self, type, value, traceback): pass
def __exit__(self, type, value, traceback):
pass
class DBWriter(DBAccessor):

View File

@ -43,4 +43,3 @@ class Profiler():
else:
print("%30s: %9.2f percent: %3.0f" % (n, ms*1000.0, ms/self.tot*100))
print("Iter clock: %2.6f TOTAL: %2.2f" % (self.tot/self.iter, self.tot))

View File

@ -32,7 +32,7 @@ class RunningStat():
self.S_last = 0.
else:
self.M = self.M_last + (new_data - self.M_last) / self.n
self.S = self.S_last + (new_data - self.M_last) * (new_data - self.M);
self.S = self.S_last + (new_data - self.M_last) * (new_data - self.M)
self.M_last = self.M
self.S_last = self.S

View File

@ -3,4 +3,4 @@ def replace_right(s, old, new, occurrence):
# replace_right('1232425', '2', ' ', 2) -> '123 4 5'
split = s.rsplit(old, occurrence)
return new.join(split)
return new.join(split)

View File

@ -6,4 +6,3 @@ def phone_only(x):
return x
else:
return nottest(x)

View File

@ -25,4 +25,3 @@ class Timeout:
def __exit__(self, exc_type, exc_val, exc_tb):
signal.alarm(0)

View File

@ -145,4 +145,3 @@ def pretransform_from_calib(calib):
camera_frame_from_road_frame = np.dot(eon_intrinsics, view_frame_from_road_frame)
camera_frame_from_calib_frame = get_camera_frame_from_calib_frame(camera_frame_from_road_frame)
return np.linalg.inv(camera_frame_from_calib_frame)

View File

@ -52,7 +52,7 @@ def ecef2geodetic(ecef, radians=False):
S = np.cbrt(1 + C + np.sqrt(C * C + 2 * C))
P = F / (3 * pow((S + 1 / S + 1), 2) * G * G)
Q = np.sqrt(1 + 2 * esq * esq * P)
r_0 = -(P * esq * r) / (1 + Q) + np.sqrt(0.5 * a * a*(1 + 1.0 / Q) - \
r_0 = -(P * esq * r) / (1 + Q) + np.sqrt(0.5 * a * a*(1 + 1.0 / Q) - \
P * (1 - esq) * z * z / (Q * (1 + Q)) - 0.5 * P * r * r)
U = np.sqrt(pow((r - esq * r_0), 2) + z * z)
V = np.sqrt(pow((r - esq * r_0), 2) + (1 - esq) * z * z)

View File

@ -50,12 +50,16 @@ class URLFile(object):
if self._debug:
print("downloading", self._url)
def header(x):
if b'MISS' in x:
print(x.strip())
c.setopt(pycurl.HEADERFUNCTION, header)
def test(debug_type, debug_msg):
print(" debug(%d): %s" % (debug_type, debug_msg.strip()))
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.DEBUGFUNCTION, test)
t1 = time.time()
@ -68,7 +72,7 @@ class URLFile(object):
print("get %s %r %.f slow" % (self._url, trange, t2-t1))
response_code = c.getinfo(pycurl.RESPONSE_CODE)
if response_code == 416: # Requested Range Not Satisfiable
if response_code == 416: # Requested Range Not Satisfiable
return ""
if response_code != 206 and response_code != 200:
raise Exception("Error {} ({}): {}".format(response_code, self._url, repr(dats.getvalue())[:500]))

@ -1 +1 @@
Subproject commit 0430bfa5c2b08f9cc6ab32470fe8ac9465e7a876
Subproject commit b15edbc1b5a68fd725ea45ba9442a6c9be875971

View File

@ -20,6 +20,7 @@ class Analyzer(ast.NodeVisitor):
for alias in node.names:
imps.add(alias.name)
self.generic_visit(node)
def visit_ImportFrom(self, node):
imps.add(node.module)
self.generic_visit(node)
@ -38,4 +39,3 @@ for f in sorted(pyf):
print("%d lines of parsed openpilot python" % tlns)
#print(sorted(list(imps)))

View File

@ -21,7 +21,7 @@ SafetyModel = car.CarParams.SafetyModel
# USB is optional
try:
import usb1
from usb1 import USBErrorIO, USBErrorOverflow #pylint: disable=no-name-in-module
from usb1 import USBErrorIO, USBErrorOverflow # pylint: disable=no-name-in-module
except Exception:
pass
@ -57,7 +57,7 @@ def __parse_can_buffer(dat):
for j in range(0, len(dat), 0x10):
ddat = dat[j:j+0x10]
f1, f2 = struct.unpack("II", ddat[0:8])
ret.append((f1 >> 21, f2>>16, ddat[8:8+(f2&0xF)], (f2>>4)&0xFF))
ret.append((f1 >> 21, f2 >> 16, ddat[8:8 + (f2 & 0xF)], (f2 >> 4) & 0xFF))
return ret
def can_send_many(arr):

View File

@ -6,7 +6,7 @@ from PIL import ImageFont, ImageDraw, Image
font = ImageFont.truetype("arial", size=72)
def get_frame(idx):
img = np.zeros((874, 1164, 3), np.uint8)
img[100:400, 100:100+(idx%10)*100] = 255
img[100:400, 100:100+(idx % 10)* 100] = 255
# big number
im2 = Image.new("RGB", (200,200))
@ -28,7 +28,7 @@ if __name__ == "__main__":
dat.valid = True
dat.frame = {
"frameId": idx,
"image": frm[idx%len(frm)],
"image": frm[idx % len(frm)],
}
pm.send('frame', dat)

View File

@ -128,4 +128,3 @@ def is_ecu_disconnected(fingerprint, fingerprint_list, ecu_fingerprint, car, ecu
def make_can_msg(addr, dat, bus):
return [addr, 0, dat, bus]

View File

@ -78,7 +78,7 @@ class CarController():
static_msgs = range(1653, 1658)
for addr in static_msgs:
cnt = (frame % 10) + 1
can_sends.append(make_can_msg(addr, (cnt<<4).to_bytes(1, 'little') + b'\x00\x00\x00\x00\x00\x00\x00', 1))
can_sends.append(make_can_msg(addr, (cnt << 4).to_bytes(1, 'little') + b'\x00\x00\x00\x00\x00\x00\x00', 1))
self.enabled_last = enabled
self.main_on_last = CS.out.cruiseState.available

View File

@ -6,7 +6,7 @@ def create_steer_command(packer, angle_cmd, enabled, lkas_state, angle_steers, c
"""Creates a CAN message for the Ford Steer Command."""
#if enabled and lkas available:
if enabled and lkas_state in [2,3]: #and (frame % 500) >= 3:
if enabled and lkas_state in [2,3]: # and (frame % 500) >= 3:
action = lkas_action
else:
action = 0xf

View File

@ -161,8 +161,7 @@ class CarController():
lka_active = CS.lkas_status == 1
lka_critical = lka_active and abs(actuators.steer) > 0.9
lka_icon_status = (lka_active, lka_critical)
if frame % P.CAMERA_KEEPALIVE_STEP == 0 \
or lka_icon_status != self.lka_icon_status_last:
if frame % P.CAMERA_KEEPALIVE_STEP == 0 or lka_icon_status != self.lka_icon_status_last:
steer_alert = hud_alert == VisualAlert.steerRequired
can_sends.append(gmcan.create_lka_icon_command(CanBus.SW_GMLAN, lka_active, lka_critical, steer_alert))
self.lka_icon_status_last = lka_icon_status

View File

@ -44,9 +44,9 @@ class CarState(CarStateBase):
# 1 - open, 0 - closed
ret.doorOpen = (pt_cp.vl["BCMDoorBeltStatus"]['FrontLeftDoor'] == 1 or
pt_cp.vl["BCMDoorBeltStatus"]['FrontRightDoor'] == 1 or
pt_cp.vl["BCMDoorBeltStatus"]['RearLeftDoor'] == 1 or
pt_cp.vl["BCMDoorBeltStatus"]['RearRightDoor'] == 1)
pt_cp.vl["BCMDoorBeltStatus"]['FrontRightDoor'] == 1 or
pt_cp.vl["BCMDoorBeltStatus"]['RearLeftDoor'] == 1 or
pt_cp.vl["BCMDoorBeltStatus"]['RearRightDoor'] == 1)
# 1 - latched
ret.seatbeltUnlatched = pt_cp.vl["BCMDoorBeltStatus"]['LeftSeatBelt'] == 0

View File

@ -121,4 +121,3 @@ def create_lka_icon_command(bus, active, critical, steer):
else:
dat = b"\x00\x00\x00"
return make_can_msg(0x104c006c, dat, bus)

View File

@ -71,15 +71,15 @@ class CarInterface(CarInterfaceBase):
ret.minEnableSpeed = -1. # engage speed is decided by pcm
ret.mass = 4353. * CV.LB_TO_KG + STD_CARGO_KG
ret.wheelbase = 2.86
ret.steerRatio = 14.4 #end to end is 13.46
ret.steerRatio = 14.4 # end to end is 13.46
ret.steerRatioRear = 0.
ret.centerToFront = ret.wheelbase * 0.4
elif candidate == CAR.BUICK_REGAL:
ret.minEnableSpeed = 18 * CV.MPH_TO_MS
ret.mass = 3779. * CV.LB_TO_KG + STD_CARGO_KG # (3849+3708)/2
ret.wheelbase = 2.83 #111.4 inches in meters
ret.steerRatio = 14.4 # guess for tourx
ret.wheelbase = 2.83 # 111.4 inches in meters
ret.steerRatio = 14.4 # guess for tourx
ret.steerRatioRear = 0.
ret.centerToFront = ret.wheelbase * 0.4 # guess for tourx

View File

@ -103,7 +103,7 @@ class RadarInterface(RadarInterfaceBase):
self.pts[targetId].yvRel = float('nan')
for oldTarget in list(self.pts.keys()):
if not oldTarget in currentTargets:
if oldTarget not in currentTargets:
del self.pts[oldTarget]
ret.points = list(self.pts.values())

View File

@ -20,7 +20,7 @@ def calc_cruise_offset(offset, speed):
def get_can_signals(CP):
# this function generates lists for signal, messages and initial values
# this function generates lists for signal, messages and initial values
signals = [
("XMISSION_SPEED", "ENGINE_DATA", 0),
("WHEEL_SPEED_FL", "WHEEL_SPEEDS", 0),
@ -345,5 +345,5 @@ class CarState(CarStateBase):
if CP.carFingerprint in [CAR.CRV, CAR.CRV_EU, CAR.ACURA_RDX, CAR.ODYSSEY_CHN]:
checks = [(0x194, 100)]
bus_cam = 1 if CP.carFingerprint in HONDA_BOSCH and not CP.isPandaBlack else 2
bus_cam = 1 if CP.carFingerprint in HONDA_BOSCH and not CP.isPandaBlack else 2
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, bus_cam)

View File

@ -13,7 +13,7 @@ def process_hud_alert(enabled, fingerprint, visual_alert, left_lane,
# initialize to no line visible
sys_state = 1
if left_lane and right_lane or sys_warning: #HUD alert only display when LKAS status is active
if left_lane and right_lane or sys_warning: # HUD alert only display when LKAS status is active
if enabled or sys_warning:
sys_state = 3
else:

View File

@ -113,7 +113,7 @@ class CarState(CarStateBase):
self.lkas11 = cp_cam.vl["LKAS11"]
self.clu11 = cp.vl["CLU11"]
self.park_brake = cp.vl["CGW1"]['CF_Gway_ParkBrakeSw']
self.steer_state = cp.vl["MDPS12"]['CF_Mdps_ToiActive'] #0 NOT ACTIVE, 1 ACTIVE
self.steer_state = cp.vl["MDPS12"]['CF_Mdps_ToiActive'] # 0 NOT ACTIVE, 1 ACTIVE
self.lead_distance = cp.vl["SCC11"]['ACC_ObjDist']
return ret
@ -163,7 +163,7 @@ class CarState(CarStateBase):
("ESC_Off_Step", "TCS15", 0),
("CF_Lvr_GearInf", "LVR11", 0), #Transmission Gear (0 = N or P, 1-8 = Fwd, 14 = Rev)
("CF_Lvr_GearInf", "LVR11", 0), # Transmission Gear (0 = N or P, 1-8 = Fwd, 14 = Rev)
("CR_Mdps_StrColTq", "MDPS12", 0),
("CF_Mdps_ToiActive", "MDPS12", 0),

View File

@ -113,7 +113,7 @@ class CarInterface(CarInterfaceBase):
ret.lateralTuning.pid.kf = 0.00006
ret.mass = 1275. + STD_CARGO_KG
ret.wheelbase = 2.7
ret.steerRatio = 13.73 #Spec
ret.steerRatio = 13.73 # Spec
tire_stiffness_factor = 0.385
ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.25], [0.05]]
@ -121,7 +121,7 @@ class CarInterface(CarInterfaceBase):
ret.lateralTuning.pid.kf = 0.00006
ret.mass = 1685. + STD_CARGO_KG
ret.wheelbase = 2.7
ret.steerRatio = 13.73 #Spec
ret.steerRatio = 13.73 # Spec
tire_stiffness_factor = 0.385
ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.25], [0.05]]

View File

@ -1 +0,0 @@

View File

@ -38,7 +38,7 @@ class CarController():
self.apply_steer_last = apply_steer
can_sends.append(mazdacan.create_steering_control(self.packer, CS.CP.carFingerprint,
frame, apply_steer, CS.cam_lkas))
return can_sends

View File

@ -38,7 +38,7 @@ class CarState(CarStateBase):
ret.leftBlinker = cp.vl["BLINK_INFO"]['LEFT_BLINK'] == 1
ret.rightBlinker = cp.vl["BLINK_INFO"]['RIGHT_BLINK'] == 1
ret.steeringAngle = cp.vl["STEER"]['STEER_ANGLE']
ret.steeringAngle = cp.vl["STEER"]['STEER_ANGLE']
ret.steeringTorque = cp.vl["STEER_TORQUE"]['STEER_TORQUE_SENSOR']
ret.steeringPressed = abs(ret.steeringTorque) > LKAS_LIMITS.STEER_THRESHOLD
@ -70,7 +70,7 @@ class CarState(CarStateBase):
self.cruise_speed = ret.vEgoRaw
ret.cruiseState.available = True
ret.cruiseState.enabled = cp.vl["CRZ_CTRL"]['CRZ_ACTIVE'] == 1
ret.cruiseState.enabled = cp.vl["CRZ_CTRL"]['CRZ_ACTIVE'] == 1
ret.cruiseState.speed = self.cruise_speed
if ret.cruiseState.enabled:
@ -182,4 +182,3 @@ class CarState(CarStateBase):
]
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2)

View File

@ -34,7 +34,7 @@ class CarInterface(CarInterfaceBase):
tire_stiffness_factor = 0.70 # not optimized yet
if candidate in [CAR.CX5]:
ret.mass = 3655 * CV.LB_TO_KG + STD_CARGO_KG
ret.mass = 3655 * CV.LB_TO_KG + STD_CARGO_KG
ret.wheelbase = 2.7
ret.steerRatio = 15.5

View File

@ -17,10 +17,10 @@ def create_steering_control(packer, car_fingerprint, frame, apply_steer, lkas):
b2 = int(lkas["ANGLE_ENABLED"])
tmp = steering_angle + 2048
ahi = tmp >> 10
amd = (tmp & 0x3FF) >> 2
amd = (amd >> 4) | (( amd & 0xF) << 4)
alo = (tmp & 0x3) << 2
ahi = tmp >> 10
amd = (tmp & 0x3FF) >> 2
amd = (amd >> 4) | (( amd & 0xF) << 4)
alo = (tmp & 0x3) << 2
ctr = frame % 16
# bytes: [ 1 ] [ 2 ] [ 3 ] [ 4 ]

View File

@ -3,4 +3,3 @@ from selfdrive.car.interfaces import RadarInterfaceBase
class RadarInterface(RadarInterfaceBase):
pass

View File

@ -19,8 +19,8 @@ class CAR:
class LKAS_LIMITS:
STEER_THRESHOLD = 15
DISABLE_SPEED = 45 #kph
ENABLE_SPEED = 52 #kph
DISABLE_SPEED = 45 # kph
ENABLE_SPEED = 52 # kph
class Buttons:
NONE = 0

View File

@ -1 +0,0 @@

View File

@ -42,8 +42,10 @@ class CarController():
self.steer_rate_limited = False
self.fake_ecus = set()
if CP.enableCamera: self.fake_ecus.add(Ecu.fwdCamera)
if CP.enableDsu: self.fake_ecus.add(Ecu.dsu)
if CP.enableCamera:
self.fake_ecus.add(Ecu.fwdCamera)
if CP.enableDsu:
self.fake_ecus.add(Ecu.dsu)
self.packer = CANPacker(dbc_name)

View File

@ -127,7 +127,7 @@ class CarInterface(CarInterfaceBase):
ret.wheelbase = 2.82448
ret.steerRatio = 13.7
tire_stiffness_factor = 0.7933
ret.mass = 3400. * CV.LB_TO_KG + STD_CARGO_KG #mean between normal and hybrid
ret.mass = 3400. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]]
ret.lateralTuning.pid.kf = 0.00006
@ -147,7 +147,7 @@ class CarInterface(CarInterfaceBase):
ret.wheelbase = 2.78
ret.steerRatio = 16.0
tire_stiffness_factor = 0.8
ret.mass = 4607. * CV.LB_TO_KG + STD_CARGO_KG #mean between normal and hybrid limited
ret.mass = 4607. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid limited
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.18], [0.015]] # community tuning
ret.lateralTuning.pid.kf = 0.00012 # community tuning
@ -155,7 +155,7 @@ class CarInterface(CarInterfaceBase):
stop_and_go = False
ret.safetyParam = 73
ret.wheelbase = 2.82
ret.steerRatio = 14.8 #Found at https://pressroom.toyota.com/releases/2016+avalon+product+specs.download
ret.steerRatio = 14.8 # Found at https://pressroom.toyota.com/releases/2016+avalon+product+specs.download
tire_stiffness_factor = 0.7983
ret.mass = 3505. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.17], [0.03]]

View File

@ -62,7 +62,7 @@ class RadarInterface(RadarInterfaceBase):
if self.trigger_msg not in self.updated_messages:
return None
rr = self._update(self.updated_messages)
rr = self._update(self.updated_messages)
self.updated_messages.clear()
return rr

View File

@ -803,7 +803,7 @@ FW_VERSIONS = {
b'\x01896630852100\x00\x00\x00\x00',
b'\x01896630859000\x00\x00\x00\x00',
],
(Ecu.eps, 0x7a1, None): [
(Ecu.eps, 0x7a1, None): [
b'8965B45070\x00\x00\x00\x00\x00\x00',
],
(Ecu.esp, 0x7b0, None): [
@ -844,24 +844,24 @@ FW_VERSIONS = {
},
CAR.LEXUS_RX: {
(Ecu.engine, 0x700, None): [
b'\x01896630E41200\x00\x00\x00\x00',
],
b'\x01896630E41200\x00\x00\x00\x00',
],
(Ecu.esp, 0x7b0, None): [
b'F152648473\x00\x00\x00\x00\x00\x00',
],
b'F152648473\x00\x00\x00\x00\x00\x00',
],
(Ecu.dsu, 0x791, None): [
b'881514810500\x00\x00\x00\x00',
],
b'881514810500\x00\x00\x00\x00',
],
(Ecu.eps, 0x7a1, None): [
b'8965B0E012\x00\x00\x00\x00\x00\x00',
],
b'8965B0E012\x00\x00\x00\x00\x00\x00',
],
(Ecu.fwdRadar, 0x750, 0xf): [
b'8821F4701100\x00\x00\x00\x00',
],
b'8821F4701100\x00\x00\x00\x00',
],
(Ecu.fwdCamera, 0x750, 0x6d): [
b'8646F4802001\x00\x00\x00\x00',
b'8646F4802100\x00\x00\x00\x00',
],
b'8646F4802001\x00\x00\x00\x00',
b'8646F4802100\x00\x00\x00\x00',
],
},
CAR.LEXUS_RXH: {
(Ecu.engine, 0x7e0, None): [

View File

@ -1 +0,0 @@

View File

@ -67,7 +67,7 @@ class CarController():
self.hcaEnabledFrameCount = 0
else:
self.hcaEnabledFrameCount += 1
if self.hcaEnabledFrameCount >= 118 * (100 / P.HCA_STEP): # 118s
if self.hcaEnabledFrameCount >= 118 * (100 / P.HCA_STEP): # 118s
# The Kansas I-70 Crosswind Problem: if we truly do need to steer
# in one direction for > 360 seconds, we have to disable HCA for a
# frame while actively steering. Testing shows we can just set the

View File

@ -27,4 +27,3 @@ class UIParams:
car_front = 2.6924 * lidar_zoom
car_back = 1.8796 * lidar_zoom
car_color = 110

View File

@ -223,7 +223,7 @@ class Controls:
# Only allow engagement with brake pressed when stopped behind another stopped car
if CS.brakePressed and self.sm['plan'].vTargetFuture >= STARTING_TARGET_SPEED \
and not self.CP.radarOffCan and CS.vEgo < 0.3:
and not self.CP.radarOffCan and CS.vEgo < 0.3:
self.events.add(EventName.noTarget)
@ -372,7 +372,7 @@ class Controls:
# Send a "steering required alert" if saturation count has reached the limit
if (lac_log.saturated and not CS.steeringPressed) or \
(self.saturated_count > STEER_ANGLE_SATURATION_TIMEOUT):
(self.saturated_count > STEER_ANGLE_SATURATION_TIMEOUT):
# Check if we deviated from the path
left_deviation = actuators.steer > 0 and path_plan.dPoly[3] > 0.1
right_deviation = actuators.steer < 0 and path_plan.dPoly[3] < -0.1

View File

@ -71,4 +71,4 @@ def main():
is_rhd_checked = True
if __name__ == '__main__':
main()
main()

View File

@ -116,7 +116,7 @@ class LatControlINDI():
indi_log.delta = float(delta_u)
indi_log.output = float(self.output_steer)
check_saturation = (CS.vEgo> 10.) and not CS.steeringRateLimited and not CS.steeringPressed
check_saturation = (CS.vEgo> 10.) and not CS.steeringRateLimited and not CS.steeringPressed
indi_log.saturated = self._check_saturation(self.output_steer, check_saturation, steers_max)
return float(self.output_steer), float(self.angle_steers_des), indi_log

View File

@ -79,8 +79,8 @@ class LatControlLQR():
i = self.i_lqr + self.ki * self.i_rate * error
control = lqr_output + i
if ((error >= 0 and (control <= steers_max or i < 0.0)) or \
(error <= 0 and (control >= -steers_max or i > 0.0))):
if (error >= 0 and (control <= steers_max or i < 0.0)) or \
(error <= 0 and (control >= -steers_max or i > 0.0)):
self.i_lqr = i
self.output_steer = lqr_output + self.i_lqr

View File

@ -194,4 +194,3 @@ class VehicleModel():
Yaw rate [rad/s]
"""
return self.calc_curvature(sa, u) * u

View File

@ -52,7 +52,8 @@ class TestAlerts(unittest.TestCase):
continue
for i, txt in enumerate([alert.alert_text_1, alert.alert_text_2]):
if i >= len(fonts[alert.alert_size]): break
if i >= len(fonts[alert.alert_size]):
break
font = fonts[alert.alert_size][i]
w, h = draw.textsize(txt, font)

View File

@ -65,7 +65,7 @@ def run_DState_seq(driver_state_msgs, driver_car_interaction, openpilot_status,
for idx in range(len(driver_state_msgs)):
e = Events()
DS.get_pose(driver_state_msgs[idx], [0,0,0], 0, openpilot_status[idx])
# cal_rpy and car_speed don't matter here
# cal_rpy and car_speed don't matter here
# evaluate events at 10Hz for tests
DS.update(e, driver_car_interaction[idx], openpilot_status[idx], car_standstill_status[idx])

View File

@ -11,10 +11,13 @@ from common.android import ANDROID
if os.getenv("NOLOG") or os.getenv("NOCRASH") or not ANDROID:
def capture_exception(*args, **kwargs):
pass
def bind_user(**kwargs):
pass
def bind_extra(**kwargs):
pass
def install():
pass
else:
@ -38,6 +41,7 @@ else:
def install():
# installs a sys.excepthook
__excepthook__ = sys.excepthook
def handle_exception(*exc_info):
if exc_info[0] not in (KeyboardInterrupt, SystemExit):
capture_exception()

View File

@ -1,5 +1,5 @@
import importlib
from setproctitle import setproctitle #pylint: disable=no-name-in-module
from setproctitle import setproctitle # pylint: disable=no-name-in-module
import cereal.messaging as messaging
import selfdrive.crash as crash

View File

@ -8,4 +8,3 @@ class Calibration:
UNCALIBRATED = 0
CALIBRATED = 1
INVALID = 2

View File

@ -133,5 +133,3 @@ on of this parser
self.ionoAlpha = []
self.ionoBeta = []
self.ionoCoeffsValid = False

View File

@ -12,7 +12,8 @@ for ublox version 8, not all functions may work.
import struct
import time, os
import os
import time
# protocol constants
PREAMBLE1 = 0xb5
@ -291,7 +292,7 @@ class UBloxDescriptor:
fields = self.fields[:]
for f in fields:
(fieldname, alen) = ArrayParse(f)
if not fieldname in msg._fields:
if fieldname not in msg._fields:
break
if alen == -1:
f1.append(msg._fields[fieldname])
@ -327,7 +328,7 @@ class UBloxDescriptor:
ret = self.name + ': '
for f in self.fields:
(fieldname, alen) = ArrayParse(f)
if not fieldname in msg._fields:
if fieldname not in msg._fields:
continue
v = msg._fields[fieldname]
if isinstance(v, list):
@ -591,7 +592,7 @@ class UBloxMessage:
if not self.valid():
raise UBloxError('INVALID MESSAGE')
type = self.msg_type()
if not type in msg_types:
if type not in msg_types:
raise UBloxError('Unknown message %s length=%u' % (str(type), len(self._buf)))
msg_types[type].unpack(self)
return self._fields, self._recs
@ -601,7 +602,7 @@ class UBloxMessage:
if not self.valid():
raise UBloxError('INVALID MESSAGE')
type = self.msg_type()
if not type in msg_types:
if type not in msg_types:
raise UBloxError('Unknown message %s' % str(type))
msg_types[type].pack(self)
@ -610,7 +611,7 @@ class UBloxMessage:
if not self.valid():
raise UBloxError('INVALID MESSAGE')
type = self.msg_type()
if not type in msg_types:
if type not in msg_types:
raise UBloxError('Unknown message %s length=%u' % (str(type), len(self._buf)))
return msg_types[type].name

View File

@ -83,7 +83,7 @@ def configure_ublox(dev):
def int_to_bool_list(num):
# for parsing bool bytes
return [bool(num & (1<<n)) for n in range(8)]
return [bool(num & (1 << n)) for n in range(8)]
def gen_ephemeris(ephem_data):
@ -134,9 +134,9 @@ def gen_solution(msg):
msg_data['day'],
msg_data['hour'],
msg_data['min'],
msg_data['sec'])
- datetime.datetime(1970,1,1)).total_seconds())*1e+03
+ msg_data['nano']*1e-06)
msg_data['sec']) -
datetime.datetime(1970,1,1)).total_seconds())*1e+03 +
msg_data['nano']*1e-06)
gps_fix = {'bearing': msg_data['headMot']*1e-05, # heading of motion in degrees
'altitude': msg_data['height']*1e-03, # altitude above ellipsoid
'latitude': msg_data['lat']*1e-07, # latitude in degrees
@ -164,8 +164,8 @@ def gen_nav_data(msg, nav_frame_buffer):
# parse GPS ephem
gnssId = msg_meta_data['gnssId']
if gnssId == 0:
svId = msg_meta_data['svid']
subframeId = GET_FIELD_U(measurements[1]['dwrd'], 3, 8)
svId = msg_meta_data['svid']
subframeId = GET_FIELD_U(measurements[1]['dwrd'], 3, 8)
words = []
for m in measurements:
words.append(m['dwrd'])
@ -244,7 +244,7 @@ def init_reader():
return dev
except serial.serialutil.SerialException as e:
print(e)
port_counter = (port_counter + 1)%len(ports)
port_counter = (port_counter + 1) % len(ports)
time.sleep(2)
def handle_msg(dev, msg, nav_frame_buffer):

View File

@ -6,4 +6,3 @@ from selfdrive.loggerd.uploader import UPLOAD_ATTR_NAME
for fn in sys.argv[1:]:
print("unmarking %s" % fn)
removexattr(fn, UPLOAD_ATTR_NAME)

View File

@ -166,7 +166,7 @@ class Uploader():
if url_resp.status_code == 412:
self.last_resp = url_resp
return
url_resp_json = json.loads(url_resp.text)
url = url_resp_json['url']
headers = url_resp_json['headers']
@ -174,9 +174,11 @@ class Uploader():
if fake_upload:
cloudlog.info("*** WARNING, THIS IS A FAKE UPLOAD TO %s ***" % url)
class FakeResponse():
def __init__(self):
self.status_code = 200
self.last_resp = FakeResponse()
else:
with open(fn, "rb") as f:

View File

@ -10,7 +10,7 @@ class ManeuverPlot():
def __init__(self, title = None):
self.time_array = []
self.gas_array = []
self.gas_array = []
self.brake_array = []
self.steer_torque_array = []
@ -37,9 +37,9 @@ class ManeuverPlot():
self.fcw_array = []
self.title = title
def add_data(self, time, gas, brake, steer_torque, distance, speed,
acceleration, up_accel_cmd, ui_accel_cmd, uf_accel_cmd, d_rel, v_rel,
def add_data(self, time, gas, brake, steer_torque, distance, speed,
acceleration, up_accel_cmd, ui_accel_cmd, uf_accel_cmd, d_rel, v_rel,
v_lead, v_target_lead, pid_speed, cruise_speed, jerk_factor, a_target, fcw):
self.time_array.append(time)
self.gas_array.append(gas)
@ -70,7 +70,7 @@ class ManeuverPlot():
if not os.path.exists(path + "/" + maneuver_name):
os.makedirs(path + "/" + maneuver_name)
plt_num = 0
# speed chart ===================
plt_num += 1
plt.figure(plt_num)
@ -140,4 +140,3 @@ class ManeuverPlot():
pylab.savefig("/".join([path, maneuver_name, 'distance.svg']), dpi=1000)
plt.close("all")

View File

@ -29,7 +29,7 @@ CP = CarInterface.get_params(CAR.CIVIC, {0: {0x201: 6}, 1: {}, 2: {}, 3: {}})
def can_cksum(mm):
s = 0
for c in mm:
s += (c>>4)
s += (c >> 4)
s += c & 0xF
s = 8-s
s %= 0x10
@ -45,7 +45,7 @@ def car_plant(pos, speed, grade, gas, brake):
mass = 1700
aero_cd = 0.3
force_peak = mass*3.
force_brake_peak = -mass*10. #1g
force_brake_peak = -mass*10. # 1g
power_peak = 100000 # 100kW
speed_base = power_peak/force_peak
rolling_res = 0.01
@ -277,13 +277,13 @@ class Plant():
vls = vls_tuple(
self.speed_sensor(speed),
self.speed_sensor(speed), self.speed_sensor(speed), self.speed_sensor(speed), self.speed_sensor(speed),
self.angle_steer, self.angle_steer_rate, 0, 0,#Steer torque sensor
self.angle_steer, self.angle_steer_rate, 0, 0, # Steer torque sensor
0, 0, # Blinkers
self.gear_choice,
speed != 0,
self.brake_error, self.brake_error,
not self.seatbelt, self.seatbelt, # Seatbelt
self.brake_pressed, 0., #Brake pressed, Brake switch
self.brake_pressed, 0., # Brake pressed, Brake switch
cruise_buttons,
self.esp_disabled,
0, # HUD lead
@ -339,9 +339,9 @@ class Plant():
# TODO: use the DBC
if self.frame % 5 == 0:
radar_state_msg = b'\x79\x00\x00\x00\x00\x00\x00\x00'
radar_msg = to_3_byte(d_rel*16.0) + \
to_3_byte(int(lateral_pos_rel*16.0)&0x3ff) + \
to_3s_byte(int(v_rel*32.0)) + \
radar_msg = to_3_byte(d_rel * 16.0) + \
to_3_byte(int(lateral_pos_rel * 16.0) & 0x3ff) + \
to_3s_byte(int(v_rel * 32.0)) + \
b"0f00000"
radar_msg = binascii.unhexlify(radar_msg)

View File

@ -6,7 +6,8 @@ import numbers
import dictdiffer
if "CI" in os.environ:
tqdm = lambda x: x
def tqdm(x):
return x
else:
from tqdm import tqdm # type: ignore
@ -32,7 +33,7 @@ def remove_ignored_fields(msg, ignore):
for k in keys[:-1]:
try:
attr = getattr(msg, k)
except:
except AttributeError:
break
else:
v = getattr(attr, keys[-1])
@ -46,8 +47,7 @@ def remove_ignored_fields(msg, ignore):
return msg.as_reader()
def compare_logs(log1, log2, ignore_fields=[], ignore_msgs=[]):
filter_msgs = lambda m: m.which() not in ignore_msgs
log1, log2 = [list(filter(filter_msgs, log)) for log in (log1, log2)]
log1, log2 = [list(filter(lambda m: m.which() not in ignore_msgs, log)) for log in (log1, log2)]
assert len(log1) == len(log2), "logs are not same length: " + str(len(log1)) + " VS " + str(len(log2))
diff = []

View File

@ -1,11 +1,13 @@
#!/usr/bin/env python3
import capnp
import os
import sys
import threading
import importlib
if "CI" in os.environ:
tqdm = lambda x: x
def tqdm(x):
return x
else:
from tqdm import tqdm # type: ignore
@ -110,7 +112,7 @@ class FakePubMaster(messaging.PubMaster):
for s in services:
try:
data = messaging.new_message(s)
except:
except capnp.lib.capnp.KjException:
data = messaging.new_message(s, 0)
self.data[s] = data.as_reader()
self.sock[s] = DumbSocket()

View File

@ -124,7 +124,7 @@ if __name__ == "__main__":
process_replay_dir = os.path.dirname(os.path.abspath(__file__))
try:
ref_commit = open(os.path.join(process_replay_dir, "ref_commit")).read().strip()
except:
except FileNotFoundError:
print("couldn't find reference commit")
sys.exit(1)
@ -139,7 +139,7 @@ if __name__ == "__main__":
results: Any = {}
for car_brand, segment in segments:
if (cars_whitelisted and car_brand.upper() not in args.whitelist_cars) or \
(not cars_whitelisted and car_brand.upper() in args.blacklist_cars):
(not cars_whitelisted and car_brand.upper() in args.blacklist_cars):
continue
print("***** testing route segment %s *****\n" % segment)
@ -151,7 +151,7 @@ if __name__ == "__main__":
for cfg in CONFIGS:
if (procs_whitelisted and cfg.proc_name not in args.whitelist_procs) or \
(not procs_whitelisted and cfg.proc_name in args.blacklist_procs):
(not procs_whitelisted and cfg.proc_name in args.blacklist_procs):
continue
cmp_log_fn = os.path.join(process_replay_dir, "%s_%s_%s.bz2" % (segment, cfg.proc_name, ref_commit))

View File

@ -261,7 +261,7 @@ routes = {
'enableCamera': True,
'enableDsu': False,
},
"7e34a988419b5307|2019-12-18--19-13-30": {
"7e34a988419b5307|2019-12-18--19-13-30": {
'carFingerprint': TOYOTA.RAV4H_TSS2,
'enableCamera': True,
'fingerprintSource': 'fixed'
@ -286,12 +286,12 @@ routes = {
'enableCamera': True,
'enableDsu': False,
},
"886fcd8408d570e9|2020-01-29--05-11-22": {
"886fcd8408d570e9|2020-01-29--05-11-22": {
'carFingerprint': TOYOTA.LEXUS_RX,
'enableCamera': True,
'enableDsu': True,
},
"886fcd8408d570e9|2020-01-29--02-18-55": {
"886fcd8408d570e9|2020-01-29--02-18-55": {
'carFingerprint': TOYOTA.LEXUS_RX,
'enableCamera': True,
'enableDsu': False,
@ -301,12 +301,12 @@ routes = {
'enableCamera': True,
'enableDsu': True,
},
"01b22eb2ed121565|2020-02-02--11-25-51": {
"01b22eb2ed121565|2020-02-02--11-25-51": {
'carFingerprint': TOYOTA.LEXUS_RX_TSS2,
'enableCamera': True,
'fingerprintSource': 'fixed',
},
"b74758c690a49668|2020-05-20--15-58-57": {
"b74758c690a49668|2020-05-20--15-58-57": {
'carFingerprint': TOYOTA.LEXUS_RXH_TSS2,
'enableCamera': True,
'fingerprintSource': 'fixed',

View File

@ -14,7 +14,7 @@ def setup_leon_fan():
bus.write_i2c_block_data(0x67, 0xa, [0])
else:
bus.write_i2c_block_data(0x67, 0xa, [0x20])
bus.write_i2c_block_data(0x67, 0x8, [(i-1)<<6])
bus.write_i2c_block_data(0x67, 0x8, [(i - 1) << 6])
time.sleep(1)
bus.close()

View File

@ -100,7 +100,7 @@ def set_eon_fan(val):
else:
#bus.write_i2c_block_data(0x67, 0x45, [0])
bus.write_i2c_block_data(0x67, 0xa, [0x20])
bus.write_i2c_block_data(0x67, 0x8, [(val-1)<<6])
bus.write_i2c_block_data(0x67, 0x8, [(val - 1) << 6])
else:
bus.write_byte_data(0x21, 0x04, 0x2)
bus.write_byte_data(0x21, 0x03, (val*2)+1)

View File

@ -51,7 +51,7 @@ pygame.joystick.init()
textPrint = TextPrint()
# -------- Main Program Loop -----------
while done==False:
while not done:
# EVENT PROCESSING STEP
for event in pygame.event.get(): # User did something
if event.type == pygame.QUIT: # If user clicked close
@ -122,4 +122,4 @@ while done==False:
# Close the window and quit.
# If you forget this line, the program will 'hang'
# on exit if running from IDLE.
pygame.quit ()
pygame.quit()

View File

@ -111,10 +111,12 @@ class RouteSegment(object):
self.camera_path = camera_path
@property
def name(self): return str(self._name)
def name(self):
return str(self._name)
@property
def canonical_name(self): return self._name
def canonical_name(self):
return self._name
class RouteSegmentName(object):
def __init__(self, name_str):
@ -123,6 +125,8 @@ class RouteSegmentName(object):
self._num = int(num_str)
@property
def segment_num(self): return self._num
def segment_num(self):
return self._num
def __str__(self): return self._segment_name_str
def __str__(self):
return self._segment_name_str

View File

@ -82,5 +82,8 @@ class RouteFrameReader(object):
for fr in frs:
fr.close()
def __enter__(self): return self
def __exit__(self, type, value, traceback): self.close()
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
self.close()

View File

@ -73,7 +73,7 @@ def draw_path(y, x, color, img, calibration, top_down, lid_color=None):
uv_model > 0, axis=1), uv_model[:, 0] < img.shape[1] - 1, uv_model[:, 1] <
img.shape[0] - 1))]
for i, j in ((-1, 0), (0, -1), (0, 0), (0, 1), (1, 0)):
for i, j in ((-1, 0), (0, -1), (0, 0), (0, 1), (1, 0)):
img[uv_model_dots[:, 1] + i, uv_model_dots[:, 0] + j] = color
# draw lidar path point on lidar
@ -88,12 +88,12 @@ def draw_path(y, x, color, img, calibration, top_down, lid_color=None):
def draw_steer_path(speed_ms, curvature, color, img,
calibration, top_down, VM, lid_color=None):
path_x = np.arange(101.)
path_y = np.multiply(path_x, np.tan(np.arcsin(np.clip(path_x * curvature, -0.999, 0.999)) / 2.))
path_y = np.multiply(path_x, np.tan(np.arcsin(np.clip(path_x * curvature, -0.999, 0.999)) / 2.))
draw_path(path_y, path_x, color, img, calibration, top_down, lid_color)
def draw_lead_car(closest, top_down):
if closest != None:
if closest is not None:
closest_y = int(round(UP.lidar_car_y - closest * UP.lidar_zoom))
if closest_y > 0:
top_down[1][int(round(UP.lidar_car_x - METER_WIDTH * 2)):int(
@ -118,12 +118,10 @@ def init_plots(arr, name_to_arr_idx, plot_xlims, plot_ylims, plot_names, plot_co
"p": (0,1,1),
"m": (1,0,1) }
if bigplots == True:
if bigplots:
fig = plt.figure(figsize=(6.4, 7.0))
elif bigplots == False:
fig = plt.figure()
else:
fig = plt.figure(figsize=bigplots)
fig = plt.figure()
fig.set_facecolor((0.2,0.2,0.2))
@ -135,7 +133,7 @@ def init_plots(arr, name_to_arr_idx, plot_xlims, plot_ylims, plot_names, plot_co
ax.patch.set_facecolor((0.4, 0.4, 0.4))
axs.append(ax)
plots = [] ;idxs = [] ;plot_select = []
plots, idxs, plot_select = [], [], []
for i, pl_list in enumerate(plot_names):
for j, item in enumerate(pl_list):
plot, = axs[i].plot(arr[:, name_to_arr_idx[item]],

View File

@ -341,15 +341,19 @@ def get_arg_parser():
parser.add_argument("route_name", type=(lambda x: x.replace("#", "|")), nargs="?",
help="The route whose messages will be published.")
parser.add_argument("data_dir", nargs='?', default=os.getenv('UNLOGGER_DATA_DIR'),
help="Path to directory in which log and camera files are located.")
help="Path to directory in which log and camera files are located.")
parser.add_argument("--no-loop", action="store_true", help="Stop at the end of the replay.")
key_value_pair = lambda x: x.split("=")
def key_value_pair(x):
return x.split("=")
parser.add_argument("address_mapping", nargs="*", type=key_value_pair,
help="Pairs <service>=<zmq_addr> to publish <service> on <zmq_addr>.")
comma_list = lambda x: x.split(",")
def comma_list(x):
return x.split(",")
to_mock_group = parser.add_mutually_exclusive_group()
to_mock_group.add_argument("--min", action="store_true", default=os.getenv("MIN"))
to_mock_group.add_argument("--enabled", default=os.getenv("ENABLED"), type=comma_list)

View File

@ -200,7 +200,7 @@ def go(q):
speed = math.sqrt(vel.x**2 + vel.y**2 + vel.z**2) * 3.6
can_function(pm, speed, fake_wheel.angle, rk.frame, cruise_button=cruise_button, is_engaged=is_openpilot_engaged)
if rk.frame%1 == 0: # 20Hz?
if rk.frame % 1 == 0: # 20Hz?
throttle_op, brake_op, steer_torque_op = sendcan_function(sendcan)
# print(" === torq, ",steer_torque_op, " ===")
if is_openpilot_engaged:

View File

@ -28,8 +28,8 @@ def can_function(pm, speed, angle, idx, cruise_button=0, is_engaged=False):
msg.append(packer.make_can_msg("SCM_BUTTONS", 0, {"CRUISE_BUTTONS": cruise_button}, idx))
values = {"COUNTER_PEDAL": idx&0xF}
checksum = crc8_pedal(packer.make_can_msg("GAS_SENSOR", 0, {"COUNTER_PEDAL": idx&0xF}, -1)[2][:-1])
values = {"COUNTER_PEDAL": idx & 0xF}
checksum = crc8_pedal(packer.make_can_msg("GAS_SENSOR", 0, {"COUNTER_PEDAL": idx & 0xF}, -1)[2][:-1])
values["CHECKSUM_PEDAL"] = checksum
msg.append(packer.make_can_msg("GAS_SENSOR", 0, values, -1))
@ -56,7 +56,7 @@ def can_function(pm, speed, angle, idx, cruise_button=0, is_engaged=False):
msg.append(packer.make_can_msg("BRAKE_COMMAND", 2, {}, idx))
# radar
if idx%5 == 0:
if idx % 5 == 0:
msg.append(rpacker.make_can_msg("RADAR_DIAGNOSTIC", 1, {"RADAR_STATE": 0x79}, -1))
for i in range(16):
msg.append(rpacker.make_can_msg("TRACK_%d" % i, 1, {"LONG_DIST": 255.5}, -1))

View File

@ -1,6 +1,8 @@
#!/usr/bin/env python3
# set up wheel
import os, struct, array
import array
import os
import struct
from fcntl import ioctl
# Iterate over the joystick devices.

View File

@ -6,4 +6,4 @@ if __name__ == '__main__':
params = Params()
params.put("HasAcceptedTerms", str(terms_version, 'utf-8'))
params.put("CompletedTrainingVersion", str(training_version, 'utf-8'))
print("Terms Accepted!")
print("Terms Accepted!")