/*
 * @Author: qianziyang qianzy@bmser.com
 * @Date: 2023-12-15 10:53:21
 * @LastEditors: qianziyang qianzy@bmser.com
 * @LastEditTime: 2024-01-19 14:32:54
 * @FilePath: /rk3568_sdk_1018/bmser_app/bmser_upgrade/src/app/ota/dtc_export.h
 * @Description: 记录导出
 */
#ifndef __DTC_EXPORT_H__
#define __DTC_EXPORT_H__

#include "platmacro.h"
#include "toolkit.h"
#include "bmser_ipc.h"

#define DTC_INQUIRE_INDEX_ERR       0xFFFF          /* 错误响应，不存在查询的序号 */

#define BAU_ALARM_INDEX_DB_ADDR     0x05A9          /* BAU告警类索引DB地址 */
#define BAU_EVENT_INDEX_DB_ADDR     0x05AA          /* BAU事件类索引DB地址 */
#define BCU_ALARM_INDEX_DB_ADDR     0x0BC2          /* BCU告警类索引DB地址 */
#define BCU_EVENT_INDEX_DB_ADDR     0x0BC3          /* BCU事件类索引DB地址 */

#define BAU_EVENT_MAX_DTC_NUM_ADDR  0x05B6          /* BAU事件类DTC记录最大条数 */
#define BAU_ALARM_MAX_DTC_NUM_ADDR  0x05B7          /* BAU告警类DTC记录最大条数 */
#define BCU_EVENT_MAX_DTC_NUM_ADDR  0x0BDE          /* BCU事件类DTC记录最大条数 */
#define BCU_ALARM_MAX_DTC_NUM_ADDR  0x0BDF          /* BCU告警类DTC记录最大条数 */

#define DTC_EXT_SNAP_TYPE_1              1          /* 详细定位信息类型1 */
#define DTC_EXT_SNAP_TYPE_2              2          /* 详细定位信息类型2 */

#define DTC_EXPORT_ALARM_NUM            10          /* 告警类记录单次最大请求数量 */
#define DTC_EXPORT_EVENT_NUM             5          /* 事件类记录单次最大请求数量 */

#define DTC_MAX_RETRY_TIMES              4          /* 最多重试次数 */
#define DTC_MAX_WAIT_TIME                2          /* 单包默认最长等待时间 */
#define DTC_MULTI_MAX_WAIT_TIME          5          /* 多包默认最长等待时间 */

#define DTC_BASE_SLEEP_TIME        25 * 1000        /* DTC基础休眠时间 */
#define DTC_INQ_SLEEP_TIME       1000 * 1000        /* DTC请求单位休眠时间 */

typedef enum
{
    DTC_Export_Step_Check_Index_DB,         /* 检查索引DB */
    DTC_Export_Step_Pack_Inquire,           /* 组请求包 */
    DTC_Export_Step_Send_Inquire,           /* 发送请求包 */
    DTC_Export_Step_Recvd_Ack,              /* 确认接收 */
    DTC_Export_Step_Unpack,                 /* 解包处理 */
    DTC_Export_Step_OK,                     /* 完成 */
}DTC_Export_Step_Enum;

// 导出类型
typedef enum {
    DTC_EXPORT_TYPE_EEP = 0,                /* EEP导出 */
    DTC_EXPORT_TYPE_OTHER = 1               /* 其他记录导出 */
}DTC_EXPORT_TYPE_Enum;

#pragma pack(1)
/*按索引导出记录，请求报文buf*/
typedef struct{
    uint8_t  export_type;               /*导出类型，Linux固定为DTC_EXPORT_TYPE_OTHER*/
    uint8_t  record_type;               /*记录类型*/
    uint16_t inquire_index;             /*查询索引，0xFFFF可以查询当前存储索引值*/
}DTC_Export_Inquire_Content_t;

