Files
utun2/tools/chatgui-android/libutun_lite/standby.h
T

80 lines
4.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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 */