#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