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