@@ -280,19 +280,22 @@ void createSensorBasedDialog() {
280280 static lv_coord_t row_dsc[] = {lv_pct (10 ), lv_pct (40 ), lv_pct (40 ), LV_GRID_TEMPLATE_LAST };
281281
282282 // dialog (can it be created on the active screen? I want it to be a background layer)
283- sensorBasedControlPanel = lv_obj_create (NULL );
283+ // Full-screen overlay that is a CHILD of the main screen, not a separate screen.
284+ // Opening/closing it is clear-hidden + move-foreground + a short single-screen slide
285+ // (see showSetpointDialog/hideSetpointDialog) instead of lv_scr_load_anim. A screen
286+ // swap composites two full screens for the whole 500ms animation, which starved the
287+ // RGB panel's bounce-buffer refill from PSRAM and made the image roll vertically; an
288+ // overlay on one screen avoids that sustained contention.
289+ sensorBasedControlPanel = lv_obj_create (mainScreen);
290+ lv_obj_set_size (sensorBasedControlPanel, lv_pct (100 ), lv_pct (100 ));
291+ lv_obj_align (sensorBasedControlPanel, LV_ALIGN_TOP_LEFT , 0 , 0 );
292+ lv_obj_set_style_border_width (sensorBasedControlPanel, 0 , 0 );
293+ lv_obj_set_style_radius (sensorBasedControlPanel, 0 , 0 );
294+ lv_obj_add_flag (sensorBasedControlPanel, LV_OBJ_FLAG_HIDDEN );
295+ lv_obj_clear_flag (sensorBasedControlPanel, LV_OBJ_FLAG_SCROLLABLE );
284296
285297 TRACE (" mbox 1" );
286- lv_scr_load (sensorBasedControlPanel);
287- TRACE (" mbox 1.1" );
288- // lv_obj_add_flag(sensorBasedControlPanel, LV_OBJ_FLAG_HIDDEN);
289- TRACE (" mbox 1.2" );
290- // lv_obj_move_background(sensorBasedControlPanel);
291- TRACE (" mbox 1.3" );
292- // lv_obj_set_size(sensorBasedControlPanel, lv_pct(90), lv_pct(90));
293298 lv_obj_add_style (sensorBasedControlPanel, &style, 0 );
294- // lv_obj_add_style(sensorBasedControlPanel, &styleNoPadding, 0);
295- lv_obj_center (sensorBasedControlPanel);
296299 TRACE (" mbox 1.4" );
297300 lv_obj_set_style_grid_column_dsc_array (sensorBasedControlPanel, col_dsc, 0 );
298301 lv_obj_set_style_grid_row_dsc_array (sensorBasedControlPanel, row_dsc, 0 );
@@ -399,6 +402,19 @@ void createSensorBasedDialog() {
399402 TRACE (" mbox 8" );
400403}
401404
405+ // Show/hide the setpoint overlay INSTANTLY (no animation). Any full-screen animation
406+ // sustains a heavy framebuffer redraw that starves the RGB panel's bounce-buffer
407+ // refill from PSRAM and makes the image roll vertically; a single un-hide is one
408+ // redraw, the least stress possible for a full-screen dialog.
409+ void showSetpointDialog () {
410+ lv_obj_clear_flag (sensorBasedControlPanel, LV_OBJ_FLAG_HIDDEN );
411+ lv_obj_move_foreground (sensorBasedControlPanel);
412+ }
413+
414+ void hideSetpointDialog () {
415+ lv_obj_add_flag (sensorBasedControlPanel, LV_OBJ_FLAG_HIDDEN );
416+ }
417+
402418void setup ()
403419{
404420 Serial.begin (115200 );
@@ -794,7 +810,7 @@ static void btn_event_cb(lv_event_t * e)
794810 TRACE (" SENS DISP 2.1" );
795811 lv_label_set_text_fmt (sensorBasedControlDescription, " Adjust setpoint for %s" , status->name );
796812 TRACE (" SENS DISP 3" );
797- lv_scr_load_anim (sensorBasedControlPanel, LV_SCR_LOAD_ANIM_OVER_TOP , 500 , 10 , false );
813+ showSetpointDialog ( );
798814// lv_obj_move_foreground(sensorBasedControlPanel);
799815// lv_obj_clear_flag(sensorBasedControlPanel, LV_OBJ_FLAG_HIDDEN);
800816
@@ -859,8 +875,7 @@ static void lv_spinbox_event_cb(lv_event_t * e)
859875 }
860876// lv_obj_move_background(sensorBasedControlPanel);
861877// lv_obj_add_flag(sensorBasedControlPanel, LV_OBJ_FLAG_HIDDEN);
862- // lv_scr_load(mainScreen);
863- lv_scr_load_anim (mainScreen, LV_SCR_LOAD_ANIM_OVER_BOTTOM , 500 , 10 , false );
878+ hideSetpointDialog ();
864879 }
865880 TRACE (" SENS CB END" );
866881
0 commit comments