Skip to content

Commit

Permalink
Fix USB cable connection related issues in display blanking policy
Browse files Browse the repository at this point in the history
There is logic in mce to process charging state separately from usb
cable connect state, but since the legacy logic for detecting does
not work charging status has been used for things that should depend
on cable connect. This delays things like turning on display to show
usb mode selection dialog and makes it hard to decide how long the
display should be kept on. And turning on display when mce starts
up while usb cable is already attached can cause problems during 1st
boot if the display state restoration occurs close to starting up of
the startup wizard.

Use usb mode provided by usb_moded to determine usb cable state. The
usb_moded tracking logic is derived from the implentation used in dsme.
Both mce and dsme use LGPL v2.1 license.

Use separate display on rules for charging and cable connect changes.

Do not turn on the display when cable is removed / charging stops.

Do not turn on the display if usb cable is already connected when
mce is started.

Fix glitches in display state handling and automatic brightness
tuning during mce startup.

[mce] Fix USB cable connection related issues in display blanking policy. Fixes JB#25788
  • Loading branch information
spiiroin committed Jan 23, 2015
1 parent 27dc905 commit 4da9aaa
Show file tree
Hide file tree
Showing 16 changed files with 752 additions and 223 deletions.
16 changes: 16 additions & 0 deletions .depend
Expand Up @@ -762,6 +762,22 @@ modules/sensor-gestures.pic.o:\
mce-sensorfw.h\
mce.h\

modules/usbmode.o:\
modules/usbmode.c\
builtin-gconf.h\
datapipe.h\
mce-dbus.h\
mce-log.h\
mce.h\

modules/usbmode.pic.o:\
modules/usbmode.c\
builtin-gconf.h\
datapipe.h\
mce-dbus.h\
mce-log.h\
mce.h\

powerkey.o:\
powerkey.c\
builtin-gconf.h\
Expand Down
4 changes: 3 additions & 1 deletion Makefile
Expand Up @@ -153,6 +153,7 @@ MODULES += $(MODULE_DIR)/battery-bme.so
MODULES += $(MODULE_DIR)/battery-upower.so
MODULES += $(MODULE_DIR)/bluetooth.so
MODULES += $(MODULE_DIR)/display.so
MODULES += $(MODULE_DIR)/usbmode.so
MODULES += $(MODULE_DIR)/doubletap.so
MODULES += $(MODULE_DIR)/sensor-gestures.so
MODULES += $(MODULE_DIR)/led.so
Expand Down Expand Up @@ -567,6 +568,7 @@ NORMALIZE_USES_SPC =\
modules/powersavemode.h\
modules/radiostates.h\
modules/sensor-gestures.c\
modules/usbmode.c\
ofono-dbus-names.h\
powerkey.c\
powerkey.h\
Expand Down Expand Up @@ -646,7 +648,7 @@ endif
%.p : %.q ; cproto -s < $< | sed -e 's/_Bool/bool/g'

clean::
$(RM) -f *.q *.p
$(RM) -f *.[qp] modules/*.[qp]

# ----------------------------------------------------------------------------
# LOCAL RPMBUILD (copy mce.* from OBS to rpm subdir)
Expand Down
63 changes: 56 additions & 7 deletions datapipe.c
Expand Up @@ -160,6 +160,9 @@ datapipe_struct compositor_available_pipe;
/** lipstick availability; read only */
datapipe_struct lipstick_available_pipe;

/** usbmoded availability; read only */
datapipe_struct usbmoded_available_pipe;

/** dsme availability; read only */
datapipe_struct dsme_available_pipe;

Expand Down Expand Up @@ -844,7 +847,7 @@ void mce_datapipe_init(void)
setup_datapipe(&tk_lock_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(LOCK_UNDEF));
setup_datapipe(&charger_state_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(0));
0, GINT_TO_POINTER(CHARGER_STATE_UNDEF));
setup_datapipe(&battery_status_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(BATTERY_STATUS_UNDEF));
setup_datapipe(&battery_level_pipe, READ_ONLY, DONT_FREE_CACHE,
Expand All @@ -856,7 +859,7 @@ void mce_datapipe_init(void)
setup_datapipe(&audio_route_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(AUDIO_ROUTE_UNDEF));
setup_datapipe(&usb_cable_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(0));
0, GINT_TO_POINTER(USB_CABLE_UNDEF));
setup_datapipe(&jack_sense_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(0));
setup_datapipe(&power_saving_mode_pipe, READ_ONLY, DONT_FREE_CACHE,
Expand All @@ -865,10 +868,14 @@ void mce_datapipe_init(void)
0, GINT_TO_POINTER(THERMAL_STATE_UNDEF));
setup_datapipe(&heartbeat_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(0));

