openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
3.0 KiB

from cereal import log as capnp_log
def write_can_to_msg(data, src, msg):
if not isinstance(data[0], Sequence):
data = [data]
can_msgs = msg.init('can', len(data))
for i, d in enumerate(data):
if d[0] < 0: continue # ios bug
cc = can_msgs[i]
cc.address = d[0]
cc.busTime = 0
cc.dat = hex_to_str(d[2])
if len(d) == 4:
cc.src = d[3]
cc.busTime = d[1]
else:
cc.src = src
def convert_old_pkt_to_new(old_pkt):
m, d = old_pkt
msg = capnp_log.Event.new_message()
if len(m) == 3:
_, pid, t = m
msg.logMonoTime = t
else:
t, pid = m
msg.logMonoTime = int(t * 1e9)
last_velodyne_time = None
if pid == PID_OBD:
write_can_to_msg(d, 0, msg)
elif pid == PID_CAM:
frame = msg.init('frame')
frame.frameId = d[0]
frame.timestampEof = msg.logMonoTime
# iOS
elif pid == PID_IGPS:
loc = msg.init('gpsLocation')
loc.latitude = d[0]
loc.longitude = d[1]
loc.speed = d[2]
loc.timestamp = int(m[0]*1000.0) # on iOS, first number is wall time in seconds
loc.flags = 1 | 4 # has latitude, longitude, and speed.
elif pid == PID_IMOTION:
user_acceleration = d[:3]
gravity = d[3:6]
# iOS separates gravity from linear acceleration, so we recombine them.
# Apple appears to use this constant for the conversion.
g = -9.8
acceleration = [g*(a + b) for a, b in zip(user_acceleration, gravity)]
accel_event = msg.init('sensorEvents', 1)[0]
accel_event.acceleration.v = acceleration
# android
elif pid == PID_GPS:
if len(d) <= 6 or d[-1] == "gps":
loc = msg.init('gpsLocation')
loc.latitude = d[0]
loc.longitude = d[1]
loc.speed = d[2]
if len(d) > 6:
loc.timestamp = d[6]
loc.flags = 1 | 4 # has latitude, longitude, and speed.
elif pid == PID_ACCEL:
val = d[2] if type(d[2]) != type(0.0) else d
accel_event = msg.init('sensorEvents', 1)[0]
accel_event.acceleration.v = val
elif pid == PID_GYRO:
val = d[2] if type(d[2]) != type(0.0) else d
gyro_event = msg.init('sensorEvents', 1)[0]
gyro_event.init('gyro').v = val
elif pid == PID_LIDAR:
lid = msg.init('lidarPts')
lid.idx = d[3]
elif pid == PID_APPLANIX:
loc = msg.init('liveLocation')
loc.status = d[18]
loc.lat, loc.lon, loc.alt = d[0:3]
loc.vNED = d[3:6]
loc.roll = d[6]
loc.pitch = d[7]
loc.heading = d[8]
loc.wanderAngle = d[9]
loc.trackAngle = d[10]
loc.speed = d[11]
loc.gyro = d[12:15]
loc.accel = d[15:18]
elif pid == PID_IBAROMETER:
pressure_event = msg.init('sensorEvents', 1)[0]
_, pressure = d[0:2]
pressure_event.init('pressure').v = [pressure] # Kilopascals
elif pid == PID_IINIT and len(d) == 4:
init_event = msg.init('initData')
init_event.deviceType = capnp_log.InitData.DeviceType.chffrIos
build_info = init_event.init('iosBuildInfo')
build_info.appVersion = d[0]
build_info.appBuild = int(d[1])
build_info.osVersion = d[2]
build_info.deviceModel = d[3]
return msg.as_reader()