/**
 * @file Common_Type.h
 * @brief Landworld内部使用的标准类型,结构体等通用声明
 * @author Landworld0321 (Landworld@landworld.com)
 * @version V1.0
 * @date 2025-04-22
 * @copyright Copyright (c) 2025 by Landworld.Co.Ltd. All rights reserved
 */

#ifndef COMMON_TYPE_H_
#define COMMON_TYPE_H_

/*TYPEDEF*********************************************************/
typedef unsigned char StatusType; /* OSEK compliance. */

typedef unsigned char uint8;       // 无符号8位数，字节
typedef unsigned short int uint16; // 无符号16位数，半字
typedef unsigned long int uint32;  // 无符号32位数，长字
typedef char int8;                 // 有符号8位数，
typedef short int int16;           // 有符号16位数
typedef int int32;                 // 有符号32位数

typedef unsigned char UINT8;       // 无符号8位数，字节
typedef unsigned short int UINT16; // 无符号16位数，字
typedef unsigned long int UINT32;  // 无符号32位数，长字
typedef char INT8;                 // 有符号8位数
typedef short int INT16;           // 有符号16位数
typedef int INT32;                 // 有符号32位数

/*STRUCT*********************************************************/
/**
 * @brief 指定的CAN通道
 * 
 */
typedef enum
{
    CAN0_CHANNEL = 0, ///< CAN0
    CAN1_CHANNEL,     ///< CAN1
    CAN2_CHANNEL,     ///< CAN2
} CAN_Channel_En;

/**
 * @brief CAN报文类型
 *
 */
typedef enum
{
    CAN_STD = 0,   ///< CAN标准帧
    CAN_EXT = 1,   ///< CAN拓展帧
    CANFD_STD = 2, ///< CANFD 标准帧
    CANFD_EXT = 3, ///< CANFD 拓展帧
} CAN_Type_En;

#define CANMSG_LEN		(8U) ///< 配置默认的CAN负载长度.CAN2.0为8字节

/**
 * @brief CAN2.0平台报文类型
 * 
 */
typedef struct
{
    UINT32 m_ID;              ///< 报文ID
    CAN_Type_En m_IDE;        ///< 报文类型:CAN_STD 标准帧 CAN_EXT 拓展帧
    UINT8 m_data[CANMSG_LEN]; ///< 报文负载内容
    UINT8 m_dataLen;          ///< 报文负载长度
} CANMsg;

/**
 * @brief 内部PFC/HDC串口控制升级结构体
 * 
 */
typedef struct
{
    UINT8 b4SentCnt : 4;          ///< 发送计数值:RC 0-14
    UINT8 b1Sendst : 1;           ///< 发送状态:0 不在发送状态 1 正在发送
    UINT8 b1PfcPackecomplete : 1; ///< PFC刷写包接收完成:0 已完成刷写/未接收到PFC刷写包 1:接收到PFC刷写包
    UINT8 b1HdcPackecomplete : 1; ///< HDC刷写包接收完成:0 已完成刷写/未接收到HDC刷写包 1:接收到HDC刷写包
    UINT8 Step;                   ///< 升级步骤
    UINT16 FlashSendCnt;          ///< 通过串口发送的刷写包计数
    UINT32 FlashAddr;             ///< 通过串口发送指定写入刷写数据的地址
} Uart_Control;

/**
 * @brief 串口通信状态标志结构体
 * 
 */
typedef struct
{
    UINT8 b1ReceiveFlag : 1; ///< 接收标志 0:未接收到完整的数据包 1:已接收到一包完整数据包
    UINT8 b1RecComplete : 1; ///< 接收完成标志 0:UART接收未完成 1:UART接收完成
    UINT8 Rscv : 5;          ///< 预留
} Uart_Comm_Flag_St;

/**
 * @brief PFC/HDC信息
 * 
 */
typedef struct
{
    UINT8 GetInfo_Cnt;    ///< 获取信息计数
    UINT8 GetInfo_State;  ///< 获取信息状态
    UINT16 HW_Platform;   ///< 硬件平台
    UINT16 CHIP_TYPE;     ///< 芯片型号
    UINT16 SoftWare_TYPE; ///< 程序类型
    UINT16 Customer_CODE; ///< 客户编码
    UINT16 SoftWare_VER;  ///< 软件版本
    UINT32 CRC_Value;     ///< CRC校验值
} PFC_HDC_INFO;

