void PAGE_DrExpInit(int page) { (void)page; enum { COL3 = (4 + ((LCD_WIDTH - 320) / 2)), COL4 = (112 + ((LCD_WIDTH - 320) / 2)), COL5 = (216 + ((LCD_WIDTH - 320) / 2)), COL1 = COL4, COL2 = (COL1 + 32), ROW1 = (36 + ((LCD_HEIGHT - 240) / 2)), ROW2 = (ROW1 + 20), ROW3 = (ROW1 + 40), ROW4 = (ROW1 + 60), ROW5 = (ROW1 + 80), }; PAGE_ShowHeader_ExitOnly(PAGE_GetName(PAGEID_DREXP), MODELMENU_Show); PAGE_ShowHeader_ExitOnly(NULL, MODELMENU_Show); PAGE_ShowHeader_SetLabel(STDMIX_TitleString, SET_TITLE_DATA(PAGEID_DREXP, SWITCHFUNC_DREXP_AIL+drexp_type)); memset(mp, 0, sizeof(*mp)); int count = get_mixers(); int expected = INPUT_NumSwitchPos(mapped_std_channels.switches[SWITCHFUNC_DREXP_AIL+drexp_type]); if (count != expected) { GUI_CreateLabelBox(&gui->msg, 0, 120, 240, 16, &NARROW_FONT, NULL, NULL, "Invalid model ini!");// must be invalid model ini return; } /* Row 1 */ GUI_CreateLabelBox(&gui->srclbl, COL1, ROW1, 96, 16, &DEFAULT_FONT, NULL, NULL, _tr("Src")); GUI_CreateTextSelect(&gui->src, COL2, ROW1, TEXTSELECT_64, NULL, set_type_cb, NULL); /* Row 2 */ GUI_CreateLabelBox(&gui->mode[0], COL3, ROW2, 96, 16, &DEFAULT_FONT, NULL, NULL, STDMIX_ModeName(PITTHROMODE_NORMAL)); GUI_CreateLabelBox(&gui->mode[1], COL4, ROW2, 96, 16, &DEFAULT_FONT, NULL, NULL, STDMIX_ModeName(PITTHROMODE_IDLE1)); GUI_CreateLabelBox(&gui->mode[2], COL5, ROW2, 96, 16, &DEFAULT_FONT, NULL, NULL, STDMIX_ModeName(PITTHROMODE_IDLE2)); /* Row 3 */ GUI_CreateTextSelect(&gui->dr[0], COL3, ROW3, TEXTSELECT_96, NULL, set_dr_cb, ((void *)(long)PITTHROMODE_NORMAL)); GUI_CreateTextSelect(&gui->dr[1], COL4, ROW3, TEXTSELECT_96, NULL, set_dr_cb, ((void *)(long)PITTHROMODE_IDLE1)); GUI_CreateTextSelect(&gui->dr[2], COL5, ROW3, TEXTSELECT_96, NULL, set_dr_cb, ((void *)(long)PITTHROMODE_IDLE2)); /* Row 4 */ GUI_CreateTextSelect(&gui->exp[0], COL3, ROW4, TEXTSELECT_96, NULL, set_exp_cb, ((void *)(long)PITTHROMODE_NORMAL)); GUI_CreateTextSelect(&gui->exp[1], COL4, ROW4, TEXTSELECT_96, NULL, set_exp_cb, ((void *)(long)PITTHROMODE_IDLE1)); GUI_CreateTextSelect(&gui->exp[2], COL5, ROW4, TEXTSELECT_96, NULL, set_exp_cb, ((void *)(long)PITTHROMODE_IDLE2)); /* Row 5 */ u16 ymax = CHAN_MAX_VALUE/100 * MAX_SCALAR; s16 ymin = -ymax; GUI_CreateXYGraph(&gui->graph[0], COL3, ROW5, 96, 120, CHAN_MIN_VALUE, ymin, CHAN_MAX_VALUE, ymax, 0, 0, show_curve_cb, curpos_cb, NULL, (void *)(PITTHROMODE_NORMAL+1L)); GUI_CreateXYGraph(&gui->graph[1], COL4, ROW5, 96, 120, CHAN_MIN_VALUE, ymin, CHAN_MAX_VALUE, ymax, 0, 0, show_curve_cb, curpos_cb, NULL, (void *)(PITTHROMODE_IDLE1+1L)); GUI_CreateXYGraph(&gui->graph[2], COL5, ROW5, 96, 120, CHAN_MIN_VALUE, ymin, CHAN_MAX_VALUE, ymax, 0, 0, show_curve_cb, curpos_cb, NULL, (void *)(PITTHROMODE_IDLE2+1L)); _refresh_page(); }
void PAGE_TelemconfigInit(int page) { (void)page; enum { COL1 = (10 + ((LCD_WIDTH - 320) / 2)), COL2 = (COL1 + 55), COL3 = (COL1 + 156), COL4 = (COL1 + 225), ROW1 = (70 + ((LCD_HEIGHT - 240) / 2)), }; const u8 row_height = 25; PAGE_SetModal(0); #if HAS_STANDARD_GUI if (Model.mixer_mode == MIXER_STANDARD) PAGE_ShowHeader_ExitOnly(PAGE_GetName(PAGEID_TELEMCFG), MODELMENU_Show); else #endif PAGE_ShowHeader(PAGE_GetName(PAGEID_TELEMCFG)); if (telem_state_check() == 0) { GUI_CreateLabelBox(&gui->msg, 20, 80, 280, 100, &NARROW_FONT, NULL, NULL, tempstring); return; } for (long i = 0; i < TELEM_NUM_ALARMS; i++) { GUI_CreateLabelBox(&gui->name[i], COL1, ROW1 + row_height * i, 55, 16, &DEFAULT_FONT, label_cb, NULL, (void *)i); GUI_CreateTextSelect(&gui->type[i], COL2, ROW1 + row_height * i, TEXTSELECT_96, NULL, telem_name_cb, (void *)i); GUI_CreateTextSelect(&gui->gtlt[i], COL3, ROW1 + row_height * i, TEXTSELECT_64, NULL, gtlt_cb, (void *)i); GUI_CreateTextSelect(&gui->value[i], COL4, ROW1 + row_height * i, TEXTSELECT_64, NULL, limit_cb, (void *)i); } }
void PAGE_RTCInit(int page) { (void)page; PAGE_SetModal(1); PAGE_RemoveAllObjects(); PAGE_ShowHeader_ExitOnly(PAGE_GetName(PAGEID_RTC), okcancel_cb); u32 time = RTC_GetValue(); u32 timevalue = RTC_GetTimeValue(time); Rtc.value[HOUR] = (u16)(timevalue / 3600); Rtc.value[MINUTE] = (u16)(timevalue % 3600) / 60; Rtc.value[SECOND] = (u16)(timevalue % 60); RTC_GetDateStringLong(tempstring,time); int idx = (tempstring[1] == '.' ? 1 : 2); tempstring[idx] = 0; tempstring[idx+3] = 0; Rtc.value[DAY] = atoi(tempstring); Rtc.value[MONTH] = atoi(tempstring + idx + 1); Rtc.value[YEAR] = atoi(tempstring + idx + 4); min[SECOND] = 0; max[SECOND] = 59; min[MINUTE] = 0; max[MINUTE] = 59; min[HOUR] = 0; max[HOUR] = 23; min[DAY] = 1; max[DAY] = daysInMonth[Rtc.value[MONTH] - 1] + (((Rtc.value[YEAR] % 4) == 0) && (Rtc.value[MONTH] == 2) ? 1 : 0); min[MONTH] = 1; max[MONTH] = 12; min[YEAR] = RTC_STARTYEAR; max[YEAR] = RTC_STARTYEAR + 67; _show_page(); }
static void calibrate_touch(void) { if (cp->state == 0 || cp->state == 3) { if (GUI_ObjectNeedsRedraw((guiObject_t *)&guic->msg)) return; draw_target(cp->state ? LCD_WIDTH - XCOORD : XCOORD , cp->state ? LCD_HEIGHT - YCOORD : YCOORD + 32); cp->state++; } else if (cp->state == 1 || cp->state == 4) { if (SPITouch_IRQ()) { cp->coords = SPITouch_GetCoords(); cp->state++; } } else if (cp->state == 2) { if (! SPITouch_IRQ()) { cp->coords1 = cp->coords; GUI_RemoveObj((guiObject_t *)&guic->msg); GUI_CreateLabelBox(&guic->msg, LCD_WIDTH - XCOORD - 5, LCD_HEIGHT - YCOORD - 5, 11, 11, &SMALLBOX_FONT, NULL, NULL, ""); GUI_Redraw(&guic->msg1); cp->state = 3; } else { cp->coords = SPITouch_GetCoords(); } } else if (cp->state == 5) { if (! SPITouch_IRQ()) { s32 xscale, yscale; s32 xoff, yoff; printf("T1:(%d, %d)\n", cp->coords1.x, cp->coords1.y); printf("T2:(%d, %d)\n", cp->coords.x, cp->coords.y); xscale = cp->coords.x - cp->coords1.x; xscale = (LCD_WIDTH - 2 * XCOORD) * 0x10000 / xscale; yscale = cp->coords.y - cp->coords1.y; yscale = (LCD_HEIGHT - 32 - 2 * YCOORD) * 0x10000 / yscale; xoff = XCOORD - cp->coords1.x * xscale / 0x10000; yoff = YCOORD + 32 - cp->coords1.y * yscale / 0x10000; printf("Debug: scale(%d, %d) offset(%d, %d)\n", (int)xscale, (int)yscale, (int)xoff, (int)yoff); SPITouch_Calibrate(xscale, yscale, xoff, yoff); PAGE_RemoveAllObjects(); PAGE_SetModal(1); PAGE_ShowHeader_ExitOnly(_tr("Touch Test"), okcancel_cb); GUI_CreateLabelBox(&guic->msg, (LCD_WIDTH - 150) / 2, (LCD_HEIGHT - 25) / 2, 150, 25, &SMALLBOX_FONT, coords_cb, NULL, NULL); memset(&cp->coords, 0, sizeof(cp->coords)); cp->state = 6; } else { cp->coords = SPITouch_GetCoords(); } } else if(cp->state == 6) { struct touch t; if (SPITouch_IRQ()) { t = SPITouch_GetCoords(); if (memcmp(&t, &cp->coords, sizeof(t)) != 0) { cp->coords = t; GUI_Redraw(&guic->msg); } } } }
static const char *_mixermode_cb(guiObject_t *obj, int dir, void *data) { const char *ret = mixermode_cb(obj, dir, data); if(Model.mixer_mode != mp->last_mixermode) { mp->last_mixermode = Model.mixer_mode; PAGE_RemoveHeader(); if (Model.mixer_mode == MIXER_STANDARD) PAGE_ShowHeader_ExitOnly(PAGE_GetName(PAGEID_MODEL), MODELMENU_Show); else PAGE_ShowHeader(PAGE_GetName(PAGEID_MODEL)); } return ret; }
void PAGE_GyroSenseInit(int page) { (void)page; enum { COL1 = (10 + ((LCD_WIDTH - 320) / 2)), COL2 = (120 + ((LCD_WIDTH - 320) / 2)), ROW1 = (40 + ((LCD_HEIGHT - 240) / 2)), ROW2 = (70 + ((LCD_HEIGHT - 240) / 2)), ROW3 = (90 + ((LCD_HEIGHT - 240) / 2)), ROW4 = (110 + ((LCD_HEIGHT - 240) / 2)), ROW5 = (130 + ((LCD_HEIGHT - 240) / 2)), }; PAGE_ShowHeader_ExitOnly(NULL, MODELMENU_Show); PAGE_ShowHeader_SetLabel(STDMIX_TitleString, SET_TITLE_DATA(PAGEID_GYROSENSE, SWITCHFUNC_GYROSENSE)); memset(mp, 0, sizeof(*mp)); int expected = INPUT_NumSwitchPos(mapped_std_channels.switches[SWITCHFUNC_GYROSENSE]); int count = STDMIX_GetMixers(mp->mixer_ptr, mapped_std_channels.aux2, GYROMIXER_COUNT); if (! count) { count = STDMIX_GetMixers(mp->mixer_ptr, mapped_std_channels.gear, GYROMIXER_COUNT); } if (count != expected) { GUI_CreateLabelBox(&gui->msg, 0, 120, 240, 16, &NARROW_FONT, NULL, NULL, "Invalid model ini!");// must be invalid model ini return; } gyro_output = mp->mixer_ptr[0]->dest; convert_output_to_percentile(); /* Row 1 */ GUI_CreateLabelBox(&gui->chanlbl, COL1, ROW1, 0, 16, &DEFAULT_FONT, NULL, NULL, _tr("Channel")); GUI_CreateTextSelect(&gui->chan, COL2, ROW1, TEXTSELECT_128, NULL, gyro_output_cb, NULL); /* Row 2 */ GUI_CreateLabelBox(&gui->rangelbl, COL2, ROW2, 128, 16, &NARROW_FONT, NULL, NULL, "0% - 100%"); /* Row 3 */ GUI_CreateLabelBox(&gui->gyrolbl[0], COL1, ROW3, 0, 16, &DEFAULT_FONT, label_cb, NULL, (void *)1L); GUI_CreateTextSelect(&gui->gyro[0], COL2, ROW3, TEXTSELECT_128, NULL, gyro_val_cb, (void *)0L); /* Row 4 */ GUI_CreateLabelBox(&gui->gyrolbl[1], COL1, ROW4, 0, 16, &DEFAULT_FONT, label_cb, NULL, (void *)2L); GUI_CreateTextSelect(&gui->gyro[1], COL2, ROW4, TEXTSELECT_128, NULL, gyro_val_cb, (void *)1); if(expected == 3) { /* Row 5 */ GUI_CreateLabelBox(&gui->gyrolbl[2], COL1, ROW5, 0, 16, &DEFAULT_FONT, label_cb, NULL, (void *)3L); GUI_CreateTextSelect(&gui->gyro[2], COL2, ROW5, TEXTSELECT_128, NULL, gyro_val_cb, (void *)2); } }
void PAGE_ModelMenuInit(int page) { (void) page; long pos = 0; PAGE_SetModal(0); PAGE_ShowHeader_ExitOnly(PAGE_GetName(PAGEID_MODELMENU), goto_mainpage); u8 count = sizeof(menus) / sizeof(struct menu_s); for(int j = 0; j < 4; j++) { int y = 40 + j * (LCD_HEIGHT == 240 ? 50 : 59); for(int i = 0; i < 5; i++,pos++) { if (pos >= count) break; int x = (LCD_WIDTH == 320 ? 12 : 92) + i*60; GUI_CreateIcon(&gui->icon[pos], x, y, &menus[pos].icon, ico_select_cb, (void *)pos); } } }
void PAGE_ThroHoldInit(int page) { (void)page; enum { COL1 = (30 + ((LCD_WIDTH - 320) / 2)), COL2 = (150 + ((LCD_WIDTH - 320) / 2)), ROW1 = (80 + ((LCD_HEIGHT - 240) / 2)), ROW2 = (120 + ((LCD_HEIGHT - 240) / 2)), }; PAGE_ShowHeader_ExitOnly(NULL, MODELMENU_Show); PAGE_ShowHeader_SetLabel(STDMIX_TitleString, SET_TITLE_DATA(PAGEID_THROHOLD, SWITCHFUNC_HOLD)); GUI_CreateLabelBox(&gui->enlbl, COL1, ROW1, 0, 16, &DEFAULT_FONT, NULL, NULL, _tr("Thr hold")); GUI_CreateTextSelect(&gui->en, COL2, ROW1, TEXTSELECT_128, toggle_thold_cb, throhold_cb, NULL); GUI_CreateLabelBox(&gui->valuelbl, COL1, ROW2, 0, 16, &DEFAULT_FONT, NULL, NULL, _tr("Hold position")); GUI_CreateTextSelect(&gui->value, COL2, ROW2, TEXTSELECT_128, NULL, holdpostion_cb, NULL); }
static void _show_page() { #if HAS_STANDARD_GUI if (Model.mixer_mode == MIXER_STANDARD) PAGE_ShowHeader_ExitOnly(PAGE_GetName(PAGEID_TRIM), MODELMENU_Show); else #endif PAGE_ShowHeader(PAGE_GetName(PAGEID_TRIM)); GUI_CreateLabelBox(&gui->inplbl, PCOL1, PROW1, 64, 15, &NARROW_FONT, NULL, NULL, _tr("Input")); GUI_CreateLabelBox(&gui->neglbl, PCOL2, PROW1, 64, 15, &NARROW_FONT, NULL, NULL, _tr("Trim -")); GUI_CreateLabelBox(&gui->poslbl, PCOL3, PROW1, 64, 15, &NARROW_FONT, NULL, NULL, _tr("Trim +")); GUI_CreateLabelBox(&gui->steplbl, PCOL4, PROW1, 108, 15, &NARROW_FONT, NULL, NULL, _tr("Trim Step")); GUI_CreateScrollable(&gui->scrollable, PCOL1, PROW2, LCD_WIDTH - 2 * PCOL1, NUM_TRIM_ROWS * 24 - 8, 24, NUM_TRIMS, row_cb, getobj_cb, NULL, NULL); }
void PAGE_RTCInit(int page) { (void)page; PAGE_SetModal(1); PAGE_RemoveAllObjects(); PAGE_ShowHeader_ExitOnly(PAGE_GetName(PAGEID_RTC), okcancel_cb); u32 time = RTC_GetValue(); u32 timevalue = RTC_GetTimeValue(time); Rtc.value[2] = (u16)(timevalue / 3600); Rtc.value[1] = (u16)(timevalue % 3600) / 60; Rtc.value[0] = (u16)(timevalue % 60); RTC_GetDateStringLong(rp->tmpstr,time); int idx = (rp->tmpstr[1] == '.' ? 1 : 2); rp->tmpstr[idx] = 0; rp->tmpstr[idx+3] = 0; Rtc.value[3] = atoi(rp->tmpstr); Rtc.value[4] = atoi(rp->tmpstr + idx + 1); Rtc.value[5] = atoi(rp->tmpstr + idx + 4); _show_page(); }
void PAGE_ModelInit(int page) { (void)page; u8 row; mp->last_mixermode = Model.mixer_mode; mp->last_txpower = Model.tx_power; mp->file_state = 0; PAGE_SetModal(0); #if HAS_STANDARD_GUI if (Model.mixer_mode == MIXER_STANDARD) PAGE_ShowHeader_ExitOnly(PAGE_GetName(PAGEID_MODEL), MODELMENU_Show); else #endif PAGE_ShowHeader(PAGE_GetName(PAGEID_MODEL)); enum { COL1 = (8 + ((LCD_WIDTH - 320) / 2)), COL2 = (COL1 + 128), COL3 = (COL1 + 228), ROW1 = (40 + ((LCD_HEIGHT - 240) / 2)), }; row = ROW1; GUI_CreateLabel(&gui->filelbl, COL1, row, NULL, DEFAULT_FONT, _tr("File")); GUI_CreateTextSelect(&gui->file, COL2, row, TEXTSELECT_96, file_press_cb, file_val_cb, NULL); #if HAS_STANDARD_GUI row+= 20; GUI_CreateLabel(&gui->guilbl, COL1, row, NULL, DEFAULT_FONT, _tr("Mixer GUI")); GUI_CreateTextSelect(&gui->guits, COL2, row, TEXTSELECT_96, NULL, _mixermode_cb, NULL); #endif row += 20; GUI_CreateLabel(&gui->namelbl, COL1, row, NULL, DEFAULT_FONT, _tr("Model name")); // use the same naming convention for devo8 and devo10 GUI_CreateButton(&gui->name, COL2, row, BUTTON_96x16, show_text_cb, 0x0000, _changename_cb, Model.name); GUI_CreateButton(&gui->icon, COL3, row, BUTTON_64x16, show_text_cb, 0x0000, changeicon_cb, _tr("Icon")); row += 20; GUI_CreateLabel(&gui->typelbl, COL1, row, NULL, DEFAULT_FONT, _tr("Model type")); GUI_CreateTextSelect(&gui->type, COL2, row, TEXTSELECT_96, type_press_cb, type_val_cb, NULL); row += 24; GUI_CreateLabel(&gui->ppmlbl, COL1, row, NULL, DEFAULT_FONT, _tr("PPM In")); GUI_CreateTextSelect(&gui->ppm, COL2, row, TEXTSELECT_96, ppmin_press_cb, ppmin_select_cb, NULL); row += 20; GUI_CreateLabel(&gui->protolbl, COL1, row, NULL, DEFAULT_FONT, _tr("Protocol")); GUI_CreateTextSelect(&gui->proto, COL2, row, TEXTSELECT_96, proto_press_cb, protoselect_cb, NULL); row += 20; GUI_CreateLabel(&gui->numchlbl, COL1, row, NULL, DEFAULT_FONT, _tr("# Channels")); GUI_CreateTextSelect(&gui->numch, COL2, row, TEXTSELECT_96, NULL, numchanselect_cb, NULL); row += 24; GUI_CreateLabel(&gui->pwrlbl, COL1, row, NULL, DEFAULT_FONT, _tr("Tx power")); GUI_CreateTextSelect(&gui->pwr, COL2, row, TEXTSELECT_96, NULL, powerselect_cb, NULL); row += 20; if(Model.fixed_id == 0) strncpy(mp->fixed_id, _tr("None"), sizeof(mp->fixed_id)); else sprintf(mp->fixed_id, "%d", (int)Model.fixed_id); GUI_CreateLabel(&gui->fixedidlbl, COL1, row, NULL, DEFAULT_FONT, _tr("Fixed ID")); GUI_CreateButton(&gui->fixedid, COL2, row, BUTTON_96x16, show_text_cb, 0x0000, fixedid_cb, mp->fixed_id); GUI_CreateButton(&gui->bind, COL3, row, BUTTON_64x16, show_bindtext_cb, 0x0000, bind_cb, NULL); configure_bind_button(); }