Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge branch 'jb44479_target_state' into 'master'
Add target mode D-Bus signaling

See merge request mer-core/usb-moded!44
  • Loading branch information
spiiroin committed Feb 18, 2019
2 parents 68c15ac + 87936ff commit 4d2edb1
Show file tree
Hide file tree
Showing 9 changed files with 177 additions and 37 deletions.
12 changes: 12 additions & 0 deletions src/com.meego.usb_moded.xml
Expand Up @@ -5,6 +5,9 @@
<method name="mode_request">
<arg name="mode" type="s" direction="out"/>
</method>
<method name="get_target_state">
<arg name="mode" type="s" direction="out"/>
</method>
<method name="set_mode">
<arg name="mode" type="s" direction="in"/>
<arg name="mode" type="s" direction="out"/>
Expand Down Expand Up @@ -56,8 +59,17 @@
</method>
<method name="rescue_off"/>
<signal name="sig_usb_state_ind">
<arg name="mode_or_event" type="s"/>
</signal>
<signal name="sig_usb_current_state_ind">
<arg name="mode" type="s"/>
</signal>
<signal name="sig_usb_target_state_ind">
<arg name="mode" type="s"/>
</signal>
<signal name="sig_usb_event_ind">
<arg name="event" type="s"/>
</signal>
<signal name="sig_usb_state_error_ind">
<arg name="error" type="s"/>
</signal>
Expand Down
62 changes: 57 additions & 5 deletions src/usb_moded-control.c
@@ -1,7 +1,7 @@
/**
* @file usb_moded-control.c
*
* Copyright (C) 2013-2018 Jolla. All rights reserved.
* Copyright (C) 2013-2019 Jolla. All rights reserved.
*
* @author: Philippe De Swert <philippe.deswert@jollamobile.com>
* @author: Simo Piiroinen <simo.piiroinen@jollamobile.com>
Expand Down Expand Up @@ -44,10 +44,13 @@ const char *control_get_external_mode (void);
static void control_set_external_mode (const char *mode);
void control_clear_external_mode (void);
static void control_update_external_mode (void);
const char *control_get_target_mode (void);
static void control_set_target_mode (const char *mode);
void control_clear_target_mode (void);
const char *control_get_usb_mode (void);
void control_clear_internal_mode (void);
void control_set_usb_mode (const char *mode);
void control_mode_switched (const char *override);
void control_mode_switched (const char *mode);
void control_select_usb_mode (void);
void control_set_cable_state (cable_state_t cable_state);
cable_state_t control_get_cable_state (void);
Expand All @@ -60,10 +63,16 @@ bool control_get_connection_state (void);

/* The external mode;
*
* What was the last mode signaled over D-Bus.
* What was the last current mode signaled over D-Bus.
*/
static char *control_external_mode = NULL;

/* The target mode;
*
* What was the last target mode signaled over D-Bus.
*/
static char *control_target_mode = NULL;

/** The logical mode name
*
* Full set of valid modes can occur here
Expand Down Expand Up @@ -136,10 +145,21 @@ static void control_set_external_mode(const char *mode)
if( !strcmp(control_external_mode, MODE_ASK) ) {
/* send signal, mode will be set when the dialog service calls
* the set_mode method call. */
umdbus_send_state_signal(USB_CONNECTED_DIALOG_SHOW);
umdbus_send_event_signal(USB_CONNECTED_DIALOG_SHOW);
}

umdbus_send_state_signal(control_external_mode);
umdbus_send_current_state_signal(control_external_mode);

if( strcmp(control_external_mode, MODE_BUSY) ) {
/* Stable state reached. Synchronize target state.
*
* Note that normally this ends up being a nop,
* but might be needed if the originally scheduled
* target could not be reached due to errors / user
* disconnecting the cable.
*/
control_set_target_mode(control_external_mode);
}

EXIT:
return;
Expand All @@ -159,6 +179,35 @@ static void control_update_external_mode(void)
control_set_external_mode(external_mode);
}

const char *control_get_target_mode(void)
{
return control_target_mode ?: MODE_UNDEFINED;
}

static void control_set_target_mode(const char *mode)
{
gchar *previous = control_target_mode;
if( !g_strcmp0(previous, mode) )
goto EXIT;

log_debug("target_mode: %s -> %s",
previous, mode);

control_target_mode = g_strdup(mode);
g_free(previous);

umdbus_send_target_state_signal(control_target_mode);

EXIT:
return;
}

void control_clear_target_mode(void)
{
g_free(control_target_mode),
control_target_mode = 0;
}

/** get the usb mode
*
* @return the currently set mode
Expand Down Expand Up @@ -191,6 +240,9 @@ void control_set_usb_mode(const char *mode)
control_internal_mode = g_strdup(mode);
g_free(previous);

/* Update target mode before declaring busy */
control_set_target_mode(control_internal_mode);

/* Invalidate current mode for the duration of mode transition */
control_set_external_mode(MODE_BUSY);

Expand Down
4 changes: 3 additions & 1 deletion src/usb_moded-control.h
@@ -1,7 +1,7 @@
/**
* @file usb_moded-control.h
*
* Copyright (C) 2013-2018 Jolla. All rights reserved.
* Copyright (C) 2013-2019 Jolla. All rights reserved.
*
* @author: Philippe De Swert <philippe.deswert@jollamobile.com>
* @author: Simo Piiroinen <simo.piiroinen@jollamobile.com>
Expand Down Expand Up @@ -32,6 +32,8 @@
void control_rethink_usb_charging_fallback(void);
const char *control_get_external_mode (void);
void control_clear_external_mode (void);
const char *control_get_target_mode (void);
void control_clear_target_mode (void);
const char *control_get_usb_mode (void);
void control_clear_internal_mode (void);
void control_set_usb_mode (const char *mode);
Expand Down
6 changes: 4 additions & 2 deletions src/usb_moded-dbus-private.h
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2010 Nokia Corporation. All rights reserved.
* Copyright (C) 2013-2018 Jolla Ltd.
* Copyright (C) 2013-2019 Jolla Ltd.
*
* Author: Philippe De Swert <philippe.de-swert@nokia.com>
* Author: Philippe De Swert <philippe.deswert@jollamobile.com>
Expand Down Expand Up @@ -59,7 +59,9 @@ DBusConnection *umdbus_get_connection (void);
gboolean umdbus_init_connection (void);
gboolean umdbus_init_service (void);
void umdbus_cleanup (void);
int umdbus_send_state_signal (const char *state_ind);
void umdbus_send_current_state_signal (const char *state_ind);
void umdbus_send_target_state_signal (const char *state_ind);
void umdbus_send_event_signal (const char *state_ind);
int umdbus_send_error_signal (const char *error);
int umdbus_send_supported_modes_signal (const char *supported_modes);
int umdbus_send_available_modes_signal (const char *available_modes);
Expand Down
105 changes: 86 additions & 19 deletions src/usb_moded-dbus.c
Expand Up @@ -2,7 +2,7 @@
* @file usb_moded-dbus.c
*
* Copyright (C) 2010 Nokia Corporation. All rights reserved.
* Copyright (C) 2012-2018 Jolla. All rights reserved.
* Copyright (C) 2012-2019 Jolla. All rights reserved.
*
* @author: Philippe De Swert <philippe.de-swert@nokia.com>
* @author: Philippe De Swert <phdeswer@lumi.maa>
Expand Down Expand Up @@ -65,7 +65,10 @@ gboolean umdbus_init_service (void);
static void umdbus_cleanup_service (void);
void umdbus_cleanup (void);
static int umdbus_send_signal_ex (const char *signal_type, const char *content);
int umdbus_send_state_signal (const char *state_ind);
static void umdbus_send_legacy_signal (const char *state_ind);
void umdbus_send_current_state_signal (const char *state_ind);
void umdbus_send_target_state_signal (const char *state_ind);
void umdbus_send_event_signal (const char *state_ind);
int umdbus_send_error_signal (const char *error);
int umdbus_send_supported_modes_signal (const char *supported_modes);
int umdbus_send_available_modes_signal (const char *available_modes);
Expand Down Expand Up @@ -119,6 +122,9 @@ static const char umdbus_introspect_usbmoded[] =
" <method name=\"" USB_MODE_STATE_REQUEST "\">\n"
" <arg name=\"mode\" type=\"s\" direction=\"out\"/>\n"
" </method>\n"
" <method name=\"" USB_MODE_TARGET_STATE_GET "\">\n"
" <arg name=\"mode\" type=\"s\" direction=\"out\"/>\n"
" </method>\n"
" <method name=\"" USB_MODE_STATE_SET "\">\n"
" <arg name=\"mode\" type=\"s\" direction=\"in\"/>\n"
" <arg name=\"mode\" type=\"s\" direction=\"out\"/>\n"
Expand Down Expand Up @@ -147,37 +153,60 @@ static const char umdbus_introspect_usbmoded[] =
" <method name=\"" USB_MODE_AVAILABLE_MODES_GET "\">\n"
" <arg name=\"modes\" type=\"s\" direction=\"out\"/>\n"
" </method>\n"
" <method name=\"" USB_MODE_HIDE "\">\n"
" <arg name=\"mode\" type=\"s\" direction=\"in\"/>\n"
" <arg name=\"mode\" type=\"s\" direction=\"out\"/>\n"
" </method>\n"
" <method name=\"" USB_MODE_UNHIDE "\">\n"
" <arg name=\"mode\" type=\"s\" direction=\"in\"/>\n"
" <arg name=\"mode\" type=\"s\" direction=\"out\"/>\n"
" </method>\n"
" <method name=\"" USB_MODE_HIDDEN_GET "\">\n"
" <arg name=\"modes\" type=\"s\" direction=\"out\"/>\n"
" </method>\n"
" <method name=\"" USB_MODE_WHITELISTED_MODES_GET "\">\n"
" <arg name=\"modes\" type=\"s\" direction=\"out\"/>\n"
" </method>\n"
" <method name=\"" USB_MODE_WHITELISTED_MODES_SET "\">"
" <arg name=\"modes\" type=\"s\" direction=\"in\"/>"
" </method>"
" <method name=\"" USB_MODE_WHITELISTED_SET "\">"
" <arg name=\"mode\" type=\"s\" direction=\"in\"/>"
" <arg name=\"whitelisted\" type=\"b\" direction=\"in\"/>"
" </method>"
" <method name=\"" USB_MODE_WHITELISTED_MODES_SET "\">\n"
" <arg name=\"modes\" type=\"s\" direction=\"in\"/>\n"
" </method>\n"
" <method name=\"" USB_MODE_WHITELISTED_SET "\">\n"
" <arg name=\"mode\" type=\"s\" direction=\"in\"/>\n"
" <arg name=\"whitelisted\" type=\"b\" direction=\"in\"/>\n"
" </method>\n"
" <method name=\"" USB_MODE_RESCUE_OFF "\"/>\n"
" <signal name=\"" USB_MODE_SIGNAL_NAME "\">\n"
" <arg name=\"mode_or_event\" type=\"s\"/>\n"
" </signal>\n"
" <signal name=\"" USB_MODE_CURRENT_STATE_SIGNAL_NAME "\">\n"
" <arg name=\"mode\" type=\"s\"/>\n"
" </signal>\n"
" <signal name=\"" USB_MODE_TARGET_STATE_SIGNAL_NAME "\">\n"
" <arg name=\"mode\" type=\"s\"/>\n"
" </signal>\n"
" <signal name=\"" USB_MODE_EVENT_SIGNAL_NAME "\">\n"
" <arg name=\"event\" type=\"s\"/>\n"
" </signal>\n"
" <signal name=\"" USB_MODE_ERROR_SIGNAL_NAME "\">\n"
" <arg name=\"error\" type=\"s\"/>\n"
" </signal>\n"
" <signal name=\"" USB_MODE_SUPPORTED_MODES_SIGNAL_NAME "\">\n"
" <arg name=\"modes\" type=\"s\"/>\n"
" </signal>\n"
" <signal name=\"" USB_MODE_AVAILABLE_MODES_SIGNAL_NAME "\">\n"
" <arg name=\"modes\" type=\"s\">\n"
" </signal>\n"
" <signal name=\"" USB_MODE_WHITELISTED_MODES_SIGNAL_NAME "\">\n"
" <arg name=\"modes\" type=\"s\">\n"
" <arg name=\"modes\" type=\"s\"/>\n"
" </signal>\n"
" <signal name=\"" USB_MODE_CONFIG_SIGNAL_NAME "\">\n"
" <arg name=\"section\" type=\"s\"/>\n"
" <arg name=\"key\" type=\"s\"/>\n"
" <arg name=\"value\" type=\"s\"/>\n"
" </signal>\n"
" <signal name=\"" USB_MODE_HIDDEN_MODES_SIGNAL_NAME "\">\n"
" <arg name=\"modes\" type=\"s\"/>\n"
" </signal>\n"
" <signal name=\"" USB_MODE_WHITELISTED_MODES_SIGNAL_NAME "\">\n"
" <arg name=\"modes\" type=\"s\"/>\n"
" </signal>\n"
" </interface>\n"
"</node>\n";

Expand Down Expand Up @@ -274,6 +303,12 @@ static DBusHandlerResult umdbus_msg_handler(DBusConnection *const connection, DB
if((reply = dbus_message_new_method_return(msg)))
dbus_message_append_args (reply, DBUS_TYPE_STRING, &mode, DBUS_TYPE_INVALID);
}
else if(!strcmp(member, USB_MODE_TARGET_STATE_GET))
{
const char *mode = control_get_target_mode();
if((reply = dbus_message_new_method_return(msg)))
dbus_message_append_args (reply, DBUS_TYPE_STRING, &mode, DBUS_TYPE_INVALID);
}
else if(!strcmp(member, USB_MODE_STATE_SET))
{
const char *mode = control_get_external_mode();
Expand Down Expand Up @@ -801,16 +836,48 @@ static int umdbus_send_signal_ex(const char *signal_type, const char *content)
return result;
}

/**
* Send regular usb_moded state signal
/** Send legacy usb_moded state_or_event signal
*
* @return 0 on success, 1 on failure
* @param state_ind the signal name
* The legacy USB_MODE_SIGNAL_NAME signal is used for
* both mode changes and stateless events.
*
* @param state_ind mode name or event name
*/
static void umdbus_send_legacy_signal(const char *state_ind)
{
umdbus_send_signal_ex(USB_MODE_SIGNAL_NAME, state_ind);
}

