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

1442 lines
50 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"
#include "func.h"
#include "func_alipay.h"
#include "app_variable.h"
#if SECURITY_PAY_EN
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
enum
{
COMPO_ID_RATE = 1,
// 按钮
COMPO_ID_BTN_PAYCODE, // 付款码
COMPO_ID_BTN_SETTING, // 设置
COMPO_ID_BTN_HELP, // 帮助
COMPO_ID_BTN_PAY_CODE, // 付款码
COMPO_ID_BTN_UNBIND, // 解除绑定
COMPO_ID_BTN_UNBIND_YES, // 解除绑定-确认
COMPO_ID_BTN_UNBIND_NO, // 解除绑定-取消
COMPO_ID_BTN_QUIT_BIND_YES, // 退出绑定-确认
COMPO_ID_BTN_QUIT_BIND_NO, // 退出绑定-取消
COMPO_ID_BTN_CONFIRM, // 确认
COMPO_ID_PIC_BINDING, // 绑定动画
};
enum
{
ALIPAY_PAGE_LOGO = 1,
ALIPAY_PAGE_SCAN,
ALIPAY_PAGE_BINDING,
ALIPAY_PAGE_BIND_SUCC,
ALIPAY_PAGE_BIND_FAIL,
ALIPAY_PAGE_OPTION_LIST,
ALIPAY_PAGE_QRCODE,
ALIPAY_PAGE_BARCODE,
ALIPAY_PAGE_UNBIND,
ALIPAY_PAGE_QUIT_BIND,
ALIPAY_PAGE_HELP,
ALIPAY_PAGE_UNBIND_CONFIRM,
ALIPAY_PAGE_UNBIND_FINISH,
};
typedef struct f_alipay_t_
{
uint8_t page;
uint8_t last_page;
uint8_t logo_display_cnt;
uint8_t binding_time_cnt;
uint8_t bind_fail_time_cnt;
uint8_t bind_success_time_cnt;
uint8_t bind_code_refresh_time_cnt;
uint8_t binding_flag;
uint8_t light_level_temp;
uint32_t binding_anim_idx;
uint32_t binding_anim_tick;
uint32_t task_run_tick;
} f_alipay_t;
extern struct Node *csi_head;
void alipay_binding_detect(void);
static bool func_alipay_hfp_sta_get(void)
{
if (sys_cb.sco_state == false && bt_cb.number_sta == false && !bt_is_ring() && bt_get_call_indicate() == BT_CALL_IDLE) {
return false;
} else {
return true;
}
}
// 创建支付宝logo窗体
compo_form_t *func_alipay_form_logo_create(void)
{
// 新建窗体
compo_form_t *frm = compo_form_create(true);
// 新建蓝色背景
compo_shape_t *rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, COLOR_BLACK);
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, GUI_SCREEN_WIDTH, GUI_SCREEN_HEIGHT);
compo_shape_set_radius(rect, 20);
// 新建图像
compo_picturebox_t *pic = compo_picturebox_create(frm, UI_BUF_ALIPAY_ICON_BIN);
compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 23);
compo_picturebox_t *pic_text = NULL;
#if defined(__LANGUAGE_SM_CHINESE__)
if (tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese)
pic_text = compo_picturebox_create(frm, UI_BUF_ALIPAY_ALIPAY_CH_BIN);
else
#endif
pic_text = compo_picturebox_create(frm, UI_BUF_ALIPAY_ALIPAY_EN_BIN);
compo_picturebox_set_pos(pic_text, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y + 40);
return frm;
}
// 创建支付宝窗体
compo_form_t *func_alipay_form_scan_create(void)
{
int binding_str_len = 256;
char *binding_str = func_zalloc(binding_str_len);
memset(binding_str, 0, binding_str_len);
u8 res = alipay_get_binding_code(binding_str, &binding_str_len);
printf("res:%d, binding_str: %s\n", res, binding_str);
// 新建窗体
compo_form_t *frm = compo_form_create(true);
compo_shape_t *shape_bg = compo_radius_shape_create(frm, COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE, 57);
compo_shape_set_color(shape_bg, COLOR_WHITE);
compo_shape_set_location(shape_bg, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, GUI_SCREEN_WIDTH, GUI_SCREEN_HEIGHT);
compo_textbox_t *txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 113, 220, 30);
compo_textbox_set_forecolor(txt, COLOR_BLACK);
compo_textbox_set(txt, i18n[STR_ALIPAY_BIND_TIP]);
if (!func_alipay_hfp_sta_get()) {
compo_qrcodebox_t *qrcode = compo_qrcodebox_create(frm, QRCODE_TYPE_2D, 200);
compo_qrcodebox_set(qrcode, (char *)binding_str);
compo_qrcodebox_pos(qrcode, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y + 15);
compo_qrcodebox_set_bitwid_by_qrwid(qrcode, 150);
}
func_free(binding_str);
return frm;
}
// 创建支付宝窗体
compo_form_t *func_alipay_form_binding_create(void)
{
// 新建窗体
compo_form_t *frm = compo_form_create(true);
compo_picturebox_t *banding_anim = compo_picturebox_create(frm, UI_BUF_ALIPAY_BINDING_ANIM_BIN);
compo_setid(banding_anim, COMPO_ID_PIC_BINDING);
compo_picturebox_cut(banding_anim, 0, ALIPAY_ANIM_NUM_MAX);
compo_picturebox_set_pos(banding_anim, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 28);
// compo_arc_t *arc = compo_arc_create(frm);
// compo_setid(arc, COMPO_ID_RATE);
// compo_arc_set_alpha(arc, 0xff, 0);
// compo_arc_set_location(arc, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 10, 180, 180);
// compo_arc_set_width(arc, 7);
// compo_arc_set_rotation(arc, 0);
// compo_arc_set_angles(arc, 0, 3600);
// compo_arc_set_color(arc, COLOR_BLUE, COLOR_WHITE);
// compo_arc_set_value(arc, 250);
compo_textbox_t *txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y + 48, 220, 30);
compo_textbox_set(txt, i18n[STR_BINDING]);
return frm;
}
// 创建支付宝绑定状态窗体
compo_form_t *func_alipay_form_bind_complete_create(void)
{
f_alipay_t *f_alipay = (f_alipay_t *)func_cb.f_cb;
if (!f_alipay)
{
return NULL;
}
// 新建窗体
compo_form_t *frm = compo_form_create(true);
// 新建图像
compo_picturebox_t *pic = compo_picturebox_create(frm, UI_BUF_ALIPAY_COMPLETE_BIN);
compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 30);
// 新建文本
compo_textbox_t *txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 200, 220, 30);
compo_textbox_set(txt, i18n[STR_BIND_SUCCESS]);
return frm;
}
// 创建支付宝绑定状态窗体
compo_form_t *func_alipay_form_bind_fail_create(void)
{
f_alipay_t *f_alipay = (f_alipay_t *)func_cb.f_cb;
if (!f_alipay)
{
return NULL;
}
// 新建窗体
compo_form_t *frm = compo_form_create(true);
// 新建图像
compo_picturebox_t *pic = compo_picturebox_create(frm, UI_BUF_ALIPAY_BIND_STA_BIN);
compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 30);
// 新建文本
compo_textbox_t *txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 200, 220, 30);
compo_textbox_set(txt, i18n[STR_BIND_FAILED]);
return frm;
}
// 创建支付宝选项列表窗体
compo_form_t *func_alipay_form_option_list_create(void)
{
// 新建窗体
compo_form_t *frm = compo_form_create(true);
// 新建按钮
compo_button_t *btn = compo_button_create_by_image(frm, UI_BUF_COMMON_BG_BIN);
compo_setid(btn, COMPO_ID_BTN_PAYCODE);
compo_button_set_pos(btn, GUI_SCREEN_CENTER_X, 58);
btn = compo_button_create_by_image(frm, UI_BUF_COMMON_BG_BIN);
compo_setid(btn, COMPO_ID_BTN_SETTING);
compo_button_set_pos(btn, GUI_SCREEN_CENTER_X, 133);
btn = compo_button_create_by_image(frm, UI_BUF_COMMON_BG_BIN);
compo_setid(btn, COMPO_ID_BTN_HELP);
compo_button_set_pos(btn, GUI_SCREEN_CENTER_X, 208);
// 新建图像
compo_picturebox_t *pic = compo_picturebox_create(frm, UI_BUF_ALIPAY_PAYMENT_BIN);
compo_picturebox_set_pos(pic, 40, 58);
pic = compo_picturebox_create(frm, UI_BUF_ALIPAY_SET_BIN);
compo_picturebox_set_pos(pic, 40, 133);
pic = compo_picturebox_create(frm, UI_BUF_ALIPAY_HELP_BIN);
compo_picturebox_set_pos(pic, 40, 208);
// 新建文本
compo_textbox_t *txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_align_center(txt, false);
compo_textbox_set_location(txt, 70, 58 - widget_text_get_height() / 2, 220, 70);
compo_textbox_set(txt, i18n[STR_PAYCODE]);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_align_center(txt, false);
compo_textbox_set_location(txt, 70, 133 - widget_text_get_height() / 2, 220, 70);
compo_textbox_set(txt, i18n[STR_SETTING]);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_align_center(txt, false);
compo_textbox_set_location(txt, 70, 208 - widget_text_get_height() / 2, 220, 70);
compo_textbox_set(txt, i18n[STR_HELP]);
return frm;
}
// 创建支付宝二维码窗体
compo_form_t *func_alipay_form_qrcode_create(void)
{
// 新建窗体
compo_form_t *frm = compo_form_create(true);
// 新建蓝色背景
compo_shape_t *rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, make_color(51, 121, 246));
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, GUI_SCREEN_WIDTH, GUI_SCREEN_HEIGHT);
compo_shape_set_radius(rect, 20);
u32 paycode_len = 20;
u8 *paycode = func_zalloc(paycode_len);
memset(paycode, 0, paycode_len);
u8 res = alipay_get_paycode(paycode, &paycode_len);
u8 retry_cnt = 0;
while (res != ALIPAY_RV_OK)
{
res = alipay_get_paycode(paycode, &paycode_len);
retry_cnt++;
if (retry_cnt > ALIPAY_API_RETRY_CNT)
{
retry_cnt = 0;
printf("alipay_get_paycode err\n");
break;
}
}
printf("res:%d, paycode: %s\n", res, paycode);
#ifndef ALIPAY_PAYMENT_CODE_VERTICAL
// 页码示意条
rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, COLOR_WHITE);
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X - 8, 15, 10, 10);
widget_rect_set_radius(rect->rect, 5);
rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, make_color(0x8B, 0xbb, 0xff));
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X + 8, 15, 10, 10);
widget_rect_set_radius(rect->rect, 5);
// 新建二维码
if (!func_alipay_hfp_sta_get()) {
compo_qrcodebox_t *qrbox = compo_qrcodebox_create(frm, QRCODE_TYPE_2D, 64);
compo_qrcodebox_set(qrbox, (char *)paycode);
compo_qrcodebox_set_bitwid_by_qrwid(qrbox, 140);
}
compo_button_t *btn = compo_button_create(frm);
compo_setid(btn, COMPO_ID_BTN_PAY_CODE);
compo_button_set_location(btn, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, 140, 140);
// 新建文本
compo_textbox_t *txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 40, 220, 30);
compo_textbox_set(txt, i18n[STR_PAYCODE]);
#else
// 页码示意条
rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, make_color(0x8B, 0xbb, 0xff));
compo_shape_set_location(rect, 15, GUI_SCREEN_CENTER_Y - 8, 10, 10);
widget_rect_set_radius(rect->rect, 5);
rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, COLOR_WHITE);
compo_shape_set_location(rect, 15, GUI_SCREEN_CENTER_Y + 8, 10, 10);
widget_rect_set_radius(rect->rect, 5);
compo_picturebox_t *pic_title = compo_picturebox_create(frm, UI_BUF_ALIPAY_PAY_TEXT_BIN);
compo_picturebox_set_pos(pic_title, 32, GUI_SCREEN_CENTER_Y);
compo_picturebox_cut(pic_title, tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese ? 0 : 1, 2);
// 新建二维码
if (!func_alipay_hfp_sta_get()) {
compo_qrcodebox_t *qrbox = compo_qrcodebox_create(frm, QRCODE_TYPE_2D, 64);
compo_qrcodebox_set(qrbox, (char *)paycode);
compo_qrcodebox_set_bitwid_by_qrwid(qrbox, 140);
compo_qrcodebox_pos(qrbox, GUI_SCREEN_CENTER_X + 18, GUI_SCREEN_CENTER_Y);
}
compo_button_t *btn = compo_button_create(frm);
compo_setid(btn, COMPO_ID_BTN_PAY_CODE);
compo_button_set_location(btn, GUI_SCREEN_CENTER_X + 18, GUI_SCREEN_CENTER_Y, 140, 140);
#endif
func_free(paycode);
return frm;
}
// 创建支付宝条形码窗体
compo_form_t *func_alipay_form_barcode_create(void)
{
// char text_buf[TEXTBOX_TEXT_BUF_LEN] = {0};
// 新建窗体
compo_form_t *frm = compo_form_create(true);
// 新建蓝色背景
compo_shape_t *rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, make_color(51, 121, 246));
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, GUI_SCREEN_WIDTH, GUI_SCREEN_HEIGHT);
compo_shape_set_radius(rect, 20);
u32 paycode_len = 20;
u8 *paycode = func_zalloc(paycode_len);
memset(paycode, 0, paycode_len);
u8 res = alipay_get_paycode(paycode, &paycode_len);
u8 retry_cnt = 0;
while (res != ALIPAY_RV_OK)
{
res = alipay_get_paycode(paycode, &paycode_len);
retry_cnt++;
if (retry_cnt > ALIPAY_API_RETRY_CNT)
{
retry_cnt = 0;
printf("alipay_get_paycode err\n");
break;
}
}
u8 pay_num1[5] = {0};
u8 pay_num2[5] = {0};
u8 pay_num3[5] = {0};
u8 pay_num4[7] = {0};
memcpy(pay_num1, paycode, 4);
memcpy(pay_num2, &paycode[4], 4);
memcpy(pay_num3, &paycode[8], 4);
memcpy(pay_num4, &paycode[12], paycode_len - 12);
printf("res:%d, paycode: %s\n", res, paycode);
#ifndef ALIPAY_PAYMENT_CODE_VERTICAL
// 页码示意条
rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, make_color(0x8B, 0xbb, 0xff));
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X - 8, 15, 10, 10);
widget_rect_set_radius(rect->rect, 5);
rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, COLOR_WHITE);
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X + 8, 15, 10, 10);
widget_rect_set_radius(rect->rect, 5);
// 新建二维码
if (!func_alipay_hfp_sta_get()) {
compo_qrcodebox_t *qrbox = compo_qrcodebox_create(frm, QRCODE_TYPE_HORIZONTAL, 64);
compo_qrcodebox_set(qrbox, (char *)paycode);
compo_qrcodebox_set_bitwid(qrbox, 10);
compo_qrcodebox_set_bitwid_by_qrwid(qrbox, 200);
}
compo_button_t *btn = compo_button_create(frm);
compo_setid(btn, COMPO_ID_BTN_PAY_CODE);
compo_button_set_location(btn, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, 240, 140);
// 新建文本
compo_textbox_t *txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 40, 220, 30);
compo_textbox_set(txt, i18n[STR_PAYCODE]);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y + 70, 240, 30);
sprintf(text_buf, "%s %s %s %s", (char *)pay_num1, (char *)pay_num2, (char *)pay_num3, (char *)pay_num4);
compo_textbox_set(txt, text_buf);
#else
// 页码示意条
rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, COLOR_WHITE);
compo_shape_set_location(rect, 15, GUI_SCREEN_CENTER_Y - 8, 10, 10);
widget_rect_set_radius(rect->rect, 5);
rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, make_color(0x8B, 0xbb, 0xff));
compo_shape_set_location(rect, 15, GUI_SCREEN_CENTER_Y + 8, 10, 10);
widget_rect_set_radius(rect->rect, 5);
compo_picturebox_t *pic_title = compo_picturebox_create(frm, UI_BUF_ALIPAY_PAY_TEXT_BIN);
compo_picturebox_set_pos(pic_title, 32, GUI_SCREEN_CENTER_Y);
compo_picturebox_cut(pic_title, tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese ? 0 : 1, 2);
// 新建二维码
if (!func_alipay_hfp_sta_get()) {
compo_qrcodebox_t *qrbox = compo_qrcodebox_create(frm, QRCODE_TYPE_VERTICAL, 64);
compo_qrcodebox_set(qrbox, (char *)paycode);
compo_qrcodebox_set_bitwid(qrbox, 10);
compo_qrcodebox_set_bitwid_by_qrwid(qrbox, 200);
compo_qrcodebox_pos(qrbox, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y);
compo_qrcodebox_set_rect_size(qrbox, GUI_SCREEN_WIDTH / 20, GUI_SCREEN_WIDTH / 10);
}
compo_button_t *btn = compo_button_create(frm);
compo_setid(btn, COMPO_ID_BTN_PAY_CODE);
compo_button_set_location(btn, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, 140, 240);
u8 space_cnt = 0;
u16 img_hei, img_y;
for (int i = 0; i < paycode_len; i++)
{
if (i % 4 == 0 && i <= 12) space_cnt++;
compo_picturebox_t *pic_num = compo_picturebox_create(frm, UI_BUF_ALIPAY_NUMBER_BIN);
area_t area = widget_image_get_size(pic_num->img);
img_hei = area.hei / 10;
img_y = (GUI_SCREEN_HEIGHT - (img_hei * (paycode_len + 3))) / 2;
img_y = (GUI_SCREEN_HEIGHT - img_y) + (img_hei / 2);
compo_picturebox_set_pos(pic_num, GUI_SCREEN_CENTER_X + 56, img_y - (img_hei * (i + space_cnt)));
compo_picturebox_cut(pic_num, paycode[i] - 0x30, 10);
}
#endif
func_free(paycode);
return frm;
}
// 创建支付宝解绑(设置)窗体
compo_form_t *func_alipay_form_unbind_create(void)
{
// 新建窗体
compo_form_t *frm = compo_form_create(true);
// 新建按钮蓝色背景
compo_shape_t *rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, make_color(51, 121, 246));
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X, GUI_SCREEN_HEIGHT - 60, 150, 50);
widget_rect_set_radius(rect->rect, 20);
// 新建按钮
compo_button_t *btn = compo_button_create(frm);
compo_setid(btn, COMPO_ID_BTN_UNBIND);
compo_button_set_location(btn, GUI_SCREEN_CENTER_X, GUI_SCREEN_HEIGHT - 60, 150, 50);
u8 res;
u32 id_len = 128;
u8 *id = func_zalloc(id_len);
memset(id, 0, id_len);
u32 name_len = 128;
u8 *name = func_zalloc(name_len);
char *affirm_name = func_zalloc(name_len);
memset(name, 0, name_len);
memset(affirm_name, 0, name_len);
res = alipay_get_logon_ID(id, &id_len);
u8 retry_cnt = 0;
while (res != ALIPAY_RV_OK)
{
res = alipay_get_logon_ID(id, &id_len);
retry_cnt++;
if (retry_cnt > ALIPAY_API_RETRY_CNT)
{
retry_cnt = 0;
printf("alipay_get_logon_ID err\n");
break;
}
}
printf("alipay_get_logon_ID: %d: %s\n", res, id);
res = alipay_get_nick_name(name, &name_len);
retry_cnt = 0;
while (res != ALIPAY_RV_OK)
{
res = alipay_get_nick_name(name, &name_len);
retry_cnt++;
if (retry_cnt > ALIPAY_API_RETRY_CNT)
{
retry_cnt = 0;
printf("alipay_get_nick_name err\n");
break;
}
}
UTF8_replace_emojis((char *)name, affirm_name);
printf("alipay_get_logon_name: %d: %s\n", res, name);
// 新建文本
compo_textbox_t *txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 30, 220, 30);
compo_textbox_set(txt, i18n[STR_SETTING]);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_20_BIN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 35, 220, 30);
compo_textbox_set_forecolor(txt, COLOR_GRAY);
compo_textbox_set(txt, affirm_name);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, 220, 30);
compo_textbox_set(txt, (char *)id);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, GUI_SCREEN_HEIGHT - 60, 130, 30);
compo_textbox_set(txt, i18n[STR_UNBIND]);
func_free(id);
func_free(name);
func_free(affirm_name);
return frm;
}
// 创建支付宝二维码窗体
compo_form_t *func_alipay_form_help_create(void)
{
// 新建窗体
compo_form_t *frm = compo_form_create(true);
// 新建蓝色背景
compo_shape_t *rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, make_color(51, 121, 246));
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, GUI_SCREEN_WIDTH, GUI_SCREEN_HEIGHT);
compo_shape_set_radius(rect, 20);
u32 len_aid_code = 256;
char *aid_code = func_zalloc(len_aid_code);
memset(aid_code, 0, len_aid_code);
u8 res = alipay_get_aid_code(aid_code, &len_aid_code, true);
u8 retry_cnt = 0;
while (res != ALIPAY_RV_OK)
{
res = alipay_get_aid_code(aid_code, &len_aid_code, true);
retry_cnt++;
if (retry_cnt > ALIPAY_API_RETRY_CNT)
{
retry_cnt = 0;
printf("alipay_get_paycode err\n");
break;
}
}
printf("res:%d, aid_code: %s, len_aid_code: %d\n", res, aid_code, len_aid_code);
// 新建二维码
if (!func_alipay_hfp_sta_get()) {
compo_qrcodebox_t *qrbox = compo_qrcodebox_create(frm, QRCODE_TYPE_2D, 200);
compo_qrcodebox_set(qrbox, (char *)aid_code);
compo_qrcodebox_set_bitwid_by_qrwid(qrbox, 140);
compo_qrcodebox_pos(qrbox, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y + 10);
}
// 新建文本
compo_textbox_t *txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 40, 220, 30);
compo_textbox_set(txt, i18n[STR_HELP_TILE]);
func_free(aid_code);
return frm;
}
// 创建支付宝确认解绑窗体
compo_form_t *func_alipay_form_unbind_confirm_create(void)
{
// 新建窗体
compo_form_t *frm = compo_form_create(true);
// 新建按钮背景
compo_shape_t *rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE); // 白
compo_shape_set_color(rect, COLOR_WHITE);
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X - 60, GUI_SCREEN_HEIGHT - 60, 100, 60);
widget_rect_set_radius(rect->rect, 30);
rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE); // 蓝
compo_shape_set_color(rect, make_color(51, 121, 246));
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X + 60, GUI_SCREEN_HEIGHT - 60, 100, 60);
widget_rect_set_radius(rect->rect, 30);
// 新建按钮
compo_button_t *btn = compo_button_create(frm); // 确认
compo_setid(btn, COMPO_ID_BTN_UNBIND_YES);
compo_button_set_location(btn, GUI_SCREEN_CENTER_X - 60, GUI_SCREEN_HEIGHT - 60, 100, 60);
btn = compo_button_create(frm); // 取消
compo_setid(btn, COMPO_ID_BTN_UNBIND_NO);
compo_button_set_location(btn, GUI_SCREEN_CENTER_X + 60, GUI_SCREEN_HEIGHT - 60, 100, 60);
// 新建文本
compo_textbox_t *txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 40, 220, 30);
compo_textbox_set(txt, i18n[STR_UNBIND]);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 20, 220, 118);
compo_textbox_set_multiline(txt, true);
compo_textbox_set(txt, i18n[STR_ALIPAY_UNBIND_TIP]);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X - 60, GUI_SCREEN_HEIGHT - 60, 80, 30);
compo_textbox_set_forecolor(txt, COLOR_BLACK);
compo_textbox_set(txt, i18n[STR_CONFIMR]);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X + 60, GUI_SCREEN_HEIGHT - 60, 80, 30);
compo_textbox_set(txt, i18n[STR_CANCEL]);
return frm;
}
// 创建支付宝解绑完成窗体
compo_form_t *func_alipay_form_unbind_finish_create(void)
{
// 新建窗体
compo_form_t *frm = compo_form_create(true);
// 新建按钮蓝色背景
compo_shape_t *rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_shape_set_color(rect, make_color(51, 121, 246));
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X, GUI_SCREEN_HEIGHT - 60, 150, 60);
widget_rect_set_radius(rect->rect, 20);
// 新建按钮
compo_button_t *btn = compo_button_create(frm);
compo_setid(btn, COMPO_ID_BTN_CONFIRM);
compo_button_set_location(btn, GUI_SCREEN_CENTER_X, GUI_SCREEN_HEIGHT - 60, 150, 60);
// 新建文本
compo_textbox_t *txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 40, 220, 30);
compo_textbox_set(txt, i18n[STR_UNBIND_SUCCEED]);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN * 2);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 20, 220, 118);
compo_textbox_set_multiline(txt, true);
compo_textbox_set(txt, i18n[STR_ALIPAY_UNBIND_TIP2]);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, GUI_SCREEN_HEIGHT - 60, 130, 30);
compo_textbox_set(txt, i18n[STR_CONFIMR]);
return frm;
}
// 创建支付宝退出绑定窗体
compo_form_t *func_alipay_form_quit_bind_create(void)
{
// 新建窗体
compo_form_t *frm = compo_form_create(true);
// 新建按钮背景
compo_shape_t *rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE); // 白
compo_shape_set_color(rect, COLOR_WHITE);
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X - 60, GUI_SCREEN_HEIGHT - 60, 100, 60);
widget_rect_set_radius(rect->rect, 30);
rect = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE); // 蓝
compo_shape_set_color(rect, make_color(51, 121, 246));
compo_shape_set_location(rect, GUI_SCREEN_CENTER_X + 60, GUI_SCREEN_HEIGHT - 60, 100, 60);
widget_rect_set_radius(rect->rect, 30);
// 新建按钮
compo_button_t *btn = compo_button_create(frm); // 确认
compo_setid(btn, COMPO_ID_BTN_QUIT_BIND_YES);
compo_button_set_location(btn, GUI_SCREEN_CENTER_X - 60, GUI_SCREEN_HEIGHT - 60, 100, 60);
btn = compo_button_create(frm); // 取消
compo_setid(btn, COMPO_ID_BTN_QUIT_BIND_NO);
compo_button_set_location(btn, GUI_SCREEN_CENTER_X + 60, GUI_SCREEN_HEIGHT - 60, 100, 60);
// 新建文本
compo_textbox_t *txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 40, 220, 30);
compo_textbox_set(txt, i18n[STR_ALIPAY_QUIT_BINDING]);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 20, 220, 118);
compo_textbox_set_multiline(txt, true);
compo_textbox_set(txt, i18n[STR_ALIPAY_QUIT_BINDING_TIP]);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X - 60, GUI_SCREEN_HEIGHT - 60, 80, 30);
compo_textbox_set_forecolor(txt, COLOR_BLACK);
compo_textbox_set(txt, i18n[STR_ALIPAY_QUIT]);
txt = compo_textbox_create(frm, TEXTBOX_TEXT_BUF_LEN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X + 60, GUI_SCREEN_HEIGHT - 60, 80, 30);
compo_textbox_set(txt, i18n[STR_ALIPAY_GO_BIND]);
return frm;
}
extern u32 __alipay_start, __alipay_size;
AT(.text.func.alipay)
void func_alipay_prepare(void)
{
printf("__alipay_start: 0x%x, size: 0x%x\n", &__alipay_start, &__alipay_size);
memset(&__alipay_start, 0, (u32)&__alipay_size);
#if (SECURITY_PAY_VENDOR == SECURITY_VENDOR_HS)
HS_IIC_Init();
#endif
#if (SECURITY_PAY_VENDOR == SECURITY_VENDOR_HED)
uint8_t *alipay_com_outbuf = func_zalloc(200);
uint32_t alipay_outlen = 0;
hed_rst_init();
csi_exit_lpm(0);
HED_IIC_Init();
api_connect(alipay_com_outbuf, &alipay_outlen);
printf("api_connect atr:\n");
print_r(alipay_com_outbuf, alipay_outlen);
func_free(alipay_com_outbuf);
#endif
u8 sta = alipay_pre_init();
printf("alipay_pre_init: %d\n", sta);
if (sta != ALIPAY_RV_OK)
{
func_back_to();
}
sta = alipay_get_binding_status();
printf("alipay_get_binding_status: %d\n", sta);
if (sta == true)
{
SysVariable.alipay_binding_flag = true;
func_alipay_form_create_by_page(ALIPAY_PAGE_OPTION_LIST);
}
else
{
SysVariable.alipay_binding_flag = false;
func_alipay_form_create_by_page(ALIPAY_PAGE_SCAN);
}
printf("func_alipay_prepare finish\n");
}
// AT(.text.func.alipay)
// u8 get_alipay_band(void)
// {
// printf("__alipay_start: 0x%x, size: 0x%x\n", &__alipay_start, &__alipay_size);
// memset(&__alipay_start, 0, (u32)&__alipay_size);
// #if (SECURITY_PAY_VENDOR == SECURITY_VENDOR_HS)
// HS_IIC_Init();
// #endif
// #if (SECURITY_PAY_VENDOR == SECURITY_VENDOR_HED)
// uint8_t *alipay_com_outbuf = func_zalloc(200);
// uint32_t alipay_outlen = 0;
// hed_rst_init();
// csi_exit_lpm(0);
// HED_IIC_Init();
// api_connect(alipay_com_outbuf, &alipay_outlen);
// printf("api_connect atr:\n");
// print_r(alipay_com_outbuf, alipay_outlen);
// func_free(alipay_com_outbuf);
// #endif
// u8 sta = alipay_pre_init();
// printf("alipay_pre_init: %d\n", sta);
// sta = alipay_get_binding_status();
// printf("alipay_get_binding_status: %d\n", sta);
// printf("func_alipay_prepare finish\n");
// return sta;
// }
void func_alipay_init(void)
{
f_alipay_t *f_alipay = (f_alipay_t *)func_cb.f_cb;
f_alipay->page = ALIPAY_PAGE_LOGO;
f_alipay->task_run_tick = tick_get();
f_alipay->light_level_temp = SysVariable.light_level;
}
// 支付宝功能事件处理
static void func_alipay_process(void)
{
f_alipay_t *f_alipay = (f_alipay_t *)func_cb.f_cb;
/* 支付宝任务调度 UNIT:1S */
if (tick_check_expire(f_alipay->task_run_tick, 1000))
{
f_alipay->task_run_tick = tick_get();
alipay_binding_detect();
}
/* 绑定动画刷新 */
compo_picturebox_t *banding_anim = compo_getobj_byid(COMPO_ID_PIC_BINDING);
if (banding_anim != NULL &&
f_alipay->page == ALIPAY_PAGE_BINDING &&
tick_check_expire(f_alipay->binding_anim_tick, ALIPAY_ANIM_PLAY_INTERVAL))
{
f_alipay->binding_anim_tick = tick_get();
f_alipay->binding_anim_idx = (f_alipay->binding_anim_idx + 1) % ALIPAY_ANIM_NUM_MAX;
compo_picturebox_cut(banding_anim, f_alipay->binding_anim_idx, ALIPAY_ANIM_NUM_MAX);
}
func_process();
}
// 创建支付宝窗体默认为logo页面
compo_form_t *func_alipay_form_create(void)
{
return func_alipay_form_logo_create();
}
// 创建指定页面的窗体(销毁&创建)
void func_alipay_form_create_by_page(u8 page_sta)
{
printf("%s: %d\n", __func__, page_sta);
f_alipay_t *f_alipay = (f_alipay_t *)func_cb.f_cb;
compo_form_t *frm = func_cb.frm_main;
if (frm != NULL)
{
compo_form_destroy(frm);
frm = NULL;
}
switch (page_sta)
{
case ALIPAY_PAGE_LOGO:
frm = func_alipay_form_logo_create();
break;
case ALIPAY_PAGE_SCAN:
frm = func_alipay_form_scan_create();
break;
case ALIPAY_PAGE_BINDING:
frm = func_alipay_form_binding_create();
break;
case ALIPAY_PAGE_BIND_SUCC:
frm = func_alipay_form_bind_complete_create();
break;
case ALIPAY_PAGE_BIND_FAIL:
frm = func_alipay_form_bind_fail_create();
break;
case ALIPAY_PAGE_OPTION_LIST:
frm = func_alipay_form_option_list_create();
break;
case ALIPAY_PAGE_QRCODE:
frm = func_alipay_form_qrcode_create();
break;
case ALIPAY_PAGE_BARCODE:
frm = func_alipay_form_barcode_create();
break;
case ALIPAY_PAGE_UNBIND:
frm = func_alipay_form_unbind_create();
break;
case ALIPAY_PAGE_QUIT_BIND:
frm = func_alipay_form_quit_bind_create();
break;
case ALIPAY_PAGE_HELP:
frm = func_alipay_form_help_create();
break;
case ALIPAY_PAGE_UNBIND_CONFIRM:
frm = func_alipay_form_unbind_confirm_create();
break;
case ALIPAY_PAGE_UNBIND_FINISH:
frm = func_alipay_form_unbind_finish_create();
break;
}
/* 打开付款码时亮度保持80% */
if (page_sta == ALIPAY_PAGE_QRCODE || page_sta == ALIPAY_PAGE_BARCODE)
{
if (f_alipay->light_level_temp == SysVariable.light_level)
{
f_alipay->light_level_temp = SysVariable.light_level;
if (SysVariable.light_level < 4)
SysVariable.light_level = 4;
tft_bglight_set_level(SysVariable.light_level, false);
}
}
if (frm)
{
f_alipay->last_page = f_alipay->page;
f_alipay->page = page_sta;
printf(">>>page_sta[%d]\n", page_sta);
}
}
// 检测绑定状态改变之后跳转界面
void alipay_binding_detect(void)
{
f_alipay_t *f_alipay = (f_alipay_t *)func_cb.f_cb;
if (f_alipay->page == ALIPAY_PAGE_LOGO)
{
f_alipay->logo_display_cnt++;
printf("logo_display_cnt: %d\n", f_alipay->logo_display_cnt);
reset_sleep_delay_all();
if (f_alipay->logo_display_cnt == ALIPAY_LOGO_TIMEOUT)
{
f_alipay->logo_display_cnt = 0;
func_alipay_prepare();
}
}
else if (f_alipay->page == ALIPAY_PAGE_SCAN || f_alipay->page == ALIPAY_PAGE_BINDING || f_alipay->page == ALIPAY_PAGE_QUIT_BIND)
{
u32 ret;
reset_sleep_delay_all(); // 支付宝在绑定的过程中不许系统休眠
sys_cb.alipay_state = true;
binding_status_e sta = ALIPAY_STATUS_UNKNOWN;
ret = alipay_query_binding_result(&sta);
printf("ret: %d, sta: %d, page: %d\n", ret, sta, f_alipay->page);
if (sta == ALIPAY_STATUS_START_BINDING &&
(f_alipay->page == ALIPAY_PAGE_SCAN || (f_alipay->page == ALIPAY_PAGE_QUIT_BIND && f_alipay->last_page != ALIPAY_PAGE_BINDING)))
{
f_alipay->binding_flag = true;
func_alipay_form_create_by_page(ALIPAY_PAGE_BINDING);
}
// compo_arc_t *arc = compo_getobj_byid(COMPO_ID_RATE);
if (f_alipay->page == ALIPAY_PAGE_BINDING || f_alipay->page == ALIPAY_PAGE_QUIT_BIND)
{
switch (sta)
{
case ALIPAY_STATUS_BINDING_OK:
// compo_arc_set_value(arc, 1000);
f_alipay->binding_flag = false;
SysVariable.alipay_binding_flag = true;
func_alipay_form_create_by_page(ALIPAY_PAGE_BIND_SUCC);
break;
case ALIPAY_STATUS_BINDING_FAIL:
break;
default:
break;
}
}
// binding timeout go to logo
if (sta != ALIPAY_STATUS_BINDING_OK && (f_alipay->page == ALIPAY_PAGE_BINDING || (f_alipay->page == ALIPAY_PAGE_QUIT_BIND && f_alipay->binding_flag)))
{
f_alipay->binding_time_cnt++;
if (f_alipay->binding_time_cnt == ALIPAY_BIND_TIMEOUT || sta == ALIPAY_STATUS_BINDING_FAIL || !ble_is_connected())
{
f_alipay->binding_flag = false;
f_alipay->binding_time_cnt = 0;
func_alipay_form_create_by_page(ALIPAY_PAGE_BIND_FAIL);
}
}
}
/* 绑定成功提醒页面跳转至列表页面 */
if (f_alipay->page == ALIPAY_PAGE_BIND_SUCC)
{
reset_sleep_delay_all();
f_alipay->bind_success_time_cnt++;
printf("bind_success_time_cnt: %d\n", f_alipay->bind_success_time_cnt);
if (f_alipay->bind_success_time_cnt == ALIPAY_SUCCESS_TIMEOUT)
{
f_alipay->bind_success_time_cnt = 0;
func_alipay_form_create_by_page(ALIPAY_PAGE_OPTION_LIST);
}
}
/* 绑定失败提醒页面跳转至绑定页面 */
else if (f_alipay->page == ALIPAY_PAGE_BIND_FAIL)
{
reset_sleep_delay_all();
f_alipay->bind_fail_time_cnt++;
printf("bind_fail_time_cnt: %d\n", f_alipay->bind_fail_time_cnt);
if (f_alipay->bind_fail_time_cnt == ALIPAY_FAIL_TIMEOUT)
{
f_alipay->bind_fail_time_cnt = 0;
// alipay_bind_env_destroy();
printf("alipay_bind_env_destroy\n");
printf("%s\n", __func__);
freeList(&csi_head);
func_alipay_prepare();
}
}
/* 更新付款码数据 */
else if (f_alipay->page == ALIPAY_PAGE_QRCODE || f_alipay->page == ALIPAY_PAGE_BARCODE)
{
reset_sleep_delay_all();
f_alipay->bind_code_refresh_time_cnt++;
if (f_alipay->bind_code_refresh_time_cnt >= ALIPAY_CODE_REFRESH_TIMEOUT)
{
printf("===>> qr code refresh\n");
f_alipay->bind_code_refresh_time_cnt = 0;
func_alipay_form_create_by_page(f_alipay->page);
}
}
}
// 支付宝按钮点击处理
static void func_alipay_touch_key(void)
{
f_alipay_t *f_alipay = (f_alipay_t *)func_cb.f_cb;
u8 id = compo_get_button_id();
if (id)
{
printf(">>>button_id:%d\n", id);
switch (f_alipay->page)
{
case ALIPAY_PAGE_OPTION_LIST:
if (id == COMPO_ID_BTN_PAYCODE)
{
func_alipay_form_create_by_page(ALIPAY_PAGE_QRCODE);
}
else if (id == COMPO_ID_BTN_SETTING)
{
func_alipay_form_create_by_page(ALIPAY_PAGE_UNBIND);
}
else if (id == COMPO_ID_BTN_HELP)
{
func_alipay_form_create_by_page(ALIPAY_PAGE_HELP);
}
break;
case ALIPAY_PAGE_UNBIND:
func_alipay_form_create_by_page(ALIPAY_PAGE_UNBIND_CONFIRM);
break;
case ALIPAY_PAGE_UNBIND_CONFIRM:
if (id == COMPO_ID_BTN_UNBIND_YES)
{
if (alipay_unbinding() == ALIPAY_RV_OK)
{
freeList(&csi_head);
SysVariable.alipay_binding_flag = false;
printf("alipay_unbinding success!\n");
}
else
{
SysVariable.alipay_binding_flag = true;
printf("alipay_unbinding fail!\n");
}
func_alipay_form_create_by_page(ALIPAY_PAGE_UNBIND_FINISH);
}
else
{
func_alipay_form_create_by_page(ALIPAY_PAGE_UNBIND);
}
break;
case ALIPAY_PAGE_QUIT_BIND:
if (id == COMPO_ID_BTN_QUIT_BIND_YES)
{
func_back_to();
}
else
{
binding_status_e sta = ALIPAY_STATUS_UNKNOWN;
alipay_query_binding_result(&sta);
if (sta == ALIPAY_STATUS_START_BINDING)
func_alipay_form_create_by_page(ALIPAY_PAGE_BINDING);
else
func_alipay_form_create_by_page(ALIPAY_PAGE_SCAN);
}
break;
case ALIPAY_PAGE_UNBIND_FINISH:
func_alipay_prepare();
break;
case ALIPAY_PAGE_QRCODE:
case ALIPAY_PAGE_BARCODE:
if (id == COMPO_ID_BTN_PAY_CODE)
{
static u32 touch_update_tick = 0;
if (tick_check_expire(touch_update_tick, 2000))
{
touch_update_tick = tick_get();
f_alipay->bind_code_refresh_time_cnt = 0;
func_alipay_form_create_by_page(f_alipay->page);
}
break;
}
}
}
}
// 支付宝功能消息处理
static void func_alipay_touch_move(size_msg_t msg)
{
f_alipay_t *f_alipay = (f_alipay_t *)func_cb.f_cb;
if (msg == MSG_CTP_SHORT_RIGHT && (f_alipay->page == ALIPAY_PAGE_LOGO))
{
// func_back_to();
}
#ifndef ALIPAY_PAYMENT_CODE_VERTICAL
else if (msg == MSG_CTP_SHORT_LEFT && f_alipay->page == ALIPAY_PAGE_QRCODE)
{
func_alipay_form_create_by_page(ALIPAY_PAGE_BARCODE);
}
else if (msg == MSG_CTP_SHORT_RIGHT && f_alipay->page == ALIPAY_PAGE_BARCODE)
{
func_alipay_form_create_by_page(ALIPAY_PAGE_QRCODE);
}
else if (msg == MSG_CTP_SHORT_RIGHT && (f_alipay->page == ALIPAY_PAGE_QRCODE || f_alipay->page == ALIPAY_PAGE_UNBIND || f_alipay->page == ALIPAY_PAGE_HELP))
{
/* 退出时恢复亮度 */
if (f_alipay->light_level_temp != SysVariable.light_level && f_alipay->page == ALIPAY_PAGE_QRCODE)
{
SysVariable.light_level = f_alipay->light_level_temp;
tft_bglight_set_level(SysVariable.light_level, false);
}
func_alipay_form_create_by_page(ALIPAY_PAGE_OPTION_LIST);
}
#else
else if (msg == MSG_CTP_SHORT_UP && f_alipay->page == ALIPAY_PAGE_BARCODE)
{
func_alipay_form_create_by_page(ALIPAY_PAGE_QRCODE);
}
else if (msg == MSG_CTP_SHORT_DOWN && f_alipay->page == ALIPAY_PAGE_QRCODE)
{
func_alipay_form_create_by_page(ALIPAY_PAGE_BARCODE);
}
else if (msg == MSG_CTP_SHORT_RIGHT &&
(f_alipay->page == ALIPAY_PAGE_QRCODE || f_alipay->page == ALIPAY_PAGE_BARCODE || f_alipay->page == ALIPAY_PAGE_UNBIND || f_alipay->page == ALIPAY_PAGE_HELP))
{
/* 退出时恢复亮度 */
if (f_alipay->light_level_temp != SysVariable.light_level && (f_alipay->page == ALIPAY_PAGE_QRCODE || ALIPAY_PAGE_BARCODE))
{
SysVariable.light_level = f_alipay->light_level_temp;
tft_bglight_set_level(SysVariable.light_level, false);
}
func_alipay_form_create_by_page(ALIPAY_PAGE_OPTION_LIST);
}
#endif
else if (msg == MSG_CTP_SHORT_RIGHT && (f_alipay->page == ALIPAY_PAGE_UNBIND_CONFIRM))
{
func_alipay_form_create_by_page(ALIPAY_PAGE_UNBIND);
}
else if (msg == MSG_CTP_SHORT_RIGHT && f_alipay->page == ALIPAY_PAGE_OPTION_LIST)
{
func_back_to();
}
else if (msg == MSG_CTP_SHORT_RIGHT && (f_alipay->page == ALIPAY_PAGE_BINDING || f_alipay->page == ALIPAY_PAGE_SCAN))
{
func_alipay_form_create_by_page(ALIPAY_PAGE_QUIT_BIND);
}
else if (msg == MSG_CTP_SHORT_RIGHT && f_alipay->page == ALIPAY_PAGE_QUIT_BIND)
{
binding_status_e sta = ALIPAY_STATUS_UNKNOWN;
alipay_query_binding_result(&sta);
if (sta == ALIPAY_STATUS_START_BINDING)
func_alipay_form_create_by_page(ALIPAY_PAGE_BINDING);
else
func_alipay_form_create_by_page(ALIPAY_PAGE_SCAN);
}
else if (msg == MSG_CTP_SHORT_RIGHT && (f_alipay->page == ALIPAY_PAGE_BIND_FAIL))
{
freeList(&csi_head);
func_alipay_prepare();
f_alipay->bind_fail_time_cnt = 0;
}
}
// 支付宝功能消息处理
static void func_alipay_click_handler(void)
{
f_alipay_t *f_alipay = (f_alipay_t *)func_cb.f_cb;
if (f_alipay->page == ALIPAY_PAGE_OPTION_LIST)
{
func_back_to();
}
else if (f_alipay->page == ALIPAY_PAGE_BINDING || f_alipay->page == ALIPAY_PAGE_SCAN)
{
func_alipay_form_create_by_page(ALIPAY_PAGE_QUIT_BIND);
}
else if (f_alipay->page == ALIPAY_PAGE_QUIT_BIND)
{
binding_status_e sta = ALIPAY_STATUS_UNKNOWN;
alipay_query_binding_result(&sta);
if (sta == ALIPAY_STATUS_START_BINDING)
func_alipay_form_create_by_page(ALIPAY_PAGE_BINDING);
else
func_alipay_form_create_by_page(ALIPAY_PAGE_SCAN);
}
switch (f_alipay->page)
{
case ALIPAY_PAGE_QRCODE:
case ALIPAY_PAGE_BARCODE:
case ALIPAY_PAGE_UNBIND:
case ALIPAY_PAGE_UNBIND_CONFIRM:
case ALIPAY_PAGE_HELP:
func_alipay_form_create_by_page(ALIPAY_PAGE_OPTION_LIST);
break;
default:
break;
}
}
// 支付宝功能消息处理
static void func_alipay_message(size_msg_t msg)
{
switch (msg)
{
case MSG_CTP_CLICK:
func_alipay_touch_key();
break;
case MSG_CTP_LONG:
break;
case KU_BACK:
func_alipay_click_handler();
break;
case MSG_CTP_SHORT_UP:
case MSG_CTP_SHORT_DOWN:
case MSG_CTP_SHORT_RIGHT:
case MSG_CTP_SHORT_LEFT:
func_alipay_touch_move(msg);
break;
default:
func_message(msg);
break;
}
}
// 进入支付宝功能
static u8 alipay_enter_heap_func[HEAP_FUNC_ALIPAY_SIZE] AT(.alipay_enter.buf);
// static u8 alipay_exit_heap_func[HEAP_FUNC_SIZE] AT(.heap.func);
// static u8 heap_func[HEAP_FUNC_SIZE] AT(.alipay_exit.buf);
extern u32 __dev_end;
static void func_alipay_enter(void)
{
printf("__dev_end=0X%X\n", (u32)&__dev_end);
func_heap_init(alipay_enter_heap_func, HEAP_FUNC_ALIPAY_SIZE);
// func_heap_init(heap_func, HEAP_FUNC_SIZE);
printf("heap_init\n");
func_cb.f_cb = func_zalloc(sizeof(f_alipay_t));
func_cb.frm_main = func_alipay_form_create();
func_alipay_init();
}
// 退出支付宝功能
static void func_alipay_exit(void)
{
f_alipay_t *f_alipay = (f_alipay_t *)func_cb.f_cb;
printf("%s\n", __func__);
/* 退出时恢复亮度 */
if (f_alipay->light_level_temp != SysVariable.light_level)
{
SysVariable.light_level = f_alipay->light_level_temp;
tft_bglight_set_level(SysVariable.light_level, false);
}
if (func_cb.f_cb != NULL) {
func_free(func_cb.f_cb);
}
/* 检查内存是否已经释放 */
if (func_heap_get_free_size() != HEAP_FUNC_ALIPAY_SIZE) {
freeList(&csi_head);
}
printf("free List over\n");
/* 原厂用于检查支付宝调试过程中是否内存泄漏,目前支付宝内调试已稳定故此处不再常开做严格限制 */
#if HEAP_FUNC_DEBUG_ENABLE
// 检查Alipay运行内存Heap是否全部被释放, 确定释放则恢复界面Heap
u32 heap_size = func_heap_get_free_size();
if (heap_size != HEAP_FUNC_ALIPAY_SIZE)
{
printf("ALIPAY HEAP FUNC (%d -> %d): %d\n", func_cb.last, func_cb.sta, heap_size);
halt(HALT_FUNC_HEAP);
}
#endif
/* 还原MTU - 防止MUT大小中途被支付宝更改 */
if (ble_is_connected()) {
if (ble_get_gatt_mtu() != (att_get_max_mtu() - 3)) {
msg_enqueue(EVT_READY_EXCHANGE_MTU);
}
}
func_cb.last = FUNC_ALIPAY;
}
// 支付宝功能
void func_alipay(void)
{
printf("%s\n", __func__);
sys_cb.alipay_state = false;
/* 下面流程已经关闭音频链路,此处不再做等待 */
#if 0
// 判断通话SCO是否Setup
while (func_cb.sta == FUNC_ALIPAY && (sys_cb.sco_state == true || bt_cb.call_type != CALL_TYPE_NONE || bt_cb.number_sta == true))
{
if ( // bt_is_ios_device() == false &&
bt_cb.number_sta == false)
{ // 安卓设备流程与IOS不一致,兼容
bt_cb.call_type = CALL_TYPE_NONE;
// break;
}
func_process();
func_message(msg_dequeue());
}
#endif
// 判断后台是否正在播放音乐或提示音
#if !SECURITY_BT_BACKSTAGE_MUSIC_EN
mp3_res_play_exit();
music_control(MUSIC_MSG_STOP);
dac_fade_out();
#if DAC_DNR_EN
dac_dnr_set_sta(0);
sys_cb.dnr_sta = 0;
#endif
/* 蓝牙SBC/SCO通路关闭 */
bt_audio_bypass();
bt_cb.call_type = CALL_TYPE_NONE;
#if !BT_BACKSTAGE_EN
// bt_disconnect(1);
// bt_off();
// bt_cb.bt_is_inited = 0;
#else
/*
if (bt_get_status() == BT_STA_PLAYING && !bt_is_testmode()) { //蓝牙退出停掉音乐
delay_5ms(10);
if(bt_get_status() == BT_STA_PLAYING) { //再次确认play状态
u32 timeout = 850; //8.5s
bt_music_pause();
while (bt_get_status() == BT_STA_PLAYING && timeout > 0) {
timeout--;
delay_5ms(2);
}
}
}
*/
#endif // !BT_BACKSTAGE_EN
#endif // !SECURITY_BT_BACKSTAGE_MUSIC_EN
func_alipay_enter();
while (func_cb.sta == FUNC_ALIPAY)
{
func_alipay_process();
func_alipay_message(msg_dequeue());
}
func_alipay_exit();
// 退出恢复音乐后台播放
#if !SECURITY_BT_BACKSTAGE_MUSIC_EN
// func_bt_init();
bt_audio_enable();
#if DAC_DNR_EN
dac_dnr_set_sta(1);
sys_cb.dnr_sta = 1;
#endif
#endif // !SECURITY_BT_BACKSTAGE_MUSIC_EN
sys_cb.alipay_state = false;
}
// 清除支付宝数据
void alipay_reset_all_data(void)
{
SysVariable.alipay_binding_flag = false;
func_heap_init(alipay_enter_heap_func, HEAP_FUNC_ALIPAY_SIZE);
memset(&__alipay_start, 0, (u32)&__alipay_size);
#if (SECURITY_PAY_VENDOR == SECURITY_VENDOR_HS)
HS_IIC_Init();
#endif
#if (SECURITY_PAY_VENDOR == SECURITY_VENDOR_HED)
uint8_t *alipay_com_outbuf = func_zalloc(200);
uint32_t alipay_outlen = 0;
hed_rst_init();
csi_exit_lpm(0);
HED_IIC_Init();
api_connect(alipay_com_outbuf, &alipay_outlen);
printf("api_connect atr:\n");
print_r(alipay_com_outbuf, alipay_outlen);
func_free(alipay_com_outbuf);
#endif
u8 sta = alipay_pre_init();
if (sta == ALIPAY_RV_OK)
{
if (alipay_get_binding_status())
alipay_reset_all();
}
freeList(&csi_head);
func_heap_get_free_size();
}
#endif // SECURITY_PAY_EN