/**
 * @file app_log.h
 * @author LokLiang
 * @brief 用于应用控制程序的统一配置的数据结构
 * @version 0.1
 * @date 2023-11-24
 *
 * @copyright Copyright (c) 2023
 *
 * 本模块实现功能：
 * 1. 统一定义应用程序需要存储的所有数据；
 * 2. 依赖 nfs 模块，使当前数据与内部存储的数据实现同步；
 * 3. 依赖 sh_vset 模块，并提供其对应的所有设置实现函数；
 *
 * 对数据的读操作：
 * 上层应用：应用和模式管理模块和控制模块
 * 对外提 app_log_read() 读取数据
 *
 * 对数据的写操作：
 * 上层应用：
 * 为所有成员提供专门的写入接口，内部数据被立即更新。
 *
 * 数据的默认值：
 * 当出现以下情况时，配置数据被恢复到默认值：
 * nvs 未初始化或操作失败；
 * 使用 app_log_factory_set() 恢复到默认值；
 * 结构体的长度 log_app_t 发生改变；
 * APP_LOG_DATA_VER 定义的值发生改变（在 app_log.c 内部定义）；
 *
 */

#pragma once

#include "sys_types.h"

#define APP_LOG_DATA_VER 1 /* 对应 log_app_t::version */

/* 数据结构 ------------------------------------------------------------------------------------ */

typedef struct
{
    uint16_t flight_number; // 当前记录的飞行次数
    uint16_t crc16;         // CRC16
    uint16_t datas[2048];
} flight_data_t;

typedef struct // 设备配置统一数据结构
{
    uint32_t version; // 配置版本，修改 APP_LOG_DATA_VER 的值后， nvs 已同步的数据被恢复到默认值

    flight_data_t flight_data;

    uint32_t crc32; // 校验数据（可放于任何位置）
} log_app_t;

/* nvs 接口 ------------------------------------------------------------------------------------ */

void app_log_init(void); // 初始化

int app_log_factory_set(void); // 使内存的数据恢复到默认设置，注意不会被立即保存到 nvs 中

int app_log_do_save(log_app_t *log); // 保存配置数据 到 nvs 的动作

/* 读接口 -------------------------------------------------------------------------------------- */

int app_log_read(log_app_t *out_log);

/* 操作接口 ------------------------------------------------------------------------------------ */

/* 写接口 -------------------------------------------------------------------------------------- */

void app_log_flight_time_start(void);
void app_log_flight_time_stop(void);
void app_log_flight_time_clr(void);
