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

278 lines
9.4 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.

#ifndef _COMPO_RINGS_H
#define _COMPO_RINGS_H
#define RINGS_MAX_ICON_CNT 16 //环形组件最多挂载图标个数
#define RINGS_GET_ANGLE(angle) ((angle >= 0) ? (angle % 3600) : (angle % 3600 + 3600)) //度数转换
#define RINGS_GET_ICON_REL_X(r, angle) (muls_shift16(r, SIN(RINGS_GET_ANGLE(angle)))) //根据角度获取相对X
#define RINGS_GET_ICON_REL_Y(r, angle) (-muls_shift16(r, COS(RINGS_GET_ANGLE(angle)))) //根据角度获取相对Y
enum COMPO_RINGS_QUADRANT {
QUADRANT_NULL,
QUADRANT_1,
QUADRANT_2,
QUADRANT_3,
QUADRANT_4,
};
typedef struct compo_rings_item_t_ {
u32 res_addr; //图标
u8 func_sta; //任务序号
} compo_rings_item_t;
typedef struct compo_rings_ele_t_ {
int16_t x; //环形中心点X坐标
int16_t y; //环形中心点Y坐标
uint16_t r; //环形半径
int16_t div; //图标角度间隔
int32_t angle; //起始角度
uint8_t loop_icon_num; //环形图标数 loop_icon_num + other_icon_num <= RINGS_MAX_ICON_CNT
uint8_t other_icon_num; //其他图标数 loop_icon_num + other_icon_num <= RINGS_MAX_ICON_CNT
uint8_t item_num; //资源总数
compo_rings_item_t const *item; //资源地址及任务序号
}compo_rings_ele_t;
typedef struct compo_rings_icon_t_ {
widget_icon_t *widget;
uint16_t size;
int32_t angle;
u8 idx;
}compo_rings_icon_t;
typedef struct compo_rings_touch_t_ {
int32_t angle;
u8 quad;
}compo_rings_touch_t;
typedef struct compo_rings_sel_t_ {
widget_icon_t *icon; //选择的ICON
s16 idx; //选择的IDX
}compo_rings_sel_t;
typedef struct compo_rings_t_ {
COMPO_STRUCT_COMMON;
widget_page_t *page;
u8 loop_icon_cnt; //环形图标个数
u8 other_icon_cnt; //其他图标个数
compo_rings_sel_t sel;
compo_rings_ele_t ele;
compo_rings_icon_t icon[RINGS_MAX_ICON_CNT];
compo_rings_touch_t pre;
compo_rings_touch_t cur;
}compo_rings_t;
#define COS_SCALE 10000
#define ACOS(value) myacos(value)
/**
* @brief 二分法查找最接近的余弦值
* 注放大系数10000
* @param[in] value : 余弦值 * 放大系数
* @return 返回对应的弧度 精度为1° 0~180°
**/
int binarysearch(int value);
/**
* @brief acos函数
* 注放大系数10000
* @param[in] value : 余弦值 * 放大系数
* @return 返回对应的弧度 精度为1° 0~180°
**/
int myacos(int value);
/**
* @brief 弧度计算
* 注:根据当前点和中心点确定余弦值并计算弧度值 精度为1°
* @param[in] cx :中心点X
* @param[in] cy :中心点Y
* @param[in] x :当前点X
* @param[in] y :当前点Y
* @return 返回对应的弧度 精度为1° 0~180°
**/
int myrad(int cx, int cy, int x, int y);
/**
* @brief 创建一个环形组件
* @param[in] frm : 窗体指针
* @return 返回环形组件指针
**/
compo_rings_t *compo_rings_create(compo_form_t *frm);
/**
* @brief 初始一个环形组件
* @param[in] rings : 环形组件指针
* @param[in] ele : 初始元素指针
* @return 无
**/
void compo_rings_set(compo_rings_t *rings, compo_rings_ele_t *ele);
/**
* @brief 往环形图标集上面添加图标
* @param[in] rings : 环形组件指针
* @param[in] res_addr : 图标资源地址
* @param[in] idx : 图标任务编号
* @param[in] loop : 是否为环形图标
* @return 图标信息指针
**/
compo_rings_icon_t *compo_rings_icon_add(compo_rings_t *rings, u32 res_addr, int idx, bool loop);
/**
* @brief 返回当前点相对于中心点坐标正Y轴的角度
* @param[in] rings : 环形组件指针
* @param[in] touch : 触摸信息指针
* @param[in] cx : 中心点X
* @param[in] cy : 中心点Y
* @param[in] x : 当前点X
* @param[in] y : 当前点Y
* @return 相对角度
**/
int32_t compo_rings_touch_angle(compo_rings_t *rings, compo_rings_touch_t *touch, s16 cx, s16 cy, s16 x, s16 y);
/**
* @brief 设置滑动前的触摸信息
* @param[in] rings : 环形组件指针
* @param[in] cx : 中心点X
* @param[in] cy : 中心点Y
* @param[in] x : 当前点X
* @param[in] y : 当前点Y
* @return 无
**/
void compo_rings_touch_angle_pre(compo_rings_t *rings, s16 cx, s16 cy, s16 x, s16 y);
/**
* @brief 获取滑动差量角度
* @param[in] rings : 环形组件指针
* @param[in] cx : 中心点X
* @param[in] cy : 中心点Y
* @param[in] x : 当前点X
* @param[in] y : 当前点Y
* @return 差量角度
* 正值:正向顺时针;
* 负值:逆向逆时针;
**/
int32_t compo_rings_touch_angle_diff(compo_rings_t *rings, s16 cx, s16 cy, s16 x, s16 y);
/**
* @brief 查找环形图标集上的图标角度
* @param[in] rings : 环形组件指针
* @param[in] id : compo_rings_icon_t icon[RINGS_MAX_ICON_CNT] 数组下标
* @return 角度
**/
int32_t compo_rings_loop_icon_find_angle(compo_rings_t *rings, int id);
/**
* @brief 查找环形图标集上的图标任务编号
* @param[in] rings : 环形组件指针
* @param[in] id : compo_rings_icon_t icon[RINGS_MAX_ICON_CNT] 数组下标
* @return 任务编号
**/
u8 compo_rings_loop_icon_find_idx(compo_rings_t *rings, u8 id);
/**
* @brief 查找环形图标集上的图标尺寸
* @param[in] rings : 环形组件指针
* @param[in] id : compo_rings_icon_t icon[RINGS_MAX_ICON_CNT] 数组下标
* @return 图标尺寸
**/
u8 compo_rings_loop_icon_find_size(compo_rings_t *rings, u8 id);
/**
* @brief 设置环形图标集上的图标偏移角度
* @param[in] rings : 环形组件指针
* @param[in] diff_angle: 差量角度
* @param[in] id : compo_rings_icon_t icon[RINGS_MAX_ICON_CNT] 数组下标
* @return 无
**/
void compo_rings_loop_icon_set_angle_diff(compo_rings_t *rings, int32_t diff_angle, int id);
/**
* @brief 设置环形图标集上的图标绝对角度
* @param[in] rings : 环形组件指针
* @param[in] angle : 绝对角度
* @param[in] id : compo_rings_icon_t icon[RINGS_MAX_ICON_CNT] 数组下标
* @return 无
**/
void compo_rings_set_angle(compo_rings_t *rings, int32_t angle, int id);
/**
* @brief 设置环形图标集上的图标尺寸
* @param[in] rings : 环形组件指针
* @param[in] size : 尺寸
* @param[in] id : compo_rings_icon_t icon[RINGS_MAX_ICON_CNT] 数组下标
* @return 无
**/
void compo_rings_set_size(compo_rings_t *rings, uint16_t size, int id);
/**
* @brief 设置环形图标集上的图标任务编号
* @param[in] rings : 环形组件指针
* @param[in] idx : 任务编号
* @param[in] id : compo_rings_icon_t icon[RINGS_MAX_ICON_CNT] 数组下标
* @return 无
**/
void compo_rings_set_uidx(compo_rings_t *rings, u8 idx, int id);
/**
* @brief 设置环形图标集上的图标资源地址
* @param[in] rings : 环形组件指针
* @param[in] res_addr : 资源地址
* @param[in] id : compo_rings_icon_t icon[RINGS_MAX_ICON_CNT] 数组下标
* @return 无
**/
void compo_rings_set_res(compo_rings_t *rings, u32 res_addr, int id);
/**
* @brief 设置环形图标集上的图标任务编号
* @param[in] rings : 环形组件指针
* @param[in] uidx : 变更图标任务编号
* @param[in] idx : 原始图标任务编号
* @return 无
**/
void compo_rings_set_uidx_from_idx(compo_rings_t *rings, int uidx, int idx);
/**
* @brief 设置环形图标集上的图标资源地址
* @param[in] rings : 环形组件指针
* @param[in] res_addr : 资源地址
* @param[in] idx : 图标任务编号
* @return 无
**/
void compo_rings_set_res_from_idx(compo_rings_t *rings, u32 res_addr, int idx);
/**
* @brief 设置环形图标集上的图标位置信息
* @param[in] rings : 环形组件指针
* @param[in] x : X
* @param[in] y : Y
* @param[in] width : W
* @param[in] height : H
* @param[in] idx : 图标任务编号
* @return 无
**/
void compo_rings_set_location(compo_rings_t *rings, s16 x, s16 y, s16 width, s16 height, int idx);
/**
* @brief 更新图标集合Widget
* @param[in] rings : 图标集指针
**/
void compo_rings_update_loop(compo_rings_t *rings);
/**
* @brief 按坐标选择图标
* @param[in] rings : 图标集指针
* @param[in] x : x轴坐标
* @param[in] y : y轴坐标
* @return 返回图标索引
**/
compo_rings_sel_t *compo_rings_select(compo_rings_t *rings, int x, int y);
/**
* @brief 按索引选择图标
* @param[in] rings : 图标集指针
* @param[in] idx : 编号索引
* @return 返回图标指针
**/
widget_icon_t *compo_rings_select_byidx(compo_rings_t *rings, int idx);
#endif