getting ready for Python 3 (#619)

* tabs to spaces
python 2 to 3: https://portingguide.readthedocs.io/en/latest/syntax.html#tabs-and-spaces

* use the new except syntax
python 2 to 3: https://portingguide.readthedocs.io/en/latest/exceptions.html#the-new-except-syntax

* make relative imports absolute
python 2 to 3: https://portingguide.readthedocs.io/en/latest/imports.html#absolute-imports

* Queue renamed to queue in python 3
Use the six compatibility library to support both python 2 and 3: https://portingguide.readthedocs.io/en/latest/stdlib-reorg.html#renamed-modules

* replace dict.has_key() with in
python 2 to 3: https://portingguide.readthedocs.io/en/latest/dicts.html#removed-dict-has-key

* make dict views compatible with python 3
python 2 to 3: https://portingguide.readthedocs.io/en/latest/dicts.html#dict-views-and-iterators
Where needed, wrapping things that will be a view in python 3 with a list(). For example, if it's accessed with []
Python 3 has no iter*() methods, so just using the values() instead of itervalues() as long as it's not too performance intensive. Note that any minor performance hit of using a list instead of a view will go away when switching to python 3. If it is intensive, we could use the six version.

* Explicitly use truncating division
python 2 to 3: https://portingguide.readthedocs.io/en/latest/numbers.html#division
python 3 treats / as float division. When we want the result to be an integer, use //

* replace map() with list comprehension where a list result is needed.
In python 3, map() returns an iterator.
python 2 to 3: https://portingguide.readthedocs.io/en/latest/iterators.html#new-behavior-of-map-and-filter

* replace filter() with list comprehension
In python 3, filter() returns an interatoooooooooooor.
python 2 to 3: https://portingguide.readthedocs.io/en/latest/iterators.html#new-behavior-of-map-and-filter

* wrap zip() in list() where we need the result to be a list
python 2 to 3: https://portingguide.readthedocs.io/en/latest/iterators.html#new-behavior-of-zip

* clean out some lint
Removes these pylint warnings:
************* Module selfdrive.car.chrysler.chryslercan
W: 15, 0: Unnecessary semicolon (unnecessary-semicolon)
W: 16, 0: Unnecessary semicolon (unnecessary-semicolon)
W: 25, 0: Unnecessary semicolon (unnecessary-semicolon)
************* Module common.dbc
W:101, 0: Anomalous backslash in string: '\?'. String constant might be missing an r prefix. (anomalous-backslash-in-string)
************* Module selfdrive.car.gm.interface
R:102, 6: Redefinition of ret.minEnableSpeed type from float to int (redefined-variable-type)
R:103, 6: Redefinition of ret.mass type from int to float (redefined-variable-type)
************* Module selfdrive.updated
R: 20, 6: Redefinition of r type from int to str (redefined-variable-type)

old-commit-hash: 9dae0bfac4
commatwo_master
Drew Hintz 6 years ago committed by rbiasini
parent 83dfc3ca1f
commit 3ad68e4378
  1. 4
      common/dbc.py
  2. 2
      common/fingerprints.py
  3. 4
      common/sympy_helpers.py
  4. 8
      common/transformations/camera.py
  5. 10
      selfdrive/athena/athenad.py
  6. 11
      selfdrive/boardd/boardd.py
  7. 2
      selfdrive/can/packer.py
  8. 2
      selfdrive/can/parser.py
  9. 4
      selfdrive/can/process_dbc.py
  10. 6
      selfdrive/car/chrysler/chryslercan.py
  11. 2
      selfdrive/car/chrysler/chryslercan_test.py
  12. 12
      selfdrive/car/chrysler/radar_interface.py
  13. 6
      selfdrive/car/ford/radar_interface.py
  14. 8
      selfdrive/car/gm/carcontroller.py
  15. 14
      selfdrive/car/gm/interface.py
  16. 4
      selfdrive/car/gm/radar_interface.py
  17. 6
      selfdrive/car/honda/carcontroller.py
  18. 6
      selfdrive/car/honda/radar_interface.py
  19. 2
      selfdrive/car/subaru/subarucan.py
  20. 8
      selfdrive/car/toyota/carcontroller.py
  21. 7
      selfdrive/car/toyota/radar_interface.py
  22. 2
      selfdrive/controls/lib/latcontrol_helpers.py
  23. 8
      selfdrive/controls/lib/pathplanner.py
  24. 2
      selfdrive/controls/lib/planner.py
  25. 2
      selfdrive/controls/radard.py
  26. 10
      selfdrive/locationd/calibrationd.py
  27. 6
      selfdrive/locationd/kalman/loc_local_kf.py
  28. 4
      selfdrive/locationd/kalman/loc_local_model.py
  29. 4
      selfdrive/locationd/test/ci_test.py
  30. 4
      selfdrive/locationd/test/ublox.py
  31. 4
      selfdrive/locationd/test/ubloxd.py
  32. 4
      selfdrive/locationd/test/ubloxd_easy.py
  33. 4
      selfdrive/locationd/test/ubloxd_py_test.py
  34. 2
      selfdrive/manager.py
  35. 2
      selfdrive/mapd/default_speeds_generator.py
  36. 10
      selfdrive/mapd/mapd.py
  37. 4
      selfdrive/mapd/mapd_helpers.py
  38. 4
      selfdrive/test/plant/maneuver.py
  39. 2
      selfdrive/test/plant/plant.py
  40. 6
      selfdrive/test/plant/plant_ui.py
  41. 6
      selfdrive/updated.py

@ -98,7 +98,7 @@ class dbc(object):
sgname = dat.group(2) sgname = dat.group(2)
defvals = dat.group(3) defvals = dat.group(3)
defvals = defvals.replace("?","\?") #escape sequence in C++ defvals = defvals.replace("?",r"\?") #escape sequence in C++
defvals = defvals.split('"')[:-1] defvals = defvals.split('"')[:-1]
defs = defvals[1::2] defs = defvals[1::2]
@ -112,7 +112,7 @@ class dbc(object):
self.def_vals[ids].append((sgname, defvals)) self.def_vals[ids].append((sgname, defvals))
for msg in self.msgs.viewvalues(): for msg in self.msgs.values():
msg[1].sort(key=lambda x: x.start_bit) msg[1].sort(key=lambda x: x.start_bit)
self.msg_name_to_address = {} self.msg_name_to_address = {}

@ -61,4 +61,4 @@ def eliminate_incompatible_cars(msg, candidate_cars):
def all_known_cars(): def all_known_cars():
"""Returns a list of all known car strings.""" """Returns a list of all known car strings."""
return _FINGERPRINTS.keys() return list(_FINGERPRINTS.keys())

@ -75,7 +75,7 @@ def sympy_into_c(sympy_functions):
routines.append(r) routines.append(r)
[(c_name, c_code), (h_name, c_header)] = codegen.get_code_generator('C', 'ekf', 'C99').write(routines, "ekf") [(c_name, c_code), (h_name, c_header)] = codegen.get_code_generator('C', 'ekf', 'C99').write(routines, "ekf")
c_code = '\n'.join(filter(lambda x: len(x) > 0 and x[0] != '#', c_code.split("\n"))) c_code = '\n'.join(x for x in c_code.split("\n") if len(x) > 0 and x[0] != '#')
c_header = '\n'.join(filter(lambda x: len(x) > 0 and x[0] != '#', c_header.split("\n"))) c_header = '\n'.join(x for x in c_header.split("\n") if len(x) > 0 and x[0] != '#')
return c_header, c_code return c_header, c_code

@ -15,13 +15,13 @@ eon_intrinsics = np.array([
leon_dcam_intrinsics = np.array([ leon_dcam_intrinsics = np.array([
[650, 0, 816/2], [650, 0, 816//2],
[ 0, 650, 612/2], [ 0, 650, 612//2],
[ 0, 0, 1]]) [ 0, 0, 1]])
eon_dcam_intrinsics = np.array([ eon_dcam_intrinsics = np.array([
[860, 0, 1152/2], [860, 0, 1152//2],
[ 0, 860, 864/2], [ 0, 860, 864//2],
[ 0, 0, 1]]) [ 0, 0, 1]])
# aka 'K_inv' aka view_frame_from_camera_frame # aka 'K_inv' aka view_frame_from_camera_frame

@ -6,7 +6,7 @@ import time
import threading import threading
import traceback import traceback
import zmq import zmq
import Queue import six.moves.queue
from jsonrpc import JSONRPCResponseManager, dispatcher from jsonrpc import JSONRPCResponseManager, dispatcher
from websocket import create_connection, WebSocketTimeoutException from websocket import create_connection, WebSocketTimeoutException
@ -21,8 +21,8 @@ ATHENA_HOST = os.getenv('ATHENA_HOST', 'wss://athena.comma.ai')
HANDLER_THREADS = os.getenv('HANDLER_THREADS', 4) HANDLER_THREADS = os.getenv('HANDLER_THREADS', 4)
dispatcher["echo"] = lambda s: s dispatcher["echo"] = lambda s: s
payload_queue = Queue.Queue() payload_queue = six.moves.queue.Queue()
response_queue = Queue.Queue() response_queue = six.moves.queue.Queue()
def handle_long_poll(ws): def handle_long_poll(ws):
end_event = threading.Event() end_event = threading.Event()
@ -52,7 +52,7 @@ def jsonrpc_handler(end_event):
data = payload_queue.get(timeout=1) data = payload_queue.get(timeout=1)
response = JSONRPCResponseManager.handle(data, dispatcher) response = JSONRPCResponseManager.handle(data, dispatcher)
response_queue.put_nowait(response) response_queue.put_nowait(response)
except Queue.Empty: except six.moves.queue.Empty:
pass pass
except Exception as e: except Exception as e:
cloudlog.exception("athena jsonrpc handler failed") cloudlog.exception("athena jsonrpc handler failed")
@ -87,7 +87,7 @@ def ws_send(ws, end_event):
try: try:
response = response_queue.get(timeout=1) response = response_queue.get(timeout=1)
ws.send(response.json) ws.send(response.json)
except Queue.Empty: except six.moves.queue.Empty:
pass pass
except Exception: except Exception:
traceback.print_exc() traceback.print_exc()

@ -127,16 +127,13 @@ def boardd_mock_loop():
while 1: while 1:
tsc = messaging.drain_sock(logcan, wait_for_one=True) tsc = messaging.drain_sock(logcan, wait_for_one=True)
snds = map(lambda x: can_capnp_to_can_list(x.can), tsc) snds = [can_capnp_to_can_list(x.can) for x in tsc]
snd = [] snds = [x for x in snds if x[-1] <= 1]
for s in snds: can_send_many(snds)
snd += s
snd = filter(lambda x: x[-1] <= 1, snd)
can_send_many(snd)
# recv @ 100hz # recv @ 100hz
can_msgs = can_recv() can_msgs = can_recv()
print("sent %d got %d" % (len(snd), len(can_msgs))) print("sent %d got %d" % (len(snds), len(can_msgs)))
m = can_list_to_can_capnp(can_msgs) m = can_list_to_can_capnp(can_msgs)
sendcan.send(m.to_bytes()) sendcan.send(m.to_bytes())

@ -20,7 +20,7 @@ class CANPacker(object):
def pack(self, addr, values, counter): def pack(self, addr, values, counter):
values_thing = [] values_thing = []
for name, value in values.iteritems(): for name, value in values.items():
if name not in self.sig_names: if name not in self.sig_names:
self.sig_names[name] = ffi.new("char[]", name) self.sig_names[name] = ffi.new("char[]", name)

@ -58,7 +58,7 @@ class CANParser(object):
{ {
'address': msg_address, 'address': msg_address,
'check_frequency': freq, 'check_frequency': freq,
} for msg_address, freq in message_options.iteritems()]) } for msg_address, freq in message_options.items()])
self.can = libdbc.can_init(bus, dbc_name, len(message_options_c), message_options_c, self.can = libdbc.can_init(bus, dbc_name, len(message_options_c), message_options_c,
len(signal_options_c), signal_options_c, sendcan, tcp_addr) len(signal_options_c), signal_options_c, sendcan, tcp_addr)

@ -39,10 +39,10 @@ def main():
continue #skip output is newer than template and dbc continue #skip output is newer than template and dbc
msgs = [(address, msg_name, msg_size, sorted(msg_sigs, key=lambda s: s.name not in ("COUNTER", "CHECKSUM"))) # process counter and checksums first msgs = [(address, msg_name, msg_size, sorted(msg_sigs, key=lambda s: s.name not in ("COUNTER", "CHECKSUM"))) # process counter and checksums first
for address, ((msg_name, msg_size), msg_sigs) in sorted(can_dbc.msgs.iteritems()) if msg_sigs] for address, ((msg_name, msg_size), msg_sigs) in sorted(can_dbc.msgs.items()) if msg_sigs]
def_vals = {a: set(b) for a,b in can_dbc.def_vals.items()} #remove duplicates def_vals = {a: set(b) for a,b in can_dbc.def_vals.items()} #remove duplicates
def_vals = [(address, sig) for address, sig in sorted(def_vals.iteritems())] def_vals = [(address, sig) for address, sig in sorted(def_vals.items())]
if can_dbc.name.startswith("honda") or can_dbc.name.startswith("acura"): if can_dbc.name.startswith("honda") or can_dbc.name.startswith("acura"):
checksum_type = "honda" checksum_type = "honda"

@ -12,8 +12,8 @@ def calc_checksum(data):
end_index = len(data) end_index = len(data)
index = 0 index = 0
checksum = 0xFF checksum = 0xFF
temp_chk = 0; temp_chk = 0
bit_sum = 0; bit_sum = 0
if(end_index <= index): if(end_index <= index):
return False return False
for index in range(0, end_index): for index in range(0, end_index):
@ -22,7 +22,7 @@ def calc_checksum(data):
iterate = 8 iterate = 8
while(iterate > 0): while(iterate > 0):
iterate -= 1 iterate -= 1
bit_sum = curr & shift; bit_sum = curr & shift
temp_chk = checksum & 0x80 temp_chk = checksum & 0x80
if (bit_sum != 0): if (bit_sum != 0):
bit_sum = 0x1C bit_sum = 0x1C

@ -1,4 +1,4 @@
import chryslercan from selfdrive.car.chrysler import chryslercan
from selfdrive.can.packer import CANPacker from selfdrive.can.packer import CANPacker
from cereal import car from cereal import car

@ -25,29 +25,29 @@ def _create_radard_can_parser():
# The factor and offset are applied by the dbc parsing library, so the # The factor and offset are applied by the dbc parsing library, so the
# default values should be after the factor/offset are applied. # default values should be after the factor/offset are applied.
signals = zip(['LONG_DIST'] * msg_n + signals = list(zip(['LONG_DIST'] * msg_n +
['LAT_DIST'] * msg_n + ['LAT_DIST'] * msg_n +
['REL_SPEED'] * msg_n, ['REL_SPEED'] * msg_n,
RADAR_MSGS_C * 2 + # LONG_DIST, LAT_DIST RADAR_MSGS_C * 2 + # LONG_DIST, LAT_DIST
RADAR_MSGS_D, # REL_SPEED RADAR_MSGS_D, # REL_SPEED
[0] * msg_n + # LONG_DIST [0] * msg_n + # LONG_DIST
[-1000] * msg_n + # LAT_DIST [-1000] * msg_n + # LAT_DIST
[-146.278] * msg_n) # REL_SPEED set to 0, factor/offset to this [-146.278] * msg_n)) # REL_SPEED set to 0, factor/offset to this
# TODO what are the checks actually used for? # TODO what are the checks actually used for?
# honda only checks the last message, # honda only checks the last message,
# toyota checks all the messages. Which do we want? # toyota checks all the messages. Which do we want?
checks = zip(RADAR_MSGS_C + checks = list(zip(RADAR_MSGS_C +
RADAR_MSGS_D, RADAR_MSGS_D,
[20]*msg_n + # 20Hz (0.05s) [20]*msg_n + # 20Hz (0.05s)
[20]*msg_n) # 20Hz (0.05s) [20]*msg_n)) # 20Hz (0.05s)
return CANParser(os.path.splitext(dbc_f)[0], signals, checks, 1) return CANParser(os.path.splitext(dbc_f)[0], signals, checks, 1)
def _address_to_track(address): def _address_to_track(address):
if address in RADAR_MSGS_C: if address in RADAR_MSGS_C:
return (address - RADAR_MSGS_C[0]) / 2 return (address - RADAR_MSGS_C[0]) // 2
if address in RADAR_MSGS_D: if address in RADAR_MSGS_D:
return (address - RADAR_MSGS_D[0]) / 2 return (address - RADAR_MSGS_D[0]) // 2
raise ValueError("radar received unexpected address %d" % address) raise ValueError("radar received unexpected address %d" % address)
class RadarInterface(object): class RadarInterface(object):

@ -14,10 +14,10 @@ RADAR_MSGS = range(0x500, 0x540)
def _create_radard_can_parser(): def _create_radard_can_parser():
dbc_f = 'ford_fusion_2018_adas.dbc' dbc_f = 'ford_fusion_2018_adas.dbc'
msg_n = len(RADAR_MSGS) msg_n = len(RADAR_MSGS)
signals = zip(['X_Rel'] * msg_n + ['Angle'] * msg_n + ['V_Rel'] * msg_n, signals = list(zip(['X_Rel'] * msg_n + ['Angle'] * msg_n + ['V_Rel'] * msg_n,
RADAR_MSGS * 3, RADAR_MSGS * 3,
[0] * msg_n + [0] * msg_n + [0] * msg_n) [0] * msg_n + [0] * msg_n + [0] * msg_n))
checks = zip(RADAR_MSGS, [20]*msg_n) checks = list(zip(RADAR_MSGS, [20]*msg_n))
return CANParser(os.path.splitext(dbc_f)[0], signals, checks, 1) return CANParser(os.path.splitext(dbc_f)[0], signals, checks, 1)

@ -104,7 +104,7 @@ class CarController(object):
apply_steer = 0 apply_steer = 0
self.apply_steer_last = apply_steer self.apply_steer_last = apply_steer
idx = (frame / P.STEER_STEP) % 4 idx = (frame // P.STEER_STEP) % 4
if self.car_fingerprint in SUPERCRUISE_CARS: if self.car_fingerprint in SUPERCRUISE_CARS:
can_sends += gmcan.create_steering_control_ct6(self.packer_pt, can_sends += gmcan.create_steering_control_ct6(self.packer_pt,
@ -134,7 +134,7 @@ class CarController(object):
# Gas/regen and brakes - all at 25Hz # Gas/regen and brakes - all at 25Hz
if (frame % 4) == 0: if (frame % 4) == 0:
idx = (frame / 4) % 4 idx = (frame // 4) % 4
at_full_stop = enabled and CS.standstill at_full_stop = enabled and CS.standstill
near_stop = enabled and (CS.v_ego < P.NEAR_STOP_BRAKE_PHASE) near_stop = enabled and (CS.v_ego < P.NEAR_STOP_BRAKE_PHASE)
@ -153,13 +153,13 @@ class CarController(object):
tt = sec_since_boot() tt = sec_since_boot()
if frame % time_and_headlights_step == 0: if frame % time_and_headlights_step == 0:
idx = (frame / time_and_headlights_step) % 4 idx = (frame // time_and_headlights_step) % 4
can_sends.append(gmcan.create_adas_time_status(canbus.obstacle, int((tt - self.start_time) * 60), idx)) can_sends.append(gmcan.create_adas_time_status(canbus.obstacle, int((tt - self.start_time) * 60), idx))
can_sends.append(gmcan.create_adas_headlights_status(canbus.obstacle)) can_sends.append(gmcan.create_adas_headlights_status(canbus.obstacle))
speed_and_accelerometer_step = 2 speed_and_accelerometer_step = 2
if frame % speed_and_accelerometer_step == 0: if frame % speed_and_accelerometer_step == 0:
idx = (frame / speed_and_accelerometer_step) % 4 idx = (frame // speed_and_accelerometer_step) % 4
can_sends.append(gmcan.create_adas_steering_status(canbus.obstacle, idx)) can_sends.append(gmcan.create_adas_steering_status(canbus.obstacle, idx))
can_sends.append(gmcan.create_adas_accelerometer_speed_status(canbus.obstacle, CS.v_ego, idx)) can_sends.append(gmcan.create_adas_accelerometer_speed_status(canbus.obstacle, CS.v_ego, idx))

@ -70,7 +70,7 @@ class CarInterface(object):
# supports stop and go, but initial engage must be above 18mph (which include conservatism) # supports stop and go, but initial engage must be above 18mph (which include conservatism)
ret.minEnableSpeed = 18 * CV.MPH_TO_MS ret.minEnableSpeed = 18 * CV.MPH_TO_MS
# kg of standard extra cargo to count for driver, gas, etc... # kg of standard extra cargo to count for driver, gas, etc...
ret.mass = 1607 + std_cargo ret.mass = 1607. + std_cargo
ret.safetyModel = car.CarParams.SafetyModels.gm ret.safetyModel = car.CarParams.SafetyModels.gm
ret.wheelbase = 2.69 ret.wheelbase = 2.69
ret.steerRatio = 15.7 ret.steerRatio = 15.7
@ -80,7 +80,7 @@ class CarInterface(object):
elif candidate == CAR.MALIBU: elif candidate == CAR.MALIBU:
# supports stop and go, but initial engage must be above 18mph (which include conservatism) # supports stop and go, but initial engage must be above 18mph (which include conservatism)
ret.minEnableSpeed = 18 * CV.MPH_TO_MS ret.minEnableSpeed = 18 * CV.MPH_TO_MS
ret.mass = 1496 + std_cargo ret.mass = 1496. + std_cargo
ret.safetyModel = car.CarParams.SafetyModels.gm ret.safetyModel = car.CarParams.SafetyModels.gm
ret.wheelbase = 2.83 ret.wheelbase = 2.83
ret.steerRatio = 15.8 ret.steerRatio = 15.8
@ -89,7 +89,7 @@ class CarInterface(object):
elif candidate == CAR.HOLDEN_ASTRA: elif candidate == CAR.HOLDEN_ASTRA:
# kg of standard extra cargo to count for driver, gas, etc... # kg of standard extra cargo to count for driver, gas, etc...
ret.mass = 1363 + std_cargo ret.mass = 1363. + std_cargo
ret.wheelbase = 2.662 ret.wheelbase = 2.662
# Remaining parameters copied from Volt for now # Remaining parameters copied from Volt for now
ret.centerToFront = ret.wheelbase * 0.4 ret.centerToFront = ret.wheelbase * 0.4
@ -99,7 +99,7 @@ class CarInterface(object):
ret.steerRatioRear = 0. ret.steerRatioRear = 0.
elif candidate == CAR.ACADIA: elif candidate == CAR.ACADIA:
ret.minEnableSpeed = -1 # engage speed is decided by pcm ret.minEnableSpeed = -1. # engage speed is decided by pcm
ret.mass = 4353. * CV.LB_TO_KG + std_cargo ret.mass = 4353. * CV.LB_TO_KG + std_cargo
ret.safetyModel = car.CarParams.SafetyModels.gm ret.safetyModel = car.CarParams.SafetyModels.gm
ret.wheelbase = 2.86 ret.wheelbase = 2.86
@ -118,7 +118,7 @@ class CarInterface(object):
elif candidate == CAR.CADILLAC_ATS: elif candidate == CAR.CADILLAC_ATS:
ret.minEnableSpeed = 18 * CV.MPH_TO_MS ret.minEnableSpeed = 18 * CV.MPH_TO_MS
ret.mass = 1601 + std_cargo ret.mass = 1601. + std_cargo
ret.safetyModel = car.CarParams.SafetyModels.gm ret.safetyModel = car.CarParams.SafetyModels.gm
ret.wheelbase = 2.78 ret.wheelbase = 2.78
ret.steerRatio = 15.3 ret.steerRatio = 15.3
@ -127,7 +127,7 @@ class CarInterface(object):
elif candidate == CAR.CADILLAC_CT6: elif candidate == CAR.CADILLAC_CT6:
# engage speed is decided by pcm # engage speed is decided by pcm
ret.minEnableSpeed = -1 ret.minEnableSpeed = -1.
# kg of standard extra cargo to count for driver, gas, etc... # kg of standard extra cargo to count for driver, gas, etc...
ret.mass = 4016. * CV.LB_TO_KG + std_cargo ret.mass = 4016. * CV.LB_TO_KG + std_cargo
ret.safetyModel = car.CarParams.SafetyModels.cadillac ret.safetyModel = car.CarParams.SafetyModels.cadillac
@ -218,7 +218,7 @@ class CarInterface(object):
ret.gasPressed = self.CS.user_gas_pressed ret.gasPressed = self.CS.user_gas_pressed
# brake pedal # brake pedal
ret.brake = self.CS.user_brake / 0xd0 ret.brake = self.CS.user_brake // 0xd0
ret.brakePressed = self.CS.brake_pressed ret.brakePressed = self.CS.brake_pressed
# steering wheel # steering wheel

@ -25,7 +25,7 @@ def create_radard_can_parser(canbus, car_fingerprint):
if car_fingerprint in (CAR.VOLT, CAR.MALIBU, CAR.HOLDEN_ASTRA, CAR.ACADIA, CAR.CADILLAC_ATS): if car_fingerprint in (CAR.VOLT, CAR.MALIBU, CAR.HOLDEN_ASTRA, CAR.ACADIA, CAR.CADILLAC_ATS):
# C1A-ARS3-A by Continental # C1A-ARS3-A by Continental
radar_targets = range(SLOT_1_MSG, SLOT_1_MSG + NUM_SLOTS) radar_targets = range(SLOT_1_MSG, SLOT_1_MSG + NUM_SLOTS)
signals = zip(['FLRRNumValidTargets', signals = list(zip(['FLRRNumValidTargets',
'FLRRSnsrBlckd', 'FLRRYawRtPlsblityFlt', 'FLRRSnsrBlckd', 'FLRRYawRtPlsblityFlt',
'FLRRHWFltPrsntInt', 'FLRRAntTngFltPrsnt', 'FLRRHWFltPrsntInt', 'FLRRAntTngFltPrsnt',
'FLRRAlgnFltPrsnt', 'FLRRSnstvFltPrsntInt'] + 'FLRRAlgnFltPrsnt', 'FLRRSnstvFltPrsntInt'] +
@ -36,7 +36,7 @@ def create_radard_can_parser(canbus, car_fingerprint):
[0] * 7 + [0] * 7 +
[0.0] * NUM_SLOTS + [0.0] * NUM_SLOTS + [0.0] * NUM_SLOTS + [0.0] * NUM_SLOTS +
[0.0] * NUM_SLOTS + [0.0] * NUM_SLOTS + [0.0] * NUM_SLOTS + [0.0] * NUM_SLOTS +
[0.0] * NUM_SLOTS + [0] * NUM_SLOTS) [0.0] * NUM_SLOTS + [0] * NUM_SLOTS))
checks = [] checks = []

@ -133,7 +133,7 @@ class CarController(object):
# **** process the car messages **** # **** process the car messages ****
# *** compute control surfaces *** # *** compute control surfaces ***
BRAKE_MAX = 1024/4 BRAKE_MAX = 1024//4
if CS.CP.carFingerprint in (CAR.ACURA_ILX): if CS.CP.carFingerprint in (CAR.ACURA_ILX):
STEER_MAX = 0xF00 STEER_MAX = 0xF00
elif CS.CP.carFingerprint in (CAR.CRV, CAR.ACURA_RDX): elif CS.CP.carFingerprint in (CAR.CRV, CAR.ACURA_RDX):
@ -160,7 +160,7 @@ class CarController(object):
# Send dashboard UI commands. # Send dashboard UI commands.
if (frame % 10) == 0: if (frame % 10) == 0:
idx = (frame/10) % 4 idx = (frame//10) % 4
can_sends.extend(hondacan.create_ui_commands(self.packer, pcm_speed, hud, CS.CP.carFingerprint, idx)) can_sends.extend(hondacan.create_ui_commands(self.packer, pcm_speed, hud, CS.CP.carFingerprint, idx))
if CS.CP.radarOffCan: if CS.CP.radarOffCan:
@ -173,7 +173,7 @@ class CarController(object):
else: else:
# Send gas and brake commands. # Send gas and brake commands.
if (frame % 2) == 0: if (frame % 2) == 0:
idx = frame / 2 idx = frame // 2
pump_on, self.last_pump_ts = brake_pump_hysteresys(apply_brake, self.apply_brake_last, self.last_pump_ts) pump_on, self.last_pump_ts = brake_pump_hysteresys(apply_brake, self.apply_brake_last, self.last_pump_ts)
can_sends.append(hondacan.create_brake_command(self.packer, apply_brake, pump_on, can_sends.append(hondacan.create_brake_command(self.packer, apply_brake, pump_on,
pcm_override, pcm_cancel_cmd, hud.chime, hud.fcw, idx)) pcm_override, pcm_cancel_cmd, hud.chime, hud.fcw, idx))

@ -12,12 +12,12 @@ import selfdrive.messaging as messaging
def _create_nidec_can_parser(): def _create_nidec_can_parser():
dbc_f = 'acura_ilx_2016_nidec.dbc' dbc_f = 'acura_ilx_2016_nidec.dbc'
radar_messages = [0x400] + range(0x430, 0x43A) + range(0x440, 0x446) radar_messages = [0x400] + range(0x430, 0x43A) + range(0x440, 0x446)
signals = zip(['RADAR_STATE'] + signals = list(zip(['RADAR_STATE'] +
['LONG_DIST'] * 16 + ['NEW_TRACK'] * 16 + ['LAT_DIST'] * 16 + ['LONG_DIST'] * 16 + ['NEW_TRACK'] * 16 + ['LAT_DIST'] * 16 +
['REL_SPEED'] * 16, ['REL_SPEED'] * 16,
[0x400] + radar_messages[1:] * 4, [0x400] + radar_messages[1:] * 4,
[0] + [255] * 16 + [1] * 16 + [0] * 16 + [0] * 16) [0] + [255] * 16 + [1] * 16 + [0] * 16 + [0] * 16))
checks = zip([0x445], [20]) checks = list(zip([0x445], [20]))
return CANParser(os.path.splitext(dbc_f)[0], signals, checks, 1) return CANParser(os.path.splitext(dbc_f)[0], signals, checks, 1)

@ -13,7 +13,7 @@ def create_steering_control(packer, car_fingerprint, apply_steer, frame, steer_s
if car_fingerprint == CAR.IMPREZA: if car_fingerprint == CAR.IMPREZA:
#counts from 0 to 15 then back to 0 + 16 for enable bit #counts from 0 to 15 then back to 0 + 16 for enable bit
idx = ((frame / steer_step) % 16) idx = ((frame // steer_step) % 16)
values = { values = {
"Counter": idx, "Counter": idx,

@ -226,11 +226,11 @@ class CarController(object):
if (frame % 2 == 0) and (CS.CP.enableGasInterceptor): if (frame % 2 == 0) and (CS.CP.enableGasInterceptor):
# send exactly zero if apply_gas is zero. Interceptor will send the max between read value and apply_gas. # send exactly zero if apply_gas is zero. Interceptor will send the max between read value and apply_gas.
# This prevents unexpected pedal range rescaling # This prevents unexpected pedal range rescaling
can_sends.append(create_gas_command(self.packer, apply_gas, frame/2)) can_sends.append(create_gas_command(self.packer, apply_gas, frame//2))
if frame % 10 == 0 and ECU.CAM in self.fake_ecus and not forwarding_camera: if frame % 10 == 0 and ECU.CAM in self.fake_ecus and not forwarding_camera:
for addr in TARGET_IDS: for addr in TARGET_IDS:
can_sends.append(create_video_target(frame/10, addr)) can_sends.append(create_video_target(frame//10, addr))
# ui mesg is at 100Hz but we send asap if: # ui mesg is at 100Hz but we send asap if:
# - there is something to display # - there is something to display
@ -257,11 +257,11 @@ class CarController(object):
if frame % fr_step == 0 and ecu in self.fake_ecus and self.car_fingerprint in cars and not (ecu == ECU.CAM and forwarding_camera): if frame % fr_step == 0 and ecu in self.fake_ecus and self.car_fingerprint in cars and not (ecu == ECU.CAM and forwarding_camera):
# special cases # special cases
if fr_step == 5 and ecu == ECU.CAM and bus == 1: if fr_step == 5 and ecu == ECU.CAM and bus == 1:
cnt = (((frame / 5) % 7) + 1) << 5 cnt = (((frame // 5) % 7) + 1) << 5
vl = chr(cnt) + vl vl = chr(cnt) + vl
elif addr in (0x489, 0x48a) and bus == 0: elif addr in (0x489, 0x48a) and bus == 0:
# add counter for those 2 messages (last 4 bits) # add counter for those 2 messages (last 4 bits)
cnt = ((frame/100)%0xf) + 1 cnt = ((frame // 100) % 0xf) + 1
if addr == 0x48a: if addr == 0x48a:
# 0x48a has a 8 preceding the counter # 0x48a has a 8 preceding the counter
cnt += 1 << 7 cnt += 1 << 7

@ -19,12 +19,13 @@ def _create_radard_can_parser():
msg_a_n = len(RADAR_A_MSGS) msg_a_n = len(RADAR_A_MSGS)
msg_b_n = len(RADAR_B_MSGS) msg_b_n = len(RADAR_B_MSGS)
signals = zip(['LONG_DIST'] * msg_a_n + ['NEW_TRACK'] * msg_a_n + ['LAT_DIST'] * msg_a_n + signals = list(zip(
['LONG_DIST'] * msg_a_n + ['NEW_TRACK'] * msg_a_n + ['LAT_DIST'] * msg_a_n +
['REL_SPEED'] * msg_a_n + ['VALID'] * msg_a_n + ['SCORE'] * msg_b_n, ['REL_SPEED'] * msg_a_n + ['VALID'] * msg_a_n + ['SCORE'] * msg_b_n,
RADAR_A_MSGS * 5 + RADAR_B_MSGS, RADAR_A_MSGS * 5 + RADAR_B_MSGS,
[255] * msg_a_n + [1] * msg_a_n + [0] * msg_a_n + [0] * msg_a_n + [0] * msg_a_n + [0] * msg_b_n) [255] * msg_a_n + [1] * msg_a_n + [0] * msg_a_n + [0] * msg_a_n + [0] * msg_a_n + [0] * msg_b_n))
checks = zip(RADAR_A_MSGS + RADAR_B_MSGS, [20]*(msg_a_n + msg_b_n)) checks = list(zip(RADAR_A_MSGS + RADAR_B_MSGS, [20]*(msg_a_n + msg_b_n)))
return CANParser(os.path.splitext(dbc_f)[0], signals, checks, 1) return CANParser(os.path.splitext(dbc_f)[0], signals, checks, 1)

@ -59,7 +59,7 @@ def compute_path_pinv(l=50):
def model_polyfit(points, path_pinv): def model_polyfit(points, path_pinv):
return np.dot(path_pinv, map(float, points)) return np.dot(path_pinv, [float(x) for x in points])
def calc_desired_path(l_poly, def calc_desired_path(l_poly,

@ -106,12 +106,12 @@ class PathPlanner(object):
plan_send = messaging.new_message() plan_send = messaging.new_message()
plan_send.init('pathPlan') plan_send.init('pathPlan')
plan_send.pathPlan.laneWidth = float(self.MP.lane_width) plan_send.pathPlan.laneWidth = float(self.MP.lane_width)
plan_send.pathPlan.dPoly = map(float, self.MP.d_poly) plan_send.pathPlan.dPoly = [float(x) for x in self.MP.d_poly]
plan_send.pathPlan.cPoly = map(float, self.MP.c_poly) plan_send.pathPlan.cPoly = [float(x) for x in self.MP.c_poly]
plan_send.pathPlan.cProb = float(self.MP.c_prob) plan_send.pathPlan.cProb = float(self.MP.c_prob)
plan_send.pathPlan.lPoly = map(float, l_poly) plan_send.pathPlan.lPoly = [float(x) for x in l_poly]
plan_send.pathPlan.lProb = float(self.MP.l_prob) plan_send.pathPlan.lProb = float(self.MP.l_prob)
plan_send.pathPlan.rPoly = map(float, r_poly) plan_send.pathPlan.rPoly = [float(x) for x in r_poly]
plan_send.pathPlan.rProb = float(self.MP.r_prob) plan_send.pathPlan.rProb = float(self.MP.r_prob)
plan_send.pathPlan.angleSteers = float(self.angle_steers_des_mpc) plan_send.pathPlan.angleSteers = float(self.angle_steers_des_mpc)
plan_send.pathPlan.rateSteers = float(rate_desired) plan_send.pathPlan.rateSteers = float(rate_desired)

@ -152,7 +152,7 @@ class Planner(object):
# Calculate speed for normal cruise control # Calculate speed for normal cruise control
if enabled: if enabled:
accel_limits = map(float, calc_cruise_accel_limits(v_ego, following)) accel_limits = [float(x) for x in calc_cruise_accel_limits(v_ego, following)]
jerk_limits = [min(-0.1, accel_limits[0]), max(0.1, accel_limits[1])] # TODO: make a separate lookup for jerk tuning jerk_limits = [min(-0.1, accel_limits[0]), max(0.1, accel_limits[1])] # TODO: make a separate lookup for jerk tuning
accel_limits = limit_accel_in_turns(v_ego, CS.carState.steeringAngle, accel_limits, self.CP) accel_limits = limit_accel_in_turns(v_ego, CS.carState.steeringAngle, accel_limits, self.CP)

@ -226,7 +226,7 @@ def radard_thread(gctx=None):
if VISION_POINT in ar_pts: if VISION_POINT in ar_pts:
print("vision", ar_pts[VISION_POINT]) print("vision", ar_pts[VISION_POINT])
idens = tracks.keys() idens = list(tracks.keys())
track_pts = np.array([tracks[iden].get_key_for_cluster() for iden in idens]) track_pts = np.array([tracks[iden].get_key_for_cluster() for iden in idens])
# If we have multiple points, cluster them # If we have multiple points, cluster them

@ -23,7 +23,7 @@ VP_INIT = np.array([W/2., H/2.])
# These validity corners were chosen by looking at 1000 # These validity corners were chosen by looking at 1000
# and taking most extreme cases with some margin. # and taking most extreme cases with some margin.
VP_VALIDITY_CORNERS = np.array([[W/2 - 150, 280], [W/2 + 150, 540]]) VP_VALIDITY_CORNERS = np.array([[W//2 - 150, 280], [W//2 + 150, 540]])
DEBUG = os.getenv("DEBUG") is not None DEBUG = os.getenv("DEBUG") is not None
@ -90,10 +90,10 @@ class Calibrator(object):
cal_send = messaging.new_message() cal_send = messaging.new_message()
cal_send.init('liveCalibration') cal_send.init('liveCalibration')
cal_send.liveCalibration.calStatus = self.cal_status cal_send.liveCalibration.calStatus = self.cal_status
cal_send.liveCalibration.calPerc = min(len(self.vps) * 100 / INPUTS_NEEDED, 100) cal_send.liveCalibration.calPerc = min(len(self.vps) * 100 // INPUTS_NEEDED, 100)
cal_send.liveCalibration.warpMatrix2 = map(float, warp_matrix.flatten()) cal_send.liveCalibration.warpMatrix2 = [float(x) for x in warp_matrix.flatten()]
cal_send.liveCalibration.warpMatrixBig = map(float, warp_matrix_big.flatten()) cal_send.liveCalibration.warpMatrixBig = [float(x) for x in warp_matrix_big.flatten()]
cal_send.liveCalibration.extrinsicMatrix = map(float, extrinsic_matrix.flatten()) cal_send.liveCalibration.extrinsicMatrix = [float(x) for x in extrinsic_matrix.flatten()]
livecalibration.send(cal_send.to_bytes()) livecalibration.send(cal_send.to_bytes())

@ -1,9 +1,9 @@
#!/usr/bin/env python #!/usr/bin/env python
import numpy as np import numpy as np
import loc_local_model from selfdrive.locationd.kalman import loc_local_model
from kalman_helpers import ObservationKind from selfdrive.locationd.kalman.kalman_helpers import ObservationKind
from ekf_sym import EKF_sym from selfdrive.locationd.kalman.ekf_sym import EKF_sym

@ -2,8 +2,8 @@ import numpy as np
import sympy as sp import sympy as sp
import os import os
from kalman_helpers import ObservationKind from selfdrive.locationd.kalman.kalman_helpers import ObservationKind
from ekf_sym import gen_code from selfdrive.locationd.kalman.ekf_sym import gen_code
def gen_model(name, dim_state): def gen_model(name, dim_state):

@ -5,8 +5,8 @@ import sys
import argparse import argparse
import tempfile import tempfile
from ubloxd_py_test import parser_test from selfdrive.locationd.test.ubloxd_py_test import parser_test
from ubloxd_regression_test import compare_results from selfdrive.locationd.test.ubloxd_regression_test import compare_results
def mkdirs_exists_ok(path): def mkdirs_exists_ok(path):

@ -184,7 +184,7 @@ class UBloxAttrDict(dict):
raise AttributeError(name) raise AttributeError(name)
def __setattr__(self, name, value): def __setattr__(self, name, value):
if self.__dict__.has_key(name): if name in self.__dict__:
# allow set on normal attributes # allow set on normal attributes
dict.__setattr__(self, name, value) dict.__setattr__(self, name, value)
else: else:
@ -256,7 +256,7 @@ class UBloxDescriptor:
break break
if self.count_field == '_remaining': if self.count_field == '_remaining':
count = len(buf) / struct.calcsize(self.format2) count = len(buf) // struct.calcsize(self.format2)
if count == 0: if count == 0:
msg._unpacked = True msg._unpacked = True

@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
import os import os
import serial import serial
import ublox from selfdrive.locationd.test import ublox
import time import time
import datetime import datetime
import struct import struct
@ -11,7 +11,7 @@ from common import realtime
import zmq import zmq
import selfdrive.messaging as messaging import selfdrive.messaging as messaging
from selfdrive.services import service_list from selfdrive.services import service_list
from ephemeris import EphemerisData, GET_FIELD_U from selfdrive.locationd.test.ephemeris import EphemerisData, GET_FIELD_U
panda = os.getenv("PANDA") is not None # panda directly connected panda = os.getenv("PANDA") is not None # panda directly connected
grey = not (os.getenv("EVAL") is not None) # panda through boardd grey = not (os.getenv("EVAL") is not None) # panda through boardd

@ -1,8 +1,8 @@
#!/usr/bin/env python #!/usr/bin/env python
import os import os
import ublox from selfdrive.locationd.test import ublox
from common import realtime from common import realtime
from ubloxd import gen_raw, gen_solution from selfdrive.locationd.test.ubloxd import gen_raw, gen_solution
import zmq import zmq
import selfdrive.messaging as messaging import selfdrive.messaging as messaging
from selfdrive.services import service_list from selfdrive.services import service_list

@ -1,8 +1,8 @@
import sys import sys
import os import os
from ublox import UBloxMessage from selfdrive.locationd.test.ublox import UBloxMessage
from ubloxd import gen_solution, gen_raw, gen_nav_data from selfdrive.locationd.test.ubloxd import gen_solution, gen_raw, gen_nav_data
from common import realtime from common import realtime

@ -391,7 +391,7 @@ def update_apks():
cloudlog.info("installed apks %s" % (str(installed), )) cloudlog.info("installed apks %s" % (str(installed), ))
for app in installed.iterkeys(): for app in installed.keys():
apk_path = os.path.join(BASEDIR, "apk/"+app+".apk") apk_path = os.path.join(BASEDIR, "apk/"+app+".apk")
if not os.path.exists(apk_path): if not os.path.exists(apk_path):

@ -205,7 +205,7 @@ class Country(Region):
def jsonify(self): def jsonify(self):
ret_dict = {} ret_dict = {}
ret_dict[self.name] = {} ret_dict[self.name] = {}
for r_name, region in self.regions.iteritems(): for r_name, region in self.regions.items():
ret_dict[self.name].update(region.jsonify()) ret_dict[self.name].update(region.jsonify())
ret_dict[self.name]['Default'] = self.rules ret_dict[self.name]['Default'] = self.rules
return ret_dict return ret_dict

@ -17,7 +17,7 @@ except ImportError as e:
os.execv(sys.executable, args) os.execv(sys.executable, args)
DEFAULT_SPEEDS_BY_REGION_JSON_FILE = BASEDIR + "/selfdrive/mapd/default_speeds_by_region.json" DEFAULT_SPEEDS_BY_REGION_JSON_FILE = BASEDIR + "/selfdrive/mapd/default_speeds_by_region.json"
import default_speeds_generator from selfdrive.mapd import default_speeds_generator
default_speeds_generator.main(DEFAULT_SPEEDS_BY_REGION_JSON_FILE) default_speeds_generator.main(DEFAULT_SPEEDS_BY_REGION_JSON_FILE)
import os import os
@ -33,7 +33,7 @@ from common.params import Params
from common.transformations.coordinates import geodetic2ecef from common.transformations.coordinates import geodetic2ecef
from selfdrive.services import service_list from selfdrive.services import service_list
import selfdrive.messaging as messaging import selfdrive.messaging as messaging
from mapd_helpers import MAPS_LOOKAHEAD_DISTANCE, Way, circle_through_points from selfdrive.mapd.mapd_helpers import MAPS_LOOKAHEAD_DISTANCE, Way, circle_through_points
import selfdrive.crash as crash import selfdrive.crash as crash
from selfdrive.version import version, dirty from selfdrive.version import version, dirty
@ -176,7 +176,7 @@ def mapsd_thread():
xs = pnts[:, 0] xs = pnts[:, 0]
ys = pnts[:, 1] ys = pnts[:, 1]
road_points = map(float, xs), map(float, ys) road_points = [float(x) for x in xs], [float(y) for y in ys]
if speed < 10: if speed < 10:
curvature_valid = False curvature_valid = False
@ -266,8 +266,8 @@ def mapsd_thread():
if road_points is not None: if road_points is not None:
dat.liveMapData.roadX, dat.liveMapData.roadY = road_points dat.liveMapData.roadX, dat.liveMapData.roadY = road_points
if curvature is not None: if curvature is not None:
dat.liveMapData.roadCurvatureX = map(float, dists) dat.liveMapData.roadCurvatureX = [float(x) for x in dists]
dat.liveMapData.roadCurvature = map(float, curvature) dat.liveMapData.roadCurvature = [float(x) for x in curvature]
dat.liveMapData.mapValid = map_valid dat.liveMapData.mapValid = map_valid

@ -91,7 +91,7 @@ def geocode_maxspeed(tags, location_info):
rule_valid = all( rule_valid = all(
tag_name in tags tag_name in tags
and tags[tag_name] == value and tags[tag_name] == value
for tag_name, value in rule['tags'].iteritems() for tag_name, value in rule['tags'].items()
) )
if rule_valid: if rule_valid:
max_speed = rule['speed'] max_speed = rule['speed']
@ -102,7 +102,7 @@ def geocode_maxspeed(tags, location_info):
rule_valid = all( rule_valid = all(
tag_name in tags tag_name in tags
and tags[tag_name] == value and tags[tag_name] == value
for tag_name, value in rule['tags'].iteritems() for tag_name, value in rule['tags'].items()
) )
if rule_valid: if rule_valid:
max_speed = rule['speed'] max_speed = rule['speed']

@ -1,5 +1,5 @@
from maneuverplots import ManeuverPlot from selfdrive.test.plant.maneuverplots import ManeuverPlot
from plant import Plant from selfdrive.test.plant.plant import Plant
import numpy as np import numpy as np

@ -207,7 +207,7 @@ class Plant(object):
lateral_pos_rel = 0. lateral_pos_rel = 0.
# print at 5hz # print at 5hz
if (self.rk.frame%(self.rate/5)) == 0: if (self.rk.frame % (self.rate//5)) == 0:
print("%6.2f m %6.2f m/s %6.2f m/s2 %.2f ang gas: %.2f brake: %.2f steer: %5.2f lead_rel: %6.2f m %6.2f m/s" % (distance, speed, acceleration, self.angle_steer, gas, brake, steer_torque, d_rel, v_rel)) print("%6.2f m %6.2f m/s %6.2f m/s2 %.2f ang gas: %.2f brake: %.2f steer: %5.2f lead_rel: %6.2f m %6.2f m/s" % (distance, speed, acceleration, self.angle_steer, gas, brake, steer_torque, d_rel, v_rel))
# ******** publish the car ******** # ******** publish the car ********

@ -1,6 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
import pygame # pylint: disable=import-error import pygame # pylint: disable=import-error
from plant import Plant from selfdrive.test.plant.plant import Plant
from selfdrive.car.honda.values import CruiseButtons from selfdrive.car.honda.values import CruiseButtons
import numpy as np import numpy as np
import selfdrive.messaging as messaging import selfdrive.messaging as messaging
@ -41,7 +41,7 @@ if __name__ == "__main__":
plant = Plant(100, distance_lead = 40.0) plant = Plant(100, distance_lead = 40.0)
control_offset = 2.0 control_offset = 2.0
control_pts = zip(np.arange(0, 100.0, 10.0), [50.0 + control_offset]*10) control_pts = list(zip(np.arange(0, 100.0, 10.0), [50.0 + control_offset]*10))
def pt_to_car(pt): def pt_to_car(pt):
x,y = pt x,y = pt
@ -73,7 +73,7 @@ if __name__ == "__main__":
x.prob = 0.0 x.prob = 0.0
x.std = 1.0 x.std = 1.0
car_pts = map(pt_to_car, control_pts) car_pts = [pt_to_car(pt) for pt in control_pts]
print(car_pts) print(car_pts)

@ -10,15 +10,15 @@ NICE_LOW_PRIORITY = ["nice", "-n", "19"]
def main(gctx=None): def main(gctx=None):
while True: while True:
# try network # try network
r = subprocess.call(["ping", "-W", "4", "-c", "1", "8.8.8.8"]) ping_failed = subprocess.call(["ping", "-W", "4", "-c", "1", "8.8.8.8"])
if r: if ping_failed:
time.sleep(60) time.sleep(60)
continue continue
# download application update # download application update
try: try:
r = subprocess.check_output(NICE_LOW_PRIORITY + ["git", "fetch"], stderr=subprocess.STDOUT) r = subprocess.check_output(NICE_LOW_PRIORITY + ["git", "fetch"], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError, e: except subprocess.CalledProcessError as e:
cloudlog.event("git fetch failed", cloudlog.event("git fetch failed",
cmd=e.cmd, cmd=e.cmd,
output=e.output, output=e.output,

Loading…
Cancel
Save