ugps: add quality measurement parameters
[project/ugps.git] / main.c
diff --git a/main.c b/main.c
index 87d069be02112ecd1e1d75884bf9bbc713ce85a4..acd6a42a5c778b5be944bcaa786c8254ede0bb5b 100644 (file)
--- a/main.c
+++ b/main.c
@@ -33,6 +33,7 @@ static struct ubus_auto_conn conn;
 static struct blob_buf b;
 static char *ubus_socket;
 struct timespec stamp = { 0 };
+unsigned int adjust_clock = 0;
 
 void
 gps_timestamp(void)
@@ -51,15 +52,24 @@ gps_info(struct ubus_context *ctx, struct ubus_object *obj,
 
        blob_buf_init(&b, 0);
 
-       if (!stamp.tv_sec) {
+       if (!stamp.tv_sec || !gps_fields) {
                blobmsg_add_u8(&b, "signal", 0);
        } else {
                blobmsg_add_u32(&b, "age", now.tv_sec - stamp.tv_sec);
-               blobmsg_add_string(&b, "latitude", latitude);
-               blobmsg_add_string(&b, "longitude", longitude);
-               blobmsg_add_string(&b, "elivation", elivation);
-               blobmsg_add_string(&b, "course", course);
-               blobmsg_add_string(&b, "speed", speed);
+               if (gps_fields & GPS_FIELD_LAT)
+                       blobmsg_add_string(&b, "latitude", latitude);
+               if (gps_fields & GPS_FIELD_LON)
+                       blobmsg_add_string(&b, "longitude", longitude);
+               if (gps_fields & GPS_FIELD_ALT)
+                       blobmsg_add_string(&b, "elevation", elevation);
+               if (gps_fields & GPS_FIELD_COG)
+                       blobmsg_add_string(&b, "course", course);
+               if (gps_fields & GPS_FIELD_SPD)
+                       blobmsg_add_string(&b, "speed", speed);
+               if (gps_fields & GPS_FIELD_SAT)
+                       blobmsg_add_string(&b, "satellites", satellites);
+               if (gps_fields & GPS_FIELD_HDP)
+                       blobmsg_add_string(&b, "HDOP", hdop);
        }
        ubus_send_reply(ctx, req, b.head);
 
@@ -95,13 +105,36 @@ usage(const char *prog)
 {
        fprintf(stderr, "Usage: %s [options] <device>\n"
                "Options:\n"
+               "       -a              Adjust system clock from gps\n"
                "       -s <path>       Path to ubus socket\n"
                "       -d <level>      Enable debug messages\n"
                "       -S              Print messages to stdout\n"
+               "       -b              Set gps device baud rate\n"
                "\n", prog);
        return -1;
 }
 
+static speed_t get_baudrate(int baudrate)
+{
+    switch (baudrate) {
+               case 4800:
+                       return B4800;
+               case 9600:
+                       return B9600;
+               case 19200:
+                       return B19200;
+               case 38400:
+                       return B38400;
+               case 57600:
+                       return B57600;
+               case 115200:
+                       return B115200;
+               default:
+                       fprintf(stderr, "ERROR: incorrect baud rate. Default 4800 baud rate has been set\n");
+                       return B4800;
+    }
+}
+
 int
 main(int argc, char ** argv)
 {
@@ -109,6 +142,7 @@ main(int argc, char ** argv)
        char *device = NULL;
        char *dbglvl = getenv("DBGLVL");
        int ulog_channels = ULOG_KMSG;
+       speed_t baudrate = B4800;
 
        signal(SIGPIPE, SIG_IGN);
 
@@ -117,8 +151,11 @@ main(int argc, char ** argv)
                unsetenv("DBGLVL");
        }
 
-       while ((ch = getopt(argc, argv, "d:D:s:S")) != -1) {
+       while ((ch = getopt(argc, argv, "ad:s:Sb:")) != -1) {
                switch (ch) {
+               case 'a':
+                       adjust_clock = -1;
+                       break;
                case 's':
                        ubus_socket = optarg;
                        break;
@@ -128,6 +165,9 @@ main(int argc, char ** argv)
                case 'S':
                        ulog_channels = ULOG_STDIO;
                        break;
+               case 'b':
+                       baudrate = get_baudrate(atoi(optarg));
+                       break;
                default:
                        return usage(argv[0]);
                }
@@ -145,7 +185,10 @@ main(int argc, char ** argv)
        conn.path = ubus_socket;
        conn.cb = ubus_connect_handler;
        ubus_auto_connect(&conn);
-       nmea_open(argv[1], &stream, B4800);
+
+       if (nmea_open(device, &stream, baudrate) < 0)
+               return -1;
+
        uloop_run();
        uloop_done();