From 02481278a76336814dfec1d18bf3866bb252732e Mon Sep 17 00:00:00 2001 From: Nicola Corna Date: Sun, 28 Feb 2016 18:53:39 +0100 Subject: [PATCH 1/2] Remove debug Serial.println(now) --- Fsm.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Fsm.cpp b/Fsm.cpp index 8a73782..63dedb9 100644 --- a/Fsm.cpp +++ b/Fsm.cpp @@ -116,9 +116,7 @@ void Fsm::check_timer() } else { - unsigned long now = millis(); - Serial.println(now); - if (now - transition->start >= transition->interval) + if (millis() - transition->start >= transition->interval) { m_current_state = transition->transition.make_transition(); transition->start = 0; From b5b4a466b348a806a249ede45cfccd088b70c001 Mon Sep 17 00:00:00 2001 From: Nicola Corna Date: Sun, 28 Feb 2016 20:42:17 +0100 Subject: [PATCH 2/2] Update the timed transitions start time on every state change --- Fsm.cpp | 29 ++++++++++++++++++----------- Fsm.h | 1 + LICENSE | 1 + 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Fsm.cpp b/Fsm.cpp index 63dedb9..6d17b38 100644 --- a/Fsm.cpp +++ b/Fsm.cpp @@ -66,7 +66,7 @@ void Fsm::add_timed_transition(State* state_from, State* state_to, TimedTransition timed_transition; timed_transition.transition = transition; - timed_transition.start = 0; + timed_transition.start = millis(); timed_transition.interval = interval; m_timed_transitions = (TimedTransition*) realloc( @@ -97,6 +97,7 @@ void Fsm::trigger(int event) m_transitions[i].event == event) { m_current_state = m_transitions[i].make_transition(); + update_timed_transitions_starts(); return; } } @@ -110,17 +111,10 @@ void Fsm::check_timer() TimedTransition* transition = &m_timed_transitions[i]; if (transition->transition.state_from == m_current_state) { - if (transition->start == 0) + if (millis() - transition->start >= transition->interval) { - transition->start = millis(); - } - else - { - if (millis() - transition->start >= transition->interval) - { - m_current_state = transition->transition.make_transition(); - transition->start = 0; - } + m_current_state = transition->transition.make_transition(); + update_timed_transitions_starts(); } } } @@ -141,3 +135,16 @@ State* Fsm::Transition::make_transition() return state_to; } + +void Fsm::update_timed_transitions_starts() +{ + const unsigned long millis_value = millis(); + + for (int i = 0; i < m_num_timed_transitions; ++i) + { + TimedTransition* transition = &m_timed_transitions[i]; + + if (transition->transition.state_from == m_current_state) + transition->start = millis_value; + } +} diff --git a/Fsm.h b/Fsm.h index f58757f..f1e1879 100644 --- a/Fsm.h +++ b/Fsm.h @@ -67,6 +67,7 @@ class Fsm static Transition create_transition(State* state_from, State* state_to, int event, void (*on_transition)()); + void update_timed_transitions_starts(); private: State* m_current_state; diff --git a/LICENSE b/LICENSE index 0341b59..d6039cf 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,6 @@ The MIT License (MIT) +Copyright (c) 2016 Nicola Corna Copyright (c) 2015 Jon Black Permission is hereby granted, free of charge, to any person obtaining a copy