Vanetza
 
Loading...
Searching...
No Matches
gradual_state_machine.cpp
1#include "gradual_state_machine.hpp"
2#include <boost/format.hpp>
3#include <iterator>
4
5namespace vanetza
6{
7namespace dcc
8{
9
10GradualStateMachine::GradualStateMachine(const std::set<State>& states) :
11 m_states(states), m_current(m_states.begin())
12{
13 repair();
14}
15
16GradualStateMachine::GradualStateMachine(std::set<State>&& states) :
17 m_states(std::move(states)), m_current(m_states.begin())
18{
19 repair();
20}
21
22void GradualStateMachine::update(ChannelLoad cbr)
23{
24 static_assert(std::is_base_of<std::bidirectional_iterator_tag,
25 std::iterator_traits<StateContainer::const_iterator>::iterator_category>::value,
26 "State transitions require bidirectional iterators");
27
28 if (cbr < m_current->lower_limit) {
29 if (m_current != m_states.begin()) {
30 std::advance(m_current, -1);
31 }
32 } else {
33 StateContainer::const_iterator up = std::next(m_current);
34 if (up != m_states.end() && cbr >= up->lower_limit) {
35 m_current = up;
36 }
37 }
38}
39
40Clock::duration GradualStateMachine::transmission_interval() const
41{
42 return m_current->off_time;
43}
44
45std::string GradualStateMachine::state() const
46{
47 if (m_current == m_states.begin()) {
48 return "Relaxed";
49 } else if (m_current == std::prev(m_states.end())) {
50 return "Restrictive";
51 } else {
52 static const boost::format fmt("Active %1%");
53 return (boost::format(fmt) % std::distance(m_states.begin(), m_current)).str();
54 }
55}
56
57void GradualStateMachine::repair()
58{
59 if (m_states.empty()) {
60 m_states.emplace(ChannelLoad(0.0), Clock::duration::zero());
61 m_current = m_states.begin();
62 }
63}
64
65} // namespace dcc
66} // namespace vanetza
STL namespace.