#ifndef H2_TYPEDEF_H
#define H2_TYPEDEF_H

#include <stdint.h>

/*
 * h2_typedef.h
 *
 * H2 系列设备对用户开放的基础类型、枚举及返回码定义。
 *
 * 本文件仅包含 API 稳定承诺的数据结构与常量：
 *  - 可被用户程序直接 include
 *  - 不包含任何与具体实现相关的定义
 *  - 不包含任何与具体平台相关的定义
 */

/* ===========================
 * API 返回码定义
 * =========================== */

#define STATUS_NOERROR                     0    // 无错误

/* 异常错误：设备无法继续运行 */
#define STATUS_ERROR_BUSOPENFAILED         -1  // 总线打开错误
#define STATUS_ERROR_DISCONNECT            -8  // 总线通信中断
#define STATUS_ERROR_TXLEVEL_FILEMISSING   -29 // 发射功率校准文件丢失
#define STATUS_ERROR_IQCAL_FILEMISSING     -43 // IQ校准文件丢失

/* 异常警告：不影响设备继续运行 */
#define STATUS_WARNING_BUSTIMEOUT          10  // 数据传输超时
#define STATUS_WARNING_TXLEVEL_FILEDEFAULT 42  // 使用默认发射功率校准文件
#define STATUS_WARNING_IQCAL_FILEDEFAULT   44  // 使用默认IQ校准文件
#define STATUS_WARNING_PARAMOUTRANGE       98  // 参数超界发生钳位
#define STATUS_WARNING_UNLEVEL             99  // 发射功率超限，可能导致功率不准

#define STATUS_WARNING_SYSCLK_UNLOCKED	15 //系统时钟失锁
#define	STATUS_WARNING_ADCCLK_UNLOCKED	16 //ADC时钟失锁
#define	STATUS_WARNING_RXIFLO_UNLOCKED	17 //接收中频本振失锁
#define STATUS_WARNING_RXRFLO_UNLOCKED	18 //接收射频频本振失锁
#define STATUS_WARNING_SYSCLK_RELOCKED	36 //系统时钟发生重锁现象
#define STATUS_WARNING_ADCCLK_RELOCKED	37 //ADC时钟发生重锁现象
#define STATUS_WARNING_RXIFLO_RELOCKED	38 //接收中频本振发生重锁现象
#define STATUS_WARNING_RXRFLO_RELOCKED	39 //接收射频本振发生重锁现象

/* ===========================
 * 全局配置
 * =========================== */

enum state : uint8_t
{
    STATE_OFF = 0,
    STATE_ON = 1
};

/* 风扇模式 */
enum fan_mode : uint8_t 
{
    FAN_ON,     // 风扇常开
    FAN_OFF,    // 风扇常关
    FAN_AUTO    // 根据温度自动调整风扇状态
};

/* ===========================
 * 设备信息
 * =========================== */

typedef struct
{
    uint16_t model;            // 设备型号
    uint64_t uid_l64;          // 低 64bit 设备序列号
    uint32_t uid_h32;          // 高 32bit 设备序列号

    uint16_t hardware_version;  // 硬件版本

    uint32_t mfw_version;       // MCU 固件版本
    uint32_t ffw_version;       // FPGA 固件版本
    uint32_t pmu_version;       // PMU 固件版本
    uint32_t agu_version;       // AGU 固件版本
    uint32_t bus_version;       // 总线外设固件版本
    uint32_t eio_version;       // EIO 固件版本
    
    uint32_t bus_bandwidth;     // 总线带宽，单位MB/s
} device_info;

/* ===========================
 * 供电信息
 * =========================== */
typedef struct
{
    float rf_voltage; // 电源端口电压（v）
    float rf_current; // 电源端口电流（a）
    float usb_voltage; // USB端口电压（v）
    float usb_current; // USB端口电流（a）
} supply_info;

/* ===========================
 * eth接口类型
 * =========================== */

enum eth_interface_type : uint8_t
{
    ETH_HIGHSPEED = 0x00,          // 高速以太网 总线接口
    ETH_STANDARD = 0x01,           // 普通以太网 总线接口
};

