|
7 | 7 | #ifndef _HSM_H_ |
8 | 8 | #define _HSM_H_ |
9 | 9 |
|
10 | | -#include <stdint.h> |
11 | | -#include <stdio.h> |
12 | | -#include <string.h> |
13 | 10 | #include <stdbool.h> |
| 11 | +#include <stddef.h> |
14 | 12 |
|
| 13 | +/* Error codes */ |
| 14 | +#define HSM_OK (0) |
15 | 15 | #define EOR_INVALID_ARGUMENT (-1) |
16 | 16 | #define EOR_INVALID_DATA (-2) |
17 | 17 | #define EOR_FAULT_ERROR (-3) |
18 | 18 |
|
19 | 19 | #define HSM_ACTION_DONE (0) |
20 | 20 |
|
| 21 | +/* State signals */ |
21 | 22 | enum hsm_signal { |
22 | | - HSM_SIGNAL_UNKNOWN = (0u), |
23 | | - HSM_SIGNAL_ENTRY, |
24 | | - HSM_SIGNAL_INIT, |
25 | | - HSM_SIGNAL_EXIT, |
26 | | - HSM_SIGNAL_USER_DEFINE, |
| 23 | + HSM_SIGNAL_UNKNOWN = 0u, |
| 24 | + HSM_SIGNAL_ENTRY, /* Called when entering a state */ |
| 25 | + HSM_SIGNAL_INIT, /* Called for initial setup after entry */ |
| 26 | + HSM_SIGNAL_EXIT, /* Called when exiting a state */ |
| 27 | + HSM_SIGNAL_USER_DEFINE, /* User-defined signals start here */ |
27 | 28 | }; |
28 | 29 | typedef unsigned int hsm_signal_t; |
29 | 30 |
|
| 31 | +/* Signal dispatch modes (for future extensibility) */ |
| 32 | +enum hsm_signal_mode { |
| 33 | + HSM_SIGNAL_MODE_PASS_THROUGH = 0u, /* Signals propagate from root to leaf through hierarchy */ |
| 34 | + HSM_SIGNAL_MODE_CURRENT_NODE, /* Signals only dispatch to current active state */ |
| 35 | +}; |
| 36 | +typedef unsigned int hsm_signal_mode_t; |
| 37 | + |
| 38 | +/* State instance identifiers */ |
30 | 39 | typedef unsigned short hsm_instance_t; |
31 | 40 | #define HSM_STATE_INSTANCE_ROOT (0xFFFEu) |
32 | 41 | #define HSM_STATE_INSTANCE_INVALID (0xFFFFu) |
33 | 42 |
|
| 43 | +/* Input event structure */ |
34 | 44 | typedef struct { |
35 | 45 | hsm_signal_t signal; |
36 | | - |
37 | 46 | void *pUserContext; |
38 | 47 | } hsm_state_input_t; |
39 | 48 |
|
40 | | -typedef signed int (*pEntryFunc_t)(hsm_state_input_t); |
| 49 | +/* State handler function type */ |
| 50 | +typedef signed int (*hsm_state_handler_t)(hsm_state_input_t); |
41 | 51 |
|
| 52 | +/* State definition */ |
42 | 53 | typedef struct hsm_state { |
43 | | - struct hsm_state *pMasterState; |
44 | | - |
45 | | - hsm_instance_t instance; |
46 | | - |
47 | | - unsigned int id; |
48 | | - |
49 | | - const char *pName; |
50 | | - |
51 | | - pEntryFunc_t pEntryFunc; |
| 54 | + struct hsm_state *pParent; /* Parent state in hierarchy (NULL for top-level) */ |
| 55 | + hsm_instance_t instance; /* Index in state array */ |
| 56 | + unsigned int id; /* User-defined state ID */ |
| 57 | + const char *pName; /* State name for debugging */ |
| 58 | + hsm_state_handler_t pHandler; /* State handler function */ |
52 | 59 | } hsm_state_t; |
53 | 60 |
|
54 | | -typedef signed int (*pHsmTransducerFunc_t)(const hsm_state_t *, hsm_instance_t, hsm_instance_t, hsm_state_input_t); |
| 61 | +/* Transducer callback for state transitions */ |
| 62 | +typedef signed int (*hsm_transducer_t)(const hsm_state_t *pStates, |
| 63 | + hsm_instance_t fromState, |
| 64 | + hsm_instance_t toState, |
| 65 | + hsm_state_input_t input); |
55 | 66 |
|
| 67 | +/* State manager context */ |
56 | 68 | typedef struct { |
57 | | - const hsm_state_t *pInitState; |
58 | | - |
59 | | - unsigned short number; |
60 | | - |
61 | | - hsm_instance_t current; |
62 | | - |
63 | | - hsm_instance_t middleware; |
64 | | - |
65 | | - pHsmTransducerFunc_t pTransucerFunc; |
| 69 | + const hsm_state_t *pStates; /* Array of state definitions */ |
| 70 | + unsigned short stateCount; /* Number of states in array */ |
| 71 | + hsm_instance_t currentState; /* Currently active state instance */ |
| 72 | + hsm_instance_t processingState; /* State being processed (during transitions) */ |
| 73 | + bool passThroughMode; /* true: pass through mode, false: current node mode */ |
| 74 | + hsm_transducer_t pTransducer; /* Optional transition callback */ |
66 | 75 | } hsm_state_manager_t; |
67 | 76 |
|
68 | | -signed int hsm_init(hsm_state_manager_t *pInitManagerContext, const hsm_state_t *pInitStateList, unsigned short number, |
69 | | - hsm_instance_t initInstance, pHsmTransducerFunc_t pTransucerFunc); |
70 | | -signed int hsm_inst_isInvalid(hsm_state_manager_t *pStateManager, hsm_instance_t instance); |
71 | | -const char *hsm_inst_nameGet(hsm_state_manager_t *pStateManager, hsm_instance_t instance); |
72 | | -signed int hsm_inst_idGet(hsm_state_manager_t *pStateManager, hsm_instance_t instance); |
73 | | -hsm_instance_t hsm_inst_middleware_get(hsm_state_manager_t *pStateManager); |
74 | | -hsm_instance_t hsm_inst_current_get(hsm_state_manager_t *pStateManager); |
75 | | -signed int hsm_activities(hsm_state_manager_t *pStateManager, hsm_state_input_t input); |
76 | | -signed int hsm_transition(hsm_state_manager_t *pStateManager, hsm_instance_t next); |
| 77 | +/* Public API */ |
| 78 | +signed int hsm_init(hsm_state_manager_t *pManager, |
| 79 | + const hsm_state_t *pStateList, |
| 80 | + unsigned short stateCount, |
| 81 | + hsm_instance_t initialState, |
| 82 | + bool passThrough, |
| 83 | + hsm_transducer_t pTransducer); |
| 84 | +signed int hsm_state_isValid(hsm_state_manager_t *pManager, hsm_instance_t instance); |
| 85 | +const char *hsm_state_getName(hsm_state_manager_t *pManager, hsm_instance_t instance); |
| 86 | +signed int hsm_state_getId(hsm_state_manager_t *pManager, hsm_instance_t instance); |
| 87 | +hsm_instance_t hsm_getProcessingState(hsm_state_manager_t *pManager); |
| 88 | +const char *hsm_getCurrentStateName(hsm_state_manager_t *pManager); |
| 89 | +hsm_instance_t hsm_getTargetState(hsm_state_manager_t *pManager); |
| 90 | +const char *hsm_getTargetStateName(hsm_state_manager_t *pManager); |
| 91 | +signed int hsm_dispatch(hsm_state_manager_t *pManager, hsm_state_input_t input); |
| 92 | +signed int hsm_transition(hsm_state_manager_t *pManager, hsm_instance_t nextState); |
| 93 | + |
| 94 | +/* Backward compatibility macros */ |
| 95 | +#define pMasterState pParent |
| 96 | +#define pEntryFunc pHandler |
| 97 | +#define pInitState pStates |
| 98 | +#define number stateCount |
| 99 | +#define current currentState |
| 100 | +#define middleware processingState |
| 101 | +#define pTransucerFunc pTransducer |
| 102 | +#define hsm_activities hsm_dispatch |
| 103 | +#define hsm_state_isInvalid(m, i) (!hsm_state_isValid((m), (i)) ? 0 : EOR_INVALID_DATA) |
| 104 | +#define hsm_state_nameGet hsm_state_getName |
| 105 | +#define hsm_state_idGet hsm_state_getId |
| 106 | +#define hsm_inst_middleware_get hsm_getProcessingState |
| 107 | +#define hsm_inst_current_get hsm_getTargetState |
77 | 108 |
|
78 | 109 | #endif /* _HSM_H_ */ |
0 commit comments