@ -30,6 +30,17 @@ static void set_brightness(UIState *s, int brightness) {
}
}
}
}
int event_processing_enabled = - 1 ;
static void enable_event_processing ( bool yes ) {
if ( event_processing_enabled ! = 1 & & yes ) {
system ( " service call window 18 i32 1 " ) ; // enable event processing
event_processing_enabled = 1 ;
} else if ( event_processing_enabled ! = 0 & & ! yes ) {
system ( " service call window 18 i32 0 " ) ; // disable event processing
event_processing_enabled = 0 ;
}
}
static void set_awake ( UIState * s , bool awake ) {
static void set_awake ( UIState * s , bool awake ) {
# ifdef QCOM
# ifdef QCOM
if ( awake ) {
if ( awake ) {
@ -43,10 +54,12 @@ static void set_awake(UIState *s, bool awake) {
if ( awake ) {
if ( awake ) {
LOGW ( " awake normal " ) ;
LOGW ( " awake normal " ) ;
framebuffer_set_power ( s - > fb , HWC_POWER_MODE_NORMAL ) ;
framebuffer_set_power ( s - > fb , HWC_POWER_MODE_NORMAL ) ;
enable_event_processing ( true ) ;
} else {
} else {
LOGW ( " awake off " ) ;
LOGW ( " awake off " ) ;
set_brightness ( s , 0 ) ;
set_brightness ( s , 0 ) ;
framebuffer_set_power ( s - > fb , HWC_POWER_MODE_OFF ) ;
framebuffer_set_power ( s - > fb , HWC_POWER_MODE_OFF ) ;
enable_event_processing ( false ) ;
}
}
}
}
# else
# else
@ -55,21 +68,36 @@ static void set_awake(UIState *s, bool awake) {
# endif
# endif
}
}
int event_processing_enabled = - 1 ;
static void update_offroad_layout_state ( UIState * s ) {
static void enable_event_processing ( bool yes ) {
struct capn rc ;
if ( event_processing_enabled ! = 1 & & yes ) {
capn_init_malloc ( & rc ) ;
system ( " service call window 18 i32 1 " ) ; // enable event processing
struct capn_segment * cs = capn_root ( & rc ) . seg ;
event_processing_enabled = 1 ;
} else if ( event_processing_enabled ! = 0 & & ! yes ) {
cereal_UiLayoutState_ptr layoutp = cereal_new_UiLayoutState ( cs ) ;
system ( " service call window 18 i32 0 " ) ; // disable event processing
struct cereal_UiLayoutState layoutd = {
event_processing_enabled = 0 ;
. activeApp = ( cereal_UiLayoutState_App ) s - > active_app ,
}
. sidebarCollapsed = s - > scene . uilayout_sidebarcollapsed ,
} ;
cereal_write_UiLayoutState ( & layoutd , layoutp ) ;
cereal_Event_ptr eventp = cereal_new_Event ( cs ) ;
struct cereal_Event event = {
. logMonoTime = nanos_since_boot ( ) ,
. which = cereal_Event_uiLayoutState ,
. uiLayoutState = layoutp ,
} ;
cereal_write_Event ( & event , eventp ) ;
capn_setp ( capn_root ( & rc ) , 0 , eventp . p ) ;
uint8_t buf [ 4096 ] ;
ssize_t rs = capn_write_mem ( & rc , buf , sizeof ( buf ) , 0 ) ;
s - > offroad_sock - > send ( ( char * ) buf , rs ) ;
capn_free ( & rc ) ;
}
}
static void navigate_to_settings ( UIState * s ) {
static void navigate_to_settings ( UIState * s ) {
# ifdef QCOM
# ifdef QCOM
enable_event_processing ( true ) ;
s - > active_app = cereal_UiLayoutState_App_settings ;
system ( " am broadcast -a 'ai.comma.plus.SidebarSettingsTouchUpInside' " ) ;
update_offroad_layout_state ( s ) ;
# else
# else
// computer UI doesn't have offroad settings
// computer UI doesn't have offroad settings
# endif
# endif
@ -78,9 +106,11 @@ static void navigate_to_settings(UIState *s) {
static void navigate_to_home ( UIState * s ) {
static void navigate_to_home ( UIState * s ) {
# ifdef QCOM
# ifdef QCOM
if ( s - > vision_connected ) {
if ( s - > vision_connected ) {
enable_event_processing ( false ) ;
s - > active_app = cereal_UiLayoutState_App_none ;
} else {
s - > active_app = cereal_UiLayoutState_App_home ;
}
}
system ( " am broadcast -a 'ai.comma.plus.HomeButtonTouchUpInside' " ) ;
update_offroad_layout_state ( s ) ;
# else
# else
// computer UI doesn't have offroad home
// computer UI doesn't have offroad home
# endif
# endif
@ -97,6 +127,7 @@ static void handle_sidebar_touch(UIState *s, int touch_x, int touch_y) {
navigate_to_home ( s ) ;
navigate_to_home ( s ) ;
if ( s - > vision_connected ) {
if ( s - > vision_connected ) {
s - > scene . uilayout_sidebarcollapsed = true ;
s - > scene . uilayout_sidebarcollapsed = true ;
update_offroad_layout_state ( s ) ;
}
}
}
}
}
}
@ -106,6 +137,7 @@ static void handle_vision_touch(UIState *s, int touch_x, int touch_y) {
if ( s - > vision_connected & & ( touch_x > = s - > scene . ui_viz_rx - bdr_s )
if ( s - > vision_connected & & ( touch_x > = s - > scene . ui_viz_rx - bdr_s )
& & ( s - > active_app ! = cereal_UiLayoutState_App_settings ) ) {
& & ( s - > active_app ! = cereal_UiLayoutState_App_settings ) ) {
s - > scene . uilayout_sidebarcollapsed = ! s - > scene . uilayout_sidebarcollapsed ;
s - > scene . uilayout_sidebarcollapsed = ! s - > scene . uilayout_sidebarcollapsed ;
update_offroad_layout_state ( s ) ;
}
}
}
}
@ -185,6 +217,7 @@ static void ui_init(UIState *s) {
s - > thermal_sock = SubSocket : : create ( s - > ctx , " thermal " ) ;
s - > thermal_sock = SubSocket : : create ( s - > ctx , " thermal " ) ;
s - > health_sock = SubSocket : : create ( s - > ctx , " health " ) ;
s - > health_sock = SubSocket : : create ( s - > ctx , " health " ) ;
s - > ubloxgnss_sock = SubSocket : : create ( s - > ctx , " ubloxGnss " ) ;
s - > ubloxgnss_sock = SubSocket : : create ( s - > ctx , " ubloxGnss " ) ;
s - > offroad_sock = PubSocket : : create ( s - > ctx , " offroadLayout " ) ;
assert ( s - > model_sock ! = NULL ) ;
assert ( s - > model_sock ! = NULL ) ;
assert ( s - > controlsstate_sock ! = NULL ) ;
assert ( s - > controlsstate_sock ! = NULL ) ;
@ -194,6 +227,7 @@ static void ui_init(UIState *s) {
assert ( s - > thermal_sock ! = NULL ) ;
assert ( s - > thermal_sock ! = NULL ) ;
assert ( s - > health_sock ! = NULL ) ;
assert ( s - > health_sock ! = NULL ) ;
assert ( s - > ubloxgnss_sock ! = NULL ) ;
assert ( s - > ubloxgnss_sock ! = NULL ) ;
assert ( s - > offroad_sock ! = NULL ) ;
s - > poller = Poller : : create ( {
s - > poller = Poller : : create ( {
s - > model_sock ,
s - > model_sock ,
@ -485,6 +519,10 @@ void handle_message(UIState *s, Message * msg) {
cereal_read_UiLayoutState ( & datad , eventd . uiLayoutState ) ;
cereal_read_UiLayoutState ( & datad , eventd . uiLayoutState ) ;
s - > active_app = datad . activeApp ;
s - > active_app = datad . activeApp ;
s - > scene . uilayout_sidebarcollapsed = datad . sidebarCollapsed ;
s - > scene . uilayout_sidebarcollapsed = datad . sidebarCollapsed ;
if ( datad . mockEngaged ! = s - > scene . uilayout_mockengaged ) {
s - > scene . uilayout_mockengaged = datad . mockEngaged ;
pthread_cond_signal ( & s - > bg_cond ) ;
}
} else if ( eventd . which = = cereal_Event_liveMapData ) {
} else if ( eventd . which = = cereal_Event_liveMapData ) {
struct cereal_LiveMapData datad ;
struct cereal_LiveMapData datad ;
cereal_read_LiveMapData ( & datad , eventd . liveMapData ) ;
cereal_read_LiveMapData ( & datad , eventd . liveMapData ) ;
@ -606,6 +644,7 @@ static void ui_update(UIState *s) {
assert ( glGetError ( ) = = GL_NO_ERROR ) ;
assert ( glGetError ( ) = = GL_NO_ERROR ) ;
s - > scene . uilayout_sidebarcollapsed = true ;
s - > scene . uilayout_sidebarcollapsed = true ;
update_offroad_layout_state ( s ) ;
s - > scene . ui_viz_rx = ( box_x - sbr_w + bdr_s * 2 ) ;
s - > scene . ui_viz_rx = ( box_x - sbr_w + bdr_s * 2 ) ;
s - > scene . ui_viz_rw = ( box_w + sbr_w - ( bdr_s * 2 ) ) ;
s - > scene . ui_viz_rw = ( box_w + sbr_w - ( bdr_s * 2 ) ) ;
s - > scene . ui_viz_ro = 0 ;
s - > scene . ui_viz_ro = 0 ;
@ -755,7 +794,6 @@ static void* vision_connect_thread(void *args) {
s - > vision_connected = true ;
s - > vision_connected = true ;
s - > vision_connect_firstrun = true ;
s - > vision_connect_firstrun = true ;
enable_event_processing ( false ) ;
// Drain sockets
// Drain sockets
while ( true ) {
while ( true ) {
@ -847,6 +885,9 @@ static void* bg_thread(void* args) {
assert ( bg_status < ARRAYSIZE ( bg_colors ) ) ;
assert ( bg_status < ARRAYSIZE ( bg_colors ) ) ;
const uint8_t * color = bg_colors [ bg_status ] ;
const uint8_t * color = bg_colors [ bg_status ] ;
if ( s - > scene . uilayout_mockengaged ) {
color = bg_colors [ STATUS_ENGAGED ] ;
}
glClearColor ( color [ 0 ] / 256.0 , color [ 1 ] / 256.0 , color [ 2 ] / 256.0 , 0.0 ) ;
glClearColor ( color [ 0 ] / 256.0 , color [ 1 ] / 256.0 , color [ 2 ] / 256.0 , 0.0 ) ;
glClear ( GL_COLOR_BUFFER_BIT ) ;
glClear ( GL_COLOR_BUFFER_BIT ) ;
@ -887,6 +928,7 @@ int main(int argc, char* argv[]) {
UIState uistate ;
UIState uistate ;
UIState * s = & uistate ;
UIState * s = & uistate ;
ui_init ( s ) ;
ui_init ( s ) ;
enable_event_processing ( true ) ;
pthread_t connect_thread_handle ;
pthread_t connect_thread_handle ;
err = pthread_create ( & connect_thread_handle , NULL ,
err = pthread_create ( & connect_thread_handle , NULL ,
@ -961,15 +1003,18 @@ int main(int argc, char* argv[]) {
if ( ! s - > vision_connected ) {
if ( ! s - > vision_connected ) {
// always process events offroad
// always process events offroad
enable_event_processing ( true ) ;
if ( s - > status ! = STATUS_STOPPED ) {
if ( s - > status ! = STATUS_STOPPED ) {
update_status ( s , STATUS_STOPPED ) ;
update_status ( s , STATUS_STOPPED ) ;
s - > active_app = cereal_UiLayoutState_App_home ;
update_offroad_layout_state ( s ) ;
}
}
check_messages ( s ) ;
check_messages ( s ) ;
} else {
} else {
set_awake ( s , true ) ;
set_awake ( s , true ) ;
if ( s - > status = = STATUS_STOPPED ) {
if ( s - > status = = STATUS_STOPPED ) {
update_status ( s , STATUS_DISENGAGED ) ;
update_status ( s , STATUS_DISENGAGED ) ;
s - > active_app = cereal_UiLayoutState_App_none ;
update_offroad_layout_state ( s ) ;
}
}
// Car started, fetch a new rgb image from ipc and peek for zmq events.
// Car started, fetch a new rgb image from ipc and peek for zmq events.
ui_update ( s ) ;
ui_update ( s ) ;
@ -977,6 +1022,7 @@ int main(int argc, char* argv[]) {
// Visiond process is just stopped, force a redraw to make screen blank again.
// Visiond process is just stopped, force a redraw to make screen blank again.
s - > scene . satelliteCount = - 1 ;
s - > scene . satelliteCount = - 1 ;
s - > scene . uilayout_sidebarcollapsed = false ;
s - > scene . uilayout_sidebarcollapsed = false ;
update_offroad_layout_state ( s ) ;
ui_draw ( s ) ;
ui_draw ( s ) ;
glFinish ( ) ;
glFinish ( ) ;
should_swap = true ;
should_swap = true ;