Merge lp:~alfonsosanchezbeato/ubuntu/utopic/powerd/modem-power-mode into lp:powerd

Proposed by Alfonso Sanchez-Beato
Status: Merged
Approved by: Ricardo Salveti
Approved revision: 135
Merged at revision: 135
Proposed branch: lp:~alfonsosanchezbeato/ubuntu/utopic/powerd/modem-power-mode
Merge into: lp:powerd
Diff against target: 351 lines (+159/-27)
4 files modified
debian/changelog (+6/-0)
src/powerd-internal.h (+4/-0)
src/powerd-object.c (+31/-4)
src/powerd.cpp (+118/-23)
To merge this branch: bzr merge lp:~alfonsosanchezbeato/ubuntu/utopic/powerd/modem-power-mode
Reviewer Review Type Date Requested Status
Ricardo Salveti (community) Approve
Review via email: mp+225364@code.launchpad.net

Commit message

Set modem low power mode when display state is off

Description of the change

Set modem low power mode when display state is off

To post a comment you must log in.
Revision history for this message
Ricardo Salveti (rsalveti) wrote :

Looks good, thanks.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'debian/changelog'
2--- debian/changelog 2014-06-29 06:18:12 +0000
3+++ debian/changelog 2014-07-02 16:44:08 +0000
4@@ -1,3 +1,9 @@
5+powerd (0.16+14.10.20140702-0ubuntu1) UNRELEASED; urgency=medium
6+
7+ * Set modem low power mode when display state is off
8+
9+ -- Alfonso Sanchez-Beato (email Canonical) <alfonso.sanchez-beato@canonical.com> Wed, 02 Jul 2014 17:19:54 +0100
10+
11 powerd (0.16+14.10.20140620-0ubuntu2) utopic; urgency=medium
12
13 * Should still parse config-default if the device specific one is not
14
15=== modified file 'src/powerd-internal.h'
16--- src/powerd-internal.h 2014-06-18 18:06:10 +0000
17+++ src/powerd-internal.h 2014-07-02 16:44:08 +0000
18@@ -141,6 +141,8 @@
19 gchar *signal_name, GVariant *parameters, gpointer user_data);
20 void on_ofono_ussd_signal(GDBusProxy *proxy, gchar *sender_name,
21 gchar *signal_name, GVariant *parameters, gpointer user_data);
22+void on_unity_signal(GDBusProxy *proxy, gchar *sender_name,
23+ gchar *signal_name, GVariant *parameters, gpointer user_data);
24
25 /* dbus proxy async setup */
26 void ofono_manager_proxy_connect_cb(GObject *source_object, GAsyncResult *res,
27@@ -149,6 +151,8 @@
28 gpointer user_data);
29 void ofono_proxy_connect_cb(GObject *source_object, GAsyncResult *res,
30 gpointer user_data);
31+void unity_proxy_connect_cb(GObject *source_object, GAsyncResult *res,
32+ gpointer user_data);
33
34 /* Sensor functions */
35 void powerd_sensors_proximity_enable(void);
36
37=== modified file 'src/powerd-object.c'
38--- src/powerd-object.c 2014-05-21 03:17:03 +0000
39+++ src/powerd-object.c 2014-07-02 16:44:08 +0000
40@@ -230,6 +230,7 @@
41 {
42 GError *error = NULL;
43 GDBusProxy *ofono_proxy;
44+ GDBusProxy **proxy = user_data;
45
46 ofono_proxy = g_dbus_proxy_new_finish(res, &error);
47 if (error) {
48@@ -246,6 +247,8 @@
49 g_dbus_proxy_call(ofono_proxy, "GetModems", NULL,
50 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
51 ofono_get_modems_cb, NULL);
52+
53+ *proxy = ofono_proxy;
54 }
55
56 void
57@@ -285,6 +288,7 @@
58 GError *error = NULL;
59 GDBusProxy *ofono_proxy = NULL;
60 const char *interface_name = "";
61+ GDBusProxy **proxy = user_data;
62
63 ofono_proxy = g_dbus_proxy_new_finish (res, &error);
64 if (error) {
65@@ -306,11 +310,34 @@
66 g_signal_connect(ofono_proxy, "g-signal",
67 G_CALLBACK (on_ofono_ussd_signal), NULL);
68 }
69- else {
70- powerd_warn("unknown interface name for this proxy, ignoring");
71- }
72 powerd_debug("ofono_proxy_connect_cb succeeded");
73- }
74+
75+ *proxy = ofono_proxy;
76+ }
77+
78+}
79+
80+void unity_proxy_connect_cb(GObject *source_object, GAsyncResult *res,
81+ gpointer user_data)
82+{
83+ GError *error = NULL;
84+ GDBusProxy *unity_proxy;
85+ GDBusProxy **proxy = user_data;
86+
87+ powerd_debug("unity_proxy_connect_cb");
88+
89+ unity_proxy = g_dbus_proxy_new_finish(res, &error);
90+ if (error) {
91+ powerd_warn("%s failed: %s", __func__, error->message);
92+ g_error_free(error);
93+ return;
94+ }
95+
96+ /* Register for display power changes */
97+ g_signal_connect(unity_proxy, "g-signal",
98+ G_CALLBACK(on_unity_signal), NULL);
99+
100+ *proxy = unity_proxy;
101 }
102
103 void
104
105=== modified file 'src/powerd.cpp'
106--- src/powerd.cpp 2014-06-18 18:06:10 +0000
107+++ src/powerd.cpp 2014-07-02 16:44:08 +0000
108@@ -58,6 +58,37 @@
109
110 static int g_exit_code = 0;
111
112+/* Used to track modem interfaces */
113+struct modem_data {
114+ char *obj_name;
115+ GDBusProxy *message_proxy;
116+ GDBusProxy *voice_proxy;
117+ GDBusProxy *ussd_proxy;
118+ GDBusProxy *radiosettings_proxy;
119+};
120+
121+static void free_modem_data(void *data)
122+{
123+ struct modem_data *modem = (struct modem_data *) data;
124+ g_free(modem->obj_name);
125+ if (modem->message_proxy)
126+ g_object_unref(modem->message_proxy);
127+ if (modem->voice_proxy)
128+ g_object_unref(modem->voice_proxy);
129+ if (modem->ussd_proxy)
130+ g_object_unref(modem->ussd_proxy);
131+ if (modem->radiosettings_proxy)
132+ g_object_unref(modem->radiosettings_proxy);
133+}
134+
135+static gint modem_data_cmp(gconstpointer a, gconstpointer b)
136+{
137+ const struct modem_data *modem = (const struct modem_data *) a;
138+ const char *modem_name = (const char *) b;
139+
140+ return strcmp(modem->obj_name, modem_name);
141+}
142+
143 /* List with detected modems */
144 static GSList *g_modems = NULL;
145
146@@ -77,6 +108,9 @@
147 return strcmp(call->obj_name, call_name);
148 }
149
150+static GDBusProxy *g_ofono_proxy;
151+static GDBusProxy *g_unity_proxy;
152+
153 /* List with existing calls */
154 static GSList *g_calls = NULL;
155
156@@ -110,40 +144,51 @@
157 {
158 }
159
160-static void watch_modem(const char *modem)
161+static void watch_modem(struct modem_data *modem)
162 {
163 /* for incoming SMS signals */
164 g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
165 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
166 NULL,
167 "org.ofono",
168- modem,
169+ modem->obj_name,
170 "org.ofono.MessageManager",
171 NULL,
172 (GAsyncReadyCallback)ofono_proxy_connect_cb,
173- NULL);
174+ &modem->message_proxy);
175
176 /* for incoming calls Added/Removed signals */
177 g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
178 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
179 NULL,
180 "org.ofono",
181- modem,
182+ modem->obj_name,
183 "org.ofono.VoiceCallManager",
184 NULL,
185 (GAsyncReadyCallback)ofono_proxy_connect_cb,
186- NULL);
187+ &modem->voice_proxy);
188
189 /* for USSD notifications/network requests */
190 g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
191 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
192 NULL,
193 "org.ofono",
194- modem,
195+ modem->obj_name,
196 "org.ofono.SupplementaryServices",
197 NULL,
198 (GAsyncReadyCallback)ofono_proxy_connect_cb,
199- NULL);
200+ &modem->ussd_proxy);
201+
202+ /* To set/unset low power mode */
203+ g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
204+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
205+ NULL,
206+ "org.ofono",
207+ modem->obj_name,
208+ "org.ofono.RadioSettings",
209+ NULL,
210+ (GAsyncReadyCallback)ofono_proxy_connect_cb,
211+ &modem->radiosettings_proxy);
212 }
213
214 void
215@@ -169,11 +214,15 @@
216
217 g_variant_get_child(item, 0, "&o", &obj_path);
218
219- if (g_slist_find_custom(g_modems, obj_path, (GCompareFunc) strcmp)
220+ if (g_slist_find_custom(g_modems, obj_path, modem_data_cmp)
221 == NULL) {
222+ struct modem_data *modem;
223+
224 powerd_debug("active ofono modem %s", obj_path);
225- g_modems = g_slist_prepend(g_modems, g_strdup(obj_path));
226- watch_modem(obj_path);
227+ modem = (struct modem_data *) calloc(1, sizeof(*modem));
228+ modem->obj_name = g_strdup(obj_path);
229+ g_modems = g_slist_prepend(g_modems, modem);
230+ watch_modem(modem);
231 }
232
233 g_variant_unref(item);
234@@ -268,19 +317,21 @@
235 {
236 const gchar *object_path;
237 GVariant *tmp;
238- char *modem;
239 GSList *node;
240
241 tmp = g_variant_get_child_value(parameters, 0);
242
243 object_path = g_variant_get_string(tmp, NULL);
244- node = g_slist_find_custom(g_modems, object_path, (GCompareFunc) strcmp);
245+ node = g_slist_find_custom(g_modems, object_path, modem_data_cmp);
246
247 if (strcmp("ModemAdded", signal_name) == 0) {
248 /* Add if not already in list */
249 if (node == NULL) {
250+ struct modem_data *modem;
251+
252 powerd_debug("watching ofono modem %s", object_path);
253- modem = g_strdup(object_path);
254+ modem = (struct modem_data *) calloc(1, sizeof(*modem));
255+ modem->obj_name = g_strdup(object_path);
256 g_modems = g_slist_prepend(g_modems, modem);
257 watch_modem(modem);
258 }
259@@ -288,7 +339,7 @@
260 /* Remove if found in list */
261 if (node != NULL) {
262 powerd_debug("stop watch on ofono modem %s", object_path);
263- g_free(g_modems->data);
264+ free_modem_data(g_modems->data);
265 g_modems = g_slist_delete_link(g_modems, node);
266 }
267 }
268@@ -406,6 +457,35 @@
269 }
270 }
271
272+void on_unity_signal(GDBusProxy *proxy, gchar *sender_name,
273+ gchar *signal_name, GVariant *parameters, gpointer user_data)
274+{
275+ powerd_debug("we get signal from %s: %s", sender_name, signal_name);
276+
277+ /* From com.canonical.Unity.Screen */
278+ if (strcmp(signal_name, "DisplayPowerStateChange") == 0) {
279+ int state, reason;
280+ GSList *it;
281+
282+ g_variant_get(parameters, "(ii)", &state, &reason);
283+ powerd_debug("Received %s: state=%d flags=%d\n",
284+ signal_name, state, reason);
285+
286+ /* Set modem low power mode when reason is not proximity sensor */
287+ if (reason == UNITY_SCREEN_REASON_PROXIMITY)
288+ return;
289+
290+ for (it = g_modems; it; it = it->next) {
291+ struct modem_data *modem = (struct modem_data *) it->data;
292+ GVariant *mode = g_variant_new_boolean(state ? FALSE : TRUE);
293+
294+ g_dbus_proxy_call(modem->radiosettings_proxy, "SetProperty",
295+ g_variant_new("(sv)", "FastDormancy", mode),
296+ G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL);
297+ }
298+ }
299+}
300+
301 /* Must be first to run on main loop */
302 static gboolean main_init(gpointer unused)
303 {
304@@ -464,14 +544,25 @@
305
306 /* Listen to modem creation */
307 g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
308- G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
309- NULL,
310- "org.ofono",
311- "/",
312- "org.ofono.Manager",
313- NULL,
314- (GAsyncReadyCallback) ofono_manager_proxy_connect_cb,
315- NULL);
316+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
317+ NULL,
318+ "org.ofono",
319+ "/",
320+ "org.ofono.Manager",
321+ NULL,
322+ (GAsyncReadyCallback) ofono_manager_proxy_connect_cb,
323+ &g_ofono_proxy);
324+
325+ /* Listen to unity signals */
326+ g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
327+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
328+ NULL,
329+ "com.canonical.Unity.Screen",
330+ "/com/canonical/Unity/Screen",
331+ "com.canonical.Unity.Screen",
332+ NULL,
333+ (GAsyncReadyCallback) unity_proxy_connect_cb,
334+ &g_unity_proxy);
335
336 /* Init this first, data is used by other inits */
337 device_config_init();
338@@ -513,8 +604,12 @@
339 power_request_deinit();
340 powerd_client_deinit();
341 powerd_stats_deinit();
342- g_slist_free_full(g_modems, g_free);
343+ g_slist_free_full(g_modems, free_modem_data);
344 g_slist_free_full(g_calls, free_call_data);
345+ if (g_ofono_proxy)
346+ g_object_unref(g_ofono_proxy);
347+ if (g_unity_proxy)
348+ g_object_unref(g_unity_proxy);
349
350 return g_exit_code;
351 }

Subscribers

People subscribed via source and target branches