/**
 * @brief PFC/HDC升级状态
 * 
 */
typedef enum
{
   Rst_Init = 0,
   Rst_Start,
   Rst_Fail,
   Rst_Success
}ProgramRst;

/**
 * @brief 指定的串口通道
 * 
 */
typedef enum
{
	UART0_CHANNEL = 0,
	UART1_CHANNEL,
	UART2_CHANNEL,
}Uart_Channel_En;

/**
 * @brief CAN波特率枚举
 * 
 */
typedef enum
{
    CAN20_DEFAULT = 0, ///< 默认为CAN2.0 500K速率
    CAN20_500K,        ///< CAN2.0 500K速率
    CANFD_125K_2M,     ///< CANFD 125K 2M速率
    CANFD_250K_2M,     ///< CANFD 250K 2M速率
    CANFD_500K_2M,     ///< CANFD 500K 2M速率
    CANFD_1M_2M,       ///< CANFD 1M 2M速率
    CAN20_250K,        ///< CAN2.0 250K速率
} Can_Baudrate_En;

/**
 * @brief 全局时基标志
 * 
 */
typedef union
{
    UINT8 all;
    struct SysTimeFlagBit
    {
        UINT8 b1Timer2ms : 1;   ///< 2ms定时标志，主程序中使用
        UINT8 b1Timer10ms : 1;  ///< 10ms定时标志
        UINT8 b1Timer20ms : 1;  ///< 20ms定时标志
        UINT8 b1Timer100ms : 1; ///< 100ms定时标志
        UINT8 b1Timer250ms : 1; ///< 250ms定时标志
        UINT8 b1Timer500ms : 1; ///< 500ms定时标志
        UINT8 b1Timer1s : 1;    ///< 1s定时标志
        UINT8 b2Rsvd : 1;       ///< 预留
    } bits;
} SysTimerFlag_Un;

/**
 * @brief Boot升级类型枚举量
 * 
 */
typedef enum
{
    NON = 0,      ///< 无匹配升级类型
    Updata_APP_A, ///< 升级LDC APP-A区域
    Updata_APP_B, ///< 升级LDC APP-B区域
    Updata_PFC,   ///< 升级PFC
    Updata_HDC,   ///< 升级HDC
} Boot_UpdateType_En;

// 信息交换区标识
typedef enum
{
	SWAP_A_TRIG_A_VALID = 0xB5,    ///< A区触发:验证A区固件有效 - 回滚时使用
	SWAP_A_TRIG_B_BLANK = 0xBA,	   ///< A区触发:B区擦除完成
	SWAP_A_TRIG_B_DOWNLOAD = 0xBC, ///< A区触发:B区代码下载完成
	SWAP_A_TRIG_B_VAEIFY = 0xBE,   ///< A区触发:验证B区固件有效性
	SWAP_A_TRIG_B_VALID = 0xBF,	   ///< A区触发:B区固件有效

	SWAP_B_TRIG_B_VALID = 0xA5,    ///< B区触发:验证B区固件有效 - 回滚时使用
	SWAP_B_TRIG_A_BLANK = 0xAA,	   ///< B区触发:A区擦除完成
	SWAP_B_TRIG_A_DOWNLOAD = 0xAC, ///< B区触发:A区代码下载完成
	SWAP_B_TRIG_A_VAEIFY = 0xAE,   ///< B区触发:验证A区固件有效性
	SWAP_B_TRIG_A_VALID = 0xAF,	   ///< B区触发:A区固件有效

	SWAP_X_TRIG_X_INVAILD = 0xFF, ///< 默认无效值
} UdsSwapFlsg_En; 

// BL刷写当前运行区相关定义(ADDR_SWAP_CURRENT)
typedef enum
{
    TRIUPDATA_CURBANK_A = 0xAA,
    TRIUPDATA_CURBANK_B = 0xBB,
    TRIUPDATA_CURBANK_X = 0xFF,
}UdsTrigBank_En;

