[Gpredict-svn] SF.net SVN: gpredict:[534] trunk
Real time satellite tracking and orbit prediction
Status: Beta
                
                Brought to you by:
                
                    csete
                    
                
            | 
     
      
      
      From: <cs...@us...> - 2009-11-30 16:51:23
      
     
   | 
Revision: 534
          http://gpredict.svn.sourceforge.net/gpredict/?rev=534&view=rev
Author:   csete
Date:     2009-11-30 16:51:16 +0000 (Mon, 30 Nov 2009)
Log Message:
-----------
First functional version of GtkEventList.
Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/gtk-event-list.c
    trunk/src/gtk-event-list.h
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-11-30 14:31:50 UTC (rev 533)
+++ trunk/ChangeLog	2009-11-30 16:51:16 UTC (rev 534)
@@ -1,3 +1,12 @@
+2009-11-30 Alexandru Csete <oz9aec at gmail.com>
+
+    * src/gtk-sat-module.c:
+    Include support for GtkEventList views.
+
+    * src/gtk-event-list.[ch]:
+    First functional version.
+
+
 2009-11-29 Alexandru Csete <oz9aec at gmail.com>
 
     * src/gtk-event-list.[ch]:
Modified: trunk/src/gtk-event-list.c
===================================================================
--- trunk/src/gtk-event-list.c	2009-11-30 14:31:50 UTC (rev 533)
+++ trunk/src/gtk-event-list.c	2009-11-30 16:51:16 UTC (rev 534)
@@ -49,13 +49,17 @@
 #include "gtk-sat-list-popup.h"
 
 
+#define EVENT_LIST_COL_DEF (EVENT_LIST_FLAG_NAME | EVENT_LIST_FLAG_AZ | EVENT_LIST_FLAG_EL | EVENT_LIST_FLAG_TIME)
 
+
 /** \brief Column titles indexed with column symb. refs. */
 const gchar *EVENT_LIST_COL_TITLE[EVENT_LIST_COL_NUMBER] = {
-    N_("Sat"),
+    N_("Satellite"),
     N_("Catnum"),
-    N_("A/L"),
-    N_("Time")
+    N_("Az"),
+    N_("El"),
+    N_("Event"),
+    N_("AOS/LOS")
 };
 
 
@@ -63,17 +67,34 @@
 const gchar *EVENT_LIST_COL_HINT[EVENT_LIST_COL_NUMBER] = {
     N_("Satellite Name"),
     N_("Catalogue Number"),
+    N_("Azimuth"),
+    N_("Elevation"),
     N_("Next event type (A: AOS, L: LOS)"),
     N_("Countdown until next event")
 };
 
+/* field alignments */
 const gfloat EVENT_LIST_COL_XALIGN[EVENT_LIST_COL_NUMBER] = {
     0.0, // name
     0.5, // catnum
+    1.0, // az
+    1.0, // el
     0.5, // event type
-    0.5, // time
+    1.0, // time
 };
 
+/* column head alignments */
+const gfloat EVENT_LIST_HEAD_XALIGN[EVENT_LIST_COL_NUMBER] = {
+    0.0, // name
+    0.5, // catnum
+    0.5, // az
+    0.5, // el
+    0.5, // event type
+    1.0, // time
+};
+
+
+
 static void          gtk_event_list_class_init (GtkEventListClass *class);
 static void          gtk_event_list_init       (GtkEventList      *list);
 static void          gtk_event_list_destroy    (GtkObject       *object);
@@ -103,6 +124,12 @@
                                               GtkTreeIter       *iter,
                                               gpointer           column);
 
+static void          degree_cell_data_function (GtkTreeViewColumn *col,
+                                                GtkCellRenderer   *renderer,
+                                                GtkTreeModel      *model,
+                                                GtkTreeIter       *iter,
+                                                gpointer           column);
+
 static gint event_cell_compare_function (GtkTreeModel *model,
                                          GtkTreeIter  *a,
                                          GtkTreeIter  *b,
@@ -214,30 +241,18 @@
 
 
     /* initialise column flags */
-    evlist->flags = 0;
-/*    if (columns > 0)
-        evlist->flags = columns;
-    else
-        evlist->flags = mod_cfg_get_int (cfgdata,
-                                         MOD_CFG_EVLIST_SECTION,
-                                         MOD_CFG_EVLIST_COLUMNS,
-                                         SAT_CFG_INT_EVLIST_COLUMNS);
-                                         */
-    
-    /* get refresh rate and cycle counter */
-/*    evlist->refresh = mod_cfg_get_int (cfgdata,
-                                       MOD_CFG_EVLIST_SECTION,
-                                       MOD_CFG_EVLIST_REFRESH,
-                                       SAT_CFG_INT_EVLIST_REFRESH);
-                                       */
-    evlist->refresh = 1000;
+    evlist->flags = EVENT_LIST_COL_DEF;
 
+    /* FIXME: Not used */
+    evlist->refresh = 3;
     evlist->counter = 1;
 
     /* create the tree view and add columns */
     evlist->treeview = gtk_tree_view_new ();
 
-    gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (evlist->treeview), FALSE);
+    /* visual appearance of table */
+    gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (evlist->treeview), TRUE);
+    gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (evlist->treeview), GTK_TREE_VIEW_GRID_LINES_NONE);
 
     /* create treeview columns */
     for (i = 0; i < EVENT_LIST_COL_NUMBER; i++) {
@@ -249,11 +264,12 @@
                                                            renderer,
                                                            "text", i,
                                                            NULL);
+
         gtk_tree_view_insert_column (GTK_TREE_VIEW (evlist->treeview),
                                      column, -1);
 
         /* only aligns the headers */
-        gtk_tree_view_column_set_alignment (column, 0.5);
+        gtk_tree_view_column_set_alignment (column, EVENT_LIST_HEAD_XALIGN[i]);
 
         /* set sort id */
         gtk_tree_view_column_set_sort_column_id (column, i);
@@ -262,9 +278,9 @@
         check_and_set_cell_renderer (column, renderer, i);
 
         /* hide columns that have not been specified */
-        /*if (!(evlist->flags & (1 << i))) {
+        if (!(evlist->flags & (1 << i))) {
             gtk_tree_view_column_set_visible (column, FALSE);
-        }*/
+        }
         
     }
 
@@ -310,16 +326,17 @@
     GtkListStore *liststore;
 
 
-    liststore = gtk_list_store_new (SAT_LIST_COL_NUMBER,
+    liststore = gtk_list_store_new (EVENT_LIST_COL_NUMBER,
                                     G_TYPE_STRING,     // name
                                     G_TYPE_INT,        // catnum
+                                    G_TYPE_DOUBLE,     // az
+                                    G_TYPE_DOUBLE,     // el
                                     G_TYPE_BOOLEAN,    // TRUE if AOS, FALSE if LOS
                                     G_TYPE_DOUBLE);    // time
 
     /* add each satellite from hash table */
     g_hash_table_foreach (sats, event_list_add_satellites, liststore);
 
-
     return GTK_TREE_MODEL (liststore);
 }
 
@@ -343,6 +360,8 @@
     gtk_list_store_set (store, &item,
                         EVENT_LIST_COL_NAME, sat->nickname,
                         EVENT_LIST_COL_CATNUM, sat->tle.catnr,
+                        EVENT_LIST_COL_AZ, sat->az,
+                        EVENT_LIST_COL_EL, sat->el,
                         EVENT_LIST_COL_EVT, (sat->el >= 0) ? TRUE : FALSE,
                         EVENT_LIST_COL_TIME, 0.0,
                         -1);    
@@ -357,6 +376,7 @@
     GtkEventList   *evlist = GTK_EVENT_LIST (widget);
 
 
+
     /* first, do some sanity checks */
     if ((evlist == NULL) || !IS_GTK_EVENT_LIST (evlist)) {
         sat_log_log (SAT_LOG_LEVEL_BUG,
@@ -364,7 +384,14 @@
                      __FUNCTION__);
     }
 
+    /* get and tranverse the model */
+    model = gtk_tree_view_get_model (GTK_TREE_VIEW (evlist->treeview));
 
