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

424 lines
11 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_alarm.c
*
* Author: saimen
*
* Create: 2024-06-08
*--------------------------------------------------------------------------*/
//所有的 SQL 语法都必须以关键字(也称命令)开头,比如 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP、CREATE、USE、SHOW 等。
#include <string.h>
#include "sys_typedef.h"
#include "sys_config.h"
#include "linux/crc32.h"
#include "sql_alarm.h"
/**********************************************************************************************************************
* DEFINE
*/
#define ENABLE_STATIC_PRINT false
#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_alarm.bin"
#define ALARM_CLOCK_MAX_NUMBER (10)
#define ALARM_NAME_MAX_NUMBER (32)
typedef struct {
uint32_t uuid; //闹钟标号。uuid不是下标号是唯一标识APP分配
bool valid; //闹钟有效性
uint8_t enable; //闹钟开关
uint8_t cycle_mode; //闹钟周期,用于设置是否只提醒一次还是每周哪些天提醒
//后7位代表周一到周日是否提醒全为0代表仅提醒一次
uint8_t repeat_times; //重复次数
uint8_t repeat_interval; //重复间隔,单位分钟
uint8_t hour; //小时
uint8_t minute; //分钟
char name[ALARM_NAME_MAX_NUMBER]; //闹钟描述
}alarm_info_t;
#pragma pack(4) //alignment 4 bytes
typedef struct {
uint32_t init_flag:8; //标记模块是否初始化。=0 无效数据;=1 正常数据;=2 恢复数据。
uint32_t version:8; //结构体版本
alarm_info_t alarm_list[ALARM_CLOCK_MAX_NUMBER]; //闹钟参数保存
//uint8_t revs[1]; //保证8字节对齐
uint32_t crc32;
} alarm_def_t;
#pragma pack()
static alarm_def_t g_sql_alarm; //设置实例
static bool g_alarm_need_save = false;
/**
* @brief 重置系统设置数据.
* @retval int|返回结果,0=成功.
*/
int sql_alarm_restore(void)
{
int ret = RET_SUCCESS;
static_print_warn("sql_alarm_restore()\r\n");
// 设置的默认值
memset((uint8_t*)&g_sql_alarm,0,sizeof(alarm_def_t));
g_sql_alarm.version = FILE_VERSION_SETTING;
g_sql_alarm.init_flag = 1;
/************************ 测试 ******************************/
// g_sql_alarm.alarm_list[0].valid = 1;
// g_sql_alarm.alarm_list[0].enable = 1;
// g_sql_alarm.alarm_list[0].cycle_mode = 0x33; // 一、二、五、六
// g_sql_alarm.alarm_list[0].hour = 8;
// g_sql_alarm.alarm_list[0].minute = 1;
// g_sql_alarm.alarm_list[1].valid = 1;
// g_sql_alarm.alarm_list[1].enable = 0;
// g_sql_alarm.alarm_list[1].cycle_mode = 0x7f; // 每天
// g_sql_alarm.alarm_list[1].hour = 9;
// g_sql_alarm.alarm_list[1].minute = 20;
// g_sql_alarm.alarm_list[3].valid = 1;
// g_sql_alarm.alarm_list[3].enable = 1;
// g_sql_alarm.alarm_list[3].cycle_mode = 0x00; // 仅一次
// g_sql_alarm.alarm_list[3].hour = 12;
// g_sql_alarm.alarm_list[3].minute = 30;
/************************ END ******************************/
g_alarm_need_save = false;
return ret;
}
/**********************************************************************************************************************
* 固定接口
*/
/**
* @brief 初始化系统设置数据.
* @retval int|返回结果,0=成功.
*/
int sql_alarm_init(void)
{
int ret = RET_SUCCESS;
uint32_t ui32_crc;
static_print_warn("[%s],sizeof(alarm_def_t) = %d\r\n", FILE_PATH_SETTING, sizeof(alarm_def_t));
ui32_crc = Crc32Part(0,(const char *)&g_sql_alarm, sizeof(alarm_def_t) - 4);
if(ui32_crc != g_sql_alarm.crc32 || g_sql_alarm.version != FILE_VERSION_SETTING)
{
sql_alarm_restore();
g_alarm_need_save = true;
}
return ret;
}
void* sql_alarm_get_info(uint32_t *len, char **path)
{
g_sql_alarm.crc32 = Crc32Part(0,(const char *)&g_sql_alarm, sizeof(g_sql_alarm) - 4);
*len = sizeof(g_sql_alarm);
*path = (char*)FILE_PATH_SETTING;
return &g_sql_alarm;
}
void sql_alarm_set_save_flag(uint8_t value)
{
g_alarm_need_save = value;
}
uint8_t sql_alarm_get_save_flag(void)
{
return g_alarm_need_save;
}
/**********************************************************************************************************************
* 通用接口
*/
uint8_t sql_alarm_get_max_number(void)
{
return ALARM_CLOCK_MAX_NUMBER;
}
//获取闹钟数,并返回满标志
uint8_t sql_alarm_get_alarm_number(bool *full_flag)
{
uint8_t i;
uint8_t count = 0;
if (full_flag != NULL) *full_flag = true;
for(i=0;i<ALARM_CLOCK_MAX_NUMBER;i++)
{
if(g_sql_alarm.alarm_list[i].valid)
{
count++;
}
else
{
if (full_flag != NULL) *full_flag = false;
}
}
return count;
}
//获取闹钟ID列表
uint8_t sql_alarm_get_alarm_index_list(uint8_t **index_list)
{
uint8_t i;
uint8_t count = 0;
for(i=0;i<ALARM_CLOCK_MAX_NUMBER;i++)
{
if(g_sql_alarm.alarm_list[i].valid)
{
(*index_list)[count] = i;
count++;
}
}
return count;
}
//创建闹钟并返回index
int sql_alarm_create(void)
{
uint8_t i;
for(i=0;i<ALARM_CLOCK_MAX_NUMBER;i++)
{
if(g_sql_alarm.alarm_list[i].valid == false)
{
g_sql_alarm.alarm_list[i].valid = true;
break;
}
}
if(i<ALARM_CLOCK_MAX_NUMBER)
{
g_alarm_need_save = true;
return i;
}
else
{
return RET_NO_MEM;
}
}
//根据ID删除闹钟
void sql_alarm_delete(uint8_t index)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
g_sql_alarm.alarm_list[index].valid = false;
g_alarm_need_save = true;
}
}
void sql_alarm_set_switch(uint8_t index, uint8_t status)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
if(g_sql_alarm.alarm_list[index].enable != status)
{
g_sql_alarm.alarm_list[index].enable = status;
g_alarm_need_save = true;
}
}
}
uint8_t sql_alarm_get_switch(uint8_t index)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
return g_sql_alarm.alarm_list[index].enable;
}
else
{
return RET_ERROR;
}
}
void sql_alarm_set_time(uint8_t index, uint8_t hour, uint8_t minute)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
if(g_sql_alarm.alarm_list[index].hour != hour || g_sql_alarm.alarm_list[index].minute != minute)
{
g_sql_alarm.alarm_list[index].hour = hour;
g_sql_alarm.alarm_list[index].minute = minute;
g_alarm_need_save = true;
}
}
}
uint8_t sql_alarm_get_time(uint8_t index, uint8_t *hour, uint8_t *minute)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
*hour = g_sql_alarm.alarm_list[index].hour;
*minute = g_sql_alarm.alarm_list[index].minute;
return RET_SUCCESS;
}
else
{
return RET_ERROR;
}
}
void sql_alarm_set_cycle(uint8_t index, uint8_t cycle_mode)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
if(g_sql_alarm.alarm_list[index].cycle_mode != cycle_mode)
{
g_sql_alarm.alarm_list[index].cycle_mode = cycle_mode;
g_alarm_need_save = true;
}
}
}
uint8_t sql_alarm_get_cycle(uint8_t index)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
return g_sql_alarm.alarm_list[index].cycle_mode;
}
else
{
return RET_ERROR;
}
}
void sql_alarm_set_repeat_times(uint8_t index, uint8_t repeat_times)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
if(g_sql_alarm.alarm_list[index].repeat_times != repeat_times)
{
g_sql_alarm.alarm_list[index].repeat_times = repeat_times;
g_alarm_need_save = true;
}
}
}
uint8_t sql_alarm_get_repeat_times(uint8_t index)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
return g_sql_alarm.alarm_list[index].repeat_times;
}
else
{
return RET_ERROR;
}
}
void sql_alarm_set_repeat_interval(uint8_t index, uint8_t repeat_interval)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
if(g_sql_alarm.alarm_list[index].repeat_interval != repeat_interval)
{
g_sql_alarm.alarm_list[index].repeat_interval = repeat_interval;
g_alarm_need_save = true;
}
}
}
uint8_t sql_alarm_get_repeat_interval(uint8_t index)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
return g_sql_alarm.alarm_list[index].repeat_interval;
}
else
{
return RET_ERROR;
}
}
void sql_alarm_set_valid(uint8_t index, uint8_t valid)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
if(g_sql_alarm.alarm_list[index].valid != valid)
{
g_sql_alarm.alarm_list[index].valid = valid;
g_alarm_need_save = true;
}
}
}
int8_t sql_alarm_get_valid(uint8_t index)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
return g_sql_alarm.alarm_list[index].valid;
}
else
{
return RET_ERROR;
}
}
int32_t sql_alarm_get_index_by_uuid(uint32_t uuid)
{
int32_t i;
int32_t temp_index = RET_INVALID_PARA;
for(i = 0; i < ALARM_CLOCK_MAX_NUMBER; i++) {
if(g_sql_alarm.alarm_list[i].uuid == uuid) {
temp_index = i;
break;
}
}
return temp_index;
}
void sql_alarm_set_uuid(uint8_t index, uint8_t uuid)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
if(g_sql_alarm.alarm_list[index].uuid != uuid)
{
g_sql_alarm.alarm_list[index].uuid = uuid;
g_alarm_need_save = true;
}
}
}
uint8_t sql_alarm_get_uuid(uint8_t index)
{
if(index<ALARM_CLOCK_MAX_NUMBER)
{
return g_sql_alarm.alarm_list[index].uuid;
}
else
{
return RET_ERROR;
}
}
uint8_t sql_alarm_set_name(uint8_t index,char *name)
{
uint32_t str_len = strlen(name);
str_len = (str_len > ALARM_NAME_MAX_NUMBER)? ALARM_NAME_MAX_NUMBER:str_len;
if((index < ALARM_CLOCK_MAX_NUMBER) && (str_len > 0))
{
memcpy(g_sql_alarm.alarm_list[index].name, name,str_len);
g_alarm_need_save = true;
} else {
return RET_ERROR;
}
return RET_SUCCESS;
}
uint8_t sql_alarm_get_name(uint8_t index,char **name)
{
if(index < ALARM_CLOCK_MAX_NUMBER)
{
// static_print_remind("g_sql_alarm.alarm_list[index].name = %s=======\n",g_sql_alarm.alarm_list[index].name);
*name = g_sql_alarm.alarm_list[index].name;
} else {
return RET_ERROR;
}
return RET_SUCCESS;
}