mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.1 KiB
54 lines
1.1 KiB
// SPDX-License-Identifier: GPL-2.0 |
|
/* |
|
* Copyright (C) 2021 Broadcom. All Rights Reserved. The term |
|
* “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. |
|
*/ |
|
|
|
/* |
|
* Generic state machine framework. |
|
*/ |
|
#include "efc.h" |
|
#include "efc_sm.h" |
|
|
|
/** |
|
* efc_sm_post_event() - Post an event to a context. |
|
* |
|
* @ctx: State machine context |
|
* @evt: Event to post |
|
* @data: Event-specific data (if any) |
|
*/ |
|
int |
|
efc_sm_post_event(struct efc_sm_ctx *ctx, |
|
enum efc_sm_event evt, void *data) |
|
{ |
|
if (!ctx->current_state) |
|
return -EIO; |
|
|
|
ctx->current_state(ctx, evt, data); |
|
return 0; |
|
} |
|
|
|
void |
|
efc_sm_transition(struct efc_sm_ctx *ctx, |
|
void (*state)(struct efc_sm_ctx *, |
|
enum efc_sm_event, void *), void *data) |
|
|
|
{ |
|
if (ctx->current_state == state) { |
|
efc_sm_post_event(ctx, EFC_EVT_REENTER, data); |
|
} else { |
|
efc_sm_post_event(ctx, EFC_EVT_EXIT, data); |
|
ctx->current_state = state; |
|
efc_sm_post_event(ctx, EFC_EVT_ENTER, data); |
|
} |
|
} |
|
|
|
static char *event_name[] = EFC_SM_EVENT_NAME; |
|
|
|
const char *efc_sm_event_name(enum efc_sm_event evt) |
|
{ |
|
if (evt > EFC_EVT_LAST) |
|
return "unknown"; |
|
|
|
return event_name[evt]; |
|
}
|
|
|