Description
I’m writing display drivers for use with Mbed-OS. First display ILI9341 works, 2nd display GCA01 (circular TFT) also.
I have used the lv_meter example, and modified that I can pass the disp_t as argument for screen creation. This works in general, only the center knob is missing on the 2nd created display. Is there any global function? It looks like the knob is only drawn on the active display.
Another problem is the different color type. Both displays are using 16 bit RGB565, but the GC9A01 needs the LV_COLOR_16_SWAP set to 1. I’ve read that the displays must use the same color format, is there an option to swap the RGB per display? I haven’t checked the display possibilities yet, maybe the RGB can be swapped by the TFT controller?
What MCU/Processor/Board and compiler are you using?
STM32F407VE with ILI9341 and GC9A01 multidisplay
Mbed-OS 6.11, gcc 9
What LVGL version are you using?
8.0 HEAD
What do you want to achieve?
testing drivers, using multiple displays
What have you tried so far?
- changed order of driver init, the meter center knob is always drawn on the first display
- changed order of screen creation, no effect
Code to reproduce
add two displays, code for lv_meter is basically from example, with extension for passing the display as root:
// in main:
{
lv_gaugescreen_param_t p2 = {0};
lv_gauge_screen(lvglDisplayGC9A01_1->getLVDisp(), &p2);
lv_gaugescreen_param_t p1 = {0};
lv_gauge_screen(lvglDisplay->getLVDisp(), &p1);
}
void lv_gauge_screen(lv_disp_t* disp, lv_gaugescreen_param_t* retparam)
{
lv_obj_t * scr = lv_disp_get_scr_act(disp);
lv_disp_load_scr(scr);
lv_obj_t* meter = lv_meter_create(scr);
lv_obj_center(meter);
lv_obj_set_size(meter, 230, 230);
/*Add a scale first*/
lv_meter_scale_t * scale = lv_meter_add_scale(meter);
lv_meter_set_scale_ticks(meter, scale, 41, 2, 10, lv_palette_main(LV_PALETTE_GREY));
lv_meter_set_scale_major_ticks(meter, scale, 8, 4, 15, lv_color_black(), 10);
/*Add a blue arc to the start*/
lv_meter_indicator_t * indic;
indic = lv_meter_add_arc(meter, scale, 3, lv_palette_main(LV_PALETTE_BLUE), 0);
lv_meter_set_indicator_start_value(meter, indic, 0);
lv_meter_set_indicator_end_value(meter, indic, 20);
/*Make the tick lines blue at the start of the scale*/
indic = lv_meter_add_scale_lines(meter, scale, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_BLUE), false, 0);
lv_meter_set_indicator_start_value(meter, indic, 0);
lv_meter_set_indicator_end_value(meter, indic, 20);
/*Add a red arc to the end*/
indic = lv_meter_add_arc(meter, scale, 3, lv_palette_main(LV_PALETTE_RED), 0);
lv_meter_set_indicator_start_value(meter, indic, 80);
lv_meter_set_indicator_end_value(meter, indic, 100);
/*Make the tick lines red at the end of the scale*/
indic = lv_meter_add_scale_lines(meter, scale, lv_palette_main(LV_PALETTE_RED), lv_palette_main(LV_PALETTE_RED), false, 0);
lv_meter_set_indicator_start_value(meter, indic, 80);
lv_meter_set_indicator_end_value(meter, indic, 100);
/*Add a needle line indicator*/
indic = lv_meter_add_needle_line(meter, scale, 4, lv_palette_main(LV_PALETTE_GREY), -10);
retparam->meter = meter;
retparam->indic = indic;
}