mcu_hi3321_watch/tjd/sql/sql_message.c
2025-05-26 20:15:20 +08:00

672 lines
19 KiB
C
Raw 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. 2021. All rights reserved.
*
* Description: sql_message.c
*
* Author: saimen
*
* Create: 2024-06-08
*--------------------------------------------------------------------------*/
#include <string.h>
#include <stdio.h>
#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;i<list_len-j;i++){
if(g_sql_message.msg_list[index_list[i]].timestamp < g_sql_message.msg_list[index_list[i+1]].timestamp)
{
temp_index = index_list[i];
index_list[i] = index_list[i+1];
index_list[i+1] = temp_index;
count++;
}
}
//static_print_debug("sql_message_update_list_sorting:%d-%d",j,count);
} while(count>0);
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<MESSAGE_LIST_MAX_NUM;i++)
{
if(g_sql_message.msg_list[i].valid)
{
if(oldest_index == MESSAGE_LIST_MAX_NUM) {
oldest_index = i;
}else{
if(g_sql_message.msg_list[oldest_index].timestamp > 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;i++)
{
if(g_sql_message.msg_list[i].valid == true)
{
count++;
}
}
return count;
}
/*
按消息更新时间顺序返回到列表index_list[0]是最新消息的index。
*/
uint8_t sql_message_get_message_index_list(uint8_t *index_list)
{
uint8_t i;
uint8_t count = 0;
for(i=0;i<MESSAGE_LIST_MAX_NUM;i++)
{
if(g_sql_message.msg_list[i].valid)
{
index_list[count] = i;
count++;
}
}
sql_message_update_list_sorting(index_list, count);
return count;
}
uint8_t sql_message_get_message_type_cnt(message_enum type)
{
uint8_t i;
uint8_t count = 0;
for(i=0; i<MESSAGE_LIST_MAX_NUM; i++)
{
if(g_sql_message.msg_list[i].valid && g_sql_message.msg_list[i].msg_type == type)
{
count++;
}
}
return count;
}
/*
返回某个type的消息列表index_list[0]是最新消息的index。
*/
uint8_t sql_message_get_message_index_list_by_type(uint8_t *index_list, message_enum type)
{
uint8_t i;
uint8_t count = 0;
for(i=0;i<MESSAGE_LIST_MAX_NUM;i++)
{
if(g_sql_message.msg_list[i].valid && g_sql_message.msg_list[i].msg_type == type)
{
index_list[count] = i;
count++;
}
}
sql_message_update_list_sorting(index_list, count);
return count;
}
uint8_t sql_message_get_message_type_list(uint8_t *type_list)
{
uint8_t i;
uint8_t count = 0;
uint8_t index_list[MESSAGE_LIST_MAX_NUM];
count = sql_message_get_message_index_list(index_list);
uint8_t type_list_temp[MESSAGE_LIST_MAX_NUM];
for(i=0; i<count; i++)
{
uint8_t type = g_sql_message.msg_list[index_list[i]].msg_type;
type_list_temp[i] = type;
}
uint8_t cnt_no_duplicate = RemoveDuplicatesKeepOrder(type_list_temp, count);
memcpy(type_list, type_list_temp, cnt_no_duplicate);
return cnt_no_duplicate;
}
uint8_t sql_message_get_message_type_newest_index(uint8_t type)
{
uint8_t i;
uint8_t count = 0;
uint8_t index_list[MAX_MESSAGE_NUM];
count = sql_message_get_message_index_list(index_list);
for(i=0; i<count; i++)
{
if (g_sql_message.msg_list[index_list[i]].msg_type == type)
{
return index_list[i];
}
}
return MAX_MESSAGE_NUM;
}
void sql_message_delete_message(uint32_t index)
{
if(index >= 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);
}