Skip to content

Commit

Permalink
Signal slide in keypad state over D-Bus System Bus
Browse files Browse the repository at this point in the history
When slide in keypad is opened/closed, a keypad_slide_state_ind signal
is broadcast over D-Bus System Bus.

<node name="/com/nokia/mce/signal">
  <interface name="com.nokia.mce.signal">
    <signal name="keypad_slide_state_ind">
      <arg name="keypad_state" type="s"/>
    </signal>
  </interface>
</node>

Current state can be queried from mce with keypad_slide_state_req D-Bus
method call.

<node name="/com/nokia/mce/request">
  <interface name="com.nokia.mce.request">
    <method name="keypad_slide_state_req">
      <arg direction="out" name="keypad_state" type="s"/>
    </method>
  </interface>
</node>

[mce] Signal slide in keypad state over D-Bus System Bus
  • Loading branch information
spiiroin committed Dec 23, 2014
1 parent de4489d commit 3135652
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 12 deletions.
5 changes: 5 additions & 0 deletions mce.conf
Expand Up @@ -24,6 +24,11 @@
<allow send_destination="com.nokia.mce"
send_interface="com.nokia.mce.request"
send_member="get_tklock_mode"/>

<allow send_destination="com.nokia.mce"
send_interface="com.nokia.mce.request"
send_member="keypad_slide_state_req"/>

<allow send_destination="com.nokia.mce"
send_interface="com.nokia.mce.request"
send_member="get_display_status"/>
Expand Down
131 changes: 119 additions & 12 deletions tklock.c
Expand Up @@ -196,7 +196,8 @@ static void tklock_datapipe_submode_cb(gconstpointer data);
static void tklock_datapipe_touchscreen_cb(gconstpointer const data);
static void tklock_datapipe_lockkey_cb(gconstpointer const data);
static void tklock_datapipe_heartbeat_cb(gconstpointer data);
static void tklock_datapipe_keyboard_slide_cb(gconstpointer const data);
static void tklock_datapipe_keyboard_slide_input_cb(gconstpointer const data);
static void tklock_datapipe_keyboard_slide_output_cb(gconstpointer const data);
static void tklock_datapipe_lid_cover_cb(gconstpointer data);
static void tklock_datapipe_lens_cover_cb(gconstpointer data);
static void tklock_datapipe_user_activity_cb(gconstpointer data);
Expand Down Expand Up @@ -308,6 +309,9 @@ static void tklock_ui_disable_lpm(void);

// dbus ipc

static void tklock_dbus_send_keypad_state(DBusMessage *const req);
static gboolean tklock_dbus_keypad_state_get_req_cb(DBusMessage *const msg);

static gboolean tklock_dbus_send_tklock_mode(DBusMessage *const method_call);

static gboolean tklock_dbus_mode_get_req_cb(DBusMessage *const msg);
Expand Down Expand Up @@ -1431,28 +1435,28 @@ static void tklock_datapipe_heartbeat_cb(gconstpointer data)
tklock_dtcalib_from_heartbeat();
}

/** Keypad slide; assume closed */
static cover_state_t kbd_slide_state = COVER_CLOSED;
/** Keypad slide input state; assume closed */
static cover_state_t kbd_slide_input_state = COVER_CLOSED;

