idle_timeout.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. bool is_paused;
  15. };
  16. static void idle_timer_callback(void* context) {
  17. IdleTimeoutContext* instance = context;
  18. if(instance->is_paused) return;
  19. if(instance->activity_reported) {
  20. instance->idle_period_sec = 0;
  21. instance->idle_handled = false;
  22. instance->activity_reported = false;
  23. } else if(!instance->idle_handled) {
  24. if(instance->idle_period_sec >= instance->timeout_sec) {
  25. instance->idle_handled =
  26. instance->on_idle_callback(instance->on_idle_callback_context);
  27. } else {
  28. instance->idle_period_sec += IDLE_TIMER_CHECK_PERIODICITY_SEC;
  29. }
  30. }
  31. }
  32. IdleTimeoutContext* idle_timeout_alloc(
  33. uint16_t timeout_sec,
  34. IDLE_TIMEOUT_CALLBACK on_idle_callback,
  35. void* on_idle_callback_context) {
  36. IdleTimeoutContext* instance = malloc(sizeof(IdleTimeoutContext));
  37. if(instance == NULL) return NULL;
  38. instance->timer = furi_timer_alloc(&idle_timer_callback, FuriTimerTypePeriodic, instance);
  39. if(instance->timer == NULL) return NULL;
  40. instance->timeout_sec = timeout_sec;
  41. instance->on_idle_callback = on_idle_callback;
  42. instance->on_idle_callback_context = on_idle_callback_context;
  43. instance->is_paused = false;
  44. return instance;
  45. }
  46. void idle_timeout_start(IdleTimeoutContext* context) {
  47. furi_timer_start(context->timer, SEC_TO_TICKS(IDLE_TIMER_CHECK_PERIODICITY_SEC));
  48. }
  49. void idle_timeout_stop(IdleTimeoutContext* context) {
  50. furi_timer_stop(context->timer);
  51. }
  52. void idle_timeout_pause(IdleTimeoutContext* context) {
  53. context->is_paused = true;
  54. }
  55. void idle_timeout_resume(IdleTimeoutContext* context) {
  56. context->is_paused = false;
  57. }
  58. void idle_timeout_report_activity(IdleTimeoutContext* context) {
  59. context->activity_reported = true;
  60. }
  61. void idle_timeout_free(IdleTimeoutContext* context) {
  62. furi_timer_stop(context->timer);
  63. furi_timer_free(context->timer);
  64. free(context);
  65. }