Skip to content

Commit a1a5603

Browse files
robert-burgerGitHub Enterprise
authored andcommitted
Merge pull request #36 from robotkernel/feat/state_err
Feat/state err
2 parents b04567d + 5a1112f commit a1a5603

3 files changed

Lines changed: 23 additions & 11 deletions

File tree

include/robotkernel/module_base.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -230,22 +230,22 @@ class module_base :
230230
*/
231231
virtual int set_state(module_state_t state);
232232

233-
//! State transition from PREOP to SAFEOP
233+
//! State transition from OP to SAFEOP
234234
virtual void set_state_op_2_safeop() {}
235235

236-
//! State transition from PREOP to SAFEOP
236+
//! State transition from SAFEOP to PREOP
237237
virtual void set_state_safeop_2_preop() {}
238238

239-
//! State transition from PREOP to SAFEOP
239+
//! State transition from PREOP to INIT
240240
virtual void set_state_preop_2_init() {}
241241

242-
//! State transition from PREOP to SAFEOP
242+
//! State transition from INIT to PREOP
243243
virtual void set_state_init_2_preop() {}
244244

245245
//! State transition from PREOP to SAFEOP
246246
virtual void set_state_preop_2_safeop() {}
247247

248-
//! State transition from PREOP to SAFEOP
248+
//! State transition from SAFEOP to OP
249249
virtual void set_state_safeop_2_op() {}
250250

251251
//! Get module state machine state.

include/robotkernel/robotkernel.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
#include "robotkernel/device.h"
3131
#include "robotkernel/device_listener.h"
3232
#include "robotkernel/service.h"
33+
#include "robotkernel/trigger.h"
34+
#include "robotkernel/process_data.h"
35+
#include "robotkernel/stream.h"
3336
#include "robotkernel/helpers.h"
3437

3538
namespace robotkernel {
@@ -108,6 +111,7 @@ inline std::shared_ptr<T> get_device(const std::string& dev_name) {
108111
extern const std::string name(void);
109112

110113
}; // namespace robotkernel;
114+
111115

112116
#endif // ROBOTKERNEL_KERNEL_BASE_H
113117

src/module_base.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,22 @@ int module_base::set_state(module_state_t state) {
5252
// get transition
5353
uint32_t transition = GEN_STATE(this->state, state);
5454

55+
#define try_set_state(transition) \
56+
try { \
57+
set_state_ ## transition(); \
58+
} catch (std::exception& e) { \
59+
log(error, "caught exception during " #transition ": %s\n", e.what()); \
60+
return module_state_error; \
61+
}
62+
5563
switch (transition) {
5664
case op_2_safeop:
5765
case op_2_preop:
5866
case op_2_init:
5967
case op_2_boot: {
6068
// ====> stop sending commands
6169
std::unique_lock<std::mutex> lock(state_mtx);
62-
set_state_op_2_safeop();
70+
try_set_state(op_2_safeop);
6371
this->state = module_state_safeop;
6472

6573
if (state == module_state_safeop)
@@ -70,7 +78,7 @@ int module_base::set_state(module_state_t state) {
7078
case safeop_2_boot: {
7179
// ====> stop receiving measurements
7280
std::unique_lock<std::mutex> lock(state_mtx);
73-
set_state_safeop_2_preop();
81+
try_set_state(safeop_2_preop);
7482
this->state = module_state_preop;
7583

7684
if (state == module_state_preop)
@@ -80,7 +88,7 @@ int module_base::set_state(module_state_t state) {
8088
case preop_2_boot: {
8189
// ====> deinit devices
8290
std::unique_lock<std::mutex> lock(state_mtx);
83-
set_state_preop_2_init();
91+
try_set_state(preop_2_init);
8492
this->state = module_state_init;
8593
}
8694
case init_2_init:
@@ -99,7 +107,7 @@ int module_base::set_state(module_state_t state) {
99107
case init_2_preop: {
100108
// ====> init devices
101109
std::unique_lock<std::mutex> lock(state_mtx);
102-
set_state_init_2_preop();
110+
try_set_state(init_2_preop);
103111
this->state = module_state_preop;
104112

105113
if (state == module_state_preop)
@@ -109,7 +117,7 @@ int module_base::set_state(module_state_t state) {
109117
case preop_2_safeop: {
110118
// ====> start receiving measurements
111119
std::unique_lock<std::mutex> lock(state_mtx);
112-
set_state_preop_2_safeop();
120+
try_set_state(preop_2_safeop);
113121
this->state = module_state_safeop;
114122

115123
if (state == module_state_safeop)
@@ -118,7 +126,7 @@ int module_base::set_state(module_state_t state) {
118126
case safeop_2_op: {
119127
// ====> start sending commands
120128
std::unique_lock<std::mutex> lock(state_mtx);
121-
set_state_safeop_2_op();
129+
try_set_state(safeop_2_op);
122130
this->state = module_state_op;
123131
break;
124132
}

0 commit comments

Comments
 (0)