summaryrefslogtreecommitdiff
path: root/xgpsspeed.c
diff options
context:
space:
mode:
authorRemco Treffkorn <remco@rvt.com>1999-07-17 23:03:47 +0000
committerRemco Treffkorn <remco@rvt.com>1999-07-17 23:03:47 +0000
commitf632377e259aa6656057e238e73051121e2d2478 (patch)
tree564da23d7331d6cb90ecea5c37ab1550080d71a4 /xgpsspeed.c
parent6ac8d7649f528969ce98a8067bcf6aaa749b8b10 (diff)
downloadgpsd-f632377e259aa6656057e238e73051121e2d2478.tar.gz
*** empty log message ***
Diffstat (limited to 'xgpsspeed.c')
-rw-r--r--xgpsspeed.c196
1 files changed, 196 insertions, 0 deletions
diff --git a/xgpsspeed.c b/xgpsspeed.c
new file mode 100644
index 00000000..8164d1a9
--- /dev/null
+++ b/xgpsspeed.c
@@ -0,0 +1,196 @@
+/* GPS speedometer as a wrapper around an Athena widget Tachometer
+ * - Derrick J Brashear <shadow@dementia.org>
+ * Tachometer widget from Kerberometer (xklife)
+ */
+#include "config.h"
+#include "xgpsspeed.h"
+#include "xgpsspeed.icon"
+#include "nmea.h"
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#define BUFSIZE 4096
+#define DEFAULTPORT "5678"
+char latd, lond;
+double latitude, longitude;
+int device_type;
+int debug = 0;
+
+#if defined(ultrix) || defined(SOLARIS)
+extern double rint();
+#endif
+
+Widget toplevel, base;
+Widget tacho, label, title;
+
+static XrmOptionDescRec options[] = {
+{"-rv", "*reverseVideo", XrmoptionNoArg, "TRUE"},
+{"-nc", "*needleColor", XrmoptionSepArg, NULL},
+{"-needlecolor","*needleColor", XrmoptionSepArg, NULL},
+};
+
+/*
+ * Definition of the Application resources structure.
+ */
+
+typedef struct _XGpsResources {
+} XGpsResources;
+
+XGpsResources resources;
+
+#define Offset(field) (XtOffset(XGpsResources *, field))
+
+static XtResource my_resources[] = {
+};
+
+String fallback_resources[] =
+{
+};
+
+static void open_input(XtAppContext app);
+
+#undef Offset
+
+int errexit(char *s)
+{
+ perror(s);
+ //serial_close();
+ exit(1);
+}
+
+int
+main(int argc, char **argv)
+{
+ Arg args[10];
+ XtAppContext app;
+ Cardinal i;
+ char *cp;
+ int ret;
+
+
+ toplevel = XtVaAppInitialize(&app, "XGpsSpeed", options, XtNumber(options),
+ &argc, argv, fallback_resources, NULL);
+
+ XtGetApplicationResources( toplevel, (caddr_t) &resources,
+ my_resources, XtNumber(my_resources),
+ NULL, (Cardinal) 0);
+
+ /**** Shell Widget ****/
+ i = 0;
+ XtSetArg(args[0], XtNiconPixmap,
+ XCreateBitmapFromData(XtDisplay(toplevel),
+ XtScreen(toplevel)->root, xgps_bits,
+ xgps_width, xgps_height)); i++;
+ XtSetValues(toplevel, args, i);
+
+ /**** Form widget ****/
+ base = XtCreateManagedWidget("pane", panedWidgetClass, toplevel, NULL, 0);
+
+ /**** Label widget (Title) ****/
+ i = 0;
+ XtSetArg(args[i], XtNlabel, "GPS Speedometer"); i++;
+ label = XtCreateManagedWidget("title", labelWidgetClass,
+ base, args, i);
+
+ /**** Label widget ****/
+ i = 0;
+ XtSetArg(args[i], XtNlabel, "Miles per Hour"); i++;
+ label = XtCreateManagedWidget("name", labelWidgetClass,
+ base, args, i);
+
+ /**** Tachometer widget ****/
+ tacho = XtCreateManagedWidget("meter",
+ tachometerWidgetClass,
+ base, NULL, 0);
+
+ XtRealizeWidget(toplevel);
+ open_input(app);
+
+ XtAppMainLoop(app);
+}
+
+
+
+Usage()
+{
+ fprintf(stderr,
+ "xgpsspeed <Toolkit Options> [-rv] [-nc needlecolor]\n");
+ exit(-1);
+}
+
+
+#if 0
+#if defined(i386) || defined(__hpux)
+#define rint (int)
+#endif
+#endif
+
+void update_display()
+{
+ int new = rint(gNMEAdata.speed * 6076.12 / 5280);
+ // fprintf(stderr, "gNMEAspeed %f scaled %f %d\n", gNMEAdata.speed, rint(gNMEAdata.speed * 5208/6706.12), (int)rint(gNMEAdata.speed * 5208/6706.12));
+ if (new > 100)
+ new = 100;
+
+ TachometerSetValue(tacho, new);
+}
+
+static void handle_input(XtPointer client_data, int *source, XtInputId * id)
+{
+ double speed;
+ static unsigned char buf[BUFSIZE]; /* that is more than a sentence */
+ static int offset = 0;
+ int count;
+
+ ioctl(*source, FIONREAD, &count); // this is BAD! Why can't I make the
+ // socket non blocking for read?
+
+ while (offset < BUFSIZE && count--) {
+ if (read(*source, buf + offset, 1) != 1)
+ return;
+
+ if (buf[offset] == '\n') {
+ if (buf[offset - 1] == '\r')
+ buf[offset - 1] = '\0';
+ handle_message(buf);
+ update_display();
+ offset = 0;
+ return;
+ }
+ offset++;
+ }
+}
+
+int my_serial_open()
+{
+ char *temp;
+ char *p;
+ char *port = DEFAULTPORT;
+ char *device_name="gps.mayko.com";
+ int one = 1;
+ int ttyfd;
+
+ temp = malloc(strlen(device_name) + 1);
+ strcpy(temp, device_name);
+
+ //temp now holds the HOSTNAME portion and port the port number.
+ ttyfd = connectTCP(temp, port);
+ free(temp);
+ port = 0;
+
+ setsockopt(ttyfd, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof(one));
+
+ if (write(ttyfd, "r\n", 2) != 2)
+ errexit("Can't write to socket");
+ return ttyfd;
+}
+
+static void open_input(XtAppContext app)
+{
+ int input = 0;
+ XtInputId input_id;
+
+ input = my_serial_open();
+
+ input_id = XtAppAddInput(app, input, (XtPointer) XtInputReadMask,
+ handle_input, NULL);
+}