/// @brief BOOT升级步骤
typedef enum
{
    UpdataStep1_Non = 0,        ///< 升级步骤1
    UpdataStep2_FlashEarse,     ///< 升级步骤2:擦除FLASH
    UpdataStep3_UpdataSet,      ///< 升级步骤3:设置升级地址
    UpdataStep4_DataTransfer,   ///< 升级步骤4:传输数据
    UpdataStep5_DataVerify,     ///< 升级步骤5:验证数据有效性
    UpdataStep6_UpdataConfirm,  ///< 升级步骤6:升级确认
}UpdataStep_En;

/// @brief Boot升级状态结构体
typedef struct
{
    Boot_UpdateType_En UpdateType;  ///< 升级类型
    UpdataStep_En UpdataStep;       ///< 升级步骤
    UINT8 UpdateJumpSelect;         ///< 跳转选择:0:跳转至APP地址 1:跳转至UDS BOOT地址
    UINT8 JumpOutBoot;              ///< 允许跳出Boot标志. ENABLE/DISABLE
    UINT16 FlashCheckSum;           ///< 写入Flash数据的校验值.初始值0xFFFF
    UINT32 FlashStartAdr;           ///< 指定Flash的起始地址
    UINT32 FlashAllBlockSize;       ///< 指定Flash的长度
    UINT32 FlashEraseSize;          ///< 指定Flash的擦除大小
    UINT32 FlashProgramAdr;         ///< 指定Flash的写入起始地址
    UINT32 FlashProgramSize;        ///< 指定Flash的写入大小

    /**********SWAP回滚相关*************/
    UdsSwapFlsg_En SwapFlag;           ///< 信息交换区保存的标识.0x55/0xA5/0xAA/0xFF/0x00
    UdsTrigBank_En TrigUpdata_CurBank; ///< 触发刷写的当前运行区.A区(0xAA)/B区(0xBB)
    UINT8 RollBack_Req;                ///< 回滚请求. TRUE:需要回滚 FALSE:不需要回滚
} Boot_UpdataControl;

/// @brief 内部协议接收到的消息掩码
typedef enum
{
    MsgID_Handshark_01 = 0xF1,     ///< 刷写步骤:握手掩码
    MsgID_FlashEarse_02 = 0xF2,    ///< 刷写步骤:内存擦除掩码
    MsgID_UpdataSet_03 = 0xF3,     ///< 刷写步骤:设置数据块掩码
    MsgID_DataTransfer_04 = 0xF4,  ///< 刷写步骤:传输阶段掩码
    MsgID_DataVerify_05 = 0xF5,    ///< 刷写步骤:数据验证掩码
    MsgID_UpdataComfirm_06 = 0xF6, ///< 刷写步骤:完整性确认掩码
    MsgID_Function_07 = 0xF7,      ///< 刷写步骤:升级进度查询掩码
} UpdataMsgID_En;

/// @brief 主机从机标识符
typedef enum
{
    Module_Non = 0xA0,    ///< 默认配置
    Module_Master = 0xA1, ///< 主机
    Module_Slave0 = 0xB1, ///< 从机1
    Module_Slave1 = 0xB2, ///< 从机2
    Module_Slave2 = 0xB3, ///< 从机3
} ModuleId_En;

/**
 * @brief 队列缓冲区大小
 *
 */
#define Q_MAXCANMAG   48u
/**
 * @brief CAN消息队列结构体
 *
 */
typedef struct
{
    UINT16 u16Head;             ///< 队头
    UINT16 u16Tail;             ///< 队尾
    CANMsg canMsg[Q_MAXCANMAG]; ///< 实际保存消息的缓冲区
    UINT16 u16CurPos;           ///< 当前位置
    UINT16 u16MaxSize;          ///< 队列缓冲区最大长度
}CanQueue_St;


typedef void (*pProtocolFun)(CANMsg* data);
/// @brief 通过掩码执行对应的函数
typedef struct
{
    UINT8 Mask;
    pProtocolFun pFun;
}ProtocolHandle_St;


#endif 
