Skip to content

Commit

Permalink
Leave touch panel active during in-call proximity blanking
Browse files Browse the repository at this point in the history
If touch panel is powered off, the touch detection does not work
reliably if there is finger/ear/chin on screen when the panel is
powered on again. Since that can break the touch blocking during
display power up in a situation where capacitive touch from chin
or ear is likely, the touch panel is not powered off during proximity
blanking even if the double tap detection is disabled.

[mce] Leave touch panel active during in-call proximity blanking
  • Loading branch information
spiiroin committed Mar 11, 2014
1 parent d2379c1 commit 9b42491
Show file tree
Hide file tree
Showing 5 changed files with 125 additions and 17 deletions.
3 changes: 3 additions & 0 deletions mce.c
Expand Up @@ -1015,6 +1015,8 @@ int main(int argc, char **argv)
0, GINT_TO_POINTER(FALSE));
setup_datapipe(&music_playback_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(FALSE));
setup_datapipe(&proximity_blank_pipe, READ_ONLY, DONT_FREE_CACHE,
0, GINT_TO_POINTER(FALSE));
/* Initialise mode management
* pre-requisite: mce_gconf_init()
* pre-requisite: mce_dbus_init()
Expand Down Expand Up @@ -1148,6 +1150,7 @@ int main(int argc, char **argv)
free_datapipe(&keypad_grab_active_pipe);
free_datapipe(&keypad_grab_wanted_pipe);
free_datapipe(&music_playback_pipe);
free_datapipe(&proximity_blank_pipe);

/* Call the exit function for all subsystems */
mce_gconf_exit();
Expand Down
3 changes: 3 additions & 0 deletions mce.h
Expand Up @@ -374,6 +374,9 @@ datapipe_struct keypad_grab_active_pipe;
/** music playback active; read only */
datapipe_struct music_playback_pipe;

/** proximity blanking; read only */
datapipe_struct proximity_blank_pipe;

/* XXX: use HAL */
/** Does the device have a flicker key? */
extern gboolean has_flicker_key;
Expand Down
90 changes: 77 additions & 13 deletions modules/doubletap.c
Expand Up @@ -25,6 +25,9 @@ static guint dbltap_mode_gconf_id = 0;
/** Latest reported proximity sensor state */
static cover_state_t dbltap_ps_state = COVER_UNDEF;

/** Latest reported proximity blanking */
static bool dbltap_ps_blank = false;

/** Path to doubletap wakeup control file */
static char *dbltap_ctrl_path = 0;

Expand All @@ -34,24 +37,58 @@ static char *dbltap_enable_val = 0;
/** String to write when disabling double tap wakeups */
static char *dbltap_disable_val = 0;

/** String to write when disabling double tap wakeups,
* without powering off the touch detection [optional]
*/
static char *dbltap_nosleep_val = 0;

typedef enum {
DT_UNDEF = -1,
DT_DISABLED,
DT_ENABLED,
DT_DISABLED_NOSLEEP,
} dt_state_t;

static const char * const dt_state_name[] =
{
"disabled",
"enabled",
"disabled-no-sleep",
};

/** Enable/disable doubletap wakeups
*
* @param enable true to enable wakeups, false to disable
* @param state disable/enable/disable-without-powering-off
*/
static void dbltap_enable(bool enable)
static void dbltap_set_state(dt_state_t state)
{
static int was_enabled = -1;
static dt_state_t prev_state = DT_UNDEF;

if( was_enabled == enable )
if( prev_state == state )
goto EXIT;

was_enabled = enable;
prev_state = state;

mce_log(LL_DEBUG, "double tap wakeups: %s", dt_state_name[state]);

mce_log(LL_DEBUG, "%s double tap wakeups",
enable ? "enable" : "disable");
const char *val = 0;

const char *val = enable ? dbltap_enable_val : dbltap_disable_val;
mce_write_string_to_file(dbltap_ctrl_path, val);
switch( state ) {
case DT_DISABLED:
val = dbltap_disable_val;
break;
case DT_ENABLED:
val = dbltap_enable_val;
break;
case DT_DISABLED_NOSLEEP:
val = dbltap_nosleep_val ?: dbltap_disable_val;
break;
default:
break;
}

if( val )
mce_write_string_to_file(dbltap_ctrl_path, val);
EXIT:
return;
}
Expand All @@ -60,12 +97,12 @@ static void dbltap_enable(bool enable)
*/
static void dbltap_rethink(void)
{
bool enable = false;
dt_state_t state = DT_DISABLED;

switch( dbltap_mode ) {
default:
case DBLTAP_ENABLE_ALWAYS:
enable = true;
state = DT_ENABLED;
break;

case DBLTAP_ENABLE_NEVER:
Expand All @@ -74,17 +111,19 @@ static void dbltap_rethink(void)
case DBLTAP_ENABLE_NO_PROXIMITY:
switch( dbltap_ps_state ) {
case COVER_CLOSED:
if( dbltap_ps_blank )
state = DT_DISABLED_NOSLEEP;
break;

default:
case COVER_OPEN:
case COVER_UNDEF:
enable = true;
state = DT_ENABLED;
break;
}
break;
}
dbltap_enable(enable);
dbltap_set_state(state);
}

/** Set doubletap wakeup policy
Expand Down Expand Up @@ -113,6 +152,20 @@ static void dbltap_proximity_trigger(gconstpointer data)
}
}

/** Proximity blank changed callback
*
* @param data proximity blank as void pointer
*/
static void dbltap_proximity_blank_trigger(gconstpointer data)
{
cover_state_t state = GPOINTER_TO_INT(data);

if( dbltap_ps_blank != state ) {
dbltap_ps_blank = state;
dbltap_rethink();
}
}

