@@ -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