uFSM  1.0
IoT u-Micro Finite State Machine library
uFsm.cpp
Go to the documentation of this file.
1 
21 #include <cstdio>
22 #include <cassert>
23 #include <list>
24 #include <iostream>
25 
26 #include "uEventHandler.hpp"
27 #include "uFsm.hpp"
28 
35 uFsm::uFsm(uEventHandler *trans, uint32_t maxNumTransitions, uint32_t initialState)
36 {
37  assert( trans!=NULL );
38  handler_ = trans;
39 
40  // Initialize the maximal number of transitions
41  maxNumTransitions_ = maxNumTransitions;
42 
43  // Initialize the current state
44  currentState_ = initialState;
45 
46  // Initialize the array of transitions
47  arrayTrans_ = 0;
48  arrayTrans_ = new TransitionType[ maxNumTransitions_ ];
49  memset( arrayTrans_, -1, maxNumTransitions_ * sizeof(TransitionType));
50 
51 }
52 
57 {
58  std::cout << "bye, World!";
59 }
60 
65 {
66  if ( arrayTrans_ )
67  delete []arrayTrans_;
68 
69  while (!Evlst_.empty())
70  {
71  uFsmEvent *pe=Evlst_.back();
72  delete pe;
73  Evlst_.pop_back();
74  }
75 }
76 
82 void uFsm::insertInQueue( uint32_t event, void *parameters )
83 {
84  uFsmEvent *newevent = new uFsmEvent( event, parameters );
85  Evlst_.push_back(newevent);
86 }
87 
95 int32_t uFsm::hash( uint32_t sourceState, uint32_t event )
96 {
97  int32_t i=0;
98  int32_t where = ( ( event << 8 ) + sourceState) % maxNumTransitions_;
99 
100  // Look for the first available position
101  while( (arrayTrans_[ (where + i ) % maxNumTransitions_].index != -1)
102  && (i < maxNumTransitions_) )
103  i++;
104 
105  // Return negative value if the table is full
106  if ( i >= maxNumTransitions_ )
107  return -1;
108  else // Return free position�s index
109  return ((where + i)%maxNumTransitions_) ;
110 }
111 
119 int32_t uFsm::hash( uint32_t event )
120 {
121  int32_t result = -1;
122  int32_t i = 0;
123  int32_t where = ( ( event << 8 ) + currentState_) % maxNumTransitions_;
124 
125  // Look for the first available position
126  while( (arrayTrans_[(where+i) % maxNumTransitions_].source_state !=
127  currentState_ ||
128  arrayTrans_[(where+i) % maxNumTransitions_].event != event)
129  && i < maxNumTransitions_ )
130  i++;
131 
132  // Return negative value if event not found
133  result = (i >= maxNumTransitions_)?-1:((where + i) % maxNumTransitions_);
134 
135  return result;
136 }
137 
146 uint32_t uFsm::defineTransition( uint32_t sourceState, uint32_t destinationState,
147  uint32_t event, uint32_t index )
148 {
149  uint32_t hashIndex;
150 
151  // Search free position in the table of transitions
152  hashIndex = hash(sourceState, event);
153  if ( hashIndex != -1 )
154  {
155  arrayTrans_[hashIndex].source_state = sourceState;
156  arrayTrans_[hashIndex].destination_state = destinationState;
157  arrayTrans_[hashIndex].event = event;
158  arrayTrans_[hashIndex].index = index;
159  }
160 
161  return hashIndex;
162 }
163 
170 bool uFsm::control( uint32_t event, void *parameters )
171 {
172  bool result = false;
173  int32_t transition_num;
174 
175  // Insert the received event in the insertInQueue
176  insertInQueue(event, parameters);
177 
178  while( !Evlst_.empty() )
179  {
180  uFsmEvent* pe = Evlst_.front();
181  assert( pe!=NULL );
182  // check if it is valid transition
183  if ( (transition_num = hash(pe->id_)) >= 0 )
184  {
185  if ( arrayTrans_[transition_num].index == -1 )
186  {
187  // Missing transition - generate an internal error event
189  }
190  else
191  {
192  // Execute an event handler
193  result = (handler_->*handler_->functions_[
194  arrayTrans_[transition_num].index])(pe->parameters_);
195 
196  // Change the FSM's state
197  currentState_ = arrayTrans_[transition_num].destination_state;
198  }
199  }
200 
201  // Missing transition - generate an internal error event
202  else
203  {
204  assert( pe->id_ == INTERNAL_ERROR );
206  }
207 
208  Evlst_.pop_front();
209  delete pe;
210  }
211 
212  return result;
213 }
214 
220 void uFsm::generateEvent( uint32_t event, void *parameters )
221 {
222  insertInQueue(event, parameters);
223 }
virtual ~uFsm(void)
Definition: uFsm.cpp:64
#define INTERNAL_ERROR
Internal error event.
void * parameters_
event parameters
Definition: uFsm.hpp:38
TransitionFunc * functions_
uint32_t defineTransition(uint32_t sourceState, uint32_t destinationState, uint32_t event, uint32_t index)
Definition: uFsm.cpp:146
virtual ~uFsmEvent()
Definition: uFsm.cpp:56
int32_t id_
event identifier
Definition: uFsm.hpp:36
void generateEvent(uint32_t event, void *parameters=NULL)
Definition: uFsm.cpp:220
uFsm(uEventHandler *trans, uint32_t maxNumTransitions, uint32_t initialState)
Definition: uFsm.cpp:35
bool control(uint32_t event, void *parameters=NULL)
Definition: uFsm.cpp:170