Beispiel #1
0
def manager_thread():
    # now loop
    context = zmq.Context()
    thermal_sock = messaging.pub_sock(context, service_list['thermal'].port)
    health_sock = messaging.sub_sock(context, service_list['health'].port)

    cloudlog.info("manager start")

    start_managed_process("logmessaged")
    start_managed_process("logcatd")
    start_managed_process("uploader")
    start_managed_process("ui")

    # *** wait for the board ***
    wait_for_device()

    # flash the device
    if os.getenv("NOPROG") is None:
        boarddir = os.path.dirname(os.path.abspath(__file__)) + "/../board/"
        os.system("cd %s && make" % boarddir)

    start_managed_process("boardd")

    if os.getenv("STARTALL") is not None:
        for p in car_started_processes:
            start_managed_process(p)

    while 1:
        # get health of board, log this in "thermal"
        td = messaging.recv_sock(health_sock, wait=True)
        print td

        # replace thermald
        msg = read_thermal()
        thermal_sock.send(msg.to_bytes())
        print msg

        # TODO: add car battery voltage check
        max_temp = max(msg.thermal.cpu0, msg.thermal.cpu1, msg.thermal.cpu2,
                       msg.thermal.cpu3) / 10.0

        # uploader is gated based on the phone temperature
        if max_temp > 85.0:
            cloudlog.info("over temp: %r", max_temp)
            kill_managed_process("uploader")
        elif max_temp < 70.0:
            start_managed_process("uploader")

        # start constellation of processes when the car starts
        if td.health.started:
            for p in car_started_processes:
                start_managed_process(p)
        else:
            for p in car_started_processes:
                kill_managed_process(p)

        # check the status of all processes, did any of them die?
        for p in running:
            cloudlog.info("   running %s %s" % (p, running[p]))
Beispiel #2
0
def manager_thread():
    # now loop
    context = zmq.Context()
    thermal_sock = messaging.pub_sock(context, service_list['thermal'].port)
    health_sock = messaging.sub_sock(context, service_list['health'].port)
    location_sock = messaging.sub_sock(context,
                                       service_list['gpsLocation'].port)

    cloudlog.info("manager start")
    cloudlog.info({"environ": os.environ})

    for p in persistent_processes:
        start_managed_process(p)

    # start frame
    system("am start -n ai.comma.plus.frame/.MainActivity")

    # do this before panda flashing
    setup_eon_fan()

    if os.getenv("NOBOARD") is None:
        start_managed_process("pandad")

    params = Params()

    passive = params.get("Passive") == "1"
    passive_starter = LocationStarter()

    started_ts = None
    logger_dead = False
    count = 0
    fan_speed = 0
    ignition_seen = False
    battery_was_high = False

    health_sock.RCVTIMEO = 1500

    while 1:
        # get health of board, log this in "thermal"
        td = messaging.recv_sock(health_sock, wait=True)
        location = messaging.recv_sock(location_sock)

        location = location.gpsLocation if location else None

        print td

        # replace thermald
        msg = read_thermal()

        # loggerd is gated based on free space
        statvfs = os.statvfs(ROOT)
        avail = (statvfs.f_bavail * 1.0) / statvfs.f_blocks

        # thermal message now also includes free space
        msg.thermal.freeSpace = avail
        with open("/sys/class/power_supply/battery/capacity") as f:
            msg.thermal.batteryPercent = int(f.read())
        with open("/sys/class/power_supply/battery/status") as f:
            msg.thermal.batteryStatus = f.read().strip()
        with open("/sys/class/power_supply/usb/online") as f:
            msg.thermal.usbOnline = bool(int(f.read()))

        # TODO: add car battery voltage check
        max_temp = max(msg.thermal.cpu0, msg.thermal.cpu1, msg.thermal.cpu2,
                       msg.thermal.cpu3) / 10.0
        bat_temp = msg.thermal.bat / 1000.
        fan_speed = handle_fan(max_temp, bat_temp, fan_speed)
        msg.thermal.fanSpeed = fan_speed

        msg.thermal.started = started_ts is not None
        msg.thermal.startedTs = int(1e9 * (started_ts or 0))

        thermal_sock.send(msg.to_bytes())
        print msg

        # uploader is gated based on the phone temperature
        if max_temp > 85.0:
            cloudlog.warning("over temp: %r", max_temp)
            kill_managed_process("uploader")
        elif max_temp < 70.0:
            start_managed_process("uploader")

        if avail < 0.05:
            logger_dead = True

        # start constellation of processes when the car starts
        ignition = td is not None and td.health.started
        ignition_seen = ignition_seen or ignition

        do_uninstall = params.get("DoUninstall") == "1"
        accepted_terms = params.get("HasAcceptedTerms") == "1"

        should_start = ignition

        # start on gps in passive mode
        if passive and not ignition_seen:
            should_start = should_start or passive_starter.update(
                started_ts, location)

        # with 2% left, we killall, otherwise the phone is bricked
        should_start = should_start and avail > 0.02

        # require usb power
        should_start = should_start and msg.thermal.usbOnline

        should_start = should_start and accepted_terms and (not do_uninstall)

        # if any CPU gets above 107 or the battery gets above 53, kill all processes
        # controls will warn with CPU above 95 or battery above 50
        if max_temp > 107.0 or msg.thermal.bat >= 53000:
            should_start = False

        if should_start:
            if not started_ts:
                params.car_start()
                started_ts = sec_since_boot()
            for p in car_started_processes:
                if p == "loggerd" and logger_dead:
                    kill_managed_process(p)
                else:
                    start_managed_process(p)
        else:
            started_ts = None
            logger_dead = False
            for p in car_started_processes:
                kill_managed_process(p)

            # shutdown if the battery gets lower than 5%, we aren't running, and we are discharging
            if msg.thermal.batteryPercent < 5 and msg.thermal.batteryStatus == "Discharging" and battery_was_high:
                os.system('LD_LIBRARY_PATH="" svc power shutdown')
            if msg.thermal.batteryPercent > 10:
                battery_was_high = True

        # check the status of all processes, did any of them die?
        for p in running:
            cloudlog.debug("   running %s %s" % (p, running[p]))

        # report to server once per minute
        if (count % 60) == 0:
            cloudlog.event("STATUS_PACKET",
                           running=running.keys(),
                           count=count,
                           health=(td.to_dict() if td else None),
                           thermal=msg.to_dict())

        if do_uninstall:
            break

        count += 1
