#!/usr/bin/env python
import os
import json
import zmq
import common . realtime as realtime
from common . services import service_list
from selfdrive . swaglog import cloudlog
import selfdrive . messaging as messaging
import uploader
from logger import Logger
from selfdrive . loggerd . config import ROOT , SEGMENT_LENGTH
def gen_init_data ( gctx ) :
msg = messaging . new_message ( )
kernel_args = open ( " /proc/cmdline " , " r " ) . read ( ) . strip ( ) . split ( " " )
msg . initData . kernelArgs = kernel_args
msg . initData . gctx = json . dumps ( gctx )
if os . getenv ( ' DONGLE_ID ' ) :
msg . initData . dongleId = os . getenv ( ' DONGLE_ID ' )
return msg . to_bytes ( )
def main ( gctx = None ) :
logger = Logger ( ROOT , gen_init_data ( gctx ) )
context = zmq . Context ( )
poller = zmq . Poller ( )
# we push messages to visiond to rotate image recordings
vision_control_sock = context . socket ( zmq . PUSH )
vision_control_sock . connect ( " tcp://127.0.0.1:8001 " )
# register listeners for all services
for service in service_list . itervalues ( ) :
if service . should_log and service . port is not None :
messaging . sub_sock ( context , service . port , poller )
uploader . clear_locks ( ROOT )
cur_dir , cur_part = logger . start ( )
try :
cloudlog . info ( " starting in dir %r " , cur_dir )
rotate_msg = messaging . log . LogRotate . new_message ( )
rotate_msg . segmentNum = cur_part
rotate_msg . path = cur_dir
vision_control_sock . send ( rotate_msg . to_bytes ( ) )
last_rotate = realtime . sec_since_boot ( )
while True :
polld = poller . poll ( timeout = 1000 )
for sock , mode in polld :
if mode != zmq . POLLIN :
continue
dat = sock . recv ( )
# print "got", len(dat), realtime.sec_since_boot()
# logevent = log_capnp.Event.from_bytes(dat)
# print str(logevent)
logger . log_data ( dat )
t = realtime . sec_since_boot ( )
if ( t - last_rotate ) > SEGMENT_LENGTH :
last_rotate + = SEGMENT_LENGTH
cur_dir , cur_part = logger . rotate ( )
cloudlog . info ( " rotated to %r " , cur_dir )
rotate_msg = messaging . log . LogRotate . new_message ( )
rotate_msg . segmentNum = cur_part
rotate_msg . path = cur_dir
vision_control_sock . send ( rotate_msg . to_bytes ( ) )
finally :
cloudlog . info ( " loggerd exiting... " )
# tell visiond to stop logging
rotate_msg = messaging . log . LogRotate . new_message ( )
rotate_msg . segmentNum = - 1
rotate_msg . path = " /dev/null "
vision_control_sock . send ( rotate_msg . to_bytes ( ) )
# stop logging
logger . stop ( )
if __name__ == " __main__ " :
main ( )