80 lines
4.4 KiB
C
80 lines
4.4 KiB
C
/*
|
||
* 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);
|
||
|
||
/* Применяет режим после подготовки фазового таймера, затем вызывает switch-callback.
|
||
* При выключении будит ожидающих после switch-callback. Повторная команда ничего не перезапускает.
|
||
* Вызывается из utun_set_client_activity в uasync-потоке; 0 — успех, <0 — режим не изменён. */
|
||
int 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).
|
||
* В SLEEP ждёт фазового события после анонса ACTIVE; при выходе 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 */
|