]> git.itanic.dy.fi Git - maemo-mapper/blobdiff - src/main.c
Added basic APRS support - Can be disabled by removing definition of INCLUDE_APRS
[maemo-mapper] / src / main.c
index 5ce2abf349c819d5205b9880722a8b48e04bd96c..0a30384b6876992841a3396c57bbfa8176971822 100644 (file)
@@ -60,6 +60,7 @@
 #include "dbus-ifc.h"
 #include "display.h"
 #include "gps.h"
+#include "aprs.h"
 #include "gpx.h"
 #include "input.h"
 #include "main.h"
@@ -232,6 +233,72 @@ maemo_mapper_destroy()
     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
 }
 
+// Called once per second
+gboolean timer_callback (gpointer data) {
+       
+#ifdef INCLUDE_APRS
+       static int inet_beacon_count = 0;
+       static int inet_aprs_filter = 0;
+       static int tty_beacon_count = 0;
+       
+       if(_aprs_enable)
+       {
+               // Check if we need to resent the filter every 5 minutes
+               // Note - this should really be dependent on speed and/or range
+               if(_aprs_inet_enable && inet_aprs_filter > (60*5))
+               {
+                       // Currently this only needs to be sent on connection
+                       //update_aprs_inet_options(FALSE);
+                       inet_aprs_filter = 0;
+               }
+               
+               if(_aprs_inet_enable && _aprs_enable_inet_tx && _aprs_inet_beacon_interval > 0 && _aprs_inet_state      == RCVR_UP)
+               {
+                       
+                       
+                       if(inet_beacon_count >= _aprs_inet_beacon_interval)
+                       {
+                               // Send inet APRS beacon
+                               aprs_send_beacon(APRS_PORT_INET);
+                               //g_idle_add((GSourceFunc)aprs_send_beacon, APRS_PORT_INET);
+                               //fprintf(stderr, "timer %u, %u\n", inet_beacon_count, _aprs_inet_beacon_interval);
+                               inet_beacon_count = 0;
+                       }
+                       
+               }
+               
+               if(_aprs_tty_enable && _aprs_enable_tty_tx )
+               {
+                       // Send tty APRS beacon
+                       
+                       if(tty_beacon_count >= _aprs_tty_beacon_interval && _aprs_tty_beacon_interval > 0)
+                       {
+                               // Send inet APRS beacon
+                               aprs_send_beacon(APRS_PORT_TTY);
+                               
+                               //g_idle_add((GSourceFunc)aprs_send_beacon_inet, NULL);
+                               
+                               tty_beacon_count = 0;
+                       }
+
+               }
+               
+
+               inet_aprs_filter++;
+               inet_beacon_count++;
+               tty_beacon_count++;
+       }
+#endif //INCLUDE_APRS
+       
+       return TRUE; // Continue timer
+}
+
+// Start a one second timer - this can be used to execute any periodic tasks 
+void timer_init()
+{
+       g_timeout_add(1000 , timer_callback, NULL);
+}
+
 /**
  * Initialize everything required in preparation for calling gtk_main().
  */
@@ -345,16 +412,92 @@ maemo_mapper_init(gint argc, gchar **argv)
         = _("Reset Bluetooth");
     CUSTOM_ACTION_ENUM_TEXT[CUSTOM_ACTION_TOGGLE_LAYERS] = _("Toggle Layers");
 
