void show_config() { long count = 0; for (count = 0; count < NUM_ELEMS; count++) { if (! ELEM_USED(pc->elem[count])) break; } #if HAS_LAYOUT_EDITOR static const int ADD_LOAD = 2; # else static const int ADD_LOAD = 1; #endif GUI_CreateScrollable(&gui->scrollable, 0, HEADER_HEIGHT, LCD_WIDTH, LCD_HEIGHT - HEADER_HEIGHT, LINE_SPACE, count + NUM_QUICKPAGES + ADD_LOAD, row_cb, NULL, size_cb, (void *)count); PAGE_SetScrollable(&gui->scrollable, ¤t_selected); }
static void dlgbut_cb(struct guiObject *obj, const void *data) { (void)obj; int idx = (long)data; int i; //Remove object int type = ELEM_TYPE(pc.elem[idx]); for(i = idx+1; i < NUM_ELEMS; i++) { if (! ELEM_USED(pc.elem[i])) break; pc.elem[i-1] = pc.elem[i]; } ELEM_SET_Y(pc.elem[i-1], 0); idx = MAINPAGE_FindNextElem(type, 0); set_selected_for_move(idx); //close the dialog and reopen with new elements show_config(); }
int create_element() { int i; u16 x,y,w,h; for (i = 0; i < NUM_ELEMS; i++) if (! ELEM_USED(pc.elem[i])) break; if (i == NUM_ELEMS) return -1; y = 1; GetElementSize(lp.newelem, &w, &h); x = (LCD_WIDTH - w) / 2; y = (((LCD_HEIGHT - HEADER_Y) - h) / 2) + HEADER_Y; memset(&pc.elem[i], 0, sizeof(struct elem)); ELEM_SET_X(pc.elem[i], x); ELEM_SET_Y(pc.elem[i], y); ELEM_SET_TYPE(pc.elem[i], lp.newelem); return i; }
static int layout_ini_handler(void* user, const char* section, const char* name, const char* value) { struct Model *m = (struct Model *)user; u16 i; int offset_x = 0, offset_y = 0; CLOCK_ResetWatchdog(); int idx; if (MATCH_START(name, GUI_QUICKPAGE)) { u8 idx = name[9] - '1'; if (idx >= NUM_QUICKPAGES) { printf("%s: Only %d quickpages are supported\n", section, NUM_QUICKPAGES); return 1; } int max = PAGE_GetNumPages(); for(i = 0; i < max; i++) { if(mapstrcasecmp(PAGE_GetName(i), value) == 0) { m->pagecfg2.quickpage[idx] = i; return 1; } } printf("%s: Unknown page '%s' for quickpage%d\n", section, value, idx+1); return 1; } #ifdef ENABLE_320x240_GUI static u8 seen_res = 0; enum { LOWRES = 1, HIRES, }; if (! MATCH_SECTION(SECTION_GUI)) { if(MATCH_SECTION("gui-320x240") && (! ELEM_USED(Model.pagecfg2.elem[0]) || seen_res != HIRES)) { seen_res = LOWRES; offset_x = (LCD_WIDTH - 320) / 2; offset_y = (LCD_HEIGHT - 240) / 2; } else return 1; } else { if (seen_res == LOWRES) { memset(&Model.pagecfg2.elem, 0, sizeof(Model.pagecfg2.elem)); } seen_res = HIRES; } #else if (! MATCH_SECTION(SECTION_GUI)) return 1; #endif for (idx = 0; idx < NUM_ELEMS; idx++) { if (! ELEM_USED(Model.pagecfg2.elem[idx])) break; } if (idx == NUM_ELEMS) { printf("No free element available (max = %d)\n", NUM_ELEMS); return 1; } int type; for (type = 0; type < ELEM_LAST; type++) if(mapstrcasecmp(name, GetElemName(type)) == 0) break; if (type == ELEM_LAST) return 1; int count = 5; s16 data[6] = {0}; const char *ptr = parse_partial_int_list(value, data, &count, S16); data[0] += offset_x; data[1] += offset_y; if (count > 3) { printf("Could not parse coordinates from %s=%s\n", name,value); return 1; } switch(type) { //case ELEM_MODEL: //x, y case ELEM_VTRIM: //x, y, src case ELEM_HTRIM: //x, y, src data[5] = data[2]; data[2] = 0; break; case ELEM_SMALLBOX: //x, y, src case ELEM_BIGBOX: //x. y. src { s16 src = -1; char str[20]; if (count != 3) return 1; #if HAS_RTC for(i = 0; i < NUM_RTC; i++) { if(mapstrcasecmp(ptr, RTC_Name(str, i)) == 0) { src = i + 1; break; } } #endif if (src == -1) { for(i = 0; i < NUM_TIMERS; i++) { if(mapstrcasecmp(ptr, TIMER_Name(str, i)) == 0) { src = i + 1 + NUM_RTC; break; } } } if (src == -1) { for(i = 0; i < NUM_TELEM; i++) { if(mapstrcasecmp(ptr, TELEMETRY_Name(str, i+1)) == 0) { src = i + 1 + NUM_RTC + NUM_TIMERS; break; } } } if (src == -1) { u8 newsrc = get_source(section, ptr); if(newsrc >= NUM_INPUTS) { src = newsrc - (NUM_INPUTS + 1 - (NUM_RTC + NUM_TIMERS + NUM_TELEM + 1)); } } if (src == -1) src = 0; data[5] = src; break; } case ELEM_BAR: //x, y, src { if (count != 3) return 1; u8 src = get_source(section, ptr); if (src < NUM_INPUTS) src = 0; data[5] = src - NUM_INPUTS; break; } case ELEM_TOGGLE: //x, y, tgl0, tgl1, tgl2, src { if(count) return 1; for (int j = 0; j <= NUM_SOURCES; j++) { char cmp[10]; if(mapstrcasecmp(INPUT_SourceNameAbbrevSwitchReal(cmp, j), ptr+1) == 0) { data[5] = j; break; } } break; } } create_element(&m->pagecfg2.elem[idx], type, data); return 1; }
void PAGE_MainEvent() { int i; if (PAGE_GetModal()) { #if HAS_TELEMETRY if(pagemem.modal_page == 2) { PAGE_TelemtestEvent(); } #endif return; } volatile s32 *raw = MIXER_GetInputs(); for(i = 0; i < NUM_ELEMS; i++) { if (! ELEM_USED(pc->elem[i])) break; if (! OBJ_IS_USED(&gui->elem[i])) continue; int src = pc->elem[i].src; int type = ELEM_TYPE(pc->elem[i]); switch(type) { case ELEM_VTRIM: case ELEM_HTRIM: { int value = *(MIXER_GetTrim(src-1)); if (mp->elem[i] != value) { mp->elem[i] = value; GUI_Redraw(&gui->elem[i].bar); } break; } case ELEM_SMALLBOX: case ELEM_BIGBOX: { s32 val = get_boxval(src); #if HAS_RTC if (src <= NUM_RTC) { if (mp->elem[i] != val) { mp->elem[i] = val; GUI_Redraw(&gui->elem[i].box); } } else #endif if (src - NUM_RTC <= NUM_TIMERS) { //Timer if ((val >= 0 && mp->elem[i] < 0) || (val < 0 && mp->elem[i] >= 0)) { GUI_SetLabelDesc(&gui->elem[i].box, get_box_font(type == ELEM_BIGBOX ? 0 : 2, val < 0)); mp->elem[i] = val; GUI_Redraw(&gui->elem[i].box); } else if (mp->elem[i] / 1000 != val /1000) { mp->elem[i] = val; GUI_Redraw(&gui->elem[i].box); } } else if (src - NUM_RTC - NUM_TIMERS <= NUM_TELEM) { //Telem int alarm = TELEMETRY_HasAlarm(src - NUM_RTC - NUM_TIMERS); if (alarm || ! TELEMETRY_IsUpdated(0xff)) { GUI_SetLabelDesc(&gui->elem[i].box, get_box_font(type == ELEM_BIGBOX ? 0 : 2, 1)); } else if(mp->elem[i] != val) { GUI_SetLabelDesc(&gui->elem[i].box, get_box_font(type == ELEM_BIGBOX ? 0 : 2, 0)); mp->elem[i] = val; GUI_Redraw(&gui->elem[i].box); } } else if (mp->elem[i] != val) { //Source mp->elem[i] = val; GUI_Redraw(&gui->elem[i].box); } break; } case ELEM_BAR: { s32 chan = MIXER_GetChannel(src-1, APPLY_SAFETY); if (mp->elem[i] != chan) { mp->elem[i] = chan; GUI_Redraw(&gui->elem[i].bar); } break; } case ELEM_TOGGLE: { src = MIXER_SRC(src); int idx = -1; if(src) { if (src > INP_HAS_CALIBRATION && src < INP_LAST) { //switch for (int j = 0; j < 3; j++) { // Assume switch 0/1/2 are in order if(ELEM_ICO(pc->elem[i], j) && raw[src+j] > 0) { idx = ELEM_ICO(pc->elem[i], j); break; } } } else { //Non switch int sw = raw[src] > 0 ? 1 : 0; if (ELEM_ICO(pc->elem[i], sw)) { idx = ELEM_ICO(pc->elem[i], sw); } } } if (idx != -1) { #ifdef HAS_CHAR_ICONS gui->elem[i].box.cb_data = (void *)(long)idx; #else struct ImageMap img; img = TGLICO_GetImage(idx); GUI_ChangeImage(&gui->elem[i].img, img.file, img.x_off, img.y_off); #endif GUI_SetHidden((guiObject_t *)&gui->elem[i], 0); } else { GUI_SetHidden((guiObject_t *)&gui->elem[i], 1); } } break; case ELEM_BATTERY: _check_voltage(&gui->elem[i].box); break; } } if(HAS_TOUCH) //FIXME: Hack to let 320x240 GUI continue to work _check_voltage(NULL); #if HAS_RTC if(Display.flags & SHOW_TIME) { u32 time = RTC_GetValue() / 60; if(mp->time != time) { mp->time = time; GUI_Redraw(&gui->time); } } #endif }