mcu_ab568x/app/platform/gui/components/compo_kaleidoscope.h
2025-05-30 18:03:10 +08:00

287 lines
9.0 KiB
C

#ifndef _COMPO_KALEIDOSCOPE_H
#define _COMPO_KALEIDOSCOPE_H
#define KALE_FUNC_LAYER 4 //任务层数 一层 KALE_CIR_ICON_NUM 个任务
#define KALE_CIR_ICON_NUM 8 //一圈图标个数
#define KALE_CIR_ANGLE_DEV_OI 450 //图标角度偏差
#define KALE_CIR_ANGLE_DEV 225 //内外圈角度偏差
#define KALE_CIR_ANGLE_COM (KALE_CIR_ANGLE_DEV_OI - KALE_CIR_ANGLE_DEV) //互补角
enum KALE_CIR_IDX{
KALE_CIR_0,
KALE_CIR_1,
KALE_CIR_MAX,
};
enum KALE_CTL {
KALE_CTL_NULL,
KALE_CTL_SWITCH,
KALE_CTL_ROTATE,
KALE_CTL_SWAP,
};
enum KALE_SWAP {
KALE_SWAP_NULL,
KALE_SWAP_LAST,
KALE_SWAP_NEXT,
};
enum KALE_FUNC_LAY {
KALE_FUNC_LAY_0,
KALE_FUNC_LAY_1,
KALE_FUNC_LAY_2,
KALE_FUNC_LAY_MAX,
};
typedef struct compo_kale_axis_t_ {
int16_t x;
int16_t y;
}compo_kale_axis_t;
typedef struct compo_kale_func_t_ {
widget_icon_t *widget;
u8 func_sta;
}compo_kale_func_t;
typedef struct compo_kale_icon_t_ {
compo_kale_func_t fsub;
int16_t angle;
}compo_kale_icon_t;
typedef struct compo_kale_cir_t_ {
compo_kale_icon_t icon[KALE_CIR_ICON_NUM];
union {
struct {
u32 r : 10;
u32 size : 10;
u32 lay : 2;
};
};
}compo_kale_cir_t;
typedef struct compo_kale_org_func_t_ {
compo_kale_func_t fsub[KALE_CIR_ICON_NUM];
}compo_kale_org_func_t;
typedef struct compo_kale_ctl_t_ {
union {
struct {
u32 adm : 1; //入场动画
u32 sta : 3; //状态
u32 swap : 3; //切换
u32 oidx : 2; //当前外圈编号
u32 iidx : 2; //当前内圈编号
u32 org_or : 10; //初始外圈半径
u32 org_ir : 10; //初始内圈半径
u32 osize : 10; //外圈图标尺寸
u32 isize : 10; //内圈图标尺寸
};
};
}compo_kale_ctl_t;
typedef struct compo_kaleidoscope_t_ {
COMPO_STRUCT_COMMON;
widget_page_t *page;
widget_icon_t *sel_icon; //选择的ICON
s16 sel_idx; //选择的idx
u8 total_cnt; //图标个数
u8 focus_icon_idx; //焦点的图标编号
compo_kale_axis_t cen; //中心点
compo_kale_ctl_t ctl; //切换控制
compo_kale_cir_t dcir[KALE_CIR_MAX]; //显示图标集合
compo_kale_org_func_t ofunc[KALE_FUNC_LAYER]; //任务图标集合
// u8 idx_time; //加入时分秒针元素
// widget_page_t *page_time;
// widget_image_t *hour;
// widget_image_t *min;
// widget_image_t *sec;
}compo_kaleidoscope_t;
typedef struct menu_kale_item_t_ {
u32 res_addr;
u8 func_sta;
} menu_kale_item_t;
/**
* @brief 变量范围限制
* 注:超出最小最大范围 返回最小或最大值
* @param[in] val : 变量
* @param[in] min : 最小值
* @param[in] max : 最大值
* @return 当前值或最大最小值
**/
int limit_range(int val, int min, int max);
/**
* @brief 变量环形递增
* @param[in] val : 变量地址
* @param[in] min : 最小值
* @param[in] max : 最大值
* @return 递增值
**/
void cycle_plus(u8 *val, u8 min, u8 max);
/**
* @brief 变量环形递减
* @param[in] val : 变量地址
* @param[in] min : 最小值
* @param[in] max : 最大值
* @return 递减值
**/
void cycle_sub(u8 *val, u8 min, u8 max);
/**
* @brief 创建一个万花筒组件
* @param[in] frm : 窗体指针
* @return 返回万花筒图标集合指针
**/
compo_kaleidoscope_t *compo_kaleidoscope_create(compo_form_t *frm);
/**
* @brief 万花筒图标角度初始化
* @param[in] kale : 万花筒图标集合指针
**/
void compo_kaleidoscope_angle_init(compo_kaleidoscope_t *kale);
/**
* @brief 初始化万花筒内外圈层
* 注:根据屏幕大小自适应内外圈层半径
* @param[in] kale : 万花筒图标集合指针
* @param[in] dc_width : 屏幕宽度
* @param[in] dc_height : 屏幕高度
* @param[in] osize : 外圈图标尺寸
* @param[in] isize : 内圈图标尺寸
* @param[in] edge_space : 离屏幕边缘距离
* @param[in] icon_space : 内外圈图标间距离
**/
void compo_kaleidoscope_init(compo_kaleidoscope_t *kale, s16 dc_width, s16 dc_height, u16 osize, u16 isize, s16 edge_space, s16 icon_space);
/**
* @brief 往万花筒图标集合里面添加图标
* @param[in] kale : 万花筒图标集合指针
* @param[in] item : 图标集指针
* @param[in] item_cnt : 图标集总数
**/
void compo_kaleidoscope_icon_add(compo_kaleidoscope_t *kale, menu_kale_item_t const *item, int item_cnt);
/**
* @brief 根据变化半径,万花筒内外圈半径更新
* @param[in] kale : 万花筒图标集合指针
* @param[in] dr : 变化半径
**/
void compo_kaleidoscope_update_r(compo_kaleidoscope_t *kale, s16 dr);
/**
* @brief 根据内外圈半径,获取当前圈层的图标尺寸
* @param[in] kale : 万花筒图标集合指针
* @param[in] r : 内外圈半径
* @return 返回当前圈层图标尺寸
**/
u16 compo_kaleidoscope_size_from_r(compo_kaleidoscope_t *kale, u16 r);
/**
* @brief 万花筒图标尺寸更新
* @param[in] kale : 万花筒图标集合指针
**/
void compo_kaleidoscope_update_size(compo_kaleidoscope_t *kale);
/**
* @brief 根据变化角度,万花筒旋转角度更新
* @param[in] kale : 万花筒图标集合指针
* @param[in] dr : 变化半径
**/
void compo_kaleidoscope_update_angle(compo_kaleidoscope_t *kale, int16_t dangle);
/**
* @brief 万花筒上下层任务切换设置
* @param[in] kale : 万花筒图标集合指针
* @param[in] msg : 消息
**/
void compo_kaleidoscope_ctl_swap_set(compo_kaleidoscope_t *kale, size_msg_t msg);
/**
* @brief 万花筒上下层任务信息更替
* @param[in] kale : 万花筒图标集合指针
* @param[in] swap : 上下切换
* @return true 切换成功
* false 切换失败
**/
bool compo_kaleidoscope_ctl_swap_pro(compo_kaleidoscope_t *kale, u8 swap);
/**
* @brief 万花筒上下层任务切换处理
* @param[in] kale : 万花筒图标集合指针
* @param[in] sta : 切换状态
**/
void compo_kaleidoscope_ctl_switch_pro(compo_kaleidoscope_t *kale, u8 sta);
/**
* @brief 万花筒上下层任务切换处KICK
* @param[in] kale : 万花筒图标集合指针
* @param[in] msg : 消息
**/
void compo_kaleidoscope_ctl_switch_kick(compo_kaleidoscope_t *kale, size_msg_t msg);
/**
* @brief 万花筒入场动画KICK
* 注:从表盘页面进入万花筒,使能入场动画
* 注:从子任务返回不具备入场动画,并返回子任务所在的层级
* @param[in] kale : 万花筒图标集合指针
**/
void compo_kaleidoscope_adm_animation_kick(compo_kaleidoscope_t *kale);
/**
* @brief 万花筒入场动画
* 注:从表盘页面进入万花筒,使能入场动画
* 注:从子任务返回不具备入场动画,并返回子任务所在的层级
* @param[in] kale : 万花筒图标集合指针
**/
void compo_kaleidoscope_adm_animation_pro(compo_kaleidoscope_t *kale);
/**
* @brief 万花筒图标可视化设置
* 注:显示内外圈层所在任务层图标
* @param[in] kale : 万花筒图标集合指针
**/
void compo_kaleidoscope_set_vis(compo_kaleidoscope_t *kale);
/**
* @brief 万花筒切换动画
* @param[in] kale : 万花筒图标集合指针
* @param[in] expire : 刷新间隔
* @param[in] dr : 相对半径
* @param[in] dangle : 旋转角度
**/
void compo_kaleidoscope_switch_animation(compo_kaleidoscope_t *kale, u32 expire, s16 dr, int16_t dangle);
/**
* @brief 更新图标集合Widget
* @param[in] kale : 图标集指针
**/
void compo_kale_update(compo_kaleidoscope_t *kale);
/**
* @brief 按坐标选择图标
* @param[in] kale : 图标集指针
* @param[in] x : x轴坐标
* @param[in] y : y轴坐标
* @return 返回图标索引
**/
int compo_kale_select(compo_kaleidoscope_t *kale, int x, int y);
/**
* @brief 按索引选择图标
* @param[in] kale : 图标集指针
* @param[in] idx : 编号索引
* @return 返回图标指针
**/
widget_icon_t *compo_kale_select_byidx(compo_kaleidoscope_t *kale, int idx);
/**
* @brief 按索引设置图标集合焦点坐标 并设置当前任务圈层
* @param[in] kale : 图标集指针
* @param[in] idx : 编号索引
**/
void compo_kale_set_focus_byidx(compo_kaleidoscope_t *kale, int idx);
#endif