idle_timeout.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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 =
  24. instance->on_idle_callback(instance->on_idle_callback_context);
  25. } else {
  26. instance->idle_period_sec += IDLE_TIMER_CHECK_PERIODICITY_SEC;
  27. }
  28. }
  29. }
  30. IdleTimeoutContext* idle_timeout_alloc(
  31. uint16_t timeout_sec,
  32. IDLE_TIMEOUT_CALLBACK on_idle_callback,
  33. void* on_idle_callback_context) {
  34. IdleTimeoutContext* instance = malloc(sizeof(IdleTimeoutContext));
  35. if(instance == NULL) return NULL;
  36. instance->timer = furi_timer_alloc(&idle_timer_callback, FuriTimerTypePeriodic, instance);
  37. if(instance->timer == NULL) return NULL;
  38. instance->timeout_sec = timeout_sec;
  39. instance->on_idle_callback = on_idle_callback;
  40. instance->on_idle_callback_context = on_idle_callback_context;
  41. return instance;
  42. }
  43. void idle_timeout_start(IdleTimeoutContext* context) {
  44. furi_timer_start(context->timer, SEC_TO_TICKS(IDLE_TIMER_CHECK_PERIODICITY_SEC));
  45. }
  46. void idle_timeout_stop(IdleTimeoutContext* context) {
  47. furi_timer_stop(context->timer);
  48. }
  49. void idle_timeout_report_activity(IdleTimeoutContext* context) {
  50. context->activity_reported = true;
  51. }
  52. void idle_timeout_free(IdleTimeoutContext* context) {
  53. furi_timer_stop(context->timer);
  54. furi_timer_free(context->timer);
  55. free(context);
  56. }