ESP32-basiertes Kraftort-Suchger�t mit GPS, LED-Ring und PlatformIO-Firmware.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

146 rindas
4.2KB

  1. #include <unity.h>
  2. #include "config.h"
  3. #include "state_machine.h"
  4. namespace {
  5. using DeviceState = kraftort::state::DeviceState;
  6. void advanceToGpsWait(kraftort::state::StateMachine& sm) {
  7. kraftort::state::StateInputs in{};
  8. sm.begin(0);
  9. in.now_ms = kraftort::config::kBootVisualMs + 10;
  10. sm.update(in);
  11. in = {};
  12. in.now_ms = sm.stateSinceMs() + 10;
  13. in.button_short_press = true;
  14. sm.update(in);
  15. }
  16. void advanceToActive(kraftort::state::StateMachine& sm) {
  17. advanceToGpsWait(sm);
  18. kraftort::state::StateInputs in{};
  19. const uint32_t gps_wait_entry = sm.stateSinceMs();
  20. for (uint32_t sample = 0; sample < kraftort::config::kFixStableSamples; ++sample) {
  21. in.now_ms = gps_wait_entry + (sample + 1) * 10;
  22. in.gps_has_fix = true;
  23. sm.update(in);
  24. }
  25. }
  26. } // namespace
  27. void test_boot_to_ble_and_gps_wait() {
  28. kraftort::state::StateMachine sm;
  29. sm.begin(0);
  30. TEST_ASSERT_EQUAL_INT(static_cast<int>(kraftort::state::DeviceState::Boot),
  31. static_cast<int>(sm.state()));
  32. kraftort::state::StateInputs in;
  33. in.now_ms = 900;
  34. sm.update(in);
  35. TEST_ASSERT_EQUAL_INT(static_cast<int>(kraftort::state::DeviceState::BleMaintenance),
  36. static_cast<int>(sm.state()));
  37. in = {};
  38. in.now_ms = 1000;
  39. in.button_short_press = true;
  40. sm.update(in);
  41. TEST_ASSERT_EQUAL_INT(static_cast<int>(kraftort::state::DeviceState::GpsWait),
  42. static_cast<int>(sm.state()));
  43. }
  44. void test_stable_fix_required_for_active() {
  45. kraftort::state::StateMachine sm;
  46. sm.begin(0);
  47. kraftort::state::StateInputs in;
  48. in.now_ms = 900;
  49. sm.update(in);
  50. in = {};
  51. in.now_ms = 1000;
  52. in.button_short_press = true;
  53. sm.update(in);
  54. in = {};
  55. in.now_ms = 1200;
  56. in.gps_has_fix = true;
  57. sm.update(in);
  58. in.now_ms = 1300;
  59. sm.update(in);
  60. TEST_ASSERT_EQUAL_INT(static_cast<int>(kraftort::state::DeviceState::GpsWait),
  61. static_cast<int>(sm.state()));
  62. in.now_ms = 1400;
  63. sm.update(in);
  64. TEST_ASSERT_EQUAL_INT(static_cast<int>(kraftort::state::DeviceState::Active),
  65. static_cast<int>(sm.state()));
  66. }
  67. void test_long_press_deep_sleep() {
  68. kraftort::state::StateMachine sm;
  69. sm.begin(0);
  70. kraftort::state::StateInputs in;
  71. in.now_ms = 100;
  72. in.button_long_press = true;
  73. sm.update(in);
  74. TEST_ASSERT_EQUAL_INT(static_cast<int>(kraftort::state::DeviceState::DeepSleep),
  75. static_cast<int>(sm.state()));
  76. }
  77. void test_ble_window_timeout_transitions_to_gps_wait() {
  78. kraftort::state::StateMachine sm;
  79. kraftort::state::StateInputs in;
  80. sm.begin(0);
  81. in.now_ms = kraftort::config::kBootVisualMs + 10;
  82. sm.update(in);
  83. in = {};
  84. in.now_ms = sm.stateSinceMs() + kraftort::config::kBleWindowMs;
  85. sm.update(in);
  86. TEST_ASSERT_EQUAL_INT(static_cast<int>(DeviceState::GpsWait),
  87. static_cast<int>(sm.state()));
  88. TEST_ASSERT_EQUAL_UINT32(in.now_ms, sm.stateSinceMs());
  89. }
  90. void test_active_reverts_to_gps_wait_when_fix_lost() {
  91. kraftort::state::StateMachine sm;
  92. advanceToActive(sm);
  93. TEST_ASSERT_EQUAL_INT(static_cast<int>(DeviceState::Active),
  94. static_cast<int>(sm.state()));
  95. kraftort::state::StateInputs in;
  96. in.now_ms = sm.stateSinceMs() + 20;
  97. in.gps_has_fix = false;
  98. sm.update(in);
  99. TEST_ASSERT_EQUAL_INT(static_cast<int>(DeviceState::GpsWait),
  100. static_cast<int>(sm.state()));
  101. TEST_ASSERT_EQUAL_UINT32(in.now_ms, sm.stateSinceMs());
  102. const uint32_t gps_wait_entry = sm.stateSinceMs();
  103. for (uint32_t sample = 0; sample < kraftort::config::kFixStableSamples - 1; ++sample) {
  104. in = {};
  105. in.now_ms = gps_wait_entry + (sample + 1) * 10;
  106. in.gps_has_fix = true;
  107. sm.update(in);
  108. TEST_ASSERT_EQUAL_INT(static_cast<int>(DeviceState::GpsWait),
  109. static_cast<int>(sm.state()));
  110. }
  111. }
  112. int runUnityTests(void) {
  113. UNITY_BEGIN();
  114. RUN_TEST(test_boot_to_ble_and_gps_wait);
  115. RUN_TEST(test_stable_fix_required_for_active);
  116. RUN_TEST(test_long_press_deep_sleep);
  117. RUN_TEST(test_ble_window_timeout_transitions_to_gps_wait);
  118. RUN_TEST(test_active_reverts_to_gps_wait_when_fix_lost);
  119. return UNITY_END();
  120. }
  121. #ifdef ARDUINO
  122. #include <Arduino.h>
  123. void setup() { delay(1000); runUnityTests(); }
  124. void loop() {}
  125. #else
  126. int main() { return runUnityTests(); }
  127. #endif