|  |  |  | #!/usr/bin/env python3
 | 
					
						
							|  |  |  | import os
 | 
					
						
							|  |  |  | import signal
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | signal.signal(signal.SIGINT, signal.SIG_DFL)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import cereal.messaging as messaging
 | 
					
						
							|  |  |  | from openpilot.system.hardware import HARDWARE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from PyQt5.QtCore import Qt, QTimer
 | 
					
						
							|  |  |  | from PyQt5.QtWidgets import QLabel, QWidget, QVBoxLayout, QStackedLayout, QApplication
 | 
					
						
							|  |  |  | from openpilot.selfdrive.ui.qt.python_helpers import set_main_window
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__":
 | 
					
						
							|  |  |  |   app = QApplication([])
 | 
					
						
							|  |  |  |   win = QWidget()
 | 
					
						
							|  |  |  |   set_main_window(win)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bg = QLabel("", alignment=Qt.AlignCenter)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   alert1 = QLabel()
 | 
					
						
							|  |  |  |   alert2 = QLabel()
 | 
					
						
							|  |  |  |   vlayout = QVBoxLayout()
 | 
					
						
							|  |  |  |   vlayout.addWidget(alert1, alignment=Qt.AlignCenter)
 | 
					
						
							|  |  |  |   vlayout.addWidget(alert2, alignment=Qt.AlignCenter)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   tmp = QWidget()
 | 
					
						
							|  |  |  |   tmp.setLayout(vlayout)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   stack = QStackedLayout(win)
 | 
					
						
							|  |  |  |   stack.addWidget(tmp)
 | 
					
						
							|  |  |  |   stack.addWidget(bg)
 | 
					
						
							|  |  |  |   stack.setStackingMode(QStackedLayout.StackAll)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   win.setObjectName("win")
 | 
					
						
							|  |  |  |   win.setStyleSheet("""
 | 
					
						
							|  |  |  |     #win {
 | 
					
						
							|  |  |  |       background-color: black;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |     QLabel {
 | 
					
						
							|  |  |  |       color: white;
 | 
					
						
							|  |  |  |       font-size: 40px;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |   """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sm = messaging.SubMaster(['deviceState', 'controlsState'])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def update():
 | 
					
						
							|  |  |  |     sm.update(0)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     onroad = sm.all_checks(['deviceState']) and sm['deviceState'].started
 | 
					
						
							|  |  |  |     if onroad:
 | 
					
						
							|  |  |  |       cs = sm['controlsState']
 | 
					
						
							|  |  |  |       color = ("grey" if str(cs.state) in ("overriding", "preEnabled") else "green") if cs.enabled else "blue"
 | 
					
						
							|  |  |  |       bg.setText("\U0001F44D" if cs.engageable else "\U0001F6D1")
 | 
					
						
							|  |  |  |       bg.setStyleSheet(f"font-size: 100px; background-color: {color};")
 | 
					
						
							|  |  |  |       bg.show()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       alert1.setText(cs.alertText1)
 | 
					
						
							|  |  |  |       alert2.setText(cs.alertText2)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if not sm.alive['controlsState']:
 | 
					
						
							|  |  |  |         alert1.setText("waiting for controls...")
 | 
					
						
							|  |  |  |     else:
 | 
					
						
							|  |  |  |       bg.hide()
 | 
					
						
							|  |  |  |       alert1.setText("")
 | 
					
						
							|  |  |  |       alert2.setText("offroad")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     HARDWARE.set_screen_brightness(100 if onroad else 40)
 | 
					
						
							|  |  |  |     os.system("echo 0 > /sys/class/backlight/panel0-backlight/bl_power")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   timer = QTimer()
 | 
					
						
							|  |  |  |   timer.timeout.connect(update)
 | 
					
						
							|  |  |  |   timer.start(50)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   app.exec_()
 |