/* * standby.h — режим standby с duty-cycle (активный/неактивный интервалы) * * Для chatgui-android: когда приложение в фоне, вместо постоянной работы * узел периодически просыпается: ACTIVE (X сек) → SLEEP (Y сек) → ACTIVE ... * * Потребители периодической работы используют standby_wait(): колбэк * срабатывает на старте следующего активного интервала, а при выходе из * standby (приложение вернулось в форграунд) — немедленно. */ #ifndef STANDBY_H #define STANDBY_H #include "u_async.h" #ifdef __cplusplus extern "C" { #endif struct UTUN_INSTANCE; /* Привязать модуль к uasync. Вызывается после каждого uasync_create(). */ void standby_init(struct UASYNC* ua); /* Отмена таймеров и освобождение пула (без вызова колбэков). */ void standby_deinit(void); /* Включить/выключить standby-режим. Логирует вход/выход (GENERAL info) * и вызывает switch-callback. Флаг дублируется в inst->standby_enabled. */ void standby_set_enabled(struct UTUN_INSTANCE* inst, int enabled); int standby_is_enabled(void); /* Колбэк, вызываемый при каждом переключении standby-режима. */ void standby_set_switch_callback(void (*cb)(int enabled, void* arg), void* arg); /* Сколько TB спать сейчас (0 = активный интервал или standby выключен). */ int standby_get_sleep_tb(void); /* Сколько TB осталось активного режима (0 = спим или standby выключен). */ int standby_get_active_remaining_tb(void); /* Полная длительность SLEEP-фазы duty-cycle (timebase 0.1мс). */ int standby_get_sleep_duration_tb(void); /* Время до гарантированного пробуждения (timebase 0.1мс): остаток SLEEP, либо * остаток ACTIVE + полная длительность SLEEP. 0 = standby выключен. */ int standby_get_wake_deadline_tb(void); /* Период keepalive в спячке (мс), из настройки standby_keepalive_ms. */ int standby_get_keepalive_ms(void); /* Колбэк смены фазы duty-cycle: sleeping=1 — вошли в SLEEP, 0 — вышли в ACTIVE. */ void standby_set_phase_callback(void (*cb)(int sleeping, void* arg), void* arg); /* Ждёт до начала следующего активного интервала (как uasync timeout). * При выходе из standby таймер отменяется и cb вызывается немедленно. * Возвращает handle для standby_wait_cancel(). */ void* standby_wait(void* arg, void (*cb)(void* arg)); void standby_wait_cancel(void* handle); /* Уведомление о внешней сетевой активности (Android ConnectivityManager). * В фазе SLEEP после min_sleep пробуждает досрочно; иначе игнорируется. * Вызывается на uasync-потоке. */ void standby_notify_network_activity(void); /* Диагностика: входящий пакет во время SLEEP-фазы (фазу НЕ меняет). * kind — транспорт/тип пакета (строка), who — идентификатор отправителя. */ void standby_log_rx(const char* kind, const char* who); /* Переопределить интервалы (мс), минуя chat_setting. Для тестов. * active_ms/sleep_ms <= 0 → вернуться к chat_setting. * min_sleep_ms может быть 0 (реагировать на сетевую активность сразу). */ void standby_set_intervals_ms(int active_ms, int sleep_ms, int min_sleep_ms); #ifdef __cplusplus } #endif #endif /* STANDBY_H */