|
|
|
@ -171,7 +171,7 @@ bool load_system_config(SimulationState* sim, const char* filepath) { |
|
|
|
toml_free(result); |
|
|
|
toml_free(result); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Load maneuvers from the same config file (before freeing TOML data)
|
|
|
|
// Load maneuvers from the same config file (before freeing TOML data)
|
|
|
|
if (!load_maneuvers_from_toml(sim, result)) { |
|
|
|
if (!load_maneuvers_from_toml(sim, result)) { |
|
|
|
toml_free(result); |
|
|
|
toml_free(result); |
|
|
|
@ -265,7 +265,7 @@ static bool parse_toml_spacecraft(toml_datum_t craft_table, Spacecraft* craft) { |
|
|
|
craft->local_velocity = {0.0, 0.0, 0.0}; |
|
|
|
craft->local_velocity = {0.0, 0.0, 0.0}; |
|
|
|
} |
|
|
|
} |
|
|
|
craft->velocity = craft->local_velocity; |
|
|
|
craft->velocity = craft->local_velocity; |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -276,12 +276,12 @@ static bool parse_toml_maneuver(toml_datum_t maneuver_table, Maneuver* maneuver, |
|
|
|
} |
|
|
|
} |
|
|
|
strncpy(maneuver->name, name.u.s, 63); |
|
|
|
strncpy(maneuver->name, name.u.s, 63); |
|
|
|
maneuver->name[63] = '\0'; |
|
|
|
maneuver->name[63] = '\0'; |
|
|
|
|
|
|
|
|
|
|
|
toml_datum_t spacecraft_name = toml_get(maneuver_table, "spacecraft_name"); |
|
|
|
toml_datum_t spacecraft_name = toml_get(maneuver_table, "spacecraft_name"); |
|
|
|
if (spacecraft_name.type != TOML_STRING) { |
|
|
|
if (spacecraft_name.type != TOML_STRING) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int craft_idx = -1; |
|
|
|
int craft_idx = -1; |
|
|
|
for (int i = 0; i < sim->craft_count; i++) { |
|
|
|
for (int i = 0; i < sim->craft_count; i++) { |
|
|
|
if (strcmp(sim->spacecraft[i].name, spacecraft_name.u.s) == 0) { |
|
|
|
if (strcmp(sim->spacecraft[i].name, spacecraft_name.u.s) == 0) { |
|
|
|
@ -289,20 +289,20 @@ static bool parse_toml_maneuver(toml_datum_t maneuver_table, Maneuver* maneuver, |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (craft_idx < 0) { |
|
|
|
if (craft_idx < 0) { |
|
|
|
printf("Error: Maneuver '%s' references non-existent spacecraft '%s'\n", |
|
|
|
printf("Error: Maneuver '%s' references non-existent spacecraft '%s'\n", |
|
|
|
maneuver->name, spacecraft_name.u.s); |
|
|
|
maneuver->name, spacecraft_name.u.s); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
maneuver->craft_index = craft_idx; |
|
|
|
maneuver->craft_index = craft_idx; |
|
|
|
|
|
|
|
|
|
|
|
toml_datum_t trigger_type_str = toml_get(maneuver_table, "trigger_type"); |
|
|
|
toml_datum_t trigger_type_str = toml_get(maneuver_table, "trigger_type"); |
|
|
|
if (trigger_type_str.type != TOML_STRING) { |
|
|
|
if (trigger_type_str.type != TOML_STRING) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (strcmp(trigger_type_str.u.s, "time") == 0) { |
|
|
|
if (strcmp(trigger_type_str.u.s, "time") == 0) { |
|
|
|
maneuver->trigger_type = TRIGGER_TIME; |
|
|
|
maneuver->trigger_type = TRIGGER_TIME; |
|
|
|
} else if (strcmp(trigger_type_str.u.s, "true_anomaly") == 0) { |
|
|
|
} else if (strcmp(trigger_type_str.u.s, "true_anomaly") == 0) { |
|
|
|
@ -312,18 +312,18 @@ static bool parse_toml_maneuver(toml_datum_t maneuver_table, Maneuver* maneuver, |
|
|
|
trigger_type_str.u.s, maneuver->name); |
|
|
|
trigger_type_str.u.s, maneuver->name); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
toml_datum_t trigger_value = toml_get(maneuver_table, "trigger_value"); |
|
|
|
toml_datum_t trigger_value = toml_get(maneuver_table, "trigger_value"); |
|
|
|
if (trigger_value.type != TOML_FP64 && trigger_value.type != TOML_INT64) { |
|
|
|
if (trigger_value.type != TOML_FP64 && trigger_value.type != TOML_INT64) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
maneuver->trigger_value = trigger_value.type == TOML_FP64 ? trigger_value.u.fp64 : (double)trigger_value.u.int64; |
|
|
|
maneuver->trigger_value = trigger_value.type == TOML_FP64 ? trigger_value.u.fp64 : (double)trigger_value.u.int64; |
|
|
|
|
|
|
|
|
|
|
|
toml_datum_t direction_str = toml_get(maneuver_table, "direction"); |
|
|
|
toml_datum_t direction_str = toml_get(maneuver_table, "direction"); |
|
|
|
if (direction_str.type != TOML_STRING) { |
|
|
|
if (direction_str.type != TOML_STRING) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (strcmp(direction_str.u.s, "prograde") == 0) { |
|
|
|
if (strcmp(direction_str.u.s, "prograde") == 0) { |
|
|
|
maneuver->direction = BURN_PROGRADE; |
|
|
|
maneuver->direction = BURN_PROGRADE; |
|
|
|
} else if (strcmp(direction_str.u.s, "retrograde") == 0) { |
|
|
|
} else if (strcmp(direction_str.u.s, "retrograde") == 0) { |
|
|
|
@ -341,16 +341,16 @@ static bool parse_toml_maneuver(toml_datum_t maneuver_table, Maneuver* maneuver, |
|
|
|
direction_str.u.s, maneuver->name); |
|
|
|
direction_str.u.s, maneuver->name); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
toml_datum_t delta_v = toml_get(maneuver_table, "delta_v"); |
|
|
|
toml_datum_t delta_v = toml_get(maneuver_table, "delta_v"); |
|
|
|
if (delta_v.type != TOML_FP64 && delta_v.type != TOML_INT64) { |
|
|
|
if (delta_v.type != TOML_FP64 && delta_v.type != TOML_INT64) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
maneuver->delta_v = delta_v.type == TOML_FP64 ? delta_v.u.fp64 : (double)delta_v.u.int64; |
|
|
|
maneuver->delta_v = delta_v.type == TOML_FP64 ? delta_v.u.fp64 : (double)delta_v.u.int64; |
|
|
|
|
|
|
|
|
|
|
|
maneuver->executed = false; |
|
|
|
maneuver->executed = false; |
|
|
|
maneuver->executed_time = 0.0; |
|
|
|
maneuver->executed_time = 0.0; |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -359,18 +359,18 @@ static bool load_maneuvers_from_toml(SimulationState* sim, toml_result_t result) |
|
|
|
if (maneuvers.type != TOML_ARRAY) { |
|
|
|
if (maneuvers.type != TOML_ARRAY) { |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int maneuver_count = maneuvers.u.arr.size; |
|
|
|
int maneuver_count = maneuvers.u.arr.size; |
|
|
|
if (maneuver_count == 0) { |
|
|
|
if (maneuver_count == 0) { |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (maneuver_count > sim->max_maneuvers) { |
|
|
|
if (maneuver_count > sim->max_maneuvers) { |
|
|
|
printf("Error: Too many maneuvers (%d) for simulation (max: %d)\n", |
|
|
|
printf("Error: Too many maneuvers (%d) for simulation (max: %d)\n", |
|
|
|
maneuver_count, sim->max_maneuvers); |
|
|
|
maneuver_count, sim->max_maneuvers); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < maneuver_count; i++) { |
|
|
|
for (int i = 0; i < maneuver_count; i++) { |
|
|
|
Maneuver maneuver; |
|
|
|
Maneuver maneuver; |
|
|
|
toml_datum_t maneuver_table = maneuvers.u.arr.elem[i]; |
|
|
|
toml_datum_t maneuver_table = maneuvers.u.arr.elem[i]; |
|
|
|
@ -378,7 +378,7 @@ static bool load_maneuvers_from_toml(SimulationState* sim, toml_result_t result) |
|
|
|
printf("Error: Failed to parse maneuver at index %d\n", i); |
|
|
|
printf("Error: Failed to parse maneuver at index %d\n", i); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (int j = 0; j < sim->maneuver_count; j++) { |
|
|
|
for (int j = 0; j < sim->maneuver_count; j++) { |
|
|
|
if (strcmp(sim->maneuvers[j].name, maneuver.name) == 0) { |
|
|
|
if (strcmp(sim->maneuvers[j].name, maneuver.name) == 0) { |
|
|
|
printf("Error: Duplicate maneuver name '%s' found at index %d\n", |
|
|
|
printf("Error: Duplicate maneuver name '%s' found at index %d\n", |
|
|
|
@ -386,11 +386,11 @@ static bool load_maneuvers_from_toml(SimulationState* sim, toml_result_t result) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
sim->maneuvers[sim->maneuver_count] = maneuver; |
|
|
|
sim->maneuvers[sim->maneuver_count] = maneuver; |
|
|
|
sim->maneuver_count++; |
|
|
|
sim->maneuver_count++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
printf("Loaded %d maneuvers from %s\n", maneuver_count, sim->config_name); |
|
|
|
printf("Loaded %d maneuvers from %s\n", maneuver_count, sim->config_name); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|