+    /* update */
+    gtk_tree_model_foreach (model, event_list_update_sats, evlist);
+
+
+#if 0
     /* check refresh rate */
     if (evlist->counter < evlist->refresh) {
         evlist->counter++;
@@ -378,6 +405,7 @@
         /* update */
         gtk_tree_model_foreach (model, event_list_update_sats, evlist);
     }
+#endif
 }
 
 
@@ -387,11 +415,10 @@
                                         GtkTreeIter  *iter,
                                         gpointer      data)
 {
-    GtkEventList *satlist = GTK_EVENT_LIST (data);
+    GtkEventList *evlist = GTK_EVENT_LIST (data);
     guint      *catnum;
     sat_t      *sat;
-    gchar      *buff;
-    gint        retcode;
+    gdouble     number, now;
 
 
     /* get the catalogue number for this row
@@ -399,7 +426,7 @@
     */
     catnum = g_new0 (guint, 1);
     gtk_tree_model_get (model, iter, EVENT_LIST_COL_CATNUM, catnum, -1);
-    sat = SAT (g_hash_table_lookup (satlist->satellites, catnum));
+    sat = SAT (g_hash_table_lookup (evlist->satellites, catnum));
 
     if (sat == NULL) {
         /* satellite not tracked anymore => remove */
@@ -415,28 +442,34 @@
     }
     else {
 
-
-        /**** FIXME *****/
         /* update data */
+        now = evlist->tstamp;
 
+        if (sat->el > 0.0) {
+            if (sat->los > 0.0) {
+                number = sat->los - now;
+            }
+            else {
+                number = -1.0;   /* Sat is staionary or no event */
+            }
+        }
+        else {
+            if (sat->aos > 0.0) {
+                number = sat->aos - now;
+            }
+            else {
+                number = -1.0; /* Sat is staionary or no event */
+            }
+        }
+
         /* store new data */
-/*        gtk_list_store_set (GTK_LIST_STORE (model), iter,
-                            SAT_LIST_COL_AZ, sat->az,
-                            SAT_LIST_COL_EL, sat->el,
-                            SAT_LIST_COL_RANGE, sat->range,
-                            SAT_LIST_COL_RANGE_RATE, sat->range_rate,
-                            SAT_LIST_COL_LAT, sat->ssplat,
-                            SAT_LIST_COL_LON, sat->ssplon,
-                            SAT_LIST_COL_FOOTPRINT, sat->footprint,
-                            SAT_LIST_COL_ALT, sat->alt,
-                            SAT_LIST_COL_VEL, sat->velo,
-                            SAT_LIST_COL_MA, sat->ma,
-                            SAT_LIST_COL_PHASE, sat->phase,
-                            SAT_LIST_COL_ORBIT, sat->orbit,
+        gtk_list_store_set (GTK_LIST_STORE (model), iter,
+                            EVENT_LIST_COL_AZ, sat->az,
+                            EVENT_LIST_COL_EL, sat->el,
+                            EVENT_LIST_COL_EVT, (sat->el >= 0) ? TRUE : FALSE,
+                            EVENT_LIST_COL_TIME, number,
                             -1);
-*/
 
-
     }
 
     g_free (catnum);
@@ -458,6 +491,16 @@
     switch (i) {
 
         /* Event type */
+    case EVENT_LIST_COL_AZ:
+    case EVENT_LIST_COL_EL:
+        gtk_tree_view_column_set_cell_data_func (column,
+                                                 renderer,
+                                                 degree_cell_data_function,
+                                                 GUINT_TO_POINTER (i),
+                                                 NULL);
+        break;
+
+        /* Event type */
     case EVENT_LIST_COL_EVT:
         gtk_tree_view_column_set_cell_data_func (column,
                                                  renderer,
@@ -503,11 +546,11 @@
     gtk_tree_model_get (model, iter, coli, &value, -1);
 
 
-    if (value = TRUE) {
-        buff = g_strdup ("L");
+    if (value == TRUE) {
+        buff = g_strdup (_("LOS"));
     }
     else {
-        buff = g_strdup ("A");
+        buff = g_strdup (_("AOS"));
     }
 
     /* render the cell */
@@ -527,16 +570,62 @@
     gdouble    number;
     gchar     *buff;
     guint      coli = GPOINTER_TO_UINT (column);
-    time_t     t;
-    guint size;
 
+    guint         h,m,s;
+    gchar        *ch,*cm,*cs;
 
+
     /* get cell data */
     gtk_tree_model_get (model, iter, coli, &number, -1);
 
     /* format the time code */
-    buff = g_strdup_printf ("%.6f", number);
+    if (number < 0.0) {
+        buff = g_strdup(_("Never"));
+    }
+    else {
 
+        /* convert julian date to seconds */
+        s = (guint) (number * 86400);
+
+        /* extract hours */
+        h = (guint) floor (s/3600);
+        s -= 3600*h;
+
+        /* leading zero */
+        if ((h > 0) && (h < 10))
+            ch = g_strdup ("0");
+        else
+            ch = g_strdup ("");
+
+        /* extract minutes */
+        m = (guint) floor (s/60);
+        s -= 60*m;
+
+        /* leading zero */
+        if (m < 10)
+            cm = g_strdup ("0");
+        else
+            cm = g_strdup ("");
+
+        /* leading zero */
+        if (s < 10)
+            cs = g_strdup (":0");
+        else
+            cs = g_strdup (":");
+
+        if (h > 0) {
+            buff = g_strdup_printf ("%s%d:%s%d%s%d", ch, h, cm, m, cs, s);
+        }
+        else {
+            buff = g_strdup_printf ("%s%d%s%d", cm, m, cs, s);
+        }
+
+        g_free (ch);
+        g_free (cm);
+        g_free (cs);
+
+    }
+
     /* render the cell */
     g_object_set (renderer, "text", buff, NULL);
     g_free (buff);
@@ -544,6 +633,31 @@
 }
 
 
+
+/* general floats with 2 digits + degree char. Used for Az and El */
+static void degree_cell_data_function (GtkTreeViewColumn *col,
+                                       GtkCellRenderer   *renderer,
+                                       GtkTreeModel      *model,
+                                       GtkTreeIter       *iter,
+                                       gpointer           column)
+{
+    gdouble    number;
+    gchar     *buff;
+    guint      coli = GPOINTER_TO_UINT (column);
+
+
+    /* get the value */
+    gtk_tree_model_get (model, iter, coli, &number, -1);
+
+    /* format the number */
+    buff = g_strdup_printf ("%.2f\302\260", number);
+
+    /* render column */
+    g_object_set (renderer, "text", buff, NULL);
+    g_free (buff);
+}
+
+
 /** \brief Function to compare to Event cells.
   * \param model Pointer to the GtkTreeModel.
   * \param a Pointer to the first element.
Modified: trunk/src/gtk-event-list.h
===================================================================
--- trunk/src/gtk-event-list.h	2009-11-30 14:31:50 UTC (rev 533)
+++ trunk/src/gtk-event-list.h	2009-11-30 16:51:16 UTC (rev 534)
@@ -85,6 +85,8 @@
 typedef enum {
         EVENT_LIST_COL_NAME = 0,    /*!< Satellite name. */
         EVENT_LIST_COL_CATNUM,      /*!< Catalogue number. */
+        EVENT_LIST_COL_AZ,          /*!< Satellite Azimuth. */
+        EVENT_LIST_COL_EL,          /*!< Satellite Elevation. */
         EVENT_LIST_COL_EVT,         /*!< Next event (AOS or LOS). */
         EVENT_LIST_COL_TIME,        /*!< Time countdown. */
         EVENT_LIST_COL_NUMBER
@@ -96,6 +98,8 @@
 typedef enum {
         EVENT_LIST_FLAG_NAME       = 1 << EVENT_LIST_COL_NAME,        /*!< Satellite name. */
         EVENT_LIST_FLAG_CATNUM     = 1 << EVENT_LIST_COL_CATNUM,
+        EVENT_LIST_FLAG_AZ         = 1 << EVENT_LIST_COL_AZ,
+        EVENT_LIST_FLAG_EL         = 1 << EVENT_LIST_COL_EL,
         EVENT_LIST_FLAG_EVT        = 1 << EVENT_LIST_COL_EVT,         /*!< Next event (AOS or LOS) */
         EVENT_LIST_FLAG_TIME       = 1 << EVENT_LIST_COL_TIME,        /*!< Time countdown */
 } event_list_flag_t;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |