mcu_hi3321_watch/tjd/ble/protocol/ble_multi_language_server.c
2025-05-26 20:15:20 +08:00

240 lines
8.7 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.

/**************************************************************************************************
* 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
};