/** GConf callback for doubletap mode setting
*
* @param gcc (not used)
Expand Down Expand Up @@ -164,6 +217,10 @@ const gchar *g_module_check_init(GModule *module)
MCE_CONF_DOUBLETAP_DISABLE_VALUE,
"0");

dbltap_nosleep_val = mce_conf_get_string(MCE_CONF_DOUBLETAP_GROUP,
MCE_CONF_DOUBLETAP_DISABLE_NO_SLEEP_VALUE,
"2");

if( !dbltap_ctrl_path || !dbltap_enable_val || !dbltap_disable_val ) {
mce_log(LL_NOTICE, "no double tap wakeup controls defined");
goto EXIT;
Expand All @@ -185,6 +242,10 @@ const gchar *g_module_check_init(GModule *module)
append_output_trigger_to_datapipe(&proximity_sensor_pipe,
dbltap_proximity_trigger);

dbltap_ps_blank = datapipe_get_gint(proximity_blank_pipe);
append_output_trigger_to_datapipe(&proximity_blank_pipe,
dbltap_proximity_blank_trigger);

/* enable/disable double tap wakeups based on initial conditions */
dbltap_rethink();
EXIT:
Expand All @@ -203,11 +264,14 @@ void g_module_unload(GModule *module)
/* Remove triggers/filters from datapipes */
remove_output_trigger_from_datapipe(&proximity_sensor_pipe,
dbltap_proximity_trigger);
remove_output_trigger_from_datapipe(&proximity_blank_pipe,
dbltap_proximity_blank_trigger);

/* Free config strings */
g_free(dbltap_ctrl_path);
g_free(dbltap_enable_val);
g_free(dbltap_disable_val);
g_free(dbltap_nosleep_val);

return;
}
5 changes: 4 additions & 1 deletion modules/doubletap.h
Expand Up @@ -22,9 +22,12 @@ extern "C" {
/** Name of the configuration key for doubletap enable value */
# define MCE_CONF_DOUBLETAP_ENABLE_VALUE "EnableValue"

/** Name of the configuration key for doubletap disable value */
/** Name of the configuration key for doubletap disable, touch powered off value */
# define MCE_CONF_DOUBLETAP_DISABLE_VALUE "DisableValue"

/** Name of the configuration key for doubletap disable, touch powered on value */
# define MCE_CONF_DOUBLETAP_DISABLE_NO_SLEEP_VALUE "DisableNoSleepValue"

/** Path to the GConf settings for the doubletap module */
# define MCE_GCONF_DOUBLETAP_PATH "/system/osso/dsm/doubletap"
/** Path to the doubletap mode GConf setting */
Expand Down
41 changes: 38 additions & 3 deletions tklock.c
Expand Up @@ -1760,6 +1760,23 @@ static void tklock_uiexcept_rethink(void)
bool blank = false;
uiexctype_t active = topmost_active(exdata.mask);

bool proximity_blank = false;

/* Make sure "proximityblanking" state gets cleared if display
* changes to non-off state. */
if( display_prev != display_state ) {
switch( display_state ) {
case MCE_DISPLAY_OFF:
case MCE_DISPLAY_POWER_DOWN:
break;
default:
execute_datapipe(&proximity_blank_pipe,
GINT_TO_POINTER(false),
USE_INDATA, CACHE_INDATA);
break;
}
}

if( !active ) {
mce_log(LL_DEBUG, "UIEXC_NONE");
goto EXIT;
Expand Down Expand Up @@ -1813,7 +1830,8 @@ static void tklock_uiexcept_rethink(void)
}
else if( proximity_state_effective == COVER_CLOSED ) {
mce_log(LL_DEBUG, "proximity=COVERED; blank");
blank = true;
/* blanking due to proximity sensor */
blank = proximity_blank = true;
}
else {
mce_log(LL_DEBUG, "proximity=NOT-COVERED; activate");
Expand Down Expand Up @@ -1841,7 +1859,16 @@ static void tklock_uiexcept_rethink(void)

if( blank ) {
if( display_state != MCE_DISPLAY_OFF ) {
mce_log(LL_DEBUG, "display blank");
/* expose blanking due to proximity via datapipe */
if( proximity_blank ) {
mce_log(LL_DEVEL, "display proximity blank");
execute_datapipe(&proximity_blank_pipe,
GINT_TO_POINTER(true),
USE_INDATA, CACHE_INDATA);
}
else {
mce_log(LL_DEBUG, "display blank");
}
execute_datapipe(&display_state_req_pipe,
GINT_TO_POINTER(MCE_DISPLAY_OFF),
USE_INDATA, CACHE_INDATA);
Expand All @@ -1856,7 +1883,7 @@ static void tklock_uiexcept_rethink(void)
/* Assume: dim/blank timer took over the blanking.
* Disable this state machine until display gets
* turned back on */
mce_log(LL_NOTICE, "AUTO UNBLANK DISABLED; display out of sync");
mce_log(LL_NOTICE, "AUTO UNBLANK DISABLED; display out of sync");
exdata.insync = false;

/* Disable state restore, unless we went out of
Expand All @@ -1880,6 +1907,14 @@ static void tklock_uiexcept_rethink(void)
}
}

/* Make sure "proximityblanking" state gets cleared if display
* state is no longer controlled by this state machine. */
if( !exdata.insync ) {
execute_datapipe(&proximity_blank_pipe,
GINT_TO_POINTER(false),
USE_INDATA, CACHE_INDATA);
}

EXIT:
display_prev = display_state;

Expand Down

0 comments on commit 9b42491

Please sign in to comment.