Skip to content

Commit

Permalink
Create details tab in catalog.
Browse files Browse the repository at this point in the history
  • Loading branch information
wojciech-graj committed Aug 14, 2022
1 parent fa104c3 commit 0aecbf0
Show file tree
Hide file tree
Showing 7 changed files with 1,473 additions and 308 deletions.
745 changes: 635 additions & 110 deletions res/ui/ui.glade

Large diffs are not rendered by default.

825 changes: 627 additions & 198 deletions res/ui/ui.glade~

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions src/gfx/gfx.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "render.h"
#include "thread.h"
#include "timemgr.h"
#include "info.h"

struct GLCtx e_gl_ctx;
static GtkGLArea *glarea;
Expand Down Expand Up @@ -51,6 +52,7 @@ gboolean on_glarea_render(GtkGLArea *area, GdkGLContext *context, gpointer user_
thread_dispatch(THRD_PHYS, NULL);
render_process();
timemgr_tic();
info_tic();
#ifndef NO_SATELLITE
thread_join_if_finished(THRD_SATELLITES_GET);
#endif
Expand Down
35 changes: 35 additions & 0 deletions src/ui/catalog.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "catalog.h"

#include "satcat_code.h"
#include "info.h"

enum Column {
COL_SELECT = 0u,
Expand All @@ -17,6 +18,11 @@ enum Column {
NUM_COLS,
};

enum Page {
PAGE_CATALOG = 0u,
PAGE_INFO,
};

static const char *column_ids[] = {
[COL_SELECT] = "col_select",
[COL_CATNUM] = "col_catnum",
Expand All @@ -40,6 +46,7 @@ static GtkSortType sort_type = GTK_SORT_ASCENDING;
static GtkTreeModelFilter *filter = NULL;
static GtkTreeView *satellite_view;
static GtkListStore *satellite_store;
static GtkTreeSelection *selection;
static char *str_satellite_store = NULL;

static const unsigned OFFSET_ID = offsetof(struct Satellite, satcat) + offsetof(struct SatCat, id);
Expand All @@ -50,6 +57,7 @@ static void on_catalog_clicked(GtkToolButton *toolbutton, gpointer user_data);
static void on_column_select_cell_toggled(GtkCellRendererToggle *cell_renderer, char *path, gpointer user_data);
static void on_catalog_search_search_changed(GtkSearchEntry *entry, gpointer user_data);
static void on_col_clicked(GtkTreeViewColumn *treeviewcolumn, gpointer user_data);
static void on_catalog_notebook_switch_page(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer user_data);

static gboolean catalog_view_filter_visible_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer data);
static gint catalog_view_search_compare_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data);
Expand Down Expand Up @@ -122,6 +130,31 @@ void on_col_clicked(GtkTreeViewColumn *treeviewcolumn, gpointer user_data)
gtk_tree_sortable_set_sort_column_id(sort, 1, sort_type);
}

void on_catalog_notebook_switch_page(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer user_data)
{
(void)notebook;
(void)page;
(void)user_data;
switch (page_num) {
case PAGE_CATALOG:
info_hide();
break;
case PAGE_INFO: {
GtkTreeModel *model;
GtkTreeIter iter;
gboolean selected = gtk_tree_selection_get_selected(selection, &model, &iter);
if (selected) {
struct Satellite *satellite;
gtk_tree_model_get(model, &iter,
0, &satellite,
-1);
info_show(satellite);
}
}
break;
}
}

void catalog_construct_views(void)
{
sort = GTK_TREE_SORTABLE(gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(satellite_store)));
Expand Down Expand Up @@ -307,12 +340,14 @@ void catalog_init(GtkBuilder *builder)
"on_window_catalog_delete_event", G_CALLBACK(on_window_catalog_delete_event),
"on_catalog_search_search_changed", G_CALLBACK(on_catalog_search_search_changed),
"on_col_clicked", G_CALLBACK(on_col_clicked),
"on_catalog_notebook_switch_page", G_CALLBACK(on_catalog_notebook_switch_page),
NULL);

window_catalog = GTK_WINDOW(gtk_builder_get_object(builder, "window_catalog"));
satellite_store = GTK_LIST_STORE(gtk_builder_get_object(builder, "satellite_store"));
g_object_ref(satellite_store);
satellite_view = GTK_TREE_VIEW(gtk_builder_get_object(builder, "catalog_view"));
selection = GTK_TREE_SELECTION(gtk_builder_get_object(builder, "catalog_selection"));

GtkCellRenderer *render_select = gtk_cell_renderer_toggle_new();
init_col_with_data_func(render_select, gtk_builder_get_object(builder, column_ids[COL_SELECT]), cell_data_func_select, NULL, 0);
Expand Down
159 changes: 159 additions & 0 deletions src/ui/info.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
#include "info.h"

#include "phys.h"
#include "type.h"

#include "TLE.h"
#include "satcat_code.h"
#include <cglm/vec2.h>
#include <cglm/vec3.h>
#include <cglm/mat3.h>
#include <cglm/mat4.h>

#include <math.h>

enum InfoItem {
INFO_NAME = 0u,
INFO_CATNUM,
INFO_ID,
INFO_PAYLOAD,
INFO_STATUS,
INFO_LAUNCH_SITE,
INFO_LAUNCH_DATE,
INFO_SOURCE,
INFO_DECAY_DATE,
INFO_ORBITAL_STATUS,
INFO_PERIOD,
INFO_INCLINATION,
INFO_APOGEE,
INFO_PERIGEE,
INFO_RADAR_CS,
INFO_POSITION_TEME,
INFO_POSITION_ECEF,
INFO_POSITION_LLH,
INFO_VELOCITY,
NUM_INFO_ITEMS,
};

static const char *info_item_ids[] = {
[INFO_NAME] = "info_name",
[INFO_CATNUM] = "info_catnum",
[INFO_ID] = "info_id",
[INFO_PAYLOAD] = "info_payload",
[INFO_STATUS] = "info_status",
[INFO_LAUNCH_SITE] = "info_launch_site",
[INFO_LAUNCH_DATE] = "info_launch_date",
[INFO_SOURCE] = "info_source",
[INFO_DECAY_DATE] = "info_decay_date",
[INFO_ORBITAL_STATUS] = "info_status_code",
[INFO_PERIOD] = "info_period",
[INFO_INCLINATION] = "info_inclination",
[INFO_APOGEE] = "info_apogee",
[INFO_PERIGEE] = "info_perigee",
[INFO_RADAR_CS] = "info_radar_cs",
[INFO_POSITION_TEME] = "info_position_teme",
[INFO_POSITION_ECEF] = "info_position_ecef",
[INFO_POSITION_LLH] = "info_position_llh",
[INFO_VELOCITY] = "info_velocity",
};

static void fmt_scdate(gchar *buf, gulong n, struct SCDate *date);
static void fmt_coords(gchar *buf, gulong n, double x, double y, double z);

static GtkLabel *info_items[NUM_INFO_ITEMS];
static struct Satellite *satellite = NULL;

void info_init(GtkBuilder *builder)
{
unsigned i;
for (i = 0; i < NUM_INFO_ITEMS; i++)
info_items[i] = GTK_LABEL(gtk_builder_get_object(builder, info_item_ids[i]));
}

void fmt_scdate(gchar *buf, gulong n, struct SCDate *date)
{
g_snprintf(buf, n, "%04u-%02u-%02u", date->year, date->month, date->day);
}

void info_show(struct Satellite *sat)
{
gchar buf[11];
satellite = sat;
gtk_label_set_text(info_items[INFO_NAME], satellite->name);
g_snprintf(buf, 11, "%05u", satellite->satcat.catnum);
gtk_label_set_text(info_items[INFO_CATNUM], buf);
gtk_label_set_text(info_items[INFO_ID], satellite->satcat.id);
gtk_label_set_text(info_items[INFO_PAYLOAD], ((satellite->satcat.payload) ? "YES" : "NO"));
gtk_label_set_text(info_items[INFO_STATUS], sc_status_str(satellite->satcat.opstat));
gtk_label_set_text(info_items[INFO_LAUNCH_SITE], sc_launch_site_str(SC_STR5_TO_CODE(satellite->satcat.launch_site)));
fmt_scdate(buf, 11, &satellite->satcat.launch_date);
gtk_label_set_text(info_items[INFO_LAUNCH_DATE], buf);
gtk_label_set_text(info_items[INFO_SOURCE], sc_source_str(SC_STR5_TO_CODE(satellite->satcat.source)));
fmt_scdate(buf, 11, &satellite->satcat.decay_date);
gtk_label_set_text(info_items[INFO_DECAY_DATE], buf);
memcpy(buf, satellite->satcat.status_code, 3);
buf[3] = '\0';
gtk_label_set_text(info_items[INFO_ORBITAL_STATUS], buf);
g_snprintf(buf, 11, "%07.1f", satellite->satcat.period);
gtk_label_set_text(info_items[INFO_PERIOD], buf);
g_snprintf(buf, 11, "%05.1f", satellite->satcat.inc_deg);
gtk_label_set_text(info_items[INFO_INCLINATION], buf);
g_snprintf(buf, 11, "%06u", satellite->satcat.apogee);
gtk_label_set_text(info_items[INFO_APOGEE], buf);
g_snprintf(buf, 11, "%06u", satellite->satcat.perigee);
gtk_label_set_text(info_items[INFO_PERIGEE], buf);
g_snprintf(buf, 11, "%08.4f", satellite->satcat.radar_cs);
gtk_label_set_text(info_items[INFO_RADAR_CS], buf);
}

