Skip to content

Commit 941d52f

Browse files
committed
Add and option to allow that signals only dispatch to current active state
1 parent c8cbba1 commit 941d52f

3 files changed

Lines changed: 402 additions & 184 deletions

File tree

include/hsm.h

Lines changed: 69 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,72 +7,103 @@
77
#ifndef _HSM_H_
88
#define _HSM_H_
99

10-
#include <stdint.h>
11-
#include <stdio.h>
12-
#include <string.h>
1310
#include <stdbool.h>
11+
#include <stddef.h>
1412

13+
/* Error codes */
14+
#define HSM_OK (0)
1515
#define EOR_INVALID_ARGUMENT (-1)
1616
#define EOR_INVALID_DATA (-2)
1717
#define EOR_FAULT_ERROR (-3)
1818

1919
#define HSM_ACTION_DONE (0)
2020

21+
/* State signals */
2122
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 */
2728
};
2829
typedef unsigned int hsm_signal_t;
2930

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 */
3039
typedef unsigned short hsm_instance_t;
3140
#define HSM_STATE_INSTANCE_ROOT (0xFFFEu)
3241
#define HSM_STATE_INSTANCE_INVALID (0xFFFFu)
3342

43+
/* Input event structure */
3444
typedef struct {
3545
hsm_signal_t signal;
36-
3746
void *pUserContext;
3847
} hsm_state_input_t;
3948

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);
4151

52+
/* State definition */
4253
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 */
5259
} hsm_state_t;
5360

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);
5566

67+
/* State manager context */
5668
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 */
6675
} hsm_state_manager_t;
6776

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
77108

78109
#endif /* _HSM_H_ */

0 commit comments

Comments
 (0)