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.
|