Beispiel #3
0
def manager_thread():
  global baseui_running

  # now loop
  context = zmq.Context()
  thermal_sock = messaging.pub_sock(context, service_list['thermal'].port)
  health_sock = messaging.sub_sock(context, service_list['health'].port)
  location_sock = messaging.sub_sock(context, service_list['gpsLocation'].port)

  cloudlog.info("manager start")
  cloudlog.info({"environ": os.environ})

  for p in persistent_processes:
    start_managed_process(p)

  manage_baseui(True)

  # do this before panda flashing
  setup_eon_fan()

  if os.getenv("NOBOARD") is None:
    start_managed_process("pandad")

  passive = bool(os.getenv("PASSIVE"))
  passive_starter = LocationStarter()

  started_ts = None
  logger_dead = False
  count = 0
  fan_speed = 0
  ignition_seen = False

  health_sock.RCVTIMEO = 1500

  while 1:
    # get health of board, log this in "thermal"
    td = messaging.recv_sock(health_sock, wait=True)
    location = messaging.recv_sock(location_sock)

    location = location.gpsLocation if location else None

    print td

    # replace thermald
    msg = read_thermal()

    # loggerd is gated based on free space
    statvfs = os.statvfs(ROOT)
    avail = (statvfs.f_bavail * 1.0)/statvfs.f_blocks

    # thermal message now also includes free space
    msg.thermal.freeSpace = avail
    with open("/sys/class/power_supply/battery/capacity") as f:
      msg.thermal.batteryPercent = int(f.read())
    with open("/sys/class/power_supply/battery/status") as f:
      msg.thermal.batteryStatus = f.read().strip()

    # TODO: add car battery voltage check
    max_temp = max(msg.thermal.cpu0, msg.thermal.cpu1,
                   msg.thermal.cpu2, msg.thermal.cpu3) / 10.0
    fan_speed = handle_fan(max_temp, fan_speed)
    msg.thermal.fanSpeed = fan_speed

    thermal_sock.send(msg.to_bytes())
    print msg

    # uploader is gated based on the phone temperature
    if max_temp > 85.0:
      cloudlog.warning("over temp: %r", max_temp)
      kill_managed_process("uploader")
    elif max_temp < 70.0:
      start_managed_process("uploader")

    if avail < 0.05:
      logger_dead = True

    # start constellation of processes when the car starts
    ignition = td is not None and td.health.started
    ignition_seen = ignition_seen or ignition

    params = Params()
    should_start = ignition and (params.get("HasAcceptedTerms") == "1")

    # start on gps in passive mode
    if passive and not ignition_seen:
      should_start = should_start or passive_starter.update(started_ts, location)

    # with 2% left, we killall, otherwise the phone is bricked
    should_start = should_start and avail > 0.02


    if should_start:
      if not started_ts:
        params.car_start()
        started_ts = sec_since_boot()
      for p in car_started_processes:
        if p == "loggerd" and logger_dead:
          kill_managed_process(p)
        else:
          start_managed_process(p)
      manage_baseui(False)
    else:
      manage_baseui(True)
      started_ts = None
      logger_dead = False
      for p in car_started_processes:
        kill_managed_process(p)

      # shutdown if the battery gets lower than 10%, we aren't running, and we are discharging
      if msg.thermal.batteryPercent < 5 and msg.thermal.batteryStatus == "Discharging":
        os.system('LD_LIBRARY_PATH="" svc power shutdown')

    # check the status of baseui
    baseui_running = 'com.baseui' in subprocess.check_output(["ps"])

    # check the status of all processes, did any of them die?
    for p in running:
      cloudlog.debug("   running %s %s" % (p, running[p]))

    # report to server once per minute
    if (count%60) == 0:
      cloudlog.event("STATUS_PACKET",
        running=running.keys(),
        count=count,
        health=(td.to_dict() if td else None),
        thermal=msg.to_dict())

    count += 1
Beispiel #4
0
def manager_thread():
  # now loop
  context = zmq.Context()
  thermal_sock = messaging.pub_sock(context, service_list['thermal'].port)
  health_sock = messaging.sub_sock(context, service_list['health'].port)

  version = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "common", "version.h")).read().split('"')[1]

  cloudlog.info("manager start %s" % version)
  cloudlog.info(dict(os.environ))

  start_managed_process("logmessaged")
  start_managed_process("logcatd")
  start_managed_process("uploader")
  start_managed_process("ui")

  if os.getenv("NOBOARD") is None:
    # *** wait for the board ***
    wait_for_device()

  # flash the device
  if os.getenv("NOPROG") is None:
    boarddir = os.path.dirname(os.path.abspath(__file__))+"/../board/"
    os.system("cd %s && make" % boarddir)

  start_managed_process("boardd")

  if os.getenv("STARTALL") is not None:
    for p in car_started_processes:
      start_managed_process(p)

  logger_dead = False

  count = 0

  # set 5 second timeout on health socket
  # 5x slower than expected
  health_sock.RCVTIMEO = 5000

  while 1:
    # get health of board, log this in "thermal"
    td = messaging.recv_sock(health_sock, wait=True)
    print td

    # replace thermald
    msg = read_thermal()

    # loggerd is gated based on free space
    statvfs = os.statvfs(ROOT)
    avail = (statvfs.f_bavail * 1.0)/statvfs.f_blocks

    # thermal message now also includes free space
    msg.thermal.freeSpace = avail
    with open("/sys/class/power_supply/battery/capacity") as f:
      msg.thermal.batteryPercent = int(f.read())
    thermal_sock.send(msg.to_bytes())
    print msg

    # TODO: add car battery voltage check
    max_temp = max(msg.thermal.cpu0, msg.thermal.cpu1,
                   msg.thermal.cpu2, msg.thermal.cpu3) / 10.0

    # uploader is gated based on the phone temperature
    if max_temp > 85.0:
      cloudlog.info("over temp: %r", max_temp)
      kill_managed_process("uploader")
    elif max_temp < 70.0:
      start_managed_process("uploader")

    if avail < 0.05:
      logger_dead = True

    # start constellation of processes when the car starts
    if not os.getenv("STARTALL"):
      # with 2% left, we killall, otherwise the phone is bricked
      if td is not None and td.health.started and avail > 0.02:
        for p in car_started_processes:
          if p == "loggerd" and logger_dead:
            kill_managed_process(p)
          else:
            start_managed_process(p)
      else:
        logger_dead = False
        for p in car_started_processes:
          kill_managed_process(p)

    # check the status of all processes, did any of them die?
    for p in running:
      cloudlog.debug("   running %s %s" % (p, running[p]))

    # report to server once per minute
    if (count%60) == 0:
      names, total_size = fake_uploader.get_data_stats()
      cloudlog.event("STATUS_PACKET",
        names=names,
        total_size=total_size,
        running=running.keys(),
        count=count,
        health=(td.to_dict() if td else None),
        thermal=msg.to_dict(),
        version=version)

    count += 1
