#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