static void show_page(int page) { enum { COL1 = (30 + ((LCD_WIDTH - 320) / 2)), COL2 = (150 + ((LCD_WIDTH - 320) / 2)), LABEL_WIDTH = (COL2 - COL1), ROW1 = (40 + ((LCD_HEIGHT - 240) / 2)), ROW_HEIGHT = 24, }; struct mixer_page * mp = &pagemem.u.mixer_page; if (mp->firstObj) { GUI_RemoveHierObjects(mp->firstObj); FullRedraw = REDRAW_ONLY_DIRTY; mp->firstObj = NULL; GUI_DrawBackground(0, 32, LCD_WIDTH - 16, LCD_HEIGHT - 32); } for (long i = 0; i < ENTRIES_PER_PAGE; i++) { int row = ROW1 + ROW_HEIGHT * i; long ch = page + i; if (ch >= Model.num_channels) break; guiObject_t *obj = GUI_CreateLabelBox(&gui->name[i], COL1, row, LABEL_WIDTH, 16, &LABEL_FONT, STDMIX_channelname_cb, NULL, (void *)(ch)); if (! mp->firstObj) mp->firstObj = obj; GUI_CreateTextSelect(&gui->value[i], COL2, row, TEXTSELECT_128, toggle_reverse_cb, reverse_cb, (void *)(ch)); } }
static int scroll_cb(guiObject_t *parent, u8 pos, s8 direction, void *data) { (void)data; (void)parent; int page = pos + (direction > 0 ? 1 : -1); if (page < 0) { return pos; } else if(page >= GUI_GetScrollbarNumItems(&gui->scrollbar)) { return pos; } int idx = 0; if (page) { for(int i = 0; i < NUM_SYMBOL_COLS * page; i++) { idx = get_next_icon(idx); if (idx < 0) { idx = 0; break; } } } GUI_RemoveHierObjects((guiObject_t *)&gui->symbolicon[0]); FullRedraw = REDRAW_ONLY_DIRTY; GUI_DrawBackground(0, 79, LCD_WIDTH - 16, LCD_HEIGHT - 79); show_icons((long)data, idx); return page; }
static void show_page(int page) { enum { COL1 = (10 + ((LCD_WIDTH - 320) / 2)), COL2 = (90 + ((LCD_WIDTH - 320) / 2)), COL3 = (196 + ((LCD_WIDTH - 320) / 2)), LABEL_WIDTH = (COL2 - COL1), ROW1 = (56 + ((LCD_HEIGHT - 240) / 2)), ROW_HEIGHT = 22, }; struct mixer_page * mp = &pagemem.u.mixer_page; if (mp->firstObj) { GUI_RemoveHierObjects(mp->firstObj); mp->firstObj = NULL; } for (long i = 0; i < ENTRIES_PER_PAGE; i++) { int row = ROW1 + ROW_HEIGHT * i; long ch = page + i; if (ch >= Model.num_channels) break; mp->limit = MIXER_GetLimit(ch); guiObject_t *obj = GUI_CreateLabelBox(&gui->name[i], COL1, row, LABEL_WIDTH, 16, &LABEL_FONT, STDMIX_channelname_cb, NULL, (void *)ch); if (! mp->firstObj) mp->firstObj = obj; GUI_CreateTextSelect(&gui->down[i], COL2, row, TEXTSELECT_96, NULL, traveldown_cb, (void *)ch); GUI_CreateTextSelect(&gui->up[i], COL3, row, TEXTSELECT_96, NULL, travelup_cb, (void *)ch); } }
void show_config() { int count = 0; int row_idx = 0; long type; if (OBJ_IS_USED(&gui->dialog)) GUI_RemoveHierObjects((guiObject_t *)&gui->dialog); if(lp->selected_for_move >= 0) { type = ELEM_TYPE(pc->elem[lp->selected_for_move]); row_idx = elem_abs_to_rel(lp->selected_for_move); count = elem_get_count(type); } if (! count) { dialog_ok_cb(1, NULL); return; } int x = LAYDLG_X - (type == ELEM_TOGGLE ? 68/2 : 0); int width = LAYDLG_MIN_WIDTH + (type == ELEM_TOGGLE ? 64 : 0); GUI_CreateDialog(&gui->dialog, x, LAYDLG_Y, width, LAYDLG_HEIGHT, _tr("Page Config"), NULL, dialog_ok_cb, dtOk, ""); GUI_CreateScrollable(&gui->scrollable, x + LAYDLG_SCROLLABLE_X, LAYDLG_Y + LAYDLG_SCROLLABLE_Y, width - 2 * LAYDLG_SCROLLABLE_X + 1, LAYDLG_SCROLLABLE_HEIGHT, LAYDLG_TEXT_HEIGHT, count, row_cb, NULL, NULL, (void *)type); GUI_SetSelected(GUI_ShowScrollableRowCol(&gui->scrollable, row_idx, 0)); }
void GUI_RemoveObj(struct guiObject *obj) { switch(obj->Type) { case Dialog: { GUI_HandleModalButtons(0); GUI_RemoveHierObjects(obj->next); objDIALOG = NULL; break; } case Scrollbar: BUTTON_UnregisterCallback(&((guiScrollbar_t *)obj)->action); break; case Scrollable: GUI_RemoveScrollableObjs(obj); GUI_RemoveObj((guiObject_t *)&((guiScrollable_t *)obj)->scrollbar); break; case Keyboard: BUTTON_UnregisterCallback(&((guiKeyboard_t *)obj)->action); break; case Image: case XYGraph: _GUI_UnmapWindow(1); break; default: break; } if (objTOUCHED == obj) objTOUCHED = NULL; if (objSELECTED == obj) objSELECTED = NULL; OBJ_SET_USED(obj, 0); // Reattach linked list struct guiObject *prev = objHEAD; if (prev == obj) { objHEAD = obj->next; } else { while(prev) { if(prev->next == obj) { prev->next = obj->next; break; } prev = prev->next; } } FullRedraw = objHEAD ? REDRAW_IF_NOT_MODAL : REDRAW_EVERYTHING; }
static void show_page(int page) { struct mixer_page * mp = &pagemem.u.mixer_page; if (mp->firstObj) { GUI_RemoveHierObjects(mp->firstObj); mp->firstObj = NULL; } for (long i = 0; i < ENTRIES_PER_PAGE; i++) { int row = 40 + ((LCD_HEIGHT - 240) / 2) + 24 * i; long ch = page + i; if (ch >= Model.num_channels) break; guiObject_t *obj = GUI_CreateLabelBox(&gui->name[i], 30 + ((LCD_WIDTH - 320) / 2), row, 0, 16, &DEFAULT_FONT, STDMIX_channelname_cb, NULL, (void *)(ch)); if (! mp->firstObj) mp->firstObj = obj; GUI_CreateTextSelect(&gui->value[i], 150 + ((LCD_WIDTH - 320) / 2), row, TEXTSELECT_128, toggle_reverse_cb, reverse_cb, (void *)(ch)); } }
static void show_page(int page) { struct mixer_page * mp = &pagemem.u.mixer_page; if (mp->firstObj) { GUI_RemoveHierObjects(mp->firstObj); mp->firstObj = NULL; } for (long i = 0; i < ENTRIES_PER_PAGE; i++) { int row = 56 + ((LCD_HEIGHT - 240) / 2) + 22 * i; long ch = page + i; if (ch >= Model.num_channels) break; mp->limit = MIXER_GetLimit(ch); guiObject_t *obj = GUI_CreateLabelBox(&gui->name[i], 10 + ((LCD_WIDTH - 320) / 2), row, 0, 16, &DEFAULT_FONT, STDMIX_channelname_cb, NULL, (void *)ch); if (! mp->firstObj) mp->firstObj = obj; GUI_CreateTextSelect(&gui->down[i], 90 + ((LCD_WIDTH - 320) / 2), row, TEXTSELECT_96, NULL, traveldown_cb, (void *)ch); GUI_CreateTextSelect(&gui->up[i], 196 + ((LCD_WIDTH - 320) / 2), row, TEXTSELECT_96, NULL, travelup_cb, (void *)ch); } }
static void _show_page() { // Note for future maintenance: DO NOT use logical view to draw all the channel items at a time for this page: I just // gave it a try, it spent very long time to construct all the 30 items and could trigger watch-dog to reboot !!! static const int XOFFSET = ((LCD_WIDTH - 320) / 2); int init_y = LCD_HEIGHT == 240 ? 44 : 36; int i; if (mp->firstObj) { GUI_RemoveHierObjects(mp->firstObj); mp->firstObj = NULL; } struct Mixer *mix = MIXER_GetAllMixers(); for (i = 0; i < ENTRIES_PER_PAGE; i++) { guiObject_t *obj; u8 idx; int row = init_y + 24 * i; u8 ch = mp->top_channel + i; if (ch >= Model.num_channels) ch += (NUM_OUT_CHANNELS - Model.num_channels); if (ch < NUM_OUT_CHANNELS) { obj = GUI_CreateButton(&gui->name[i].but, XOFFSET+4, row, BUTTON_64x16, MIXPAGE_ChanNameProtoCB, 0x0000, limitselect_cb, (void *)((long)ch)); } else if(! _is_virt_cyclic(ch)) { obj = GUI_CreateButton(&gui->name[i].but, XOFFSET+4, row, BUTTON_64x16, MIXPAGE_ChanNameProtoCB, 0x0000, virtname_cb, (void *)(long)ch); } else { obj = GUI_CreateLabelBox(&gui->name[i].lbl, XOFFSET+4, row, 64, 16, &DEFAULT_FONT, MIXPAGE_ChanNameProtoCB, NULL, (void *)((long)ch)); } if (! mp->firstObj) mp->firstObj = obj; GUI_CreateButton(&gui->tmpl[i], XOFFSET+132, row, BUTTON_64x16, template_name_cb, 0x0000, templateselect_cb, (void *)((long)ch)); for (idx = 0; idx < NUM_MIXERS; idx++) if (mix[idx].src && mix[idx].dest == ch) break; if (idx != NUM_MIXERS) { enum TemplateType template = MIXER_GetTemplate(ch); GUI_CreateLabelBox(&gui->src[i], XOFFSET+68, row, 60, 16, &NARROW_FONT, show_source, NULL, &mix[idx].src); if (template == MIXERTEMPLATE_EXPO_DR) {
void MIXPAGE_ChangeTemplate(int show_header) { if (mp->cur_template != MIXERTEMPLATE_COMPLEX || mp->cur_mixer < mp->mixer || mp->cur_mixer > mp->mixer + mp->num_mixers) { mp->cur_mixer = mp->mixer; } if (Model.type == MODELTYPE_PLANE && mp->cur_template > MIXERTEMPLATE_MAX_PLANE) { mp->cur_template = MIXERTEMPLATE_NONE; } sync_mixers(); if (show_header) { PAGE_RemoveAllObjects(); _show_titlerow(); } else { GUI_RemoveHierObjects(mp->firstObj); } mp->firstObj = NULL; switch(mp->cur_template) { case MIXERTEMPLATE_NONE: case MIXERTEMPLATE_CYC1: case MIXERTEMPLATE_CYC2: case MIXERTEMPLATE_CYC3: show_none(); return; case MIXERTEMPLATE_SIMPLE: _show_simple(); break; case MIXERTEMPLATE_EXPO_DR: _show_expo_dr(); break; case MIXERTEMPLATE_COMPLEX: _show_complex(0); break; } set_src_enable(CURVE_TYPE(&mp->mixer[0].curve)); }
static void _show_page() { if (firstObj) { GUI_RemoveHierObjects(firstObj); firstObj = NULL; } #define COL1 16 #define COL2 (COL1+106) #if LCD_WIDTH == 480 #define COL3 (LCD_WIDTH-16-106-96) // border + label + button #define COL4 (LCD_WIDTH-16-96) // border + button #define BUTTON_WIDE BUTTON_96x16 #define BUTTON_TEST BUTTON_48x16 #define BUTTON_TOUCH BUTTON_TEST #define COL2TEST (COL2+48) #define ADDSPACE 0 #define ADDROW 0 #else #define COL3 COL1 #define COL4 COL2 #define BUTTON_WIDE BUTTON_96 #define BUTTON_TEST BUTTON_48 #define BUTTON_TOUCH BUTTON_WIDE #define COL2TEST (COL2+100) #define ADDSPACE 15 #define ADDROW 6 #endif guiObject_t *obj; u8 space = 19; int row = 40; int col1 = COL1; int col2 = COL2; if (page_num == 0 || LCD_WIDTH == 480) { obj = GUI_CreateLabelBox(&gui1->head1_1, col1, row, 0, 0, &SECTION_FONT, NULL, NULL, _tr("Generic settings")); if (firstObj == NULL) firstObj = obj; row += space; if (row+12 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui1->langlbl, col1, row+ADDROW, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Language")); GUI_CreateButton(&gui1->lang, col2, row, BUTTON_WIDE, langstr_cb, 0x0000, lang_select_cb, NULL); row += space + ADDSPACE ; if (row+12 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui1->modelbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Stick mode")); GUI_CreateTextSelect(&gui1->mode, col2, row, TEXTSELECT_96, NULL, modeselect_cb, NULL); row += space + ADDSPACE; if (row+12 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui1->touchlbl, col1, row+ADDROW, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Touch screen")); GUI_CreateButton(&gui1->touchcalib, col2, row, BUTTON_WIDE, calibratestr_cb, 0x0000, press_cb, (void *)CALIB_TOUCH); row += space + ADDSPACE; if (row+12 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui1->sticklbl, col1, row+ADDROW, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Sticks")); GUI_CreateButton(&gui1->stickcalib, col2, row, BUTTON_WIDE, calibratestr_cb, 0x0000, press_cb, (void *)CALIB_STICK); #if HAS_RTC row += space + ADDSPACE; if (row+12 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui1->clocklbl, col1, row+ADDROW, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Clock")); GUI_CreateButton(&gui1->clock, col2, row, BUTTON_WIDE, clockstr_cb, 0x0000, press_cb, (void *)SET_CLOCK); row += space + ADDSPACE; #else row += space + (LCD_WIDTH == 320 ? 8 : 16); // for nicer look #endif //HAS_RTC if (row+12 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } } if (page_num == 1 || LCD_WIDTH == 480) { obj = GUI_CreateLabelBox(&gui2->head2_1, col1, row, 0, 0, &SECTION_FONT, NULL, NULL, _tr("Buzzer settings")); if (firstObj == NULL) firstObj = obj; row += space; if (row+12 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui2->power_alarmlbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Power On alarm")); GUI_CreateTextSelect(&gui2->power_alarm, col2, row, TEXTSELECT_96, NULL, poweralarm_select_cb, NULL); row += space; if (row+12 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui2->battalrmlbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Battery alarm")); GUI_CreateTextSelect(&gui2->battalrm, col2, row, TEXTSELECT_96, NULL, batalarm_select_cb, NULL); row += space; if (row+12 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui2->battalrmintvllbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Alarm intvl")); GUI_CreateTextSelect(&gui2->battalrmintvl, col2, row, TEXTSELECT_96, NULL, batalarmwarn_select_cb, NULL); row += space; if (row+12 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui2->buzzlbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Buzz volume")); GUI_CreateTextSelect(&gui2->buzz, col2, row, TEXTSELECT_96, NULL, _buzz_vol_cb, (void *)&Transmitter.volume); row += space; if (row+12 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui2->musicshutdbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Power-down alert")); GUI_CreateTextSelect(&gui2->music_shutdown, col2, row, TEXTSELECT_96, NULL, _music_shutdown_cb, (void *)&Transmitter.music_shutdown); row += space + 8; if (row+12 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui2->head2_2, col1, row, 0, 0, &SECTION_FONT, NULL, NULL, _tr("LCD settings")); row += space; if (row+8 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui2->backlightlbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Backlight")); GUI_CreateTextSelect(&gui2->backlight, col2, row, TEXTSELECT_96, NULL, brightness_select_cb, NULL); row += space; if (row+8 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui2->dimtimelbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Dimmer time")); GUI_CreateTextSelect(&gui2->dimtime, col2, row, TEXTSELECT_96, NULL, auto_dimmer_time_cb, NULL); row += space; if (row+8 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui2->dimtgtlbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Dimmer target")); GUI_CreateTextSelect(&gui2->dimtgt, col2, row, TEXTSELECT_96, NULL, common_select_cb, (void *)&Transmitter.auto_dimmer.backlight_dim_value); row += space + 8; if (row+8 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } } if (page_num == 2 || LCD_WIDTH == 480) { obj = GUI_CreateLabelBox(&gui3->head3_1, col1, row, 0, 0, &SECTION_FONT, NULL, NULL, _tr("Timer settings")); if (firstObj == NULL) firstObj = obj; row += space; if (row+8 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui3->prealertlbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Prealert time")); GUI_CreateTextSelect(&gui3->prealert, col2, row, TEXTSELECT_96,NULL, prealert_time_cb, (void *)0L); row += space; if (row+8 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui3->preintvllbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Prealert intvl")); GUI_CreateTextSelect(&gui3->preintvl, col2, row, TEXTSELECT_96, NULL, timer_interval_cb, &Transmitter.countdown_timer_settings.prealert_interval); row += space; if (row+8 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui3->timeuplbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL,_tr("Timeup intvl")); GUI_CreateTextSelect(&gui3->timeup, col2, row, TEXTSELECT_96, NULL, timer_interval_cb, &Transmitter.countdown_timer_settings.timeup_interval); row += space + 8; if (row+8 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui3->head3_2, col1, row, 0, 0, &SECTION_FONT, NULL, NULL, _tr("Telemetry settings")); row += space; if (row+8 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui3->templbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Temperature")); GUI_CreateTextSelect(&gui3->temp, col2, row, TEXTSELECT_96, NULL, units_cb, (void *)1L); row += space; if (row+8 >= LCD_HEIGHT) { row = 40; col1 = COL3; col2 = COL4; } GUI_CreateLabelBox(&gui3->lengthlbl, col1, row, 0, 0, &DEFAULT_FONT, NULL, NULL, _tr("Length")); GUI_CreateTextSelect(&gui3->length, col2, row, TEXTSELECT_96, NULL, units_cb, (void *)0L); } }
static void toggle_press_cb(guiObject_t *obj, const void *data) { if (OBJ_IS_USED(&gui->dialog)) GUI_RemoveHierObjects((guiObject_t *)&gui->dialog); TGLICO_Select(obj, data); }