setup_datapipe(&compositor_available_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(FALSE));
0, GINT_TO_POINTER(SERVICE_STATE_UNDEF));
setup_datapipe(&lipstick_available_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(FALSE));
0, GINT_TO_POINTER(SERVICE_STATE_UNDEF));
setup_datapipe(&usbmoded_available_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(SERVICE_STATE_UNDEF));

setup_datapipe(&dsme_available_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(FALSE));
setup_datapipe(&packagekit_locked_pipe, READ_ONLY, DONT_FREE_CACHE,
Expand Down Expand Up @@ -938,6 +945,7 @@ void mce_datapipe_quit(void)
free_datapipe(&heartbeat_pipe);
free_datapipe(&compositor_available_pipe);
free_datapipe(&lipstick_available_pipe);
free_datapipe(&usbmoded_available_pipe);
free_datapipe(&dsme_available_pipe);
free_datapipe(&packagekit_locked_pipe);
free_datapipe(&update_mode_pipe);
Expand Down Expand Up @@ -970,6 +978,47 @@ const char *device_lock_state_repr(device_lock_state_t state)
return res;
}

/** Convert service_state_t enum to human readable string
*
* @param state service_state_t enumeration value
*
* @return human readable representation of state
*/
const char *service_state_repr(service_state_t state)
{
const char *res = "unknown";

switch( state ) {
case SERVICE_STATE_UNDEF: res = "undefined"; break;
case SERVICE_STATE_STOPPED: res = "stopped"; break;
case SERVICE_STATE_RUNNING: res = "running"; break;
default: break;
}

return res;
}

/** Convert usb_cable_state_t enum to human readable string
*
* @param state usb_cable_state_t enumeration value
*
* @return human readable representation of state
*/
const char *usb_cable_state_repr(usb_cable_state_t state)
{
const char *res = "unknown";

switch( state ) {
case USB_CABLE_UNDEF: res = "undefined"; break;
case USB_CABLE_DISCONNECTED: res = "disconnected"; break;
case USB_CABLE_CONNECTED: res = "connected"; break;
case USB_CABLE_ASK_USER: res = "ask_user"; break;
default: break;
}

return res;
}

void datapipe_handlers_install(datapipe_handler_t *bindings)
{
if( !bindings )
Expand Down Expand Up @@ -1045,7 +1094,7 @@ static gboolean datapipe_handlers_execute_cb(gpointer aptr)

self->execute_id = 0;

mce_log(LL_CRIT, "module=%s", self->module ?: "unknown");
mce_log(LL_INFO, "module=%s", self->module ?: "unknown");
datapipe_handlers_execute(self->handlers);

EXIT:
Expand All @@ -1056,7 +1105,7 @@ static gboolean datapipe_handlers_execute_cb(gpointer aptr)
*/
void datapipe_bindings_init(datapipe_bindings_t *self)
{
mce_log(LL_CRIT, "module=%s", self->module ?: "unknown");
mce_log(LL_INFO, "module=%s", self->module ?: "unknown");

/* Set up datapipe callbacks */
datapipe_handlers_install(self->handlers);
Expand All @@ -1071,7 +1120,7 @@ void datapipe_bindings_init(datapipe_bindings_t *self)
*/
void datapipe_bindings_quit(datapipe_bindings_t *self)
{
mce_log(LL_CRIT, "module=%s", self->module ?: "unknown");
mce_log(LL_INFO, "module=%s", self->module ?: "unknown");

/* Remove the get initial values timer if still active */
if( self->execute_id ) {
Expand Down
1 change: 1 addition & 0 deletions datapipe.h
Expand Up @@ -133,6 +133,7 @@ extern datapipe_struct thermal_state_pipe;
extern datapipe_struct heartbeat_pipe;
extern datapipe_struct compositor_available_pipe;
extern datapipe_struct lipstick_available_pipe;
extern datapipe_struct usbmoded_available_pipe;
extern datapipe_struct dsme_available_pipe;
extern datapipe_struct packagekit_locked_pipe;
extern datapipe_struct update_mode_pipe;
Expand Down
2 changes: 1 addition & 1 deletion inifiles/mce.ini
Expand Up @@ -16,7 +16,7 @@ ModulePath=/usr/lib/mce/modules
# to avoid unnecessary brightness fluctuations on mce startup
#
# Note: the name should not include the "lib"-prefix
Modules=radiostates;filter-brightness-als;display;keypad;led;battery-upower;inactivity;alarm;callstate;audiorouting;proximity;powersavemode;cpu-keepalive;doubletap;packagekit;sensor-gestures;bluetooth;memnotify;
Modules=radiostates;filter-brightness-als;display;keypad;led;battery-upower;inactivity;alarm;callstate;audiorouting;proximity;powersavemode;cpu-keepalive;doubletap;packagekit;sensor-gestures;bluetooth;memnotify;usbmode

[SoftPowerOff]

Expand Down
90 changes: 38 additions & 52 deletions mce-dbus.c
Expand Up @@ -3185,55 +3185,30 @@ static const char mce_dbus_nameowner_rule_fmt[] =
",arg0='%s'"
;

/** D-Bus connection */
static DBusConnection *mce_dbus_nameowner_bus = 0;

static void mdy_stm_compositor_name_owner_changed(const char *name,
const char *prev,
const char *curr)
{
(void)name, (void)prev;

/* broadcast within mce */
bool available = (curr && *curr);
execute_datapipe(&compositor_available_pipe,
GINT_TO_POINTER(available),
USE_INDATA, CACHE_INDATA);
}

/** react to systemui availability changes
*/
static void mdy_stm_lipstick_name_owner_changed(const char *name,
const char *prev,
const char *curr)
{
(void)name, (void)prev;

/* broadcast within mce */
bool available = (curr && *curr);
execute_datapipe(&lipstick_available_pipe,
GINT_TO_POINTER(available),
USE_INDATA, CACHE_INDATA);
}

/** Lookup table of D-Bus names to watch */
static struct
{
const char *name;
char *rule;
void (*notify)(const char *name, const char *prev, const char *curr);
char *owner;
const char *name;
char *rule;
void (*notify)(const char *name, const char *prev, const char *curr);
datapipe_struct *datapipe;
char *owner;

} mce_dbus_nameowner_lut[] =
{
{
.name = COMPOSITOR_SERVICE,
.notify = mdy_stm_compositor_name_owner_changed,
.name = COMPOSITOR_SERVICE,
.datapipe = &compositor_available_pipe,
},
{
/* Note: due to lipstick==compositor assumption lipstick
* service name must be probed after compositor */
.name = LIPSTICK_SERVICE,
.notify = mdy_stm_lipstick_name_owner_changed,
.name = LIPSTICK_SERVICE,
.datapipe = &lipstick_available_pipe,
},
{
.name = USB_MODED_DBUS_SERVICE,
.datapipe = &usbmoded_available_pipe,
},
{
.name = 0,
Expand All @@ -3253,15 +3228,29 @@ mce_dbus_nameowner_changed(const char *name, const char *prev, const char *curr)
if( strcmp(mce_dbus_nameowner_lut[i].name, name) )
continue;

mce_log(LL_DEVEL, "%s: owner: '%s' -> '%s'", name, prev, curr);

// change cached name owner
free(mce_dbus_nameowner_lut[i].owner);
if( curr && *curr )
mce_dbus_nameowner_lut[i].owner = strdup(curr);
else
mce_dbus_nameowner_lut[i].owner = 0;

// notify
mce_dbus_nameowner_lut[i].notify(name, prev, curr);
// handle notification callback before datapipe
if( mce_dbus_nameowner_lut[i].notify )
mce_dbus_nameowner_lut[i].notify(name, prev, curr);

// update datapipe if defined
if( !mce_dbus_nameowner_lut[i].datapipe )
continue;

service_state_t state =
(curr && *curr) ? SERVICE_STATE_RUNNING : SERVICE_STATE_STOPPED;

execute_datapipe(mce_dbus_nameowner_lut[i].datapipe,
GINT_TO_POINTER(state),
USE_INDATA, CACHE_INDATA);
}
}

Expand Down Expand Up @@ -3339,7 +3328,7 @@ mce_dbus_nameowner_query_req(const char *name)
DBUS_TYPE_STRING, &name,
DBUS_TYPE_INVALID);

if( !dbus_connection_send_with_reply(mce_dbus_nameowner_bus, req, &pc, -1) )
if( !dbus_connection_send_with_reply(dbus_connection, req, &pc, -1) )
goto EXIT;

if( !pc )
Expand Down Expand Up @@ -3414,7 +3403,7 @@ static char *
mce_dbus_nameowner_watch(const char *name)
{
char *rule = g_strdup_printf(mce_dbus_nameowner_rule_fmt, name);
dbus_bus_add_match(mce_dbus_nameowner_bus, rule, 0);
dbus_bus_add_match(dbus_connection, rule, 0);
return rule;
}

Expand All @@ -3425,7 +3414,7 @@ mce_dbus_nameowner_watch(const char *name)
static void mce_dbus_nameowner_unwatch(char *rule)
{
if( rule ) {
dbus_bus_remove_match(mce_dbus_nameowner_bus, rule, 0);
dbus_bus_remove_match(dbus_connection, rule, 0);
g_free(rule);
}
}
Expand All @@ -3435,18 +3424,17 @@ static void mce_dbus_nameowner_unwatch(char *rule)
static void
mce_dbus_nameowner_init(void)
{
/* Get D-Bus system bus connection */
if( !(mce_dbus_nameowner_bus = dbus_connection_get()) ) {
if( !dbus_connection )
goto EXIT;
}

dbus_connection_add_filter(mce_dbus_nameowner_bus,
dbus_connection_add_filter(dbus_connection,
mce_dbus_nameowner_filter_cb, 0, 0);

for( int i = 0; mce_dbus_nameowner_lut[i].name; ++i ) {
mce_dbus_nameowner_lut[i].rule = mce_dbus_nameowner_watch(mce_dbus_nameowner_lut[i].name);
mce_dbus_nameowner_query_req(mce_dbus_nameowner_lut[i].name);
}

EXIT:
return;
}
Expand All @@ -3457,11 +3445,11 @@ mce_dbus_nameowner_init(void)
static void
mce_dbus_nameowner_quit(void)
{
if( !mce_dbus_nameowner_bus )
if( !dbus_connection )
goto EXIT;

/* remove filter callback */
dbus_connection_remove_filter(mce_dbus_nameowner_bus,
dbus_connection_remove_filter(dbus_connection,
mce_dbus_nameowner_filter_cb, 0);

/* remove name owner matches */
Expand All @@ -3476,8 +3464,6 @@ mce_dbus_nameowner_quit(void)
// TODO: we should keep track of async name owner calls
// and cancel them at this point

dbus_connection_unref(mce_dbus_nameowner_bus), mce_dbus_nameowner_bus = 0;

EXIT:
return;

Expand Down
19 changes: 19 additions & 0 deletions mce-dbus.h
Expand Up @@ -46,6 +46,25 @@
#define LIPSTICK_PATH "/"
#define LIPSTICK_IFACE "org.nemomobile.lipstick"

/* ========================================================================= *
* USB_MODED DBUS SERVICE
* ========================================================================= */

/** Well known service name for usb_moded */
#define USB_MODED_DBUS_SERVICE "com.meego.usb_moded"

/** D-Bus interface name for usb_moded */
#define USB_MODED_DBUS_INTERFACE "com.meego.usb_moded"

/** D-Bus object name for usb_moded */
#define USB_MODED_DBUS_OBJECT "/com/meego/usb_moded"

/** Query current usb mode method call */
#define USB_MODED_QUERY_MODE_REQ "mode_request"

/** Current usb mode changed signal */
#define USB_MODED_MODE_CHANGED_SIG "sig_usb_state_ind"

DBusConnection *dbus_connection_get(void);

DBusMessage *dbus_new_signal(const gchar *const path,
Expand Down

0 comments on commit 4da9aaa

Please sign in to comment.