# pragma once
# include <memory>
# include <string>
# include <QObject>
# include <QTimer>
# include <QColor>
# include <QFuture>
# include <QPolygonF>
# include <QTransform>
# include "cereal/messaging/messaging.h"
# include "common/mat.h"
# include "common/params.h"
# include "common/timing.h"
# include "system/hardware/hw.h"
const int UI_BORDER_SIZE = 30 ;
const int UI_HEADER_HEIGHT = 420 ;
const int UI_FREQ = 20 ; // Hz
const int BACKLIGHT_OFFROAD = 50 ;
const float MIN_DRAW_DISTANCE = 10.0 ;
const float MAX_DRAW_DISTANCE = 100.0 ;
constexpr mat3 DEFAULT_CALIBRATION = { { 0.0 , 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , 1.0 , 0.0 , 0.0 } } ;
constexpr mat3 FCAM_INTRINSIC_MATRIX = ( mat3 ) { { 2648.0 , 0.0 , 1928.0 / 2 ,
0.0 , 2648.0 , 1208.0 / 2 ,
0.0 , 0.0 , 1.0 } } ;
// tici ecam focal probably wrong? magnification is not consistent across frame
// Need to retrain model before this can be changed
constexpr mat3 ECAM_INTRINSIC_MATRIX = ( mat3 ) { { 567.0 , 0.0 , 1928.0 / 2 ,
0.0 , 567.0 , 1208.0 / 2 ,
0.0 , 0.0 , 1.0 } } ;
typedef enum UIStatus {
STATUS_DISENGAGED ,
STATUS_OVERRIDE ,
STATUS_ENGAGED ,
} UIStatus ;
enum PrimeType {
PRIME_TYPE_UNKNOWN = - 2 ,
PRIME_TYPE_UNPAIRED = - 1 ,
PRIME_TYPE_NONE = 0 ,
PRIME_TYPE_MAGENTA = 1 ,
PRIME_TYPE_LITE = 2 ,
PRIME_TYPE_BLUE = 3 ,
PRIME_TYPE_MAGENTA_NEW = 4 ,
PRIME_TYPE_PURPLE = 5 ,
} ;
const QColor bg_colors [ ] = {
[ STATUS_DISENGAGED ] = QColor ( 0x17 , 0x33 , 0x49 , 0xc8 ) ,
[ STATUS_OVERRIDE ] = QColor ( 0x91 , 0x9b , 0x95 , 0xf1 ) ,
[ STATUS_ENGAGED ] = QColor ( 0x17 , 0x86 , 0x44 , 0xf1 ) ,
} ;
typedef struct UIScene {
bool calibration_valid = false ;
bool calibration_wide_valid = false ;
bool wide_cam = true ;
mat3 view_from_calib = DEFAULT_CALIBRATION ;
mat3 view_from_wide_calib = DEFAULT_CALIBRATION ;
cereal : : PandaState : : PandaType pandaType ;
// modelV2
float lane_line_probs [ 4 ] ;
float road_edge_stds [ 2 ] ;
QPolygonF track_vertices ;
QPolygonF lane_line_vertices [ 4 ] ;
QPolygonF road_edge_vertices [ 2 ] ;
// lead
QPointF lead_vertices [ 2 ] ;
cereal : : LongitudinalPersonality personality ;
float light_sensor = - 1 ;
bool started , ignition , is_metric , longitudinal_control ;
bool world_objects_visible = false ;
uint64_t started_frame ;
} UIScene ;
class UIState : public QObject {
Q_OBJECT
public :
UIState ( QObject * parent = 0 ) ;
void updateStatus ( ) ;
inline bool engaged ( ) const {
return scene . started & & ( * sm ) [ " selfdriveState " ] . getSelfdriveState ( ) . getEnabled ( ) ;
}
void setPrimeType ( PrimeType type ) ;
inline PrimeType primeType ( ) const { return prime_type ; }
inline bool hasPrime ( ) const { return prime_type > PrimeType : : PRIME_TYPE_NONE ; }
int fb_w = 0 , fb_h = 0 ;
std : : unique_ptr < SubMaster > sm ;
UIStatus status ;
UIScene scene = { } ;
QString language ;
QTransform car_space_transform ;
signals :
void uiUpdate ( const UIState & s ) ;
void offroadTransition ( bool offroad ) ;
void primeChanged ( bool prime ) ;
void primeTypeChanged ( PrimeType prime_type ) ;
private slots :
void update ( ) ;
private :
QTimer * timer ;
bool started_prev = false ;
PrimeType prime_type = PrimeType : : PRIME_TYPE_UNKNOWN ;
} ;
UIState * uiState ( ) ;
// device management class
class Device : public QObject {
Q_OBJECT
public :
Device ( QObject * parent = 0 ) ;
bool isAwake ( ) { return awake ; }
void setOffroadBrightness ( int brightness ) {
offroad_brightness = std : : clamp ( brightness , 0 , 100 ) ;
}
private :
bool awake = false ;
int interactive_timeout = 0 ;
bool ignition_on = false ;
int offroad_brightness = BACKLIGHT_OFFROAD ;
int last_brightness = 0 ;
FirstOrderFilter brightness_filter ;
QFuture < void > brightness_future ;
void updateBrightness ( const UIState & s ) ;
void updateWakefulness ( const UIState & s ) ;
void setAwake ( bool on ) ;
signals :
void displayPowerChanged ( bool on ) ;
void interactiveTimeout ( ) ;
public slots :
void resetInteractiveTimeout ( int timeout = - 1 ) ;
void update ( const UIState & s ) ;
} ;
Device * device ( ) ;
void ui_update_params ( UIState * s ) ;
int get_path_length_idx ( const cereal : : XYZTData : : Reader & line , const float path_height ) ;
void update_model ( UIState * s ,
const cereal : : ModelDataV2 : : Reader & model ) ;
void update_dmonitoring ( UIState * s , const cereal : : DriverStateV2 : : Reader & driverstate , float dm_fade_state , bool is_rhd ) ;
void update_leads ( UIState * s , const cereal : : RadarState : : Reader & radar_state , const cereal : : XYZTData : : Reader & line ) ;
void update_line_data ( const UIState * s , const cereal : : XYZTData : : Reader & line ,
float y_off , float z_off , QPolygonF * pvd , int max_idx , bool allow_invert ) ;