plugins: allow multiple custom init commands in sequence

Huawei will need this.
This commit is contained in:
Dan Williams
2011-04-26 23:44:56 -05:00
parent 0befde3ce9
commit 1cf7a4da44
3 changed files with 50 additions and 25 deletions

View File

@@ -129,7 +129,7 @@ supports_port (MMPluginBase *base,
* 1235f71b20c92cded4abd976ccc5010649aae1a0 and
* f38ad328acfdc6ce29dd1380602c546b064161ae for more details.
*/
mm_plugin_base_supports_task_set_custom_init_command (task,
mm_plugin_base_supports_task_add_custom_init_command (task,
"ATE0+CPMS?",
3,
custom_init_response_cb,

View File

@@ -92,6 +92,14 @@ G_DEFINE_TYPE (MMPluginBaseSupportsTask, mm_plugin_base_supports_task, G_TYPE_OB
#define MM_PLUGIN_BASE_SUPPORTS_TASK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MM_TYPE_PLUGIN_BASE_SUPPORTS_TASK, MMPluginBaseSupportsTaskPrivate))
typedef struct {
char *command;
guint32 tries;
guint32 delay_seconds;
MMBaseSupportsTaskCustomInitResultFunc callback;
gpointer callback_data;
} CustomInit;
typedef struct {
MMPluginBase *plugin;
GUdevDevice *port;
@@ -110,11 +118,9 @@ typedef struct {
char *probe_resp;
GError *probe_error;
char *custom_init;
guint32 custom_init_tries;
guint32 custom_init_delay_seconds;
MMBaseSupportsTaskCustomInitResultFunc custom_init_callback;
gpointer custom_init_callback_data;
/* Custom init commands plugins might want */
GSList *custom;
GSList *cur_custom; /* Pointer to current custom init command */
MMSupportsPortResultFunc callback;
gpointer callback_data;
@@ -225,13 +231,14 @@ mm_plugin_base_supports_task_complete (MMPluginBaseSupportsTask *task,
}
void
mm_plugin_base_supports_task_set_custom_init_command (MMPluginBaseSupportsTask *task,
mm_plugin_base_supports_task_add_custom_init_command (MMPluginBaseSupportsTask *task,
const char *cmd,
guint32 delay_seconds,
MMBaseSupportsTaskCustomInitResultFunc callback,
gpointer callback_data)
{
MMPluginBaseSupportsTaskPrivate *priv;
CustomInit *custom;
g_return_if_fail (task != NULL);
g_return_if_fail (MM_IS_PLUGIN_BASE_SUPPORTS_TASK (task));
@@ -239,11 +246,13 @@ mm_plugin_base_supports_task_set_custom_init_command (MMPluginBaseSupportsTask *
priv = MM_PLUGIN_BASE_SUPPORTS_TASK_GET_PRIVATE (task);
g_free (priv->custom_init);
priv->custom_init = g_strdup (cmd);
priv->custom_init_delay_seconds = delay_seconds;
priv->custom_init_callback = callback;
priv->custom_init_callback_data = callback_data;
custom = g_malloc0 (sizeof (*custom));
custom->command = g_strdup (cmd);
custom->delay_seconds = delay_seconds ? delay_seconds : 3;
custom->callback = callback;
custom->callback_data = callback_data;
priv->custom = g_slist_append (priv->custom, custom);
}
static void
@@ -255,6 +264,7 @@ static void
supports_task_dispose (GObject *object)
{
MMPluginBaseSupportsTaskPrivate *priv = MM_PLUGIN_BASE_SUPPORTS_TASK_GET_PRIVATE (object);
GSList *iter;
if (MM_IS_SERIAL_PORT (priv->probe_port))
mm_serial_port_flash_cancel (MM_SERIAL_PORT (priv->probe_port));
@@ -264,7 +274,14 @@ supports_task_dispose (GObject *object)
g_free (priv->driver);
g_free (priv->probe_resp);
g_clear_error (&(priv->probe_error));
g_free (priv->custom_init);
for (iter = priv->custom; iter; iter = g_slist_next (iter)) {
CustomInit *custom = iter->data;
g_free (custom->command);
memset (custom, 0, sizeof (*custom));
g_free (custom);
}
if (priv->open_id)
g_source_remove (priv->open_id);
@@ -738,13 +755,13 @@ custom_init_response (MMAtSerialPort *port,
{
MMPluginBaseSupportsTask *task = MM_PLUGIN_BASE_SUPPORTS_TASK (user_data);
MMPluginBaseSupportsTaskPrivate *task_priv = MM_PLUGIN_BASE_SUPPORTS_TASK_GET_PRIVATE (task);
MMBaseSupportsTaskCustomInitResultFunc callback = task_priv->custom_init_callback;
CustomInit *custom = task_priv->cur_custom->data;
gboolean retry = FALSE;
gboolean fail = FALSE;
guint32 level = 0;
task_priv->custom_init_tries++;
retry = callback (task, response, error, task_priv->custom_init_tries, &fail, &level, task_priv->custom_init_callback_data);
custom->tries++;
retry = custom->callback (task, response, error, custom->tries, &fail, &level, custom->callback_data);
if (fail) {
/* Plugin said to fail the probe */
@@ -761,7 +778,15 @@ custom_init_response (MMAtSerialPort *port,
if (retry) {
/* Try the custom command again */
flash_done (MM_SERIAL_PORT (port), NULL, user_data);
flash_done (MM_SERIAL_PORT (port), NULL, task);
return;
}
/* Any more custom init commands? */
task_priv->cur_custom = g_slist_next (task_priv->cur_custom);
if (task_priv->cur_custom) {
/* There are more custom init commands */
flash_done (MM_SERIAL_PORT (port), NULL, task);
return;
}
@@ -774,17 +799,16 @@ flash_done (MMSerialPort *port, GError *error, gpointer user_data)
{
MMPluginBaseSupportsTask *task = MM_PLUGIN_BASE_SUPPORTS_TASK (user_data);
MMPluginBaseSupportsTaskPrivate *task_priv = MM_PLUGIN_BASE_SUPPORTS_TASK_GET_PRIVATE (task);
guint32 delay_secs = task_priv->custom_init_delay_seconds;
/* Send the custom init command if any */
if (task_priv->custom_init) {
if (!delay_secs)
delay_secs = 3;
if (task_priv->cur_custom) {
CustomInit *custom = task_priv->cur_custom->data;
mm_at_serial_port_queue_command (MM_AT_SERIAL_PORT (port),
task_priv->custom_init,
delay_secs,
custom->command,
custom->delay_seconds,
custom_init_response,
user_data);
task);
} else {
/* Otherwise start normal probing */
start_generic_probing (task, MM_AT_SERIAL_PORT (port));
@@ -875,6 +899,7 @@ mm_plugin_base_probe_port (MMPluginBase *self,
/* Open the port */
task_priv->probe_port = serial;
task_priv->cur_custom = task_priv->custom;
task_priv->open_id = g_idle_add (try_open, task);
return TRUE;
}

View File

@@ -90,7 +90,7 @@ guint32 mm_plugin_base_supports_task_get_probed_capabilities (MMPluginBaseSuppor
void mm_plugin_base_supports_task_complete (MMPluginBaseSupportsTask *task,
guint32 level);
void mm_plugin_base_supports_task_set_custom_init_command (MMPluginBaseSupportsTask *task,
void mm_plugin_base_supports_task_add_custom_init_command (MMPluginBaseSupportsTask *task,
const char *cmd,
guint32 delay_seconds,
MMBaseSupportsTaskCustomInitResultFunc callback,