idle_timeout.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "idle_timeout.h"
  2. #include <stdlib.h>
  3. #include <furi/core/timer.h>
  4. #define IDLE_TIMER_CHECK_PERIODICITY_SEC (1)
  5. #define SEC_TO_TICKS(sec) ((sec) * 1000)
  6. struct IdleTimeoutContext {
  7. FuriTimer* timer;
  8. bool activity_reported;
  9. void* on_idle_callback_context;
  10. IDLE_TIMEOUT_CALLBACK on_idle_callback;
  11. uint16_t timeout_sec;
  12. uint16_t idle_period_sec;
  13. bool idle_handled;
  14. };
  15. static void idle_timer_callback(void* context) {
  16. IdleTimeoutContext* instance = context;
  17. if (instance->activity_reported) {
  18. instance->idle_period_sec = 0;
  19. instance->idle_handled = false;
  20. instance->activity_reported = false;
  21. } else if (!instance->idle_handled) {
  22. if (instance->idle_period_sec >= instance->timeout_sec) {
  23. instance->idle_handled = instance->on_idle_callback(instance->on_idle_callback_context);
  24. } else {
  25. instance->idle_period_sec += IDLE_TIMER_CHECK_PERIODICITY_SEC;
  26. }
  27. }
  28. }
  29. IdleTimeoutContext* idle_timeout_alloc(uint16_t timeout_sec, IDLE_TIMEOUT_CALLBACK on_idle_callback, void* on_idle_callback_context) {
  30. IdleTimeoutContext* instance = malloc(sizeof(IdleTimeoutContext));
  31. if (instance == NULL) return NULL;
  32. instance->timer = furi_timer_alloc(&idle_timer_callback, FuriTimerTypePeriodic, instance);
  33. if (instance->timer == NULL) return NULL;
  34. instance->timeout_sec = timeout_sec;
  35. instance->on_idle_callback = on_idle_callback;
  36. instance->on_idle_callback_context = on_idle_callback_context;
  37. return instance;
  38. }
  39. void idle_timeout_start(IdleTimeoutContext* context) {
  40. furi_timer_start(context->timer, SEC_TO_TICKS(IDLE_TIMER_CHECK_PERIODICITY_SEC));
  41. }
  42. void idle_timeout_stop(IdleTimeoutContext* context) {
  43. furi_timer_stop(context->timer);
  44. }
  45. void idle_timeout_report_activity(IdleTimeoutContext* context) {
  46. context->activity_reported = true;
  47. }
  48. void idle_timeout_free(IdleTimeoutContext* context) {
  49. furi_timer_stop(context->timer);
  50. furi_timer_free(context->timer);
  51. free(context);
  52. }