void PAGE_ChantestEvent() { if(cp->type == MONITOR_BUTTONTEST) { _handle_button_test(); return; } volatile s32 *raw = MIXER_GetInputs(); for(int i = 0; i < cp->num_bars; i++) { int ch = get_channel_idx(cur_row * NUM_BARS_PER_ROW + i); int v = RANGE_TO_PCT((ch >= NUM_INPUTS && ch < NUM_INPUTS + NUM_OUT_CHANNELS) ? Channels[ch - NUM_INPUTS] : raw[ch + 1]); if (v != cp->pctvalue[i]) { guiObject_t *obj = _get_obj(i, ITEM_VALUE); if (obj) { GUI_Redraw(obj); GUI_Redraw(_get_obj(i, ITEM_GRAPH)); } cp->pctvalue[i] = v; } } }
static void draw_chan(int disp, int row, int y) { int x = disp%2 ? LABEL_COL2_X : LABEL_COL1_X; int idx = row * NUM_BARS_PER_ROW + (disp%2 ? 1 : 0); int height; struct LabelDesc labelValue = TINY_FONT; labelValue.align = ALIGN_RIGHT; struct LabelDesc labelSource = DEFAULT_FONT; if (cp->type == MONITOR_RAWINPUT) { labelSource.font = RAW_FONT; // Could be translated to other languages, hence using 12normal height = LINE_HEIGHT; } else { labelSource.font = CHAN_FONT; // only digits, can use smaller font to show more channels height = LABEL_CHAN_H; } GUI_CreateLabelBox(&gui->chan[idx], x, y, LABEL_IDX_W, height, &labelSource, channum_cb, NULL, (void *)(long)get_channel_idx(disp)); GUI_CreateLabelBox(&gui->value[idx], x + CHAN_X_OFFSET, y, LABEL_CHAN_W, height, &labelValue, value_cb, NULL, (void *)(long)disp); if (BAR_H) { GUI_CreateBarGraph(&gui->bar[idx], x - 1, y + height, BAR_W, BAR_H, -125, 125, TRIM_HORIZONTAL, showchan_cb, (void *)(long)disp); } }
static void show_button_page() { // show elements where they are located on the real tx enum { OFFSET_X = ((LCD_WIDTH - 320) / 2), // center on Devo12-screen OFFSET_Y = ((LCD_HEIGHT - 240) / 2), }; enum {X = 0, Y = 1}; struct LabelDesc alignRight = { .font = DEFAULT_FONT.font, .align = ALIGN_RIGHT, .font_color = DEFAULT_FONT.font_color, .fill_color = DEFAULT_FONT.fill_color, .outline_color = DEFAULT_FONT.outline_color }; const int label_pos[NUM_TX_BUTTONS][2] = CHANTEST_BUTTON_PLACEMENT; cp->is_locked = 3; GUI_CreateLabelBox(&gui->lock, OFFSET_X, 34, 320, 20, &NARROW_FONT, lockstr_cb, NULL, NULL); for (int i = 0; i < NUM_TX_BUTTONS; i++) { if ((1 << (i + 1)) & Transmitter.ignore_buttons) continue; GUI_CreateLabelBox(&gui->value[i], OFFSET_X + (label_pos[i][X] > 0 ? label_pos[i][X] + 50 : -label_pos[i][X] -20), // >0? box at left side of label, otherwise right OFFSET_Y + label_pos[i][Y], 16, 16, &SMALLBOX_FONT, NULL, NULL, (void *)""); GUI_CreateLabelBox(&gui->chan[i], OFFSET_X + abs(label_pos[i][X]), // no differencing for the label OFFSET_Y + label_pos[i][Y], 48, 16, label_pos[i][X] > 0 ? &alignRight : &DEFAULT_FONT, button_str_cb, NULL, (void *)(long)i); } } void _handle_button_test() { if (cp->is_locked == 0 && SPITouch_IRQ()) { BUTTON_RegisterCallback(&cp->action, 0xFFFFFFFF, BUTTON_PRESS | BUTTON_RELEASE | BUTTON_LONGPRESS | BUTTON_PRIORITY, button_capture_cb, NULL); GUI_Redraw(&gui->lock); //Textbox cp->is_locked++; } else if (cp->is_locked == 1 && ! SPITouch_IRQ()) { cp->is_locked++; } else if (cp->is_locked == 2 && SPITouch_IRQ()) { BUTTON_UnregisterCallback(&cp->action); GUI_Redraw(&gui->lock); //Textbox cp->is_locked++; } else if (cp->is_locked == 3 && ! SPITouch_IRQ()) { cp->is_locked = 0; } u32 buttons = ScanButtons(); for (int i = 0; i < NUM_TX_BUTTONS; i++) { GUI_SetLabelDesc(&gui->value[i], CHAN_ButtonIsPressed(buttons, i+1) ? &SMALLBOXNEG_FONT : &SMALLBOX_FONT); } return; } static inline guiObject_t *_get_obj(int chan, int objid) { return objid == ITEM_GRAPH ? (guiObject_t *)&gui->bar[chan] : (guiObject_t *)&gui->value[chan]; } static const char *channum_cb(guiObject_t *obj, const void *data) { (void)obj; int disp = (long)data; int ch = get_channel_idx(cur_row * NUM_BARS_PER_ROW + disp); if (cp->type) { char *p = tempstring; if (disp & 0x01) { *p = '\n'; p++; } CONFIG_EnableLanguage(0); //Disable translation because tiny font is limited in character set INPUT_SourceName(p, ch+1); CONFIG_EnableLanguage(1); if (! (disp & 0x01)) { sprintf(p + strlen(p), "\n"); } } else { ch -= NUM_INPUTS; if (ch < NUM_OUT_CHANNELS) { sprintf(tempstring, "\n%d", ch+1); } else { ch -= NUM_OUT_CHANNELS; if (Model.virtname[ch][0]) { tempstring_cpy(Model.virtname[ch]) ; } else { sprintf(tempstring, "%s%d", _tr("Virt"), ch+1); } } } return tempstring; }