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.
		
		
		
		
		
			
		
			
				
					
					
						
							93 lines
						
					
					
						
							2.5 KiB
						
					
					
				
			
		
		
	
	
							93 lines
						
					
					
						
							2.5 KiB
						
					
					
				#!/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()
 | 
						|
 | 
						|
 |