1 changed files with 149 additions and 0 deletions
@ -0,0 +1,149 @@ |
|||||||
|
# Maneuver UI Controls - Implementation Plan |
||||||
|
|
||||||
|
## Overview |
||||||
|
Add functionality to the maneuver.h module to support UI controls for creating and managing maneuvers in the graphical simulation. |
||||||
|
|
||||||
|
## Current Interface Analysis |
||||||
|
|
||||||
|
The maneuver module currently has: |
||||||
|
- **Burn direction functions**: `calculate_prograde_dir()`, `calculate_normal_dir()`, etc. |
||||||
|
- **Burn application**: `apply_impulsive_burn()`, `apply_custom_burn()` |
||||||
|
- **Maneuver execution**: `check_maneuver_trigger()`, `execute_maneuver()` |
||||||
|
- **No dynamic maneuver management**: Maneuvers are only loaded from config files |
||||||
|
|
||||||
|
## Recommended Additions to maneuver.h |
||||||
|
|
||||||
|
### 1. Maneuver Creation and Management |
||||||
|
|
||||||
|
```cpp |
||||||
|
// Create a new maneuver structure from parameters |
||||||
|
Maneuver create_maneuver(const char* name, int craft_index, BurnDirection direction, |
||||||
|
double delta_v, TriggerType trigger_type, double trigger_value); |
||||||
|
|
||||||
|
// Add maneuver to simulation (returns index or -1 on error) |
||||||
|
int add_maneuver_to_simulation(SimulationState* sim, Maneuver maneuver); |
||||||
|
|
||||||
|
// Remove maneuver by name or index |
||||||
|
bool remove_maneuver_by_name(SimulationState* sim, const char* name); |
||||||
|
bool remove_maneuver_by_index(SimulationState* sim, int index); |
||||||
|
|
||||||
|
// Clear all unexecuted maneuvers for a spacecraft |
||||||
|
void clear_pending_maneuvers(SimulationState* sim, int craft_index); |
||||||
|
``` |
||||||
|
|
||||||
|
### 2. Burn Preview/Optimization |
||||||
|
|
||||||
|
```cpp |
||||||
|
// Preview burn result without executing (returns new orbital elements) |
||||||
|
OrbitalElements preview_burn_result(Spacecraft* craft, BurnDirection direction, |
||||||
|
double delta_v, double parent_mass); |
||||||
|
|
||||||
|
// Calculate required delta-v for target orbital elements |
||||||
|
double calculate_delta_v_for_elements(Spacecraft* craft, OrbitalElements target_elements, |
||||||
|
double parent_mass); |
||||||
|
|
||||||
|
// Calculate Hohmann transfer delta-v (two burns) |
||||||
|
struct HohmannTransfer { |
||||||
|
double dv1; // First burn delta-v |
||||||
|
double dv2; // Second burn delta-v |
||||||
|
double transfer_time; // Time to apoapsis |
||||||
|
double true_anomaly_2; // True anomaly for second burn |
||||||
|
}; |
||||||
|
HohmannTransfer calculate_hohmann_transfer(double r1, double r2, double central_mass); |
||||||
|
``` |
||||||
|
|
||||||
|
### 3. Maneuver Information and Validation |
||||||
|
|
||||||
|
```cpp |
||||||
|
// Get descriptive string for burn direction |
||||||
|
const char* get_burn_direction_name(BurnDirection direction); |
||||||
|
|
||||||
|
// Get descriptive string for trigger type |
||||||
|
const char* get_trigger_type_name(TriggerType trigger_type); |
||||||
|
|
||||||
|
// Check if a burn is feasible (e.g., not exceeding escape velocity if unintended) |
||||||
|
bool validate_burn_parameters(Spacecraft* craft, BurnDirection direction, |
||||||
|
double delta_v, double parent_mass); |
||||||
|
|
||||||
|
// Calculate time until true anomaly trigger |
||||||
|
double calculate_time_to_true_anomaly(Spacecraft* craft, double target_anomaly, |
||||||
|
double parent_mass); |
||||||
|
``` |
||||||
|
|
||||||
|
### 4. Undo/Snapshot Support |
||||||
|
|
||||||
|
```cpp |
||||||
|
// Save spacecraft state before burn |
||||||
|
struct SpacecraftSnapshot { |
||||||
|
OrbitalElements orbit; |
||||||
|
Vec3 local_position; |
||||||
|
Vec3 local_velocity; |
||||||
|
}; |
||||||
|
SpacecraftSnapshot save_spacecraft_snapshot(Spacecraft* craft); |
||||||
|
|
||||||
|
// Restore spacecraft state |
||||||
|
void restore_spacecraft_snapshot(Spacecraft* craft, SpacecraftSnapshot snapshot); |
||||||
|
|
||||||
|
// Create reversible maneuver structure |
||||||
|
struct ReversibleManeuver { |
||||||
|
Maneuver maneuver; |
||||||
|
SpacecraftSnapshot pre_burn_state; |
||||||
|
}; |
||||||
|
``` |
||||||
|
|
||||||
|
### 5. Maneuver Query Functions |
||||||
|
|
||||||
|
```cpp |
||||||
|
// Find maneuver by name (already exists in tests but not in header) |
||||||
|
int find_maneuver_by_name(SimulationState* sim, const char* name); |
||||||
|
|
||||||
|
// Get next pending maneuver for a spacecraft |
||||||
|
Maneuver* get_next_pending_maneuver(SimulationState* sim, int craft_index); |
||||||
|
|
||||||
|
// Get count of pending maneuvers for a spacecraft |
||||||
|
int get_pending_maneuver_count(SimulationState* sim, int craft_index); |
||||||
|
|
||||||
|
// Get all pending maneuvers for a spacecraft (returns array and count) |
||||||
|
Maneuver** get_pending_maneuvers_for_craft(SimulationState* sim, int craft_index, int* out_count); |
||||||
|
``` |
||||||
|
|
||||||
|
### 6. Burn Direction Visualization |
||||||
|
|
||||||
|
```cpp |
||||||
|
// Get burn direction vector at specific orbital position |
||||||
|
Vec3 get_burn_direction_at_anomaly(Spacecraft* craft, BurnDirection direction, |
||||||
|
double true_anomaly, double parent_mass); |
||||||
|
``` |
||||||
|
|
||||||
|
## Implementation Considerations |
||||||
|
|
||||||
|
1. **Dynamic array management**: Since `SimulationState` has `max_maneuvers`, the add function should check capacity before adding. |
||||||
|
|
||||||
|
2. **Name uniqueness**: The config loader already enforces unique names; the UI should too. |
||||||
|
|
||||||
|
3. **Craft index validation**: When adding maneuvers via UI, verify the craft index is valid. |
||||||
|
|
||||||
|
4. **UI integration points**: These functions would be called from: |
||||||
|
- **Main loop**: When user adds/edits maneuvers |
||||||
|
- **UI renderer**: For displaying burn previews and validation feedback |
||||||
|
- **Config saving**: To export UI-created maneuvers to TOML |
||||||
|
|
||||||
|
## Priority Recommendations |
||||||
|
|
||||||
|
**High Priority** (core UI functionality): |
||||||
|
1. `add_maneuver_to_simulation()` - Essential for UI creation |
||||||
|
2. `remove_maneuver_by_index()` - For editing/deleting |
||||||
|
3. `create_maneuver()` - Helper for constructing maneuvers |
||||||
|
4. `get_burn_direction_name()` - For UI labels |
||||||
|
|
||||||
|
**Medium Priority** (enhanced UX): |
||||||
|
5. `preview_burn_result()` - Show result before committing |
||||||
|
6. `calculate_hohmann_transfer()` - Common operation |
||||||
|
7. `validate_burn_parameters()` - Prevent errors |
||||||
|
|
||||||
|
**Lower Priority** (advanced features): |
||||||
|
8. Snapshot/undo functions |
||||||
|
9. Time-to-trigger calculations |
||||||
|
10. Reversible maneuvers |
||||||
|
|
||||||
|
This follows the existing C-style patterns in the codebase (structs, enums, simple functions) and provides the core functionality needed for a maneuver creation UI. |
||||||
Loading…
Reference in new issue