Skip to content

Commit 49259d5

Browse files
authored
Merge pull request #222 from Nikolas-S/feature/osd_settings_page
Add new settings page and element positioning preview for goggle OSD
2 parents 95baa9a + e99d396 commit 49259d5

20 files changed

+1168
-67
lines changed

src/core/app_state.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,23 @@ typedef enum {
66
APP_STATE_MAINMENU = 0,
77
APP_STATE_SUBMENU = 1,
88
APP_STATE_PLAYBACK = 2,
9+
10+
// in this state, the menu pages' on_roller is called,
11+
// but the selected submenu item selection (e.g. pp_osd.p_arr.cur)
12+
// is not automatically changed.
13+
APP_STATE_SUBMENU_ITEM_FOCUSED = 3,
14+
915
APP_STATE_VIDEO = 10,
16+
17+
// the preview for image settings
1018
APP_STATE_IMS = 11,
19+
// the preview for osd element positioning settings
20+
APP_STATE_OSD_ELEMENT_PREV = 12,
1121

1222
APP_STATE_USER_INPUT_DISABLED = 20,
1323

24+
// TODO pages should set the on_roller callback and handle the input themselves
25+
// instead of creating an app state. (use APP_STATE_SUBMENU_ITEM_FOCUSED)
1426
PAGE_FAN_SLIDE = 100,
1527
PAGE_ANGLE_SLIDE = 101,
1628
PAGE_POWER_SLIDE_CELL_COUNT = 102,

src/core/input_device.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "ui/page_source.h"
4444
#include "ui/ui_image_setting.h"
4545
#include "ui/ui_main_menu.h"
46+
#include "ui/ui_osd_element_pos.h"
4647
#include "ui/ui_porting.h"
4748

4849
///////////////////////////////////////////////////////////////////////////////
@@ -177,7 +178,10 @@ static void btn_press(void) // long press left key
177178
app_state_push(APP_STATE_VIDEO);
178179
} else if ((g_app_state == APP_STATE_VIDEO) || (g_app_state == APP_STATE_IMS)) // video -> Main menu
179180
app_switch_to_menu();
180-
else if (g_app_state == APP_STATE_PLAYBACK)
181+
else if (g_app_state == APP_STATE_OSD_ELEMENT_PREV) {
182+
ui_osd_element_pos_cancel_and_hide();
183+
app_switch_to_menu();
184+
} else if (g_app_state == APP_STATE_PLAYBACK)
181185
pb_key(DIAL_KEY_PRESS);
182186
else { // Sub-menu -> Main menu
183187
submenu_exit();
@@ -207,6 +211,12 @@ static void btn_click(void) // short press enter key
207211
app_switch_to_menu();
208212
pthread_mutex_unlock(&lvgl_mutex);
209213
return;
214+
} else if (g_app_state == APP_STATE_OSD_ELEMENT_PREV) {
215+
pthread_mutex_lock(&lvgl_mutex);
216+
if (ui_osd_element_pos_handle_input(DIAL_KEY_CLICK))
217+
app_switch_to_menu();
218+
pthread_mutex_unlock(&lvgl_mutex);
219+
return;
210220
}
211221

