1 /*
2 * Copyright (c) 2012-2021, The OSKAR Developers.
3 * See the LICENSE file at the top-level directory of this distribution.
4 */
5
6 #include "apps/oskar_app_settings.h"
7 #include "apps/oskar_settings_log.h"
8 #include "apps/oskar_settings_to_beam_pattern.h"
9 #include "apps/oskar_settings_to_telescope.h"
10 #include "beam_pattern/oskar_beam_pattern.h"
11 #include "log/oskar_log.h"
12 #include "settings/oskar_option_parser.h"
13 #include "utility/oskar_get_error_string.h"
14 #include "utility/oskar_version_string.h"
15
16 #include <cstdio>
17 #include <cstdlib>
18
19 using namespace oskar;
20
21 static const char app[] = "oskar_sim_beam_pattern";
22
main(int argc,char ** argv)23 int main(int argc, char** argv)
24 {
25 OptionParser opt(app, oskar_version_string(), oskar_app_settings(app));
26 opt.add_settings_options();
27 opt.add_flag("-q", "Suppress printing.", false, "--quiet");
28 if (!opt.check_options(argc, argv)) return EXIT_FAILURE;
29 const char* settings = opt.get_arg(0);
30 int status = 0;
31
32 // Load the settings file.
33 SettingsTree* s = oskar_app_settings_tree(app, settings);
34 if (!s)
35 {
36 oskar_log_error(0, "Failed to read settings file '%s'", settings);
37 return EXIT_FAILURE;
38 }
39
40 // Get/set setting if necessary.
41 if (opt.is_set("--get"))
42 {
43 printf("%s\n", s->to_string(opt.get_arg(1), &status));
44 SettingsTree::free(s);
45 return !status ? 0 : EXIT_FAILURE;
46 }
47 else if (opt.is_set("--set"))
48 {
49 const char* key = opt.get_arg(1);
50 const char* val = opt.get_arg(2);
51 bool ok = val ? s->set_value(key, val) : s->set_default(key);
52 if (!ok) oskar_log_error(0, "Failed to set '%s'='%s'", key, val);
53 SettingsTree::free(s);
54 return ok ? 0 : EXIT_FAILURE;
55 }
56
57 // Set up the beam pattern simulator.
58 oskar_BeamPattern* sim = oskar_settings_to_beam_pattern(s, NULL, &status);
59 oskar_Log* log = oskar_beam_pattern_log(sim);
60 int priority = opt.is_set("-q") ? OSKAR_LOG_WARNING : OSKAR_LOG_STATUS;
61 oskar_log_set_term_priority(log, priority);
62
63 // Write settings to log.
64 oskar_settings_log(s, log);
65
66 // Set up the telescope model.
67 oskar_Telescope* tel = oskar_settings_to_telescope(s, log, &status);
68 if (!tel || status)
69 {
70 oskar_log_error(log, "Failed to set up telescope model: %s.",
71 oskar_get_error_string(status));
72 }
73 else
74 {
75 oskar_beam_pattern_set_telescope_model(sim, tel, &status);
76 }
77 oskar_telescope_free(tel, &status);
78
79 // Run simulation.
80 oskar_beam_pattern_run(sim, &status);
81
82 // Free memory.
83 oskar_beam_pattern_free(sim, &status);
84 SettingsTree::free(s);
85 return status ? EXIT_FAILURE : EXIT_SUCCESS;
86 }
87