void menu_rc_setup(uint8_t section) { int8_t *value_ptr; menu_range_t range; uint8_t text_link; uint8_t i = 0; uint8_t mult = 1; // Multiplier uint8_t offset; // Index into channel structure uint8_t items; // Items in group // If submenu item has changed, reset submenu positions if (menu_flag) { sub_top = RCSTART; menu_flag = 0; } while(button != BACK) { // Get menu offsets and load values from eeprom // 1 = RC, 2 = Failsafe, 3 = General switch(section) { case 1: // RC setup menu offset = 0; items = RCITEMS; value_ptr = &Config.RxModeIn; mult = 1; break; case 2: // Failsafe menu offset = RCITEMS; items = FSITEMS; value_ptr = &Config.FailsafeType; mult = 1; break; case 3: // General menu offset = RCITEMS + FSITEMS; items = GENERALITEMS; value_ptr = &Config.MixMode; mult = 1; break; default: offset = 0; items = RCITEMS; value_ptr = &Config.RxModeIn; mult = 1; break; } // Save pre-edited values int8_t temp_type = Config.MixMode; int8_t temp_flapchan = Config.FlapChan; int8_t temp_RxModeIn = Config.RxModeIn; // Print menu print_menu_items(sub_top + offset, RCSTART + offset, value_ptr, mult, (const unsigned char*)rc_menu_ranges[section - 1], 0, RCOFFSET, (const unsigned char*)RCMenuText[section - 1], cursor); // Handle menu changes update_menu(items, RCSTART, offset, button, &cursor, &sub_top, &menu_temp); range = get_menu_range ((const unsigned char*)rc_menu_ranges[section - 1], (menu_temp - RCSTART - offset)); if (button == ENTER) { text_link = pgm_read_byte(&RCMenuText[section - 1][menu_temp - RCSTART - offset]); do_menu_item(menu_temp, value_ptr + (menu_temp - RCSTART - offset), mult, range, 0, text_link, false, 0); } if (button == ENTER) { // Update Ch5. mixer with source from Config.FlapChan if in Aeroplane mode and source changed if ((Config.MixMode == AEROPLANE) && (Config.FlapChan != temp_flapchan)) { Config.Channel[CH5].source_a = Config.FlapChan; } // Reset serial in channel masks every time the input type is changed if (temp_RxModeIn != Config.RxModeIn) { Xtreme_Chanmask = 0; Xtreme_RSS = 0; Spektrum_Chanmask_0 = 0; Spektrum_Chanmask_1 = 0; Spektrum_frameloss = 0; SBUS_Flags = 0; // Clear channel data for (i = 0; i < MAX_RC_CHANNELS; i++) { RxChannel[i] = 0; // Unused Spektrum channels set to NULL if (Config.RxModeOut == SPEKTRUM) { ExtChannel[i] = 0xFFFF; } // Unused channels set to mid-way else if (Config.RxModeOut == SBUS) { ExtChannel[i] = 0x400; } // Xtreme doesn't care else { ExtChannel[i] = 0; } } } // If model type has changed, reload preset if ((section == 3) && (temp_type != Config.MixMode)) { switch(Config.MixMode) // Load selected mix { case AEROPLANE: get_preset_mix(AEROPLANE_MIX); break; case FWING: get_preset_mix(FLYING_WING_MIX); break; case MANUAL: // Clear all channel info memset(&Config.Channel[0].value,0,(sizeof(channel_t) * MAX_OUTPUTS)); // Preset important settings for (i = 0; i < MAX_OUTPUTS; i++) { Config.Channel[i].source_a = i; // Set to mirror the inputs Config.Channel[i].source_a_volume = 100; Config.Channel[i].source_b = NOCHAN; Config.Channel[i].output_b = UNUSED; Config.Channel[i].output_c = UNUSED; } break; default: break; } } init_int(); // In case RC type has changed, reinitialise interrupts init_uart(); // and UART UpdateLimits(); // Update I-term limits and triggers based on percentages #ifdef KK21 // Update MPU6050 LPF writeI2Cbyte(MPU60X0_DEFAULT_ADDRESS, MPU60X0_RA_CONFIG, (6 - Config.MPU6050_LPF)); #endif // Update channel sequence for (i = 0; i < MAX_RC_CHANNELS; i++) { if (Config.TxSeq == FUTABASEQ) { Config.ChannelOrder[i] = pgm_read_byte(&FUTABA[i]); } else { Config.ChannelOrder[i] = pgm_read_byte(&JR[i]); } } Save_Config_to_EEPROM(); // Save value and return Wait_BUTTON4(); // Wait for user's finger off the button } } }
void menu_rc_setup(uint8_t section) { static uint8_t rc_top = RCSTART; int8_t *value_ptr; menu_range_t range; uint8_t text_link; uint8_t i = 0; uint8_t mult = 1; // Multiplier uint8_t offset; // Index into channel structure uint8_t items; // Items in group uint16_t temp16_1; // If submenu item has changed, reset submenu positions if (menu_flag) { rc_top = RCSTART; menu_flag = 0; } while(button != BACK) { // Get menu offsets and load values from eeprom // 1 = RC, 2 = Failsafe, 3 = General, 4 = Battery switch(section) { case 1: // RC setup menu offset = 0; items = RCITEMS; value_ptr = &Config.RxMode; mult = 1; break; case 2: // Failsafe menu offset = RCITEMS; items = FSITEMS; value_ptr = &Config.FailsafeType; mult = 1; break; case 3: // General menu offset = RCITEMS + FSITEMS; items = GENERALITEMS; value_ptr = &Config.MixMode; mult = 1; break; case 4: // Battery menu offset = RCITEMS + FSITEMS + GENERALITEMS; items = BATTITEMS; value_ptr = &Config.BatteryType; mult = 4; break; default: offset = 0; items = RCITEMS; value_ptr = &Config.RxMode; mult = 1; break; } // Save pre-edited values int8_t temp_type = Config.MixMode; int8_t temp_cells = Config.BatteryCells; int8_t temp_minvoltage = Config.MinVoltage; int8_t temp_flapchan = Config.FlapChan; // Print menu print_menu_items(rc_top + offset, RCSTART + offset, value_ptr, mult, (prog_uchar*)rc_menu_ranges[section - 1], 0, RCOFFSET, (prog_uchar*)RCMenuText[section - 1], cursor); // Handle menu changes update_menu(items, RCSTART, offset, button, &cursor, &rc_top, &menu_temp); range = get_menu_range ((prog_uchar*)rc_menu_ranges[section - 1], (menu_temp - RCSTART - offset)); if (button == ENTER) { text_link = pgm_read_byte(&RCMenuText[section - 1][menu_temp - RCSTART - offset]); do_menu_item(menu_temp, value_ptr + (menu_temp - RCSTART - offset), mult, range, 0, text_link, false, 0); } if (button == ENTER) { // Update Ch7. mixer with source from Config.FlapChan if in Aeroplane mode and source changed if ((Config.MixMode == AEROPLANE) && (Config.FlapChan != temp_flapchan)) { Config.Channel[CH7].source_a = Config.FlapChan; } // See if cell number or min_volts has changed if ((temp_cells != Config.BatteryCells) || (temp_minvoltage != Config.MinVoltage)) { // Recalculate if more cells temp16_1 = Config.MinVoltage; temp16_1 = temp16_1 * Config.BatteryCells; temp16_1 = temp16_1 / 10; Config.PowerTrigger = (int8_t)temp16_1; } // If model type has changed, reload preset if ((section == 3) && (temp_type != Config.MixMode)) { switch(Config.MixMode) // Load selected mix { case AEROPLANE: get_preset_mix(AEROPLANE_MIX); break; case FWING: get_preset_mix(FLYING_WING_MIX); break; case CAMSTAB: get_preset_mix(CAM_STAB); break; case MANUAL: // Clear all channel info memset(&Config.Channel[0].value,0,(sizeof(channel_t) * PSUEDO_OUTPUTS)); // Preset important settings for (i = 0; i < PSUEDO_OUTPUTS; i++) { Config.Channel[i].source_a = NOCHAN; Config.Channel[i].source_b = NOCHAN; Config.Channel[i].output_b = UNUSED; Config.Channel[i].output_c = UNUSED; Config.Channel[i].output_d = UNUSED; } break; default: break; } } init_int(); // In case RC type has changed, reinitialise interrupts init_uart(); // and UART UpdateIMUvalues(); // Update IMU variables UpdateLimits(); // Update I-term limits and triggers based on percentages #ifdef KK21 // Update MPU6050 LPF writeI2Cbyte(MPU60X0_DEFAULT_ADDRESS, MPU60X0_RA_CONFIG, Config.MPU6050_LPF); #endif // Update channel sequence for (i = 0; i < MAX_RC_CHANNELS; i++) { if (Config.TxSeq == FUTABASEQ) { Config.ChannelOrder[i] = (uint8_t)pgm_read_byte(&FUTABA[i]); } else { Config.ChannelOrder[i] = (uint8_t)pgm_read_byte(&JR[i]); } } Save_Config_to_EEPROM(); // Save value and return } } }