/*按索引导出记录，接收报文buf*/
typedef struct{
    uint8_t  export_type;               /* 同请求报文导出类型，Linux固定为DTC_EXPORT_TYPE_OTHER */
    uint8_t  record_type;               /* 同请求报文记录类型 */
    uint16_t inquire_index;             /* 查询索引，0xFFFF为不存在查询的序号 */
    uint16_t record_num;                /* 记录数量 */
    uint8_t  sendOK_flag;               /* 发送完成标志，高4位为PackIndex，低4位为PackNum */
    uint8_t  buf[0];                    /* 记录内容，Struct DTC_Export_Record_Stru */
}DTC_Export_Receive_Content_t;

/*查询当前存储索引值，接收报文buf*/
typedef struct{
    uint8_t  export_type;               /* 同请求报文导出类型，Linux固定为DTC_EXPORT_TYPE_OTHER */
    uint8_t  record_type;               /* 同请求报文记录类型 */
    uint16_t inquire_index;             /* 当前索引值 */
    uint16_t res;                       /* 预留 */
}DTC_Export_Receive_Index_Content_t;

/*DTC告警\事件记录内容*/
typedef struct
{
    uint32_t indexID;                   /* 索引号*/
    uint32_t sysTime;                   /* 发生时间*/
    uint32_t softwareVersion;           /* 软件版本号*/
    
    int16_t recordType;                 /* 记录类型，FLASH_RECORD_TYPE_DTC=3 */
    int32_t DID;                        /* DID编号 */
    uint8_t evId;                       /* 触发事件主id */
    uint8_t res;                        /* 预留1字节 */

    uint16_t alert1;                    /* 预告警信息1 */
    uint16_t alarm1;                    /* 告警信息1 */
    uint16_t stop1;                     /* 停机信息1 */
    uint16_t alert2;                    /* 预告警信息2 */
    uint16_t alarm2;                    /* 告警信息2 */
    uint16_t stop2;                     /* 停机信息2 */
    uint16_t reset_count;               /* 复位次数信息 */
    uint32_t uptime;                    /* 开机运行时间 */
    uint8_t  ext_snap_len;              /* 扩展信息长度 */
    uint8_t  ext_snap_type;             /* Ext Snap格式类型 */
    uint8_t  cluster_id;                /* 簇编号 */
    uint8_t  ext_records_num;           /* 记录数，触发的多重源*/

    uint8_t  buf[0];                    /* 扩展Ext snap信息内容，根据ext_snap_type决定结构体 DTC_Export_Ext_Snap */
    // uint16_t crc16;                  /* CRC校验, 不关注 */
}DTC_Export_Record_Stru;

/*扩展Ext snap 格式1信息内容*/
typedef struct
{
    uint8_t  pack_id;                   /* pack编号 */
    uint8_t  pos_id;                    /* 位置编号(具体单体编号) */
    uint16_t fault_value;               /* 触发故障时的值 */
    uint16_t fault_cause;               /* 具体的故障原因解析 */
}DTC_Export_Ext_Snap_1;

/*扩展Ext snap 格式1信息结构体*/
typedef struct
{
    DTC_Export_Ext_Snap_1 extMsg1[3];   /* 触发源num < 3 */
    uint8_t res_buf[0];
}DTC_Export_Ext_Snap_1_Stru;

/*扩展Ext snap 格式2信息内容*/
typedef struct
{
    uint16_t fault_value;               /* 触发故障时的值 */
    uint16_t fault_cause;               /* 具体的故障原因解析 */
}DTC_Export_Ext_Snap_2;

/*扩展Ext snap 格式2信息结构体*/
typedef struct
{
    DTC_Export_Ext_Snap_2 extMsg2[5];      /* 触发源num < 6 */
    uint8_t res_buf[0];
}DTC_Export_Ext_Snap_2_Stru;
#pragma pack()

/**
 * @brief       记录导出主线程初始化
 * @param[in]   mode 模式(0:不删除原有表; 1:删除原有表,重新创建)
 * @retval      0:正常  !0:错误
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2023-12-27           QZY        创建初始版本          \n
*/
int DTC_EXport_run_init();

/**
 * @brief       流消息响应报文记录导出处理
 * @param[in]   struct ipc_message *msg
 * @return      int
 * @retval      0:正常  !0:错误
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2024-05-22           QZY        创建初始版本          \n
*/
int DTC_Export_flow_data_process(struct ipc_message *msg);

#endif
