#include "appmgr.h" #include "../Drivers/lcd.h" /* ========================================================================= * 应用管理器内部变量 * ========================================================================= */ // 应用注册表:存储所有已注册的应用 static WristbandApp app_registry[APP_ID_MAX]; // 当前活跃的前台应用指针 static WristbandApp *active_app = NULL; // 默认应用(时钟) #define DEFAULT_APP_ID APP_ID_CLOCK /* ========================================================================= * 应用生命周期辅助函数 * ========================================================================= */ static void AppManager_ExecuteOnStart(WristbandApp *app) { if (app != NULL && app->OnStart != NULL) { app->OnStart(); app->is_active = 1; app->is_running = 1; } } static void AppManager_ExecuteOnClose(WristbandApp *app) { if (app != NULL && app->onClose != NULL) { app->onClose(); app->is_active = 0; app->is_running = 0; } } static void AppManager_ExecuteOnRun(WristbandApp *app) { if (app != NULL && app->onRun != NULL && app->is_running) { // CPU占用控制:记录开始时间 u16 start_tick = ms_tick; // 执行应用的onRun回调 app->onRun(); // 检测执行时间是否超限 u16 elapsed_ticks = ms_tick - start_tick; if (elapsed_ticks > APP_ONRUN_MAX_TICKS) { // 应用执行时间过长,强制标记为非活跃 // 但不直接关闭,允许应用在下一次循环中恢复 app->is_running = 0; } } } static EventResult AppManager_ExecuteOnEvent(WristbandApp *app, SystemEvent evt) { if (app != NULL && app->onEvent != NULL) { return app->onEvent(evt); } return EVENT_IGNORED; } /* ========================================================================= * 应用管理器核心实现 * ========================================================================= */ void AppManager_Init(void) { u8 i; // 初始化所有应用描述符 for (i = 0; i < APP_ID_MAX; i++) { app_registry[i].app_id = (AppID)i; app_registry[i].app_type = APP_TYPE_FOREGROUND; app_registry[i].app_name = "UNREGISTERED"; app_registry[i].OnStart = NULL; app_registry[i].onRun = NULL; app_registry[i].onClose = NULL; app_registry[i].onEvent = NULL; app_registry[i].is_active = 0; app_registry[i].is_running = 0; } // 默认启动时钟应用 active_app = &app_registry[DEFAULT_APP_ID]; AppManager_ExecuteOnStart(active_app); } void AppManager_StartApp(AppID app_id) { // 参数有效性检查 if (app_id >= APP_ID_MAX) { return; } // 获取目标应用指针 WristbandApp *target_app = &app_registry[app_id]; // 目标应用必须是前台应用 if (target_app->app_type != APP_TYPE_FOREGROUND) { return; } // 目标应用必须已注册(有OnStart回调) if (target_app->OnStart == NULL) { return; } // 如果目标应用已经是活跃应用,直接返回 if (active_app == target_app) { return; } // 关闭当前活跃应用 if (active_app != NULL) { AppManager_ExecuteOnClose(active_app); } // 切换到新应用 active_app = target_app; // 启动新应用 AppManager_ExecuteOnStart(active_app); } void AppManager_CloseApp(void) { // 关闭当前活跃应用 if (active_app != NULL) { AppManager_ExecuteOnClose(active_app); active_app = NULL; } // 启动默认应用(时钟) active_app = &app_registry[DEFAULT_APP_ID]; AppManager_ExecuteOnStart(active_app); } AppID AppManager_GetActiveAppID(void) { if (active_app != NULL) { return active_app->app_id; } return DEFAULT_APP_ID; } void AppManager_DispatchEvent(SystemEvent evt) { EventResult result; // 步骤1:优先分发给当前活跃的前台应用 if (active_app != NULL && active_app->is_active) { result = AppManager_ExecuteOnEvent(active_app, evt); // 前台应用已处理,无需继续分发 if (result == EVENT_HANDLED) { return; } } // 步骤2:前台未处理,分发给所有后台应用 // 遍历应用注册表,找到所有后台应用 u8 i; for (i = 0; i < APP_ID_MAX; i++) { WristbandApp *bg_app = &app_registry[i]; // 跳过前台应用和未注册应用 if (bg_app->app_type != APP_TYPE_BACKGROUND || bg_app->onEvent == NULL || !bg_app->is_running) { continue; } // 调用后台应用的事件处理函数 result = AppManager_ExecuteOnEvent(bg_app, evt); // 如果后台应用处理了事件,停止继续分发 if (result == EVENT_HANDLED) { return; } } // 步骤3:所有应用都未处理,事件被丢弃 // 可以在这里添加日志记录(如果需要) } void AppManager_RunActiveApp(void) { // 执行当前活跃应用的onRun回调(带CPU占用控制) if (active_app != NULL && active_app->is_active) { AppManager_ExecuteOnRun(active_app); } } void AppManager_BroadcastToBackground(SystemEvent evt) { // 广播事件给所有后台应用 u8 i; for (i = 0; i < APP_ID_MAX; i++) { WristbandApp *bg_app = &app_registry[i]; // 仅发送给后台应用 if (bg_app->app_type == APP_TYPE_BACKGROUND && bg_app->onEvent != NULL && bg_app->is_running) { AppManager_ExecuteOnEvent(bg_app, evt); } } } /* ========================================================================= * 应用注册接口(供各应用模块调用) * ========================================================================= */ void AppManager_RegisterApp(AppID app_id, AppType app_type, char *app_name, AppStartFunc on_start, AppRunFunc on_run, AppCloseFunc on_close, AppEventFunc on_event) { if (app_id >= APP_ID_MAX) { return; } WristbandApp *app = &app_registry[app_id]; app->app_type = app_type; app->app_name = app_name; app->OnStart = on_start; app->onRun = on_run; app->onClose = on_close; app->onEvent = on_event; // 后台应用默认处于运行状态 if (app_type == APP_TYPE_BACKGROUND) { app->is_running = 1; } }