[Gpredict-svn] SF.net SVN: gpredict:[87] trunk/src
Real time satellite tracking and orbit prediction
Status: Beta
                
                Brought to you by:
                
                    csete
                    
                
            | 
     
      
      
      From: <cs...@us...> - 2008-09-06 12:02:13
      
     
   | 
Revision: 87
          http://gpredict.svn.sourceforge.net/gpredict/?rev=87&view=rev
Author:   csete
Date:     2008-09-06 12:02:22 +0000 (Sat, 06 Sep 2008)
Log Message:
-----------
Finished implementation of freq controller.
Modified Paths:
--------------
    trunk/src/gtk-freq-knob.c
    trunk/src/gtk-freq-knob.h
    trunk/src/gtk-rig-ctrl.c
    trunk/src/gtk-rig-ctrl.h
    trunk/src/gtk-rot-knob.c
Modified: trunk/src/gtk-freq-knob.c
===================================================================
--- trunk/src/gtk-freq-knob.c	2008-09-05 21:57:21 UTC (rev 86)
+++ trunk/src/gtk-freq-knob.c	2008-09-06 12:02:22 UTC (rev 87)
@@ -29,11 +29,14 @@
  *
  * More info...
  * 
+ *      1 222.333 444 MHz
+ * 
  * \bug This should be a generic widget, not just frequency specific
  * 
  */
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
+#include <math.h>
 #include "gtk-freq-knob.h"
 #ifdef HAVE_CONFIG_H
 #  include <build-config.h>
@@ -44,13 +47,28 @@
 static void gtk_freq_knob_class_init (GtkFreqKnobClass *class);
 static void gtk_freq_knob_init       (GtkFreqKnob      *list);
 static void gtk_freq_knob_destroy    (GtkObject       *object);
-
 static void gtk_freq_knob_update     (GtkFreqKnob *knob);
+static void button_clicked_cb        (GtkWidget *button, gpointer data);
 
-
 static GtkHBoxClass *parent_class = NULL;
 
+#define FMTSTR "<span size='xx-large'>%c</span>"
 
+/* x-index in table for buttons and labels */
+static const guint idx[] = {
+    0,
+    2,
+    3,
+    4,
+    6,
+    7,
+    8,
+    10,
+    11,
+    12
+};
+
+
 GType
 gtk_freq_knob_get_type ()
 {
@@ -104,7 +122,8 @@
 static void
 gtk_freq_knob_init (GtkFreqKnob *knob)
 {
-
+    knob->min = 0.0;
+    knob->max = 9999999999.0;
     
 }
 
@@ -126,14 +145,72 @@
 {
     GtkWidget *widget;
     GtkWidget *table;
+    GtkWidget *label;
+    guint      i;
+    gint       delta;
 
 
 	widget = g_object_new (GTK_TYPE_FREQ_KNOB, NULL);
 
     GTK_FREQ_KNOB(widget)->value = val;
+    
+    table = gtk_table_new (3, 14, FALSE);
+    
+    /* create buttons and labels */
+    for (i = 0; i < 10; i++) {
+        /* labels */
+        GTK_FREQ_KNOB(widget)->digits[i] = gtk_label_new (NULL);
+        gtk_table_attach (GTK_TABLE (table), GTK_FREQ_KNOB(widget)->digits[i],
+                          idx[i], idx[i]+1, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
+    
+        /* UP buttons */
+        GTK_FREQ_KNOB(widget)->buttons[i] = gtk_button_new ();
+        
+        label = gtk_label_new ("\342\226\264");
+        gtk_container_add (GTK_CONTAINER(GTK_FREQ_KNOB(widget)->buttons[i]),
+                           label);
+        gtk_button_set_relief (GTK_BUTTON(GTK_FREQ_KNOB(widget)->buttons[i]),
+                               GTK_RELIEF_NONE);
+        delta = (gint) pow(10,9-i);
+        g_object_set_data (G_OBJECT (GTK_FREQ_KNOB(widget)->buttons[i]),
+                           "delta", GINT_TO_POINTER(delta)); 
+        gtk_table_attach (GTK_TABLE (table), GTK_FREQ_KNOB(widget)->buttons[i],
+                          idx[i], idx[i]+1, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
+        g_signal_connect (GTK_FREQ_KNOB(widget)->buttons[i], "clicked",
+                          G_CALLBACK (button_clicked_cb), widget);
+        
+        /* DOWN buttons */
+        GTK_FREQ_KNOB(widget)->buttons[i+10] = gtk_button_new ();
+        
+        label = gtk_label_new ("\342\226\276");
+        gtk_container_add (GTK_CONTAINER(GTK_FREQ_KNOB(widget)->buttons[i+10]),
+                           label);
+        gtk_button_set_relief (GTK_BUTTON(GTK_FREQ_KNOB(widget)->buttons[i+10]),
+                               GTK_RELIEF_NONE);
+        g_object_set_data (G_OBJECT (GTK_FREQ_KNOB(widget)->buttons[i+10]),
+                           "delta", GINT_TO_POINTER(-delta));
+        gtk_table_attach (GTK_TABLE (table), GTK_FREQ_KNOB(widget)->buttons[i+10],
+                          idx[i], idx[i]+1, 2, 3, GTK_SHRINK, GTK_SHRINK, 0, 0);
+        g_signal_connect (GTK_FREQ_KNOB(widget)->buttons[i+10], "clicked",
+                          G_CALLBACK (button_clicked_cb), widget);
+
+    }
+    
+    /* Add misc labels */
+    label = gtk_label_new (NULL);
+    gtk_label_set_markup (GTK_LABEL (label), "<span size='xx-large'>.</span>");
+    gtk_table_attach (GTK_TABLE (table), label, 5, 6, 1, 2,
+                      GTK_SHRINK, GTK_SHRINK, 0, 0);
+    label = gtk_label_new (NULL);
+    gtk_label_set_markup (GTK_LABEL (label), "<span size='xx-large'> MHz</span>");
+    gtk_table_attach (GTK_TABLE (table), label, 13, 14, 1, 2,
+                      GTK_SHRINK, GTK_SHRINK, 0, 0);
+    
+    
     gtk_freq_knob_update (GTK_FREQ_KNOB(widget));
 
-	gtk_widget_show_all (widget);
+    gtk_container_add (GTK_CONTAINER (widget), table);
+    gtk_widget_show_all (widget);
 
 	return widget;
 }
@@ -147,11 +224,13 @@
 void
 gtk_freq_knob_set_value (GtkFreqKnob *knob, gdouble val)
 {
-    /* set the new value */
-    knob->value = val;
+    if ((val >= knob->min) && (val <= knob->max)) {
+        /* set the new value */
+        knob->value = val;
     
-    /* update the display */
-    gtk_freq_knob_update (knob);
+        /* update the display */
+        gtk_freq_knob_update (knob);
+    }
 }
 
 
@@ -177,5 +256,41 @@
 static void
 gtk_freq_knob_update     (GtkFreqKnob *knob)
 {
+    gchar b[11];
+    gchar *buff;
+    guint i;
     
+    g_ascii_formatd (b, 11, "%10.0f", fabs(knob->value)); 
+    
+    /* set label markups */
+    for (i = 0; i < 10; i++) {
+        buff = g_strdup_printf (FMTSTR, b[i]);
+        gtk_label_set_markup (GTK_LABEL(knob->digits[i]), buff);
+        g_free (buff);
+    }
+
 }
+
+
+/** \brief Button clicked event.
+ * \param button The button that was clicked.
+ * \param data Pointer to the GtkFreqKnob widget.
+ * 
+ */
+static void
+button_clicked_cb (GtkWidget *button, gpointer data)
+{
+    GtkFreqKnob *knob = GTK_FREQ_KNOB (data);
+    gdouble delta = GPOINTER_TO_INT(g_object_get_data (G_OBJECT (button), "delta"));
+    
+    if ((delta > 0.0) && ((knob->value + delta) <= knob->max)) {
+        knob->value += delta;
+    }
+    else if ((delta < 0.0) && ((knob->value + delta) >= knob->min)) {
+        knob->value += delta;
+    }
+    
+    gtk_freq_knob_update (knob);
+
+}
+
Modified: trunk/src/gtk-freq-knob.h
===================================================================
--- trunk/src/gtk-freq-knob.h	2008-09-05 21:57:21 UTC (rev 86)
+++ trunk/src/gtk-freq-knob.h	2008-09-06 12:02:22 UTC (rev 87)
@@ -60,7 +60,12 @@
 struct _gtk_freq_knob
 {
 	GtkVBox vbox;
+    
+    GtkWidget *digits[10];   /*!< Labels for the digits */
+    GtkWidget *buttons[20];  /*!< Buttons; 0..9 up; 10..19 down */
 	
+    gdouble min;
+    gdouble max;
     gdouble value;
 };
 
Modified: trunk/src/gtk-rig-ctrl.c
===================================================================
--- trunk/src/gtk-rig-ctrl.c	2008-09-05 21:57:21 UTC (rev 86)
+++ trunk/src/gtk-rig-ctrl.c	2008-09-06 12:02:22 UTC (rev 87)
@@ -56,11 +56,10 @@
 static void gtk_rig_ctrl_destroy    (GtkObject       *object);
 
 
-static GtkWidget *create_az_widgets (GtkRigCtrl *ctrl);
-static GtkWidget *create_el_widgets (GtkRigCtrl *ctrl);
+static GtkWidget *create_sat_widgets (GtkRigCtrl *ctrl);
+static GtkWidget *create_rig_widgets (GtkRigCtrl *ctrl);
 static GtkWidget *create_target_widgets (GtkRigCtrl *ctrl);
 static GtkWidget *create_conf_widgets (GtkRigCtrl *ctrl);
-static GtkWidget *create_plot_widget (GtkRigCtrl *ctrl);
 
 static void store_sats (gpointer key, gpointer value, gpointer user_data);
 
@@ -193,20 +192,18 @@
     gdk_rgb_find_color (gtk_widget_get_colormap (widget), &ColGreen);
 
     /* create contents */
-    table = gtk_table_new (3, 2, TRUE);
+    table = gtk_table_new (2, 2, FALSE);
     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
     gtk_container_set_border_width (GTK_CONTAINER (table), 10);
-    gtk_table_attach (GTK_TABLE (table), create_az_widgets (GTK_RIG_CTRL (widget)),
+    gtk_table_attach (GTK_TABLE (table), create_sat_widgets (GTK_RIG_CTRL (widget)),
                       0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
-    gtk_table_attach (GTK_TABLE (table), create_el_widgets (GTK_RIG_CTRL (widget)),
+    gtk_table_attach (GTK_TABLE (table), create_rig_widgets (GTK_RIG_CTRL (widget)),
                       1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
     gtk_table_attach (GTK_TABLE (table), create_target_widgets (GTK_RIG_CTRL (widget)),
                       0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
     gtk_table_attach (GTK_TABLE (table), create_conf_widgets (GTK_RIG_CTRL (widget)),
-                      0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);
-    gtk_table_attach (GTK_TABLE (table), create_plot_widget (GTK_RIG_CTRL (widget)),
-                      1, 2, 1, 3, GTK_FILL, GTK_FILL, 0, 0);
+                      1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
 
     gtk_container_add (GTK_CONTAINER (widget), table);
     
@@ -250,52 +247,45 @@
 }
 
 
-/** \brief Create azimuth control widgets.
+/** \brief Create Satellite freq control widgets.
  * \param ctrl Pointer to the GtkRigCtrl widget.
  * 
  * This function creates and initialises the widgets for controlling the
- * azimuth of the the rigator.
+ * satellite frequency.
  * 
- * TODO: RENAME!
  */
 static
-GtkWidget *create_az_widgets (GtkRigCtrl *ctrl)
+GtkWidget *create_sat_widgets (GtkRigCtrl *ctrl)
 {
     GtkWidget   *frame;
-    GtkWidget   *table;
-    GtkWidget   *label;
     
     
-    frame = gtk_frame_new (_("Azimuth"));
+    frame = gtk_frame_new (_("Satellite"));
     
-    table = gtk_table_new (2, 2, FALSE);
-    gtk_container_set_border_width (GTK_CONTAINER (table), 5);
-    gtk_table_set_col_spacings (GTK_TABLE (table), 5);
-    gtk_table_set_row_spacings (GTK_TABLE (table), 5);
-    gtk_container_add (GTK_CONTAINER (frame), table);
     
+    ctrl->SatFreq = gtk_freq_knob_new (145890000.0);
+    gtk_container_add (GTK_CONTAINER (frame), ctrl->SatFreq);
     
+    
     return frame;
 }
 
 
-/** \brief Create elevation control widgets.
+/** \brief Create radio freq display widgets.
  * \param ctrl Pointer to the GtkRigCtrl widget.
  * 
- * This function creates and initialises the widgets for controlling the
- * elevation of the the rigator.
- * 
- * TODO: RENAME
+ * This function creates and initialises the widgets for displaying the
+ * frequency of the radio.
  */
 static
-GtkWidget *create_el_widgets (GtkRigCtrl *ctrl)
+GtkWidget *create_rig_widgets (GtkRigCtrl *ctrl)
 {
     GtkWidget   *frame;
     GtkWidget   *table;
     GtkWidget   *label;
 
     
-    frame = gtk_frame_new (_("Elevation"));
+    frame = gtk_frame_new (_("Radio"));
 
     table = gtk_table_new (2, 2, FALSE);
     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
@@ -466,20 +456,6 @@
 }
 
 
-/** \brief Create target widgets.
- * \param ctrl Pointer to the GtkRigCtrl widget.
- * 
- * FIXME: REMOVE
- */
-static
-GtkWidget *create_plot_widget (GtkRigCtrl *ctrl)
-{
-    GtkWidget *frame;
-    
-    frame = gtk_frame_new (NULL);
-    
-    return frame;
-}
 
 
 /** \brief Copy satellite from hash table to singly linked list.
Modified: trunk/src/gtk-rig-ctrl.h
===================================================================
--- trunk/src/gtk-rig-ctrl.h	2008-09-05 21:57:21 UTC (rev 86)
+++ trunk/src/gtk-rig-ctrl.h	2008-09-06 12:02:22 UTC (rev 87)
@@ -62,10 +62,13 @@
 {
 	GtkVBox vbox;
     
+    GtkWidget *SatFreq;
    
     /* other widgets */
-    GtkWidget *DevSel;
+    GtkWidget *DevSel;   /*!< Device selector */
+    GtkWidget *LO;       /*!< Local oscillator */
     
+    
     GSList *sats;       /*!< List of sats in parent module */
     sat_t  *target;     /*!< Target satellite */
     pass_t *pass;       /*!< Next pass of target satellite */
Modified: trunk/src/gtk-rot-knob.c
===================================================================
--- trunk/src/gtk-rot-knob.c	2008-09-05 21:57:21 UTC (rev 86)
+++ trunk/src/gtk-rot-knob.c	2008-09-06 12:02:22 UTC (rev 87)
@@ -57,6 +57,9 @@
 static GtkHBoxClass *parent_class = NULL;
 
 
+        
+        
+
 GType
 gtk_rot_knob_get_type ()
 {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |