Thread: [Gpredict-svn] SF.net SVN: gpredict:[56] trunk/src
Real time satellite tracking and orbit prediction
Status: Beta
                
                Brought to you by:
                
                    csete
                    
                
            | 
      
      
      From: <cs...@us...> - 2008-08-20 14:03:26
       | 
| Revision: 56
          http://gpredict.svn.sourceforge.net/gpredict/?rev=56&view=rev
Author:   csete
Date:     2008-08-20 14:03:35 +0000 (Wed, 20 Aug 2008)
Log Message:
-----------
Changed from hamlib C API to TCP based configuration.
Modified Paths:
--------------
    trunk/src/radio-conf.c
    trunk/src/radio-conf.h
    trunk/src/rotor-conf.c
    trunk/src/rotor-conf.h
Modified: trunk/src/radio-conf.c
===================================================================
--- trunk/src/radio-conf.c	2008-08-20 13:03:23 UTC (rev 55)
+++ trunk/src/radio-conf.c	2008-08-20 14:03:35 UTC (rev 56)
@@ -35,15 +35,7 @@
 #include "radio-conf.h"
 
 #define GROUP           "Radio"
-#define KEY_MODEL       "Model"
-#define KEY_ID          "ID"
-#define KEY_TYPE        "Type"
-#define KEY_PORT        "Port"
-#define KEY_SPEED       "Speed"
-#define KEY_CIV         "CIV"
-#define KEY_EXT         "EXT"
-#define KEY_DTR         "DTR"
-#define KEY_RTS         "RTS"
+#define KEY_HOST        "Host"
 
 
 /** \brief Read radio configuration.
@@ -86,15 +78,7 @@
     g_free (fname);
     
     /* read parameters */
-    conf->model = g_key_file_get_string (cfg, GROUP, KEY_MODEL, NULL);
-    conf->id = g_key_file_get_integer (cfg, GROUP, KEY_ID, NULL);
-    conf->type = g_key_file_get_integer (cfg, GROUP, KEY_TYPE, NULL);
-    conf->port = g_key_file_get_string (cfg, GROUP, KEY_PORT, NULL);
-    conf->speed = g_key_file_get_integer (cfg, GROUP, KEY_SPEED, NULL);
-    conf->civ = g_key_file_get_integer (cfg, GROUP, KEY_CIV, NULL);
-    conf->ext = g_key_file_get_boolean (cfg, GROUP, KEY_EXT, NULL);
-    conf->dtr = g_key_file_get_integer (cfg, GROUP, KEY_DTR, NULL);
-    conf->rts = g_key_file_get_integer (cfg, GROUP, KEY_RTS, NULL);
+    conf->host = g_key_file_get_string (cfg, GROUP, KEY_HOST, NULL);
     
     g_key_file_free (cfg);
     
@@ -123,15 +107,7 @@
     /* create a config structure */
     cfg = g_key_file_new();
     
-    g_key_file_set_string (cfg, GROUP, KEY_MODEL, conf->model);
-    g_key_file_set_integer (cfg, GROUP, KEY_ID, conf->id);
-    g_key_file_set_integer (cfg, GROUP, KEY_TYPE, conf->type);
-    g_key_file_set_string (cfg, GROUP, KEY_PORT, conf->port);
-    g_key_file_set_integer (cfg, GROUP, KEY_SPEED, conf->speed);
-    g_key_file_set_integer (cfg, GROUP, KEY_CIV, conf->civ);
-    g_key_file_set_boolean (cfg, GROUP, KEY_EXT, conf->ext);
-    g_key_file_set_integer (cfg, GROUP, KEY_DTR, conf->dtr);
-    g_key_file_set_integer (cfg, GROUP, KEY_RTS, conf->rts);
+    g_key_file_set_string (cfg, GROUP, KEY_HOST, conf->host);
     
     /* convert to text sdata */
     data = g_key_file_to_data (cfg, &len, NULL);
Modified: trunk/src/radio-conf.h
===================================================================
--- trunk/src/radio-conf.h	2008-08-20 13:03:23 UTC (rev 55)
+++ trunk/src/radio-conf.h	2008-08-20 14:03:35 UTC (rev 56)
@@ -34,40 +34,15 @@
 
 
 
-/** \brief RS232 control line usage definitions. */
-typedef enum {
-    LINE_UNDEF = 0,     /*!< Undefined. */
-    LINE_OFF,           /*!< Line should be permanently OFF. */
-    LINE_ON,            /*!< Line should be permanently ON. */
-    LINE_PTT,           /*!< Line used for PTT control. */
-    LINE_CW             /*!< Line used for CW keying. */
-} ctrl_stat_t;
-
-
-/** \brief Radio type definitions. */
-typedef enum {
-    RADIO_TYPE_RX = 0,      /*!< Radio used as receiver only. */
-    RADIO_TYPE_TX,          /*!< Radio used as TX only. */
-    RADIO_TYPE_TRX,         /*!< Radio use as both TX and RX. */
-    RADIO_TYPE_FULL_DUP     /*!< Full duplex radio. */
-} radio_type_t;
-
 /** \brief Radio configuration. */
 typedef struct {
-    gchar       *name;      /*!< Configuration file name, less .rig. */
-    gchar       *model;     /*!< Radio model, e.g. ICOM IC-910H. */
-    guint        id;        /*!< Hamlib ID. */
-    radio_type_t type;      /*!< Radio type. */
-    gchar       *port;      /*!< Device name, e.g. /dev/ttyS0. */
-    guint        speed;     /*!< Serial speed. */
-    guint        civ;       /*!< ICOM CI-V address. */
-    gboolean     ext;       /*!< Use built in extensions if available. */
-    ctrl_stat_t  dtr;       /*!< DTR line usage. */
-    ctrl_stat_t  rts;       /*!< PTT line usage. */
+    gchar       *name;      /*!< Configuration file name, without .rig. */
+    gchar       *host;      /*!< hostname:port */
 } radio_conf_t;
 
 
 gboolean radio_conf_read (radio_conf_t *conf);
 void radio_conf_save (radio_conf_t *conf);
 
+
 #endif
Modified: trunk/src/rotor-conf.c
===================================================================
--- trunk/src/rotor-conf.c	2008-08-20 13:03:23 UTC (rev 55)
+++ trunk/src/rotor-conf.c	2008-08-20 14:03:35 UTC (rev 56)
@@ -35,11 +35,7 @@
 #include "rotor-conf.h"
 
 #define GROUP           "Rotator"
-#define KEY_MODEL       "Model"
-#define KEY_ID          "ID"
-#define KEY_TYPE        "Type"
-#define KEY_PORT        "Port"
-#define KEY_SPEED       "Speed"
+#define KEY_HOST        "Host"
 #define KEY_MINAZ       "MinAz"
 #define KEY_MAXAZ       "MaxAz"
 #define KEY_MINEL       "MinEl"
@@ -86,15 +82,11 @@
     g_free (fname);
     
     /* read parameters */
-    conf->model = g_key_file_get_string (cfg, GROUP, KEY_MODEL, NULL);
-    conf->id = g_key_file_get_integer (cfg, GROUP, KEY_ID, NULL);
-    conf->type = g_key_file_get_integer (cfg, GROUP, KEY_TYPE, NULL);
-    conf->port = g_key_file_get_string (cfg, GROUP, KEY_PORT, NULL);
-    conf->speed = g_key_file_get_integer (cfg, GROUP, KEY_SPEED, NULL);
-    conf->minaz = g_key_file_get_integer (cfg, GROUP, KEY_MINAZ, NULL);
-    conf->maxaz = g_key_file_get_integer (cfg, GROUP, KEY_MAXAZ, NULL);
-    conf->minel = g_key_file_get_integer (cfg, GROUP, KEY_MINEL, NULL);
-    conf->maxel = g_key_file_get_integer (cfg, GROUP, KEY_MAXEL, NULL);
+    conf->host = g_key_file_get_string (cfg, GROUP, KEY_HOST, NULL);
+    conf->minaz = g_key_file_get_double (cfg, GROUP, KEY_MINAZ, NULL);
+    conf->maxaz = g_key_file_get_double (cfg, GROUP, KEY_MAXAZ, NULL);
+    conf->minel = g_key_file_get_double (cfg, GROUP, KEY_MINEL, NULL);
+    conf->maxel = g_key_file_get_double (cfg, GROUP, KEY_MAXEL, NULL);
     
     g_key_file_free (cfg);
     
@@ -123,15 +115,11 @@
     /* create a config structure */
     cfg = g_key_file_new();
     
-    g_key_file_set_string (cfg, GROUP, KEY_MODEL, conf->model);
-    g_key_file_set_integer (cfg, GROUP, KEY_ID, conf->id);
-    g_key_file_set_integer (cfg, GROUP, KEY_TYPE, conf->type);
-    g_key_file_set_string (cfg, GROUP, KEY_PORT, conf->port);
-    g_key_file_set_integer (cfg, GROUP, KEY_SPEED, conf->speed);
-    g_key_file_set_integer (cfg, GROUP, KEY_MINAZ, conf->minaz);
-    g_key_file_set_integer (cfg, GROUP, KEY_MAXAZ, conf->maxaz);
-    g_key_file_set_integer (cfg, GROUP, KEY_MINEL, conf->minel);
-    g_key_file_set_integer (cfg, GROUP, KEY_MAXEL, conf->maxel);
+    g_key_file_set_string (cfg, GROUP, KEY_HOST, conf->host);
+    g_key_file_set_double (cfg, GROUP, KEY_MINAZ, conf->minaz);
+    g_key_file_set_double (cfg, GROUP, KEY_MAXAZ, conf->maxaz);
+    g_key_file_set_double (cfg, GROUP, KEY_MINEL, conf->minel);
+    g_key_file_set_double (cfg, GROUP, KEY_MAXEL, conf->maxel);
     
     /* convert to text sdata */
     data = g_key_file_to_data (cfg, &len, NULL);
Modified: trunk/src/rotor-conf.h
===================================================================
--- trunk/src/rotor-conf.h	2008-08-20 13:03:23 UTC (rev 55)
+++ trunk/src/rotor-conf.h	2008-08-20 14:03:35 UTC (rev 56)
@@ -35,26 +35,14 @@
 
 
 
-/** \brief Rotator type definitions. */
-typedef enum {
-    ROTOR_TYPE_AZ = 1,      /*!< Azimuth rotator. */
-    ROTOR_TYPE_EL = 2,      /*!< Elevation rotator. */
-    ROTOR_TYPE_AZEL = 3     /*!< Both azimuth and elevation rotator. */
-} rotor_type_t;
-
-
 /** \brief Rotator configuration. */
 typedef struct {
     gchar       *name;      /*!< Configuration file name, less .rot */
-    gchar       *model;     /*!< Rotator model. */
-    guint        id;        /*!< Hamlib ID. */
-    rotor_type_t type;      /*!< Rotator type. */
-    gchar       *port;      /*!< Device name, e.g. /dev/ttyS0. */
-    guint        speed;     /*!< Serial speed. */
-    gint         minaz;     /*!< Lower azimuth limit */
-    gint         maxaz;     /*!< Upper azimuth limit */
-    gint         minel;     /*!< Lower elevation limit */
-    gint         maxel;     /*!< Upper elevation limit */
+    gchar       *host;      /*!< hostname:port */
+    gdouble      minaz;     /*!< Lower azimuth limit */
+    gdouble      maxaz;     /*!< Upper azimuth limit */
+    gdouble      minel;     /*!< Lower elevation limit */
+    gdouble      maxel;     /*!< Upper elevation limit */
 } rotor_conf_t;
 
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-08-22 08:46:03
       | 
| Revision: 58
          http://gpredict.svn.sourceforge.net/gpredict/?rev=58&view=rev
Author:   csete
Date:     2008-08-22 08:46:10 +0000 (Fri, 22 Aug 2008)
Log Message:
-----------
Removed unnecessary columns.
Modified Paths:
--------------
    trunk/src/sat-pref-rig-data.h
    trunk/src/sat-pref-rot-data.h
Modified: trunk/src/sat-pref-rig-data.h
===================================================================
--- trunk/src/sat-pref-rig-data.h	2008-08-20 14:36:00 UTC (rev 57)
+++ trunk/src/sat-pref-rig-data.h	2008-08-22 08:46:10 UTC (rev 58)
@@ -31,15 +31,7 @@
 /** \brief Coumn definitions for radio list. */
 typedef enum {
     RIG_LIST_COL_NAME = 0,  /*!< File name. */
-    RIG_LIST_COL_MODEL,     /*!< Model, e.g. FT-847. */
-    RIG_LIST_COL_ID,        /*!< Hamlib ID. */
-    RIG_LIST_COL_TYPE,      /*!< Radio type (RX, TX, TRX, FULL_DUP. */
-    RIG_LIST_COL_PORT,      /*!< Port / Device, e.g. /dev/ttyS0. */
-    RIG_LIST_COL_SPEED,     /*!< Serial speed. */
-    RIG_LIST_COL_CIV,       /*!< CI-V address for Icom rigs. */
-    RIG_LIST_COL_EXT,       /*!< Use built-in extensions. */
-    RIG_LIST_COL_DTR,       /*!< DTR line usage */
-    RIG_LIST_COL_RTS,       /*!< RTS line usage */
+    RIG_LIST_COL_HOST,      /*!< Hostname, e.g. localhost:12000 */
     RIG_LIST_COL_NUM        /*!< The number of fields in the list. */
 } rig_list_col_t;
 
Modified: trunk/src/sat-pref-rot-data.h
===================================================================
--- trunk/src/sat-pref-rot-data.h	2008-08-20 14:36:00 UTC (rev 57)
+++ trunk/src/sat-pref-rot-data.h	2008-08-22 08:46:10 UTC (rev 58)
@@ -31,15 +31,7 @@
 /** \brief Coumn definitions for rotator list. */
 typedef enum {
     ROT_LIST_COL_NAME = 0,  /*!< File name. */
-    ROT_LIST_COL_MODEL,     /*!< Model */
-    ROT_LIST_COL_ID,        /*!< Hamlib ID. */
-    ROT_LIST_COL_TYPE,      /*!< Rtator type. */
-    ROT_LIST_COL_PORT,      /*!< Port / Device, e.g. /dev/ttyS0. */
-    ROT_LIST_COL_SPEED,     /*!< Serial speed. */
-    ROT_LIST_COL_MINAZ,     /*!< Lower azimuth limit. */
-    ROT_LIST_COL_MAXAZ,     /*!< Upper azimuth limit. */
-    ROT_LIST_COL_MINEL,     /*!< Lower elevation limit. */
-    ROT_LIST_COL_MAXEL,     /*!< Upper elevation limit. */
+    ROT_LIST_COL_HOST,      /*!< Hostname */
     ROT_LIST_COL_NUM        /*!< The number of fields in the list. */
 } rotor_list_col_t;
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-08-22 09:38:34
       | 
| Revision: 64
          http://gpredict.svn.sourceforge.net/gpredict/?rev=64&view=rev
Author:   csete
Date:     2008-08-22 09:38:44 +0000 (Fri, 22 Aug 2008)
Log Message:
-----------
Improved tooltip text for host entry.
Modified Paths:
--------------
    trunk/src/sat-pref-rig-editor.c
    trunk/src/sat-pref-rot-editor.c
Modified: trunk/src/sat-pref-rig-editor.c
===================================================================
--- trunk/src/sat-pref-rig-editor.c	2008-08-22 09:35:18 UTC (rev 63)
+++ trunk/src/sat-pref-rig-editor.c	2008-08-22 09:38:44 UTC (rev 64)
@@ -168,7 +168,8 @@
 	
     host = gtk_entry_new ();
     gtk_entry_set_max_length (GTK_ENTRY (host), 50);
-    gtk_widget_set_tooltip_text (host, _("Enter host:port"));
+    gtk_widget_set_tooltip_text (host,
+                                 _("Enter the host and port where rigctld is running, e.g. 192.168.1.100:15123"));
     gtk_table_attach_defaults (GTK_TABLE (table), host, 1, 4, 1, 2);
 
     
Modified: trunk/src/sat-pref-rot-editor.c
===================================================================
--- trunk/src/sat-pref-rot-editor.c	2008-08-22 09:35:18 UTC (rev 63)
+++ trunk/src/sat-pref-rot-editor.c	2008-08-22 09:38:44 UTC (rev 64)
@@ -171,7 +171,8 @@
     
     host = gtk_entry_new ();
     gtk_entry_set_max_length (GTK_ENTRY (host), 50);
-    gtk_widget_set_tooltip_text (host, _("Enter hostname:port"));
+    gtk_widget_set_tooltip_text (host,
+                                 _("Enter the host and port where rogctld is running, e.g. 192.168.1.100:15123"));
     gtk_table_attach_defaults (GTK_TABLE (table), host, 1, 4, 1, 2);
 	
     /* Az and El limits */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-12-27 23:57:52
       | 
| Revision: 180
          http://gpredict.svn.sourceforge.net/gpredict/?rev=180&view=rev
Author:   csete
Date:     2008-12-27 23:57:42 +0000 (Sat, 27 Dec 2008)
Log Message:
-----------
Added parameters for rig type and PTT.
Modified Paths:
--------------
    trunk/src/radio-conf.c
    trunk/src/radio-conf.h
Modified: trunk/src/radio-conf.c
===================================================================
--- trunk/src/radio-conf.c	2008-12-27 21:43:37 UTC (rev 179)
+++ trunk/src/radio-conf.c	2008-12-27 23:57:42 UTC (rev 180)
@@ -38,6 +38,8 @@
 #define KEY_HOST        "Host"
 #define KEY_PORT        "Port"
 #define KEY_LO          "LO"
+#define KEY_TYPE        "Type"
+#define KEY_PTT         "READ_PTT"
 
 
 /** \brief Read radio configuration.
@@ -117,6 +119,26 @@
         return FALSE;
     }
 
+    conf->type = g_key_file_get_integer (cfg, GROUP, KEY_TYPE, &error);
+    if (error != NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Error reading radio conf from %s (%s)."),
+                       __FUNCTION__, conf->name, error->message);
+        g_clear_error (&error);
+        g_key_file_free (cfg);
+        return FALSE;
+    }
+
+    conf->ptt = g_key_file_get_boolean (cfg, GROUP, KEY_PTT, &error);
+    if (error != NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Error reading radio conf from %s (%s)."),
+                       __FUNCTION__, conf->name, error->message);
+        g_clear_error (&error);
+        g_key_file_free (cfg);
+        return FALSE;
+    }
+
     g_key_file_free (cfg);
     
     sat_log_log (SAT_LOG_LEVEL_MSG,
@@ -155,6 +177,8 @@
     g_key_file_set_string (cfg, GROUP, KEY_HOST, conf->host);
     g_key_file_set_integer (cfg, GROUP, KEY_PORT, conf->port);
     g_key_file_set_double (cfg, GROUP, KEY_LO, conf->lo);
+    g_key_file_set_integer (cfg, GROUP, KEY_TYPE, conf->type);
+    g_key_file_set_boolean (cfg, GROUP, KEY_PTT, conf->ptt);
     
     /* convert to text sdata */
     data = g_key_file_to_data (cfg, &len, NULL);
Modified: trunk/src/radio-conf.h
===================================================================
--- trunk/src/radio-conf.h	2008-12-27 21:43:37 UTC (rev 179)
+++ trunk/src/radio-conf.h	2008-12-27 23:57:42 UTC (rev 180)
@@ -33,7 +33,15 @@
 #include <glib.h>
 
 
+/** \brief Radio types. */
+typedef enum {
+    RIG_TYPE_RX = 0,    /*!< Rig can only be used as receiver */
+    RIG_TYPE_TX,        /*!< Rig can only be used as transmitter */
+    RIG_TYPE_TRX,       /*!< Rig can be used as RX/TX (simplex only) */
+    RIG_TYPE_DUPLEX     /*!< Rig is a full duplex radio, e.g. IC910 */
+} rig_type_t;
 
+
 /** \brief Radio configuration. */
 typedef struct {
     gchar       *name;      /*!< Configuration file name, without .rig. */
@@ -41,6 +49,8 @@
     gint         port;      /*!< port number */
     gdouble      lo;        /*!< local oscillator freq in Hz (using double for
                                  compatibility with rest of code) */
+    rig_type_t   type;      /*!< Radio type */
+    gboolean     ptt;       /*!< Flag indicating that we should read PTT status (needed for RX, TX, and TRX) */
 } radio_conf_t;
 
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2009-04-03 21:03:25
       | 
| Revision: 222
          http://gpredict.svn.sourceforge.net/gpredict/?rev=222&view=rev
Author:   csete
Date:     2009-04-03 21:03:23 +0000 (Fri, 03 Apr 2009)
Log Message:
-----------
Added function to free transponder list.
Modified Paths:
--------------
    trunk/src/trsp-conf.c
    trunk/src/trsp-conf.h
Modified: trunk/src/trsp-conf.c
===================================================================
--- trunk/src/trsp-conf.c	2009-04-03 18:08:52 UTC (rev 221)
+++ trunk/src/trsp-conf.c	2009-04-03 21:03:23 UTC (rev 222)
@@ -42,7 +42,7 @@
 
 /** \brief Read transponder data file.
  *  \param catnum The catalog number of the satellite to read transponders for.
- *  \return A newly allocated GSList containing trsp_t structures.
+ *  \return  The new transponder list.
  */
 GSList *read_tranponders (guint catnum)
 {
@@ -54,6 +54,7 @@
     gchar    **groups;
     gsize      numgrp,i;
     
+    
     name = g_strdup_printf ("%d.trsp", catnum);
     confdir = get_conf_dir();
     fname = g_strconcat (confdir, G_DIR_SEPARATOR_S,
@@ -137,7 +138,7 @@
                     g_clear_error (&error);
                     trsp->invert = FALSE;
                 }
-                
+
                 /* add transponder to list */
                 trsplist = g_slist_append (trsplist, trsp);
             }
@@ -151,17 +152,36 @@
     g_free (confdir);
     g_free (fname);
 
+    
     return trsplist;
 }
 
 
 /** \brief Write transponder list for satellite.
  *  \param catnum The catlog number of the satellite.
- *  \param transp Pointer to a GSList of trsp_t structures.
+ *  \param trsplist Pointer to a GSList of trsp_t structures.
  */
-void write_transponders (guint catnum, GSList *transp)
+void write_transponders (guint catnum, GSList *trsplist)
 {
     // FIXME
     sat_log_log (SAT_LOG_LEVEL_BUG, _("%s: Not implemented!"), __FUNCTION__);
 }
 
+/** \brief Free transponder list.
+ *  \param trsplist Pointer to a GSList of trsp_t structures.
+ *
+ * This functions free all memory occupied by the transponder list.
+ */
+void free_transponders (GSList *trsplist)
+{
+    gint i, n;
+    trsp_t *trsp;
+    
+    n = g_slist_length (trsplist);
+    for (i = 0; i < n; i++) {
+        trsp = (trsp_t *) g_slist_nth_data (trsplist, i);
+        g_free (trsp->name);
+        g_free (trsp);
+    }
+    g_slist_free (trsplist);
+}
Modified: trunk/src/trsp-conf.h
===================================================================
--- trunk/src/trsp-conf.h	2009-04-03 18:08:52 UTC (rev 221)
+++ trunk/src/trsp-conf.h	2009-04-03 21:03:23 UTC (rev 222)
@@ -45,8 +45,8 @@
 /* The actual data would then be a singly linked list with pointers to transponder_t structures */
 
 GSList *read_tranponders (guint catnum);
-void write_transponders (guint catnum, GSList *transp);
+void write_transponders (guint catnum, GSList *trsplist);
+void free_transponders (GSList *trsplist);
 
 
-
 #endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2009-04-12 22:53:30
       | 
| Revision: 258
          http://gpredict.svn.sourceforge.net/gpredict/?rev=258&view=rev
Author:   csete
Date:     2009-04-12 22:53:19 +0000 (Sun, 12 Apr 2009)
Log Message:
-----------
Changed PTT to int to allow using get_dcd with special interfaces.
Modified Paths:
--------------
    trunk/src/radio-conf.c
    trunk/src/radio-conf.h
    trunk/src/sat-pref-rig-editor.c
    trunk/src/sat-pref-rig.c
Modified: trunk/src/radio-conf.c
===================================================================
--- trunk/src/radio-conf.c	2009-04-12 19:02:15 UTC (rev 257)
+++ trunk/src/radio-conf.c	2009-04-12 22:53:19 UTC (rev 258)
@@ -40,7 +40,7 @@
 #define KEY_LO          "LO"
 #define KEY_LOUP        "LO_UP"
 #define KEY_TYPE        "Type"
-#define KEY_PTT         "READ_PTT"
+#define KEY_PTT         "PTT"
 
 
 /** \brief Read radio configuration.
@@ -152,7 +152,7 @@
         return FALSE;
     }
 
-    conf->ptt = g_key_file_get_boolean (cfg, GROUP, KEY_PTT, &error);
+    conf->ptt = g_key_file_get_integer (cfg, GROUP, KEY_PTT, &error);
     if (error != NULL) {
         sat_log_log (SAT_LOG_LEVEL_ERROR,
                      _("%s: Error reading radio conf from %s (%s)."),
@@ -202,7 +202,7 @@
     g_key_file_set_double (cfg, GROUP, KEY_LO, conf->lo);
     g_key_file_set_double (cfg, GROUP, KEY_LOUP, conf->loup);
     g_key_file_set_integer (cfg, GROUP, KEY_TYPE, conf->type);
-    g_key_file_set_boolean (cfg, GROUP, KEY_PTT, conf->ptt);
+    g_key_file_set_integer (cfg, GROUP, KEY_PTT, conf->ptt);
     
     /* convert to text sdata */
     data = g_key_file_to_data (cfg, &len, NULL);
Modified: trunk/src/radio-conf.h
===================================================================
--- trunk/src/radio-conf.h	2009-04-12 19:02:15 UTC (rev 257)
+++ trunk/src/radio-conf.h	2009-04-12 22:53:19 UTC (rev 258)
@@ -41,6 +41,11 @@
     RIG_TYPE_DUPLEX     /*!< Rig is a full duplex radio, e.g. IC910 */
 } rig_type_t;
 
+typedef enum {
+    PTT_TYPE_NONE = 0,  /*!< Don't read PTT */
+    PTT_TYPE_CAT,       /*!< Read PTT using get_ptt CAT command */
+    PTT_TYPE_DCD        /*!< Read PTT using get_dcd */
+} ptt_type_t;
 
 /** \brief Radio configuration. */
 typedef struct {
@@ -51,7 +56,7 @@
                                  compatibility with rest of code). Downlink. */
     gdouble      loup;      /*!< local oscillator freq in Hz for uplink. */
     rig_type_t   type;      /*!< Radio type */
-    gboolean     ptt;       /*!< Flag indicating that we should read PTT status (needed for RX, TX, and TRX) */
+    ptt_type_t   ptt;       /*!< PTT type (needed for RX, TX, and TRX) */
 } radio_conf_t;
 
 
Modified: trunk/src/sat-pref-rig-editor.c
===================================================================
--- trunk/src/sat-pref-rig-editor.c	2009-04-12 19:02:15 UTC (rev 257)
+++ trunk/src/sat-pref-rig-editor.c	2009-04-12 22:53:19 UTC (rev 258)
@@ -66,6 +66,7 @@
 static gboolean      apply_changes         (radio_conf_t *conf);
 static void          name_changed          (GtkWidget *widget, gpointer data);
 static void          type_changed          (GtkWidget *widget, gpointer data);
+static void          ptt_changed           (GtkWidget *widget, gpointer data);
 
 
 /** \brief Add or edit a radio configuration.
@@ -76,63 +77,63 @@
 void
 sat_pref_rig_editor_run (radio_conf_t *conf)
 {
-	gint       response;
-	gboolean   finished = FALSE;
+    gint       response;
+    gboolean   finished = FALSE;
 
 
-	/* crate dialog and add contents */
-	dialog = gtk_dialog_new_with_buttons (_("Edit radio configuration"),
-										  GTK_WINDOW (window),
-										  GTK_DIALOG_MODAL |
-										  GTK_DIALOG_DESTROY_WITH_PARENT,
-										  GTK_STOCK_CLEAR,
-										  GTK_RESPONSE_REJECT,
-										  GTK_STOCK_CANCEL,
-										  GTK_RESPONSE_CANCEL,
-										  GTK_STOCK_OK,
-										  GTK_RESPONSE_OK,
-										  NULL);
+    /* crate dialog and add contents */
+    dialog = gtk_dialog_new_with_buttons (_("Edit radio configuration"),
+                                            GTK_WINDOW (window),
+                                            GTK_DIALOG_MODAL |
+                                            GTK_DIALOG_DESTROY_WITH_PARENT,
+                                            GTK_STOCK_CLEAR,
+                                            GTK_RESPONSE_REJECT,
+                                            GTK_STOCK_CANCEL,
+                                            GTK_RESPONSE_CANCEL,
+                                            GTK_STOCK_OK,
+                                            GTK_RESPONSE_OK,
+                                            NULL);
 
-	/* disable OK button to begin with */
-	gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
-									   GTK_RESPONSE_OK,
-									   FALSE);
+    /* disable OK button to begin with */
+    gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
+                                        GTK_RESPONSE_OK,
+                                        FALSE);
 
-	gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
-					   create_editor_widgets (conf));
+    gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
+                        create_editor_widgets (conf));
 
-	/* this hacky-thing is to keep the dialog running in case the
-	   CLEAR button is plressed. OK and CANCEL will exit the loop
-	*/
-	while (!finished) {
+    /* this hacky-thing is to keep the dialog running in case the
+        CLEAR button is plressed. OK and CANCEL will exit the loop
+    */
+    while (!finished) {
 
-		response = gtk_dialog_run (GTK_DIALOG (dialog));
+        response = gtk_dialog_run (GTK_DIALOG (dialog));
 
-		switch (response) {
+        switch (response) {
 
-			/* OK */
-		case GTK_RESPONSE_OK:
-			if (apply_changes (conf)) {
-				finished = TRUE;
-			}
-			else {
-				finished = FALSE;
-			}
-			break;
+            /* OK */
+        case GTK_RESPONSE_OK:
+            if (apply_changes (conf)) {
+                finished = TRUE;
+            }
+            else {
+                finished = FALSE;
+            }
+            break;
 
-			/* CLEAR */
-		case GTK_RESPONSE_REJECT:
-			clear_widgets ();
-			break;
+            /* CLEAR */
+        case GTK_RESPONSE_REJECT:
+            clear_widgets ();
+            break;
 
-			/* Everything else is considered CANCEL */
-		default:
-			finished = TRUE;
-			break;
-		}
-	}
+            /* Everything else is considered CANCEL */
+        default:
+            finished = TRUE;
+            break;
+        }
+    }
 
-	gtk_widget_destroy (dialog);
+    gtk_widget_destroy (dialog);
 }
 
 
@@ -140,38 +141,38 @@
 static GtkWidget *
 create_editor_widgets (radio_conf_t *conf)
 {
-	GtkWidget    *table;
-	GtkWidget    *label;
+    GtkWidget    *table;
+    GtkWidget    *label;
 
 
 
-	table = gtk_table_new (7, 4, 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);
+    table = gtk_table_new (7, 4, 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);
 
-	/* Config name */
-	label = gtk_label_new (_("Name"));
-	gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-	gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1);
-	
-	name = gtk_entry_new ();
-	gtk_entry_set_max_length (GTK_ENTRY (name), 25);
+    /* Config name */
+    label = gtk_label_new (_("Name"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1);
+
+    name = gtk_entry_new ();
+    gtk_entry_set_max_length (GTK_ENTRY (name), 25);
     gtk_widget_set_tooltip_text (name,
                                  _("Enter a short name for this configuration, e.g. IC910-1.\n"\
-                                   "Allowed charachters: 0..9, a..z, A..Z, - and _"));
-	gtk_table_attach_defaults (GTK_TABLE (table), name, 1, 4, 0, 1);
+                                    "Allowed charachters: 0..9, a..z, A..Z, - and _"));
+    gtk_table_attach_defaults (GTK_TABLE (table), name, 1, 4, 0, 1);
 
-	/* attach changed signal so that we can enable OK button when
-	   a proper name has been entered
-	*/
-	g_signal_connect (name, "changed", G_CALLBACK (name_changed), NULL);
+    /* attach changed signal so that we can enable OK button when
+        a proper name has been entered
+    */
+    g_signal_connect (name, "changed", G_CALLBACK (name_changed), NULL);
 
-	/* Host */
-	label = gtk_label_new (_("Host"));
-	gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-	gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
-	
+    /* Host */
+    label = gtk_label_new (_("Host"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
+
     host = gtk_entry_new ();
     gtk_entry_set_max_length (GTK_ENTRY (host), 50);
     gtk_widget_set_tooltip_text (host,
@@ -193,7 +194,7 @@
     gtk_table_attach_defaults (GTK_TABLE (table), port, 1, 3, 2, 3);
     
     /* radio type */
-    label = gtk_label_new (_("Type"));
+    label = gtk_label_new (_("Radio type"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
     gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4);
     
@@ -223,14 +224,26 @@
     gtk_table_attach_defaults (GTK_TABLE (table), type, 1, 3, 3, 4);
     
     /* ptt */
-    ptt = gtk_check_button_new_with_label (_("Monitor PTT status"));
-    gtk_widget_set_tooltip_text (ptt,
-                                 _("If checked, the radio controller will monitor the status of"\
-                                 " the PTT and act accordingly. For example, the doppler tuning "\
-                                 "on an RX only radio will be suspended while PTT is active. This"\
-                                 " functionality is also required for radios that are used as both"\
-                                 " TX and RX (simplex)"));
-    gtk_table_attach_defaults (GTK_TABLE (table), ptt, 1, 4, 4, 5);
+    label = gtk_label_new (_("PTT status"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 4, 5);
+
+    ptt = gtk_combo_box_new_text ();
+    gtk_combo_box_append_text (GTK_COMBO_BOX (ptt), _("None"));
+    gtk_combo_box_append_text (GTK_COMBO_BOX (ptt), _("Read PTT"));
+    gtk_combo_box_append_text (GTK_COMBO_BOX (ptt), _("Read DCD"));
+    gtk_combo_box_set_active (GTK_COMBO_BOX (ptt), 0);
+    g_signal_connect (ptt, "changed", G_CALLBACK (ptt_changed), NULL);
+    gtk_widget_set_tooltip_markup (ptt,
+                            _("Select PTT type.\n\n"\
+                            "<b>None:</b>\nDon't read PTT status from this radio.\n\n"\
+                            "<b>Read PTT:</b>\nRead PTT status using get_ptt CAT command. "\
+                            "You have to check that your radio and hamlib supports this.\n\n"\
+                            "<b>Read DCD:</b>\nRead PTT status using get_dcd command. "\
+                            "This can be used if your radio does not support the read_ptt "\
+                            "CAT command and you have a special interface that can "\
+                            "read squelch status and send it via CTS."));
+    gtk_table_attach_defaults (GTK_TABLE (table), ptt, 1, 3, 4, 5);
     
     
     /* Downconverter LO frequency */
@@ -268,12 +281,12 @@
     gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, 6, 7);
     
     
-	if (conf->name != NULL)
-		update_widgets (conf);
+    if (conf->name != NULL)
+        update_widgets (conf);
 
-	gtk_widget_show_all (table);
+    gtk_widget_show_all (table);
 
-	return table;
+    return table;
 }
 
 
@@ -297,39 +310,8 @@
         gtk_spin_button_set_value (GTK_SPIN_BUTTON (port), 4532); /* hamlib default? */
     
     /* ptt */
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ptt), conf->ptt);
+    gtk_combo_box_set_active (GTK_COMBO_BOX (ptt), conf->ptt);
 
-    /* rig type */
-    switch (conf->type) {
-    case RIG_TYPE_RX:
-        gtk_combo_box_set_active (GTK_COMBO_BOX (type), conf->type);
-        gtk_widget_set_sensitive (ptt, TRUE);
-        break;
-        
-    case RIG_TYPE_TX:
-        gtk_combo_box_set_active (GTK_COMBO_BOX (type), conf->type);
-        gtk_widget_set_sensitive (ptt, TRUE);
-        break;
-        
-    case RIG_TYPE_TRX:
-        gtk_combo_box_set_active (GTK_COMBO_BOX (type), conf->type);
-        /* force ptt to TRUE */
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ptt), TRUE);
-        gtk_widget_set_sensitive (ptt, FALSE);
-        break;
-        
-    case RIG_TYPE_DUPLEX:
-        gtk_combo_box_set_active (GTK_COMBO_BOX (type), conf->type);
-        gtk_widget_set_sensitive (ptt, FALSE);
-        break;
-
-    default:
-        gtk_combo_box_set_active (GTK_COMBO_BOX (type), RIG_TYPE_RX);
-        gtk_widget_set_sensitive (ptt, TRUE);
-        break;
-    }
-    
-    
     /* lo down in MHz */
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (lo), conf->lo / 1000000.0);
     
@@ -354,6 +336,7 @@
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (lo), 0);
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (loup), 0);
     gtk_combo_box_set_active (GTK_COMBO_BOX (type), RIG_TYPE_RX);
+    gtk_combo_box_set_active (GTK_COMBO_BOX (ptt), PTT_TYPE_NONE);
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ptt), FALSE);
 }
 
@@ -393,9 +376,9 @@
     conf->type = gtk_combo_box_get_active (GTK_COMBO_BOX (type));
     
     /* ptt */
-    conf->ptt = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ptt));
+    conf->ptt = gtk_combo_box_get_active (GTK_COMBO_BOX (ptt));
     
-	return TRUE;
+    return TRUE;
 }
 
 
@@ -409,56 +392,56 @@
 static void
 name_changed          (GtkWidget *widget, gpointer data)
 {
-	const gchar *text;
-	gchar *entry, *end, *j;
-	gint len, pos;
+    const gchar *text;
+    gchar *entry, *end, *j;
+    gint len, pos;
 
 
-	/* step 1: ensure that only valid characters are entered
-	   (stolen from xlog, tnx pg4i)
-	*/
-	entry = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1);
-	if ((len = g_utf8_strlen (entry, -1)) > 0)
-		{
-			end = entry + g_utf8_strlen (entry, -1);
-			for (j = entry; j < end; ++j)
-				{
-					switch (*j)
-						{
-						case '0' ... '9':
-						case 'a' ... 'z':
-						case 'A' ... 'Z':
-						case '-':
-						case '_':
-							break;
-						default:
-							gdk_beep ();
-							pos = gtk_editable_get_position (GTK_EDITABLE (widget));
-							gtk_editable_delete_text (GTK_EDITABLE (widget),
-													  pos, pos+1);
-							break;
-						}
-				}
-		}
+    /* step 1: ensure that only valid characters are entered
+        (stolen from xlog, tnx pg4i)
+    */
+    entry = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1);
+    if ((len = g_utf8_strlen (entry, -1)) > 0)
+        {
+            end = entry + g_utf8_strlen (entry, -1);
+            for (j = entry; j < end; ++j)
+                {
+                    switch (*j)
+                        {
+                        case '0' ... '9':
+                        case 'a' ... 'z':
+                        case 'A' ... 'Z':
+                        case '-':
+                        case '_':
+                            break;
+                        default:
+                            gdk_beep ();
+                            pos = gtk_editable_get_position (GTK_EDITABLE (widget));
+                            gtk_editable_delete_text (GTK_EDITABLE (widget),
+                                                        pos, pos+1);
+                            break;
+                        }
+                }
+        }
 
 
-	/* step 2: if name seems all right, enable OK button */
-	text = gtk_entry_get_text (GTK_ENTRY (widget));
+    /* step 2: if name seems all right, enable OK button */
+    text = gtk_entry_get_text (GTK_ENTRY (widget));
 
-	if (g_utf8_strlen (text, -1) > 0) {
-		gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
-										   GTK_RESPONSE_OK,
-										   TRUE);
-	}
-	else {
-		gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
-										   GTK_RESPONSE_OK,
-										   FALSE);
-	}
+    if (g_utf8_strlen (text, -1) > 0) {
+        gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
+                                            GTK_RESPONSE_OK,
+                                            TRUE);
+    }
+    else {
+        gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
+                                            GTK_RESPONSE_OK,
+                                            FALSE);
+    }
 }
 
 
-/** \brief Manage type changed signals.
+/** \brief Manage rig type changed signals.
  *  \param widget The GtkComboBox that received the signal.
  *  \param data User data (always NULL).
  *  
@@ -467,28 +450,31 @@
 static void
 type_changed (GtkWidget *widget, gpointer data)
 {
-    switch (gtk_combo_box_get_active (GTK_COMBO_BOX (widget))) {
-    case RIG_TYPE_RX:
-        gtk_widget_set_sensitive (ptt, TRUE);
-        break;
-        
-    case RIG_TYPE_TX:
-        gtk_widget_set_sensitive (ptt, TRUE);
-        break;
-        
-    case RIG_TYPE_TRX:
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ptt), TRUE);
-        gtk_widget_set_sensitive (ptt, FALSE);
-        break;
-        
-    case RIG_TYPE_DUPLEX:
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ptt), FALSE);
-        gtk_widget_set_sensitive (ptt, FALSE);
-        break;
-
-    default:
-        gtk_widget_set_sensitive (ptt, TRUE);
-        break;
+    
+    if (gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) == RIG_TYPE_TRX) {
+        if (gtk_combo_box_get_active (GTK_COMBO_BOX (ptt)) == PTT_TYPE_NONE) {
+            gtk_combo_box_set_active (GTK_COMBO_BOX (ptt), PTT_TYPE_CAT);
+        }
     }
+}
 
+/** \brief Manage ptt type changed signals.
+ *  \param widget The GtkComboBox that received the signal.
+ *  \param data User data (always NULL).
+ *  
+ *  This function is called when the user selects a new ptt type.
+ */
+static void
+ptt_changed (GtkWidget *widget, gpointer data)
+{
+    
+    if (gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) == PTT_TYPE_NONE) {
+        if (gtk_combo_box_get_active (GTK_COMBO_BOX (type)) == RIG_TYPE_TRX) {
+            /* not good, we need to have PTT for this type */
+            gtk_combo_box_set_active (GTK_COMBO_BOX (widget), PTT_TYPE_CAT);
+        }
+    }
 }
+
+
+
Modified: trunk/src/sat-pref-rig.c
===================================================================
--- trunk/src/sat-pref-rig.c	2009-04-12 19:02:15 UTC (rev 257)
+++ trunk/src/sat-pref-rig.c	2009-04-12 22:53:19 UTC (rev 258)
@@ -212,7 +212,7 @@
                                     G_TYPE_STRING,    // host
                                     G_TYPE_INT,       // port
                                     G_TYPE_INT,       // type
-                                    G_TYPE_BOOLEAN,   // PTT
+                                    G_TYPE_INT,       // PTT
                                     G_TYPE_DOUBLE,    // LO DOWN
                                     G_TYPE_DOUBLE     // LO UO
                                    );
@@ -353,7 +353,7 @@
         .host  = NULL,
         .port  = 4532,
         .type  = RIG_TYPE_RX,
-        .ptt   = FALSE,
+        .ptt   = 0,
         .lo    = 0.0,
         .loup  = 0.0,
     };
@@ -437,7 +437,7 @@
         .host  = NULL,
         .port  = 4532,
         .type  = RIG_TYPE_RX,
-        .ptt   = FALSE,
+        .ptt   = 0,
         .lo    = 0.0,
         .loup  = 0.0,
     };
@@ -487,7 +487,7 @@
         .host  = NULL,
         .port  = 4532,
         .type  = RIG_TYPE_RX,
-        .ptt   = FALSE,
+        .ptt   = 0,
         .lo    = 0.0,
         .loup  = 0.0,
     };
@@ -699,16 +699,25 @@
                         GtkTreeIter       *iter,
                         gpointer           column)
 {
-    gboolean   ptt;
+    gint    ptt;
     guint   coli = GPOINTER_TO_UINT (column);
     
     gtk_tree_model_get (model, iter, coli, &ptt, -1);
 
-    if (ptt)
-        g_object_set (renderer, "text", _("Monitor"), NULL);
-    else
-        g_object_set (renderer, "text", _("Ignore"), NULL);
-    
+    switch (ptt) {
+        case PTT_TYPE_NONE:
+            g_object_set (renderer, "text", _("None"), NULL);
+            break;
+        case PTT_TYPE_CAT:
+            g_object_set (renderer, "text", _("PTT"), NULL);
+            break;
+        case PTT_TYPE_DCD:
+            g_object_set (renderer, "text", _("DCD"), NULL);
+            break;
+        default:
+            g_object_set (renderer, "text", _("None"), NULL);
+            break;
+    }
 }
 
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-08-27 19:17:44
       | 
| Revision: 68
          http://gpredict.svn.sourceforge.net/gpredict/?rev=68&view=rev
Author:   csete
Date:     2008-08-27 19:17:51 +0000 (Wed, 27 Aug 2008)
Log Message:
-----------
Added fields for port number and local oscillator offset.
Modified Paths:
--------------
    trunk/src/radio-conf.c
    trunk/src/radio-conf.h
Modified: trunk/src/radio-conf.c
===================================================================
--- trunk/src/radio-conf.c	2008-08-27 18:43:58 UTC (rev 67)
+++ trunk/src/radio-conf.c	2008-08-27 19:17:51 UTC (rev 68)
@@ -36,11 +36,15 @@
 
 #define GROUP           "Radio"
 #define KEY_HOST        "Host"
+#define KEY_PORT        "Port"
+#define KEY_LO          "LO"
 
 
 /** \brief Read radio configuration.
  * \param conf Pointer to a radio_conf_t structure where the data will be
  *             stored.
+ * \return TRUE if the configuration was read successfully, FALSe if an
+ *         error has occurred.
  * 
  * This function reads a radio configuration from a .rig file into conf.
  * conf->name must contain the file name of the configuration (no path, just
@@ -48,13 +52,18 @@
  */
 gboolean radio_conf_read (radio_conf_t *conf)
 {
-    GKeyFile *cfg = NULL;
-    gchar    *confdir;
-    gchar    *fname;
+    GKeyFile  *cfg = NULL;
+    gchar     *confdir;
+    gchar     *fname;
+    GError    *error = NULL;
     
     
-    if (conf->name == NULL)
+    if (conf->name == NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: NULL configuration name!"),
+                       __FUNCTION__);
         return FALSE;
+    }
     
     confdir = get_conf_dir();
     fname = g_strconcat (confdir, G_DIR_SEPARATOR_S,
@@ -78,10 +87,42 @@
     g_free (fname);
     
     /* read parameters */
-    conf->host = g_key_file_get_string (cfg, GROUP, KEY_HOST, NULL);
+    conf->host = g_key_file_get_string (cfg, GROUP, KEY_HOST, &error);
+    if (error != NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Error reading radio conf from %s (%s)."),
+                     __FUNCTION__, conf->name, error->message);
+        g_clear_error (&error);
+        g_key_file_free (cfg);
+        return FALSE;
+    }
     
+    conf->port = g_key_file_get_integer (cfg, GROUP, KEY_PORT, &error);
+    if (error != NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Error reading radio conf from %s (%s)."),
+                       __FUNCTION__, conf->name, error->message);
+        g_clear_error (&error);
+        g_key_file_free (cfg);
+        return FALSE;
+    }
+    
+    conf->lo = g_key_file_get_double (cfg, GROUP, KEY_LO, &error);
+    if (error != NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Error reading radio conf from %s (%s)."),
+                       __FUNCTION__, conf->name, error->message);
+        g_clear_error (&error);
+        g_key_file_free (cfg);
+        return FALSE;
+    }
+
     g_key_file_free (cfg);
     
+    sat_log_log (SAT_LOG_LEVEL_MSG,
+                 _("%s: Read radio configuration %s"),
+                 __FUNCTION__, conf->name);
+    
     return TRUE;
 }
 
@@ -101,13 +142,19 @@
     gchar    *data;
     gsize     len;
     
-    if (conf->name == NULL)
+    if (conf->name == NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: NULL configuration name!"),
+                     __FUNCTION__);
         return;
+    }
     
     /* create a config structure */
     cfg = g_key_file_new();
     
     g_key_file_set_string (cfg, GROUP, KEY_HOST, conf->host);
+    g_key_file_set_integer (cfg, GROUP, KEY_PORT, conf->port);
+    g_key_file_set_double (cfg, GROUP, KEY_LO, conf->lo);
     
     /* convert to text sdata */
     data = g_key_file_to_data (cfg, &len, NULL);
@@ -123,4 +170,8 @@
     g_free (fname);
     g_free (data);
     g_key_file_free (cfg);
+    
+    sat_log_log (SAT_LOG_LEVEL_MSG,
+                 _("%s: Saved radio configuration %s"),
+                 __FUNCTION__, conf->name);
 }
Modified: trunk/src/radio-conf.h
===================================================================
--- trunk/src/radio-conf.h	2008-08-27 18:43:58 UTC (rev 67)
+++ trunk/src/radio-conf.h	2008-08-27 19:17:51 UTC (rev 68)
@@ -37,7 +37,10 @@
 /** \brief Radio configuration. */
 typedef struct {
     gchar       *name;      /*!< Configuration file name, without .rig. */
-    gchar       *host;      /*!< hostname:port */
+    gchar       *host;      /*!< hostname or IP */
+    gint         port;      /*!< port number */
+    gdouble      lo;        /*!< local oscillator freq in MHz (using double for
+                                 compatibility with rest of code) */
 } radio_conf_t;
 
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-08-27 20:40:25
       | 
| Revision: 70
          http://gpredict.svn.sourceforge.net/gpredict/?rev=70&view=rev
Author:   csete
Date:     2008-08-27 20:40:34 +0000 (Wed, 27 Aug 2008)
Log Message:
-----------
Added fields for port number and LO frequency.
Modified Paths:
--------------
    trunk/src/sat-pref-rig-data.h
    trunk/src/sat-pref-rig-editor.c
    trunk/src/sat-pref-rig.c
Modified: trunk/src/sat-pref-rig-data.h
===================================================================
--- trunk/src/sat-pref-rig-data.h	2008-08-27 19:19:52 UTC (rev 69)
+++ trunk/src/sat-pref-rig-data.h	2008-08-27 20:40:34 UTC (rev 70)
@@ -31,7 +31,9 @@
 /** \brief Coumn definitions for radio list. */
 typedef enum {
     RIG_LIST_COL_NAME = 0,  /*!< File name. */
-    RIG_LIST_COL_HOST,      /*!< Hostname, e.g. localhost:12000 */
+    RIG_LIST_COL_HOST,      /*!< Hostname, e.g. localhost */
+    RIG_LIST_COL_PORT,      /*!< Port number */
+    RIG_LIST_COL_LO,        /*!< Local oscillator freq */
     RIG_LIST_COL_NUM        /*!< The number of fields in the list. */
 } rig_list_col_t;
 
Modified: trunk/src/sat-pref-rig-editor.c
===================================================================
--- trunk/src/sat-pref-rig-editor.c	2008-08-27 19:19:52 UTC (rev 69)
+++ trunk/src/sat-pref-rig-editor.c	2008-08-27 20:40:34 UTC (rev 70)
@@ -53,6 +53,8 @@
 static GtkWidget *dialog;   /* dialog window */
 static GtkWidget *name;     /* config name */
 static GtkWidget *host;     /* host */
+static GtkWidget *port;     /* port number */
+static GtkWidget *lo;       /* local oscillator */
 
 
 static GtkWidget    *create_editor_widgets (radio_conf_t *conf);
@@ -139,7 +141,7 @@
 
 
 
-	table = gtk_table_new (2, 4, FALSE);
+	table = gtk_table_new (4, 4, 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);
@@ -172,7 +174,34 @@
                                  _("Enter the host and port where rigctld is running, e.g. 192.168.1.100:15123"));
     gtk_table_attach_defaults (GTK_TABLE (table), host, 1, 4, 1, 2);
 
+    /* port */
+    label = gtk_label_new (_("Port"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3);
     
+    port = gtk_spin_button_new_with_range (1024, 65535, 1);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (port), 4532); 
+    gtk_spin_button_set_digits (GTK_SPIN_BUTTON (port), 0);
+    gtk_widget_set_tooltip_text (port,
+                                 _("Enter the port number where rigctld is listening"));
+    gtk_table_attach_defaults (GTK_TABLE (table), port, 1, 3, 2, 3);
+    
+    /* LO frequency */
+    label = gtk_label_new (_("LO"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4);
+    
+    lo = gtk_spin_button_new_with_range (-40000, 40000, 1);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (lo), 0);
+    gtk_spin_button_set_digits (GTK_SPIN_BUTTON (lo), 0);
+    gtk_widget_set_tooltip_text (lo,
+                                 _("Enter the frequency of the local oscillator, if any."));
+    gtk_table_attach_defaults (GTK_TABLE (table), lo, 1, 3, 3, 4);
+    
+    label = gtk_label_new (_("MHz"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, 3, 4);
+    
 	if (conf->name != NULL)
 		update_widgets (conf);
 
@@ -191,10 +220,18 @@
     /* configuration name */
     gtk_entry_set_text (GTK_ENTRY (name), conf->name);
     
-    /* host name and port */
+    /* host name */
     if (conf->host)
         gtk_entry_set_text (GTK_ENTRY (host), conf->host);
 
+    /* port */
+    if (conf->port > 1023)
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON (port), conf->port);
+    else
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON (port), 4532); /* hamlib default? */
+    
+    /* lo in MHz */
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (lo), conf->lo / 1000000);
 }
 
 
@@ -209,7 +246,8 @@
 {
     gtk_entry_set_text (GTK_ENTRY (name), "");
     gtk_entry_set_text (GTK_ENTRY (host), "");
-
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (port), 4532); /* hamlib default? */
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (lo), 0);
 }
 
 
@@ -235,7 +273,12 @@
 
     conf->host = g_strdup (gtk_entry_get_text (GTK_ENTRY (host)));
 
-
+    /* port */
+    conf->port = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (port));
+    
+    /* lo freq */
+    conf->lo = 1000000*gtk_spin_button_get_value (GTK_SPIN_BUTTON (lo));
+    
 	return TRUE;
 }
 
Modified: trunk/src/sat-pref-rig.c
===================================================================
--- trunk/src/sat-pref-rig.c	2008-08-27 19:19:52 UTC (rev 69)
+++ trunk/src/sat-pref-rig.c	2008-08-27 20:40:34 UTC (rev 70)
@@ -58,22 +58,13 @@
                          GtkTreeModel      *model,
                          GtkTreeIter       *iter,
                          gpointer           column);
-static void render_civ (GtkTreeViewColumn *col,
+static void render_lo  (GtkTreeViewColumn *col,
                         GtkCellRenderer   *renderer,
                         GtkTreeModel      *model,
                         GtkTreeIter       *iter,
                         gpointer           column);
-static void render_dtr_rts (GtkTreeViewColumn *col,
-                            GtkCellRenderer   *renderer,
-                            GtkTreeModel      *model,
-                            GtkTreeIter       *iter,
-                            gpointer           column);
-static void render_rig_type (GtkTreeViewColumn *col,
-                             GtkCellRenderer   *renderer,
-                             GtkTreeModel      *model,
-                             GtkTreeIter       *iter,
-                             gpointer           column);
 
+
 /* global objects */
 static GtkWidget *addbutton;
 static GtkWidget *editbutton;
@@ -138,7 +129,24 @@
                                                         NULL);
     gtk_tree_view_insert_column (GTK_TREE_VIEW (riglist), column, -1);
     
+    /* port */
+    renderer = gtk_cell_renderer_text_new ();
+    column = gtk_tree_view_column_new_with_attributes (_("Port"), renderer,
+                                                       "text", RIG_LIST_COL_PORT,
+                                                        NULL);
+    gtk_tree_view_insert_column (GTK_TREE_VIEW (riglist), column, -1);
     
+    /* lo */
+    renderer = gtk_cell_renderer_text_new ();
+    column = gtk_tree_view_column_new_with_attributes (_("LO Freq. (MHz)"), renderer,
+                                                       "text", RIG_LIST_COL_LO,
+                                                       NULL);
+    gtk_tree_view_column_set_cell_data_func (column, renderer,
+                                             render_lo,
+                                             GUINT_TO_POINTER(RIG_LIST_COL_LO),
+                                             NULL);
+    gtk_tree_view_insert_column (GTK_TREE_VIEW (riglist), column, -1);
+    
 }
 
 
@@ -158,7 +166,9 @@
     /* create a new list store */
     liststore = gtk_list_store_new (RIG_LIST_COL_NUM,
                                     G_TYPE_STRING,    // name
-                                    G_TYPE_STRING     // model
+                                    G_TYPE_STRING,    // host
+                                    G_TYPE_INT,       // port
+                                    G_TYPE_DOUBLE     // LO
                                    );
 
     /* open configuration directory */
@@ -183,6 +193,8 @@
                     gtk_list_store_set (liststore, &item,
                                         RIG_LIST_COL_NAME, conf.name,
                                         RIG_LIST_COL_HOST, conf.host,
+                                        RIG_LIST_COL_PORT, conf.port,
+                                        RIG_LIST_COL_LO, conf.lo,
                                         -1);
                     
                     sat_log_log (SAT_LOG_LEVEL_DEBUG,
@@ -290,6 +302,8 @@
     radio_conf_t conf = {
         .name  = NULL,
         .host  = NULL,
+        .port  = 4532,
+        .lo    = 0.0,
     };
 
     
@@ -328,6 +342,8 @@
             gtk_tree_model_get (model, &iter,
                                 RIG_LIST_COL_NAME, &conf.name,
                                 RIG_LIST_COL_HOST, &conf.host,
+                                RIG_LIST_COL_PORT, &conf.port,
+                                RIG_LIST_COL_LO, &conf.lo,
                                 -1);
             radio_conf_save (&conf);
         
@@ -364,6 +380,8 @@
     radio_conf_t conf = {
         .name  = NULL,
         .host  = NULL,
+        .port  = 4532,
+        .lo    = 0.0,
     };
     
     /* run rig conf editor */
@@ -376,6 +394,8 @@
         gtk_list_store_set (liststore, &item,
                             RIG_LIST_COL_NAME, conf.name,
                             RIG_LIST_COL_HOST, conf.host,
+                            RIG_LIST_COL_PORT, conf.port,
+                            RIG_LIST_COL_LO, conf.lo,
                             -1);
         
         g_free (conf.name);
@@ -404,6 +424,8 @@
     radio_conf_t conf = {
         .name  = NULL,
         .host  = NULL,
+        .port  = 4532,
+        .lo    = 0.0,
     };
 
     
@@ -427,6 +449,8 @@
         gtk_tree_model_get (model, &iter,
                             RIG_LIST_COL_NAME, &conf.name,
                             RIG_LIST_COL_HOST, &conf.host,
+                            RIG_LIST_COL_PORT, &conf.port,
+                            RIG_LIST_COL_PORT, &conf.lo,
                             -1);
 
     }
@@ -453,6 +477,8 @@
         gtk_list_store_set (GTK_LIST_STORE(model), &iter,
                             RIG_LIST_COL_NAME, conf.name,
                             RIG_LIST_COL_HOST, conf.host,
+                            RIG_LIST_COL_PORT, conf.port,
+                            RIG_LIST_COL_LO, conf.lo,
                             -1);
         
     }
@@ -543,138 +569,36 @@
 }
 
 
-/** \brief Render CIV address.
+/** \brief Render Local Oscillator frequency.
  * \param col Pointer to the tree view column.
  * \param renderer Pointer to the renderer.
  * \param model Pointer to the tree model.
  * \param iter Pointer to the tree iterator.
  * \param column The column number in the model.
  *
- * This function is used to render the Icom CI-V address of the radio.
- * The CI-V adress is store as an integer and we want to display it as a
- * HEX number.
+ * This function is used to render the local oscillator frequency. We
+ * need a special renderer so that we can automatically render as MHz
+ * instead of Hz.
  */
-static void render_civ (GtkTreeViewColumn *col,
+static void render_lo (GtkTreeViewColumn *col,
                         GtkCellRenderer   *renderer,
                         GtkTreeModel      *model,
                         GtkTreeIter       *iter,
                         gpointer           column)
 {
-    guint   number;
-    gchar  *buff;
-    guint   coli = GPOINTER_TO_UINT (column);
+    gdouble  number;
+    gchar   *buff;
+    guint    coli = GPOINTER_TO_UINT (column);
     
     gtk_tree_model_get (model, iter, coli, &number, -1);
 
-    if (number > 0)
-        buff = g_strdup_printf ("0x%X", number);
-    else
-        buff = g_strdup_printf (" ");
-        
+    /* convert to MHz */
+    number /= 1000000.0;
+    buff = g_strdup_printf ("%.0f", number);
     g_object_set (renderer, "text", buff, NULL);
     g_free (buff);
 }
 
 
-/** \brief Render DTR or RTS columns address.
- * \param col Pointer to the tree view column.
- * \param renderer Pointer to the renderer.
- * \param model Pointer to the tree model.
- * \param iter Pointer to the tree iterator.
- * \param column The column number in the model.
- * 
- * This function renders the DTR and RTS line settings onto the radio list.
- * The DTR and RTS states are stored as enum; however, we want to display them
- * using some escriptive text, e.g. "ON", "OFF", "PTT", and so on
- */
-static void render_dtr_rts (GtkTreeViewColumn *col,
-                            GtkCellRenderer   *renderer,
-                            GtkTreeModel      *model,
-                            GtkTreeIter       *iter,
-                            gpointer           column)
-{
-    guint    number;
-    guint   coli = GPOINTER_TO_UINT (column);
-    
-    gtk_tree_model_get (model, iter, coli, &number, -1);
 
-/*    switch (number) {
-                        
-        case LINE_OFF:
-            g_object_set (renderer, "text", "OFF", NULL);
-            break;
-                        
-        case LINE_ON:
-            g_object_set (renderer, "text", "ON", NULL);
-            break;
-                            
-        case LINE_PTT:
-            g_object_set (renderer, "text", "PTT", NULL);
-            break;
-                            
-        case LINE_CW:
-            g_object_set (renderer, "text", "CW", NULL);
-            break;
-                            
-        default:
-            g_object_set (renderer, "text", "UNDEF", NULL);
-            break;
-        
-    }
-    */
-}
 
-
-/** \brief Render radio type.
- * \param col Pointer to the tree view column.
- * \param renderer Pointer to the renderer.
- * \param model Pointer to the tree model.
- * \param iter Pointer to the tree iterator.
- * \param column The column number in the model.
- * 
- * This function renders the radio type onto the radio list.
- * The radio type is stored as enum; however, we want to display it
- * using some escriptive text, e.g. "Received", "Full Duplex", and so on
- */
-static void render_rig_type (GtkTreeViewColumn *col,
-                             GtkCellRenderer   *renderer,
-                             GtkTreeModel      *model,
-                             GtkTreeIter       *iter,
-                             gpointer           column)
-{
-    guint    number;
-    guint   coli = GPOINTER_TO_UINT (column);
-    
-    gtk_tree_model_get (model, iter, coli, &number, -1);
-
-/*    switch (number) {
-
-        case RADIO_TYPE_RX:
-            g_object_set (renderer, "text", "RX", NULL);
-            break;
-
-        case RADIO_TYPE_TX:
-            g_object_set (renderer, "text", "TX", NULL);
-            break;
-
-        case RADIO_TYPE_TRX:
-            g_object_set (renderer, "text", "RX/TX", NULL);
-            break;
-
-        case RADIO_TYPE_FULL_DUP:
-            g_object_set (renderer, "text", "FULL DUPL", NULL);
-            break;
-
-        default:
-            sat_log_log (SAT_LOG_LEVEL_ERROR,
-                         _("%s:%s: Invalid type: %d. Using RX."),
-                           __FILE__, __FUNCTION__, number);
-            g_object_set (renderer, "text", "RX", NULL);
-            break;
-        
-    }*/
-    
-}
-
-
-
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-08-27 20:52:25
       | 
| Revision: 71
          http://gpredict.svn.sourceforge.net/gpredict/?rev=71&view=rev
Author:   csete
Date:     2008-08-27 20:52:34 +0000 (Wed, 27 Aug 2008)
Log Message:
-----------
Added field for port number. Added error handling.
Modified Paths:
--------------
    trunk/src/rotor-conf.c
    trunk/src/rotor-conf.h
Modified: trunk/src/rotor-conf.c
===================================================================
--- trunk/src/rotor-conf.c	2008-08-27 20:40:34 UTC (rev 70)
+++ trunk/src/rotor-conf.c	2008-08-27 20:52:34 UTC (rev 71)
@@ -36,6 +36,7 @@
 
 #define GROUP           "Rotator"
 #define KEY_HOST        "Host"
+#define KEY_PORT        "Port"
 #define KEY_MINAZ       "MinAz"
 #define KEY_MAXAZ       "MaxAz"
 #define KEY_MINEL       "MinEl"
@@ -55,10 +56,15 @@
     GKeyFile *cfg = NULL;
     gchar    *confdir;
     gchar    *fname;
+    GError   *error = NULL;
     
     
-    if (conf->name == NULL)
+    if (conf->name == NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: NULL configuration name!"),
+                       __FUNCTION__);
         return FALSE;
+    }
     
     confdir = get_conf_dir();
     fname = g_strconcat (confdir, G_DIR_SEPARATOR_S,
@@ -82,12 +88,66 @@
     g_free (fname);
     
     /* read parameters */
-    conf->host = g_key_file_get_string (cfg, GROUP, KEY_HOST, NULL);
-    conf->minaz = g_key_file_get_double (cfg, GROUP, KEY_MINAZ, NULL);
-    conf->maxaz = g_key_file_get_double (cfg, GROUP, KEY_MAXAZ, NULL);
-    conf->minel = g_key_file_get_double (cfg, GROUP, KEY_MINEL, NULL);
-    conf->maxel = g_key_file_get_double (cfg, GROUP, KEY_MAXEL, NULL);
+    conf->host = g_key_file_get_string (cfg, GROUP, KEY_HOST, &error);
+    if (error != NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Error reading rotor conf from %s (%s)."),
+                       __FUNCTION__, conf->name, error->message);
+        g_clear_error (&error);
+        g_key_file_free (cfg);
+        return FALSE;
+    }
     
+    conf->port = g_key_file_get_string (cfg, GROUP, KEY_PORT, &error);
+    if (error != NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Error reading rotor conf from %s (%s)."),
+                       __FUNCTION__, conf->name, error->message);
+        g_clear_error (&error);
+        g_key_file_free (cfg);
+        return FALSE;
+    }
+    
+    conf->minaz = g_key_file_get_double (cfg, GROUP, KEY_MINAZ, &error);
+    if (error != NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Error reading rotor conf from %s (%s)."),
+                       __FUNCTION__, conf->name, error->message);
+        g_clear_error (&error);
+        g_key_file_free (cfg);
+        return FALSE;
+    }
+    
+    conf->maxaz = g_key_file_get_double (cfg, GROUP, KEY_MAXAZ, &error);
+    if (error != NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Error reading rotor conf from %s (%s)."),
+                       __FUNCTION__, conf->name, error->message);
+        g_clear_error (&error);
+        g_key_file_free (cfg);
+        return FALSE;
+    }
+    
+    conf->minel = g_key_file_get_double (cfg, GROUP, KEY_MINEL, &error);
+    if (error != NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Error reading rotor conf from %s (%s)."),
+                       __FUNCTION__, conf->name, error->message);
+        g_clear_error (&error);
+        g_key_file_free (cfg);
+        return FALSE;
+    }
+    
+    conf->maxel = g_key_file_get_double (cfg, GROUP, KEY_MAXEL, &error);
+    if (error != NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Error reading rotor conf from %s (%s)."),
+                       __FUNCTION__, conf->name, error->message);
+        g_clear_error (&error);
+        g_key_file_free (cfg);
+        return FALSE;
+    }
+    
     g_key_file_free (cfg);
     
     return TRUE;
@@ -115,11 +175,12 @@
     /* create a config structure */
     cfg = g_key_file_new();
     
-    g_key_file_set_string (cfg, GROUP, KEY_HOST, conf->host);
-    g_key_file_set_double (cfg, GROUP, KEY_MINAZ, conf->minaz);
-    g_key_file_set_double (cfg, GROUP, KEY_MAXAZ, conf->maxaz);
-    g_key_file_set_double (cfg, GROUP, KEY_MINEL, conf->minel);
-    g_key_file_set_double (cfg, GROUP, KEY_MAXEL, conf->maxel);
+    g_key_file_set_string  (cfg, GROUP, KEY_HOST, conf->host);
+    g_key_file_set_integer (cfg, GROUP, KEY_HOST, conf->port);
+    g_key_file_set_double  (cfg, GROUP, KEY_MINAZ, conf->minaz);
+    g_key_file_set_double  (cfg, GROUP, KEY_MAXAZ, conf->maxaz);
+    g_key_file_set_double  (cfg, GROUP, KEY_MINEL, conf->minel);
+    g_key_file_set_double  (cfg, GROUP, KEY_MAXEL, conf->maxel);
     
     /* convert to text sdata */
     data = g_key_file_to_data (cfg, &len, NULL);
Modified: trunk/src/rotor-conf.h
===================================================================
--- trunk/src/rotor-conf.h	2008-08-27 20:40:34 UTC (rev 70)
+++ trunk/src/rotor-conf.h	2008-08-27 20:52:34 UTC (rev 71)
@@ -38,7 +38,8 @@
 /** \brief Rotator configuration. */
 typedef struct {
     gchar       *name;      /*!< Configuration file name, less .rot */
-    gchar       *host;      /*!< hostname:port */
+    gchar       *host;      /*!< hostname */
+    gint         port;      /*!< port number */
     gdouble      minaz;     /*!< Lower azimuth limit */
     gdouble      maxaz;     /*!< Upper azimuth limit */
     gdouble      minel;     /*!< Lower elevation limit */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-08-27 21:12:29
       | 
| Revision: 74
          http://gpredict.svn.sourceforge.net/gpredict/?rev=74&view=rev
Author:   csete
Date:     2008-08-27 21:12:37 +0000 (Wed, 27 Aug 2008)
Log Message:
-----------
Added field for port number.
Modified Paths:
--------------
    trunk/src/sat-pref-rot-data.h
    trunk/src/sat-pref-rot-editor.c
    trunk/src/sat-pref-rot.c
Modified: trunk/src/sat-pref-rot-data.h
===================================================================
--- trunk/src/sat-pref-rot-data.h	2008-08-27 21:10:00 UTC (rev 73)
+++ trunk/src/sat-pref-rot-data.h	2008-08-27 21:12:37 UTC (rev 74)
@@ -32,6 +32,7 @@
 typedef enum {
     ROT_LIST_COL_NAME = 0,  /*!< File name. */
     ROT_LIST_COL_HOST,      /*!< Hostname */
+    ROT_LIST_COL_PORT,      /*!< Port number */
     ROT_LIST_COL_MINAZ,     /*!< Lower Az limit. */
     ROT_LIST_COL_MAXAZ,     /*!< Upper Az limit. */
     ROT_LIST_COL_MINEL,     /*!< Lower El limit. */
Modified: trunk/src/sat-pref-rot-editor.c
===================================================================
--- trunk/src/sat-pref-rot-editor.c	2008-08-27 21:10:00 UTC (rev 73)
+++ trunk/src/sat-pref-rot-editor.c	2008-08-27 21:12:37 UTC (rev 74)
@@ -52,7 +52,8 @@
 /* private widgets */
 static GtkWidget *dialog;   /* dialog window */
 static GtkWidget *name;     /* Configuration name */
-static GtkWidget *host;     /* rotor model, e.g. TS-2000 */
+static GtkWidget *host;     /* host name or IP */
+static GtkWidget *port;     /* port number */
 static GtkWidget *minaz;
 static GtkWidget *maxaz;
 static GtkWidget *minel;
@@ -142,7 +143,7 @@
 	GtkWidget    *label;
 
 
-	table = gtk_table_new (4, 4, FALSE);
+	table = gtk_table_new (5, 4, 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);
@@ -175,42 +176,54 @@
                                  _("Enter the host and port where rogctld is running, e.g. 192.168.1.100:15123"));
     gtk_table_attach_defaults (GTK_TABLE (table), host, 1, 4, 1, 2);
 	
+    /* port */
+    label = gtk_label_new (_("Port"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3);
+    
+    port = gtk_spin_button_new_with_range (1024, 65535, 1);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (port), 4533); 
+    gtk_spin_button_set_digits (GTK_SPIN_BUTTON (port), 0);
+    gtk_widget_set_tooltip_text (port,
+                                 _("Enter the port number where rotctld is listening"));
+    gtk_table_attach_defaults (GTK_TABLE (table), port, 1, 3, 2, 3);
+
     /* Az and El limits */
     label = gtk_label_new (_(" Min Az"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4);
     minaz = gtk_spin_button_new_with_range (-40, 450, 1);
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (minaz), 0);
     gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (minaz), TRUE);
     gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (minaz), FALSE);
-    gtk_table_attach_defaults (GTK_TABLE (table), minaz, 1, 2, 2, 3);
+    gtk_table_attach_defaults (GTK_TABLE (table), minaz, 1, 2, 3, 4);
     
     label = gtk_label_new (_(" Max Az"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 2, 3);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 3, 4);
     maxaz = gtk_spin_button_new_with_range (-40, 450, 1);
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (maxaz), 360);
     gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (maxaz), TRUE);
     gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (maxaz), FALSE);
-    gtk_table_attach_defaults (GTK_TABLE (table), maxaz, 3, 4, 2, 3);
+    gtk_table_attach_defaults (GTK_TABLE (table), maxaz, 3, 4, 3, 4);
     
     label = gtk_label_new (_(" Min El"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 4, 5);
     minel = gtk_spin_button_new_with_range (-10, 180, 1);
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (minel), 0);
     gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (minel), TRUE);
     gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (minel), FALSE);
-    gtk_table_attach_defaults (GTK_TABLE (table), minel, 1, 2, 3, 4);
+    gtk_table_attach_defaults (GTK_TABLE (table), minel, 1, 2, 4, 5);
     
     label = gtk_label_new (_(" Max El"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 3, 4);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 4, 5);
     maxel = gtk_spin_button_new_with_range (-10, 180, 1);
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (maxel), 90);
     gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (maxel), TRUE);
     gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (maxel), FALSE);
-    gtk_table_attach_defaults (GTK_TABLE (table), maxel, 3, 4, 3, 4);
+    gtk_table_attach_defaults (GTK_TABLE (table), maxel, 3, 4, 4, 5);
     
     if (conf->name != NULL)
 		update_widgets (conf);
@@ -234,6 +247,12 @@
     if (conf->host)
         gtk_entry_set_text (GTK_ENTRY (host), conf->host);
     
+    /* port */
+    if (conf->port > 1023)
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON (port), conf->port);
+    else
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON (port), 4533); /* hamlib default? */
+    
     /* az and el limits */
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (minaz), conf->minaz);
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (maxaz), conf->maxaz);
@@ -255,6 +274,7 @@
 {
     gtk_entry_set_text (GTK_ENTRY (name), "");
     gtk_entry_set_text (GTK_ENTRY (host), "");
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (port), 4533); /* hamlib default? */
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (minaz), 0);
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (maxaz), 360);
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (minel), 0);
@@ -284,6 +304,9 @@
     
     conf->host = g_strdup (gtk_entry_get_text (GTK_ENTRY (host)));
 
+    /* port */
+    conf->port = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (port));
+
     /* az and el ranges */
     conf->minaz = gtk_spin_button_get_value (GTK_SPIN_BUTTON (minaz));
     conf->maxaz = gtk_spin_button_get_value (GTK_SPIN_BUTTON (maxaz));
Modified: trunk/src/sat-pref-rot.c
===================================================================
--- trunk/src/sat-pref-rot.c	2008-08-27 21:10:00 UTC (rev 73)
+++ trunk/src/sat-pref-rot.c	2008-08-27 21:12:37 UTC (rev 74)
@@ -55,11 +55,6 @@
 static void edit_cb   (GtkWidget *button, gpointer data);
 static void delete_cb (GtkWidget *button, gpointer data);
 
-static void render_rot_type (GtkTreeViewColumn *col,
-                             GtkCellRenderer   *renderer,
-                             GtkTreeModel      *model,
-                             GtkTreeIter       *iter,
-                             gpointer           column);
 static void render_angle (GtkTreeViewColumn *col,
                           GtkCellRenderer   *renderer,
                           GtkTreeModel      *model,
@@ -125,7 +120,13 @@
                                                         NULL);
     gtk_tree_view_insert_column (GTK_TREE_VIEW (rotlist), column, -1);
     
-    
+    /* port */
+    renderer = gtk_cell_renderer_text_new ();
+    column = gtk_tree_view_column_new_with_attributes (_("Port"), renderer,
+                                                       "text", ROT_LIST_COL_PORT,
+                                                        NULL);
+    gtk_tree_view_insert_column (GTK_TREE_VIEW (rotlist), column, -1);
+
     /* Az and el limits */
     renderer = gtk_cell_renderer_text_new ();
     column = gtk_tree_view_column_new_with_attributes (_("Min Az"), renderer,
@@ -186,10 +187,11 @@
     liststore = gtk_list_store_new (ROT_LIST_COL_NUM,
                                     G_TYPE_STRING,    // name
                                     G_TYPE_STRING,    // host
-                                    G_TYPE_INT,       // Min Az
-                                    G_TYPE_INT,       // Max Az
-                                    G_TYPE_INT,       // Min El
-                                    G_TYPE_INT        // Max El
+                                    G_TYPE_INT,       // port
+                                    G_TYPE_DOUBLE,    // Min Az
+                                    G_TYPE_DOUBLE,    // Max Az
+                                    G_TYPE_DOUBLE,    // Min El
+                                    G_TYPE_DOUBLE     // Max El
                                    );
 
     /* open configuration directory */
@@ -214,6 +216,7 @@
                     gtk_list_store_set (liststore, &item,
                                         ROT_LIST_COL_NAME, conf.name,
                                         ROT_LIST_COL_HOST, conf.host,
+                                        ROT_LIST_COL_PORT, conf.port,
                                         ROT_LIST_COL_MINAZ, conf.minaz,
                                         ROT_LIST_COL_MAXAZ, conf.maxaz,
                                         ROT_LIST_COL_MINEL, conf.minel,
@@ -324,6 +327,7 @@
     rotor_conf_t conf = {
         .name  = NULL,
         .host = NULL,
+        .port  = 4533,
         .minaz = 0,
         .maxaz = 360,
         .minel = 0,
@@ -366,6 +370,7 @@
             gtk_tree_model_get (model, &iter,
                                 ROT_LIST_COL_NAME, &conf.name,
                                 ROT_LIST_COL_HOST, &conf.host,
+                                ROT_LIST_COL_PORT, &conf.port,
                                 ROT_LIST_COL_MINAZ, &conf.minaz,
                                 ROT_LIST_COL_MAXAZ, &conf.maxaz,
                                 ROT_LIST_COL_MINEL, &conf.minel,
@@ -405,6 +410,7 @@
     rotor_conf_t conf = {
         .name  = NULL,
         .host  = NULL,
+        .port  = 4533,
         .minaz = 0,
         .maxaz = 360,
         .minel = 0,
@@ -421,6 +427,7 @@
         gtk_list_store_set (liststore, &item,
                             ROT_LIST_COL_NAME, conf.name,
                             ROT_LIST_COL_HOST, conf.host,
+                            ROT_LIST_COL_PORT, conf.port,
                             ROT_LIST_COL_MINAZ, conf.minaz,
                             ROT_LIST_COL_MAXAZ, conf.maxaz,
                             ROT_LIST_COL_MINEL, conf.minel,
@@ -453,6 +460,7 @@
     rotor_conf_t conf = {
         .name  = NULL,
         .host  = NULL,
+        .port  = 4533,
         .minaz = 0,
         .maxaz = 360,
         .minel = 0,
@@ -480,6 +488,7 @@
         gtk_tree_model_get (model, &iter,
                             ROT_LIST_COL_NAME, &conf.name,
                             ROT_LIST_COL_HOST, &conf.host,
+                            ROT_LIST_COL_PORT, &conf.port,
                             ROT_LIST_COL_MINAZ, &conf.minaz,
                             ROT_LIST_COL_MAXAZ, &conf.maxaz,
                             ROT_LIST_COL_MINEL, &conf.minel,
@@ -510,6 +519,7 @@
         gtk_list_store_set (GTK_LIST_STORE(model), &iter,
                             ROT_LIST_COL_NAME, conf.name,
                             ROT_LIST_COL_HOST, conf.host,
+                            ROT_LIST_COL_PORT, conf.port,
                             ROT_LIST_COL_MINAZ, conf.minaz,
                             ROT_LIST_COL_MAXAZ, conf.maxaz,
                             ROT_LIST_COL_MINEL, conf.minel,
@@ -587,13 +597,13 @@
                           GtkTreeIter       *iter,
                           gpointer           column)
 {
-    gint   number;
+    gdouble   number;
     guint   coli = GPOINTER_TO_UINT (column);
     gchar  *text;
     
     gtk_tree_model_get (model, iter, coli, &number, -1);
 
-    text = g_strdup_printf ("%d\302\260", number);
+    text = g_strdup_printf ("%.0f\302\260", number);
     g_object_set (renderer, "text", text, NULL);
     g_free (text);
 }
@@ -601,52 +611,5 @@
 
 
 
-/** \brief Render rotator type.
- * \param col Pointer to the tree view column.
- * \param renderer Pointer to the renderer.
- * \param model Pointer to the tree model.
- * \param iter Pointer to the tree iterator.
- * \param column The column number in the model.
- * 
- * This function renders the rotator type onto the rotator list.
- * The rotator type is stored as enum; however, we want to display it
- * using some escriptive text, e.g. "AZ", "EL", and so on
- */
-static void render_rot_type (GtkTreeViewColumn *col,
-                             GtkCellRenderer   *renderer,
-                             GtkTreeModel      *model,
-                             GtkTreeIter       *iter,
-                             gpointer           column)
-{
-    guint    number;
-    guint   coli = GPOINTER_TO_UINT (column);
-    
-    gtk_tree_model_get (model, iter, coli, &number, -1);
 
-/*    switch (number) {
 
-        case ROTOR_TYPE_AZ:
-            g_object_set (renderer, "text", "AZ", NULL);
-            break;
-
-        case ROTOR_TYPE_EL:
-            g_object_set (renderer, "text", "EL", NULL);
-            break;
-
-        case ROTOR_TYPE_AZEL:
-            g_object_set (renderer, "text", "AZ/EL", NULL);
-            break;
-
-        default:
-            sat_log_log (SAT_LOG_LEVEL_ERROR,
-                         _("%s:%s: Invalid type: %d. Using AZ."),
-                           __FILE__, __FUNCTION__, number);
-            g_object_set (renderer, "text", "AZ", NULL);
-            break;
-        
-    }*/
-    
-}
-
-
-
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-08-28 22:11:57
       | 
| Revision: 78
          http://gpredict.svn.sourceforge.net/gpredict/?rev=78&view=rev
Author:   csete
Date:     2008-08-28 22:12:08 +0000 (Thu, 28 Aug 2008)
Log Message:
-----------
Updated.
Modified Paths:
--------------
    trunk/src/gtk-rot-ctrl.c
    trunk/src/gtk-rot-ctrl.h
Modified: trunk/src/gtk-rot-ctrl.c
===================================================================
--- trunk/src/gtk-rot-ctrl.c	2008-08-28 18:00:53 UTC (rev 77)
+++ trunk/src/gtk-rot-ctrl.c	2008-08-28 22:12:08 UTC (rev 78)
@@ -31,13 +31,16 @@
  * The master rotator control UI is implemented as a Gtk+ Widget in order
  * to allow multiple instances. The widget is created from the module
  * popup menu and each module can have several rotator control windows
- * attached to it.
+ * attached to it. Note, however, that current implementation only
+ * allows one rotor control window per module.
  * 
  */
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #include <math.h>
+#include "compat.h"
 #include "sat-log.h"
+#include "gtk-rot-knob.h"
 #include "gtk-rot-ctrl.h"
 #ifdef HAVE_CONFIG_H
 #  include <build-config.h>
@@ -64,6 +67,8 @@
 static void track_toggle_cb (GtkToggleButton *button, gpointer data);
 static void delay_changed_cb (GtkSpinButton *spin, gpointer data);
 static void toler_changed_cb (GtkSpinButton *spin, gpointer data);
+static void rot_selected_cb (GtkComboBox *box, gpointer data);
+static void rot_locked_cb (GtkToggleButton *button, gpointer data);
 static gboolean rot_ctrl_timeout_cb (gpointer data);
 
 
@@ -133,6 +138,7 @@
     
     ctrl->tracking = FALSE;
     ctrl->busy = FALSE;
+    ctrl->engaged = FALSE;
     ctrl->delay = 1000;
     ctrl->timerid = 0;
     ctrl->tolerance = 1.0;
@@ -236,12 +242,26 @@
 static
 GtkWidget *create_az_widgets (GtkRotCtrl *ctrl)
 {
-    GtkWidget *frame;
+    GtkWidget   *frame;
+    GtkWidget   *table;
+    GtkWidget   *label;
     
+    
     frame = gtk_frame_new (_("Azimuth"));
     
+    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->AzSet = gtk_rot_knob_new (0.0, 360.0, 180.0);
-    gtk_container_add (GTK_CONTAINER (frame), ctrl->AzSet);
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->AzSet, 1, 2, 0, 1);
+                       
+    label = gtk_label_new (NULL);
+    gtk_label_set_markup (GTK_LABEL (label), _("Read:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
     
     return frame;
 }
@@ -256,10 +276,28 @@
 static
 GtkWidget *create_el_widgets (GtkRotCtrl *ctrl)
 {
-    GtkWidget *frame;
+    GtkWidget   *frame;
+    GtkWidget   *table;
+    GtkWidget   *label;
+
     
     frame = gtk_frame_new (_("Elevation"));
+
+    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->ElSet = gtk_rot_knob_new (0.0, 90.0, 45.0);
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->ElSet, 1, 2, 0, 1);
+                       
+    label = gtk_label_new (NULL);
+    gtk_label_set_markup (GTK_LABEL (label), _("Read:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
+    
+
     return frame;
 }
 
@@ -274,12 +312,14 @@
     guint i, n;
     sat_t *sat = NULL;
     
-    
+
     buff = g_strdup_printf (FMTSTR, 0.0);
     
     table = gtk_table_new (4, 3, 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);
+
     /* sat selector */
     satsel = gtk_combo_box_new_text ();
     n = g_slist_length (ctrl->sats);
@@ -292,14 +332,12 @@
     gtk_combo_box_set_active (GTK_COMBO_BOX (satsel), 0);
     gtk_widget_set_tooltip_text (satsel, _("Select target object"));
     g_signal_connect (satsel, "changed", G_CALLBACK (sat_selected_cb), ctrl);
-    gtk_table_attach (GTK_TABLE (table), satsel, 0, 2, 0, 1,
-                     GTK_FILL, GTK_FILL, 5, 5);
+    gtk_table_attach_defaults (GTK_TABLE (table), satsel, 0, 2, 0, 1);
     
     /* tracking button */
     track = gtk_toggle_button_new_with_label (_("Track"));
     gtk_widget_set_tooltip_text (track, _("Track the satellite when it is within range"));
-    gtk_table_attach (GTK_TABLE (table), track, 2, 3, 0, 1,
-                     GTK_SHRINK, GTK_SHRINK, 5, 0);
+    gtk_table_attach_defaults (GTK_TABLE (table), track, 2, 3, 0, 1);
     g_signal_connect (track, "toggled", G_CALLBACK (track_toggle_cb), ctrl);
     
     /* Azimuth */
@@ -340,14 +378,72 @@
 create_conf_widgets (GtkRotCtrl *ctrl)
 {
     GtkWidget *frame,*table,*label,*timer,*toler;
+    GtkWidget   *lock;
+    GDir        *dir = NULL;   /* directory handle */
+    GError      *error = NULL; /* error flag and info */
+    gchar       *cfgdir;
+    gchar       *dirname;      /* directory name */
+    gchar      **vbuff;
+    const gchar *filename;     /* file name */
+
     
-    table = gtk_table_new (2, 3, TRUE);
+    
+    table = gtk_table_new (3, 3, 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);
     
+    
+    label = gtk_label_new (_("Device:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1);
+    
+    ctrl->DevSel = gtk_combo_box_new_text ();
+    gtk_widget_set_tooltip_text (ctrl->DevSel, _("Select antenna rotator device"));
+    
+    /* open configuration directory */
+    cfgdir = get_conf_dir ();
+    dirname = g_strconcat (cfgdir, G_DIR_SEPARATOR_S,
+                           "hwconf", NULL);
+    g_free (cfgdir);
+    
+    dir = g_dir_open (dirname, 0, &error);
+    if (dir) {
+        /* read each .rig file */
+        while ((filename = g_dir_read_name (dir))) {
+            
+            if (g_strrstr (filename, ".rot")) {
+                
+                vbuff = g_strsplit (filename, ".rot", 0);
+                gtk_combo_box_append_text (GTK_COMBO_BOX (ctrl->DevSel), vbuff[0]);
+                g_strfreev (vbuff);
+            }
+        }
+    }
+    else {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s:%d: Failed to open hwconf dir (%s)"),
+                       __FILE__, __LINE__, error->message);
+        g_clear_error (&error);
+    }
+
+    g_free (dirname);
+    g_dir_close (dir);
+
+    gtk_combo_box_set_active (GTK_COMBO_BOX (ctrl->DevSel), 0);
+    g_signal_connect (ctrl->DevSel, "changed", G_CALLBACK (rot_selected_cb), ctrl);
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->DevSel, 1, 2, 0, 1);
+            
+    /* Engage button */
+    lock = gtk_toggle_button_new_with_label (_("Engage"));
+    gtk_widget_set_tooltip_text (lock, _("Engage the selcted rotor device"));
+    g_signal_connect (lock, "toggled", G_CALLBACK (rot_locked_cb), ctrl);
+    gtk_table_attach_defaults (GTK_TABLE (table), lock, 2, 3, 0, 1);
+    
     /* Timeout */
     label = gtk_label_new (_("Cycle:"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
     
     timer = gtk_spin_button_new_with_range (100, 5000, 10);
     gtk_spin_button_set_digits (GTK_SPIN_BUTTON (timer), 0);
@@ -356,17 +452,17 @@
                                    "commands sent to the rotator."));
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (timer), ctrl->delay);
     g_signal_connect (timer, "value-changed", G_CALLBACK (delay_changed_cb), ctrl);
-    gtk_table_attach (GTK_TABLE (table), timer, 1, 2, 0, 1,
+    gtk_table_attach (GTK_TABLE (table), timer, 1, 2, 1, 2,
                       GTK_FILL, GTK_FILL, 0, 0);
     
     label = gtk_label_new (_("msec"));
     gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 0, 1);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 1, 2);
 
     /* Tolerance */
     label = gtk_label_new (_("Tolerance:"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3);
     
     toler = gtk_spin_button_new_with_range (0.0, 10.0, 0.1);
     gtk_spin_button_set_digits (GTK_SPIN_BUTTON (toler), 1);
@@ -377,13 +473,13 @@
                                    "is smaller than the tolerance, no new commands are sent"));
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (toler), ctrl->tolerance);
     g_signal_connect (toler, "value-changed", G_CALLBACK (toler_changed_cb), ctrl);
-    gtk_table_attach (GTK_TABLE (table), toler, 1, 2, 1, 2,
+    gtk_table_attach (GTK_TABLE (table), toler, 1, 2, 2, 3,
                       GTK_FILL, GTK_FILL, 0, 0);
     
     
     label = gtk_label_new (_("deg"));
     gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 1, 2);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 2, 3);
     
     
     frame = gtk_frame_new (_("Settings"));
@@ -495,8 +591,43 @@
 }
 
 
+/** \brief New rotor device selected.
+ * \param box Pointer to the rotor selector combo box.
+ * \param data Pointer to the GtkRotCtrl widget.
+ * 
+ * This function is called when the user selects a new rotor controller
+ * device.
+ */
+static void
+rot_selected_cb (GtkComboBox *box, gpointer data)
+{
+    GtkRotCtrl *ctrl = GTK_ROT_CTRL (data);
+    
+}
 
 
+/** \brief Rotor locked.
+ * \param button Pointer to the "Engage" button.
+ * \param data Pointer to the GtkRotCtrl widget.
+ * 
+ * This function is called when the user toggles the "Engage" button.
+ */
+static void
+rot_locked_cb (GtkToggleButton *button, gpointer data)
+{
+    GtkRotCtrl *ctrl = GTK_ROT_CTRL (data);
+    
+    if (gtk_toggle_button_get_active (button)) {
+        gtk_widget_set_sensitive (ctrl->DevSel, FALSE);
+        ctrl->engaged = FALSE;
+    }
+    else {
+        gtk_widget_set_sensitive (ctrl->DevSel, TRUE);
+        ctrl->engaged = TRUE;
+    }
+}
+
+
 /** \brief Rotator controller timeout function
  * \param data Pointer to the GtkRotCtrl widget.
  * \return Always TRUE to let the timer continue.
@@ -513,13 +644,19 @@
     
     ctrl->busy = TRUE;
     
-    /* do something */
+
+    if (ctrl->engaged) {
+        
+        
+        
+    }
     
+    /* update current pointing marker on polar view */
+    
+    
     ctrl->busy = FALSE;
     
     return TRUE;
 }
 
 
-
-
Modified: trunk/src/gtk-rot-ctrl.h
===================================================================
--- trunk/src/gtk-rot-ctrl.h	2008-08-28 18:00:53 UTC (rev 77)
+++ trunk/src/gtk-rot-ctrl.h	2008-08-28 22:12:08 UTC (rev 78)
@@ -62,13 +62,14 @@
 {
 	GtkVBox vbox;
     
-    /* Azimuth labels */
-    GtkWidget *AzSat,*AzDelta,*AzLock,*AzSet,*AzRead;
+    /* Azimuth widgets */
+    GtkWidget *AzSat,*AzSet,*AzRead,*AzDevSel;
     
-    /* Elevation labels */
-    GtkWidget *ElSat,*ElDelta,*ElLock,*ElSet,*ElRead;
+    /* Elevation widgets */
+    GtkWidget *ElSat,*ElSet,*ElRead,*ElDevSel,*ElDev;
     
     /* other widgets */
+    GtkWidget *DevSel;
     
     /* satellites */
     GSList *sats;
@@ -78,8 +79,9 @@
     guint timerid;     /*!< Timer ID */
     gdouble tolerance;  /*!< Error tolerance */
     
-    gboolean tracking;
-    gboolean busy;
+    gboolean tracking;  /*!< Flag set when we are tracking a target. */
+    gboolean busy;      /*!< Flag set when control algorithm is busy. */
+    gboolean engaged;   /*!< Flag indicating that rotor device is engaged. */
 };
 
 struct _GtkRotCtrlClass
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-03 21:24:33
       | 
| Revision: 80
          http://gpredict.svn.sourceforge.net/gpredict/?rev=80&view=rev
Author:   csete
Date:     2008-09-03 21:24:41 +0000 (Wed, 03 Sep 2008)
Log Message:
-----------
Added API functions to get/set range of the control widget.
Modified Paths:
--------------
    trunk/src/gtk-rot-knob.c
    trunk/src/gtk-rot-knob.h
Modified: trunk/src/gtk-rot-knob.c
===================================================================
--- trunk/src/gtk-rot-knob.c	2008-08-28 22:13:14 UTC (rev 79)
+++ trunk/src/gtk-rot-knob.c	2008-09-03 21:24:41 UTC (rev 80)
@@ -130,7 +130,7 @@
  * 
  */
 GtkWidget *
-gtk_rot_knob_new (gfloat min, gfloat max, gfloat val)
+gtk_rot_knob_new (gdouble min, gdouble max, gdouble val)
 {
     GtkWidget *widget;
     GtkWidget *table;
@@ -300,7 +300,7 @@
  * 
  */
 void
-gtk_rot_knob_set_value (GtkRotKnob *knob, gfloat val)
+gtk_rot_knob_set_value (GtkRotKnob *knob, gdouble val)
 {
     /* set the new value */
     if (val <= knob->min)
@@ -322,14 +322,73 @@
  * Hint: For reading the value you can also access knob->value.
  * 
  */
-gfloat
+gdouble
 gtk_rot_knob_get_value (GtkRotKnob *knob)
 {
     return knob->value;
 }
 
 
+/** \brief Get the upper limit of the control widget
+ * \param[in] knob The rotor control widget.
+ * \return The upper limit of the control widget.
+ */
+gdouble
+gtk_rot_knob_get_max   (GtkRotKnob *knob)
+{
+    return knob->max;
+}
 
+
+/** \brief Get the lower limit of the control widget
+ * \param[in] knob The rotor control widget.
+ * \return The lower limit of the control widget.
+ */
+gdouble
+gtk_rot_knob_get_min   (GtkRotKnob *knob)
+{
+    return knob->min;
+}
+
+
+/** \brief Set the lower limit of the control widget
+ * \param[in] knob The rotor control widget.
+ * \param[in] min The new lower limit of the control widget.
+ */
+void
+gtk_rot_knob_set_min   (GtkRotKnob *knob, gdouble min)
+{
+    /* just som sanity check we have only 3 digits */
+    if (min < 1000)
+        knob->min = min;
+}
+
+/** \brief Set the upper limit of the control widget
+ * \param[in] knob The rotor control widget.
+ * \param[in] min The new upper limit of the control widget.
+ */
+void
+gtk_rot_knob_set_max (GtkRotKnob *knob, gdouble max)
+{
+    /* just som sanity check we have only 3 digits */
+    if (max < 1000)
+        knob->max = max;
+}
+
+
+/** \brief Set the range of the control widget
+ * \param[in] knob The rotor control widget.
+ * \param[in] min The new lower limit of the control widget.
+ * \param[in] max The new upper limit of the control widget.
+ */
+void
+gtk_rot_knob_set_range (GtkRotKnob *knob, gdouble min, gdouble max)
+{
+    gtk_rot_knob_set_min (knob, min);
+    gtk_rot_knob_set_max (knob, max);
+}
+
+
 /** \brief Update rotor display widget.
  *  \param[in] knob The rotor control widget.
  * 
@@ -369,7 +428,7 @@
 button_clicked_cb (GtkWidget *button, gpointer data)
 {
     GtkRotKnob *knob = GTK_ROT_KNOB (data);
-    gfloat delta = GPOINTER_TO_INT(g_object_get_data (G_OBJECT (button), "delta")) / 100.0;
+    gdouble delta = GPOINTER_TO_INT(g_object_get_data (G_OBJECT (button), "delta")) / 100.0;
     
     if ((delta > 0.0) && ((knob->value + delta) <= knob->max)) {
         knob->value += delta;
@@ -382,3 +441,5 @@
     
     g_print ("VAL: %.2f\n", knob->value);
 }
+
+
Modified: trunk/src/gtk-rot-knob.h
===================================================================
--- trunk/src/gtk-rot-knob.h	2008-08-28 22:13:14 UTC (rev 79)
+++ trunk/src/gtk-rot-knob.h	2008-09-03 21:24:41 UTC (rev 80)
@@ -64,9 +64,9 @@
     GtkWidget *digits[7];   /*!< Labels for the digits */
     GtkWidget *buttons[10]; /*!< Buttons; 0..4 up; 5..9 down */
 	
-    gfloat min;
-    gfloat max;
-    gfloat value;
+    gdouble min;
+    gdouble max;
+    gdouble value;
 };
 
 struct _GtkRotKnobClass
@@ -77,9 +77,15 @@
 
 
 GtkType    gtk_rot_knob_get_type  (void);
-GtkWidget* gtk_rot_knob_new       (gfloat min, gfloat max, gfloat val);
-void       gtk_rot_knob_set_value (GtkRotKnob *knob, gfloat val);
-gfloat     gtk_rot_knob_get_value (GtkRotKnob *knob);
+GtkWidget* gtk_rot_knob_new       (gdouble min, gdouble max, gdouble val);
+void       gtk_rot_knob_set_value (GtkRotKnob *knob, gdouble val);
+gdouble    gtk_rot_knob_get_value (GtkRotKnob *knob);
+void       gtk_rot_knob_set_max   (GtkRotKnob *knob, gdouble max);
+gdouble    gtk_rot_knob_get_max   (GtkRotKnob *knob);
+gdouble    gtk_rot_knob_get_min   (GtkRotKnob *knob);
+void       gtk_rot_knob_set_min   (GtkRotKnob *knob, gdouble min);
+void       gtk_rot_knob_set_max   (GtkRotKnob *knob, gdouble max);
+void       gtk_rot_knob_set_range (GtkRotKnob *knob, gdouble min, gdouble max);
 
 
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-03 22:45:43
       | 
| Revision: 81
          http://gpredict.svn.sourceforge.net/gpredict/?rev=81&view=rev
Author:   csete
Date:     2008-09-03 22:45:47 +0000 (Wed, 03 Sep 2008)
Log Message:
-----------
Implemented controller algorithm (except device I/O).
Modified Paths:
--------------
    trunk/src/gtk-rot-ctrl.c
    trunk/src/gtk-rot-ctrl.h
Modified: trunk/src/gtk-rot-ctrl.c
===================================================================
--- trunk/src/gtk-rot-ctrl.c	2008-09-03 21:24:41 UTC (rev 80)
+++ trunk/src/gtk-rot-ctrl.c	2008-09-03 22:45:47 UTC (rev 81)
@@ -40,6 +40,7 @@
 #include <math.h>
 #include "compat.h"
 #include "sat-log.h"
+#include "predict-tools.h"
 #include "gtk-rot-knob.h"
 #include "gtk-rot-ctrl.h"
 #ifdef HAVE_CONFIG_H
@@ -135,6 +136,8 @@
 {
     ctrl->sats = NULL;
     ctrl->target = NULL;
+    ctrl->pass = NULL;
+    ctrl->qth = NULL;
     
     ctrl->tracking = FALSE;
     ctrl->busy = FALSE;
@@ -177,6 +180,14 @@
     
     GTK_ROT_CTRL (widget)->target = SAT (g_slist_nth_data (GTK_ROT_CTRL (widget)->sats, 0));
     
+    /* store QTH */
+    GTK_ROT_CTRL (widget)->qth = module->qth;
+    
+    /* get next pass for target satellite */
+    GTK_ROT_CTRL (widget)->pass = get_next_pass (GTK_ROT_CTRL (widget)->target,
+                                                 GTK_ROT_CTRL (widget)->qth,
+                                                 3.0);
+    
     /* initialise custom colors */
     gdk_rgb_find_color (gtk_widget_get_colormap (widget), &ColBlack);
     gdk_rgb_find_color (gtk_widget_get_colormap (widget), &ColWhite);
@@ -229,6 +240,21 @@
         buff = g_strdup_printf (FMTSTR, ctrl->target->el);
         gtk_label_set_text (GTK_LABEL (ctrl->ElSat), buff);
         g_free (buff);
+        
+        /* update next pass if necessary */
+        if (ctrl->pass != NULL) {
+            if (ctrl->target->aos > ctrl->pass->aos) {
+                /* update pass */
+                free_pass (ctrl->pass);
+                ctrl->pass = get_next_pass (ctrl->target, ctrl->qth, 3.0);
+                /* TODO: update polar plot */
+            }
+        }
+        else {
+            /* we don't have any current pass; store the current one */
+            ctrl->pass = get_next_pass (ctrl->target, ctrl->qth, 3.0);
+            /* TODO: update polar plot */
+        }
     }
 }
 
@@ -530,11 +556,23 @@
     i = gtk_combo_box_get_active (satsel);
     if (i >= 0) {
         ctrl->target = SAT (g_slist_nth_data (ctrl->sats, i));
+        
+        /* update next pass */
+        if (ctrl->pass != NULL)
+            free_pass (ctrl->pass);
+        ctrl->pass = get_next_pass (ctrl->target, ctrl->qth, 3.0);
     }
     else {
         sat_log_log (SAT_LOG_LEVEL_ERROR,
                      _("%s:%s: Invalid satellite selection: %d"),
                      __FILE__, __FUNCTION__, i);
+        
+        /* clear pass just in case... */
+        if (ctrl->pass != NULL) {
+            free_pass (ctrl->pass);
+            ctrl->pass = NULL;
+        }
+        
     }
 }
 
@@ -603,6 +641,9 @@
 {
     GtkRotCtrl *ctrl = GTK_ROT_CTRL (data);
     
+    /* TODO: update device */
+    
+    /* TODO: update ranges */
 }
 
 
@@ -644,16 +685,38 @@
     
     ctrl->busy = TRUE;
     
+    /* If we are tracking and the target satellite is within
+       range, set the rotor position controller knob values to
+       the target values. If the target satellite is out of range
+       set the rotor controller to 0 deg El and to the Az where the
+       target sat is expected to come up
+    */
+    if (ctrl->tracking) {
+        if (ctrl->target->el < 0.0) {
+            gdouble aosaz = 0.0;
+            
+            if (ctrl->pass != NULL) {
+                aosaz = ctrl->pass->aos_az;
+            }
+            gtk_rot_knob_set_value (GTK_ROT_KNOB (ctrl->AzSet), aosaz);
+            gtk_rot_knob_set_value (GTK_ROT_KNOB (ctrl->ElSet), 0.0);
+        }
+        else {
+            gtk_rot_knob_set_value (GTK_ROT_KNOB (ctrl->AzSet), ctrl->target->az);
+            gtk_rot_knob_set_value (GTK_ROT_KNOB (ctrl->ElSet), ctrl->target->el);
+        }
+        
+        /* TODO: Update controller thread on polar plot */
+    }
 
     if (ctrl->engaged) {
-        
-        
-        
+        /* if tolerance exceeded */
+        /* TODO: send controller values to rotator device */
+        /* TODO: read back current position from device */
+        /* TODO: update polar plot */
     }
     
-    /* update current pointing marker on polar view */
     
-    
     ctrl->busy = FALSE;
     
     return TRUE;
Modified: trunk/src/gtk-rot-ctrl.h
===================================================================
--- trunk/src/gtk-rot-ctrl.h	2008-09-03 21:24:41 UTC (rev 80)
+++ trunk/src/gtk-rot-ctrl.h	2008-09-03 22:45:47 UTC (rev 81)
@@ -72,9 +72,11 @@
     GtkWidget *DevSel;
     
     /* satellites */
-    GSList *sats;
-    sat_t  *target;
-
+    GSList *sats;       /*!< List of sats in parent module */
+    sat_t  *target;     /*!< Target satellite */
+    pass_t *pass;       /*!< Next pass of target satellite */
+    qth_t  *qth;        /*!< The QTH for this module */
+    
     guint delay;       /*!< Timeout delay. */
     guint timerid;     /*!< Timer ID */
     gdouble tolerance;  /*!< Error tolerance */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-05 18:59:03
       | 
| Revision: 84
          http://gpredict.svn.sourceforge.net/gpredict/?rev=84&view=rev
Author:   csete
Date:     2008-09-05 18:59:10 +0000 (Fri, 05 Sep 2008)
Log Message:
-----------
Added radio controller widget skeleton.
Added Paths:
-----------
    trunk/src/gtk-rig-ctrl.c
    trunk/src/gtk-rig-ctrl.h
Added: trunk/src/gtk-rig-ctrl.c
===================================================================
--- trunk/src/gtk-rig-ctrl.c	                        (rev 0)
+++ trunk/src/gtk-rig-ctrl.c	2008-09-05 18:59:10 UTC (rev 84)
@@ -0,0 +1,655 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*
+  Gpredict: Real-time satellite tracking and orbit prediction program
+
+  Copyright (C)  2001-2007  Alexandru Csete, OZ9AEC.
+
+  Authors: Alexandru Csete <oz...@gm...>
+
+  Comments, questions and bugreports should be submitted via
+  http://sourceforge.net/projects/groundstation/
+  More details can be found at the project home page:
+
+  http://groundstation.sourceforge.net/
+ 
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+  
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+  
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, visit http://www.fsf.org/
+*/
+/** \brief RIG control window.
+ *  \ingroup widgets
+ *
+ * The master radio control UI is implemented as a Gtk+ Widget in order
+ * to allow multiple instances. The widget is created from the module
+ * popup menu and each module can have several radio control windows
+ * attached to it. Note, however, that current implementation only
+ * allows one control window per module.
+ * 
+ */
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+#include <math.h>
+#include "compat.h"
+#include "sat-log.h"
+#include "predict-tools.h"
+#include "gtk-freq-knob.h"
+#include "gtk-rig-ctrl.h"
+#ifdef HAVE_CONFIG_H
+#  include <build-config.h>
+#endif
+
+
+#define FMTSTR "%7.2f\302\260"
+
+
+static void gtk_rig_ctrl_class_init (GtkRigCtrlClass *class);
+static void gtk_rig_ctrl_init       (GtkRigCtrl      *list);
+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_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);
+
+static void sat_selected_cb (GtkComboBox *satsel, gpointer data);
+static void track_toggle_cb (GtkToggleButton *button, gpointer data);
+static void delay_changed_cb (GtkSpinButton *spin, gpointer data);
+static void rig_selected_cb (GtkComboBox *box, gpointer data);
+static void rig_locked_cb (GtkToggleButton *button, gpointer data);
+static gboolean rig_ctrl_timeout_cb (gpointer data);
+
+
+static GtkVBoxClass *parent_class = NULL;
+
+static GdkColor ColBlack = { 0, 0, 0, 0};
+static GdkColor ColWhite = { 0, 0xFFFF, 0xFFFF, 0xFFFF};
+static GdkColor ColRed =   { 0, 0xFFFF, 0, 0};
+static GdkColor ColGreen = {0, 0, 0xFFFF, 0};
+
+
+GType
+gtk_rig_ctrl_get_type ()
+{
+	static GType gtk_rig_ctrl_type = 0;
+
+	if (!gtk_rig_ctrl_type) {
+
+		static const GTypeInfo gtk_rig_ctrl_info = {
+			sizeof (GtkRigCtrlClass),
+			NULL,  /* base_init */
+			NULL,  /* base_finalize */
+			(GClassInitFunc) gtk_rig_ctrl_class_init,
+			NULL,  /* class_finalize */
+			NULL,  /* class_data */
+			sizeof (GtkRigCtrl),
+			5,     /* n_preallocs */
+			(GInstanceInitFunc) gtk_rig_ctrl_init,
+		};
+
+		gtk_rig_ctrl_type = g_type_register_static (GTK_TYPE_VBOX,
+												    "GtkRigCtrl",
+													>k_rig_ctrl_info,
+													0);
+	}
+
+	return gtk_rig_ctrl_type;
+}
+
+
+static void
+gtk_rig_ctrl_class_init (GtkRigCtrlClass *class)
+{
+	GObjectClass      *gobject_class;
+	GtkObjectClass    *object_class;
+	GtkWidgetClass    *widget_class;
+	GtkContainerClass *container_class;
+
+	gobject_class   = G_OBJECT_CLASS (class);
+	object_class    = (GtkObjectClass*) class;
+	widget_class    = (GtkWidgetClass*) class;
+	container_class = (GtkContainerClass*) class;
+
+	parent_class = g_type_class_peek_parent (class);
+
+	object_class->destroy = gtk_rig_ctrl_destroy;
+ 
+}
+
+
+
+static void
+gtk_rig_ctrl_init (GtkRigCtrl *ctrl)
+{
+    ctrl->sats = NULL;
+    ctrl->target = NULL;
+    ctrl->pass = NULL;
+    ctrl->qth = NULL;
+    
+    ctrl->tracking = FALSE;
+    ctrl->busy = FALSE;
+    ctrl->engaged = FALSE;
+    ctrl->delay = 1000;
+    ctrl->timerid = 0;
+}
+
+static void
+gtk_rig_ctrl_destroy (GtkObject *object)
+{
+    GtkRigCtrl *ctrl = GTK_RIG_CTRL (object);
+    
+    
+    /* stop timer */
+    if (ctrl->timerid > 0) 
+        g_source_remove (ctrl->timerid);
+
+    
+	(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+
+
+/** \brief Create a new rig control widget.
+ * \return A new rig control window.
+ * 
+ */
+GtkWidget *
+gtk_rig_ctrl_new (GtkSatModule *module)
+{
+    GtkWidget *widget;
+    GtkWidget *table;
+
+	widget = g_object_new (GTK_TYPE_RIG_CTRL, NULL);
+    
+    /* store satellites */
+    g_hash_table_foreach (module->satellites, store_sats, widget);
+    
+    GTK_RIG_CTRL (widget)->target = SAT (g_slist_nth_data (GTK_RIG_CTRL (widget)->sats, 0));
+    
+    /* store QTH */
+    GTK_RIG_CTRL (widget)->qth = module->qth;
+    
+    /* get next pass for target satellite */
+    GTK_RIG_CTRL (widget)->pass = get_next_pass (GTK_RIG_CTRL (widget)->target,
+                                                 GTK_RIG_CTRL (widget)->qth,
+                                                 3.0);
+    
+    /* initialise custom colors */
+    gdk_rgb_find_color (gtk_widget_get_colormap (widget), &ColBlack);
+    gdk_rgb_find_color (gtk_widget_get_colormap (widget), &ColWhite);
+    gdk_rgb_find_color (gtk_widget_get_colormap (widget), &ColRed);
+    gdk_rgb_find_color (gtk_widget_get_colormap (widget), &ColGreen);
+
+    /* create contents */
+    table = gtk_table_new (3, 2, TRUE);
+    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)),
+                      0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
+    gtk_table_attach (GTK_TABLE (table), create_el_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);
+
+    gtk_container_add (GTK_CONTAINER (widget), table);
+    
+    GTK_RIG_CTRL (widget)->timerid = g_timeout_add (GTK_RIG_CTRL (widget)->delay,
+                                                    rig_ctrl_timeout_cb,
+                                                    GTK_RIG_CTRL (widget));
+    
+	return widget;
+}
+
+
+/** \brief Update rig control state.
+ * \param ctrl Pointer to the GtkRigCtrl.
+ * 
+ * This function is called by the parent, i.e. GtkSatModule, indicating that
+ * the satellite data has been updated. The function updates the internal state
+ * of the controller and the rigator.
+ */
+void
+gtk_rig_ctrl_update   (GtkRigCtrl *ctrl, gdouble t)
+{
+    gchar *buff;
+    
+    if (ctrl->target) {
+        
+        /* update next pass if necessary */
+        if (ctrl->pass != NULL) {
+            if (ctrl->target->aos > ctrl->pass->aos) {
+                /* update pass */
+                free_pass (ctrl->pass);
+                ctrl->pass = get_next_pass (ctrl->target, ctrl->qth, 3.0);
+                /* TODO: update polar plot */
+            }
+        }
+        else {
+            /* we don't have any current pass; store the current one */
+            ctrl->pass = get_next_pass (ctrl->target, ctrl->qth, 3.0);
+            /* TODO: update polar plot */
+        }
+    }
+}
+
+
+/** \brief Create azimuth control widgets.
+ * \param ctrl Pointer to the GtkRigCtrl widget.
+ * 
+ * This function creates and initialises the widgets for controlling the
+ * azimuth of the the rigator.
+ * 
+ * TODO: RENAME!
+ */
+static
+GtkWidget *create_az_widgets (GtkRigCtrl *ctrl)
+{
+    GtkWidget   *frame;
+    GtkWidget   *table;
+    GtkWidget   *label;
+    
+    
+    frame = gtk_frame_new (_("Azimuth"));
+    
+    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);
+    
+    
+    return frame;
+}
+
+
+/** \brief Create elevation control 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
+ */
+static
+GtkWidget *create_el_widgets (GtkRigCtrl *ctrl)
+{
+    GtkWidget   *frame;
+    GtkWidget   *table;
+    GtkWidget   *label;
+
+    
+    frame = gtk_frame_new (_("Elevation"));
+
+    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);
+    
+
+    return frame;
+}
+
+/** \brief Create target widgets.
+ * \param ctrl Pointer to the GtkRigCtrl widget.
+ */
+static
+GtkWidget *create_target_widgets (GtkRigCtrl *ctrl)
+{
+    GtkWidget *frame,*table,*label,*satsel,*track;
+    gchar *buff;
+    guint i, n;
+    sat_t *sat = NULL;
+    
+
+    buff = g_strdup_printf (FMTSTR, 0.0);
+    
+    table = gtk_table_new (4, 3, 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);
+
+    /* sat selector */
+    satsel = gtk_combo_box_new_text ();
+    n = g_slist_length (ctrl->sats);
+    for (i = 0; i < n; i++) {
+        sat = SAT (g_slist_nth_data (ctrl->sats, i));
+        if (sat) {
+            gtk_combo_box_append_text (GTK_COMBO_BOX (satsel), sat->tle.sat_name);
+        }
+    }
+    gtk_combo_box_set_active (GTK_COMBO_BOX (satsel), 0);
+    gtk_widget_set_tooltip_text (satsel, _("Select target object"));
+    g_signal_connect (satsel, "changed", G_CALLBACK (sat_selected_cb), ctrl);
+    gtk_table_attach_defaults (GTK_TABLE (table), satsel, 0, 2, 0, 1);
+    
+    /* tracking button */
+    track = gtk_toggle_button_new_with_label (_("Track"));
+    gtk_widget_set_tooltip_text (track, _("Track the satellite when it is within range"));
+    gtk_table_attach_defaults (GTK_TABLE (table), track, 2, 3, 0, 1);
+    g_signal_connect (track, "toggled", G_CALLBACK (track_toggle_cb), ctrl);
+    
+    /* Azimuth */
+    label = gtk_label_new (_("Az:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
+    
+    
+    /* Elevation */
+    label = gtk_label_new (_("El:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3);
+    
+    
+    /* count down */
+    label = gtk_label_new (_("Time:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4);
+    
+    frame = gtk_frame_new (_("Target"));
+;
+    gtk_container_add (GTK_CONTAINER (frame), table);
+    
+    g_free (buff);
+    
+    return frame;
+}
+
+
+static GtkWidget *
+create_conf_widgets (GtkRigCtrl *ctrl)
+{
+    GtkWidget *frame,*table,*label,*timer,*toler;
+    GtkWidget   *lock;
+    GDir        *dir = NULL;   /* directory handle */
+    GError      *error = NULL; /* error flag and info */
+    gchar       *cfgdir;
+    gchar       *dirname;      /* directory name */
+    gchar      **vbuff;
+    const gchar *filename;     /* file name */
+
+    
+    
+    table = gtk_table_new (3, 3, 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);
+    
+    
+    label = gtk_label_new (_("Device:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1);
+    
+    ctrl->DevSel = gtk_combo_box_new_text ();
+    gtk_widget_set_tooltip_text (ctrl->DevSel, _("Select radio device"));
+    
+    /* open configuration directory */
+    cfgdir = get_conf_dir ();
+    dirname = g_strconcat (cfgdir, G_DIR_SEPARATOR_S,
+                           "hwconf", NULL);
+    g_free (cfgdir);
+    
+    dir = g_dir_open (dirname, 0, &error);
+    if (dir) {
+        /* read each .rig file */
+        while ((filename = g_dir_read_name (dir))) {
+            
+            if (g_strrstr (filename, ".rig")) {
+                
+                vbuff = g_strsplit (filename, ".rig", 0);
+                gtk_combo_box_append_text (GTK_COMBO_BOX (ctrl->DevSel), vbuff[0]);
+                g_strfreev (vbuff);
+            }
+        }
+    }
+    else {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s:%d: Failed to open hwconf dir (%s)"),
+                       __FILE__, __LINE__, error->message);
+        g_clear_error (&error);
+    }
+
+    g_free (dirname);
+    g_dir_close (dir);
+
+    gtk_combo_box_set_active (GTK_COMBO_BOX (ctrl->DevSel), 0);
+    g_signal_connect (ctrl->DevSel, "changed", G_CALLBACK (rig_selected_cb), ctrl);
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->DevSel, 1, 2, 0, 1);
+            
+    /* Engage button */
+    lock = gtk_toggle_button_new_with_label (_("Engage"));
+    gtk_widget_set_tooltip_text (lock, _("Engage the selcted radio device"));
+    g_signal_connect (lock, "toggled", G_CALLBACK (rig_locked_cb), ctrl);
+    gtk_table_attach_defaults (GTK_TABLE (table), lock, 2, 3, 0, 1);
+    
+    /* Timeout */
+    label = gtk_label_new (_("Cycle:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
+    
+    timer = gtk_spin_button_new_with_range (100, 5000, 10);
+    gtk_spin_button_set_digits (GTK_SPIN_BUTTON (timer), 0);
+    gtk_widget_set_tooltip_text (timer,
+                                 _("This parameter controls the delay between "\
+                                   "commands sent to the rigator."));
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (timer), ctrl->delay);
+    g_signal_connect (timer, "value-changed", G_CALLBACK (delay_changed_cb), ctrl);
+    gtk_table_attach (GTK_TABLE (table), timer, 1, 2, 1, 2,
+                      GTK_FILL, GTK_FILL, 0, 0);
+    
+    label = gtk_label_new (_("msec"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 1, 2);
+
+    
+    frame = gtk_frame_new (_("Settings"));
+    gtk_container_add (GTK_CONTAINER (frame), table);
+    
+    return frame;
+}
+
+
+/** \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.
+ */
+static void
+store_sats (gpointer key, gpointer value, gpointer user_data)
+{
+    GtkRigCtrl *ctrl = GTK_RIG_CTRL( user_data);
+    sat_t        *sat = SAT (value);
+
+    ctrl->sats = g_slist_append (ctrl->sats, sat);
+}
+
+
+/** \brief Manage satellite selections
+ * \param satsel Pointer to the GtkComboBox.
+ * \param data Pointer to the GtkRigCtrl widget.
+ * 
+ * This function is called when the user selects a new satellite.
+ */
+static void
+sat_selected_cb (GtkComboBox *satsel, gpointer data)
+{
+    GtkRigCtrl *ctrl = GTK_RIG_CTRL (data);
+    gint i;
+    
+    i = gtk_combo_box_get_active (satsel);
+    if (i >= 0) {
+        ctrl->target = SAT (g_slist_nth_data (ctrl->sats, i));
+        
+        /* update next pass */
+        if (ctrl->pass != NULL)
+            free_pass (ctrl->pass);
+        ctrl->pass = get_next_pass (ctrl->target, ctrl->qth, 3.0);
+    }
+    else {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s:%s: Invalid satellite selection: %d"),
+                     __FILE__, __FUNCTION__, i);
+        
+        /* clear pass just in case... */
+        if (ctrl->pass != NULL) {
+            free_pass (ctrl->pass);
+            ctrl->pass = NULL;
+        }
+        
+    }
+}
+
+
+/** \brief Manage toggle signals (tracking)
+ * \param button Pointer to the GtkToggle button.
+ * \param data Pointer to the GtkRigCtrl widget.
+ */
+static void
+track_toggle_cb (GtkToggleButton *button, gpointer data)
+{
+    GtkRigCtrl *ctrl = GTK_RIG_CTRL (data);
+    
+    ctrl->tracking = gtk_toggle_button_get_active (button);
+}
+
+
+/** \brief Manage cycle delay changes.
+ * \param spin Pointer to the spin button.
+ * \param data Pointer to the GtkRigCtrl widget.
+ * 
+ * This function is called when the user changes the value of the
+ * cycle delay.
+ */
+static void
+delay_changed_cb (GtkSpinButton *spin, gpointer data)
+{
+    GtkRigCtrl *ctrl = GTK_RIG_CTRL (data);
+    
+    
+    ctrl->delay = (guint) gtk_spin_button_get_value (spin);
+
+    if (ctrl->timerid > 0) 
+        g_source_remove (ctrl->timerid);
+
+    ctrl->timerid = g_timeout_add (ctrl->delay, rig_ctrl_timeout_cb, ctrl);
+}
+
+
+
+
+/** \brief New rigor device selected.
+ * \param box Pointer to the rigor selector combo box.
+ * \param data Pointer to the GtkRigCtrl widget.
+ * 
+ * This function is called when the user selects a new rigor controller
+ * device.
+ */
+static void
+rig_selected_cb (GtkComboBox *box, gpointer data)
+{
+    GtkRigCtrl *ctrl = GTK_RIG_CTRL (data);
+    
+    /* TODO: update device */
+    
+
+}
+
+
+/** \brief Rig locked.
+ * \param button Pointer to the "Engage" button.
+ * \param data Pointer to the GtkRigCtrl widget.
+ * 
+ * This function is called when the user toggles the "Engage" button.
+ */
+static void
+rig_locked_cb (GtkToggleButton *button, gpointer data)
+{
+    GtkRigCtrl *ctrl = GTK_RIG_CTRL (data);
+    
+    if (gtk_toggle_button_get_active (button)) {
+        gtk_widget_set_sensitive (ctrl->DevSel, FALSE);
+        ctrl->engaged = FALSE;
+    }
+    else {
+        gtk_widget_set_sensitive (ctrl->DevSel, TRUE);
+        ctrl->engaged = TRUE;
+    }
+}
+
+
+/** \brief Rigator controller timeout function
+ * \param data Pointer to the GtkRigCtrl widget.
+ * \return Always TRUE to let the timer continue.
+ */
+static gboolean
+rig_ctrl_timeout_cb (gpointer data)
+{
+    GtkRigCtrl *ctrl = GTK_RIG_CTRL (data);
+    
+    if (ctrl->busy) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,_("%s missed the deadline"),__FUNCTION__);
+        return TRUE;
+    }
+    
+    ctrl->busy = TRUE;
+    
+    /* If we are tracking and the target satellite is within
+       range, set the rig controller knob value to the target 
+       frequency value. If the target satellite is out of range
+       set the rig controller to the frequency which we expect
+       when the target sat comes up.
+       In either case, update the range, delay, loss, rate, and
+       doppler values.
+    */
+    if (ctrl->tracking) {
+        if (ctrl->target->el < 0.0) {
+            gdouble aosshift = 0.0;
+            
+        }
+        else {
+        }
+        
+
+    }
+
+    if (ctrl->engaged) {
+        /* TODO: send controller values to radio device */
+    }
+    
+    
+    ctrl->busy = FALSE;
+    
+    return TRUE;
+}
+
+
Added: trunk/src/gtk-rig-ctrl.h
===================================================================
--- trunk/src/gtk-rig-ctrl.h	                        (rev 0)
+++ trunk/src/gtk-rig-ctrl.h	2008-09-05 18:59:10 UTC (rev 84)
@@ -0,0 +1,98 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*
+  Gpredict: Real-time satellite tracking and orbit prediction program
+
+  Copyright (C)  2001-2007  Alexandru Csete, OZ9AEC.
+
+  Authors: Alexandru Csete <oz...@gm...>
+
+  Comments, questions and bugreports should be submitted via
+  http://sourceforge.net/projects/groundstation/
+  More details can be found at the project home page:
+
+  http://groundstation.sourceforge.net/
+ 
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+  
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+  
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, visit http://www.fsf.org/
+*/
+#ifndef __GTK_RIG_CTRL_H__
+#define __GTK_RIG_CTRL_H__ 1
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include "sgpsdp/sgp4sdp4.h"
+#include "gtk-sat-module.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+
+
+#define GTK_TYPE_RIG_CTRL          (gtk_rig_ctrl_get_type ())
+#define GTK_RIG_CTRL(obj)          GTK_CHECK_CAST (obj,\
+				                   gtk_rig_ctrl_get_type (),\
+						           GtkRigCtrl)
+
+#define GTK_RIG_CTRL_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass,\
+							 gtk_rig_ctrl_get_type (),\
+							 GtkRigCtrlClass)
+
+#define IS_GTK_RIG_CTRL(obj)       GTK_CHECK_TYPE (obj, gtk_rig_ctrl_get_type ())
+
+
+typedef struct _gtk_rig_ctrl      GtkRigCtrl;
+typedef struct _GtkRigCtrlClass   GtkRigCtrlClass;
+
+
+
+struct _gtk_rig_ctrl
+{
+	GtkVBox vbox;
+    
+   
+    /* other widgets */
+    GtkWidget *DevSel;
+    
+    GSList *sats;       /*!< List of sats in parent module */
+    sat_t  *target;     /*!< Target satellite */
+    pass_t *pass;       /*!< Next pass of target satellite */
+    qth_t  *qth;        /*!< The QTH for this module */
+    
+    guint delay;       /*!< Timeout delay. */
+    guint timerid;     /*!< Timer ID */
+    
+    gboolean tracking;  /*!< Flag set when we are tracking a target. */
+    gboolean busy;      /*!< Flag set when control algorithm is busy. */
+    gboolean engaged;   /*!< Flag indicating that rig device is engaged. */
+};
+
+struct _GtkRigCtrlClass
+{
+	GtkVBoxClass parent_class;
+};
+
+
+
+GtkType    gtk_rig_ctrl_get_type (void);
+GtkWidget* gtk_rig_ctrl_new      (GtkSatModule *module);
+void       gtk_rig_ctrl_update   (GtkRigCtrl *ctrl, gdouble t);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __GTK_RIG_ctrl_H__ */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-05 18:59:52
       | 
| Revision: 85
          http://gpredict.svn.sourceforge.net/gpredict/?rev=85&view=rev
Author:   csete
Date:     2008-09-05 19:00:01 +0000 (Fri, 05 Sep 2008)
Log Message:
-----------
Use new radio controller widget.
Modified Paths:
--------------
    trunk/src/Makefile.am
    trunk/src/gtk-sat-module-popup.c
    trunk/src/gtk-sat-module.h
Modified: trunk/src/Makefile.am
===================================================================
--- trunk/src/Makefile.am	2008-09-05 18:59:10 UTC (rev 84)
+++ trunk/src/Makefile.am	2008-09-05 19:00:01 UTC (rev 85)
@@ -40,6 +40,7 @@
 	gtk-polar-plot.c gtk-polar-plot.h \
 	gtk-polar-view.c gtk-polar-view.h \
 	gtk-polar-view-popup.c gtk-polar-view-popup.h \
+	gtk-rig-ctrl.c gtk.rig-ctrl.h \
 	gtk-rot-ctrl.c gtk-rot-ctrl.h \
 	gtk-rot-knob.c gtk-rot-knob.h \
 	gtk-sat-data.c gtk-sat-data.h \
Modified: trunk/src/gtk-sat-module-popup.c
===================================================================
--- trunk/src/gtk-sat-module-popup.c	2008-09-05 18:59:10 UTC (rev 84)
+++ trunk/src/gtk-sat-module-popup.c	2008-09-05 19:00:01 UTC (rev 85)
@@ -41,6 +41,7 @@
 #include "gtk-sat-module.h"
 #include "gtk-sat-module-tmg.h"
 #include "gtk-sat-module-popup.h"
+#include "gtk-rig-ctrl.h"
 #include "gtk-rot-ctrl.h"
 #include "config-keys.h"
 
@@ -867,7 +868,6 @@
 rigctrl_cb          (GtkWidget *menuitem, gpointer data)
 {
     GtkSatModule *module = GTK_SAT_MODULE (data);
-    GtkWidget *rigctrl;
     gchar *buff;
     
     if (module->rigctrlwin != NULL) {
@@ -876,7 +876,7 @@
         return;
     }
 
-    //rigctrl = gtk_rot_ctrl_new ();
+    module->rigctrl = gtk_rig_ctrl_new (module);
     
     /* create a window */
     module->rigctrlwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
@@ -884,7 +884,7 @@
     gtk_window_set_title (GTK_WINDOW (module->rigctrlwin), buff);
     g_free (buff);
     g_signal_connect (G_OBJECT (module->rigctrlwin), "delete_event",
-                      G_CALLBACK (window_delete), NULL);    
+                      G_CALLBACK (window_delete), NULL);
     g_signal_connect (G_OBJECT (module->rigctrlwin), "destroy",
                       G_CALLBACK (destroy_rigctrl), module);
 
@@ -893,7 +893,7 @@
     gtk_window_set_icon_from_file (GTK_WINDOW (module->rigctrlwin), buff, NULL);
     g_free (buff);
     
-    //gtk_container_add (GTK_CONTAINER (module->rigctrlwin), rigctrl);
+    gtk_container_add (GTK_CONTAINER (module->rigctrlwin), module->rigctrl);
     
     gtk_widget_show_all (module->rigctrlwin);
 
@@ -912,6 +912,7 @@
     GtkSatModule *module = GTK_SAT_MODULE (data);
     
     module->rigctrlwin = NULL;
+    module->rigctrl = NULL;
 }
 
 
@@ -923,7 +924,6 @@
 rotctrl_cb          (GtkWidget *menuitem, gpointer data)
 {
     GtkSatModule *module = GTK_SAT_MODULE (data);
-    GtkWidget *rotctrl;
     gchar *buff;
     
     if (module->rotctrlwin != NULL) {
@@ -932,8 +932,7 @@
         return;
     }
 
-    rotctrl = gtk_rot_ctrl_new (module);
-    module->rotctrl = rotctrl;
+    module->rotctrl = gtk_rot_ctrl_new (module);
     
     /* create a window */
     module->rotctrlwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
@@ -950,7 +949,7 @@
     gtk_window_set_icon_from_file (GTK_WINDOW (module->rotctrlwin), buff, NULL);
     g_free (buff);
     
-    gtk_container_add (GTK_CONTAINER (module->rotctrlwin), rotctrl);
+    gtk_container_add (GTK_CONTAINER (module->rotctrlwin), module->rotctrl);
     
     gtk_widget_show_all (module->rotctrlwin);
 }
Modified: trunk/src/gtk-sat-module.h
===================================================================
--- trunk/src/gtk-sat-module.h	2008-09-05 18:59:10 UTC (rev 84)
+++ trunk/src/gtk-sat-module.h	2008-09-05 19:00:01 UTC (rev 85)
@@ -96,7 +96,8 @@
     GtkWidget     *rotctrlwin;  /*!< Rotator controller window */
     GtkWidget     *rotctrl;
     GtkWidget     *rigctrlwin;  /*!< Radio controller window */
-                              
+    GtkWidget     *rigctrl;
+
 	GtkWidget     *header;
 	guint          head_count;
 	guint          head_timeout;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      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.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-06 12:22:07
       | 
| Revision: 88
          http://gpredict.svn.sourceforge.net/gpredict/?rev=88&view=rev
Author:   csete
Date:     2008-09-06 12:22:17 +0000 (Sat, 06 Sep 2008)
Log Message:
-----------
Added option to hide buttons. Changed label packing to fill and expand into all y-space.
Modified Paths:
--------------
    trunk/src/gtk-freq-knob.c
    trunk/src/gtk-freq-knob.h
Modified: trunk/src/gtk-freq-knob.c
===================================================================
--- trunk/src/gtk-freq-knob.c	2008-09-06 12:02:22 UTC (rev 87)
+++ trunk/src/gtk-freq-knob.c	2008-09-06 12:22:17 UTC (rev 88)
@@ -137,11 +137,12 @@
 
 /** \brief Create a new Frequency control widget.
  * \param[in] val The initial value of the control.
+ * \param[in] buttons Flag indicating whether buttons should be shown
  * \return A new frequency control widget.
  * 
  */
 GtkWidget *
-gtk_freq_knob_new (gdouble val)
+gtk_freq_knob_new (gdouble val, gboolean buttons)
 {
     GtkWidget *widget;
     GtkWidget *table;
@@ -161,39 +162,40 @@
         /* 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);
+                          idx[i], idx[i]+1, 1, 2, GTK_SHRINK, GTK_FILL | GTK_EXPAND, 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);
-
+        if (buttons) {
+            /* 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 */
Modified: trunk/src/gtk-freq-knob.h
===================================================================
--- trunk/src/gtk-freq-knob.h	2008-09-06 12:02:22 UTC (rev 87)
+++ trunk/src/gtk-freq-knob.h	2008-09-06 12:22:17 UTC (rev 88)
@@ -77,7 +77,7 @@
 
 
 GtkType    gtk_freq_knob_get_type  (void);
-GtkWidget* gtk_freq_knob_new       (gdouble val);
+GtkWidget* gtk_freq_knob_new       (gdouble val, gboolean buttons);
 void       gtk_freq_knob_set_value (GtkFreqKnob *knob, gdouble val);
 gdouble    gtk_freq_knob_get_value (GtkFreqKnob *knob);
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-06 21:38:04
       | 
| Revision: 93
          http://gpredict.svn.sourceforge.net/gpredict/?rev=93&view=rev
Author:   csete
Date:     2008-09-06 21:38:14 +0000 (Sat, 06 Sep 2008)
Log Message:
-----------
Finished implementation of doppler tuning.
Modified Paths:
--------------
    trunk/src/gtk-rig-ctrl.c
    trunk/src/gtk-rig-ctrl.h
Modified: trunk/src/gtk-rig-ctrl.c
===================================================================
--- trunk/src/gtk-rig-ctrl.c	2008-09-06 18:42:03 UTC (rev 92)
+++ trunk/src/gtk-rig-ctrl.c	2008-09-06 21:38:14 UTC (rev 93)
@@ -41,14 +41,24 @@
 #include "compat.h"
 #include "sat-log.h"
 #include "predict-tools.h"
+#include "gpredict-utils.h"
+#include "sat-cfg.h"
 #include "gtk-freq-knob.h"
 #include "gtk-rig-ctrl.h"
+#include "radio-conf.h"
 #ifdef HAVE_CONFIG_H
 #  include <build-config.h>
 #endif
 
+/* NETWORK */
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+/* END */
 
-#define FMTSTR "%7.2f\302\260"
+#define AZEL_FMTSTR "%7.2f\302\260"
 
 
 static void gtk_rig_ctrl_class_init (GtkRigCtrlClass *class);
@@ -136,7 +146,8 @@
     ctrl->target = NULL;
     ctrl->pass = NULL;
     ctrl->qth = NULL;
-    
+    ctrl->conf = NULL;
+    ctrl->sock = -10;
     ctrl->tracking = FALSE;
     ctrl->busy = FALSE;
     ctrl->engaged = FALSE;
@@ -149,12 +160,23 @@
 {
     GtkRigCtrl *ctrl = GTK_RIG_CTRL (object);
     
-    
     /* stop timer */
     if (ctrl->timerid > 0) 
         g_source_remove (ctrl->timerid);
 
+    /* close network socket */
+    if (ctrl->sock >= 0) {
+        close (ctrl->sock);
+    }
     
+    /* free configuration */
+    if (ctrl->conf != NULL) {
+        g_free (ctrl->conf->name);
+        g_free (ctrl->conf->host);
+        g_free (ctrl->conf);
+        ctrl->conf = NULL;
+    }
+
 	(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
 }
 
@@ -225,23 +247,57 @@
 void
 gtk_rig_ctrl_update   (GtkRigCtrl *ctrl, gdouble t)
 {
+    gdouble satfreq, doppler;
     gchar *buff;
     
     if (ctrl->target) {
         
+        /* update Az/El */
+        buff = g_strdup_printf (AZEL_FMTSTR, ctrl->target->az);
+        gtk_label_set_text (GTK_LABEL (ctrl->SatAz), buff);
+        g_free (buff);
+        buff = g_strdup_printf (AZEL_FMTSTR, ctrl->target->el);
+        gtk_label_set_text (GTK_LABEL (ctrl->SatEl), buff);
+        g_free (buff);
+        
+        /* update range */
+        if (sat_cfg_get_bool (SAT_CFG_BOOL_USE_IMPERIAL)) {
+            buff = g_strdup_printf ("%.0f mi", KM_TO_MI (ctrl->target->range));
+        }
+        else {
+            buff = g_strdup_printf ("%.0f km", ctrl->target->range);
+        }
+        gtk_label_set_text (GTK_LABEL (ctrl->SatRng), buff);
+        g_free (buff);
+        
+        /* update range rate */
+        if (sat_cfg_get_bool (SAT_CFG_BOOL_USE_IMPERIAL)) {
+            buff = g_strdup_printf ("%.3f mi/s", KM_TO_MI (ctrl->target->range_rate));
+        }
+        else {
+            buff = g_strdup_printf ("%.3f km/s", ctrl->target->range_rate);
+        }
+        gtk_label_set_text (GTK_LABEL (ctrl->SatRngRate), buff);
+        g_free (buff);
+        
+        /* doppler shift */
+        satfreq = gtk_freq_knob_get_value (GTK_FREQ_KNOB (ctrl->SatFreq));
+        doppler = -satfreq * (ctrl->target->range_rate / 299792.4580); // Hz
+        buff = g_strdup_printf ("%.0f Hz", doppler);
+        gtk_label_set_text (GTK_LABEL (ctrl->SatDop), buff);
+        g_free (buff);
+
         /* update next pass if necessary */
         if (ctrl->pass != NULL) {
             if (ctrl->target->aos > ctrl->pass->aos) {
                 /* update pass */
                 free_pass (ctrl->pass);
                 ctrl->pass = get_next_pass (ctrl->target, ctrl->qth, 3.0);
-                /* TODO: update polar plot */
             }
         }
         else {
             /* we don't have any current pass; store the current one */
             ctrl->pass = get_next_pass (ctrl->target, ctrl->qth, 3.0);
-            /* TODO: update polar plot */
         }
     }
 }
@@ -258,15 +314,17 @@
 GtkWidget *create_sat_widgets (GtkRigCtrl *ctrl)
 {
     GtkWidget   *frame;
+    GtkWidget   *label;
     
+    label = gtk_label_new (NULL);
+    gtk_label_set_markup (GTK_LABEL (label), _("<b>Satellite</b>"));
+    frame = gtk_frame_new (NULL);
+    gtk_frame_set_label_align (GTK_FRAME (frame), 0.5, 0.5);
+    gtk_frame_set_label_widget (GTK_FRAME (frame), label);
     
-    frame = gtk_frame_new (_("Satellite"));
-    
-    
-    ctrl->SatFreq = gtk_freq_knob_new (145890000.0);
+    ctrl->SatFreq = gtk_freq_knob_new (145890000.0, TRUE);
     gtk_container_add (GTK_CONTAINER (frame), ctrl->SatFreq);
     
-    
     return frame;
 }
 
@@ -281,18 +339,16 @@
 GtkWidget *create_rig_widgets (GtkRigCtrl *ctrl)
 {
     GtkWidget   *frame;
-    GtkWidget   *table;
     GtkWidget   *label;
-
     
-    frame = gtk_frame_new (_("Radio"));
-
-    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);
+    label = gtk_label_new (NULL);
+    gtk_label_set_markup (GTK_LABEL (label), _("<b>Radio</b>"));
+    frame = gtk_frame_new (NULL);
+    gtk_frame_set_label_align (GTK_FRAME (frame), 0.5, 0.5);
+    gtk_frame_set_label_widget (GTK_FRAME (frame), label);
     
+    ctrl->RigFreq = gtk_freq_knob_new (145890000.0, FALSE);
+    gtk_container_add (GTK_CONTAINER (frame), ctrl->RigFreq);
 
     return frame;
 }
@@ -309,9 +365,9 @@
     sat_t *sat = NULL;
     
 
-    buff = g_strdup_printf (FMTSTR, 0.0);
+    buff = g_strdup_printf (AZEL_FMTSTR, 0.0);
     
-    table = gtk_table_new (4, 3, FALSE);
+    table = gtk_table_new (4, 4, 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);
@@ -328,33 +384,64 @@
     gtk_combo_box_set_active (GTK_COMBO_BOX (satsel), 0);
     gtk_widget_set_tooltip_text (satsel, _("Select target object"));
     g_signal_connect (satsel, "changed", G_CALLBACK (sat_selected_cb), ctrl);
-    gtk_table_attach_defaults (GTK_TABLE (table), satsel, 0, 2, 0, 1);
+    gtk_table_attach_defaults (GTK_TABLE (table), satsel, 0, 3, 0, 1);
     
     /* tracking button */
     track = gtk_toggle_button_new_with_label (_("Track"));
     gtk_widget_set_tooltip_text (track, _("Track the satellite when it is within range"));
-    gtk_table_attach_defaults (GTK_TABLE (table), track, 2, 3, 0, 1);
+    gtk_table_attach_defaults (GTK_TABLE (table), track, 3, 4, 0, 1);
     g_signal_connect (track, "toggled", G_CALLBACK (track_toggle_cb), ctrl);
     
     /* Azimuth */
     label = gtk_label_new (_("Az:"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
     gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
+    ctrl->SatAz = gtk_label_new (buff);
+    gtk_misc_set_alignment (GTK_MISC (ctrl->SatAz), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->SatAz, 1, 2, 1, 2);
     
-    
     /* Elevation */
     label = gtk_label_new (_("El:"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
     gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3);
+    ctrl->SatEl = gtk_label_new (buff);
+    gtk_misc_set_alignment (GTK_MISC (ctrl->SatEl), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->SatEl, 1, 2, 2, 3);
     
-    
     /* count down */
     label = gtk_label_new (_("Time:"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
     gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4);
+    ctrl->SatCnt = gtk_label_new ("00:00:00");
+    gtk_misc_set_alignment (GTK_MISC (ctrl->SatCnt), 0.5, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->SatCnt, 1, 2, 3, 4);
     
+    /* Range */
+    label = gtk_label_new (_(" Range:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 1, 2);
+    ctrl->SatRng = gtk_label_new ("0 km");
+    gtk_misc_set_alignment (GTK_MISC (ctrl->SatRng), 0.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->SatRng, 3, 4, 1, 2);
+    
+    /* Range rate */
+    label = gtk_label_new (_(" Rate:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 2, 3);
+    ctrl->SatRngRate = gtk_label_new ("0.0 km/s");
+    gtk_misc_set_alignment (GTK_MISC (ctrl->SatRngRate), 0.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->SatRngRate, 3, 4, 2, 3);
+    
+    /* Doppler shift */
+    label = gtk_label_new (_(" Doppler:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 3, 4);
+    ctrl->SatDop = gtk_label_new ("0 Hz");
+    gtk_misc_set_alignment (GTK_MISC (ctrl->SatDop), 0.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->SatDop, 3, 4, 3, 4);
+    
     frame = gtk_frame_new (_("Target"));
-;
+
     gtk_container_add (GTK_CONTAINER (frame), table);
     
     g_free (buff);
@@ -366,7 +453,7 @@
 static GtkWidget *
 create_conf_widgets (GtkRigCtrl *ctrl)
 {
-    GtkWidget *frame,*table,*label,*timer,*toler;
+    GtkWidget *frame,*table,*label,*timer;
     GtkWidget   *lock;
     GDir        *dir = NULL;   /* directory handle */
     GError      *error = NULL; /* error flag and info */
@@ -422,6 +509,7 @@
     gtk_combo_box_set_active (GTK_COMBO_BOX (ctrl->DevSel), 0);
     g_signal_connect (ctrl->DevSel, "changed", G_CALLBACK (rig_selected_cb), ctrl);
     gtk_table_attach_defaults (GTK_TABLE (table), ctrl->DevSel, 1, 2, 0, 1);
+    /* config will be force-loaded after LO spin is created */
             
     /* Engage button */
     lock = gtk_toggle_button_new_with_label (_("Engage"));
@@ -429,10 +517,29 @@
     g_signal_connect (lock, "toggled", G_CALLBACK (rig_locked_cb), ctrl);
     gtk_table_attach_defaults (GTK_TABLE (table), lock, 2, 3, 0, 1);
     
+    /* Local oscillator value */
+    label = gtk_label_new (_("Local Osc:"));
+    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
+    
+    ctrl->LO = gtk_spin_button_new_with_range (-10000, 10000, 1);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (ctrl->LO), 0);
+    gtk_spin_button_set_digits (GTK_SPIN_BUTTON (ctrl->LO), 0);
+    gtk_widget_set_tooltip_text (ctrl->LO,
+                                 _("Enter the frequency of the local oscillator, if any."));
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->LO, 1, 2, 1, 2);
+    
+    label = gtk_label_new (_("MHz"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 1, 2);
+    
+    /* Now, load config*/
+    rig_selected_cb (GTK_COMBO_BOX (ctrl->DevSel), ctrl);    
+    
     /* Timeout */
     label = gtk_label_new (_("Cycle:"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3);
     
     timer = gtk_spin_button_new_with_range (100, 5000, 10);
     gtk_spin_button_set_digits (GTK_SPIN_BUTTON (timer), 0);
@@ -441,12 +548,12 @@
                                    "commands sent to the rigator."));
     gtk_spin_button_set_value (GTK_SPIN_BUTTON (timer), ctrl->delay);
     g_signal_connect (timer, "value-changed", G_CALLBACK (delay_changed_cb), ctrl);
-    gtk_table_attach (GTK_TABLE (table), timer, 1, 2, 1, 2,
+    gtk_table_attach (GTK_TABLE (table), timer, 1, 2, 2, 3,
                       GTK_FILL, GTK_FILL, 0, 0);
     
     label = gtk_label_new (_("msec"));
     gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 1, 2);
+    gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 2, 3);
 
     
     frame = gtk_frame_new (_("Settings"));
@@ -555,9 +662,43 @@
 {
     GtkRigCtrl *ctrl = GTK_RIG_CTRL (data);
     
-    /* TODO: update device */
     
+    /* free previous configuration */
+    if (ctrl->conf != NULL) {
+        g_free (ctrl->conf->name);
+        g_free (ctrl->conf->host);
+        g_free (ctrl->conf);
+    }
+    
+    ctrl->conf = g_try_new (radio_conf_t, 1);
+    if (ctrl->conf == NULL) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s:%d: Failed to allocate memory for radio config"),
+                     __FILE__, __LINE__);
+        return;
+    }
+    
+    /* load new configuration */
+    ctrl->conf->name = gtk_combo_box_get_active_text (box);
+    if (radio_conf_read (ctrl->conf)) {
+        sat_log_log (SAT_LOG_LEVEL_MSG,
+                     _("Loaded new radio configuration %s"),
+                     ctrl->conf->name);
+        /* update LO widget */
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON (ctrl->LO), ctrl->conf->lo/1.0e6);
+    }
+    else {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s:%d: Failed to load radio configuration %s"),
+                     __FILE__, __LINE__, ctrl->conf->name);
 
+        g_free (ctrl->conf->name);
+        if (ctrl->conf->host)
+            g_free (ctrl->conf->host);
+        g_free (ctrl->conf);
+        ctrl->conf = NULL;
+    }
+
 }
 
 
@@ -571,14 +712,62 @@
 rig_locked_cb (GtkToggleButton *button, gpointer data)
 {
     GtkRigCtrl *ctrl = GTK_RIG_CTRL (data);
+
     
-    if (gtk_toggle_button_get_active (button)) {
-        gtk_widget_set_sensitive (ctrl->DevSel, FALSE);
+    if (!gtk_toggle_button_get_active (button)) {
+        /* close socket */
+        gtk_widget_set_sensitive (ctrl->DevSel, TRUE);
         ctrl->engaged = FALSE;
+        
+        if (ctrl->sock >= 0) {
+            close (ctrl->sock);
+            ctrl->sock = -10;
+        }
     }
     else {
-        gtk_widget_set_sensitive (ctrl->DevSel, TRUE);
+        if (ctrl->conf == NULL) {
+            /* we don't have a working configuration */
+            return;
+        }
+        
+        gtk_widget_set_sensitive (ctrl->DevSel, FALSE);
         ctrl->engaged = TRUE;
+        
+        gint status;
+        struct sockaddr_in ServAddr;
+        struct hostent *h;
+        
+        ctrl->sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+        if (ctrl->sock < 0) {
+            sat_log_log (SAT_LOG_LEVEL_ERROR,
+                         _("%s: Failed to create socket"),
+                           __FUNCTION__);
+            return;
+        }
+        else {
+            sat_log_log (SAT_LOG_LEVEL_DEBUG,
+                         _("%s: Network socket created successfully"),
+                           __FUNCTION__);
+        }
+        
+        memset(&ServAddr, 0, sizeof(ServAddr));     /* Zero out structure */
+        ServAddr.sin_family      = AF_INET;             /* Internet address family */
+        h = gethostbyname(ctrl->conf->host);
+        memcpy((char *) &ServAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
+        ServAddr.sin_port        = htons(ctrl->conf->port); /* Server port */
+
+        status = connect(ctrl->sock, (struct sockaddr *) &ServAddr, sizeof(ServAddr));
+        if (status < 0) {
+            sat_log_log (SAT_LOG_LEVEL_ERROR,
+                         _("%s: Failed to connect to %s:%d"),
+                           __FUNCTION__, ctrl->conf->host, ctrl->conf->port);
+            return;
+        }
+        else {
+            sat_log_log (SAT_LOG_LEVEL_DEBUG,
+                         _("%s: Connection opened to %s:%d"),
+                           __FUNCTION__, ctrl->conf->host, ctrl->conf->port);
+        }
     }
 }
 
@@ -591,7 +780,9 @@
 rig_ctrl_timeout_cb (gpointer data)
 {
     GtkRigCtrl *ctrl = GTK_RIG_CTRL (data);
+    gdouble satfreq,doppler,lof;
     
+    
     if (ctrl->busy) {
         sat_log_log (SAT_LOG_LEVEL_ERROR,_("%s missed the deadline"),__FUNCTION__);
         return TRUE;
@@ -599,27 +790,41 @@
     
     ctrl->busy = TRUE;
     
-    /* If we are tracking and the target satellite is within
-       range, set the rig controller knob value to the target 
-       frequency value. If the target satellite is out of range
-       set the rig controller to the frequency which we expect
-       when the target sat comes up.
-       In either case, update the range, delay, loss, rate, and
-       doppler values.
+    /* If we are tracking, calculate the radio freq by applying both dopper shift
+       and tranverter LO frequency.
+       If we are not tracking, apply only LO frequency.
     */
     if (ctrl->tracking) {
-        if (ctrl->target->el < 0.0) {
-            gdouble aosshift = 0.0;
-            
-        }
-        else {
-        }
-        
-
+        satfreq = gtk_freq_knob_get_value (GTK_FREQ_KNOB (ctrl->SatFreq));
+        doppler = -satfreq * (ctrl->target->range_rate / 299792.4580);
+        lof = 1.0e6*gtk_spin_button_get_value (GTK_SPIN_BUTTON (ctrl->LO));
+        gtk_freq_knob_set_value (GTK_FREQ_KNOB (ctrl->RigFreq), satfreq+doppler+lof);
     }
+    else {
+        satfreq = gtk_freq_knob_get_value (GTK_FREQ_KNOB (ctrl->SatFreq));
+        lof = 1.0e6*gtk_spin_button_get_value (GTK_SPIN_BUTTON (ctrl->LO));
+        gtk_freq_knob_set_value (GTK_FREQ_KNOB (ctrl->RigFreq), satfreq+lof);
+    }
 
-    if (ctrl->engaged) {
-        /* TODO: send controller values to radio device */
+    /* if device is engaged, send freq command to radio */
+    if ((ctrl->engaged) && (ctrl->sock >= 0)) {
+        gchar  *buff;
+        gint    written,size;
+        
+        buff = g_strdup_printf ("F %10.0f\n",
+                                gtk_freq_knob_get_value (GTK_FREQ_KNOB (ctrl->RigFreq)));
+        
+        /* number of bytes to write depends on platform (EOL) */
+#ifdef G_OS_WIN32
+        size = 14;
+#else
+        size = 13;
+#endif
+        written = send(ctrl->sock, buff, size, 0);
+        if (written != size) {
+            g_print ("SIZE ERR: %d\n", written);
+        }
+        g_free (buff);
     }
     
     
Modified: trunk/src/gtk-rig-ctrl.h
===================================================================
--- trunk/src/gtk-rig-ctrl.h	2008-09-06 18:42:03 UTC (rev 92)
+++ trunk/src/gtk-rig-ctrl.h	2008-09-06 21:38:14 UTC (rev 93)
@@ -33,6 +33,7 @@
 #include <gtk/gtk.h>
 #include "sgpsdp/sgp4sdp4.h"
 #include "gtk-sat-module.h"
+#include "radio-conf.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -63,11 +64,18 @@
 	GtkVBox vbox;
     
     GtkWidget *SatFreq;
+    GtkWidget *RigFreq;
+    
+    /* target status labels*/
+    GtkWidget *SatAz,*SatEl,*SatCnt;
+    GtkWidget *SatRng,*SatRngRate,*SatDop;
    
     /* other widgets */
     GtkWidget *DevSel;   /*!< Device selector */
     GtkWidget *LO;       /*!< Local oscillator */
     
+    radio_conf_t *conf;  /*!< Radio configuration */
+    gint  sock;          /*!< Network socket */
     
     GSList *sats;       /*!< List of sats in parent module */
     sat_t  *target;     /*!< Target satellite */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-06 23:21:21
       | 
| Revision: 95
          http://gpredict.svn.sourceforge.net/gpredict/?rev=95&view=rev
Author:   csete
Date:     2008-09-06 23:21:32 +0000 (Sat, 06 Sep 2008)
Log Message:
-----------
Don't keep TCP connection open between session. Set frequency in a separate function.
Modified Paths:
--------------
    trunk/src/gtk-rig-ctrl.c
    trunk/src/gtk-rig-ctrl.h
Modified: trunk/src/gtk-rig-ctrl.c
===================================================================
--- trunk/src/gtk-rig-ctrl.c	2008-09-06 21:48:12 UTC (rev 94)
+++ trunk/src/gtk-rig-ctrl.c	2008-09-06 23:21:32 UTC (rev 95)
@@ -44,7 +44,6 @@
 #include "gpredict-utils.h"
 #include "sat-cfg.h"
 #include "gtk-freq-knob.h"
-#include "gtk-rig-ctrl.h"
 #include "radio-conf.h"
 #ifdef HAVE_CONFIG_H
 #  include <build-config.h>
@@ -57,7 +56,9 @@
 #include <arpa/inet.h>      /* htons() */
 #include <netdb.h>          /* gethostbyname() */
 /* END */
+#include "gtk-rig-ctrl.h"
 
+
 #define AZEL_FMTSTR "%7.2f\302\260"
 
 
@@ -79,8 +80,8 @@
 static void rig_selected_cb (GtkComboBox *box, gpointer data);
 static void rig_locked_cb (GtkToggleButton *button, gpointer data);
 static gboolean rig_ctrl_timeout_cb (gpointer data);
+static void set_freq (GtkRigCtrl *ctrl, gdouble freq);
 
-
 static GtkVBoxClass *parent_class = NULL;
 
 static GdkColor ColBlack = { 0, 0, 0, 0};
@@ -147,7 +148,6 @@
     ctrl->pass = NULL;
     ctrl->qth = NULL;
     ctrl->conf = NULL;
-    ctrl->sock = -10;
     ctrl->tracking = FALSE;
     ctrl->busy = FALSE;
     ctrl->engaged = FALSE;
@@ -164,11 +164,6 @@
     if (ctrl->timerid > 0) 
         g_source_remove (ctrl->timerid);
 
-    /* close network socket */
-    if (ctrl->sock >= 0) {
-        close (ctrl->sock);
-    }
-    
     /* free configuration */
     if (ctrl->conf != NULL) {
         g_free (ctrl->conf->name);
@@ -702,6 +697,7 @@
 }
 
 
+
 /** \brief Rig locked.
  * \param button Pointer to the "Engage" button.
  * \param data Pointer to the GtkRigCtrl widget.
@@ -718,11 +714,6 @@
         /* close socket */
         gtk_widget_set_sensitive (ctrl->DevSel, TRUE);
         ctrl->engaged = FALSE;
-        
-        if (ctrl->sock >= 0) {
-            close (ctrl->sock);
-            ctrl->sock = -10;
-        }
     }
     else {
         if (ctrl->conf == NULL) {
@@ -733,30 +724,8 @@
         gtk_widget_set_sensitive (ctrl->DevSel, FALSE);
         ctrl->engaged = TRUE;
         
-        gint status;
-        struct sockaddr_in ServAddr;
-        struct hostent *h;
-        
-        ctrl->sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
-        if (ctrl->sock < 0) {
-            sat_log_log (SAT_LOG_LEVEL_ERROR,
-                         _("%s: Failed to create socket"),
-                           __FUNCTION__);
-            return;
-        }
-        else {
-            sat_log_log (SAT_LOG_LEVEL_DEBUG,
-                         _("%s: Network socket created successfully"),
-                           __FUNCTION__);
-        }
-        
-        memset(&ServAddr, 0, sizeof(ServAddr));     /* Zero out structure */
-        ServAddr.sin_family      = AF_INET;             /* Internet address family */
-        h = gethostbyname(ctrl->conf->host);
-        memcpy((char *) &ServAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
-        ServAddr.sin_port        = htons(ctrl->conf->port); /* Server port */
 
-        status = connect(ctrl->sock, (struct sockaddr *) &ServAddr, sizeof(ServAddr));
+/*        status = connect(ctrl->sock, (struct sockaddr *) &ServAddr, sizeof(ServAddr));
         if (status < 0) {
             sat_log_log (SAT_LOG_LEVEL_ERROR,
                          _("%s: Failed to connect to %s:%d"),
@@ -768,6 +737,7 @@
                          _("%s: Connection opened to %s:%d"),
                            __FUNCTION__, ctrl->conf->host, ctrl->conf->port);
         }
+        */
     }
 }
 
@@ -807,24 +777,8 @@
     }
 
     /* if device is engaged, send freq command to radio */
-    if ((ctrl->engaged) && (ctrl->sock >= 0)) {
-        gchar  *buff;
-        gint    written,size;
-        
-        buff = g_strdup_printf ("F %10.0f\n",
-                                gtk_freq_knob_get_value (GTK_FREQ_KNOB (ctrl->RigFreq)));
-        
-        /* number of bytes to write depends on platform (EOL) */
-#ifdef G_OS_WIN32
-        size = 14;
-#else
-        size = 13;
-#endif
-        written = send(ctrl->sock, buff, size, 0);
-        if (written != size) {
-            g_print ("SIZE ERR: %d\n", written);
-        }
-        g_free (buff);
+    if ((ctrl->engaged) && (ctrl->conf != NULL)) {
+        set_freq (ctrl, gtk_freq_knob_get_value (GTK_FREQ_KNOB(ctrl->RigFreq)));
     }
     
     
@@ -834,3 +788,73 @@
 }
 
 
+/** \brief Set frequency
+ * \param[in] ctrl Pointer to the GtkRigCtrl structure.
+ * \param[in] freq The new frequency.
+ * 
+ * \note freq is not strictly necessary for normal use since we could have
+ *       gotten the current frequency from the ctrl; however, the param
+ *       might become useful in the future.
+ */
+static void set_freq (GtkRigCtrl *ctrl, gdouble freq)
+{
+    gchar  *buff;
+    gint    written,size;
+    gint    status;
+    struct hostent *h;
+    struct sockaddr_in ServAddr;
+    gint  sock;          /*!< Network socket */
+        
+    /* create socket */
+    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+    if (sock < 0) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Failed to create socket"),
+                       __FUNCTION__);
+        return;
+    }
+    else {
+        sat_log_log (SAT_LOG_LEVEL_DEBUG,
+                     _("%s: Network socket created successfully"),
+                       __FUNCTION__);
+    }
+        
+    memset(&ServAddr, 0, sizeof(ServAddr));     /* Zero out structure */
+    ServAddr.sin_family = AF_INET;             /* Internet address family */
+    h = gethostbyname(ctrl->conf->host);
+    memcpy((char *) &ServAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
+    ServAddr.sin_port = htons(ctrl->conf->port); /* Server port */
+
+    /* establish connection */
+    status = connect(sock, (struct sockaddr *) &ServAddr, sizeof(ServAddr));
+    if (status < 0) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: Failed to connect to %s:%d"),
+                       __FUNCTION__, ctrl->conf->host, ctrl->conf->port);
+        return;
+    }
+    else {
+        sat_log_log (SAT_LOG_LEVEL_DEBUG,
+                     _("%s: Connection opened to %s:%d"),
+                       __FUNCTION__, ctrl->conf->host, ctrl->conf->port);
+    }
+    
+    /* send command */
+    buff = g_strdup_printf ("F %10.0f\n", freq);
+    
+    /* number of bytes to write depends on platform (EOL) */
+#ifdef G_OS_WIN32
+    size = 14;
+#else
+    size = 13;
+#endif
+    written = send(sock, buff, size, 0);
+    if (written != size) {
+        sat_log_log (SAT_LOG_LEVEL_ERROR,
+                     _("%s: SIZE ERROR %d / %d"),
+                       __FUNCTION__, written, size);
+    }
+    g_free (buff);
+    close (sock);
+    
+}
Modified: trunk/src/gtk-rig-ctrl.h
===================================================================
--- trunk/src/gtk-rig-ctrl.h	2008-09-06 21:48:12 UTC (rev 94)
+++ trunk/src/gtk-rig-ctrl.h	2008-09-06 23:21:32 UTC (rev 95)
@@ -75,7 +75,6 @@
     GtkWidget *LO;       /*!< Local oscillator */
     
     radio_conf_t *conf;  /*!< Radio configuration */
-    gint  sock;          /*!< Network socket */
     
     GSList *sats;       /*!< List of sats in parent module */
     sat_t  *target;     /*!< Target satellite */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-07 10:16:30
       | 
| Revision: 97
          http://gpredict.svn.sourceforge.net/gpredict/?rev=97&view=rev
Author:   csete
Date:     2008-09-07 10:16:41 +0000 (Sun, 07 Sep 2008)
Log Message:
-----------
Implemented AOS/LOS count down.
Modified Paths:
--------------
    trunk/src/gtk-rig-ctrl.c
    trunk/src/gtk-rot-ctrl.c
    trunk/src/gtk-rot-ctrl.h
Modified: trunk/src/gtk-rig-ctrl.c
===================================================================
--- trunk/src/gtk-rig-ctrl.c	2008-09-06 23:58:53 UTC (rev 96)
+++ trunk/src/gtk-rig-ctrl.c	2008-09-07 10:16:41 UTC (rev 97)
@@ -81,7 +81,9 @@
 static void rig_locked_cb (GtkToggleButton *button, gpointer data);
 static gboolean rig_ctrl_timeout_cb (gpointer data);
 static void set_freq (GtkRigCtrl *ctrl, gdouble freq);
+static void update_count_down (GtkRigCtrl *ctrl, gdouble t);
 
+
 static GtkVBoxClass *parent_class = NULL;
 
 static GdkColor ColBlack = { 0, 0, 0, 0};
@@ -255,6 +257,8 @@
         gtk_label_set_text (GTK_LABEL (ctrl->SatEl), buff);
         g_free (buff);
         
+        update_count_down (ctrl, t);
+        
         /* update range */
         if (sat_cfg_get_bool (SAT_CFG_BOOL_USE_IMPERIAL)) {
             buff = g_strdup_printf ("%.0f mi", KM_TO_MI (ctrl->target->range));
@@ -404,7 +408,7 @@
     gtk_table_attach_defaults (GTK_TABLE (table), ctrl->SatEl, 1, 2, 2, 3);
     
     /* count down */
-    label = gtk_label_new (_("Time:"));
+    label = gtk_label_new (_("\316\224T:"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
     gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4);
     ctrl->SatCnt = gtk_label_new ("00:00:00");
@@ -723,21 +727,6 @@
         
         gtk_widget_set_sensitive (ctrl->DevSel, FALSE);
         ctrl->engaged = TRUE;
-        
-
-/*        status = connect(ctrl->sock, (struct sockaddr *) &ServAddr, sizeof(ServAddr));
-        if (status < 0) {
-            sat_log_log (SAT_LOG_LEVEL_ERROR,
-                         _("%s: Failed to connect to %s:%d"),
-                           __FUNCTION__, ctrl->conf->host, ctrl->conf->port);
-            return;
-        }
-        else {
-            sat_log_log (SAT_LOG_LEVEL_DEBUG,
-                         _("%s: Connection opened to %s:%d"),
-                           __FUNCTION__, ctrl->conf->host, ctrl->conf->port);
-        }
-        */
     }
 }
 
@@ -858,3 +847,71 @@
     close (sock);
     
 }
+
+
+/** \brief Update count down label.
+ * \param[in] ctrl Pointer to the RigCtrl widget.
+ * \param[in] t The current time.
+ * 
+ * This function calculates the new time to AOS/LOS of the currently
+ * selected target and updates the ctrl->SatCnt label widget.
+ */
+static void update_count_down (GtkRigCtrl *ctrl, gdouble t)
+{
+    gdouble  targettime;
+    gdouble  delta;
+    gchar   *buff;
+    guint    h,m,s;
+    gchar   *ch,*cm,*cs;
+
+    
+    /* select AOS or LOS time depending on target elevation */
+    if (ctrl->target->el < 0.0)
+        targettime = ctrl->target->aos;
+    else
+        targettime = ctrl->target->los;
+    
+    delta = targettime - t;
+    
+    /* convert julian date to seconds */
+    s = (guint) (delta * 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);
+
+    gtk_label_set_text (GTK_LABEL (ctrl->SatCnt), buff);
+
+    g_free (buff);
+    g_free (ch);
+    g_free (cm);
+    g_free (cs);
+
+}
Modified: trunk/src/gtk-rot-ctrl.c
===================================================================
--- trunk/src/gtk-rot-ctrl.c	2008-09-06 23:58:53 UTC (rev 96)
+++ trunk/src/gtk-rot-ctrl.c	2008-09-07 10:16:41 UTC (rev 97)
@@ -71,6 +71,7 @@
 static void rot_selected_cb (GtkComboBox *box, gpointer data);
 static void rot_locked_cb (GtkToggleButton *button, gpointer data);
 static gboolean rot_ctrl_timeout_cb (gpointer data);
+static void update_count_down (GtkRotCtrl *ctrl, gdouble t);
 
 
 static GtkVBoxClass *parent_class = NULL;
@@ -241,6 +242,8 @@
         gtk_label_set_text (GTK_LABEL (ctrl->ElSat), buff);
         g_free (buff);
         
+        update_count_down (ctrl, t);
+        
         /* update next pass if necessary */
         if (ctrl->pass != NULL) {
             if (ctrl->target->aos > ctrl->pass->aos) {
@@ -386,12 +389,14 @@
     gtk_table_attach_defaults (GTK_TABLE (table), ctrl->ElSat, 1, 2, 2, 3);
     
     /* count down */
-    label = gtk_label_new (_("Time:"));
+    label = gtk_label_new (_("\316\224T:"));
     gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
     gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4);
+    ctrl->SatCnt = gtk_label_new ("00:00:00");
+    gtk_misc_set_alignment (GTK_MISC (ctrl->SatCnt), 1.0, 0.5);
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->SatCnt, 1, 2, 3, 4);
     
     frame = gtk_frame_new (_("Target"));
-    //gtk_container_set_border_width (GTK_CONTAINER (frame), 5);
     gtk_container_add (GTK_CONTAINER (frame), table);
     
     g_free (buff);
@@ -723,3 +728,70 @@
 }
 
 
+
+/** \brief Update count down label.
+ * \param[in] ctrl Pointer to the RotCtrl widget.
+ * \param[in] t The current time.
+ * 
+ * This function calculates the new time to AOS/LOS of the currently
+ * selected target and updates the ctrl->SatCnt label widget.
+ */
+static void update_count_down (GtkRotCtrl *ctrl, gdouble t)
+{
+    gdouble  targettime;
+    gdouble  delta;
+    gchar   *buff;
+    guint    h,m,s;
+    gchar   *ch,*cm,*cs;
+
+    
+    /* select AOS or LOS time depending on target elevation */
+    if (ctrl->target->el < 0.0)
+        targettime = ctrl->target->aos;
+    else
+        targettime = ctrl->target->los;
+    
+    delta = targettime - t;
+    
+    /* convert julian date to seconds */
+    s = (guint) (delta * 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);
+
+    gtk_label_set_text (GTK_LABEL (ctrl->SatCnt), buff);
+
+    g_free (buff);
+    g_free (ch);
+    g_free (cm);
+    g_free (cs);
+
+}
Modified: trunk/src/gtk-rot-ctrl.h
===================================================================
--- trunk/src/gtk-rot-ctrl.h	2008-09-06 23:58:53 UTC (rev 96)
+++ trunk/src/gtk-rot-ctrl.h	2008-09-07 10:16:41 UTC (rev 97)
@@ -69,6 +69,7 @@
     GtkWidget *ElSat,*ElSet,*ElRead,*ElDevSel,*ElDev;
     
     /* other widgets */
+    GtkWidget *SatCnt;
     GtkWidget *DevSel;
     
     /* satellites */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-09 17:57:44
       | 
| Revision: 101
          http://gpredict.svn.sourceforge.net/gpredict/?rev=101&view=rev
Author:   csete
Date:     2008-09-09 17:57:54 +0000 (Tue, 09 Sep 2008)
Log Message:
-----------
Added support for variable twilight threshold in prediction of satellite visibility.
Modified Paths:
--------------
    trunk/src/sat-cfg.c
    trunk/src/sat-cfg.h
    trunk/src/sat-pref-conditions.c
    trunk/src/sat-vis.c
Modified: trunk/src/sat-cfg.c
===================================================================
--- trunk/src/sat-cfg.c	2008-09-07 11:07:03 UTC (rev 100)
+++ trunk/src/sat-cfg.c	2008-09-09 17:57:54 UTC (rev 101)
@@ -177,6 +177,7 @@
 	{ "PREDICT", "MULTI_PASS_COL", MULTI_PASS_COL_DEFAULTS},
 	{ "PREDICT", "SAVE_FORMAT", 0},
 	{ "PREDICT", "SAVE_CONTENTS", 0},
+    { "PREDICT", "TWILIGHT_THRESHOLD", -6},
 	{ "SKY_AT_GLANCE", "TIME_SPAN_HOURS", 8},
 	{ "SKY_AT_GLANCE", "COLOUR_01", 0x3c46c8},
 	{ "SKY_AT_GLANCE", "COLOUR_02", 0x00500a},
Modified: trunk/src/sat-cfg.h
===================================================================
--- trunk/src/sat-cfg.h	2008-09-07 11:07:03 UTC (rev 100)
+++ trunk/src/sat-cfg.h	2008-09-09 17:57:54 UTC (rev 101)
@@ -100,6 +100,7 @@
 	SAT_CFG_INT_PRED_MULTI_COL,       /*!< Visible columns in multi-pass dialog */
 	SAT_CFG_INT_PRED_SAVE_FORMAT,     /*!< Last used save format for predictions */
 	SAT_CFG_INT_PRED_SAVE_CONTENTS,   /*!< Last selection for save file contents */
+    SAT_CFG_INT_PRED_TWILIGHT_THLD,   /*!< Twilight zone threshold */
 	SAT_CFG_INT_SKYATGL_TIME,         /*!< Time span for sky at a glance predictions */
 	SAT_CFG_INT_SKYATGL_COL_01,       /*!< Colour 1 in sky at a glance predictions */
 	SAT_CFG_INT_SKYATGL_COL_02,       /*!< Colour 2 in sky at a glance predictions */
Modified: trunk/src/sat-pref-conditions.c
===================================================================
--- trunk/src/sat-pref-conditions.c	2008-09-07 11:07:03 UTC (rev 100)
+++ trunk/src/sat-pref-conditions.c	2008-09-09 17:57:54 UTC (rev 101)
@@ -40,6 +40,7 @@
 static GtkWidget *lookahead;
 static GtkWidget *res;
 static GtkWidget *nument;
+static GtkWidget *twspin;
 
 static gboolean dirty = FALSE;  /* used to check whether any changes have occurred */
 static gboolean reset = FALSE;
@@ -66,7 +67,7 @@
 	dirty = FALSE;
 	reset = FALSE;
 
-	table = gtk_table_new (9, 3, FALSE);
+	table = gtk_table_new (12, 3, FALSE);
 	gtk_table_set_row_spacings (GTK_TABLE (table), 10);
 	gtk_table_set_col_spacings (GTK_TABLE (table), 5);
 
@@ -261,7 +262,60 @@
 					  GTK_SHRINK,
 					  0, 0);
 
+    /* separator */
+    gtk_table_attach (GTK_TABLE (table),
+                      gtk_hseparator_new (),
+                      0, 3, 9, 10,
+                      GTK_FILL | GTK_EXPAND,
+                      GTK_SHRINK,
+                      0, 0);
 
+    /* satellite visibility */
+    label = gtk_label_new (NULL);
+    gtk_label_set_markup (GTK_LABEL (label), _("<b>Satellite Visibility:</b>"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+    gtk_table_attach (GTK_TABLE (table), label,
+                      0, 1, 10, 11,
+                      GTK_FILL,
+                      GTK_SHRINK,
+                      0, 0);
+
+    /* twilight threshold */
+    label = gtk_label_new (_("Twilight threshold"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+    gtk_table_attach (GTK_TABLE (table), label,
+                      0, 1, 11, 12,
+                      GTK_FILL,
+                      GTK_SHRINK,
+                      0, 0);
+    twspin = gtk_spin_button_new_with_range (-18, 0, 1);
+    gtk_widget_set_tooltip_text (twspin,
+                          _("Satellites are only considered visible if the elevation "\
+                            "of the Sun is below the specified threshold.\n"\
+                            "  \342\200\242 Astronomical: -18\302\260 to -12\302\260\n"\
+                            "  \342\200\242 Nautical: -12\302\260 to -6\302\260\n"\
+                            "  \342\200\242 Civil: -6\302\260 to 0\302\260"));
+    gtk_spin_button_set_digits (GTK_SPIN_BUTTON (twspin), 0);
+    gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (twspin), TRUE);
+    gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (twspin), FALSE);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (twspin),
+                               sat_cfg_get_int (SAT_CFG_INT_PRED_TWILIGHT_THLD));
+    g_signal_connect (G_OBJECT (twspin), "value-changed",
+                      G_CALLBACK (spin_changed_cb), NULL);
+    gtk_table_attach (GTK_TABLE (table), twspin,
+                      1, 2, 11, 12,
+                      GTK_FILL,
+                      GTK_SHRINK,
+                      0, 0);
+    label = gtk_label_new (_("[deg]"));
+    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+    gtk_table_attach (GTK_TABLE (table), label,
+                      2, 3, 11, 12,
+                      GTK_FILL | GTK_EXPAND,
+                      GTK_SHRINK,
+                      0, 0);
+
+    
 	/* create vertical box */
 	vbox = gtk_vbox_new (FALSE, 0);
 	gtk_container_set_border_width (GTK_CONTAINER (vbox), 20);
@@ -301,6 +355,8 @@
 						 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (res)));
 		sat_cfg_set_int (SAT_CFG_INT_PRED_NUM_ENTRIES,
 						 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (nument)));
+        sat_cfg_set_int (SAT_CFG_INT_PRED_TWILIGHT_THLD,
+                         gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (twspin)));
 
 		dirty = FALSE;
 	}
@@ -310,6 +366,7 @@
 		sat_cfg_reset_int (SAT_CFG_INT_PRED_LOOK_AHEAD);
 		sat_cfg_reset_int (SAT_CFG_INT_PRED_RESOLUTION);
 		sat_cfg_reset_int (SAT_CFG_INT_PRED_NUM_ENTRIES);
+        sat_cfg_reset_int (SAT_CFG_INT_PRED_TWILIGHT_THLD);
 
 		reset = FALSE;
 	}
@@ -380,6 +437,8 @@
 							   sat_cfg_get_int_def (SAT_CFG_INT_PRED_RESOLUTION));
 	gtk_spin_button_set_value (GTK_SPIN_BUTTON (nument),
 							   sat_cfg_get_int_def (SAT_CFG_INT_PRED_NUM_ENTRIES));
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (twspin),
+                               sat_cfg_get_int_def (SAT_CFG_INT_PRED_TWILIGHT_THLD));
 
 
 	/* reset flags */
Modified: trunk/src/sat-vis.c
===================================================================
--- trunk/src/sat-vis.c	2008-09-07 11:07:03 UTC (rev 100)
+++ trunk/src/sat-vis.c	2008-09-09 17:57:54 UTC (rev 101)
@@ -31,6 +31,7 @@
 #include "sgpsdp/sgp4sdp4.h"
 #include "gtk-sat-data.h"
 #include "sat-vis.h"
+#include "sat-cfg.h"
 
 
 static gchar VIS2CHR[SAT_VIS_NUM] = { '-', 'V', 'D', 'E'};
@@ -56,6 +57,7 @@
 {
 	gboolean sat_sun_status;
 	gdouble  sun_el;
+    gdouble  threshold;
 	gdouble  eclipse_depth;
 	sat_vis_t vis = SAT_VIS_NONE;
 	vector_t zero_vector = {0,0,0,0};
@@ -86,10 +88,12 @@
 		sat_sun_status = TRUE;
 	}
 
-	sun_el = Degrees (solar_set.el);
 
 	if (sat_sun_status) {
-		if (sun_el <= -12.0 && sat->el >= 0.0)
+        sun_el = Degrees (solar_set.el);
+        threshold = (gdouble) sat_cfg_get_int (SAT_CFG_INT_PRED_TWILIGHT_THLD);
+        
+        if (sun_el <= threshold && sat->el >= 0.0)
 			vis = SAT_VIS_VISIBLE;
 		else
 			vis = SAT_VIS_DAYLIGHT;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-10 20:47:37
       | 
| Revision: 103
          http://gpredict.svn.sourceforge.net/gpredict/?rev=103&view=rev
Author:   csete
Date:     2008-09-10 20:47:47 +0000 (Wed, 10 Sep 2008)
Log Message:
-----------
Added function to change the current track.
Modified Paths:
--------------
    trunk/src/gtk-polar-plot.c
    trunk/src/gtk-polar-plot.h
Modified: trunk/src/gtk-polar-plot.c
===================================================================
--- trunk/src/gtk-polar-plot.c	2008-09-09 17:58:31 UTC (rev 102)
+++ trunk/src/gtk-polar-plot.c	2008-09-10 20:47:47 UTC (rev 103)
@@ -26,8 +26,17 @@
   along with this program; if not, visit http://www.fsf.org/
 */
 /** \brief Polar Plot Widget.
+ * \ingroup widgets
  *
- * More info...
+ * GtkPolarPlot is a graphical widget that can display a satellite pass
+ * in an Az/El polar plot. The widget was originally created to display
+ * a single satellite pass in the detailed pass predicition dialog.
+ * 
+ * Later, a few utility functions were added in order to make the GtkPolarPlot
+ * more dynamic and useful in other contexts too. In addition to a satellite
+ * pass, GtkPolarPlot can show a target object (small square), a target
+ * position marker (thread), and a current position marker (small circle).
+ * These three objects are very useful in the rotator control window.
  */
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
@@ -137,6 +146,7 @@
 gtk_polar_plot_init (GtkPolarPlot *polview)
 {
 	polview->qth       = NULL;
+    polview->pass      = NULL;
 	polview->size      = 0;
 	polview->r         = 0;
 	polview->cx        = 0;
@@ -157,9 +167,10 @@
 
 
 /** \brief Create a new GtkPolarPlot widget.
- *  \param cfgdata The configuration data of the parent module.
- *  \param sats Pointer to the hash table containing the asociated satellites.
- *  \param qth Pointer to the ground station data.
+ *  \param qth Pointer to the QTH.
+ *  \param pass Pointer to the satellite pass to display. If NULL no
+ *              pass will be displayed.
+ *
  */
 GtkWidget*
 gtk_polar_plot_new (qth_t *qth, pass_t *pass)
@@ -203,7 +214,10 @@
 	goo_canvas_set_root_item_model (GOO_CANVAS (GTK_POLAR_PLOT (polv)->canvas), root);
 
 	g_object_unref (root);
-	create_track (GTK_POLAR_PLOT (polv));
+    
+    if (GTK_POLAR_PLOT (polv)->pass != NULL) {
+	   create_track (GTK_POLAR_PLOT (polv));
+    }
 
 	gtk_container_add (GTK_CONTAINER (polv), GTK_POLAR_PLOT (polv)->canvas);
 
@@ -211,6 +225,42 @@
 }
 
 
+/** \brief Set new pass
+ * \param[in] plot Pointer to the GtkPolarPlot widget.
+ * \param[in] pass Pointer to the new pass data. Use NULL to disable
+ *                 display of pass.
+ */
+void gtk_polar_plot_set_pass (GtkPolarPlot *plot, pass_t *pass)
+{
+    GooCanvasItemModel *root;
+    gint idx,i;
+    
+    
+    /* remove sky track, time ticks and the pass itself */
+    if (plot->pass != NULL) {
+        /* remove sat from canvas */
+        root = goo_canvas_get_root_item_model (GOO_CANVAS (plot->canvas));
+        idx = goo_canvas_item_model_find_child (root, plot->track);
+        
+        if (idx != -1)
+            goo_canvas_item_model_remove_child (root, idx);
+
+        for (i = 0; i < TRACK_TICK_NUM; i++) {
+            idx = goo_canvas_item_model_find_child (root, plot->trtick[i]);
+            if (idx != -1)
+                goo_canvas_item_model_remove_child (root, idx);
+        }
+        
+        free_pass (plot->pass);
+        plot->pass = NULL;
+    }
+
+    if (pass != NULL) {
+        create_track (GTK_POLAR_PLOT (plot));
+    }
+}
+
+
 static GooCanvasItemModel *
 create_canvas_model (GtkPolarPlot *polv)
 {
@@ -408,7 +458,9 @@
 		break;
 
 	default:
-		/* FIXME: bug */
+		sat_log_log (SAT_LOG_LEVEL_BUG,
+                     _("%s:%d: Incorrect polar plot orientation."),
+                     __FILE__, __LINE__);
 		break;
 	}
 }
@@ -524,7 +576,8 @@
 
 
 		/* sky track */
-		update_track (polv);
+        if (polv->pass != NULL)
+            update_track (polv);
 
 	}
 }
Modified: trunk/src/gtk-polar-plot.h
===================================================================
--- trunk/src/gtk-polar-plot.h	2008-09-09 17:58:31 UTC (rev 102)
+++ trunk/src/gtk-polar-plot.h	2008-09-10 20:47:47 UTC (rev 103)
@@ -44,7 +44,7 @@
 
 
 /** \brief Number of time ticks. */
-#define TRACK_TICK_NUM 4
+#define TRACK_TICK_NUM 5
 
 
 #define GTK_POLAR_PLOT(obj)          GTK_CHECK_CAST (obj, gtk_polar_plot_get_type (), GtkPolarPlot)
@@ -120,6 +120,7 @@
 
 GtkWidget*     gtk_polar_plot_new        (qth_t *qth, pass_t *pass);
 
+void gtk_polar_plot_set_pass (GtkPolarPlot *plot, pass_t *pass);
 
 
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-10 23:23:59
       | 
| Revision: 105
          http://gpredict.svn.sourceforge.net/gpredict/?rev=105&view=rev
Author:   csete
Date:     2008-09-10 23:24:10 +0000 (Wed, 10 Sep 2008)
Log Message:
-----------
Changed to create local copy of the pass data.
Modified Paths:
--------------
    trunk/src/gtk-polar-plot.c
    trunk/src/gtk-polar-plot.h
Modified: trunk/src/gtk-polar-plot.c
===================================================================
--- trunk/src/gtk-polar-plot.c	2008-09-10 21:04:10 UTC (rev 104)
+++ trunk/src/gtk-polar-plot.c	2008-09-10 23:24:10 UTC (rev 105)
@@ -162,6 +162,11 @@
 gtk_polar_plot_destroy (GtkObject *object)
 {
 
+    if (GTK_POLAR_PLOT (object)->pass != NULL) {
+        free_pass (GTK_POLAR_PLOT (object)->pass);
+        GTK_POLAR_PLOT (object)->pass = NULL;
+    }
+    
 	(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
 }
 
@@ -182,7 +187,9 @@
 	polv = g_object_new (GTK_TYPE_POLAR_PLOT, NULL);
 
 	GTK_POLAR_PLOT (polv)->qth  = qth;
-	GTK_POLAR_PLOT (polv)->pass = pass;
+    
+    if (pass != NULL)
+        GTK_POLAR_PLOT (polv)->pass = copy_pass (pass);
 
 	/* get settings */
 	GTK_POLAR_PLOT (polv)->swap = sat_cfg_get_int (SAT_CFG_INT_POLAR_ORIENTATION);
@@ -235,7 +242,7 @@
     GooCanvasItemModel *root;
     gint idx,i;
     
-    
+#if 0    
     /* remove sky track, time ticks and the pass itself */
     if (plot->pass != NULL) {
         /* remove sat from canvas */
@@ -258,9 +265,22 @@
     if (pass != NULL) {
         create_track (GTK_POLAR_PLOT (plot));
     }
+#endif
 }
 
 
+/** \brief Show/hide time tick
+ * \param plot Pointer to the GtkPolarPlot widget
+ * \param show TRUE => show tick. FALSE => don't show
+ * 
+ */
+void gtk_polar_plot_show_time_ticks (GtkPolarPlot *plot, gboolean show)
+{
+    g_print ("NOT IMPLEMENTED %s\n",__FUNCTION__);
+}
+
+
+
 static GooCanvasItemModel *
 create_canvas_model (GtkPolarPlot *polv)
 {
Modified: trunk/src/gtk-polar-plot.h
===================================================================
--- trunk/src/gtk-polar-plot.h	2008-09-10 21:04:10 UTC (rev 104)
+++ trunk/src/gtk-polar-plot.h	2008-09-10 23:24:10 UTC (rev 105)
@@ -122,6 +122,7 @@
 
 void gtk_polar_plot_set_pass (GtkPolarPlot *plot, pass_t *pass);
 
+void gtk_polar_plot_show_time_ticks (GtkPolarPlot *plot, gboolean show);
 
 
 #ifdef __cplusplus
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-15 23:19:20
       | 
| Revision: 108
          http://gpredict.svn.sourceforge.net/gpredict/?rev=108&view=rev
Author:   csete
Date:     2008-09-15 23:19:31 +0000 (Mon, 15 Sep 2008)
Log Message:
-----------
Implemented correct management of next pass taking into account that we may run in simulated time mode.
Modified Paths:
--------------
    trunk/src/gtk-rot-ctrl.c
    trunk/src/gtk-rot-ctrl.h
Modified: trunk/src/gtk-rot-ctrl.c
===================================================================
--- trunk/src/gtk-rot-ctrl.c	2008-09-13 10:13:20 UTC (rev 107)
+++ trunk/src/gtk-rot-ctrl.c	2008-09-15 23:19:31 UTC (rev 108)
@@ -160,7 +160,14 @@
     if (ctrl->timerid > 0) 
         g_source_remove (ctrl->timerid);
 
-    
+    /* free configuration */
+    if (ctrl->conf != NULL) {
+        g_free (ctrl->conf->name);
+        g_free (ctrl->conf->host);
+        g_free (ctrl->conf);
+        ctrl->conf = NULL;
+    }
+
 	(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
 }
 
@@ -183,15 +190,26 @@
     
     GTK_ROT_CTRL (widget)->target = SAT (g_slist_nth_data (GTK_ROT_CTRL (widget)->sats, 0));
     
+    /* store current time (don't know if real or simulated) */
+    GTK_ROT_CTRL (widget)->t = module->tmgCdnum;
+    
     /* store QTH */
     GTK_ROT_CTRL (widget)->qth = module->qth;
     
     /* get next pass for target satellite */
-    GTK_ROT_CTRL (widget)->pass = get_next_pass (GTK_ROT_CTRL (widget)->target,
-                                                 GTK_ROT_CTRL (widget)->qth,
-                                                 3.0);
-    
-    /* initialise custom colors */
+    if (GTK_ROT_CTRL (widget)->target->el > 0.0) {
+        GTK_ROT_CTRL (widget)->pass = get_current_pass (GTK_ROT_CTRL (widget)->target,
+                                                        GTK_ROT_CTRL (widget)->qth,
+                                                        0.0);
+    }
+    else {
+        GTK_ROT_CTRL (widget)->pass = get_next_pass (GTK_ROT_CTRL (widget)->target,
+                                                     GTK_ROT_CTRL (widget)->qth,
+                                                     3.0);
+    }
+
+        
+        /* initialise custom colors */
     gdk_rgb_find_color (gtk_widget_get_colormap (widget), &ColBlack);
     gdk_rgb_find_color (gtk_widget_get_colormap (widget), &ColWhite);
     gdk_rgb_find_color (gtk_widget_get_colormap (widget), &ColRed);
@@ -210,9 +228,9 @@
                       0, 1, 1, 2, GTK_FILL, GTK_SHRINK, 0, 0);
     gtk_table_attach (GTK_TABLE (table), create_conf_widgets (GTK_ROT_CTRL (widget)),
                       1, 2, 1, 2, GTK_FILL, GTK_SHRINK, 0, 0);
-/*    gtk_table_attach (GTK_TABLE (table), create_plot_widget (GTK_ROT_CTRL (widget)),
+    gtk_table_attach (GTK_TABLE (table), create_plot_widget (GTK_ROT_CTRL (widget)),
                       2, 3, 0, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
-*/
+
     gtk_container_add (GTK_CONTAINER (widget), table);
     
     GTK_ROT_CTRL (widget)->timerid = g_timeout_add (GTK_ROT_CTRL (widget)->delay,
@@ -235,6 +253,8 @@
 {
     gchar *buff;
     
+    ctrl->t = t;
+    
     if (ctrl->target) {
         /* update target displays */
         buff = g_strdup_printf (FMTSTR, ctrl->target->az);
@@ -248,17 +268,26 @@
         
         /* update next pass if necessary */
         if (ctrl->pass != NULL) {
-            if (ctrl->target->aos > ctrl->pass->aos) {
-                /* update pass */
+            if ((ctrl->target->aos > ctrl->pass->aos) && (ctrl->target->el <= 0.0)) {
+                /* we need to update the pass */
                 free_pass (ctrl->pass);
-                ctrl->pass = get_next_pass (ctrl->target, ctrl->qth, 3.0);
-                /* TODO: update polar plot */
+                ctrl->pass = get_pass (ctrl->target, ctrl->qth, t, 3.0);
+                
+                /* update polar plot */
+                gtk_polar_plot_set_pass (GTK_POLAR_PLOT (ctrl->plot), ctrl->pass);
             }
         }
         else {
             /* we don't have any current pass; store the current one */
-            ctrl->pass = get_next_pass (ctrl->target, ctrl->qth, 3.0);
-            /* TODO: update polar plot */
+            if (ctrl->target->el > 0.0) {
+                ctrl->pass = get_current_pass (ctrl->target, ctrl->qth, t);
+            }
+            else {
+                ctrl->pass = get_pass (ctrl->target, ctrl->qth, t, 3.0);
+            }
+            
+            /* update polar plot */
+            gtk_polar_plot_set_pass (GTK_POLAR_PLOT (ctrl->plot), ctrl->pass);
         }
     }
 }
@@ -570,7 +599,11 @@
         /* update next pass */
         if (ctrl->pass != NULL)
             free_pass (ctrl->pass);
-        ctrl->pass = get_next_pass (ctrl->target, ctrl->qth, 3.0);
+        
+        if (ctrl->target->el > 0.0)
+            ctrl->pass = get_current_pass (ctrl->target, ctrl->qth, ctrl->t);
+        else
+            ctrl->pass = get_pass (ctrl->target, ctrl->qth, ctrl->t, 3.0);
     }
     else {
         sat_log_log (SAT_LOG_LEVEL_ERROR,
Modified: trunk/src/gtk-rot-ctrl.h
===================================================================
--- trunk/src/gtk-rot-ctrl.h	2008-09-13 10:13:20 UTC (rev 107)
+++ trunk/src/gtk-rot-ctrl.h	2008-09-15 23:19:31 UTC (rev 108)
@@ -33,6 +33,7 @@
 #include <gtk/gtk.h>
 #include "sgpsdp/sgp4sdp4.h"
 #include "gtk-sat-module.h"
+#include "rotor-conf.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -72,6 +73,9 @@
     GtkWidget *SatCnt;
     GtkWidget *DevSel;
     GtkWidget *plot;    /*!< Polar plot widget */
+                        
+    rotor_conf_t *conf;
+    gdouble       t;  /*!< Time when sat data last has been updated. */
     
     /* satellites */
     GSList *sats;       /*!< List of sats in parent module */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <cs...@us...> - 2008-09-17 10:48:40
       | 
| Revision: 116
          http://gpredict.svn.sourceforge.net/gpredict/?rev=116&view=rev
Author:   csete
Date:     2008-09-17 10:48:52 +0000 (Wed, 17 Sep 2008)
Log Message:
-----------
Added error handling. After 5 comm errors the device is disengaged.
Modified Paths:
--------------
    trunk/src/gtk-rot-ctrl.c
    trunk/src/gtk-rot-ctrl.h
Modified: trunk/src/gtk-rot-ctrl.c
===================================================================
--- trunk/src/gtk-rot-ctrl.c	2008-09-16 23:28:12 UTC (rev 115)
+++ trunk/src/gtk-rot-ctrl.c	2008-09-17 10:48:52 UTC (rev 116)
@@ -57,6 +57,7 @@
 /* END */
 
 #define FMTSTR "%7.2f\302\260"
+#define MAX_ERROR_COUNT 5
 
 
 static void gtk_rot_ctrl_class_init (GtkRotCtrlClass *class);
@@ -81,8 +82,8 @@
 static gboolean rot_ctrl_timeout_cb (gpointer data);
 static void update_count_down (GtkRotCtrl *ctrl, gdouble t);
 
-static void get_pos (GtkRotCtrl *ctrl, gdouble *az, gdouble *el);
-static void set_pos (GtkRotCtrl *ctrl, gdouble az, gdouble el);
+static gboolean get_pos (GtkRotCtrl *ctrl, gdouble *az, gdouble *el);
+static gboolean set_pos (GtkRotCtrl *ctrl, gdouble az, gdouble el);
 
 static GtkVBoxClass *parent_class = NULL;
 
@@ -157,6 +158,7 @@
     ctrl->delay = 1000;
     ctrl->timerid = 0;
     ctrl->tolerance = 1.0;
+    ctrl->errcnt = 0;
 }
 
 static void
@@ -515,10 +517,10 @@
     gtk_table_attach_defaults (GTK_TABLE (table), ctrl->DevSel, 1, 2, 0, 1);
 
     /* Engage button */
-    lock = gtk_toggle_button_new_with_label (_("Engage"));
-    gtk_widget_set_tooltip_text (lock, _("Engage the selcted rotor device"));
-    g_signal_connect (lock, "toggled", G_CALLBACK (rot_locked_cb), ctrl);
-    gtk_table_attach_defaults (GTK_TABLE (table), lock, 2, 3, 0, 1);
+    ctrl->LockBut = gtk_toggle_button_new_with_label (_("Engage"));
+    gtk_widget_set_tooltip_text (ctrl->LockBut, _("Engage the selcted rotor device"));
+    g_signal_connect (ctrl->LockBut, "toggled", G_CALLBACK (rot_locked_cb), ctrl);
+    gtk_table_attach_defaults (GTK_TABLE (table), ctrl->LockBut, 2, 3, 0, 1);
     
     /* Timeout */
     label = gtk_label_new (_("Cycle:"));
@@ -791,6 +793,7 @@
     gdouble rotaz=0.0, rotel=0.0;
     gdouble setaz,setel;
     gchar *text;
+    gboolean error = FALSE;
     
     
     if (ctrl->busy) {
@@ -827,15 +830,21 @@
     if ((ctrl->engaged) && (ctrl->conf != NULL)) {
         
         /* read back current value from device */
-        get_pos (ctrl, &rotaz, &rotel);
+        if (get_pos (ctrl, &rotaz, &rotel)) {
         
-        /* update display widgets */
-        text = g_strdup_printf ("%.2f\302\260", rotaz);
-        gtk_label_set_text (GTK_LABEL (ctrl->AzRead), text);
-        g_free (text);
-        text = g_strdup_printf ("%.2f\302\260", rotel);
-        gtk_label_set_text (GTK_LABEL (ctrl->ElRead), text);
-        g_free (text);
+            /* update display widgets */
+            text = g_strdup_printf ("%.2f\302\260", rotaz);
+            gtk_label_set_text (GTK_LABEL (ctrl->AzRead), text);
+            g_free (text);
+            text = g_strdup_printf ("%.2f\302\260", rotel);
+            gtk_label_set_text (GTK_LABEL (ctrl->ElRead), text);
+            g_free (text);
+        }
+        else {
+            gtk_label_set_text (GTK_LABEL (ctrl->AzRead), _("ERROR"));
+            gtk_label_set_text (GTK_LABEL (ctrl->ElRead), _("ERROR"));
+            error = TRUE;
+        }
         
         /* if tolerance exceeded */
         setaz = gtk_rot_knob_get_value (GTK_ROT_KNOB (ctrl->AzSet));
@@ -843,9 +852,33 @@
         if ((fabs(setaz-rotaz) > ctrl->tolerance) ||
              (fabs(setel-rotel) > ctrl->tolerance)) {
             /* send controller values to rotator device */
-            set_pos (ctrl, setaz, setel);
+            if (!set_pos (ctrl, setaz, setel)) {
+                error = TRUE;
+            }
         }
         
+        /* check error status */
+        if (!error) {
+            /* reset error counter */
+            ctrl->errcnt = 0;
+        }
+        else {
+            if (ctrl->errcnt >= MAX_ERROR_COUNT) {
+                /* disengage device */
+                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ctrl->LockBut), FALSE);
+                ctrl->engaged = FALSE;
+                sat_log_log (SAT_LOG_LEVEL_ERROR,
+                             _("%s: MAX_ERROR_COUNT (%d) reached. Disengaging device!"),
+                               __FUNCTION__, MAX_ERROR_COUNT);
+                ctrl->errcnt = 0;
+            }
+            else {
+                /* increment error counter */
+                ctrl->errcnt++;
+            }
+        }
+        
+        g_print ("COUNT: %d\n", ctrl->errcnt);
         /* TODO: update polar plot */
     }
     
@@ -860,8 +893,10 @@
  * \param ctrl Pointer to the GtkRotCtrl widget.
  * \param az The current Az as read from the device
  * \param el The current El as read from the device
+ * \return TRUE if the position was successfully retrieved, FALSE if an
+ *         error occurred.
  */
-static void get_pos (GtkRotCtrl *ctrl, gdouble *az, gdouble *el)
+static gboolean get_pos (GtkRotCtrl *ctrl, gdouble *az, gdouble *el)
 {
     gchar  *buff,**vbuff;
     gint    written,size;
@@ -875,7 +910,7 @@
         sat_log_log (SAT_LOG_LEVEL_BUG,
                      _("%s:%d: NULL storage."),
                      __FILE__, __LINE__);
-        return;
+        return FALSE;
     }
     
     /* create socket */
@@ -884,7 +919,7 @@
         sat_log_log (SAT_LOG_LEVEL_ERROR,
                      _("%s:%d: Failed to create socket"),
                        __FILE__, __LINE__);
-        return;
+        return FALSE;
     }
     else {
         sat_log_log (SAT_LOG_LEVEL_DEBUG,
@@ -904,7 +939,7 @@
         sat_log_log (SAT_LOG_LEVEL_ERROR,
                      _("%s:%d: Failed to connect to %s:%d"),
                        __FILE__, __LINE__, ctrl->conf->host, ctrl->conf->port);
-        return;
+        return FALSE;
     }
     else {
         sat_log_log (SAT_LOG_LEVEL_DEBUG,
@@ -938,7 +973,7 @@
                        __FILE__, __FUNCTION__);
         shutdown (sock, SHUT_RDWR);
         close (sock);
-        return;
+        return FALSE;
     }
         
     size = read (sock, buff, 127);
@@ -964,7 +999,7 @@
     shutdown (sock, SHUT_RDWR);
     close (sock);
 
-    
+    return TRUE;
 }
 
 
@@ -972,11 +1007,13 @@
  * \param ctrl Poitner to the GtkRotCtrl widget
  * \param az The new Azimuth
  * \param el The new Elevation
+ * \return TRUE if the new position has been sent successfully
+ *         FALSE if an error occurred
  * 
  * \note The function does not perform any range check since the GtkRotKnob
  * should always keep its value within range.
  */
-static void set_pos (GtkRotCtrl *ctrl, gdouble az, gdouble el)
+static gboolean set_pos (GtkRotCtrl *ctrl, gdouble az, gdouble el)
 {
     gchar  *buff;
     gchar  azstr[8],elstr[8];
@@ -993,7 +1030,7 @@
         sat_log_log (SAT_LOG_LEVEL_ERROR,
                      _("%s:%d: Failed to create socket"),
                        __FILE__, __LINE__);
-        return;
+        return FALSE;
     }
     else {
         sat_log_log (SAT_LOG_LEVEL_DEBUG,
@@ -1013,7 +1050,7 @@
         sat_log_log (SAT_LOG_LEVEL_ERROR,
                      _("%s:%d: Failed to connect to %s:%d"),
                        __FILE__, __LINE__, ctrl->conf->host, ctrl->conf->port);
-        return;
+        return FALSE;
     }
     else {
         sat_log_log (SAT_LOG_LEVEL_DEBUG,
@@ -1046,7 +1083,7 @@
     shutdown (sock, SHUT_RDWR);
     close (sock);
 
-
+    return TRUE;
 }
 
 
Modified: trunk/src/gtk-rot-ctrl.h
===================================================================
--- trunk/src/gtk-rot-ctrl.h	2008-09-16 23:28:12 UTC (rev 115)
+++ trunk/src/gtk-rot-ctrl.h	2008-09-17 10:48:52 UTC (rev 116)
@@ -73,6 +73,7 @@
     GtkWidget *SatCnt;
     GtkWidget *DevSel;
     GtkWidget *plot;    /*!< Polar plot widget */
+    GtkWidget *LockBut;
                         
     rotor_conf_t *conf;
     gdouble       t;  /*!< Time when sat data last has been updated. */
@@ -90,6 +91,8 @@
     gboolean tracking;  /*!< Flag set when we are tracking a target. */
     gboolean busy;      /*!< Flag set when control algorithm is busy. */
     gboolean engaged;   /*!< Flag indicating that rotor device is engaged. */
+                        
+    gint     errcnt;    /*!< Error counter. */
 };
 
 struct _GtkRotCtrlClass
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |