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