9 { 3, 100, 20, 2, 3 } } };
24 TEST_ASSERT_EQUAL(4, relay.
get_pin());
32 TEST_ASSERT_EQUAL(4, relay.
get_pin());
40 TEST_ASSERT_EQUAL(4, relay.
get_pin());
47 TEST_ASSERT_EQUAL(2,
relays.get_relay(0).get_pin());
48 TEST_ASSERT_EQUAL(3,
relays.get_relay(1).get_pin());
53 TEST_ASSERT_EQUAL(1000,
relays.get_relay(0).get_surplusThreshold());
54 TEST_ASSERT_EQUAL(100,
relays.get_relay(1).get_surplusThreshold());
59 TEST_ASSERT_EQUAL(200,
relays.get_relay(0).get_importThreshold());
60 TEST_ASSERT_EQUAL(20,
relays.get_relay(1).get_importThreshold());
65 TEST_ASSERT_EQUAL(1 * 60,
relays.get_relay(0).get_minON());
66 TEST_ASSERT_EQUAL(2 * 60,
relays.get_relay(1).get_minON());
71 TEST_ASSERT_EQUAL(1 * 60,
relays.get_relay(0).get_minOFF());
72 TEST_ASSERT_EQUAL(3 * 60,
relays.get_relay(1).get_minOFF());
77 TEST_ASSERT_FALSE(
relays.get_relay(1).isRelayON());
82 const auto& my_relay{
relays.get_relay(1) };
84 TEST_ASSERT_FALSE(my_relay.isRelayON());
87 const auto surplus{ -my_relay.get_surplusThreshold() - 1 };
88 uint16_t overrideBitmask = 0;
90 TEST_ASSERT_FALSE(my_relay.proceed_relay(surplus, overrideBitmask));
92 TEST_ASSERT_FALSE(my_relay.isRelayON());
94 for (uint8_t timer = 0; timer < my_relay.get_minOFF() - 1; ++timer)
96 my_relay.inc_duration();
99 TEST_ASSERT_FALSE(my_relay.proceed_relay(surplus, overrideBitmask));
102 my_relay.inc_duration();
105 TEST_ASSERT_TRUE(my_relay.proceed_relay(surplus, overrideBitmask));
106 TEST_ASSERT_TRUE(my_relay.isRelayON());
111 const auto& my_relay{
relays.get_relay(1) };
113 TEST_ASSERT_TRUE(my_relay.isRelayON());
116 const auto consum{ my_relay.get_importThreshold() + 1 };
117 uint16_t overrideBitmask = 0;
119 TEST_ASSERT_FALSE(my_relay.proceed_relay(consum, overrideBitmask));
121 TEST_ASSERT_TRUE(my_relay.isRelayON());
123 for (uint8_t timer = 0; timer < my_relay.get_minON() - 1; ++timer)
125 my_relay.inc_duration();
128 TEST_ASSERT_FALSE(my_relay.proceed_relay(consum, overrideBitmask));
131 my_relay.inc_duration();
134 TEST_ASSERT_TRUE(my_relay.proceed_relay(consum, overrideBitmask));
135 TEST_ASSERT_FALSE(my_relay.isRelayON());
140 const auto& my_relay{
relays.get_relay(1) };
143 TEST_ASSERT_FALSE(my_relay.isRelayON());
146 const auto insufficient_surplus{ -my_relay.get_surplusThreshold() + 100 };
149 for (uint8_t timer = 0; timer < my_relay.get_minOFF() / 2; ++timer)
151 my_relay.inc_duration();
154 uint16_t overrideBitmask = (1U << my_relay.get_pin());
155 TEST_ASSERT_FALSE(my_relay.proceed_relay(insufficient_surplus, overrideBitmask));
156 TEST_ASSERT_FALSE(my_relay.isRelayON());
157 TEST_ASSERT_EQUAL(0, overrideBitmask & (1U << my_relay.get_pin()));
160 for (uint8_t timer = my_relay.get_minOFF() / 2; timer < my_relay.get_minOFF() - 1; ++timer)
162 my_relay.inc_duration();
165 overrideBitmask = (1U << my_relay.get_pin());
166 TEST_ASSERT_FALSE(my_relay.proceed_relay(insufficient_surplus, overrideBitmask));
167 TEST_ASSERT_FALSE(my_relay.isRelayON());
168 TEST_ASSERT_EQUAL(0, overrideBitmask & (1U << my_relay.get_pin()));
171 my_relay.inc_duration();
173 overrideBitmask = (1U << my_relay.get_pin());
174 TEST_ASSERT_TRUE(my_relay.proceed_relay(insufficient_surplus, overrideBitmask));
175 TEST_ASSERT_TRUE(my_relay.isRelayON());
176 TEST_ASSERT_EQUAL(0, overrideBitmask & (1U << my_relay.get_pin()));
181 const auto& my_relay{
relays.get_relay(1) };
184 TEST_ASSERT_TRUE(my_relay.isRelayON());
187 const auto high_import{ my_relay.get_importThreshold() + 100 };
188 uint16_t overrideBitmask = 0;
191 for (uint8_t timer = 0; timer < my_relay.get_minON() / 2; ++timer)
193 my_relay.inc_duration();
196 TEST_ASSERT_FALSE(my_relay.proceed_relay(high_import, overrideBitmask));
197 TEST_ASSERT_TRUE(my_relay.isRelayON());
200 for (uint8_t timer = my_relay.get_minON() / 2; timer < my_relay.get_minON() - 1; ++timer)
202 my_relay.inc_duration();
205 TEST_ASSERT_FALSE(my_relay.proceed_relay(high_import, overrideBitmask));
206 TEST_ASSERT_TRUE(my_relay.isRelayON());
209 my_relay.inc_duration();
211 TEST_ASSERT_TRUE(my_relay.proceed_relay(high_import, overrideBitmask));
212 TEST_ASSERT_FALSE(my_relay.isRelayON());
228 TEST_ASSERT_EQUAL(2,
relays.size());
240 { { 8, 500, 100, 1, 1 },
241 { 9, 800, 150, 1, 1 } } };
254 for (uint8_t
i = 0;
i < 50; ++
i)
260 uint16_t overrideBitmask = 0;
274 for (uint8_t
i = 0;
i < 60; ++
i)
280 for (uint8_t
i = 0;
i < 50; ++
i)
286 uint16_t overrideBitmask = 0;
303 for (uint8_t
i = 0;
i < 50; ++
i)
309 uint16_t overrideBitmask = 0;
316 for (uint8_t
i = 0;
i < 60; ++
i)
322 for (uint8_t
i = 0;
i < 50; ++
i)
342 for (uint8_t
i = 0;
i < 50; ++
i)
348 uint16_t overrideBitmask = 0;
356 for (uint8_t
i = 0;
i < 60; ++
i)
362 for (uint8_t
i = 0;
i < 50; ++
i)
394 { { 11, 500, 100, 1, 1 },
395 { 12, 500, 100, 1, 1 },
396 { 13, 500, 100, 1, 1 } } };
401 for (uint8_t
i = 0;
i < 50; ++
i)
410 for (uint8_t
i = 0;
i < 50; ++
i)
419 for (uint8_t
i = 0;
i < 60; ++
i)
442 uint16_t overrideBitmask = 0;
491 uint16_t overrideBitmask = 0;
537 { { 10, 500, 100, 1, 1 } } };
550 TEST_ASSERT_FALSE(relay.isRelayON());
554 for (uint32_t
i = 0;
i < UINT16_MAX; ++
i)
556 relay.inc_duration();
561 uint16_t overrideBitmask = 0;
562 const int32_t surplus = -600;
563 TEST_ASSERT_TRUE(relay.proceed_relay(surplus, overrideBitmask));
564 TEST_ASSERT_TRUE(relay.isRelayON());
575 TEST_ASSERT_TRUE(relay.isRelayON());
580 for (uint16_t
i = 0;
i < 1000; ++
i)
582 relay.inc_duration();
588 const int32_t
import = 200;
589 uint16_t overrideBitmask = 0;
590 TEST_ASSERT_TRUE(relay.proceed_relay(
import, overrideBitmask));
591 TEST_ASSERT_FALSE(relay.isRelayON());
603 TEST_ASSERT_FALSE(relay.isRelayON());
606 for (uint32_t
i = 0;
i < UINT16_MAX; ++
i)
608 relay.inc_duration();
614 for (uint8_t
i = 0;
i < 50; ++
i)
616 relay.inc_duration();
622 uint16_t overrideBitmask = 0;
623 const int32_t surplus = -600;
624 TEST_ASSERT_TRUE(relay.proceed_relay(surplus, overrideBitmask));
625 TEST_ASSERT_TRUE(relay.isRelayON());
629 for (uint32_t
i = 0;
i < UINT16_MAX; ++
i)
631 relay.inc_duration();
635 for (uint8_t
i = 0;
i < 50; ++
i)
637 relay.inc_duration();
643 const int32_t
import = 200;
645 TEST_ASSERT_TRUE(relay.proceed_relay(
import, overrideBitmask));
646 TEST_ASSERT_FALSE(relay.isRelayON());
Manages a collection of relays and their behavior based on surplus and import thresholds.
Represents a single relay configuration and its behavior.
constexpr auto get_surplusThreshold() const
Get the surplus threshold which will turns ON the relay.
constexpr auto get_importThreshold() const
Get the import threshold which will turns OFF the relay.
constexpr auto get_pin() const
Get the control pin of the relay.
constexpr RelayEngine relays
void test_duration_overflow_wrap_would_block_relay(void)
void test_relay_ordering(void)
void feed_surplus_to_ordering_relays(void)
void test_duration_overflow(void)
void test_get_minOFF(void)
void test_relay_override_turnON(void)
void test_proceed_relay(void)
void test_relay_ordering_import_turns_off_descending(void)
constexpr RelayEngine< 3, 3 > orderingTestRelays
void test_settle_change_blocks_initial_relay_changes(void)
void test_isRelayON(void)
void wait_for_relay_change_allowed(void)
void test_relay_turnOFF(void)
constexpr RelayEngine< 2, 1 > settleTestRelays
void test_get_minON(void)
void test_duration_overflow_stays_at_max_after_more_increments(void)
void test_proceed_settle_change(void)
void feed_import_to_ordering_relays(void)
constexpr RelayEngine< 1, 2 > overflowTestRelays
void test_get_surplusThreshold(void)
void test_relay_override_minimum_ON_time(void)
void test_relay_initialization_with_positive_thresholds(void)
void test_settle_change_blocks_turn_off_as_well(void)
void test_get_importThreshold(void)
void test_settle_change_allows_changes_after_60_seconds(void)
void test_relay_initialization(void)
void test_relay_ordering_surplus_turns_on_ascending(void)
void test_settle_change_resets_after_relay_change(void)
void test_relay_turnON(void)
void test_relay_initialization_with_negative_thresholds(void)
void test_duration_overflow_saturates_at_uint16_max(void)
Some utility functions for pins manipulation.
Some utility functions for the relay output feature.