void info_hide(void)
{
satellite = NULL;
unsigned i;
for (i = 0; i < NUM_INFO_ITEMS; i++)
gtk_label_set_text(info_items[i], "");
}

void fmt_coords(gchar *buf, gulong n, double x, double y, double z)
{
g_snprintf(buf, n, "X=%011.3f\nY=%011.3f\nZ=%011.3f", x, y, z);
}

void info_tic(void)
{
if (satellite) {
gchar buf[48];
double r[3], v[3];
getRVForDate(&satellite->tle, e_phys.epoch_ms, r, v);

double vel = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
g_snprintf(buf, 48, "%08.5f", vel);

gtk_label_set_text(info_items[INFO_VELOCITY], buf);
fmt_coords(buf, 48, r[0], r[1], r[2]);
gtk_label_set_text(info_items[INFO_POSITION_TEME], buf);

mat3 t; /* TEME to ECEF */
glm_vec3_copy((vec3){ 0.f, 0.f, 1.f }, t[2]);
glm_vec3_copy((vec3){ (float)cos(e_phys.gmst), (float)-sin(e_phys.gmst), 0.f }, t[0]);
glm_vec3_cross(t[2], t[0], t[1]);
glm_vec3_norm(t[1]);

vec3 rf, recef;
glm_vec3_copy((vec3){r[0], r[1], r[2]}, rf);
glm_mat3_mulv(t, rf, recef);
fmt_coords(buf, 48, recef[0], recef[1], recef[2]);
gtk_label_set_text(info_items[INFO_POSITION_ECEF], buf);

float lgt = atan2f(recef[1], recef[0]) * (180.f / (float)G_PI);
float algt = fabsf(lgt);
float lat = atan2f(recef[2], glm_vec2_norm(recef)) * (180.f / (float)G_PI);
float alat = fabsf(lat);
float tmp;
g_snprintf(buf, 48, "%02u\u00B0%02u'%c\n%03u\u00B0%02u'%c\n%011.3f",
(unsigned)alat, (unsigned)(modff(alat, &tmp) * 60.f), ((signbit(lat)) ? 'S' : 'N'),
(unsigned)algt, (unsigned)(modff(algt, &tmp) * 60.f), ((signbit(lgt)) ? 'W' : 'E'),
(double)glm_vec3_norm(recef));
gtk_label_set_text(info_items[INFO_POSITION_LLH], buf);
}
}
13 changes: 13 additions & 0 deletions src/ui/info.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#ifndef __INFO_H__
#define __INFO_H__

#include "ui.h"
#include "satellite.h"

void info_init(GtkBuilder *builder);

void info_show(struct Satellite *satellite);
void info_hide(void);
void info_tic(void);

#endif /* __INFO_H__ */
2 changes: 2 additions & 0 deletions src/ui/ui.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "system.h"
#include "thread.h"
#include "timemgr.h"
#include "info.h"

const gchar *FILENAME_GUI = "res/ui/ui.glade";

Expand Down Expand Up @@ -66,6 +67,7 @@ void ui_init(int argc, char ***argv)
timemgr_init(builder);
catalog_init(builder);
setting_init(builder);
info_init(builder);

gtk_builder_connect_signals(builder, NULL);

Expand Down

0 comments on commit 0aecbf0

Please sign in to comment.