240 lines
8.7 KiB
C
240 lines
8.7 KiB
C
/**************************************************************************************************
|
||
* 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
|
||
};
|
||
|