mcu_ab568x/app/projects/AB5682C_240/functions/func_manage.c
2025-05-30 18:03:10 +08:00

356 lines
12 KiB
C
Raw Permalink 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.

#include "include.h"
#define TRACE_EN 1
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
/**
* -------------function item infomation-----------------
任务项id、图标资源、标题序号信息
**/
typedef struct {
u8 func_sta;
u32 res_addr;
u32 str_idx;
} func_item_info_t;
#define FUNC_ITEM_CNT (sizeof(func_item_tbl) / sizeof(func_item_tbl[0]))
const static func_item_info_t func_item_tbl[] = {
{FUNC_HEARTRATE, UI_BUF_ICON_HEART_RATE_BIN, STR_HEART_RATE}, //心率
{FUNC_BT, UI_BUF_ICON_MUSIC_BIN, STR_MUSIC}, //蓝牙播放器(控制手机音乐)
{FUNC_ALARM_CLOCK, UI_BUF_ICON_ALARM_CLOCK_BIN, STR_ALARM_CLOCK}, //闹钟
{FUNC_BLOOD_OXYGEN, UI_BUF_ICON_BLOOD_OXYGEN_BIN, STR_BLOOD_OXYGEN}, //血氧
// {FUNC_BLOODSUGAR, UI_BUF_ICON_BLOODSUGAR_BIN, STR_BLOOD_SUGAR}, //血糖
{FUNC_BLOOD_PRESSURE, UI_BUF_ICON_BLOOD_PRESSURE_BIN, STR_BLOOD_PRESSURE}, //血压
// {FUNC_BREATHE, UI_BUF_ICON_BREATHE_BIN, STR_BREATHE}, //呼吸
{FUNC_CALCULATOR, UI_BUF_ICON_CALCULATOR_BIN, STR_CALCULATOR}, //计算器
{FUNC_CAMERA, UI_BUF_ICON_CAMERA_BIN, STR_CAMERA}, //相机
// {FUNC_LIGHT, UI_BUF_ICON_LIGHT_BIN, STR_DISPLAY_AND_LIGHT}, //亮度调节
{FUNC_TIMER, UI_BUF_ICON_TIMER_BIN, STR_TIMER}, //定时器
{FUNC_SLEEP, UI_BUF_ICON_SLEEP_BIN, STR_SLEEP}, //睡眠
{FUNC_STOPWATCH, UI_BUF_ICON_STOPWATCH_BIN, STR_STOP_WATCH}, //秒表
{FUNC_WEATHER, UI_BUF_ICON_WEATHER_BIN, STR_WEATHER}, //天气
{FUNC_GAME, UI_BUF_ICON_GAME_BIN, STR_BIRDIE_FLIGHT}, //游戏
// {FUNC_ALTITUDE, UI_BUF_ICON_ALTITUDE_BIN, STR_ALTITUDE}, //海拔
// {FUNC_MAP, UI_BUF_ICON_MAP_BIN, STR_MAP}, //地图
{FUNC_MESSAGE, UI_BUF_ICON_MESSAGE_BIN, STR_MESSAGE}, //消息
{FUNC_SCAN, UI_BUF_ICON_SCAN_BIN, STR_SETTING_QR_CODE}, //扫一扫
{FUNC_VOICE, UI_BUF_ICON_VOICE_BIN, STR_VOICE}, //语音助手
// {FUNC_ALIPAY, UI_BUF_ICON_ALIPAY_BIN, STR_ALIPAY}, //支付宝
// {FUNC_COMPASS, UI_BUF_ICON_COMPASS_BIN, STR_COMPASS}, //指南针
{FUNC_SPORT, UI_BUF_ICON_SPORT_BIN, STR_SPORTS}, //运动
{FUNC_CALL, UI_BUF_ICON_CALL_BIN, STR_PHONE}, //电话
{FUNC_FINDPHONE, UI_BUF_ICON_FINDPHONE_BIN, STR_FIND_PHONE}, //寻找手机
{FUNC_CALENDAER, UI_BUF_ICON_CALENDAR_BIN, STR_CALENDAR}, //日历
// {FUNC_VOLUME, UI_BUF_ICON_VOLUME_BIN, STR_VOLUME}, //音量
{FUNC_ACTIVITY, UI_BUF_ICON_ACTIVITY_BIN, STR_ACTIVITY_RECORD}, //活动记录
{FUNC_FLASHLIGHT, UI_BUF_ICON_FLASHLIGHT_BIN, STR_FLASHLIGHT}, //手电筒
{FUNC_SETTING, UI_BUF_ICON_SETTING_BIN, STR_SETTING}, //设置
{FUNC_LANGUAGE, UI_BUF_ICON_LANGUAGE_BIN, STR_SETTING_LANGUAGE}, //设置--语言
{FUNC_RESTART, UI_BUF_ICON_RESTART_BIN, STR_SETTING_RESTART}, //重启
// {FUNC_RSTFY, UI_BUF_ICON_RESTORE_FACTORY_BIN, STR_SETTING_RSTFY}, //设置--恢复出厂
{FUNC_OFF, UI_BUF_ICON_OFF_BIN, STR_SETTING_OFF}, //关机
};
/**
* @brief 获取任务图标资源地址
* @param[in] func_sta : 任务id
* @return 资源地址
**/
u32 func_get_icon_addr(u8 func_sta) {
for (u8 i = 0; i < FUNC_ITEM_CNT; i++) {
if (func_item_tbl[i].func_sta == func_sta) {
return func_item_tbl[i].res_addr;
}
}
return 0;
}
/**
* @brief 获取任务标题字符串序号
* @param[in] func_sta : 任务id
* @return 标题字符串序号
**/
u32 func_get_str_idx(u8 func_sta) {
for (u8 i = 0; i < FUNC_ITEM_CNT; i++) {
if (func_item_tbl[i].func_sta == func_sta) {
return func_item_tbl[i].str_idx;
}
}
return 0;
}
/**
* -------------gui stack manage-----------------
根据界面跳转的复杂程度是否入栈管理
**/
typedef struct {
u8 task_tbl[TASK_STACK_MAX];
u8 num;
} task_stack_t;
static task_stack_t task_stack;
/**
* @brief 堆栈初始化
**/
void task_stack_init(void)
{
task_stack.num = 0;
}
/**
* @brief 入栈
目前首先入栈的是时钟表盘
* @param[in] val : 入栈的值
**/
void task_stack_push(u8 val)
{
printf("%s:[", __func__);
for (u8 i = 0; i < task_stack.num; i++) { //有重复值直接回退到第一次入栈处
if (task_stack.task_tbl[i] == val) {
task_stack.num = i + 1;
printf("%d]<--[%d]\n", val, val);
return;
} else {
printf("%d ", task_stack.task_tbl[i]);
}
}
if (task_stack.num < TASK_STACK_MAX) {
task_stack.task_tbl[task_stack.num] = val;
task_stack.num++;
printf("%d]<--[%d]\n", val, val);
} else {
printf("]<--[%d]\n", val, val);
}
}
/**
* @brief 出栈
* @return 出栈后,处于栈顶的值
**/
u8 task_stack_pop(void)
{
printf("%s", __func__);
TRACE(":[");
u8 val = 0;
#if TRACE_EN
if (task_stack.num > 0) {
for (u8 i = 0; i < (task_stack.num - 1); i++) {
if (i == task_stack.num - 2) {
val = task_stack.task_tbl[i];
TRACE("%d", val);
} else {
TRACE("%d ", task_stack.task_tbl[i]);
}
}
task_stack.num--;
TRACE("]-->[%d]\n", task_stack.task_tbl[task_stack.num]);
} else {
TRACE("]-->[]\n");
}
#else
if (task_stack.num > 0) {
task_stack.num--;
if (task_stack.num) {
val = task_stack.task_tbl[task_stack.num - 1];
}
}
printf("[top:%d]\n", val);
#endif // TRACE_EN
return val;
}
/**
* @brief 获取栈顶
* @return 栈顶的值
**/
u8 gui_get_stack_top(void)
{
if (task_stack.num > 0) {
return task_stack.task_tbl[task_stack.num - 1];
}
return 0;
}
/**
* -----------------latest tasks manage-----------------
历史任务管理
**/
typedef struct {
u8 task_tbl[LATEST_TASK_MAX];
u8 num;
} latest_list_t;
static latest_list_t latest_list;
//最近任务允许记录的id
#define LATEST_ALLOWED_CNT (sizeof(latest_allowed_id) / sizeof(latest_allowed_id[0]))
const static u8 latest_allowed_id[] = {
FUNC_HEARTRATE, //心率
FUNC_BT, //蓝牙播放器(控制手机音乐)
FUNC_ALARM_CLOCK, //闹钟
FUNC_BLOOD_OXYGEN, //血氧
FUNC_BLOODSUGAR, //血糖
FUNC_BLOOD_PRESSURE, //血压
FUNC_BREATHE, //呼吸
FUNC_CALCULATOR, //计算器
FUNC_CAMERA, //相机
FUNC_LIGHT, //亮度调节
FUNC_TIMER, //定时器
FUNC_SLEEP, //睡眠
FUNC_STOPWATCH, //秒表
FUNC_WEATHER, //天气
FUNC_GAME, //游戏
FUNC_ALTITUDE, //海拔
FUNC_MAP, //地图
FUNC_MESSAGE, //消息
FUNC_SCAN, //扫一扫
FUNC_VOICE, //语音助手
FUNC_ALIPAY, //支付宝
FUNC_COMPASS, //指南针
FUNC_SPORT, //运动
FUNC_CALL, //电话
FUNC_FINDPHONE, //寻找手机
FUNC_CALENDAER, //日历
// FUNC_VOLUME, //音量
FUNC_ACTIVITY, //活动记录
FUNC_FLASHLIGHT, //手电筒
FUNC_SETTING, //设置
FUNC_LANGUAGE, //设置--语言
FUNC_RESTART, //重启
FUNC_RSTFY, //设置--恢复出厂
FUNC_OFF, //关机
};
/**
* @brief 最近任务列表初始化
**/
void latest_task_init(void)
{
latest_list.num = 0;
}
/**
* @brief 获取记录的最近任务个数
* @return 最近任务个数
**/
u8 latest_task_count(void)
{
return latest_list.num;
}
/**
* @brief 插入最近任务到列表头部,尾部元素先入先出
注意idx=0为最新
* @param[in] func_sta : 任务id
**/
void latest_task_add(u8 func_sta)
{
u8 i;
u8 id = FUNC_NULL;
u8 tail = latest_list.num;
for (i = 0; i < tail; i++) { //查重
if (func_sta == latest_list.task_tbl[i]) {
while (i > 0) {
latest_list.task_tbl[i] = latest_list.task_tbl[i - 1];
i--;
}
latest_list.task_tbl[0] = func_sta;
TRACE("%s[%d]\n", __func__, func_sta);
return;
}
}
for (i = 0; i < LATEST_ALLOWED_CNT; i++) { //过滤
if (func_sta == latest_allowed_id[i]) {
id = func_sta;
break;
}
}
if (id != FUNC_NULL) {
if (latest_list.num >= LATEST_TASK_MAX) { //添加
tail = LATEST_TASK_MAX - 1;
}
for ( ; tail > 0; tail--) {
latest_list.task_tbl[tail] = latest_list.task_tbl[tail - 1];
}
latest_list.task_tbl[0] = func_sta;
latest_list.num = MIN(latest_list.num + 1, LATEST_TASK_MAX);
#if (TRACE_EN == 0)
printf("%s[sta:%d num:%d]\n", __func__, func_sta, latest_list.num);
#endif
}
#if TRACE_EN
TRACE("%s[%d]:", __func__, func_sta);
if (latest_list.num) {
for (i = 0; i < (latest_list.num - 1); i++) {
TRACE("%d,", latest_list.task_tbl[i]);
}
TRACE("%d", latest_list.task_tbl[i]);
}
TRACE("\n");
#endif
}
/**
* @brief 通过下标0最新删除最近任务列表中的任务
* @param[in] idx : 任务在列表中的序号
**/
void latest_task_del(u8 idx)
{
u8 i = idx;
if (i < latest_list.num) {
latest_list.num--;
for ( ; i < latest_list.num; i++) {
latest_list.task_tbl[i] = latest_list.task_tbl[i + 1];
}
#if (TRACE_EN == 0)
printf("%s[idx:%d num:%d]\n", __func__, idx, latest_list.num);
#endif
}
#if TRACE_EN
TRACE("%s[%d]:", __func__, idx);
if (latest_list.num) {
for (i = 0; i < (latest_list.num - 1); i++) {
TRACE("%d,", latest_list.task_tbl[i]);
}
TRACE("%d", latest_list.task_tbl[i]);
}
TRACE("\n");
#endif // TRACE_EN
}
/**
* @brief 通过下标0最新获取最近任务列表中的任务id
* @param[in] idx : 任务在列表中的序号
* @return 任务idl
**/
u8 latest_task_get(u8 idx) {
if (idx < latest_list.num) {
return latest_list.task_tbl[idx];
}
return FUNC_NULL;
}
/**
* @brief 最近任务列表中查找任务
* @param[in] func_sta : 任务id
* @return 任务在列表中的序号(没有则返回-1
**/
s8 latest_task_find(u8 func_sta) {
for (u8 i = 0; i < (latest_list.num); i++) {
if (latest_list.task_tbl[i] == func_sta) {
return i;
}
}
return -1;
}