-    DEG_FORMAT_ENUM_TEXT[DDPDDDDD] = "-dd.ddddd°";
-    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM] = "-dd°mm.mmm'";
-    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS] = "-dd°mm'ss.s\"";
-    DEG_FORMAT_ENUM_TEXT[DDPDDDDD_NSEW] = "dd.ddddd° S";
-    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM_NSEW] = "dd°mm.mmm' S";
-    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS_NSEW] = "dd°mm'ss.s\" S";
-    DEG_FORMAT_ENUM_TEXT[NSEW_DDPDDDDD] = "S dd.ddddd°";
-    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MMPMMM] = "S dd° mm.mmm'";
-    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MM_SSPS] = "S dd° mm' ss.s\"";
-
+    DEG_FORMAT_ENUM_TEXT[DDPDDDDD].name = "-dd.ddddd°";
+    DEG_FORMAT_ENUM_TEXT[DDPDDDDD].short_field_1 = "Lat";
+    DEG_FORMAT_ENUM_TEXT[DDPDDDDD].long_field_1 = "Latitude";
+    DEG_FORMAT_ENUM_TEXT[DDPDDDDD].short_field_2 = "Lon";
+    DEG_FORMAT_ENUM_TEXT[DDPDDDDD].long_field_2 = "Longitude";
+    DEG_FORMAT_ENUM_TEXT[DDPDDDDD].field_2_in_use = TRUE;
+    
+    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM].name = "-dd°mm.mmm'";
+    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM].short_field_1 = "Lat";
+    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM].long_field_1 = "Latitude";
+    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM].short_field_2 = "Lon";
+    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM].long_field_2 = "Longitude";
+    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM].field_2_in_use = TRUE;
+    
+    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS].name = "-dd°mm'ss.s\"";
+    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS].short_field_1 = "Lat";
+    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS].long_field_1 = "Latitude";
+    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS].short_field_2 = "Lon";
+    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS].long_field_2 = "Longitude";
+    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS].field_2_in_use = TRUE;
+    
+    DEG_FORMAT_ENUM_TEXT[DDPDDDDD_NSEW].name = "dd.ddddd° S";
+    DEG_FORMAT_ENUM_TEXT[DDPDDDDD_NSEW].short_field_1 = "Lat";
+    DEG_FORMAT_ENUM_TEXT[DDPDDDDD_NSEW].long_field_1 = "Latitude";
+    DEG_FORMAT_ENUM_TEXT[DDPDDDDD_NSEW].short_field_2 = "Lon";
+    DEG_FORMAT_ENUM_TEXT[DDPDDDDD_NSEW].long_field_2 = "Longitude";
+    DEG_FORMAT_ENUM_TEXT[DDPDDDDD_NSEW].field_2_in_use = TRUE;
+    
+    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM_NSEW].name = "dd°mm.mmm' S";
+    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM_NSEW].short_field_1 = "Lat";
+    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM_NSEW].long_field_1 = "Latitude";
+    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM_NSEW].short_field_2 = "Lon";
+    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM_NSEW].long_field_2 = "Longitude";
+    DEG_FORMAT_ENUM_TEXT[DD_MMPMMM_NSEW].field_2_in_use = TRUE;
+    
+    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS_NSEW].name = "dd°mm'ss.s\" S";
+    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS_NSEW].short_field_1 = "Lat";
+    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS_NSEW].long_field_1 = "Latitude";
+    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS_NSEW].short_field_2 = "Lon";
+    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS_NSEW].long_field_2 = "Longitude";
+    DEG_FORMAT_ENUM_TEXT[DD_MM_SSPS_NSEW].field_2_in_use = TRUE;
+    
+    DEG_FORMAT_ENUM_TEXT[NSEW_DDPDDDDD].name = "S dd.ddddd°";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DDPDDDDD].short_field_1 = "Lat";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DDPDDDDD].long_field_1 = "Latitude";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DDPDDDDD].short_field_2 = "Lon";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DDPDDDDD].long_field_2 = "Longitude";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DDPDDDDD].field_2_in_use = TRUE;
+    
+    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MMPMMM].name = "S dd° mm.mmm'";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MMPMMM].short_field_1 = "Lat";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MMPMMM].long_field_1 = "Latitude";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MMPMMM].short_field_2 = "Lon";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MMPMMM].long_field_2 = "Longitude";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MMPMMM].field_2_in_use = TRUE;
+    
+    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MM_SSPS].name = "S dd° mm' ss.s\"";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MM_SSPS].short_field_1 = "Lat";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MM_SSPS].long_field_1 = "Latitude";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MM_SSPS].short_field_2 = "Lon";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MM_SSPS].long_field_2 = "Longitude";
+    DEG_FORMAT_ENUM_TEXT[NSEW_DD_MM_SSPS].field_2_in_use = TRUE;
+
+    // Used by Radio Amateurs
+    DEG_FORMAT_ENUM_TEXT[IARU_LOC].name = "IARU Locator";
+    DEG_FORMAT_ENUM_TEXT[IARU_LOC].short_field_1 = "Locator";
+    DEG_FORMAT_ENUM_TEXT[IARU_LOC].long_field_1 = "Lacator";
+    DEG_FORMAT_ENUM_TEXT[IARU_LOC].short_field_2 = "";
+    DEG_FORMAT_ENUM_TEXT[IARU_LOC].long_field_2 = "";
+    DEG_FORMAT_ENUM_TEXT[IARU_LOC].field_2_in_use = FALSE;
+
+    
+    DEG_FORMAT_ENUM_TEXT[UK_OSGB].name = "OSGB X,Y Grid";
+    DEG_FORMAT_ENUM_TEXT[UK_OSGB].short_field_1 = "X";
+    DEG_FORMAT_ENUM_TEXT[UK_OSGB].long_field_1 = "OS X";
+    DEG_FORMAT_ENUM_TEXT[UK_OSGB].short_field_2 = "Y";
+    DEG_FORMAT_ENUM_TEXT[UK_OSGB].long_field_2 = "OS Y";
+    DEG_FORMAT_ENUM_TEXT[UK_OSGB].field_2_in_use = TRUE;
+    
+    DEG_FORMAT_ENUM_TEXT[UK_NGR].name = "OSGB Landranger Grid";
+    DEG_FORMAT_ENUM_TEXT[UK_NGR].short_field_1 = "GR";
+    DEG_FORMAT_ENUM_TEXT[UK_NGR].long_field_1 = "OS Grid";
+    DEG_FORMAT_ENUM_TEXT[UK_NGR].short_field_2 = "";
+    DEG_FORMAT_ENUM_TEXT[UK_NGR].long_field_2 = "";
+    DEG_FORMAT_ENUM_TEXT[UK_NGR].field_2_in_use = FALSE;
+    
     SPEED_LOCATION_ENUM_TEXT[SPEED_LOCATION_TOP_LEFT] = _("Top-Left");
     SPEED_LOCATION_ENUM_TEXT[SPEED_LOCATION_TOP_RIGHT] = _("Top-Right");
     SPEED_LOCATION_ENUM_TEXT[SPEED_LOCATION_BOTTOM_RIGHT] = _("Bottom-Right");
@@ -513,7 +656,12 @@ maemo_mapper_init(gint argc, gchar **argv)
     poi_db_connect();
     display_init();
     dbus_ifc_init();
-
+    
+#ifdef INCLUDE_APRS
+    aprs_init();
+    timer_init();
+#endif //INCLUDE_APRS
+    
     /* If present, attempt to load the file specified on the command line. */
     if(argc > 1)
     {