#!/usr/bin/env python3
import gc
import cereal . messaging as messaging
from openpilot . common . params import Params
from openpilot . common . realtime import set_realtime_priority
from openpilot . selfdrive . monitoring . helpers import DriverMonitoring
def dmonitoringd_thread ( ) :
gc . disable ( )
set_realtime_priority ( 2 )
params = Params ( )
pm = messaging . PubMaster ( [ ' driverMonitoringState ' ] )
sm = messaging . SubMaster ( [ ' driverStateV2 ' , ' liveCalibration ' , ' carState ' , ' selfdriveState ' , ' modelV2 ' ] , poll = ' driverStateV2 ' )
DM = DriverMonitoring ( rhd_saved = params . get_bool ( " IsRhdDetected " ) , always_on = params . get_bool ( " AlwaysOnDM " ) )
# 20Hz <- dmonitoringmodeld
while True :
sm . update ( )
if not sm . updated [ ' driverStateV2 ' ] :
# iterate when model has new output
continue
valid = sm . all_checks ( )
if valid :
DM . run_step ( sm )
# publish
dat = DM . get_state_packet ( valid = valid )
pm . send ( ' driverMonitoringState ' , dat )
# load live always-on toggle
if sm [ ' driverStateV2 ' ] . frameId % 40 == 1 :
DM . always_on = params . get_bool ( " AlwaysOnDM " )
# save rhd virtual toggle every 5 mins
if ( sm [ ' driverStateV2 ' ] . frameId % 6000 == 0 and
DM . wheelpos_learner . filtered_stat . n > DM . settings . _WHEELPOS_FILTER_MIN_COUNT and
DM . wheel_on_right == ( DM . wheelpos_learner . filtered_stat . M > DM . settings . _WHEELPOS_THRESHOLD ) ) :
params . put_bool_nonblocking ( " IsRhdDetected " , DM . wheel_on_right )
def main ( ) :
dmonitoringd_thread ( )
if __name__ == ' __main__ ' :
main ( )