|
- #include <unity.h>
-
- #include "config.h"
- #include "state_machine.h"
-
- namespace {
- using DeviceState = kraftort::state::DeviceState;
-
- void advanceToGpsWait(kraftort::state::StateMachine& sm) {
- kraftort::state::StateInputs in{};
- sm.begin(0);
- in.now_ms = kraftort::config::kBootVisualMs + 10;
- sm.update(in);
- in = {};
- in.now_ms = sm.stateSinceMs() + 10;
- in.button_short_press = true;
- sm.update(in);
- }
-
- void advanceToActive(kraftort::state::StateMachine& sm) {
- advanceToGpsWait(sm);
- kraftort::state::StateInputs in{};
- const uint32_t gps_wait_entry = sm.stateSinceMs();
- for (uint32_t sample = 0; sample < kraftort::config::kFixStableSamples; ++sample) {
- in.now_ms = gps_wait_entry + (sample + 1) * 10;
- in.gps_has_fix = true;
- sm.update(in);
- }
- }
-
- } // namespace
-
- void test_boot_to_ble_and_gps_wait() {
- kraftort::state::StateMachine sm;
- sm.begin(0);
- TEST_ASSERT_EQUAL_INT(static_cast<int>(kraftort::state::DeviceState::Boot),
- static_cast<int>(sm.state()));
-
- kraftort::state::StateInputs in;
- in.now_ms = 900;
- sm.update(in);
- TEST_ASSERT_EQUAL_INT(static_cast<int>(kraftort::state::DeviceState::BleMaintenance),
- static_cast<int>(sm.state()));
-
- in = {};
- in.now_ms = 1000;
- in.button_short_press = true;
- sm.update(in);
- TEST_ASSERT_EQUAL_INT(static_cast<int>(kraftort::state::DeviceState::GpsWait),
- static_cast<int>(sm.state()));
- }
-
- void test_stable_fix_required_for_active() {
- kraftort::state::StateMachine sm;
- sm.begin(0);
- kraftort::state::StateInputs in;
- in.now_ms = 900;
- sm.update(in);
- in = {};
- in.now_ms = 1000;
- in.button_short_press = true;
- sm.update(in);
-
- in = {};
- in.now_ms = 1200;
- in.gps_has_fix = true;
- sm.update(in);
- in.now_ms = 1300;
- sm.update(in);
- TEST_ASSERT_EQUAL_INT(static_cast<int>(kraftort::state::DeviceState::GpsWait),
- static_cast<int>(sm.state()));
-
- in.now_ms = 1400;
- sm.update(in);
- TEST_ASSERT_EQUAL_INT(static_cast<int>(kraftort::state::DeviceState::Active),
- static_cast<int>(sm.state()));
- }
-
- void test_long_press_deep_sleep() {
- kraftort::state::StateMachine sm;
- sm.begin(0);
- kraftort::state::StateInputs in;
- in.now_ms = 100;
- in.button_long_press = true;
- sm.update(in);
- TEST_ASSERT_EQUAL_INT(static_cast<int>(kraftort::state::DeviceState::DeepSleep),
- static_cast<int>(sm.state()));
- }
-
- void test_ble_window_timeout_transitions_to_gps_wait() {
- kraftort::state::StateMachine sm;
- kraftort::state::StateInputs in;
- sm.begin(0);
- in.now_ms = kraftort::config::kBootVisualMs + 10;
- sm.update(in);
- in = {};
- in.now_ms = sm.stateSinceMs() + kraftort::config::kBleWindowMs;
- sm.update(in);
- TEST_ASSERT_EQUAL_INT(static_cast<int>(DeviceState::GpsWait),
- static_cast<int>(sm.state()));
- TEST_ASSERT_EQUAL_UINT32(in.now_ms, sm.stateSinceMs());
- }
-
- void test_active_reverts_to_gps_wait_when_fix_lost() {
- kraftort::state::StateMachine sm;
- advanceToActive(sm);
- TEST_ASSERT_EQUAL_INT(static_cast<int>(DeviceState::Active),
- static_cast<int>(sm.state()));
-
- kraftort::state::StateInputs in;
- in.now_ms = sm.stateSinceMs() + 20;
- in.gps_has_fix = false;
- sm.update(in);
- TEST_ASSERT_EQUAL_INT(static_cast<int>(DeviceState::GpsWait),
- static_cast<int>(sm.state()));
- TEST_ASSERT_EQUAL_UINT32(in.now_ms, sm.stateSinceMs());
-
- const uint32_t gps_wait_entry = sm.stateSinceMs();
- for (uint32_t sample = 0; sample < kraftort::config::kFixStableSamples - 1; ++sample) {
- in = {};
- in.now_ms = gps_wait_entry + (sample + 1) * 10;
- in.gps_has_fix = true;
- sm.update(in);
- TEST_ASSERT_EQUAL_INT(static_cast<int>(DeviceState::GpsWait),
- static_cast<int>(sm.state()));
- }
- }
-
- int runUnityTests(void) {
- UNITY_BEGIN();
- RUN_TEST(test_boot_to_ble_and_gps_wait);
- RUN_TEST(test_stable_fix_required_for_active);
- RUN_TEST(test_long_press_deep_sleep);
- RUN_TEST(test_ble_window_timeout_transitions_to_gps_wait);
- RUN_TEST(test_active_reverts_to_gps_wait_when_fix_lost);
- return UNITY_END();
- }
-
- #ifdef ARDUINO
- #include <Arduino.h>
- void setup() { delay(1000); runUnityTests(); }
- void loop() {}
- #else
- int main() { return runUnityTests(); }
- #endif
|