rtop
sm.h
Go to the documentation of this file.
1 #include <map>
2 #include <unordered_set>
3 
4 #ifndef _SM_H_
5 #define _SM_H_
6 #include "rtop_logger.h"
7 #include "params.h"
8 
9 extern src::severity_logger<severity_level> lg;
10 extern logSpacer log_spacer;
11 
12 namespace rtop
13 {
15 
21  {
22  private:
24  std::map<int, std::map<int, int>> state_transitions;
30  bool changed = false;
31  public:
33  StateMachine(std::map<int, std::map<int, int>>& trans):state_transitions{trans}{}
38  void addTransition(int, int, int);
40  void next(int);
42  void next();
44  void reset();
46  void setCurrState(int state){curr_state = state;}
48  int currState() const {return curr_state;}
50  int prevState() const {return prev_state;}
52  bool isChanged() const {return changed;}
54  void stale();
55  friend class XMLTree;
56  };
57 
58 
60  {
62  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"--> StateMachine-"<<curr_state<<"_stale::";
63  changed = false;
64  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"<-- StateMachine-"<<curr_state<<"_stale::";
66  }
67 
69  {
71  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"--> StateMachine-"<<curr_state<<"_reset::";
72  curr_state = state_transitions[-1][curr_state]; // corresponds to tuple (base_state, -1, base_state)
73  changed = false;
74  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"<-- StateMachine-"<<curr_state<<"_reset::";
76  }
77 
78  void StateMachine::next(int ch)
79  {
81  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"--> StateMachine-"<<curr_state<<"_next-int::";
82 
83  prev_state = curr_state; // save curr_state into prev_state
84  if (state_transitions.find(ch) == state_transitions.end()) // if key is not found in state transition table
85  {
86  changed = false; // no change occured, so changed set to false
87  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"<-- StateMachine-"<<curr_state<<"_next-int::";
89  return;
90  }
91  if (state_transitions[ch].find(curr_state) == state_transitions[ch].end())
92  {
93  changed = false;
94  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"<-- StateMachine-"<<curr_state<<"_next-int::";
96  return;
97  }
98  curr_state = state_transitions[ch][curr_state]; // update current state
99  if (curr_state == -1) // \todo: this is also absurd, why is state machine concerning itself with exit global. rationalize/investigate. remove
100  {
101  EXIT = true;
102  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"<-- StateMachine-"<<curr_state<<"_next-int::";
103  log_spacer.delSpace();
104  return;
105  }
106  if (prev_state == curr_state) // if current state is same as prev state
107  changed = false;
108  else
109  changed = true;
110  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"<-- StateMachine-"<<curr_state<<"_next-int::";
111  log_spacer.delSpace();
112  }
113 
115  {
117  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"--> StateMachine-"<<curr_state<<"_next::";
118 
119  prev_state = curr_state; // save curr_state into prev_state
120  if (state_transitions.find(KEY_INPUT) == state_transitions.end()) // if key is not found in state transition table
121  {
122  changed = false; // no change occured, so changed set to false
123  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"<-- StateMachine-"<<curr_state<<"_next::";
125  return;
126  }
127  if (state_transitions[KEY_INPUT].find(curr_state) == state_transitions[KEY_INPUT].end()) // \todo: absurd case, not possible. investigate and remove
128  {
129  changed = false;
130  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"<-- StateMachine-"<<curr_state<<"_next::";
131  log_spacer.delSpace();
132  return;
133  }
134  curr_state = state_transitions[KEY_INPUT][curr_state]; // update current state
135  if (curr_state == -1) // \todo: absurd to handle EXIT global here. rationalize/investigate. remove
136  {
137  EXIT = true;
138  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"<-- StateMachine-"<<curr_state<<"_next::";
139  log_spacer.delSpace();
140  return;
141  }
142  if (prev_state == curr_state) // if current state is same as prev state
143  changed = false;
144  else
145  changed = true;
146  BOOST_LOG_SEV(lg, debug)<<log_spacer<<"<-- StateMachine-"<<curr_state<<"_next::";
147  log_spacer.delSpace();
148  }
149 
150  void StateMachine::addTransition(int key, int curr_st, int next_st)
151  {
152  if(state_transitions.find(key) == state_transitions.end()) // if key is not already present in transition table
153  {
154  std::map<int, int> newmap;
155  state_transitions[key] = newmap;
156  }
157  state_transitions[key][curr_st] = next_st;
158  }
159 
160 } // namespace rtop
161 
162 #endif // _SM_H_
163 
StateMachine()
StateMachine constructor.
Definition: sm.h:35
void setCurrState(int state)
sets current state
Definition: sm.h:46
void addTransition(int, int, int)
add a single transition i.e. tuple (key_input, curr_state, next_state)
Definition: sm.h:150
int prev_state
state variable holding previous state value
Definition: sm.h:28
bool isChanged() const
returns true if prev_state and curr_state are different
Definition: sm.h:52
int curr_state
state variable holding current state value
Definition: sm.h:26
int currState() const
returns current state
Definition: sm.h:48
int prevState() const
returns previous state
Definition: sm.h:50
std::map< int, std::map< int, int > > state_transitions
state transition table
Definition: sm.h:24
void delSpace()
deletes one white-space from white-space string corresponding to invoking thread
Definition: rtop_logger.h:151
logSpacer log_spacer
Definition: rtop_logger.h:186
~StateMachine()
Definition: sm.h:36
bool changed
indicates whether state has changed
Definition: sm.h:30
void addSpace()
adds one white-space to white-space string corresponding to invoking thread
Definition: rtop_logger.h:135
StateMachine(std::map< int, std::map< int, int >> &trans)
StateMachine constructor. Instantiates state machine with provided state transition table.
Definition: sm.h:33
void reset()
resets state machine into base state as specified in transition table tuple entry (base_state,...
Definition: sm.h:68
enables indentation of logs for easy viewing
Definition: rtop_logger.h:118
int KEY_INPUT
Definition: params.h:10
bool EXIT
Definition: params.h:9
src::severity_logger< severity_level > lg
Definition: rtop_logger.h:108
statemachine that uses integer corresponding to object uuids to represent states
Definition: sm.h:20
void next()
same as StateMachine::next(int) except that reads key input from global
Definition: sm.h:114
parses config file
Definition: fileio.h:28
void stale()
sets changed to false
Definition: sm.h:59
Definition: action.h:7