4 * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Youngae Kang <youngae.kang@samsung.com>, Yunhan Kim <yhan.kim@samsung.com>,
7 * Genie Kim <daejins.kim@samsung.com>, Minjune Kim <sena06.kim@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
26 #include "location/location-setting.h"
27 #include "location/location-log.h"
29 #include "location/location-module-internal.h"
31 #include "location/location-gps.h"
32 #include "location/location-marshal.h"
33 #include "location/location-ielement.h"
34 #include "location/location-signaling-util.h"
35 #include "location/location-common-util.h"
38 typedef struct _LocationGpsPrivate {
43 LocationPosition* pos;
44 LocationVelocity* vel;
45 LocationAccuracy* acc;
47 ZoneStatus zone_status;
57 PROP_REMOVAL_BOUNDARY,
63 static guint32 signals[LAST_SIGNAL] = {0, };
64 static GParamSpec *properties[PROP_MAX] = {NULL, };
66 #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), LOCATION_TYPE_GPS, LocationGpsPrivate))
68 static void location_ielement_interface_init (LocationIElementInterface *iface);
70 G_DEFINE_TYPE_WITH_CODE (LocationGps, location_gps, G_TYPE_OBJECT,
71 G_IMPLEMENT_INTERFACE (LOCATION_TYPE_IELEMENT,
72 location_ielement_interface_init));
75 gps_status_cb (gboolean enabled,
76 LocationStatus status,
79 LOCATION_LOGD("gps_status_cb");
80 g_return_if_fail(self);
81 LocationGpsPrivate* priv = GET_PRIVATE(self);
82 enable_signaling(self, signals, &(priv->enabled), enabled, status);
86 gps_position_cb (gboolean enabled,
87 LocationPosition *pos,
88 LocationAccuracy *acc,
91 LOCATION_LOGD("gps_position_cb");
92 g_return_if_fail(self);
93 g_return_if_fail(pos);
94 g_return_if_fail(acc);
95 LocationGpsPrivate* priv = GET_PRIVATE(self);
96 enable_signaling(self, signals, &(priv->enabled), enabled, pos->status);
97 position_signaling(self, signals, &(priv->enabled), priv->interval, &(priv->pos), &(priv->acc), priv->boundary_list, &(priv->zone_status), enabled, pos, acc);
101 gps_velocity_cb (gboolean enabled,
102 LocationVelocity *vel,
103 LocationAccuracy *acc,
106 LOCATION_LOGD("gps_velocity_cb");
107 g_return_if_fail(self);
108 LocationGpsPrivate* priv = GET_PRIVATE(self);
109 velocity_signaling(self, signals, &(priv->enabled), priv->interval, &(priv->vel), enabled, vel, acc);
113 location_setting_gps_cb (keynode_t *key,
116 LOCATION_LOGD("location_setting_gps_cb");
117 g_return_if_fail(key);
118 g_return_if_fail(self);
119 LocationGpsPrivate* priv = GET_PRIVATE(self);
120 g_return_if_fail (priv->mod);
121 g_return_if_fail (priv->mod->handler);
122 if (0 == location_setting_get_key_val(key) && priv->mod->ops.stop) {
123 LOCATION_LOGD("location stopped by setting");
124 priv->mod->ops.stop(priv->mod->handler);
126 else if (1 == location_setting_get_key_val(key) && priv->mod->ops.start) {
127 LOCATION_LOGD("location resumed by setting");
128 priv->mod->ops.start (priv->mod->handler, gps_status_cb, gps_position_cb, gps_velocity_cb, self);
133 location_gps_start (LocationGps *self)
135 LOCATION_LOGD("location_gps_start");
136 LocationGpsPrivate* priv = GET_PRIVATE(self);
137 g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
138 g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
139 g_return_val_if_fail (priv->mod->ops.start, LOCATION_ERROR_NOT_AVAILABLE);
140 setting_retval_if_fail (GPS_ENABLED);
141 if (priv->is_started == TRUE) return LOCATION_ERROR_NONE;
143 int ret = priv->mod->ops.start (priv->mod->handler, gps_status_cb, gps_position_cb, gps_velocity_cb, self);
144 if (ret == LOCATION_ERROR_NONE) {
145 priv->is_started = TRUE;
146 location_setting_add_notify (GPS_ENABLED, location_setting_gps_cb, self);
152 location_gps_stop (LocationGps *self)
154 LOCATION_LOGD("location_gps_stop");
155 LocationGpsPrivate* priv = GET_PRIVATE(self);
156 g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
157 g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
158 g_return_val_if_fail (priv->mod->ops.stop, LOCATION_ERROR_NOT_AVAILABLE);
159 if (priv->is_started == FALSE) return LOCATION_ERROR_NONE;
161 int ret = priv->mod->ops.stop (priv->mod->handler);
162 if (ret == LOCATION_ERROR_NONE) {
163 priv->is_started = FALSE;
164 location_setting_ignore_notify (GPS_ENABLED, location_setting_gps_cb);
170 location_gps_dispose (GObject *gobject)
172 LOCATION_LOGD("location_gps_dispose");
173 G_OBJECT_CLASS (location_gps_parent_class)->dispose (gobject);
177 location_gps_finalize (GObject *gobject)
179 LOCATION_LOGD("location_gps_finalize");
180 LocationGpsPrivate* priv = GET_PRIVATE(gobject);
181 module_free(priv->mod, "gps");
183 G_OBJECT_CLASS (location_gps_parent_class)->finalize (gobject);
187 location_gps_set_property (GObject *object,
192 LocationGpsPrivate* priv = GET_PRIVATE(object);
194 g_return_if_fail (priv->mod);
195 g_return_if_fail (priv->mod->handler);
196 LocModGpsOps ops = priv->mod->ops;
199 switch (property_id){
200 case PROP_DEV_NAME: {
201 char* devname = g_value_dup_string(value);
202 LOCATION_LOGD("Set prop>> device_name: %s", devname);
204 ops.set_devname(priv->mod->handler, devname);
208 case PROP_BOUNDARY: {
209 GList *boundary_list = g_list_copy(g_value_get_pointer(value));
210 ret = set_prop_boundary(&priv->boundary_list, boundary_list);
211 if(ret != 0) LOCATION_LOGD("Set boundary. Error[%d]", ret);
214 case PROP_REMOVAL_BOUNDARY: {
215 LocationBoundary *req_boundary = (LocationBoundary*) g_value_dup_boxed(value);
216 ret = set_prop_removal_boundary(&priv->boundary_list, req_boundary);
217 if(ret != 0) LOCATION_LOGD("Removal boundary. Error[%d]", ret);
220 case PROP_UPDATE_INTERVAL: {
221 guint interval = g_value_get_uint(value);
222 LOCATION_LOGD("Set prop>> update-interval: %u", interval);
224 if(interval < LOCATION_UPDATE_INTERVAL_MAX)
225 priv->interval = interval;
227 priv->interval = (guint)LOCATION_UPDATE_INTERVAL_MAX;
230 priv->interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
234 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
240 location_gps_get_property (GObject *object,
245 LocationGpsPrivate *priv = GET_PRIVATE (object);
247 g_return_if_fail (priv->mod);
248 g_return_if_fail (priv->mod->handler);
249 LocModGpsOps ops = priv->mod->ops;
250 switch (property_id) {
251 case PROP_DEV_NAME: {
252 char* devname = NULL;
254 ops.get_devname(priv->mod->handler, &devname);
255 LOCATION_LOGD ("Get prop>> device_name: %s", devname);
256 g_value_set_string (value, devname);
260 case PROP_METHOD_TYPE:
261 g_value_set_int(value, LOCATION_METHOD_GPS);
263 case PROP_LAST_POSITION:
264 g_value_set_boxed (value, priv->pos);
266 case PROP_UPDATE_INTERVAL:
267 g_value_set_uint(value, priv->interval);
270 g_value_set_pointer(value, g_list_first(priv->boundary_list));
273 char *nmea_data = NULL;
274 if (ops.get_nmea && LOCATION_ERROR_NONE == ops.get_nmea(priv->mod->handler, &nmea_data) && nmea_data) {
275 LOCATION_LOGD("Get prop>> Lastest nmea: \n%s", nmea_data);
276 g_value_set_string(value, nmea_data);
279 LOCATION_LOGW("Get prop>> Lastest nmea: failed");
280 g_value_set_string(value, NULL);
284 case PROP_SATELLITE: {
285 LocationSatellite *satellite = NULL;
286 if (ops.get_satellite && priv->mod->handler && LOCATION_ERROR_NONE == ops.get_satellite(priv->mod->handler, &satellite) && satellite){
287 LOCATION_LOGD("Get prop>> Last sat: num_used(%d) num_view(%d)", satellite->num_of_sat_used, satellite->num_of_sat_inview);
288 g_value_set_boxed (value, satellite);
289 location_satellite_free(satellite);
291 LOCATION_LOGW("Get prop>> Last sat: failed");
292 g_value_set_boxed (value, NULL);
297 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
303 location_gps_get_position (LocationGps *self,
304 LocationPosition **position,
305 LocationAccuracy **accuracy)
307 LOCATION_LOGD("location_gps_get_position");
309 LocationGpsPrivate *priv = GET_PRIVATE (self);
310 g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
311 setting_retval_if_fail(GPS_ENABLED);
313 LocModGpsOps ops = priv->mod->ops;
314 g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
315 g_return_val_if_fail (ops.get_position, LOCATION_ERROR_NOT_AVAILABLE);
316 return ops.get_position(priv->mod->handler, position, accuracy);
320 location_gps_get_velocity (LocationGps *self,
321 LocationVelocity **velocity,
322 LocationAccuracy **accuracy)
324 LOCATION_LOGD("location_gps_get_velocity");
326 LocationGpsPrivate *priv = GET_PRIVATE (self);
327 g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
328 setting_retval_if_fail(GPS_ENABLED);
330 LocModGpsOps ops = priv->mod->ops;
331 g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
332 g_return_val_if_fail (ops.get_velocity, LOCATION_ERROR_NOT_AVAILABLE);
333 return ops.get_velocity(priv->mod->handler, velocity, accuracy);
337 location_ielement_interface_init (LocationIElementInterface *iface)
339 iface->start = (TYPE_START_FUNC)location_gps_start;
340 iface->stop = (TYPE_STOP_FUNC)location_gps_stop;
341 iface->get_position = (TYPE_GET_POSITION)location_gps_get_position;
342 iface->get_velocity = (TYPE_GET_VELOCITY)location_gps_get_velocity;
346 location_gps_init (LocationGps *self)
348 LOCATION_LOGD("location_gps_init");
349 LocationGpsPrivate* priv = GET_PRIVATE(self);
351 priv->mod = (LocationGpsMod*)module_new("gps");
352 if(!priv->mod) LOCATION_LOGW("module loading failed");
354 priv->is_started = FALSE;
355 priv->enabled= FALSE;
356 priv->interval = LOCATION_UPDATE_INTERVAL_DEFAULT;
361 priv->zone_status = ZONE_STATUS_NONE;
362 priv->boundary_list = NULL;
366 location_gps_class_init (LocationGpsClass *klass)
368 LOCATION_LOGD("location_gps_class_init");
369 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
371 gobject_class->set_property = location_gps_set_property;
372 gobject_class->get_property = location_gps_get_property;
374 gobject_class->dispose = location_gps_dispose;
375 gobject_class->finalize = location_gps_finalize;
377 g_type_class_add_private (klass, sizeof (LocationGpsPrivate));
379 signals[SERVICE_ENABLED] = g_signal_new ("service-enabled",
380 G_TYPE_FROM_CLASS (klass),
383 G_STRUCT_OFFSET (LocationGpsClass, enabled),
389 signals[SERVICE_DISABLED] = g_signal_new ("service-disabled",
390 G_TYPE_FROM_CLASS (klass),
393 G_STRUCT_OFFSET (LocationGpsClass, disabled),
399 signals[SERVICE_UPDATED] = g_signal_new ("service-updated",
400 G_TYPE_FROM_CLASS (klass),
403 G_STRUCT_OFFSET (LocationGpsClass, updated),
405 location_VOID__UINT_POINTER_POINTER,
411 signals[ZONE_IN] = g_signal_new ("zone-in",
412 G_TYPE_FROM_CLASS (klass),
415 G_STRUCT_OFFSET (LocationGpsClass, zone_in),
417 location_VOID__UINT_POINTER_POINTER,
423 signals[ZONE_OUT] = g_signal_new ("zone-out",
424 G_TYPE_FROM_CLASS (klass),
427 G_STRUCT_OFFSET (LocationGpsClass, zone_out),
429 location_VOID__UINT_POINTER_POINTER,
435 properties[PROP_DEV_NAME] = g_param_spec_string ("dev-name",
436 "gps device name prop",
441 properties[PROP_METHOD_TYPE] = g_param_spec_int ("method",
443 "location method type name",
449 properties[PROP_LAST_POSITION] = g_param_spec_boxed ("last-position",
450 "gps last position prop",
451 "gps last position data",
452 LOCATION_TYPE_POSITION,
455 properties[PROP_UPDATE_INTERVAL] = g_param_spec_uint ("update-interval",
456 "gps update interval prop",
457 "gps update interval data",
458 LOCATION_UPDATE_INTERVAL_MIN,
459 LOCATION_UPDATE_INTERVAL_MAX,
460 LOCATION_UPDATE_INTERVAL_DEFAULT,
463 properties[PROP_BOUNDARY] = g_param_spec_pointer ("boundary",
468 properties[PROP_REMOVAL_BOUNDARY] = g_param_spec_boxed("removal-boundary",
469 "gps removal boundary prop",
470 "gps removal boundary data",
471 LOCATION_TYPE_BOUNDARY,
475 properties[PROP_NMEA] = g_param_spec_string ("nmea",
476 "gps NMEA name prop",
481 properties[PROP_SATELLITE] = g_param_spec_boxed ("satellite",
482 "gps satellite prop",
483 "gps satellite data",
484 LOCATION_TYPE_SATELLITE,
487 g_object_class_install_properties (gobject_class,