From 045698b1539c86205f5310f6e84236573b12c1fd Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Wed, 3 Oct 2012 23:57:35 +0000 Subject: [PATCH] Initial import of the GPS toggling plug-in for Huawei EM770W (untested) --- Makefile | 1 + src/plugins/Makefile | 19 +++- src/plugins/gps.c | 183 +++++++++++++++++++++++++++++++++++++++ src/plugins/project.conf | 11 ++- 4 files changed, 210 insertions(+), 4 deletions(-) create mode 100644 src/plugins/gps.c diff --git a/Makefile b/Makefile index b0b3188..82164fc 100644 --- a/Makefile +++ b/Makefile @@ -94,6 +94,7 @@ dist: $(PACKAGE)-$(VERSION)/src/plugins/debug.c \ $(PACKAGE)-$(VERSION)/src/plugins/engineering.c \ $(PACKAGE)-$(VERSION)/src/plugins/gprs.c \ + $(PACKAGE)-$(VERSION)/src/plugins/gps.c \ $(PACKAGE)-$(VERSION)/src/plugins/locker.c \ $(PACKAGE)-$(VERSION)/src/plugins/n900.c \ $(PACKAGE)-$(VERSION)/src/plugins/openmoko.c \ diff --git a/src/plugins/Makefile b/src/plugins/Makefile index 3b9446b..9cb32e5 100644 --- a/src/plugins/Makefile +++ b/src/plugins/Makefile @@ -1,5 +1,5 @@ SUBDIRS = 16x16 24x24 32x32 48x48 -TARGETS = blacklist.so debug.so engineering.so gprs.so locker.so n900.so openmoko.so oss.so panel.so profiles.so smscrypt.so systray.so ussd.so +TARGETS = blacklist.so debug.so engineering.so gprs.so gps.so locker.so n900.so openmoko.so oss.so panel.so profiles.so smscrypt.so systray.so ussd.so PREFIX = /usr/local DESTDIR = LIBDIR = $(PREFIX)/lib @@ -50,6 +50,13 @@ gprs_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) gprs.so: $(gprs_OBJS) $(CCSHARED) -o gprs.so $(gprs_OBJS) $(gprs_LDFLAGS) +gps_OBJS = gps.o +gps_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) -I../modems $(CFLAGSF) $(CFLAGS) +gps_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) + +gps.so: $(gps_OBJS) + $(CCSHARED) -o gps.so $(gps_OBJS) $(gps_LDFLAGS) + locker_OBJS = locker.o locker_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) locker_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) @@ -125,6 +132,9 @@ engineering.o: engineering.c ../../include/Phone.h gprs.o: gprs.c ../../include/Phone.h $(CC) $(gprs_CFLAGS) -c gprs.c +gps.o: gps.c ../../include/Phone.h + $(CC) $(gps_CFLAGS) -c gps.c + locker.o: locker.c ../../include/Phone.h $(CC) $(locker_CFLAGS) -c locker.c @@ -154,11 +164,11 @@ ussd.o: ussd.c ../../include/Phone.h clean: @for i in $(SUBDIRS); do (cd $$i && $(MAKE) clean) || exit; done - $(RM) -- $(blacklist_OBJS) $(debug_OBJS) $(engineering_OBJS) $(gprs_OBJS) $(locker_OBJS) $(n900_OBJS) $(openmoko_OBJS) $(oss_OBJS) $(panel_OBJS) $(profiles_OBJS) $(smscrypt_OBJS) $(systray_OBJS) $(ussd_OBJS) + $(RM) -- $(blacklist_OBJS) $(debug_OBJS) $(engineering_OBJS) $(gprs_OBJS) $(gps_OBJS) $(locker_OBJS) $(n900_OBJS) $(openmoko_OBJS) $(oss_OBJS) $(panel_OBJS) $(profiles_OBJS) $(smscrypt_OBJS) $(systray_OBJS) $(ussd_OBJS) distclean: @for i in $(SUBDIRS); do (cd $$i && $(MAKE) distclean) || exit; done - $(RM) -- $(blacklist_OBJS) $(debug_OBJS) $(engineering_OBJS) $(gprs_OBJS) $(locker_OBJS) $(n900_OBJS) $(openmoko_OBJS) $(oss_OBJS) $(panel_OBJS) $(profiles_OBJS) $(smscrypt_OBJS) $(systray_OBJS) $(ussd_OBJS) + $(RM) -- $(blacklist_OBJS) $(debug_OBJS) $(engineering_OBJS) $(gprs_OBJS) $(gps_OBJS) $(locker_OBJS) $(n900_OBJS) $(openmoko_OBJS) $(oss_OBJS) $(panel_OBJS) $(profiles_OBJS) $(smscrypt_OBJS) $(systray_OBJS) $(ussd_OBJS) $(RM) -- $(TARGETS) install: $(TARGETS) @@ -172,6 +182,8 @@ install: $(TARGETS) $(MKDIR) $(DESTDIR)$(LIBDIR)/Phone/plugins $(INSTALL) -m 0644 -- gprs.so $(DESTDIR)$(LIBDIR)/Phone/plugins/gprs.so $(MKDIR) $(DESTDIR)$(LIBDIR)/Phone/plugins + $(INSTALL) -m 0644 -- gps.so $(DESTDIR)$(LIBDIR)/Phone/plugins/gps.so + $(MKDIR) $(DESTDIR)$(LIBDIR)/Phone/plugins $(INSTALL) -m 0644 -- locker.so $(DESTDIR)$(LIBDIR)/Phone/plugins/locker.so $(MKDIR) $(DESTDIR)$(LIBDIR)/Phone/plugins $(INSTALL) -m 0644 -- n900.so $(DESTDIR)$(LIBDIR)/Phone/plugins/n900.so @@ -196,6 +208,7 @@ uninstall: $(RM) -- $(DESTDIR)$(LIBDIR)/Phone/plugins/debug.so $(RM) -- $(DESTDIR)$(LIBDIR)/Phone/plugins/engineering.so $(RM) -- $(DESTDIR)$(LIBDIR)/Phone/plugins/gprs.so + $(RM) -- $(DESTDIR)$(LIBDIR)/Phone/plugins/gps.so $(RM) -- $(DESTDIR)$(LIBDIR)/Phone/plugins/locker.so $(RM) -- $(DESTDIR)$(LIBDIR)/Phone/plugins/n900.so $(RM) -- $(DESTDIR)$(LIBDIR)/Phone/plugins/openmoko.so diff --git a/src/plugins/gps.c b/src/plugins/gps.c new file mode 100644 index 0000000..f2c5f46 --- /dev/null +++ b/src/plugins/gps.c @@ -0,0 +1,183 @@ +/* $Id$ */ +/* Copyright (c) 2012 Pierre Pronchery */ +/* This file is part of DeforaOS Desktop Phone */ +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + + + +#include +#include +#include +#include "Phone.h" +#include "hayes.h" + + +/* GPS */ +/* private */ +/* types */ +typedef struct _PhonePlugin +{ + PhonePluginHelper * helper; + + /* widgets */ + GtkWidget * window; +} GPS; + + +/* prototypes */ +/* plugins */ +static GPS * _gps_init(PhonePluginHelper * helper); +static void _gps_destroy(GPS * gps); +static void _gps_settings(GPS * gps); + +static void _gps_queue(GPS * gps, char const * command); + +/* callbacks */ +static void _gps_on_settings_close(gpointer data); +static void _gps_on_settings_start(gpointer data); +static void _gps_on_settings_stop(gpointer data); + + +/* public */ +/* variables */ +PhonePluginDefinition plugin = +{ + "GPS", + NULL, + NULL, + _gps_init, + _gps_destroy, + NULL, + _gps_settings +}; + + +/* private */ +/* functions */ +/* gps_init */ +static GPS * _gps_init(PhonePluginHelper * helper) +{ + GPS * gps; + + if((gps = object_new(sizeof(*gps))) == NULL) + return NULL; + gps->helper = helper; + gps->window = NULL; + return gps; +} + + +/* gps_destroy */ +static void _gps_destroy(GPS * gps) +{ + if(gps->window != NULL) + gtk_widget_destroy(gps->window); + object_delete(gps); +} + + +/* gps_settings */ +static void _settings_window(GPS * gps); + +static void _gps_settings(GPS * gps) +{ + if(gps->window == NULL) + _settings_window(gps); + gtk_window_present(GTK_WINDOW(gps->window)); +} + +static void _settings_window(GPS * gps) +{ + GtkSizeGroup * group; + GtkWidget * vbox; + GtkWidget * hbox; + GtkWidget * widget; + + group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + gps->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_container_set_border_width(GTK_CONTAINER(gps->window), 4); + gtk_window_set_default_size(GTK_WINDOW(gps->window), 200, 300); +#if GTK_CHECK_VERSION(2, 6, 0) + gtk_window_set_icon_name(GTK_WINDOW(gps->window), "gnome-settings"); +#endif + gtk_window_set_title(GTK_WINDOW(gps->window), "GPS"); + g_signal_connect(gps->window, "delete-event", G_CALLBACK( + gtk_widget_hide), NULL); + vbox = gtk_vbox_new(FALSE, 4); + /* controls */ + hbox = gtk_hbutton_box_new(); + widget = gtk_button_new_with_label("Start"); + g_signal_connect_swapped(widget, "clicked", + G_CALLBACK(_gps_on_settings_start), gps); + gtk_container_add(GTK_CONTAINER(hbox), widget); + widget = gtk_button_new_with_label("Stop"); + g_signal_connect_swapped(widget, "clicked", + G_CALLBACK(_gps_on_settings_stop), gps); + gtk_container_add(GTK_CONTAINER(hbox), widget); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); + /* button box */ + hbox = gtk_hbutton_box_new(); + gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbox), 4); + widget = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + g_signal_connect_swapped(widget, "clicked", G_CALLBACK( + _gps_on_settings_close), gps); + gtk_container_add(GTK_CONTAINER(hbox), widget); + gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(gps->window), vbox); + gtk_widget_show_all(vbox); +} + + +/* gps_queue */ +static void _gps_queue(GPS * gps, char const * command) +{ + ModemRequest request; + HayesRequest hrequest; + + request.type = MODEM_REQUEST_UNSUPPORTED; + request.unsupported.modem = "Hayes"; + request.unsupported.request_type = HAYES_REQUEST_COMMAND_QUEUE; + request.unsupported.request = &hrequest; + request.unsupported.size = sizeof(hrequest); + hrequest.command_queue.command = command; + gps->helper->request(gps->helper->phone, &request); +} + + +/* callbacks */ +/* gps_on_settings_close */ +static void _gps_on_settings_close(gpointer data) +{ + GPS * gps = data; + + gtk_widget_hide(gps->window); +} + + +/* gps_on_settings_start */ +static void _gps_on_settings_start(gpointer data) +{ + GPS * gps = data; + + _gps_queue(gps, "AT^WPDGP"); +} + + +/* gps_on_settings_stop */ +static void _gps_on_settings_stop(gpointer data) +{ + GPS * gps = data; + + _gps_queue(gps, "AT^WPDEND"); +} diff --git a/src/plugins/project.conf b/src/plugins/project.conf index 96a804b..be3b7b1 100644 --- a/src/plugins/project.conf +++ b/src/plugins/project.conf @@ -1,5 +1,5 @@ subdirs=16x16,24x24,32x32,48x48 -targets=blacklist,debug,engineering,gprs,locker,n900,openmoko,oss,panel,profiles,smscrypt,systray,ussd +targets=blacklist,debug,engineering,gprs,gps,locker,n900,openmoko,oss,panel,profiles,smscrypt,systray,ussd cppflags_force=-I ../../include cppflags= cflags_force=-W `pkg-config --cflags libSystem gtk+-2.0` @@ -38,6 +38,15 @@ install=$(LIBDIR)/Phone/plugins [gprs.c] depends=../../include/Phone.h +[gps] +type=plugin +sources=gps.c +cppflags=-I../modems +install=$(LIBDIR)/Phone/plugins + +[gps.c] +depends=../../include/Phone.h + [locker] type=plugin sources=locker.c