/************************************************************************************************** * Copyright (c) Fenda Technologies Co., Ltd. 2020-2021. All rights reserved. * Description: 多语言服务接口函数 * Author: sean.wangxiaochao * Create: 2021-01-04 ************************************************************************************************/ #include "FreeRTOS.h" #include "sql_setting.h" #include "ui_language.h" #include "ble_protocol.h" #include "ble_data_transmission.h" #include "ble_multi_language_server.h" #include "ui_event.h" #include "task_ui.h" #define ENABLE_STATIC_PRINT false extern uint32_t am_util_stdio_printf(const char *pcFmt, ...); #define static_print_remind(...) am_util_stdio_printf(__VA_ARGS__) #if ENABLE_STATIC_PRINT #define static_print_info(...) am_util_stdio_printf(__VA_ARGS__) #else #define static_print_info(...) #endif /*************************************************************************************************** 4.25.1 APP 切换语言 ***************************************************************************************************/ void BLE_multiLanguageSwitch(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; uint8_t result = 0xFF; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case MULTI_LANGUAGE_TYPE: //result = SetCurrentLang((char*)data_info.p_data,data_info.len); static_print_info(" language type is [%s],%d\r\n", data_info.p_data,data_info.len); break; case MULTI_COUNTRY_LANGUAGE_TYPE: static_print_info(" country language type is [%s],%d\r\n", data_info.p_data,data_info.len); if(strncmp ("en_US",(char *)data_info.p_data,data_info.len) == 0) { sql_setting_set_language(LANG_EN); } else if(strncmp ("en_UK",(char *)data_info.p_data,data_info.len) == 0) { sql_setting_set_language(LANG_EN); } else if(strncmp("zh_CN",(char *)data_info.p_data,data_info.len) == 0) { sql_setting_set_language(LANG_ZH_CN); } else if(strncmp("zh",(char *)data_info.p_data,2) == 0) { sql_setting_set_language(LANG_ZH_CN); } else if(strncmp("en",(char *)data_info.p_data,2) == 0) { sql_setting_set_language(LANG_EN); } //am_util_stdio_printf(">>>>>>>>>>> %s \n",data_info.p_data); ui_language_sync(); task_ui_notify(EVENT_LANGUAGE_CHANGE, 0, NULL, 0); break; case MULTI_COUNTRY_TYPE: static_print_info(" country type is [%s],%d\r\n", data_info.p_data,data_info.len); break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); write_idx = user_set_protocol_error(out_data, MULTI_LANGUAGE_SERVER, data_info.error); *out_len = write_idx; } /*************************************************************************************************** 4.25.2 询问设备语言包是否可以下发 ***************************************************************************************************/ void BLE_requestIfSendMultiLanguageFile(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case MULTI_LANGUAGE_FILE_SEND_ASK_TYPE: static_print_info("ASK if Send multi language file Command received.\r\n"); break; case MULTI_LANGUAGE_FILE_ID_TYPE: static_print_info("Send multi language file id Command received,ID = %lx.\r\n", (uint32_t)(*data_info.p_data)); out_data[write_idx++] = 0x06;//DIAL_NUM LTV out_data[write_idx++] = MULTI_LANGUAGE_FILE_ID_TYPE; memcpy(&out_data[write_idx], data_info.p_data, 4); write_idx = +4; out_data[write_idx++] = 0x03;//DIAL_NUM LTV out_data[write_idx++] = MULTI_LANGUAGE_SEND_RESULT_TYPE; out_data[write_idx++] = 0; break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); write_idx = user_set_protocol_error(out_data, MULTI_LANGUAGE_SERVER, data_info.error); *out_len = write_idx; } /*************************************************************************************************** 4.25.3获取设备支持的语言列表与已有的语言 ***************************************************************************************************/ /* 此类型有UI定义,为编译通过,暂时放在此处 */ void BLE_requestSupportLanguageInfo(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint8_t *language_list = NULL; char *text = NULL; uint8_t fontSupportSum = 0; protocol_data_info_t data_info = {0}; static_print_info("BLE_requestSupportLanguageInfo\r\n"); if(in_data == NULL || in_len == 0) { return; } do { user_get_data_info(&data_info, &in_data, &in_len); switch((data_info.type & 0x7F)) { case MULTI_LANGUAGE_LIST_TYPE: static_print_info("BLE Get MULTI_LANGUAGE_LIST_TYPE\r\n"); break; default: break; } in_data = data_info.p_data; in_data += (data_info.len); in_len -= (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); //1.获取字库支持语言个数,分配适合的内存,获取语言信息 fontSupportSum = ui_language_get_support_number(); language_list = pvPortMalloc(fontSupportSum); if(language_list == NULL) { static_print_info("MultiLanguage_t EXT_MALLOC err\r\n"); return; } //GetLanguageInfo(languageInfo); // 待完善 //2. 根据获取到的语言信息malloc出ltvArray Ltv_t *ltvArray = pvPortMalloc(sizeof(Ltv_t) * fontSupportSum); if(ltvArray == NULL) { static_print_info("ltvArray EXT_MALLOC failed\r\n"); return; } memset(ltvArray, 0, sizeof(Ltv_t) * (fontSupportSum)); //3. 填充ltvArray,并发送 uint32_t fileListSize; for(uint32_t i = 0; i < fontSupportSum; i++) { fileListSize = 0; //support_language text = ui_language_get_locale_name(language_list[i]); if(text) { ltvArray[i * 3 + 1].len = strlen(text) + 2; } else { ltvArray[i * 3 + 1].len = 2; } ltvArray[i * 3 + 1].type = MULTI_LANGUAGE_SUPPORT_TYPE; ltvArray[i * 3 + 1].pValue = (uint8_t *)text; fileListSize += ltvArray[i * 3 + 1].len; //existing_language ltvArray[i * 3 + 2].len = 3; ltvArray[i * 3 + 2].type = MULTI_LANGUAGE_EXITING_TYPE; ltvArray[i * 3 + 2].value = ui_language_get_dict_valid_flag(language_list[i]); fileListSize += ltvArray[i * 3 + 2].len; //language_info ltvArray[i * 3].len = 3; ltvArray[i * 3].type = MULTI_LANGUAGE_INFO_TYPE; ltvArray[i * 3].value = fileListSize; } FrameInfo_t frameInfo; frameInfo.serviceId = MULTI_LANGUAGE_SERVER; frameInfo.commandId = MULTI_LANGUAGE_SUPPORT_ID; frameInfo.frameType.value = 0; BLE_SendLtvArray(&frameInfo, ltvArray, fontSupportSum); vPortFree(ltvArray); vPortFree(language_list); } // 所有涉及到多语言的函数指针,这里的顺序和common id 顺序相同 const p_func_t multiLanguageServerFunc[MULTI_LANGUAGE_SERVERE_MAX_ID] = { user_null_func, BLE_multiLanguageSwitch, //4.25.1 BLE_requestIfSendMultiLanguageFile, //4.25.2 BLE_requestSupportLanguageInfo //4.25.3 };