25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.4 KiB

  1. #include "Core.h"
  2. #include "Config.h"
  3. #include "Flash.h"
  4. #define LOGGER_NAME "Core"
  5. using namespace utils;
  6. namespace core {
  7. uint16_t sleepTime = SLEEP_DEFAULT_TIME_SECONDS;;
  8. uint8_t increaseInARow = 0;
  9. void main() {
  10. PositionEntryMetadata metadata;
  11. if (positions::acquire(metadata)) {
  12. positions::appendLast(metadata);
  13. updateSleepTime(gps::getVelocity());
  14. }
  15. positions::doBackup();
  16. mainunit::deepSleep(sleepTime);
  17. }
  18. void updateSleepTime(uint8_t velocity) {
  19. uint16_t result = computeSleepTime(velocity);
  20. if (result > sleepTime) {
  21. increaseInARow++;
  22. if (increaseInARow < SLEEP_DEFAULT_INCREASE_THRESHOLD) return;
  23. }
  24. else increaseInARow = 0;
  25. sleepTime = result;
  26. NOTICE_FORMAT("updateSleepTime", "%dkmh => %d seconds", velocity, sleepTime);
  27. }
  28. uint16_t computeSleepTime(uint8_t velocity) {
  29. uint16_t result;
  30. uint16_t currentTime = 0xFFFF;
  31. if (rtc::isAccurate()) {
  32. tmElements_t time;
  33. rtc::getTime(time);
  34. currentTime = SLEEP_TIMING_TIME(time.Hour, time.Minute);
  35. }
  36. for (uint8_t i = 0; i < flash::getArraySize(config::defaultSleepTimings); i++) {
  37. sleepTimings_t timing;
  38. flash::read(&config::defaultSleepTimings[i], timing);
  39. if (velocity > timing.speed) continue;
  40. if (currentTime != 0xFFFF && (currentTime < timing.timeMin || currentTime > timing.timeMax)) continue;
  41. result = timing.seconds;
  42. break;
  43. }
  44. VERBOSE_FORMAT("computeSleepTime", "%d,%d", velocity, result);
  45. return result;
  46. }
  47. }