[Gpredict-svn] SF.net SVN: gpredict:[690] trunk/src
Real time satellite tracking and orbit prediction
Status: Beta
Brought to you by:
csete
|
From: <aa...@us...> - 2010-10-17 14:31:03
|
Revision: 690
http://gpredict.svn.sourceforge.net/gpredict/?rev=690&view=rev
Author: aa1vs
Date: 2010-10-17 14:30:56 +0000 (Sun, 17 Oct 2010)
Log Message:
-----------
Continuous network rotator control merge
Modified Paths:
--------------
trunk/src/gtk-rot-ctrl.c
trunk/src/gtk-rot-ctrl.h
Property Changed:
----------------
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 2010-10-17 00:28:35 UTC (rev 689)
+++ trunk/src/gtk-rot-ctrl.c 2010-10-17 14:30:56 UTC (rev 690)
@@ -89,7 +89,13 @@
static gboolean get_pos (GtkRotCtrl *ctrl, gdouble *az, gdouble *el);
static gboolean set_pos (GtkRotCtrl *ctrl, gdouble az, gdouble el);
+static gboolean send_rotctld_command(GtkRotCtrl *ctrl, gchar *buff, gchar *buffout, gint sizeout);
+static gboolean open_rotctld_socket (GtkRotCtrl *ctrl, gint *sock);
+static gboolean close_rotctld_socket (gint sock);
+
static gboolean have_conf (void);
+static gint sat_name_compare (sat_t* a,sat_t*b);
+static gint rot_name_compare (const gchar* a,const gchar *b);
static GtkVBoxClass *parent_class = NULL;
@@ -477,7 +483,7 @@
gchar *dirname; /* directory name */
gchar **vbuff;
const gchar *filename; /* file name */
-
+ gchar *rotname;
table = gtk_table_new (3, 3, FALSE);
@@ -499,15 +505,27 @@
dir = g_dir_open (dirname, 0, &error);
if (dir) {
/* read each .rot file */
+ GSList *rots=NULL;
+ gint i;
+ gint n;
while ((filename = g_dir_read_name (dir))) {
if (g_str_has_suffix (filename, ".rot")) {
vbuff = g_strsplit (filename, ".rot", 0);
- gtk_combo_box_append_text (GTK_COMBO_BOX (ctrl->DevSel), vbuff[0]);
+ rots=g_slist_insert_sorted(rots,g_strdup(vbuff[0]),(GCompareFunc)rot_name_compare);
g_strfreev (vbuff);
}
}
+ n = g_slist_length (rots);
+ for (i = 0; i < n; i++) {
+ rotname = g_slist_nth_data (rots, i);
+ if (rotname) {
+ gtk_combo_box_append_text (GTK_COMBO_BOX (ctrl->DevSel), rotname);
+ g_free(rotname);
+ }
+ }
+ g_slist_free(rots);
}
else {
sat_log_log (SAT_LOG_LEVEL_ERROR,
@@ -605,7 +623,8 @@
GtkRotCtrl *ctrl = GTK_ROT_CTRL( user_data);
sat_t *sat = SAT (value);
- ctrl->sats = g_slist_append (ctrl->sats, sat);
+ //ctrl->sats = g_slist_append (ctrl->sats, sat);
+ ctrl->sats = g_slist_insert_sorted (ctrl->sats, sat, (GCompareFunc)sat_name_compare);
}
@@ -754,9 +773,12 @@
g_free (ctrl->conf);
ctrl->conf = NULL;
}
+
+ return TRUE;
}
+
/** \brief Rotor locked.
* \param button Pointer to the "Engage" button.
* \param data Pointer to the GtkRotCtrl widget.
@@ -771,6 +793,7 @@
if (!gtk_toggle_button_get_active (button)) {
gtk_widget_set_sensitive (ctrl->DevSel, TRUE);
ctrl->engaged = FALSE;
+ close_rotctld_socket(ctrl->sock);
gtk_label_set_text (GTK_LABEL (ctrl->AzRead), "---");
gtk_label_set_text (GTK_LABEL (ctrl->ElRead), "---");
}
@@ -784,7 +807,7 @@
}
gtk_widget_set_sensitive (ctrl->DevSel, FALSE);
ctrl->engaged = TRUE;
-
+ open_rotctld_socket(ctrl,&(ctrl->sock));
ctrl->wrops = 0;
ctrl->rdops = 0;
}
@@ -928,8 +951,8 @@
gtk_rot_knob_get_value (GTK_ROT_KNOB (ctrl->ElSet)));
}
}
- g_static_mutex_unlock(&(ctrl->busy));
-
+ g_static_mutex_unlock(&(ctrl->busy));
+
return TRUE;
}
@@ -944,13 +967,9 @@
static gboolean get_pos (GtkRotCtrl *ctrl, gdouble *az, gdouble *el)
{
gchar *buff,**vbuff;
- gint written,size;
- gint status;
- struct hostent *h;
- struct sockaddr_in ServAddr;
- gint sock; /*!< Network socket */
-
-
+ gchar buffback[128];
+ gboolean retcode;
+
if ((az == NULL) || (el == NULL)) {
sat_log_log (SAT_LOG_LEVEL_BUG,
_("%s:%d: NULL storage."),
@@ -958,108 +977,36 @@
return FALSE;
}
- /* create socket */
- sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sock < 0) {
- sat_log_log (SAT_LOG_LEVEL_ERROR,
- _("%s:%d: Failed to create socket"),
- __FILE__, __LINE__);
- return FALSE;
- }
- else {
- sat_log_log (SAT_LOG_LEVEL_DEBUG,
- _("%s:%d Network socket created successfully"),
- __FILE__, __LINE__);
- }
+ /* send command */
+ buff = g_strdup_printf ("p\x0a");
- 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:%d: Failed to connect to %s:%d"),
- __FILE__, __LINE__, ctrl->conf->host, ctrl->conf->port);
- return FALSE;
- }
- else {
- sat_log_log (SAT_LOG_LEVEL_DEBUG,
- _("%s:%d: Connection opened to %s:%d"),
- __FILE__, __LINE__, ctrl->conf->host, ctrl->conf->port);
- }
+ retcode=send_rotctld_command(ctrl,buff,buffback,128);
- /* send command */
- buff = g_strdup_printf ("p\x0aq\x0a");
-
- size = 4;
- written = send(sock, buff, size, 0);
- if (written != size) {
- sat_log_log (SAT_LOG_LEVEL_ERROR,
- _("%s:%d: SIZE ERROR %d / %d"),
- __FILE__, __LINE__, written, size);
- }
- g_free (buff);
-
-
/* try to read answer */
- buff = g_try_malloc (128);
- if (buff == NULL) {
- sat_log_log (SAT_LOG_LEVEL_ERROR,
- _("%s:%s: Failed to allocate 128 bytes (yes, this means trouble)"),
- __FILE__, __FUNCTION__);
+ if (retcode) {
+ if (strncmp(buffback,"RPRT",4)==0){
+ retcode=FALSE;
+ sat_log_log (SAT_LOG_LEVEL_ERROR,
+ _("%s:%d: rotctld returned error (%s)"),
+ __FILE__, __LINE__,buffback);
-#ifndef WIN32
- shutdown (sock, SHUT_RDWR);
-#else
- shutdown (sock, SD_BOTH);
-#endif
-
- close (sock);
- return FALSE;
- }
+ } else {
+ vbuff = g_strsplit (buffback, "\n", 3);
+ *az = g_strtod (vbuff[0], NULL);
+ *el = g_strtod (vbuff[1], NULL);
+
+ g_strfreev (vbuff);
+ }
+ }
- size = read (sock, buff, 127);
- if (size == 0) {
- sat_log_log (SAT_LOG_LEVEL_ERROR,
- _("%s:%s: Got 0 bytes from rotctld"),
- __FILE__, __FUNCTION__);
- }
- else {
- sat_log_log (SAT_LOG_LEVEL_DEBUG,
- _("%s:%s: Read %d bytes from rotctld"),
- __FILE__, __FUNCTION__, size);
-
- buff[size] = 0;
- vbuff = g_strsplit (buff, "\n", 3);
- *az = g_strtod (vbuff[0], NULL);
- *el = g_strtod (vbuff[1], NULL);
-
- g_strfreev (vbuff);
- }
-
g_free (buff);
-#ifndef WIN32
- shutdown (sock, SHUT_RDWR);
-#else
- shutdown (sock, SD_BOTH);
-#endif
-
- close (sock);
-
- ctrl->wrops++;
- ctrl->rdops++;
-
- return TRUE;
+ return retcode;
}
/** \brief Send new position to rotator device
- * \param ctrl Poitner to the GtkRotCtrl widget
+ * \param ctrl Pointer to the GtkRotCtrl widget
* \param az The new Azimuth
* \param el The new Elevation
* \return TRUE if the new position has been sent successfully
@@ -1071,76 +1018,29 @@
static gboolean set_pos (GtkRotCtrl *ctrl, gdouble az, gdouble el)
{
gchar *buff;
+ gchar buffback[128];
gchar azstr[8],elstr[8];
- gint written,size;
- gint status;
- struct hostent *h;
- struct sockaddr_in ServAddr;
- gint sock; /*!< Network socket */
-
+ gboolean retcode;
- /* create socket */
- sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sock < 0) {
- sat_log_log (SAT_LOG_LEVEL_ERROR,
- _("%s:%d: Failed to create socket"),
- __FILE__, __LINE__);
- return FALSE;
- }
- else {
- sat_log_log (SAT_LOG_LEVEL_DEBUG,
- _("%s:%d Network socket created successfully"),
- __FILE__, __LINE__);
- }
-
- 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:%d: Failed to connect to %s:%d"),
- __FILE__, __LINE__, ctrl->conf->host, ctrl->conf->port);
- return FALSE;
- }
- else {
- sat_log_log (SAT_LOG_LEVEL_DEBUG,
- _("%s:%d: Connection opened to %s:%d"),
- __FILE__, __LINE__, ctrl->conf->host, ctrl->conf->port);
- }
-
/* send command */
g_ascii_formatd (azstr, 8, "%7.2f", az);
g_ascii_formatd (elstr, 8, "%7.2f", el);
- buff = g_strdup_printf ("P %s %s\x0aq\x0a", azstr, elstr);
+ buff = g_strdup_printf ("P %s %s\x0a", azstr, elstr);
- size = 20;
- written = send(sock, buff, size, 0);
- if (written != size) {
- sat_log_log (SAT_LOG_LEVEL_ERROR,
- _("%s:%d: SIZE ERROR %d / %d"),
- __FILE__, __LINE__, written, size);
- }
+ retcode=send_rotctld_command(ctrl,buff,buffback,128);
- //g_print ("SZ:%d WR:%d AZ:%s EL:%s STR:%s", size, written, azstr, elstr, buff);
-
g_free (buff);
-#ifndef WIN32
- shutdown (sock, SHUT_RDWR);
-#else
- shutdown (sock, SD_BOTH);
-#endif
+ if (retcode==TRUE)
+ if (strncmp(buffback,"RPRT 0",6)!=0) {
+ sat_log_log (SAT_LOG_LEVEL_ERROR,
+ _("%s:%d: rotctld returned error (%s)"),
+ __FILE__, __LINE__,buffback);
+
+ retcode=FALSE;
+ }
- close (sock);
-
- ctrl->wrops++;
-
- return TRUE;
+ return (retcode);
}
@@ -1234,6 +1134,8 @@
if (g_str_has_suffix (filename, ".rot")) {
i++;
+ /*once we have one we need nothing else*/
+ break;
}
}
}
@@ -1249,3 +1151,136 @@
return (i > 0) ? TRUE : FALSE;
}
+
+/** \brief open the rotcld socket. return true if successful false otherwise.*/
+
+static gboolean open_rotctld_socket (GtkRotCtrl * ctrl, gint *sock) {
+ struct sockaddr_in ServAddr;
+ struct hostent *h;
+ gint status;
+
+ 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 FALSE;
+ }
+ 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(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 FALSE;
+ }
+ else {
+ sat_log_log (SAT_LOG_LEVEL_DEBUG,
+ _("%s: Connection opened to %s:%d"),
+ __FUNCTION__, ctrl->conf->host, ctrl->conf->port);
+ }
+
+ return TRUE;
+}
+
+
+/*close a rotcld socket. First send a q command to cleanly shut down rotctld*/
+static gboolean close_rotctld_socket (gint sock) {
+ gint written;
+ /*shutdown the rigctld connect*/
+ written = send(sock, "q\x0a", 2, 0);
+
+#ifndef WIN32
+ shutdown (sock, SHUT_RDWR);
+#else
+ shutdown (sock, SD_BOTH);
+#endif
+
+ close (sock);
+
+ return TRUE;
+}
+
+/** \brief Send a command to rigctld
+ * Inputs are a controller, a string command, and a buffer and length for returning the output from rigctld.
+ */
+
+gboolean send_rotctld_command(GtkRotCtrl *ctrl, gchar *buff, gchar *buffout, gint sizeout)
+{
+ gint written;
+ gint size;
+
+ size = strlen(buff);
+
+ sat_log_log (SAT_LOG_LEVEL_DEBUG,
+ _("%s:%s: Sending %d bytes as %s."),
+ __FILE__, __FUNCTION__, size, buff);
+
+
+ /* send command */
+ written = send(ctrl->sock, buff, size, 0);
+ if (written != size) {
+ sat_log_log (SAT_LOG_LEVEL_ERROR,
+ _("%s: SIZE ERROR %d / %d"),
+ __FUNCTION__, written, size);
+ }
+ if (written == -1) {
+ sat_log_log (SAT_LOG_LEVEL_ERROR,
+ _("%s: rotctld Socket Down"),
+ __FUNCTION__);
+ return FALSE;
+ }
+
+ /* try to read answer */
+ size = read (ctrl->sock, buffout, sizeout);
+
+ if (size == -1) {
+ sat_log_log (SAT_LOG_LEVEL_ERROR,
+ _("%s: rotctld Socket Down"),
+ __FUNCTION__);
+ return FALSE;
+ }
+
+ buffout[size]='\0';
+ if (size == 0) {
+ sat_log_log (SAT_LOG_LEVEL_ERROR,
+ _("%s:%s: Got 0 bytes from rotctld"),
+ __FILE__, __FUNCTION__);
+ }
+ else {
+ sat_log_log (SAT_LOG_LEVEL_DEBUG,
+ _("%s:%s: Read %d bytes as %s from rotctld"),
+ __FILE__, __FUNCTION__, size, buffout);
+
+ }
+
+ ctrl->wrops++;
+
+ return TRUE;
+}
+
+/** \brief Compare Satellite Names.
+ *simple function to sort the list of satellites in the combo box.
+ */
+static gint sat_name_compare (sat_t* a,sat_t*b){
+ return (g_ascii_strcasecmp(a->nickname,b->nickname));
+}
+
+
+/** \brief Compare Rotator Names.
+ */
+static gint rot_name_compare (const gchar* a,const gchar *b){
+ return (g_ascii_strcasecmp(a,b));
+}
Property changes on: trunk/src/gtk-rot-ctrl.c
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/continuous_network/src/gtk-rot-ctrl.c:655-689
Modified: trunk/src/gtk-rot-ctrl.h
===================================================================
--- trunk/src/gtk-rot-ctrl.h 2010-10-17 00:28:35 UTC (rev 689)
+++ trunk/src/gtk-rot-ctrl.h 2010-10-17 14:30:56 UTC (rev 690)
@@ -93,7 +93,8 @@
gboolean engaged; /*!< Flag indicating that rotor device is engaged. */
gint errcnt; /*!< Error counter. */
-
+ gint sock; /*!< socket for connecting to rotctld. */
+
/* debug related */
guint wrops;
guint rdops;
Property changes on: trunk/src/gtk-rot-ctrl.h
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/continuous_network/src/gtk-rot-ctrl.h:655-689
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|