#!/usr/bin/env python3
import time
import unittest
import cereal . messaging as messaging
from panda import Panda
from common . gpio import gpio_set , gpio_init
from selfdrive . test . helpers import phone_only
from selfdrive . manager . process_config import managed_processes
from system . hardware import HARDWARE
from system . hardware . tici . pins import GPIO
class TestPandad ( unittest . TestCase ) :
def tearDown ( self ) :
managed_processes [ ' pandad ' ] . stop ( )
def _wait_for_boardd ( self , timeout = 30 ) :
sm = messaging . SubMaster ( [ ' peripheralState ' ] )
for _ in range ( timeout ) :
sm . update ( 1000 )
if sm . updated [ ' peripheralState ' ] :
break
if not sm . updated [ ' peripheralState ' ] :
raise Exception ( " boardd failed to start " )
@phone_only
def test_in_dfu ( self ) :
HARDWARE . recover_internal_panda ( )
time . sleep ( 1 )
managed_processes [ ' pandad ' ] . start ( )
self . _wait_for_boardd ( 60 )
@phone_only
def test_in_bootstub ( self ) :
with Panda ( ) as p :
p . reset ( enter_bootstub = True )
assert p . bootstub
managed_processes [ ' pandad ' ] . start ( )
self . _wait_for_boardd ( )
@phone_only
def test_internal_panda_reset ( self ) :
gpio_init ( GPIO . STM_RST_N , True )
gpio_set ( GPIO . STM_RST_N , 1 )
time . sleep ( 0.5 )
assert all ( not Panda ( s ) . is_internal ( ) for s in Panda . list ( ) )
managed_processes [ ' pandad ' ] . start ( )
self . _wait_for_boardd ( )
assert any ( Panda ( s ) . is_internal ( ) for s in Panda . list ( ) )
#def test_out_of_date_fw(self):
# pass
if __name__ == " __main__ " :
unittest . main ( )