/* ===========================
 * eth启动配置
 * =========================== */

typedef struct
{
    enum eth_interface_type eth_interface; // 物理接口类型

    uint8_t  eth_is_ipv6;              // ETH 协议类型（0: IPv4, 1: IPv6）
    uint8_t  eth_ip_address[16];       // ETH 接口 IP 地址
    uint16_t eth_remote_port;          // ETH 接口远端端口
    int32_t  eth_read_timeout;         // ETH 接口读取超时（ms）
} eth_setting;

/* ===========================
 * GNSS配置
 * =========================== */

/* GNSS配置 */
typedef struct 
{
	uint8_t antenna;	// 天线选择，0表示内部天线，1表示外部天线

	uint8_t pps_en;	    // 是否启用pps
	float   pps_x;      // pps频率，单位Hz
	float   pps_delay;  // pps延时，单位秒
}gnss_setting;

/* ===========================
 * GNSS信息
 * =========================== */

typedef struct
{
    state locked;       // GNSS锁定状态，0-未锁定，1-锁定

    uint8_t sat_nums;  // 当前GNSS定位卫星数量

    uint8_t snr_max;   // 当前GNSS定位卫星的SNR最大值
    uint8_t snr_avg;   // 当前GNSS定位卫星的SNR平均值
    uint8_t snr_min;   // 当前GNSS定位卫星的SNR最小值

    float latitude;    // 纬度，北纬为正数，南纬为负数~
    float longitude;   // 经度，东经为正数，西经为负数
    float altitude;    // 海拔，米
    uint64_t ns_sinceepoch; // ns级系统时间戳
} gnss_info;

/* ===========================
 * 参考时钟
 * =========================== */

enum referenceclock_source : uint8_t 
{
    REFCLKSOURCE_INTERNAL, 
    REFCLKSOURCE_EXTERNAL
};

/* ===========================
 * 本振模式
 * =========================== */

enum lomode : uint8_t 
{
    LOMODE_AUTO, 
    LOMODE_HIGHSPEED,
    LOMODE_LOWSPUR, 
    LOMODE_LOWPHASENOISE
};

/* ===========================
 * 通道相关定义
 * =========================== */

/* 通道个数上限 */
#define MAXCHANNELS   8

 /* 通道全选 */
#define ALLCHANNEL    -1

/* 通道类型 */
enum channel_type : uint8_t
{
    CHANNELTYPE_RX,   // 接收通道
    CHANNELTYPE_TX,   // 发射通道
    CHANNELTYPE_VX    // 矢量网络分析通道
};

/* 通道信息 */
typedef struct
{
    void** device;        // 通道所属设备句柄
    uint16_t num;         // 通道号
    enum channel_type type; // 通道类型
} channel;

/* ===========================
 * 触发相关定义
 * =========================== */

/* 触发动作 */
enum trigger_action : uint8_t
{
    TRIGGER_ACTION_HOP,    // 执行一次跳频
    TRIGGER_ACTION_SWEEP   // 执行一次完整扫描
};

/* 触发边沿 */
enum trigger_edge : uint8_t
{
    TRIGGER_EDGE_RISING,   // 上升沿触发
    TRIGGER_EDGE_FALLING   // 下降沿触发
};

/* 触发源 */
enum trigger_source : uint8_t
{
    TRIGGER_SOURCE_BUS,      // 总线触发
    TRIGGER_SOURCE_EXTERNAL, // 外部触发
    TRIGGER_SOURCE_XPPS,     // GNSS 秒脉冲触发
    TRIGGER_SOURCE_LEVEL,    // 电平触发，仅用于Rx
    TRIGGER_SOURCE_FREQMASK  // 频谱模版触发，仅用于Rx
};

/* 发射通道触发配置 */
typedef struct
{
    enum trigger_source source; // 触发源
    enum trigger_edge   edge;   // 触发边沿
    enum trigger_action action; // 触发动作
    int32_t             count;  // 触发响应次数(-1表示无限次)
} tx_trigger;

/* 通道触发输出配置 */
typedef struct
{
    state enable;
    trigger_action action;
    trigger_edge edge;
} trigger_out;

#endif // H2_TYPEDEF_H