gpsd-dbus.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /* Written by: parazyd <parazyd@dyne.org>
  2. *
  3. * To build:
  4. gcc gpsd-dbus.c -o gpsd-dbus \
  5. $(pkg-config dbus-1 glib-2.0 dbus-glib-1 --cflags --libs)
  6. *
  7. * This file is Copyright 2020 by the GPSD project
  8. * SPDX-License-Identifier: BSD-2-clause
  9. */
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <dbus/dbus.h>
  13. #include <dbus/dbus-glib-lowlevel.h>
  14. #include <glib.h>
  15. static int on_signal(int unused, DBusMessage *msg, gpointer obj) {
  16. DBusError error;
  17. /* message args */
  18. double time;
  19. int mode;
  20. double time_uncertainty;
  21. double lattitude;
  22. double longitude;
  23. double horizontal_uncertainty;
  24. double altitude;
  25. double altitude_uncertainty;
  26. double course;
  27. double course_uncertainty;
  28. double speed;
  29. double speed_uncertainty;
  30. double climb;
  31. double climb_uncertainty;
  32. const char* name;
  33. const char *member;
  34. (void)obj;
  35. (void)unused;
  36. member = dbus_message_get_member(msg);
  37. if (strcmp(member, "fix") != 0) {
  38. return 0;
  39. }
  40. dbus_error_init(&error);
  41. if (!dbus_message_get_args(msg, &error,
  42. DBUS_TYPE_DOUBLE, &time,
  43. DBUS_TYPE_INT32, &mode,
  44. DBUS_TYPE_DOUBLE, &time_uncertainty,
  45. DBUS_TYPE_DOUBLE, &lattitude,
  46. DBUS_TYPE_DOUBLE, &longitude,
  47. DBUS_TYPE_DOUBLE, &horizontal_uncertainty,
  48. DBUS_TYPE_DOUBLE, &altitude,
  49. DBUS_TYPE_DOUBLE, &altitude_uncertainty,
  50. DBUS_TYPE_DOUBLE, &course,
  51. DBUS_TYPE_DOUBLE, &course_uncertainty,
  52. DBUS_TYPE_DOUBLE, &speed,
  53. DBUS_TYPE_DOUBLE, &speed_uncertainty,
  54. DBUS_TYPE_DOUBLE, &climb,
  55. DBUS_TYPE_DOUBLE, &climb_uncertainty,
  56. DBUS_TYPE_STRING, &name,
  57. NULL)) {
  58. fprintf(stderr, "DBUS ERROR: %s\n", error.message);
  59. dbus_error_free(&error);
  60. } else {
  61. fprintf(stderr,
  62. "name: %s, time: %lf, longitude: %lf, lattitude: %lf\n",
  63. name, time, longitude, lattitude);
  64. }
  65. return 0;
  66. }
  67. GMainLoop *mainloop = NULL;
  68. DBusConnection *system_bus = NULL;
  69. int main() {
  70. mainloop = g_main_loop_new(NULL, FALSE);
  71. system_bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, NULL);
  72. dbus_connection_setup_with_g_main(system_bus, NULL);
  73. // signal time=1604331638.623891 sender=:1.401 ->
  74. // destination=(null destination) serial=6 path=/org/gpsd;
  75. // interface=org.gpsd; member=fix
  76. dbus_bus_add_match(system_bus,
  77. "type='signal',interface='org.gpsd'",
  78. NULL);
  79. dbus_connection_add_filter(system_bus,
  80. (DBusHandleMessageFunction)on_signal,
  81. NULL,
  82. NULL);
  83. g_main_loop_run(mainloop);
  84. }