fpi-ssm: Support named SSMs and use a fallback macro
Add fpi_ssm_new_full() that allows to pass a name to the state-machine constructor, not to change all the drivers, provide a fpi_ssm_new() macro that stringifies the nr_parameters value (usually an enum value) as the name so that we can use it for better debugging.
This commit is contained in:
parent
fe967d0ac2
commit
65828e0e56
3 changed files with 38 additions and 15 deletions
|
@ -211,6 +211,7 @@ fpi_print_bz3_match
|
||||||
FpiSsmCompletedCallback
|
FpiSsmCompletedCallback
|
||||||
FpiSsmHandlerCallback
|
FpiSsmHandlerCallback
|
||||||
fpi_ssm_new
|
fpi_ssm_new
|
||||||
|
fpi_ssm_new_full
|
||||||
fpi_ssm_free
|
fpi_ssm_free
|
||||||
fpi_ssm_start
|
fpi_ssm_start
|
||||||
fpi_ssm_start_subsm
|
fpi_ssm_start_subsm
|
||||||
|
|
|
@ -81,6 +81,7 @@
|
||||||
struct _FpiSsm
|
struct _FpiSsm
|
||||||
{
|
{
|
||||||
FpDevice *dev;
|
FpDevice *dev;
|
||||||
|
const char *name;
|
||||||
FpiSsm *parentsm;
|
FpiSsm *parentsm;
|
||||||
gpointer ssm_data;
|
gpointer ssm_data;
|
||||||
GDestroyNotify ssm_data_destroy;
|
GDestroyNotify ssm_data_destroy;
|
||||||
|
@ -103,13 +104,29 @@ struct _FpiSsm
|
||||||
*
|
*
|
||||||
* Allocate a new ssm, with @nr_states states. The @handler callback
|
* Allocate a new ssm, with @nr_states states. The @handler callback
|
||||||
* will be called after each state transition.
|
* will be called after each state transition.
|
||||||
|
* This is a macro that calls fpi_ssm_new_full() using the stringified
|
||||||
|
* version of @nr_states, so will work better with named parameters.
|
||||||
|
*
|
||||||
|
* Returns: a new #FpiSsm state machine
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_ssm_new_full:
|
||||||
|
* @dev: a #fp_dev fingerprint device
|
||||||
|
* @handler: the callback function
|
||||||
|
* @nr_states: the number of states
|
||||||
|
* @name: the name of the state machine (for debug purposes)
|
||||||
|
*
|
||||||
|
* Allocate a new ssm, with @nr_states states. The @handler callback
|
||||||
|
* will be called after each state transition.
|
||||||
*
|
*
|
||||||
* Returns: a new #FpiSsm state machine
|
* Returns: a new #FpiSsm state machine
|
||||||
*/
|
*/
|
||||||
FpiSsm *
|
FpiSsm *
|
||||||
fpi_ssm_new (FpDevice *dev,
|
fpi_ssm_new_full (FpDevice *dev,
|
||||||
FpiSsmHandlerCallback handler,
|
FpiSsmHandlerCallback handler,
|
||||||
int nr_states)
|
int nr_states,
|
||||||
|
const char *name)
|
||||||
{
|
{
|
||||||
FpiSsm *machine;
|
FpiSsm *machine;
|
||||||
|
|
||||||
|
@ -120,6 +137,7 @@ fpi_ssm_new (FpDevice *dev,
|
||||||
machine->handler = handler;
|
machine->handler = handler;
|
||||||
machine->nr_states = nr_states;
|
machine->nr_states = nr_states;
|
||||||
machine->dev = dev;
|
machine->dev = dev;
|
||||||
|
machine->name = g_strdup (name);
|
||||||
machine->completed = TRUE;
|
machine->completed = TRUE;
|
||||||
return machine;
|
return machine;
|
||||||
}
|
}
|
||||||
|
@ -251,6 +269,7 @@ fpi_ssm_free (FpiSsm *machine)
|
||||||
if (machine->ssm_data_destroy)
|
if (machine->ssm_data_destroy)
|
||||||
g_clear_pointer (&machine->ssm_data, machine->ssm_data_destroy);
|
g_clear_pointer (&machine->ssm_data, machine->ssm_data_destroy);
|
||||||
g_clear_pointer (&machine->error, g_error_free);
|
g_clear_pointer (&machine->error, g_error_free);
|
||||||
|
g_clear_pointer (&machine->name, g_free);
|
||||||
fpi_ssm_clear_delayed_action (machine);
|
fpi_ssm_clear_delayed_action (machine);
|
||||||
g_free (machine);
|
g_free (machine);
|
||||||
}
|
}
|
||||||
|
@ -259,7 +278,7 @@ fpi_ssm_free (FpiSsm *machine)
|
||||||
static void
|
static void
|
||||||
__ssm_call_handler (FpiSsm *machine)
|
__ssm_call_handler (FpiSsm *machine)
|
||||||
{
|
{
|
||||||
fp_dbg ("%p entering state %d", machine, machine->cur_state);
|
fp_dbg ("%s entering state %d", machine->name, machine->cur_state);
|
||||||
machine->handler (machine, machine->dev);
|
machine->handler (machine, machine->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,9 +356,9 @@ fpi_ssm_mark_completed (FpiSsm *machine)
|
||||||
machine->completed = TRUE;
|
machine->completed = TRUE;
|
||||||
|
|
||||||
if (machine->error)
|
if (machine->error)
|
||||||
fp_dbg ("%p completed with error: %s", machine, machine->error->message);
|
fp_dbg ("%s completed with error: %s", machine->name, machine->error->message);
|
||||||
else
|
else
|
||||||
fp_dbg ("%p completed successfully", machine);
|
fp_dbg ("%s completed successfully", machine->name);
|
||||||
if (machine->callback)
|
if (machine->callback)
|
||||||
{
|
{
|
||||||
GError *error = machine->error ? g_error_copy (machine->error) : NULL;
|
GError *error = machine->error ? g_error_copy (machine->error) : NULL;
|
||||||
|
@ -383,9 +402,9 @@ fpi_ssm_mark_completed_delayed (FpiSsm *machine,
|
||||||
on_device_timeout_complete, cancellable,
|
on_device_timeout_complete, cancellable,
|
||||||
machine, NULL);
|
machine, NULL);
|
||||||
|
|
||||||
source_name = g_strdup_printf ("[%s] ssm %p complete %d",
|
source_name = g_strdup_printf ("[%s] ssm %s complete %d",
|
||||||
fp_device_get_device_id (machine->dev),
|
fp_device_get_device_id (machine->dev),
|
||||||
machine, machine->cur_state + 1);
|
machine->name, machine->cur_state + 1);
|
||||||
g_source_set_name (machine->timeout, source_name);
|
g_source_set_name (machine->timeout, source_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,9 +501,9 @@ fpi_ssm_next_state_delayed (FpiSsm *machine,
|
||||||
on_device_timeout_next_state, cancellable,
|
on_device_timeout_next_state, cancellable,
|
||||||
machine, NULL);
|
machine, NULL);
|
||||||
|
|
||||||
source_name = g_strdup_printf ("[%s] ssm %p jump to next state %d",
|
source_name = g_strdup_printf ("[%s] ssm %s jump to next state %d",
|
||||||
fp_device_get_device_id (machine->dev),
|
fp_device_get_device_id (machine->dev),
|
||||||
machine, machine->cur_state + 1);
|
machine->name, machine->cur_state + 1);
|
||||||
g_source_set_name (machine->timeout, source_name);
|
g_source_set_name (machine->timeout, source_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -559,9 +578,9 @@ fpi_ssm_jump_to_state_delayed (FpiSsm *machine,
|
||||||
on_device_timeout_jump_to_state,
|
on_device_timeout_jump_to_state,
|
||||||
cancellable, data, g_free);
|
cancellable, data, g_free);
|
||||||
|
|
||||||
source_name = g_strdup_printf ("[%s] ssm %p jump to state %d",
|
source_name = g_strdup_printf ("[%s] ssm %s jump to state %d",
|
||||||
fp_device_get_device_id (machine->dev),
|
fp_device_get_device_id (machine->dev),
|
||||||
machine, state);
|
machine->name, state);
|
||||||
g_source_set_name (machine->timeout, source_name);
|
g_source_set_name (machine->timeout, source_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,9 +60,12 @@ typedef void (*FpiSsmHandlerCallback)(FpiSsm *ssm,
|
||||||
FpDevice *dev);
|
FpDevice *dev);
|
||||||
|
|
||||||
/* for library and drivers */
|
/* for library and drivers */
|
||||||
FpiSsm *fpi_ssm_new (FpDevice *dev,
|
#define fpi_ssm_new(dev, handler, nr_states) \
|
||||||
FpiSsmHandlerCallback handler,
|
fpi_ssm_new_full (dev, handler, nr_states, #nr_states)
|
||||||
int nr_states);
|
FpiSsm *fpi_ssm_new_full (FpDevice *dev,
|
||||||
|
FpiSsmHandlerCallback handler,
|
||||||
|
int nr_states,
|
||||||
|
const char *machine_name);
|
||||||
void fpi_ssm_free (FpiSsm *machine);
|
void fpi_ssm_free (FpiSsm *machine);
|
||||||
void fpi_ssm_start (FpiSsm *ssm,
|
void fpi_ssm_start (FpiSsm *ssm,
|
||||||
FpiSsmCompletedCallback callback);
|
FpiSsmCompletedCallback callback);
|
||||||
|
|
Loading…
Reference in a new issue