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

158 lines
5.0 KiB
C
Raw 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 0
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
#define QRCODEBOX_PADDING (GUI_SCREEN_WIDTH / 10) //二维码和背景的间隙
/**
* @brief 创建一个码
* @param[in] frm : 窗体指针
* @param[in] qr_type : 二维码或条形码
* @param[in] max_ch_cnt : 最大字符长度
* @return 返回码
**/
compo_qrcodebox_t *compo_qrcodebox_create(compo_form_t *frm, u8 qr_type, u16 max_ch_cnt)
{
compo_qrcodebox_t *qrcodebox = compo_create(frm, COMPO_TYPE_QRCODEBOX);
//背景
widget_rect_t *bg = widget_rect_create(frm->page);
if (!sco_is_connected() && bt_get_call_indicate() == BT_CALL_IDLE && !bt_get_siri_status()) { //与通话复用dramsco建立时不创建二维码防止8001蓝屏
//二维码/条形码
widget_qrcode_t *qrcode = widget_qrcode_create(frm->page, qr_type, max_ch_cnt);
if (widget_get_parent(qrcode) != frm->page) {
return NULL;
}
widget_set_pos(qrcode, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y);
//白色背景区域
rect_t rect = widget_get_location(qrcode);
widget_set_location(bg, rect.x, rect.y, rect.wid + QRCODEBOX_PADDING, rect.hei + QRCODEBOX_PADDING);
qrcodebox->bg = bg;
qrcodebox->qrcode = qrcode;
} else {
u16 side_len = MIN(GUI_SCREEN_WIDTH / 2, GUI_SCREEN_HEIGHT / 2);
widget_set_location(bg, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, side_len, side_len);
}
return qrcodebox;
}
/**
* @author gzj
* @brief 创建一个码-高度可调整
* @param[in] frm : 窗体指针
* @param[in] qr_type : 二维码或条形码
* @param[in] max_ch_cnt : 最大字符长度
* @return 返回码
**/
compo_qrcodebox_t *compo_qrcodebox_y_create(compo_form_t *frm, u8 qr_type, u16 max_ch_cnt,s16 y)
{
compo_qrcodebox_t *qrcodebox = compo_create(frm, COMPO_TYPE_QRCODEBOX);
//背景
widget_rect_t *bg = widget_rect_create(frm->page_body);
if (!sco_is_connected()) { //与通话复用dramsco建立时不创建二维码防止8001蓝屏
//二维码/条形码
widget_qrcode_t *qrcode = widget_qrcode_create(frm->page_body, qr_type, max_ch_cnt);
widget_set_pos(qrcode, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y + y);
//白色背景区域
rect_t rect = widget_get_location(qrcode);
widget_set_location(bg, rect.x, y, rect.wid + QRCODEBOX_PADDING, rect.hei + QRCODEBOX_PADDING);
qrcodebox->bg = bg;
qrcodebox->qrcode = qrcode;
} else {
u16 side_len = MIN(GUI_SCREEN_WIDTH / 2, GUI_SCREEN_HEIGHT / 2);
widget_set_location(bg, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y + y, side_len, side_len);
}
return qrcodebox;
}
/**
* @brief 设置码的内容
* @param[in] qrcodebox : 码指针
* @param[in] str : 字符内容
**/
void compo_qrcodebox_set(compo_qrcodebox_t *qrcodebox, const char *str)
{
if (qrcodebox->qrcode) {
widget_qrcode_set(qrcodebox->qrcode, str);
}
}
/**
* @brief 设置码的内容
* @param[in] qrcodebox : 码指针
* @param[in] level: 纠错等级
**/
void compo_qrcodebox_set_level(compo_qrcodebox_t *qrcodebox, u8 level)
{
if (qrcodebox->qrcode) {
widget_qrcode_set_level(qrcodebox->qrcode, level);
}
}
/**
* @brief 设置最小单位宽度
* @param[in] qrcodebox : 码指针
* @param[in] bit_wid : 设置像素宽度
**/
void compo_qrcodebox_set_bitwid(compo_qrcodebox_t *qrcodebox, u16 bit_wid)
{
widget_qrcode_t *qrcode = qrcodebox->qrcode;
if (qrcode) {
widget_qrcode_set_bitwid(qrcode, bit_wid);
//更新白色背景区域
rect_t rect = widget_get_location(qrcode);
widget_set_location(qrcodebox->bg, rect.x, rect.y, rect.wid + QRCODEBOX_PADDING, rect.hei + QRCODEBOX_PADDING);
}
}
/**
* @brief 设置最小单位宽度
* @param[in] qrcodebox : 码指针
* @param[in] qr_wid : 设置要显示宽度(高度=宽度)
**/
void compo_qrcodebox_set_bitwid_by_qrwid(compo_qrcodebox_t *qrcodebox, u16 qr_wid)
{
widget_qrcode_t *qrcode = qrcodebox->qrcode;
if (qrcode) {
widget_qrcode_set_bitwid_by_qrwid(qrcode, qr_wid);
//更新白色背景区域
rect_t rect = widget_get_location(qrcode);
widget_set_location(qrcodebox->bg, rect.x, rect.y, rect.wid + QRCODEBOX_PADDING, rect.hei + QRCODEBOX_PADDING);
}
}
void compo_qrcodebox_set_rect_size(compo_qrcodebox_t *qrcodebox, u16 wid, u16 hei)
{
widget_qrcode_t *qrcode = qrcodebox->qrcode;
if (qrcode) {
//更新白色背景区域
rect_t rect = widget_get_location(qrcode);
widget_set_location(qrcodebox->bg, rect.x, rect.y, rect.wid + wid, rect.hei + hei);
}
}
void compo_qrcodebox_pos(compo_qrcodebox_t *qrcodebox, s16 x, s16 y)
{
widget_set_pos(qrcodebox->bg, x, y);
widget_set_pos(qrcodebox->qrcode, x, y);
}