212222
if (!main_menu_is_shown())
@@ -222,7 +232,7 @@ static void btn_click(void) // short press enter key
222232
LOGI("level = 1");
223233
app_state_push(APP_STATE_SUBMENU);
224234
submenu_enter();
225-
} else if ((g_app_state == APP_STATE_SUBMENU) || (g_app_state == APP_STATE_PLAYBACK)) {
235+
} else if ((g_app_state == APP_STATE_SUBMENU) || (g_app_state == APP_STATE_SUBMENU_ITEM_FOCUSED) || (g_app_state == APP_STATE_PLAYBACK)) {
226236
submenu_click();
227237
} else if (g_app_state == PAGE_FAN_SLIDE) {
228238
submenu_click();
@@ -283,11 +293,15 @@ static void roller_up(void) {
283293
menu_nav(DIAL_KEY_UP);
284294
} else if ((g_app_state == APP_STATE_SUBMENU) || (g_app_state == APP_STATE_PLAYBACK)) {
285295
submenu_roller(DIAL_KEY_UP);
296+
} else if ((g_app_state == APP_STATE_SUBMENU_ITEM_FOCUSED)) {
297+
submenu_roller_no_selection_change(DIAL_KEY_UP);
286298
} else if (g_app_state == APP_STATE_VIDEO) {
287299
if (g_source_info.source == SOURCE_HDZERO)
288300
tune_channel(DIAL_KEY_UP);
289301
} else if (g_app_state == APP_STATE_IMS) {
290302
ims_key(DIAL_KEY_UP);
303+
} else if (g_app_state == APP_STATE_OSD_ELEMENT_PREV) {
304+
ui_osd_element_pos_handle_input(DIAL_KEY_UP);
291305
} else if (g_app_state == PAGE_FAN_SLIDE) {
292306
fans_speed_dec();
293307
} else if (g_app_state == PAGE_ANGLE_SLIDE) {
@@ -318,11 +332,15 @@ static void roller_down(void) {
318332
menu_nav(DIAL_KEY_DOWN);
319333
} else if ((g_app_state == APP_STATE_SUBMENU) || (g_app_state == APP_STATE_PLAYBACK)) {
320334
submenu_roller(DIAL_KEY_DOWN);
335+
} else if ((g_app_state == APP_STATE_SUBMENU_ITEM_FOCUSED)) {
336+
submenu_roller_no_selection_change(DIAL_KEY_DOWN);
321337
} else if (g_app_state == APP_STATE_VIDEO) {
322338
if (g_source_info.source == SOURCE_HDZERO)
323339
tune_channel(DIAL_KEY_DOWN);
324340
} else if (g_app_state == APP_STATE_IMS) {
325341
ims_key(DIAL_KEY_DOWN);
342+
} else if (g_app_state == APP_STATE_OSD_ELEMENT_PREV) {
343+
ui_osd_element_pos_handle_input(DIAL_KEY_DOWN);
326344
} else if (g_app_state == PAGE_FAN_SLIDE) {
327345
fans_speed_inc();
328346
} else if (g_app_state == PAGE_ANGLE_SLIDE) {

src/core/main.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "ui/page_source.h"
3939
#include "ui/ui_image_setting.h"
4040
#include "ui/ui_main_menu.h"
41+
#include "ui/ui_osd_element_pos.h"
4142
#include "ui/ui_porting.h"
4243
#include "ui/ui_statusbar.h"
4344
#include "util/file.h"
@@ -169,6 +170,7 @@ int main(int argc, char *argv[]) {
169170
OLED_Pattern(0, 0, 0);
170171
osd_init();
171172
ims_init();
173+
ui_osd_element_pos_init();
172174

173175
// 6. Enable functionality
174176
if (g_setting.ht.enable) {
@@ -191,6 +193,7 @@ int main(int argc, char *argv[]) {
191193
statubar_update();
192194
osd_hdzero_update();
193195
ims_update();
196+
ui_osd_element_pos_update();
194197
ht_detect_motion();
195198
lv_timer_handler();
196199
source_status_timer();

src/core/osd.c

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <lvgl/lvgl.h>
1717
#include <minIni.h>
1818

19+
#include "core/app_state.h"
1920
#include "core/battery.h"
2021
#include "core/common.hh"
2122
#include "core/dvr.h"
@@ -318,6 +319,114 @@ bool fhd_change() {
318319
return false;
319320
}
320321

322+
void osd_show_all_elements() {
323+
if (g_setting.osd.element[OSD_GOGGLE_TOPFAN_SPEED].show)
324+
lv_obj_clear_flag(g_osd_hdzero.topfan_speed[is_fhd], LV_OBJ_FLAG_HIDDEN);
325+
else
326+
lv_obj_add_flag(g_osd_hdzero.topfan_speed[is_fhd], LV_OBJ_FLAG_HIDDEN);
327+
328+
if (g_setting.osd.element[OSD_GOGGLE_BATTERY_LOW].show)
329+
lv_obj_clear_flag(g_osd_hdzero.battery_low[is_fhd], LV_OBJ_FLAG_HIDDEN);
330+
else
331+
lv_obj_add_flag(g_osd_hdzero.battery_low[is_fhd], LV_OBJ_FLAG_HIDDEN);
332+
333+
if (g_setting.osd.element[OSD_GOGGLE_VTX_TEMP].show)
334+
lv_obj_clear_flag(g_osd_hdzero.vtx_temp[is_fhd], LV_OBJ_FLAG_HIDDEN);
335+
else
336+
lv_obj_add_flag(g_osd_hdzero.vtx_temp[is_fhd], LV_OBJ_FLAG_HIDDEN);
337+
338+
if (g_setting.osd.element[OSD_GOGGLE_VRX_TEMP].show)
339+
lv_obj_clear_flag(g_osd_hdzero.vrx_temp[is_fhd], LV_OBJ_FLAG_HIDDEN);
340+
else
341+
lv_obj_add_flag(g_osd_hdzero.vrx_temp[is_fhd], LV_OBJ_FLAG_HIDDEN);
342+
343+
if (g_setting.osd.element[OSD_GOGGLE_LATENCY_LOCK].show)
344+
lv_obj_clear_flag(g_osd_hdzero.latency_lock[is_fhd], LV_OBJ_FLAG_HIDDEN);
345+
else
346+
lv_obj_add_flag(g_osd_hdzero.latency_lock[is_fhd], LV_OBJ_FLAG_HIDDEN);
347+
348+
if (g_setting.osd.element[OSD_GOGGLE_CHANNEL].show)
349+
lv_obj_clear_flag(g_osd_hdzero.channel[is_fhd], LV_OBJ_FLAG_HIDDEN);
350+
else
351+
lv_obj_add_flag(g_osd_hdzero.channel[is_fhd], LV_OBJ_FLAG_HIDDEN);
352+
353+
if (g_setting.osd.element[OSD_GOGGLE_SD_REC].show)
354+
lv_obj_clear_flag(g_osd_hdzero.sd_rec[is_fhd], LV_OBJ_FLAG_HIDDEN);
355+
else
356+
lv_obj_add_flag(g_osd_hdzero.sd_rec[is_fhd], LV_OBJ_FLAG_HIDDEN);
357+
358+
if (g_setting.osd.element[OSD_GOGGLE_VLQ].show)
359+
lv_obj_clear_flag(g_osd_hdzero.vlq[is_fhd], LV_OBJ_FLAG_HIDDEN);
360+
else
361+
lv_obj_add_flag(g_osd_hdzero.vlq[is_fhd], LV_OBJ_FLAG_HIDDEN);
362+
363+
if (g_setting.osd.element[OSD_GOGGLE_ANT0].show)
364+
lv_obj_clear_flag(g_osd_hdzero.ant0[is_fhd], LV_OBJ_FLAG_HIDDEN);
365+
else
366+
lv_obj_add_flag(g_osd_hdzero.ant0[is_fhd], LV_OBJ_FLAG_HIDDEN);
367+
368+
if (g_setting.osd.element[OSD_GOGGLE_ANT1].show)
369+
lv_obj_clear_flag(g_osd_hdzero.ant1[is_fhd], LV_OBJ_FLAG_HIDDEN);
370+
else
371+
lv_obj_add_flag(g_osd_hdzero.ant1[is_fhd], LV_OBJ_FLAG_HIDDEN);
372+
373+
if (g_setting.osd.element[OSD_GOGGLE_ANT2].show)
374+
lv_obj_clear_flag(g_osd_hdzero.ant2[is_fhd], LV_OBJ_FLAG_HIDDEN);
375+
else
376+
lv_obj_add_flag(g_osd_hdzero.ant2[is_fhd], LV_OBJ_FLAG_HIDDEN);
377+
378+
if (g_setting.osd.element[OSD_GOGGLE_ANT3].show)
379+
lv_obj_clear_flag(g_osd_hdzero.ant3[is_fhd], LV_OBJ_FLAG_HIDDEN);
380+
else
381+
lv_obj_add_flag(g_osd_hdzero.ant3[is_fhd], LV_OBJ_FLAG_HIDDEN);
382+
383+
if (!g_test_en)
384+
return;
385+
386+
if (g_setting.osd.element[OSD_GOGGLE_TEMP_TOP].show)
387+
lv_obj_clear_flag(g_osd_hdzero.osd_tempe[is_fhd][0], LV_OBJ_FLAG_HIDDEN);
388+
else
389+
lv_obj_add_flag(g_osd_hdzero.osd_tempe[is_fhd][0], LV_OBJ_FLAG_HIDDEN);
390+
391+
if (g_setting.osd.element[OSD_GOGGLE_TEMP_LEFT].show)
392+
lv_obj_clear_flag(g_osd_hdzero.osd_tempe[is_fhd][1], LV_OBJ_FLAG_HIDDEN);
393+
else
394+
lv_obj_add_flag(g_osd_hdzero.osd_tempe[is_fhd][1], LV_OBJ_FLAG_HIDDEN);
395+
396+
if (g_setting.osd.element[OSD_GOGGLE_TEMP_RIGHT].show)
397+
lv_obj_clear_flag(g_osd_hdzero.osd_tempe[is_fhd][2], LV_OBJ_FLAG_HIDDEN);
398+
else
399+
lv_obj_add_flag(g_osd_hdzero.osd_tempe[is_fhd][2], LV_OBJ_FLAG_HIDDEN);
400+
}
401+
402+
void osd_elements_set_dummy_sources() {
403+
char buf[128];
404+
405+
osd_resource_path(buf, "%s", is_fhd, VtxTemp1_bmp);
406+
lv_img_set_src(g_osd_hdzero.vtx_temp[is_fhd], buf);
407+
408+
osd_resource_path(buf, "%s", is_fhd, ant2_bmp);
409+
lv_img_set_src(g_osd_hdzero.ant0[is_fhd], buf);
410+
411+
osd_resource_path(buf, "%s", is_fhd, ant3_bmp);
412+
lv_img_set_src(g_osd_hdzero.ant1[is_fhd], buf);
413+
414+
osd_resource_path(buf, "%s", is_fhd, ant4_bmp);
415+
lv_img_set_src(g_osd_hdzero.ant2[is_fhd], buf);
416+
417+
osd_resource_path(buf, "%s", is_fhd, ant5_bmp);
418+
lv_img_set_src(g_osd_hdzero.ant3[is_fhd], buf);
419+
420+
osd_resource_path(buf, "%s", is_fhd, recording_bmp);
421+
lv_img_set_src(g_osd_hdzero.sd_rec[is_fhd], buf);
422+
423+
osd_resource_path(buf, "%s", is_fhd, VLQ9_bmp);
424+
lv_img_set_src(g_osd_hdzero.vlq[is_fhd], buf);
425+
426+
osd_resource_path(buf, "%s", is_fhd, fan5_bmp);
427+
lv_img_set_src(g_osd_hdzero.topfan_speed[is_fhd], buf);
428+
}
429+
321430
#define FC_OSD_CHECK_PERIOD 200 // 25ms
322431
void osd_hdzero_update(void) {
323432
char buf[128], i;
@@ -332,6 +441,14 @@ void osd_hdzero_update(void) {
332441
if (fhd_change())
333442
return;
334443

444+
// if the user is in the osd element position settings, show all elements
445+
if (g_app_state == APP_STATE_OSD_ELEMENT_PREV) {
446+
// some elements might not be visible, set dummy sources to show them
447+
osd_elements_set_dummy_sources();
448+
osd_show_all_elements();
449+
return;
450+
}
451+
335452
bool showRXOSD = g_showRXOSD && (g_source_info.source == SOURCE_HDZERO);
336453

337454
osd_rec_show(g_showRXOSD);
@@ -487,6 +604,7 @@ void osd_update_mode() {
487604
osd_object_set_pos(is_fhd, g_osd_hdzero.latency_lock[is_fhd], &g_setting.osd.element[OSD_GOGGLE_LATENCY_LOCK].position);
488605
osd_object_set_pos(is_fhd, g_osd_hdzero.sd_rec[is_fhd], &g_setting.osd.element[OSD_GOGGLE_SD_REC].position);
489606
osd_object_set_pos(is_fhd, g_osd_hdzero.vlq[is_fhd], &g_setting.osd.element[OSD_GOGGLE_VLQ].position);
607+
osd_object_set_pos(is_fhd, g_osd_hdzero.channel[is_fhd], &g_setting.osd.element[OSD_GOGGLE_CHANNEL].position);
490608
osd_object_set_pos(is_fhd, g_osd_hdzero.ant0[is_fhd], &g_setting.osd.element[OSD_GOGGLE_ANT0].position);
491609
osd_object_set_pos(is_fhd, g_osd_hdzero.ant1[is_fhd], &g_setting.osd.element[OSD_GOGGLE_ANT1].position);
492610
osd_object_set_pos(is_fhd, g_osd_hdzero.ant2[is_fhd], &g_setting.osd.element[OSD_GOGGLE_ANT2].position);

src/core/settings.c

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ const setting_t g_setting_defaults = {
4141
.power_ana = false,
4242
},
4343
.source = {
44-
.analog_format = SETTING_SOURCES_ANALOG_FORMAT_PAL
44+
.analog_format = SETTING_SOURCES_ANALOG_FORMAT_PAL,
4545
},
4646
.record = {
4747
.mode_manual = false,
@@ -166,6 +166,44 @@ const setting_t g_setting_defaults = {
166166
.format = 0,
167167
}};
168168

169+
int settings_put_osd_element_shown(bool show, char *config_name) {
170+
char setting_key[128];
171+
172+
sprintf(setting_key, "element_%s_show", config_name);
173+
return settings_put_bool("osd", setting_key, show);
174+
}
175+
176+
int settings_put_osd_element_pos_x(const setting_osd_goggle_element_positions_t *pos, char *config_name) {
177+
char setting_key[128];
178+
int ret = 0;
179+
180+
sprintf(setting_key, "element_%s_pos_4_3_x", config_name);
181+
ret = ini_putl("osd", setting_key, pos->mode_4_3.x, SETTING_INI);
182+
sprintf(setting_key, "element_%s_pos_16_9_x", config_name);
183+
ret &= ini_putl("osd", setting_key, pos->mode_16_9.x, SETTING_INI);
184+
return ret;
185+
}
186+
187+
int settings_put_osd_element_pos_y(const setting_osd_goggle_element_positions_t *pos, char *config_name) {
188+
char setting_key[128];
189+
int ret = 0;
190+
191+
sprintf(setting_key, "element_%s_pos_4_3_y", config_name);
192+
ret = ini_putl("osd", setting_key, pos->mode_4_3.y, SETTING_INI);
193+
sprintf(setting_key, "element_%s_pos_16_9_y", config_name);
194+
ret &= ini_putl("osd", setting_key, pos->mode_16_9.y, SETTING_INI);
195+
return ret;
196+
}
197+
198+
int settings_put_osd_element(const setting_osd_goggle_element_t *element, char *config_name) {
199+
int ret = 0;
200+
201+
ret = settings_put_osd_element_shown(element->show, config_name);
202+
ret &= settings_put_osd_element_pos_x(&element->position, config_name);
203+
ret &= settings_put_osd_element_pos_y(&element->position, config_name);
204+
return ret;
205+
}
206+
169207
static void settings_load_osd_element(setting_osd_goggle_element_t *element, char *config_name, const setting_osd_goggle_element_t *defaults) {
170208
char buf[128];
171209

src/core/settings.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,5 +193,9 @@ extern const setting_t g_setting_defaults;
193193
void settings_reset(void);
194194
void settings_init(void);
195195
void settings_load(void);
196-
bool settings_get_bool(char* section, char* key, bool default_val);
197-
int settings_put_bool(char* section, char* key, bool value);
196+
bool settings_get_bool(char *section, char *key, bool default_val);
197+
int settings_put_bool(char *section, char *key, bool value);
198+
int settings_put_osd_element(const setting_osd_goggle_element_t *element, char *config_name);
199+
int settings_put_osd_element_pos_y(const setting_osd_goggle_element_positions_t *pos, char *config_name);
200+
int settings_put_osd_element_pos_x(const setting_osd_goggle_element_positions_t *pos, char *config_name);
201+
int settings_put_osd_element_shown(bool show, char *config_name);

src/ui/page_clock.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ static void page_clock_create_dropdown(lv_obj_t *parent,
147147
char text[512];
148148
snprintf(text, sizeof(text), "%d", option);
149149

150-
page_clock_items[item].data.obj = create_dropdown_item(parent, page_clock_options[item].list, col, row);
150+
page_clock_items[item].data.obj = create_dropdown_item(parent, page_clock_options[item].list, col, row, 160, 40, 1, 4, LV_GRID_ALIGN_START, &lv_font_montserrat_26);
151151
page_clock_items[item].type = ITEM_TYPE_OBJ;
152152

153153
int index = page_clock_get_dropdown_index(item, text);

0 commit comments

Comments
 (0)