def manager_thread():
    global baseui_running

    # now loop
    context = zmq.Context()
    thermal_sock = messaging.pub_sock(context, service_list['thermal'].port)
    health_sock = messaging.sub_sock(context, service_list['health'].port)

    cloudlog.info("manager start")
    cloudlog.info(dict(os.environ))

    start_managed_process("logmessaged")
    start_managed_process("logcatd")
    start_managed_process("tombstoned")
    start_managed_process("uploader")
    start_managed_process("ui")
    manage_baseui(True)

    panda = False
    if os.getenv("NOBOARD") is None:
        # *** wait for the board ***
        panda = wait_for_device() == 0x2300

    # flash the device
    if os.getenv("NOPROG") is None:
        # checkout the matching panda repo
        rootdir = os.path.dirname(os.path.abspath(__file__))
        system("cd %s && git submodule init" % rootdir)
        system("cd %s && git submodule update" % rootdir)
        # flash the board
        boarddir = os.path.dirname(
            os.path.abspath(__file__)) + "/../panda/board/"
        mkfile = "Makefile" if panda else "Makefile.legacy"
        print "using", mkfile
        system("cd %s && make -f %s" % (boarddir, mkfile))

    start_managed_process("boardd")

    started = False
    logger_dead = False
    count = 0

    # set 5 second timeout on health socket
    # 5x slower than expected
    health_sock.RCVTIMEO = 5000

    while 1:
        # get health of board, log this in "thermal"
        td = messaging.recv_sock(health_sock, wait=True)
        print td

        # replace thermald
        msg = read_thermal()

        # loggerd is gated based on free space
        statvfs = os.statvfs(ROOT)
        avail = (statvfs.f_bavail * 1.0) / statvfs.f_blocks

        # thermal message now also includes free space
        msg.thermal.freeSpace = avail
        with open("/sys/class/power_supply/battery/capacity") as f:
            msg.thermal.batteryPercent = int(f.read())
        with open("/sys/class/power_supply/battery/status") as f:
            msg.thermal.batteryStatus = f.read().strip()
        thermal_sock.send(msg.to_bytes())
        print msg

        # TODO: add car battery voltage check
        max_temp = max(msg.thermal.cpu0, msg.thermal.cpu1, msg.thermal.cpu2,
                       msg.thermal.cpu3) / 10.0

        # uploader is gated based on the phone temperature
        if max_temp > 85.0:
            cloudlog.info("over temp: %r", max_temp)
            kill_managed_process("uploader")
        elif max_temp < 70.0:
            start_managed_process("uploader")

        if avail < 0.05:
            logger_dead = True

        # start constellation of processes when the car starts
        # with 2% left, we killall, otherwise the phone is bricked
        if td is not None and td.health.started and avail > 0.02:
            if not started:
                Params().car_start()
                started = True
            for p in car_started_processes:
                if p == "loggerd" and logger_dead:
                    kill_managed_process(p)
                else:
                    start_managed_process(p)
            manage_baseui(False)
        else:
            manage_baseui(True)
            started = False
            logger_dead = False
            for p in car_started_processes:
                kill_managed_process(p)

            # shutdown if the battery gets lower than 10%, we aren't running, and we are discharging
            if msg.thermal.batteryPercent < 5 and msg.thermal.batteryStatus == "Discharging":
                os.system('LD_LIBRARY_PATH="" svc power shutdown')

        # check the status of baseui
        baseui_running = 'com.baseui' in subprocess.check_output(["ps"])

        # check the status of all processes, did any of them die?
        for p in running:
            cloudlog.debug("   running %s %s" % (p, running[p]))

        # report to server once per minute
        if (count % 60) == 0:
            cloudlog.event("STATUS_PACKET",
                           running=running.keys(),
                           count=count,
                           health=(td.to_dict() if td else None),
                           thermal=msg.to_dict())

        count += 1