void PAGE_TrainConfigInit(int page) { (void)page; int mode = PPMin_Mode(); show_titlerow(mode == PPM_IN_TRAIN1 ? _tr("Trainer Cfg (Channel)") : mode == PPM_IN_TRAIN2 ? _tr("Trainer Cfg (Stick)") : _tr("PPMIn Cfg (Extend)")); GUI_CreateScrollable(&gui->scrollable, 0, HEADER_HEIGHT, LCD_WIDTH, LCD_HEIGHT - HEADER_HEIGHT, LINE_SPACE, PPMin_Mode() == PPM_IN_SOURCE ? 3 : 3 + MAX_PPM_IN_CHANNELS, row3_cb, NULL, NULL, NULL); GUI_SetSelected(GUI_ShowScrollableRowOffset(&gui->scrollable, 0)); }
// Initialize UART for extended-audio void AUDIO_Init() { if (Transmitter.audio_player == AUDIO_DISABLED) { // Reload hardware.ini if audio_player had been temporarily disabled CONFIG_LoadHardware(); } printf("Voice: Initializing UART for extended-audio\n"); #if HAS_AUDIO_UART5 if (Transmitter.audio_uart5) { printf("Voice: UART5 already initialized\n"); return; } #endif #ifndef _DEVO12_TARGET_H_ if ( PPMin_Mode() || Model.protocol == PROTOCOL_PPM ) { printf("Voice: Cannot initialize UART for extended-audio, PPM in use\n"); UART_SetDataRate(0); } else { #endif // _DEVO12_TARGET_H_ printf("Voice: Setting up UART for extended-audio\n"); UART_SetDataRate(9600); #ifndef _DEVO12_TARGET_H_ } #endif // _DEVO12_TARGET_H_ AUDIO_SetVolume(); }
static int get_channel_idx(int chan) { int i; if (cp->type == MONITOR_MIXEROUTPUT) { for (i = 0; i < NUM_CHANNELS; i++) { if (Model.templates[i] != MIXERTEMPLATE_NONE) { if (--chan < 0) break; } } return i + NUM_INPUTS; } else { if (cp->type == MONITOR_RAWINPUT) { int ppms = (PPMin_Mode() == PPM_IN_SOURCE) ? Model.num_ppmin_channels: 0; if (chan < ppms) return NUM_INPUTS + NUM_OUT_CHANNELS + NUM_VIRT_CHANNELS + chan; chan -= ppms; } for (i = 0; i < NUM_INPUTS; i++) { if (!(Transmitter.ignore_src & (1 << (i+1)))) { if (--chan < 0) break; } } return i; } }
void PAGE_TrainConfigInit(int page) { (void)page; int mode = PPMin_Mode(); PAGE_ShowHeader(mode == PPM_IN_TRAIN1 ? _tr_noop("Trainer Cfg (Channel)") : mode == PPM_IN_TRAIN2 ? _tr_noop("Trainer Cfg (Stick)") : _tr_noop("PPMIn Cfg (Extend)")); int row = ROW1; if (PPMin_Mode() != PPM_IN_SOURCE) { GUI_CreateLabelBox(&gui->trainswlbl, COL1, row, LABEL_WIDTH, 0, &LABEL_FONT, GUI_Localize, NULL, _tr_noop("Trainer Sw")); GUI_CreateTextSource(&gui->trainsw, COL2, row, TEXTSELECT_96, sourceselect_cb, set_source_cb, set_input_source_cb, &Model.train_sw); } else { GUI_CreateLabelBox(&gui->numchlbl, COL1, row, LABEL_WIDTH, 0, &LABEL_FONT, GUI_Localize, NULL, _tr_noop("Num Channels")); GUI_CreateTextSelect(&gui->numch, COL2, row, TEXTSELECT_96, NULL, set_train_cb, (void *)0L); } row += 20; GUI_CreateLabelBox(&gui->centerpwlbl, COL1, row, LABEL_WIDTH, 0, &LABEL_FONT, GUI_Localize, NULL, _tr_noop("Center PW")); GUI_CreateTextSelect(&gui->centerpw, COL2, row, TEXTSELECT_96, NULL, set_train_cb, (void *)1L); row += 20; GUI_CreateLabelBox(&gui->deltapwlbl, COL1, row, LABEL_WIDTH, 0, &LABEL_FONT, GUI_Localize, NULL, _tr_noop("Delta PW")); GUI_CreateTextSelect(&gui->deltapw, COL2, row, TEXTSELECT_96, NULL, set_train_cb, (void *)2L); row += 20; if (PPMin_Mode() == PPM_IN_SOURCE) return; int num_rows= (MAX_PPM_IN_CHANNELS + 1) / 2; for (int i = 0; i < num_rows; i++) { long idx = i; row += 20; if (row > 300) // RBE: should be LCD_HEIGHT - 16(height box) ==> always < 300 break; GUI_CreateLabelBox(&gui->ppmmaplbl[idx], COL1, row, COL3 - COL1, 16, &LABEL_FONT, input_chname_cb, NULL, (void *)idx); GUI_CreateTextSelect(&gui->ppmmap[idx], COL3, row, TEXTSELECT_96, NULL, set_chmap_cb, (void *)idx); idx += num_rows; if (idx >= MAX_PPM_IN_CHANNELS) break; GUI_CreateLabelBox(&gui->ppmmaplbl[idx], COL4, row, COL5 - COL4, 16, &LABEL_FONT, input_chname_cb, NULL, (void *)idx); GUI_CreateTextSelect(&gui->ppmmap[idx], COL5, row, TEXTSELECT_96, NULL, set_chmap_cb, (void *)idx); } }
void MODELTRAIN_Config() { PAGE_SetModal(1); int mode = PPMin_Mode(); show_titlerow(mode == PPM_IN_TRAIN1 ? _tr("Trainer Cfg (Channel)") : mode == PPM_IN_TRAIN2 ? _tr("Trainer Cfg (Stick)") : _tr("PPMIn Cfg (Extend)")); int row = ROW1; if (PPMin_Mode() != PPM_IN_SOURCE) { GUI_CreateLabel(&gui->trainswlbl, COL1, row, NULL, DEFAULT_FONT, _tr("Trainer Sw")); GUI_CreateTextSource(&gui->trainsw, COL2, row, TEXTSELECT_96, sourceselect_cb, set_source_cb, set_input_source_cb, &Model.train_sw); } else { GUI_CreateLabel(&gui->numchlbl, COL1, row, NULL, DEFAULT_FONT, _tr("Num Channels")); GUI_CreateTextSelect(&gui->numch, COL2, row, TEXTSELECT_96, NULL, set_train_cb, (void *)0L); } row += 20; GUI_CreateLabel(&gui->centerpwlbl, COL1, row, NULL, DEFAULT_FONT, _tr("Center PW")); GUI_CreateTextSelect(&gui->centerpw, COL2, row, TEXTSELECT_96, NULL, set_train_cb, (void *)1L); row += 20; GUI_CreateLabel(&gui->deltapwlbl, COL1, row, NULL, DEFAULT_FONT, _tr("Delta PW")); GUI_CreateTextSelect(&gui->deltapw, COL2, row, TEXTSELECT_96, NULL, set_train_cb, (void *)2L); row += 20; if (PPMin_Mode() == PPM_IN_SOURCE) return; int num_rows= (MAX_PPM_IN_CHANNELS + 1) / 2; for (int i = 0; i < num_rows; i++) { long idx = i; row += 20; if (row > 300) // RBE: should be LCD_HEIGHT - 16(height box) ==> always < 300 break; GUI_CreateLabelBox(&gui->ppmmaplbl[idx], COL1, row, 0, 16, &DEFAULT_FONT, input_chname_cb, NULL, (void *)idx); GUI_CreateTextSelect(&gui->ppmmap[idx], COL3, row, TEXTSELECT_96, NULL, set_chmap_cb, (void *)idx); idx += num_rows; if (idx >= MAX_PPM_IN_CHANNELS) break; GUI_CreateLabelBox(&gui->ppmmaplbl[idx], COL4, row, 0, 16, &DEFAULT_FONT, input_chname_cb, NULL, (void *)idx); GUI_CreateTextSelect(&gui->ppmmap[idx], COL5, row, TEXTSELECT_96, NULL, set_chmap_cb, (void *)idx); } }
static const char *ppmin_select_cb(guiObject_t *obj, int dir, void *data) { (void)data; (void)obj; u8 changed; u8 new_ppm = PPMin_Mode(); new_ppm = GUI_TextSelectHelper(new_ppm, 0, 3, dir, 1, 1, &changed); if (obj) { if (changed) { if (! PPMin_Mode() && new_ppm) { //Start PPM-In PPMin_Start(); } else if(! new_ppm) { //Stop PPM-In PPMin_Stop(); } switch (new_ppm) { case PPM_IN_TRAIN1: memset(Model.ppm_map, -1, sizeof(Model.ppm_map)); for(int i = 0; i < Model.num_channels; i++) Model.ppm_map[i] = i; break; case PPM_IN_TRAIN2: memset(Model.ppm_map, -1, sizeof(Model.ppm_map)); for(int i = 0; i < 4; i++) Model.ppm_map[i] = i+1; break; } } GUI_TextSelectEnablePress((guiTextSelect_t *)obj, new_ppm); Model.num_ppmin = (Model.num_ppmin & 0x3f) | (new_ppm << 6); } if (new_ppm == 0) { return _tr("None"); } else if (new_ppm == 1) { return _tr("Channel"); } else if (new_ppm == 2) { return _tr("Stick"); } else { return _tr("Extend"); } }
s32 MIXER_GetChannel(unsigned channel, enum LimitMask flags) { if (PPMin_Mode() == PPM_IN_TRAIN1 && Model.train_sw && raw[Model.train_sw] > 0) { int ppm_channel_map = map_ppm_channels(channel); if (ppm_channel_map >= 0) { if (ppmSync) { return ppmChannels[ppm_channel_map]; } return Channels[channel]; // last value obtained from synchronized ppm set by CalcChannels } } return MIXER_ApplyLimits(channel, &Model.limits[channel], raw, Channels, flags); }
static void MIXER_UpdateRawInputs() { int i; //1st step: read input data (sticks, switches, etc) and calibrate for (i = 1; i <= NUM_TX_INPUTS; i++) { unsigned mapped_channel = MIXER_MapChannel(i); if (PPMin_Mode() == PPM_IN_TRAIN2 && Model.train_sw && raw[Model.train_sw] > 0) { int ppm_channel_map = map_ppm_channels(i); if (ppm_channel_map >= 0) { if (ppmSync) { raw[i] = ppmChannels[ppm_channel_map]; } continue; } } raw[i] = CHAN_ReadInput(mapped_channel); } if (PPMin_Mode() == PPM_IN_SOURCE && ppmSync) { for (i = 0; i < (Model.num_ppmin & 0x3f); i++) { raw[1 + NUM_INPUTS + NUM_OUT_CHANNELS + NUM_VIRT_CHANNELS + i] = ppmChannels[i]; } } }
static void initialize() { CLOCK_StopTimer(); if (PPMin_Mode()) return; PWM_Initialize(); num_channels = Model.num_channels; if (Model.proto_opts[CENTER_PW] == 0) { Model.proto_opts[CENTER_PW] = 1100; Model.proto_opts[DELTA_PW] = 400; Model.proto_opts[NOTCH_PW] = 400; Model.proto_opts[PERIOD_PW] = 22500; } CLOCK_StartTimer(1000, ppmout_cb); }
static int row3_cb(int absrow, int relrow, int y, void *data) { (void)data; void *ts; void *input_ts = NULL; void *ts_press = NULL; void *ts_data = NULL; char *label = NULL; void *label_cmd = NULL; switch (absrow) { case 0: label = _tr_noop("Center PW"); ts = set_train_cb; ts_data = (void *)1L; break; case 1: label = _tr_noop("Delta PW"); ts = set_train_cb; ts_data = (void *)2L; break; case 2: if (PPMin_Mode() != PPM_IN_SOURCE) { label = _tr_noop("Trainer Sw"); ts = set_source_cb; ts_press = sourceselect_cb; ts_data = (void *)&Model.train_sw; input_ts = set_input_source_cb; } else { label = _tr_noop("Num Channels"); ts = set_train_cb; ts_data = (void *)0L; } break; default: label_cmd = input_chname_cb; label = (void *)((long)absrow - 3); ts = set_chmap_cb; ts_data = label; break; } GUI_CreateLabelBox(&gui->label[relrow], LABEL_X, y, LABEL_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, label_cmd, NULL, label_cmd ? label : _tr(label)); GUI_CreateTextSourcePlate(&gui->value[relrow], SELECT_X, y, SELECT_WIDTH, LINE_HEIGHT, &DEFAULT_FONT, ts_press, ts, input_ts, ts_data); return 1; }
static int num_disp_bars() { int j = 0; if (cp->type == MONITOR_MIXEROUTPUT) { //printf("MONITOR_MIXEROUTPUT "); for (int i = 0; i < NUM_CHANNELS; i++) { if (Model.templates[i] != MIXERTEMPLATE_NONE) { j++; } } } else { //printf(cp->type == MONITOR_RAWINPUT ? "MONITOR_RAWINPUT " : "MONITOR_BUTTONTEST "); for (int i = 0; i < NUM_INPUTS; i++) { if (!(Transmitter.ignore_src & (1 << (i+1)))) { j++; } } if (cp->type == MONITOR_RAWINPUT && PPMin_Mode() == PPM_IN_SOURCE) { j += Model.num_ppmin_channels; } } //printf("%d\n", j); return j; }