/** Send usb_moded current state signal
*
* @param state_ind mode name
*/
void umdbus_send_current_state_signal(const char *state_ind)
{
umdbus_send_signal_ex(USB_MODE_CURRENT_STATE_SIGNAL_NAME,
state_ind);
umdbus_send_legacy_signal(state_ind);
}

/** Send usb_moded target state signal
*
* @param state_ind mode name
*/
void umdbus_send_target_state_signal(const char *state_ind)
{
umdbus_send_signal_ex(USB_MODE_TARGET_STATE_SIGNAL_NAME,
state_ind);
}

/** Send usb_moded event signal
*
* @param state_ind event name
*/
int umdbus_send_state_signal(const char *state_ind)
void umdbus_send_event_signal(const char *state_ind)
{
return umdbus_send_signal_ex(USB_MODE_SIGNAL_NAME, state_ind);
umdbus_send_signal_ex(USB_MODE_EVENT_SIGNAL_NAME,
state_ind);
umdbus_send_legacy_signal(state_ind);
}

/**
Expand Down
6 changes: 5 additions & 1 deletion src/usb_moded-dbus.h
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2010 Nokia Corporation. All rights reserved.
* Copyright (C) 2012-2018 Jolla. All rights reserved.
* Copyright (C) 2012-2019 Jolla. All rights reserved.
*
* Author: Philippe De Swert <philippe.de-swert@nokia.com>
* Author: Philippe De Swert <philippedeswert@gmail.com>
Expand Down Expand Up @@ -47,6 +47,9 @@
* states listed in usb_moded-modes.h.
**/
# define USB_MODE_SIGNAL_NAME "sig_usb_state_ind"
# define USB_MODE_CURRENT_STATE_SIGNAL_NAME "sig_usb_current_state_ind"
# define USB_MODE_TARGET_STATE_SIGNAL_NAME "sig_usb_target_state_ind"
# define USB_MODE_EVENT_SIGNAL_NAME "sig_usb_event_ind"
# define USB_MODE_CONFIG_SIGNAL_NAME "sig_usb_config_ind"
# define USB_MODE_ERROR_SIGNAL_NAME "sig_usb_state_error_ind"
# define USB_MODE_SUPPORTED_MODES_SIGNAL_NAME "sig_usb_supported_modes_ind"
Expand All @@ -56,6 +59,7 @@

/* supported methods */
# define USB_MODE_STATE_REQUEST "mode_request" /* returns the current mode */
# define USB_MODE_TARGET_STATE_GET "get_target_state" /* returns the target mode */
# define USB_MODE_RESCUE_OFF "rescue_off" /* turns rescue mode off so normal mode selection is restored */
# define USB_MODE_CONFIG_GET "get_config" /* returns the mode set in the config */
# define USB_MODE_LIST "get_modes" /* returns a comma-separated list of supported modes for ui's */
Expand Down

0 comments on commit 4d2edb1

Please sign in to comment.