ubus notifications have to be enabled to support publish / subscribe pattern. This pattern is an alternative to polling, and can be used e.g. for streaming gps data directly to other application or a browser.
Signed-off-by: Wojciech Jowsa <wojciech.jo...@gmail.com> --- main.c | 41 +++++++++++++++++++++++++++++++++++------ nmea.c | 5 ++++- nmea.h | 1 + 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/main.c b/main.c index 2ab0f8c..1626c01 100644 --- a/main.c +++ b/main.c @@ -13,7 +13,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * - * Copyright (C) 2014 John Crispin <blo...@openwrt.org> + * Copyright (C) 2014 John Crispin <blo...@openwrt.org> */ #include <string.h> @@ -34,6 +34,7 @@ static struct blob_buf b; static char *ubus_socket; struct timespec stamp = { 0 }; unsigned int adjust_clock = 0; +bool notify = false; void gps_timestamp(void) @@ -41,10 +42,8 @@ gps_timestamp(void) clock_gettime(CLOCK_MONOTONIC, &stamp); } -static int -gps_info(struct ubus_context *ctx, struct ubus_object *obj, - struct ubus_request_data *req, const char *method, - struct blob_attr *msg) +static void +prepare_data() { struct timespec now; @@ -67,6 +66,15 @@ gps_info(struct ubus_context *ctx, struct ubus_object *obj, if (gps_fields & GPS_FIELD_SPD) blobmsg_add_string(&b, "speed", speed); } +} + +static int +gps_info(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + prepare_data(); + ubus_send_reply(ctx, req, b.head); return UBUS_STATUS_OK; @@ -105,10 +113,28 @@ usage(const char *prog) " -s <path> Path to ubus socket\n" " -d <level> Enable debug messages\n" " -S Print messages to stdout\n" + " -n Enable ubus notfication\n" "\n", prog); return -1; } +void +notify_ubus() +{ + int err; + + if (!notify) { + return; + } + + prepare_data(); + + err = ubus_notify(&(conn.ctx), &gps_object, "update", b.head, -1); + if (err) { + ERROR("Ubus notify failed: %s\n", ubus_strerror(err)); + } +} + int main(int argc, char ** argv) { @@ -124,7 +150,7 @@ main(int argc, char ** argv) unsetenv("DBGLVL"); } - while ((ch = getopt(argc, argv, "ad:s:S")) != -1) { + while ((ch = getopt(argc, argv, "and:s:S")) != -1) { switch (ch) { case 'a': adjust_clock = -1; @@ -138,6 +164,9 @@ main(int argc, char ** argv) case 'S': ulog_channels = ULOG_STDIO; break; + case 'n': + notify = true; + break; default: return usage(argv[0]); } diff --git a/nmea.c b/nmea.c index e86f68f..44a739a 100644 --- a/nmea.c +++ b/nmea.c @@ -52,7 +52,7 @@ struct nmea_param { } nmea_params[MAX_NMEA_PARAM]; static int nmea_bad_time; -char longitude[33] = { 0 }, latitude[33] = { 0 }, course[17] = { 0 }, speed[17] = { 0 }, elevation[17] = { 0 }; +char longitude[33] = { 0 }, latitude[33] = { 0 }, course[17] = { 0 }, speed[17] = { 0 }, elevation[17] = { 0 }; int gps_valid = 0; char gps_fields = 0; @@ -123,6 +123,7 @@ parse_gps_coords(char *latstr, char *vhem, char *lonstr, char *hhem) gps_fields |= GPS_FIELD_LAT | GPS_FIELD_LON; gps_timestamp(); + notify_ubus(); } static void @@ -224,6 +225,7 @@ nmea_gga_cb(void) return; strncpy(elevation, nmea_params[9].str, sizeof(elevation)); gps_fields |= GPS_FIELD_ALT; + notify_ubus(); DEBUG(4, "height: %s\n", elevation); } @@ -235,6 +237,7 @@ nmea_vtg_cb(void) strncpy(course, nmea_params[1].str, sizeof(course)); strncpy(speed, nmea_params[7].str, sizeof(speed)); gps_fields |= GPS_FIELD_COG | GPS_FIELD_SPD; + notify_ubus(); DEBUG(4, "course: %s\n", course); DEBUG(4, "speed: %s\n", speed); } diff --git a/nmea.h b/nmea.h index 2de06dc..4bd07d8 100644 --- a/nmea.h +++ b/nmea.h @@ -27,6 +27,7 @@ extern char longitude[33], latitude[33], course[17], speed[17], elevation[17]; extern int nmea_open(char *dev, struct ustream_fd *s, speed_t speed); extern void gps_timestamp(void); extern unsigned int adjust_clock; +extern void notify_ubus(void); extern char gps_fields; #define GPS_FIELD_LAT (1<<0) #define GPS_FIELD_LON (1<<1) -- 2.25.1 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel