#ifndef DATA_PACKET_H
#define DATA_PACKET_H

#include <stdint.h>

#define PACKET_START_BYTE 0xFFFFFFFF
#define PACKET_END_BYTE   0x0000

// 数据包结构（精简版 - 有包头无校验和，含GPS）
typedef struct __attribute__((packed)) {
    uint32_t start_byte;        // 包头 (4字节) = 0xFFFFFFFF
    // uint32_t timestamp;         // 系统时间戳 (4字节)
    int32_t adc_data1;          // ADC1 数据 (4字节)
    int32_t adc_data2;          // ADC2 数据 (4字节)
    int32_t adc_data3;          // ADC3 数据 (4字节)
    uint32_t gps_time;          // GPS时间戳 (4字节) HHMMSS格式
    float gps_latitude;         // GPS纬度 (4字节)
    float gps_longitude;        // GPS经度 (4字节)
    float gps_altitude;         // GPS海拔 (4字节)
} DataPacket_t;

// 校正后数据包结构（精简版 - 有包头无校验和，含GPS）
typedef struct __attribute__((packed)) {
    uint32_t start_byte;        // 包头 (4字节) = 0xFFFFFFFF
    // uint32_t timestamp;         // 系统时间戳 (4字节)
    float corrected_x;          // 校正后X轴数据 (4字节)
    float corrected_y;          // 校正后Y轴数据 (4字节)
    float corrected_z;          // 校正后Z轴数据 (4字节)
    uint32_t gps_time;          // GPS时间戳 (4字节) HHMMSS格式
    float gps_latitude;         // GPS纬度 (4字节)
    float gps_longitude;        // GPS经度 (4字节)
    float gps_altitude;         // GPS海拔 (4字节)
} CorrectedDataPacket_t;

// 带GPS信息的校正数据包结构（精简版 - 有包头无校验和）
typedef struct __attribute__((packed)) {
    uint32_t start_byte;        // 包头 (4字节) = 0xFFFFFFFF
    // uint32_t timestamp;         // 系统时间戳 (4字节)
    float corrected_x;          // 校正后X轴数据 (4字节)
    float corrected_y;          // 校正后Y轴数据 (4字节)
    float corrected_z;          // 校正后Z轴数据 (4字节)
    uint32_t gps_time;          // GPS时间戳 (4字节) HHMMSS格式
    float gps_latitude;         // GPS纬度 (4字节)
    float gps_longitude;        // GPS经度 (4字节)
    float gps_altitude;         // GPS海拔 (4字节)
} CorrectedDataPacketWithGPS_t;

// 函数声明
uint16_t Calculate_CRC16(const uint8_t *data, uint16_t len);
void PackData(DataPacket_t *packet, int32_t adc1, int32_t adc2, int32_t adc3, 
              uint32_t gps_time, float latitude, float longitude, float altitude);
void PackCorrectedData(CorrectedDataPacket_t *packet, float x, float y, float z,
                       uint32_t gps_time, float latitude, float longitude, float altitude);
void PackCorrectedDataWithGPS(CorrectedDataPacketWithGPS_t *packet, float x, float y, float z, 
                              uint32_t gps_time, float latitude, float , float altitude);
uint8_t ValidatePacket(const DataPacket_t *packet);
uint8_t ValidateCorrectedPacket(const CorrectedDataPacket_t *packet);
uint8_t ValidateCorrectedPacketWithGPS(const CorrectedDataPacketWithGPS_t *packet);

#endif // DATA_PACKET_H
