/*---------------------------------------------------------------------------- * Copyright (c) Fenda Technologies Co., Ltd. 2021. All rights reserved. * * Description: sql_message.c * * Author: saimen * * Create: 2024-06-08 *--------------------------------------------------------------------------*/ #include #include #include "sys_typedef.h" #include "sys_config.h" #include "linux/crc32.h" #include "sql_message.h" /********************************************************************************************************************** * DEFINE */ #define ENABLE_STATIC_PRINT true #define static_print_error(...) sys_sql_log_e(__VA_ARGS__) //错误信息打印一般常开 #define static_print_warn(...) sys_sql_log_w(__VA_ARGS__) //警告信息打印一般常开 #if ENABLE_STATIC_PRINT #define static_print_debug(...) sys_sql_log_d(__VA_ARGS__) #else #define static_print_debug(...) #endif #define FILE_VERSION_SETTING (1) #define FILE_PATH_SETTING "/system/sql_message.bin" #define MESSAGE_LIST_MAX_NUM 50 #define MESSAGE_TITLE_LENGTH 24 #define MESSAGE_TEXT_LENGTH 256 #define MAX_MESSAGE_NUM 50 typedef struct { uint32_t uuid; //从蓝牙协议里取到的id,循环码,uuid不是下标号,是唯一标识,APP分配 uint32_t timestamp; //更新时间 UTC 秒 bool valid; //数据有效性,false-删除,true-存在 bool read_falg; //消息已读标志,false-未读,true-已读 uint8_t encoder_type; //文本编码类型 message_enum msg_type; //消息类型 //char title[MESSAGE_TITLE_LENGTH]; //title标题 //char app_name[MESSAGE_TITLE_LENGTH]; //应用名称信息 char user_name[MESSAGE_TITLE_LENGTH]; //用户名称信息 char user_num[MESSAGE_TITLE_LENGTH]; //用户帐号信息 char text[MESSAGE_TEXT_LENGTH]; //消息文本 } message_info_t; #pragma pack(4) //alignment 4 bytes typedef struct { uint32_t init_flag:8; //标记模块是否初始化。=0 无效数据;=1 正常数据;=2 恢复数据。 uint32_t version:8; //结构体版本 uint8_t en_message_notify; //使能消息通知 message_info_t msg_list[MESSAGE_LIST_MAX_NUM]; //消息参数保存 //uint8_t revs[1]; //保证8字节对齐 uint32_t crc32; } message_def_t; #pragma pack() static message_def_t g_sql_message; //设置实例 static bool g_message_need_save = false; /** * @brief 重置系统设置数据. * @retval int|返回结果,0=成功. */ static int sql_message_restore(void) { int ret = RET_SUCCESS; static_print_warn("sql_message_restore()\r\n"); // 设置的默认值 memset((uint8_t*)&g_sql_message,0,sizeof(message_def_t)); g_sql_message.version = FILE_VERSION_SETTING; g_sql_message.init_flag = 1; g_message_need_save = false; return ret; } static int8_t sql_message_update_list_sorting(uint8_t *index_list, uint8_t list_len) { uint8_t i =0 ,j = 0; uint8_t count = 0; uint8_t temp_index = 0; if(index_list == NULL || list_len > MESSAGE_LIST_MAX_NUM) { return RET_ERROR; } if(list_len < 2) { return RET_SUCCESS; } do{ count = 0; j++; for(i=0;i0); return RET_SUCCESS; } static uint8_t sql_message_get_available_message(void) { uint8_t i =0; uint8_t oldest_index = MESSAGE_LIST_MAX_NUM; for(i=0;i g_sql_message.msg_list[i].timestamp) { oldest_index = i; } } } else{ return i; } } return oldest_index; } // 函数用于去除数组中的重复元素,同时保持原始顺序不变 static int RemoveDuplicatesKeepOrder(uint8_t* nums, uint8_t numsSize) { if (numsSize == 0) return 0; uint8_t seen[256] = {0}; // 假设uint8_t的范围为0-255 int outputIndex = 0; for (int i = 0; i < numsSize; i++) { if (!seen[nums[i]]) { seen[nums[i]] = 1; // 标记为已见 nums[outputIndex++] = nums[i]; // 将未重复的元素移动到数组的前面 } } // 返回不重复元素的数量 return outputIndex; } /********************************************************************************************************************** * 固定接口 */ /** * @brief 初始化系统设置数据. * @retval int|返回结果,0=成功. */ int sql_message_init(void) { int ret = RET_SUCCESS; uint32_t ui32_crc; static_print_warn("[%s],sizeof(message_def_t) = %d\r\n", FILE_PATH_SETTING, sizeof(message_def_t)); ui32_crc = Crc32Part(0,(const char *)&g_sql_message, sizeof(message_def_t) - 4); if(ui32_crc != g_sql_message.crc32 || g_sql_message.version != FILE_VERSION_SETTING) { sql_message_restore(); g_message_need_save = true; } return ret; } void* sql_message_get_info(uint32_t *len, char **path) { g_sql_message.crc32 = Crc32Part(0,(const char *)&g_sql_message, sizeof(g_sql_message) - 4); *len = sizeof(g_sql_message); *path = (char*)FILE_PATH_SETTING; return &g_sql_message; } void sql_message_set_save_flag(uint8_t value) { g_message_need_save = value; } uint8_t sql_message_get_save_flag(void) { return g_message_need_save; } /********************************************************************************************************************** * 通用接口 */ uint8_t sql_message_get_max_number(void) { return MESSAGE_LIST_MAX_NUM; } uint32_t sql_message_get_max_title_length(void) { return MESSAGE_TITLE_LENGTH; } uint32_t sql_message_get_max_detail_length(void) { return MESSAGE_TEXT_LENGTH; } uint8_t sql_message_get_message_num(void) { uint8_t i; uint8_t count = 0; for(i=0;i= MESSAGE_LIST_MAX_NUM) { return; } memset(&g_sql_message.msg_list[index], 0, sizeof(message_info_t)); g_message_need_save = true; } void sql_message_delete_message_by_type(message_enum type) { for (uint8_t i = 0; i < MESSAGE_LIST_MAX_NUM; i++) { if (g_sql_message.msg_list[i].msg_type == type) { sql_message_delete_message(i); } } } uint8_t sql_message_new_message(void) { uint8_t new_index = sql_message_get_available_message(); static_print_debug("sql_message_new_message(),new_index = %d",new_index); if(g_sql_message.msg_list[new_index].valid) { sql_message_delete_message(new_index); } return new_index; } void sql_message_del_all_messages(void) { memset(g_sql_message.msg_list, 0, sizeof(message_info_t) * MESSAGE_LIST_MAX_NUM); g_message_need_save = true; } int32_t sql_message_get_index_by_uuid(uint32_t uuid) { uint32_t msgNum; int32_t i; int32_t temp_index = RET_INVALID_PARA; msgNum = sql_message_get_message_num(); for(i = 0; i < msgNum; i++) { if(g_sql_message.msg_list[i].uuid == uuid) { temp_index = i; break; } } return temp_index; } uint32_t sql_message_get_uuid(uint8_t index) { if(index < MESSAGE_LIST_MAX_NUM) { return g_sql_message.msg_list[index].uuid; } else { return RET_ERROR; } } uint32_t sql_message_set_uuid(uint8_t index,uint8_t uuid) { if(index < MESSAGE_LIST_MAX_NUM) { g_sql_message.msg_list[index].uuid = uuid; g_message_need_save = true; } else { return RET_ERROR; } return RET_SUCCESS; } bool sql_message_get_valid(uint8_t index) { if(index < MESSAGE_LIST_MAX_NUM) { return g_sql_message.msg_list[index].valid; } return false; } int8_t sql_message_set_valid(uint8_t index,bool valid) { if(index < MESSAGE_LIST_MAX_NUM && g_sql_message.msg_list[index].valid != valid) { g_message_need_save = true; g_sql_message.msg_list[index].valid = valid; } else { return RET_ERROR; } return RET_SUCCESS; } bool sql_message_get_read_flag(uint8_t index) { if(index < MESSAGE_LIST_MAX_NUM) { return g_sql_message.msg_list[index].read_falg; } return false; } int8_t sql_message_set_read_flag(uint8_t index,bool flag) { if(index < MESSAGE_LIST_MAX_NUM && g_sql_message.msg_list[index].read_falg != flag) { g_message_need_save = true; g_sql_message.msg_list[index].read_falg = flag; } else { return RET_ERROR; } return RET_SUCCESS; } uint32_t sql_message_get_timestamp(uint8_t index) { if(index < MESSAGE_LIST_MAX_NUM) { return g_sql_message.msg_list[index].timestamp; } else { return 0; } } int8_t sql_message_set_timestamp(uint8_t index,uint32_t timestamp) { if(index < MESSAGE_LIST_MAX_NUM && g_sql_message.msg_list[index].timestamp != timestamp) { g_message_need_save = true; g_sql_message.msg_list[index].timestamp = timestamp; } else { return RET_ERROR; } return RET_SUCCESS; } message_enum sql_message_get_type(uint8_t index) { if(index < MESSAGE_LIST_MAX_NUM) { return g_sql_message.msg_list[index].msg_type; } else { return MESSAGE_UNKNOWN; } } int8_t sql_message_set_type(uint8_t index,uint8_t type) { if(index < MESSAGE_LIST_MAX_NUM && g_sql_message.msg_list[index].msg_type != type) { g_message_need_save = true; g_sql_message.msg_list[index].msg_type = type; } else { return RET_ERROR; } return RET_SUCCESS; } int8_t sql_message_get_user_name(uint8_t index,char **text) { if(index < MESSAGE_LIST_MAX_NUM) { *text = g_sql_message.msg_list[index].user_name; } else { return RET_ERROR; } return RET_SUCCESS; } int8_t sql_message_set_user_name(uint8_t index,char *text) { uint32_t str_len = strlen(text); str_len = (str_len > MESSAGE_TITLE_LENGTH)? MESSAGE_TITLE_LENGTH:str_len; if((index < MESSAGE_LIST_MAX_NUM) && (str_len > 0)) { g_message_need_save = true; memcpy(g_sql_message.msg_list[index].user_name, text,str_len); } else { return RET_ERROR; } return RET_SUCCESS; } int8_t sql_message_get_user_number(uint8_t index,char **text) { if(index < MESSAGE_LIST_MAX_NUM) { *text = g_sql_message.msg_list[index].user_num; } else { return RET_ERROR; } return RET_SUCCESS; } int8_t sql_message_set_user_number(uint8_t index,char *text) { uint32_t str_len = strlen(text); str_len = (str_len > MESSAGE_TITLE_LENGTH)? MESSAGE_TITLE_LENGTH:str_len; if((index < MESSAGE_LIST_MAX_NUM) && (str_len > 0)) { g_message_need_save = true; memcpy(g_sql_message.msg_list[index].user_num, text,str_len); } else { return RET_ERROR; } return RET_SUCCESS; } int8_t sql_message_get_detail_info(uint8_t index,char **text) { if(index < MESSAGE_LIST_MAX_NUM) { *text = g_sql_message.msg_list[index].text; } else { return RET_ERROR; } return RET_SUCCESS; } int8_t sql_message_set_detail_info(uint8_t index,char *text) { static_print_debug("sql_message_get_detail_info(%d),text_len = %d",index,strlen(text)); printf("text:\r\n"); for (int i = 0; i < strlen(text); i++) { printf("--0x%02x",(uint8_t)text[i]); } printf("\r\n"); uint32_t str_len = strlen(text) + 1; str_len = (str_len > MESSAGE_TEXT_LENGTH)? MESSAGE_TEXT_LENGTH:str_len; if((index < MESSAGE_LIST_MAX_NUM) && (str_len > 0)) { g_message_need_save = true; memcpy(g_sql_message.msg_list[index].text, text,str_len - 1); g_sql_message.msg_list[index].text[str_len - 1] = '\0'; } else { printf("sql_message_set_detail_info error\r\n"); return RET_ERROR; } return RET_SUCCESS; } void sql_message_print_all(void) { printf("read all message:\n"); for (uint8_t i = 0; i < MESSAGE_LIST_MAX_NUM; i++) { if (g_sql_message.msg_list[i].valid) { printf("index:%d,timestamp:%d,msg_type:%d,user_name:%s,user_num:%s,text:%s\n", i, g_sql_message.msg_list[i].timestamp, g_sql_message.msg_list[i].msg_type, g_sql_message.msg_list[i].user_name, g_sql_message.msg_list[i].user_num, g_sql_message.msg_list[i].text); } } } /********************************************************************************************************************** * TEST FUNCTIONS */ void sql_message_test_init(uint8_t message_num) { uint8_t i=0; uint8_t temp_index=0; char text_str[32]= {0}; static_print_warn("sql_message_test_init(%d)", message_num); for(i=0; i < message_num; i++){ temp_index = sql_message_new_message(); sql_message_set_valid(temp_index, true); sql_message_set_timestamp(temp_index, rand()%100000); memset(text_str,0,sizeof(text_str)); sprintf(text_str, "text_str:i=%d,t=%d", temp_index, sql_message_get_timestamp(temp_index)); sql_message_set_detail_info(temp_index, text_str); sql_message_set_type(temp_index, rand()%(MESSAGE_TIKTOK+1)); } uint8_t temp_list[MESSAGE_LIST_MAX_NUM]={0}; uint8_t count = sql_message_get_message_index_list(temp_list); char *str_p = NULL; for(i=0; i < count; i++){ sql_message_get_detail_info(temp_list[i], &str_p); if(str_p){ static_print_warn("sql_message_test_%d index=%d time=%d info=%s", i, temp_list[i], sql_message_get_timestamp(temp_list[i]),str_p); }else{ static_print_warn("sql_message_test_%d index=%d time=%d", i, temp_list[i], sql_message_get_timestamp(temp_list[i])); } } } void sql_message_test(void) { uint8_t index = sql_message_new_message(); sql_message_set_type(index, MESSAGE_WECHAT2);//4 char*text = "this is wechat message1 new ni hao ma wo hen hao dajia hao cai shi zhen de hao,hai si xin pian,信息列表"; sql_message_set_detail_info(index, text); sql_message_set_timestamp(index, 1720664855);//2024-07-11 10:27:35 sql_message_set_valid(index, 1); index = sql_message_new_message(); sql_message_set_type(index, MESSAGE_WECHAT2);//4 text = "this is wechat message2"; sql_message_set_detail_info(index, text); sql_message_set_timestamp(index, 1720664890);//2024-07-11 10:28:10 sql_message_set_valid(index, 1); index = sql_message_new_message(); sql_message_set_type(index, MESSAGE_WECHAT2);//4 text = "this is wechat message2"; sql_message_set_detail_info(index, text); sql_message_set_timestamp(index, 1720664929);//2024-07-11 10:28:49 sql_message_set_valid(index, 1); index = sql_message_new_message(); sql_message_set_type(index, MESSAGE_FACEBOOK);//5 text = "this is MESSAGE_FACEBOOK message1"; sql_message_set_detail_info(index, text); sql_message_set_timestamp(index, 1720665044);//2024-07-11 10:30:44 sql_message_set_valid(index, 1); index = sql_message_new_message(); sql_message_set_type(index, MESSAGE_TWITTER);//6 text = "this is MESSAGE_TWITTER message1"; sql_message_set_detail_info(index, text); sql_message_set_timestamp(index, 1720665089);//2024-07-11 10:31:29 sql_message_set_valid(index, 1); index = sql_message_new_message(); sql_message_set_type(index, MESSAGE_WHATSAPP);//8 text = "this is MESSAGE_WHATSAPP message1"; sql_message_set_detail_info(index, text); sql_message_set_timestamp(index, 1720665073);//2024-07-11 10:31:13 sql_message_set_valid(index, 1); }