void update_blackhawk_eo (eo_params *eo) { float fine_slew_rate, medium_slew_rate, mouse_slew_rate, // Jabberwock 030930 coarse_slew_rate; ASSERT (eo); //////////////////////////////////////// // // field of view // //////////////////////////////////////// while (single_target_acquisition_system_inc_range_key) { dec_eo_field_of_view (eo); single_target_acquisition_system_inc_range_key--; } while (single_target_acquisition_system_inc_range_fast_key) { fast_dec_eo_field_of_view (eo); single_target_acquisition_system_inc_range_fast_key--; } //////////////////////////////////////// while (single_target_acquisition_system_dec_range_key) { inc_eo_field_of_view (eo); single_target_acquisition_system_dec_range_key--; } while (single_target_acquisition_system_dec_range_fast_key) { fast_inc_eo_field_of_view (eo); single_target_acquisition_system_dec_range_fast_key--; } //////////////////////////////////////// // // slew optics // //////////////////////////////////////// switch (eo->field_of_view) { //////////////////////////////////////// case EO_FOV_NARROW: //////////////////////////////////////// { fine_slew_rate = rad (0.05) * get_delta_time (); medium_slew_rate = rad (0.25) * get_delta_time (); mouse_slew_rate = rad (0.6) * get_delta_time (); // Jabberwock 030930 coarse_slew_rate = rad (1.0) * get_delta_time (); break; } //////////////////////////////////////// case EO_FOV_MEDIUM: //////////////////////////////////////// { fine_slew_rate = rad (0.5) * get_delta_time (); medium_slew_rate = rad (2.5) * get_delta_time (); mouse_slew_rate = rad (6) * get_delta_time (); // Jabberwock 030930 coarse_slew_rate = rad (10.0) * get_delta_time (); break; } //////////////////////////////////////// case EO_FOV_WIDE: //////////////////////////////////////// { fine_slew_rate = rad (4.0) * get_delta_time (); medium_slew_rate = rad (20.0) * get_delta_time (); mouse_slew_rate = rad (48) * get_delta_time (); // Jabberwock 030930 coarse_slew_rate = rad (80.0) * get_delta_time (); break; } //////////////////////////////////////// default: //////////////////////////////////////// { debug_fatal ("Invalid field of view = %d", eo->field_of_view); break; } } //////////////////////////////////////// if (continuous_target_acquisition_system_steer_left_fast_key) { eo_azimuth -= coarse_slew_rate; eo_azimuth = max (eo_azimuth, eo_min_azimuth); } else if (continuous_target_acquisition_system_steer_left_fine_key) { eo_azimuth -= fine_slew_rate; eo_azimuth = max (eo_azimuth, eo_min_azimuth); } else if (continuous_target_acquisition_system_steer_left_key) { eo_azimuth -= medium_slew_rate; eo_azimuth = max (eo_azimuth, eo_min_azimuth); } //////////////////////////////////////// if (continuous_target_acquisition_system_steer_right_fast_key) { eo_azimuth += coarse_slew_rate; eo_azimuth = min (eo_azimuth, eo_max_azimuth); } else if (continuous_target_acquisition_system_steer_right_fine_key) { eo_azimuth += fine_slew_rate; eo_azimuth = min (eo_azimuth, eo_max_azimuth); } else if (continuous_target_acquisition_system_steer_right_key) { eo_azimuth += medium_slew_rate; eo_azimuth = min (eo_azimuth, eo_max_azimuth); } //////////////////////////////////////// if (continuous_target_acquisition_system_steer_up_fast_key) { eo_elevation += coarse_slew_rate; eo_elevation = min (eo_elevation, eo_max_elevation); } else if (continuous_target_acquisition_system_steer_up_fine_key) { eo_elevation += fine_slew_rate; eo_elevation = min (eo_elevation, eo_max_elevation); } else if (continuous_target_acquisition_system_steer_up_key) { eo_elevation += medium_slew_rate; eo_elevation = min (eo_elevation, eo_max_elevation); } //////////////////////////////////////// if (continuous_target_acquisition_system_steer_down_fast_key) { eo_elevation -= coarse_slew_rate; eo_elevation = max (eo_elevation, eo_min_elevation); } else if (continuous_target_acquisition_system_steer_down_fine_key) { eo_elevation -= fine_slew_rate; eo_elevation = max (eo_elevation, eo_min_elevation); } else if (continuous_target_acquisition_system_steer_down_key) { eo_elevation -= medium_slew_rate; eo_elevation = max (eo_elevation, eo_min_elevation); } //////////////////////////////////////// while (single_target_acquisition_system_select_next_target_key) { select_next_eo_target (); single_target_acquisition_system_select_next_target_key--; } //////////////////////////////////////// while (single_target_acquisition_system_select_previous_target_key) { select_previous_eo_target (); single_target_acquisition_system_select_previous_target_key--; } // Jabberwock 031107 Designated targets while (single_target_acquisition_system_select_next_designated_key) { select_next_designated_eo_target (); single_target_acquisition_system_select_next_designated_key--; } //////////////////////////////////////// while (single_target_acquisition_system_select_previous_designated_key) { select_previous_designated_eo_target (); single_target_acquisition_system_select_previous_designated_key--; } // Jabberwock 031107 ends if ( command_line_eo_pan_joystick_index == -1 ) { float ROTATE_RATE = (float) command_line_mouse_look_speed / 5.0; eo_azimuth = get_eo_azimuth (ROTATE_RATE, coarse_slew_rate, eo_azimuth, eo_min_azimuth, eo_max_azimuth, mouse_slew_rate); eo_elevation = get_eo_elevation (ROTATE_RATE, coarse_slew_rate, eo_elevation, eo_min_elevation, eo_max_elevation, mouse_slew_rate); } eo->field_of_view = get_old_eo_zoom(eo->field_of_view, eo->max_field_of_view, eo->min_field_of_view); //////////////////////////////////////// // Retro 31Oct2004 - copy+paste of loke's comanche EO slew code // loke 030315 // added code to allow the user to slew the eo device using joystick axes if (command_line_eo_pan_joystick_index != -1) { float panning_offset_horiz, panning_offset_vert; int horizontal_value, vertical_value; horizontal_value = get_joystick_axis (command_line_eo_pan_joystick_index, command_line_eo_pan_horizontal_joystick_axis); panning_offset_horiz = make_panning_offset_from_axis (horizontal_value); eo_azimuth += panning_offset_horiz * coarse_slew_rate; if (panning_offset_horiz > 0) { eo_azimuth = min (eo_azimuth, eo_max_azimuth); } else { eo_azimuth = max (eo_azimuth, eo_min_azimuth); } vertical_value = get_joystick_axis (command_line_eo_pan_joystick_index, command_line_eo_pan_vertical_joystick_axis); panning_offset_vert = make_panning_offset_from_axis (vertical_value); eo_elevation -= panning_offset_vert * coarse_slew_rate; if (panning_offset_vert < 0) { eo_elevation = min (eo_elevation, eo_max_elevation); } else { eo_elevation = max (eo_elevation, eo_min_elevation); } } }
void update_collective_pressure_inputs (void) { current_flight_dynamics->input_data.collective.delta = current_flight_dynamics->input_data.collective.value; switch (get_global_collective_input ()) { case KEYBOARD_INPUT: case MOUSE_INPUT: { if (current_flight_dynamics->input_data.collective_input_pressure & COLLECTIVE_PRESSURE_BACKWARD) { current_flight_dynamics->input_data.collective_pressure.value = min (0.0f, current_flight_dynamics->input_data.collective_pressure.value); current_flight_dynamics->input_data.collective_pressure.value -= 5.0 * get_delta_time (); } else if (current_flight_dynamics->input_data.collective_input_pressure & COLLECTIVE_PRESSURE_FORWARD) { current_flight_dynamics->input_data.collective_pressure.value = max (0.0f, current_flight_dynamics->input_data.collective_pressure.value); current_flight_dynamics->input_data.collective_pressure.value += 5.0 * get_delta_time (); } else { current_flight_dynamics->input_data.collective_pressure.value = 0.0; } current_flight_dynamics->input_data.collective_pressure.value = bound (current_flight_dynamics->input_data.collective_pressure.value, current_flight_dynamics->input_data.collective_pressure.min, current_flight_dynamics->input_data.collective_pressure.max); break; } case THROTTLE_INPUT: { int joyval; float input; // 030418 loke // implemented multiple joystick device selection if (command_line_collective_joystick_index == -1) { joyval = get_joystick_axis (current_flight_dynamics->input_data.cyclic_joystick_device_index, JOYSTICK_DEFAULT_AXIS_THROTTLE); } else { joyval = get_joystick_axis (command_line_collective_joystick_index, command_line_collective_joystick_axis); } if (non_linear_collective) { input = 0.5 + ((float) joyval ) / ((float) JOYSTICK_AXIS_MAXIMUM - (float) JOYSTICK_AXIS_MINIMUM); if (input < command_line_collective_zone_1_limit) { // start variable percentage at zone1 by GCsDriver 08-12-2007 input *= command_line_collective_percentage_at_zone1 * zone_1_scale; input -= command_line_collective_percentage_at_zone1; // 0% -> -60 // original //input *= 60.0 * zone_1_scale; //input -= 60.0; // 0% -> -60 } else if (input < command_line_collective_zone_2_limit) { // find amount over limit input -= command_line_collective_zone_1_limit; input *= (100.0-command_line_collective_percentage_at_zone1) * zone_2_scale; // original //input -= command_line_collective_zone_1_limit; //input *= 40.0 * zone_2_scale; } else { // find amount over limit input -= command_line_collective_zone_2_limit; input *= 20.0 * zone_3_scale; input += (100.0-command_line_collective_percentage_at_zone1); // 100% -> +40 // original //input -= command_line_collective_zone_2_limit; //input *= 20.0 * zone_3_scale; //input += 40.0; // 100% -> +40 // end variable percentage at zone1 by GCsDriver 08-12-2007 } } else input = (float) (120.0 * (float) joyval ) / ((float) JOYSTICK_AXIS_MAXIMUM - (float) JOYSTICK_AXIS_MINIMUM); if ((current_flight_dynamics->auto_hover != HOVER_HOLD_STABLE) && (current_flight_dynamics->auto_hover != HOVER_HOLD_ALTITUDE_LOCK)) { if (get_current_dynamics_options (DYNAMICS_OPTIONS_REVERSE_THROTTLE_INPUT)) { current_flight_dynamics->input_data.collective.value = (float) 60.0 - input; } else { current_flight_dynamics->input_data.collective.value = (float) 60.0 + input; } } break; } } // recalculate collective position if (current_flight_dynamics->input_data.collective_pressure.value) { current_flight_dynamics->input_data.collective.value += 10.0 * current_flight_dynamics->input_data.collective_pressure.value * get_delta_time (); } else { // restore } if (current_flight_dynamics->input_data.collective.damaged) { current_flight_dynamics->input_data.collective.value += (get_model_delta_time ()) * (7.5 * sfrand1 () * current_flight_dynamics->input_data.collective.delta); } current_flight_dynamics->input_data.collective.value = bound (current_flight_dynamics->input_data.collective.value, current_flight_dynamics->input_data.collective.min, current_flight_dynamics->input_data.collective.max); current_flight_dynamics->input_data.collective.delta -= current_flight_dynamics->input_data.collective.value; current_flight_dynamics->input_data.collective.delta *= -1.0; }
void update_cyclic_pressure_inputs (void) { float trim_x, trim_y; if (!current_flight_dynamics) { return; } if (hydraulic_pressure_loss_rate && hydraulic_pressure > 0.0) { hydraulic_pressure -= hydraulic_pressure_loss_rate * get_delta_time(); if (hydraulic_pressure < 0.0) hydraulic_pressure = 0.0; } trim_x = current_flight_dynamics->input_data.cyclic_x_trim.value; trim_y = current_flight_dynamics->input_data.cyclic_y_trim.value; if (trim_button_held) { current_flight_dynamics->input_data.cyclic_x.value = current_flight_dynamics->input_data.cyclic_x_trim.value; current_flight_dynamics->input_data.cyclic_y.value = current_flight_dynamics->input_data.cyclic_y_trim.value; } else switch (get_global_cyclic_input ()) { case KEYBOARD_INPUT: case MOUSE_INPUT: { if (current_flight_dynamics->input_data.cyclic_input_pressure & CYCLIC_PRESSURE_LEFT) { current_flight_dynamics->input_data.cyclic_horizontal_pressure.value = min (0.0f, current_flight_dynamics->input_data.cyclic_horizontal_pressure.value); current_flight_dynamics->input_data.cyclic_x.value = min ((current_flight_dynamics->input_data.cyclic_x.value) / 2.0f, current_flight_dynamics->input_data.cyclic_x.value); current_flight_dynamics->input_data.cyclic_horizontal_pressure.value -= MODEL_FRAME_RATE * get_model_delta_time (); if ((current_flight_dynamics->auto_hover == HOVER_HOLD_NORMAL) || (current_flight_dynamics->auto_hover == HOVER_HOLD_STABLE)) { set_current_flight_dynamics_auto_hover (HOVER_HOLD_NONE); set_current_flight_dynamics_auto_pilot (FALSE); } } else if (current_flight_dynamics->input_data.cyclic_input_pressure & CYCLIC_PRESSURE_RIGHT) { current_flight_dynamics->input_data.cyclic_horizontal_pressure.value = max (0.0f, current_flight_dynamics->input_data.cyclic_horizontal_pressure.value); current_flight_dynamics->input_data.cyclic_x.value = max ((current_flight_dynamics->input_data.cyclic_x.value) / 2.0f, current_flight_dynamics->input_data.cyclic_x.value); current_flight_dynamics->input_data.cyclic_horizontal_pressure.value += MODEL_FRAME_RATE * get_model_delta_time (); if ((current_flight_dynamics->auto_hover == HOVER_HOLD_NORMAL) || (current_flight_dynamics->auto_hover == HOVER_HOLD_STABLE)) { set_current_flight_dynamics_auto_hover (HOVER_HOLD_NONE); set_current_flight_dynamics_auto_pilot (FALSE); } } else { if (fabs (current_flight_dynamics->input_data.cyclic_horizontal_pressure.value) < 1.0) { current_flight_dynamics->input_data.cyclic_horizontal_pressure.value = 0.0; } else { current_flight_dynamics->input_data.cyclic_horizontal_pressure.value -= ((MODEL_FRAME_RATE * get_model_delta_time ()) / 2.0) * (current_flight_dynamics->input_data.cyclic_horizontal_pressure.value); } } if (current_flight_dynamics->input_data.cyclic_input_pressure & CYCLIC_PRESSURE_BACKWARD) { current_flight_dynamics->input_data.cyclic_vertical_pressure.value = min (0.0f, current_flight_dynamics->input_data.cyclic_vertical_pressure.value); current_flight_dynamics->input_data.cyclic_y.value = min (current_flight_dynamics->input_data.cyclic_y.value / 2.0f, current_flight_dynamics->input_data.cyclic_y.value); current_flight_dynamics->input_data.cyclic_vertical_pressure.value -= MODEL_FRAME_RATE * get_model_delta_time (); if ((current_flight_dynamics->auto_hover == HOVER_HOLD_NORMAL) || (current_flight_dynamics->auto_hover == HOVER_HOLD_STABLE)) { set_current_flight_dynamics_auto_hover (HOVER_HOLD_NONE); set_current_flight_dynamics_auto_pilot (FALSE); } } else if (current_flight_dynamics->input_data.cyclic_input_pressure & CYCLIC_PRESSURE_FORWARD) { current_flight_dynamics->input_data.cyclic_vertical_pressure.value = max (0.0f, current_flight_dynamics->input_data.cyclic_vertical_pressure.value); current_flight_dynamics->input_data.cyclic_y.value = max (current_flight_dynamics->input_data.cyclic_y.value / 2.0f, current_flight_dynamics->input_data.cyclic_y.value); current_flight_dynamics->input_data.cyclic_vertical_pressure.value += MODEL_FRAME_RATE * get_model_delta_time (); if ((current_flight_dynamics->auto_hover == HOVER_HOLD_NORMAL) || (current_flight_dynamics->auto_hover == HOVER_HOLD_STABLE)) { set_current_flight_dynamics_auto_hover (HOVER_HOLD_NONE); set_current_flight_dynamics_auto_pilot (FALSE); } } else { if (fabs (current_flight_dynamics->input_data.cyclic_vertical_pressure.value) < 1.0) { current_flight_dynamics->input_data.cyclic_vertical_pressure.value = 0.0; } else { current_flight_dynamics->input_data.cyclic_vertical_pressure.value -= ((MODEL_FRAME_RATE * get_model_delta_time ()) / 2.0) * (current_flight_dynamics->input_data.cyclic_vertical_pressure.value); } } // limit pressure inputs current_flight_dynamics->input_data.cyclic_horizontal_pressure.value = bound ( current_flight_dynamics->input_data.cyclic_horizontal_pressure.value, current_flight_dynamics->input_data.cyclic_horizontal_pressure.min, current_flight_dynamics->input_data.cyclic_horizontal_pressure.max ); current_flight_dynamics->input_data.cyclic_vertical_pressure.value = bound (current_flight_dynamics->input_data.cyclic_vertical_pressure.value, current_flight_dynamics->input_data.cyclic_vertical_pressure.min, current_flight_dynamics->input_data.cyclic_vertical_pressure.max ); // recalculate cyclic position if (current_flight_dynamics->input_data.cyclic_horizontal_pressure.value) { current_flight_dynamics->input_data.cyclic_x.value += (MODEL_FRAME_RATE * get_model_delta_time ()) * current_flight_dynamics->input_data.cyclic_horizontal_pressure.value; //current_flight_dynamics->input_data.cyclic_x.value += (MODEL_FRAME_RATE * get_model_delta_time ()) * (current_flight_dynamics->input_data.cyclic_horizontal_pressure.value);// + current_flight_dynamics->input_data.cyclic_x_trim.value); } else { // restore x //Werewolf: Removed old debug code, removed redundant multiplications if (get_global_cyclic_input () == KEYBOARD_INPUT) { if (get_current_dynamics_options (DYNAMICS_OPTIONS_KEYBOARD_ASSISTANCE)) { current_flight_dynamics->input_data.cyclic_x.value += ((1.0 / 16.0) * MODEL_FRAME_RATE * get_model_delta_time ()) * (current_flight_dynamics->input_data.cyclic_x_trim.value - current_flight_dynamics->input_data.cyclic_x.value); } else { current_flight_dynamics->input_data.cyclic_x.value += ((3.0 / 4.0) * MODEL_FRAME_RATE * get_model_delta_time ()) * (current_flight_dynamics->input_data.cyclic_x_trim.value - current_flight_dynamics->input_data.cyclic_x.value); } } else if (get_global_cyclic_input () == MOUSE_INPUT) { if (fabs (current_flight_dynamics->input_data.cyclic_x.value) < 5.0) { current_flight_dynamics->input_data.cyclic_x.value *= 0.8; } } } if (current_flight_dynamics->input_data.cyclic_vertical_pressure.value) { //current_flight_dynamics->input_data.cyclic_y.value += (MODEL_FRAME_RATE * get_model_delta_time ()) * (current_flight_dynamics->input_data.cyclic_vertical_pressure.value + current_flight_dynamics->input_data.cyclic_y_trim.value); current_flight_dynamics->input_data.cyclic_y.value += (MODEL_FRAME_RATE * get_model_delta_time ()) * (current_flight_dynamics->input_data.cyclic_vertical_pressure.value);// + current_flight_dynamics->input_data.cyclic_y_trim.value); } else { // restore y if (get_global_cyclic_input () == KEYBOARD_INPUT) { if (get_current_dynamics_options (DYNAMICS_OPTIONS_KEYBOARD_ASSISTANCE)) { current_flight_dynamics->input_data.cyclic_y.value += ((1.0 / 16.0) * MODEL_FRAME_RATE * get_model_delta_time ()) * (current_flight_dynamics->input_data.cyclic_y_trim.value - current_flight_dynamics->input_data.cyclic_y.value); } else { current_flight_dynamics->input_data.cyclic_y.value += ((3.0 / 4.0) * MODEL_FRAME_RATE * get_model_delta_time ()) * (current_flight_dynamics->input_data.cyclic_y_trim.value - current_flight_dynamics->input_data.cyclic_y.value); } } else if (get_global_cyclic_input () == MOUSE_INPUT) { if (fabs (current_flight_dynamics->input_data.cyclic_y.value) < 5.0) { debug_fatal ("CYCLIC: code with delta time"); current_flight_dynamics->input_data.cyclic_y.value *= 0.8; } } } break; } case JOYSTICK_INPUT: { int joyval; float input; // 030418 loke // implemented multiple joystick device selection // x if (command_line_cyclic_joystick_index == -1) { joyval = get_joystick_axis (current_flight_dynamics->input_data.cyclic_joystick_device_index, JOYSTICK_DEFAULT_AXIS_ROLL); } else { joyval = get_joystick_axis (command_line_cyclic_joystick_index, command_line_cyclic_joystick_x_axis); } if (command_line_nonlinear_cyclic) { // in non-linear mode it uses a curve described by f(x) = x*x + x // gives a not so sensitive control around centre input = (2.0 * (float) joyval ) / ((float) JOYSTICK_AXIS_MAXIMUM - (float) JOYSTICK_AXIS_MINIMUM); if (input >= 0) input *= input; else input *= -input; input += input; input *= 50; } else input = (float) (200.0 * (float) joyval ) / ((float) JOYSTICK_AXIS_MAXIMUM - (float) JOYSTICK_AXIS_MINIMUM); if (fabs (input) < command_line_dynamics_cyclic_dead_zone) { input = 0.0; } current_flight_dynamics->input_data.cyclic_x.value = input; //ataribaby 1/1/2009 allow trim with ALT HOLD if (current_flight_dynamics->auto_hover == HOVER_HOLD_NONE || current_flight_dynamics->auto_hover == HOVER_HOLD_ALTITUDE_LOCK) current_flight_dynamics->input_data.cyclic_x.value += current_flight_dynamics->input_data.cyclic_x_trim.value; // y if (command_line_cyclic_joystick_index == -1) { joyval = get_joystick_axis (current_flight_dynamics->input_data.cyclic_joystick_device_index, JOYSTICK_DEFAULT_AXIS_PITCH); } else { joyval = get_joystick_axis (command_line_cyclic_joystick_index, command_line_cyclic_joystick_y_axis); } if (command_line_nonlinear_cyclic) { // in non-linear mode it uses a curve described by f(x) = x*x + x // gives a not so sensitive control around centre input = -2.0 * ((float) joyval ) / ((float) JOYSTICK_AXIS_MAXIMUM - (float) JOYSTICK_AXIS_MINIMUM); if (input >= 0) input *= input; else input *= -input; input += input; input *= 50.0; } else input = -(float) (200.0 * joyval) / (JOYSTICK_AXIS_MAXIMUM - JOYSTICK_AXIS_MINIMUM); if (fabs (input) < command_line_dynamics_cyclic_dead_zone) { input = 0.0; } current_flight_dynamics->input_data.cyclic_y.value = input; //ataribaby 1/1/2009 allow trim with ALT HOLD if (current_flight_dynamics->auto_hover == HOVER_HOLD_NONE || current_flight_dynamics->auto_hover == HOVER_HOLD_ALTITUDE_LOCK) current_flight_dynamics->input_data.cyclic_y.value += current_flight_dynamics->input_data.cyclic_y_trim.value; /* debug_log ("CYCLIC: x %f, y %f", ((float) fabs (200.0 * get_joystick_axis(current_flight_dynamics->input_data.cyclic_joystick_device_index, JOYSTICK_DEFAULT_AXIS_ROLL) / (JOYSTICK_AXIS_MAXIMUM - JOYSTICK_AXIS_MINIMUM)), ((float) fabs (200.0 * get_joystick_axis(current_flight_dynamics->input_data.cyclic_joystick_device_index, JOYSTICK_DEFAULT_AXIS_PITCH)) / (JOYSTICK_AXIS_MAXIMUM - JOYSTICK_AXIS_MINIMUM))); */ { // 030418 loke // implemented multiple joystick device selection int joystick_x_pos, joystick_y_pos; if (command_line_cyclic_joystick_index == -1) { joystick_x_pos = get_joystick_axis (current_flight_dynamics->input_data.cyclic_joystick_device_index, JOYSTICK_DEFAULT_AXIS_ROLL); joystick_y_pos = get_joystick_axis (current_flight_dynamics->input_data.cyclic_joystick_device_index, JOYSTICK_DEFAULT_AXIS_PITCH); } else { joystick_x_pos = get_joystick_axis (command_line_cyclic_joystick_index, command_line_cyclic_joystick_x_axis); joystick_y_pos = get_joystick_axis (command_line_cyclic_joystick_index, command_line_cyclic_joystick_y_axis); } if (((float) fabs (200.0 * joystick_x_pos) / (JOYSTICK_AXIS_MAXIMUM - JOYSTICK_AXIS_MINIMUM) > 10.0) || ((float) fabs (200.0 * joystick_y_pos) / (JOYSTICK_AXIS_MAXIMUM - JOYSTICK_AXIS_MINIMUM) > 10.0)) { if ((current_flight_dynamics->auto_hover == HOVER_HOLD_NORMAL) || (current_flight_dynamics->auto_hover == HOVER_HOLD_STABLE)) { set_current_flight_dynamics_auto_hover (HOVER_HOLD_NONE); set_current_flight_dynamics_auto_pilot (FALSE); } } } break; } } // // DEBUG - to get the coolie hat working // #if 0 { joystick_hat_position coolie_position; coolie_position = get_joystick_hat( &joystick_devices [current_flight_dynamics->input_data.cyclic_joystick_device_index], 0 ); switch( coolie_position ) { case HAT_CENTERED: debug_log ("CYCLIC: coolie centered"); break; case HAT_UP: debug_log ("CYCLIC: coolie up"); break; case HAT_LEFT: debug_log ("CYCLIC: coolie left"); break; case HAT_DOWN: debug_log ("CYCLIC: coolie down"); break; case HAT_RIGHT: debug_log ("CYCLIC: coolie right"); break; case HAT_LEFTUP: debug_log ("CYCLIC: coolie left+up"); break; case HAT_LEFTDOWN: debug_log ("CYCLIC: coolie left+down"); break; case HAT_RIGHTUP: debug_log ("CYCLIC: coolie right+up"); break; case HAT_RIGHTDOWN: debug_log ("CYCLIC: coolie right+down"); break; default: debug_log ("CYCLIC: coolie is on fire"); } } #endif // // Damaged hydraulics // if (current_flight_dynamics->input_data.cyclic_x.damaged) { current_flight_dynamics->input_data.cyclic_x.value *= hydraulic_pressure; current_flight_dynamics->input_data.cyclic_x.value += damaged_lock_x_pos * (1.0 - hydraulic_pressure); } if (current_flight_dynamics->input_data.cyclic_y.damaged) { current_flight_dynamics->input_data.cyclic_y.value *= hydraulic_pressure; current_flight_dynamics->input_data.cyclic_y.value += damaged_lock_y_pos * (1.0 - hydraulic_pressure); } // // Damaged Stabaliser // if (current_flight_dynamics->input_data.cyclic_x_trim.damaged) current_flight_dynamics->input_data.cyclic_x_trim.value += (MODEL_FRAME_RATE * get_model_delta_time ()) * (0.5 * sfrand1 () * current_flight_dynamics->input_data.cyclic_x_trim.value); if (current_flight_dynamics->input_data.cyclic_y_trim.damaged) current_flight_dynamics->input_data.cyclic_y_trim.value += (MODEL_FRAME_RATE * get_model_delta_time ()) * (0.5 * sfrand1 () * current_flight_dynamics->input_data.cyclic_y_trim.value); // limit cyclic position current_flight_dynamics->input_data.cyclic_x.value = bound ( //current_flight_dynamics->input_data.cyclic_x.value + current_flight_dynamics->input_data.cyclic_x_trim.value, current_flight_dynamics->input_data.cyclic_x.value, current_flight_dynamics->input_data.cyclic_x.min, current_flight_dynamics->input_data.cyclic_x.max ); current_flight_dynamics->input_data.cyclic_y.value = bound ( //current_flight_dynamics->input_data.cyclic_y.value + current_flight_dynamics->input_data.cyclic_y_trim.value, current_flight_dynamics->input_data.cyclic_y.value, current_flight_dynamics->input_data.cyclic_y.min, current_flight_dynamics->input_data.cyclic_y.max ); }
bool GameManager::update() { #ifdef CHOWDREN_USE_DYNAMIC_NUMBER static int save_time = 0; save_time--; if (save_time <= 0) { save_alterable_debug(); save_time += 60; } #endif #ifdef SHOW_STATS bool show_stats = false; static int measure_time = 0; measure_time -= 1; if (measure_time <= 0) { measure_time = 200; show_stats = true; } #endif #ifdef CHOWDREN_USER_PROFILER static int frame = 0; frame++; std::stringstream ss; ss << "Frame " << frame << ": " << fps_limit.dt << " "; #endif // update input keyboard.update(); mouse.update(); platform_poll_events(); #ifdef CHOWDREN_USE_GWEN gwen.update(); #endif // player controls int new_control = get_player_control_flags(1); player_press_flags = new_control & ~(player_flags); player_flags = new_control; // joystick controls new_control = get_joystick_control_flags(1); joystick_press_flags = new_control & ~(joystick_flags); joystick_release_flags = joystick_flags & ~(new_control); joystick_flags = new_control; #ifdef CHOWDREN_USE_JOYTOKEY for (int i = 0; i < simulate_count; i++) { if (simulate_keys[i].down) { simulate_keys[i].down = false; continue; } keyboard.remove(simulate_keys[i].key); simulate_keys[i] = simulate_keys[simulate_count-1]; i--; simulate_count--; } for (int i = 0; i < CHOWDREN_BUTTON_MAX-1; i++) { int key = key_mappings[i]; if (key == -1) continue; if (is_joystick_pressed_once(1, i+1)) keyboard.add(key); else if (is_joystick_released_once(1, i+1)) keyboard.remove(key); } axis_moved = false; for (int i = 0; i < CHOWDREN_AXIS_MAX-1; i++) { float value = get_joystick_axis(1, i+1); int pos = axis_pos_mappings[i]; int neg = axis_neg_mappings[i]; int axis_value = 0; if (value > deadzone) { last_axis = i; if (pos != -1 && axis_values[i] != 1) keyboard.add(pos); axis_value = 1; } else { if (pos != -1 && axis_values[i] == 1) keyboard.remove(pos); } if (value < -deadzone) { last_axis = i; if (neg != -1 && axis_values[i] != -1) keyboard.add(neg); axis_value = -1; } else { if (neg != -1 && axis_values[i] == -1) keyboard.remove(neg); } axis_values[i] = axis_value; static bool last_move = false; bool new_move = axis_value != 0; if (new_move && new_move != last_move) axis_moved = true; last_move = new_move; } static bool last_connected = false; bool connected = is_joystick_attached(1); pad_selected = connected && last_connected != connected; pad_disconnected = !connected && last_connected != connected; last_connected = connected; #endif // update mouse position platform_get_mouse_pos(&mouse_x, &mouse_y); #ifdef SHOW_STATS if (show_stats) std::cout << "Framerate: " << fps_limit.current_framerate << std::endl; #endif if (platform_has_error()) { if (platform_display_closed()) return false; } else { double event_update_time = platform_get_time(); int ret = update_frame(); #ifdef CHOWDREN_USER_PROFILER ss << (platform_get_time() - event_update_time) << " "; #endif #ifdef SHOW_STATS if (show_stats) std::cout << "Event update took " << platform_get_time() - event_update_time << std::endl; #endif if (ret == 0) return false; else if (ret == 2) return true; if (platform_display_closed()) return false; } double draw_time = platform_get_time(); draw(); #ifdef CHOWDREN_USER_PROFILER ss << (platform_get_time() - draw_time) << " "; #endif #ifdef SHOW_STATS if (show_stats) { std::cout << "Draw took " << platform_get_time() - draw_time << std::endl; #ifndef NDEBUG print_instance_stats(); #endif platform_print_stats(); } #endif fps_limit.finish(); #ifdef CHOWDREN_USER_PROFILER ss << "\n"; std::string logline = ss.str(); user_log.write(&logline[0], logline.size()); #endif #ifdef CHOWDREN_USE_PROFILER static int profile_time = 0; profile_time -= 1; if (profile_time <= 0) { profile_time += 500; PROFILE_UPDATE(); PROFILE_OUTPUT("data:/profile.txt"); } #endif return true; }
void update_comanche_eo (eo_params_dynamic_move *eo) { float fine_slew_rate, medium_slew_rate, mouse_slew_rate, // Jabberwock 030930 coarse_slew_rate; ASSERT (eo); //////////////////////////////////////// // // field of view // //////////////////////////////////////// while (single_target_acquisition_system_inc_range_key) { dec_eo_field_of_view (eo); single_target_acquisition_system_inc_range_key--; } while (single_target_acquisition_system_inc_range_fast_key) { fast_dec_eo_field_of_view (eo); single_target_acquisition_system_inc_range_fast_key--; } //////////////////////////////////////// while (single_target_acquisition_system_dec_range_key) { inc_eo_field_of_view (eo); single_target_acquisition_system_dec_range_key--; } while (single_target_acquisition_system_dec_range_fast_key) { fast_inc_eo_field_of_view (eo); single_target_acquisition_system_dec_range_fast_key--; } //////////////////////////////////////// while (toggle_ground_stabilisation_key) { toggle_ground_stabilisation (); toggle_ground_stabilisation_key--; } //////////////////////////////////////// if (command_line_eo_zoom_joystick_index != -1) { long pos = get_joystick_axis (command_line_eo_zoom_joystick_index, command_line_eo_zoom_joystick_axis); eo->zoom = (pos + 10000) / 20000.0; } //////////////////////////////////////// // // slew optics // //////////////////////////////////////// #ifdef OLD_EO switch (eo->field_of_view) { //////////////////////////////////////// case EO_FOV_NARROW: //////////////////////////////////////// { fine_slew_rate = rad (0.05) * get_delta_time (); medium_slew_rate = rad (0.25) * get_delta_time (); mouse_slew_rate = rad (0.6) * get_delta_time (); // Jabberwock 030930 coarse_slew_rate = rad (1.0) * get_delta_time (); break; } //////////////////////////////////////// case EO_FOV_MEDIUM: //////////////////////////////////////// { fine_slew_rate = rad (0.5) * get_delta_time (); medium_slew_rate = rad (2.5) * get_delta_time (); mouse_slew_rate = rad (6) * get_delta_time (); // Jabberwock 030930 coarse_slew_rate = rad (10.0) * get_delta_time (); break; } //////////////////////////////////////// case EO_FOV_WIDE: //////////////////////////////////////// { fine_slew_rate = rad (4.0) * get_delta_time (); medium_slew_rate = rad (20.0) * get_delta_time (); mouse_slew_rate = rad (48) * get_delta_time (); // Jabberwock 030930 coarse_slew_rate = rad (80.0) * get_delta_time (); break; } //////////////////////////////////////// default: //////////////////////////////////////// { debug_fatal ("Invalid field of view = %d", eo->field_of_view); break; } } #else { float exp_zoom_value = convert_linear_view_value (eo); fine_slew_rate = rad (4.0) * exp_zoom_value * get_delta_time (); medium_slew_rate = rad (20.0) * exp_zoom_value * get_delta_time (); mouse_slew_rate = rad (48.0) * exp_zoom_value * get_delta_time (); // Jabberwock 030930 coarse_slew_rate = rad (80.0) * exp_zoom_value * get_delta_time (); } #endif keyboard_slew_eo_system(fine_slew_rate, medium_slew_rate, coarse_slew_rate); //////////////////////////////////////// if ( command_line_eo_pan_joystick_index == -1 ) { float ROTATE_RATE = (float) command_line_mouse_look_speed / 5.0; eo_azimuth = get_eo_azimuth (ROTATE_RATE, coarse_slew_rate, eo_azimuth, eo_min_azimuth, eo_max_azimuth, mouse_slew_rate); eo_elevation = get_eo_elevation (ROTATE_RATE, coarse_slew_rate, eo_elevation, eo_min_elevation, eo_max_elevation, mouse_slew_rate); } if (command_line_eo_zoom_joystick_index == -1 && (command_line_mouse_look != MOUSELOOK_ON || command_line_field_of_view_joystick_index != -1)) eo->zoom = get_new_eo_zoom(eo->zoom); //////////////////////////////////////// joystick_slew_eo_system(medium_slew_rate); //////////////////////////////////////// // loke 030322 // handle the ground stabilisation if (eo_ground_stabilised) { handle_ground_stabilisation(); } //////////////////////////////////////// while (single_target_acquisition_system_select_next_target_key) { select_next_eo_target (); single_target_acquisition_system_select_next_target_key--; } //////////////////////////////////////// while (single_target_acquisition_system_select_previous_target_key) { select_previous_eo_target (); single_target_acquisition_system_select_previous_target_key--; } // Jabberwock 031107 Designated targets while (single_target_acquisition_system_select_next_designated_key) { select_next_designated_eo_target (); single_target_acquisition_system_select_next_designated_key--; } //////////////////////////////////////// while (single_target_acquisition_system_select_previous_designated_key) { select_previous_designated_eo_target (); single_target_acquisition_system_select_previous_designated_key--; } // Jabberwock 031107 ends }