/** Change notifications from keyboard_slide_pipe
*/
static void tklock_datapipe_keyboard_slide_cb(gconstpointer const data)
static void tklock_datapipe_keyboard_slide_input_cb(gconstpointer const data)
{
cover_state_t prev = kbd_slide_state;
kbd_slide_state = GPOINTER_TO_INT(data);
cover_state_t prev = kbd_slide_input_state;
kbd_slide_input_state = GPOINTER_TO_INT(data);

if( kbd_slide_state == COVER_UNDEF )
kbd_slide_state = COVER_CLOSED;
if( kbd_slide_input_state == COVER_UNDEF )
kbd_slide_input_state = COVER_CLOSED;

if( kbd_slide_state == prev )
if( kbd_slide_input_state == prev )
goto EXIT;

mce_log(LL_DEBUG, "kbd_slide_state = %d -> %d", prev, kbd_slide_state);
mce_log(LL_DEBUG, "kbd_slide_input_state = %d -> %d", prev, kbd_slide_input_state);

bool display_on = (display_state_next == MCE_DISPLAY_ON ||
display_state_next == MCE_DISPLAY_DIM);

switch( kbd_slide_state ) {
switch( kbd_slide_input_state ) {
case COVER_OPEN:
/* In any case opening the kbd slide will cancel
* other autorelock triggers */
Expand Down Expand Up @@ -1507,6 +1511,26 @@ static void tklock_datapipe_keyboard_slide_cb(gconstpointer const data)
return;
}

/** Keypad slide output state; assume unknown */
static cover_state_t kbd_slide_output_state = COVER_UNDEF;

static void
tklock_datapipe_keyboard_slide_output_cb(gconstpointer const data)
{
cover_state_t prev = kbd_slide_output_state;
kbd_slide_output_state = GPOINTER_TO_INT(data);

if( kbd_slide_output_state == prev )
goto EXIT;

mce_log(LL_DEBUG, "kbd_slide_output_state = %d -> %d", prev, kbd_slide_output_state);

tklock_dbus_send_keypad_state(0);

EXIT:
return;
}

/** Lid cover state (N770); assume open
*
* Note that this is used also for hammerhead magnetic lid sensor.
Expand Down Expand Up @@ -1786,6 +1810,14 @@ static datapipe_binding_t tklock_datapipe_triggers[] =
.output_cb = tklock_datapipe_user_activity_cb,

},
{
/* Note: Keypad slider state signaling must reflect
* the actual state -> uses output triggering
* unlike the display state logic that is bound
* to datapipe input. */
.datapipe = &keyboard_slide_pipe,
.output_cb = tklock_datapipe_keyboard_slide_output_cb,
},

// input triggers
{
Expand All @@ -1811,7 +1843,7 @@ static datapipe_binding_t tklock_datapipe_triggers[] =
* As long as the slide input is not filtered, there is
* no harm in this. */
.datapipe = &keyboard_slide_pipe,
.input_cb = tklock_datapipe_keyboard_slide_cb,
.input_cb = tklock_datapipe_keyboard_slide_input_cb,
},

// sentinel
Expand Down Expand Up @@ -4149,6 +4181,66 @@ static void tklock_ui_disable_lpm(void)
* DBUS MESSAGE HANDLERS
* ========================================================================= */

#define MCE_KEYPAD_SLIDE_STATE_SIG "keypad_slide_state_ind"
#define MCE_KEYPAD_SLIDE_STATE_REQ "keypad_slide_state_req"

/** Send the keypad open/closed state
*
* @param req A method call message to be replied, or
* NULL send a keypad state signal instead
*/
static void
tklock_dbus_send_keypad_state(DBusMessage *const req)
{
DBusMessage *rsp = 0;

if( req )
rsp = dbus_new_method_reply(req);
else
rsp = dbus_new_signal(MCE_SIGNAL_PATH, MCE_SIGNAL_IF,
MCE_KEYPAD_SLIDE_STATE_SIG);
if( !rsp )
goto EXIT;

const char *arg = "undef";

switch( kbd_slide_output_state ) {
case COVER_OPEN: arg = "open"; break;
case COVER_CLOSED: arg = "closed"; break;
default: break;
}

mce_log(LL_DEBUG, "send keypad state %s: %s",
req ? "reply" : "signal", arg);

if( !dbus_message_append_args(rsp,
DBUS_TYPE_STRING, &arg,
DBUS_TYPE_INVALID) )
goto EXIT;

dbus_send_message(rsp), rsp = 0;

EXIT:
if( rsp ) dbus_message_unref(rsp);
}

/** D-Bus callback for the get keypad state method call
*
* @param msg The D-Bus message
*
* @return TRUE
*/
static gboolean
tklock_dbus_keypad_state_get_req_cb(DBusMessage *const msg)
{
mce_log(LL_DEVEL, "Received keypad state get request from %s",
mce_dbus_get_message_sender_ident(msg));

tklock_dbus_send_keypad_state(msg);

return TRUE;
}

/**
* Send the touchscreen/keypad lock mode
*
Expand Down Expand Up @@ -4453,6 +4545,13 @@ static mce_dbus_handler_t tklock_dbus_handlers[] =
.args =
" <arg name=\"lpm_mode\" type=\"s\"/>\n"
},
{
.interface = MCE_SIGNAL_IF,
.name = MCE_KEYPAD_SLIDE_STATE_SIG,
.type = DBUS_MESSAGE_TYPE_SIGNAL,
.args =
" <arg name=\"keypad_state\" type=\"s\"/>\n"
},
/* method calls */
{
.interface = MCE_REQUEST_IF,
Expand Down Expand Up @@ -4497,6 +4596,14 @@ static mce_dbus_handler_t tklock_dbus_handlers[] =
" <arg direction=\"in\" name=\"notification_name\" type=\"s\"/>\n"
" <arg direction=\"in\" name=\"linger_time\" type=\"i\"/>\n"
},
{
.interface = MCE_REQUEST_IF,
.name = MCE_KEYPAD_SLIDE_STATE_REQ,
.type = DBUS_MESSAGE_TYPE_METHOD_CALL,
.callback = tklock_dbus_keypad_state_get_req_cb,
.args =
" <arg direction=\"out\" name=\"keypad_state\" type=\"s\"/>\n"
},
/* sentinel */
{
.interface = 0
Expand Down

0 comments on commit 3135652

Please sign in to comment.