// ============================================================
//  wrapper_v3.h  — 公共 C API（Python 通过 ctypes 调这个）
//
//  全部用 void* 和 C 基本类型，无需理解 C++ 或 SDK 内部结构。
//  程序员只需要把 wrapper_v3.cpp 编译成 DLL，这个头文件给 Python 用。
// ============================================================

#ifndef WRAPPER_V3_H
#define WRAPPER_V3_H

#ifdef __cplusplus
extern "C" {
#endif

// ─── 错误码 ───
#define WRAPPER_OK         0
#define ERR_NO_DONGLE     -1
#define ERR_NO_DEVICE     -2
#define ERR_INIT_FAIL     -3
#define ERR_SCAN_FAIL     -4
#define ERR_INVALID_PARAM -5
#define ERR_DLL_MISSING   -6
#define ERR_FUNC_MISSING  -7
#define ERR_DEVICE_BUSY   -8

// ─── 扫描模式 ───
#define SCAN_MODE_LARGE    -2   // 大范围
#define SCAN_MODE_SMALL    -1   // 小范围

// ─── USB 模式 ───
#define USB_MODE_2         2    // USB 2.0
#define USB_MODE_3         3    // USB 3.0

// ─── 数据结构 ───

// 扫描仪配置参数
typedef struct _ScannerParams {
    // 基本信息
    int    usbMode;              // USB_MODE_2 或 USB_MODE_3
    int    scanMode;             // SCAN_MODE_LARGE 或 SCAN_MODE_SMALL
    
    // 曝光参数
    double expTime[3];           // [0]=16.4, [1]=32.9, [2]=49.4 (ms)
    int    initExpTime;          // 初始曝光索引 (0/1/2)
    int    initGlobalGain;       // USB3.0:40, USB2.0:7
    
    // 投影参数
    int    prjWidth;             // 投影宽度：≥2000
    int    prjResSel;            // 投影分辨率：9
    int    prjTimes;             // 投影次数：3
    int    prjMethod;            // 投影方式：1
    
    // 过滤参数
    int    distFiltProp;         // 距离过滤：30
    int    minProcessPixVal;     // 最小处理像素值：10
    
    // 硬件类型（由 SDK 自动填充）
    int    hardwareDevType;      // 【运行时】由 wrapper 自动填充
    int    leftCameraUserID;     // 【运行时】由 wrapper 自动填充
    
    // 亮度
    int    brightness;           // USB3.0:65-110, USB2.0:20-35
    
    // 是否使用 ICP
    int    useICP;               // 0=关, 1=开
    
    // 数据模式
    int    dataMode;             // 1=内存, 2=文件
} ScannerParams;

// 设备信息
typedef struct _DeviceInfo {
    int    devCount;             // 设备数量
    int    devId;                // 设备 ID
    int    devType;              // 设备类型 (1=Fs, 2=Fw)
    int    dogId;                // 加密狗 ID
    int    hasColor;             // 是否有彩色信息
    double workDist;             // 工作距离
    double avgDist;              // 平均点距
} DeviceInfo;

// 单点（PT3D20 简化版）
typedef struct _Point3D {
    float  x, y, z;              // 坐标
    unsigned char r, g, b, f;    // 颜色(0-255)，f=1表示有效点
} Point3D;

// ─── 核心函数 ───

// ① 初始化 / 关闭 SDK
__declspec(dllexport) int   wrp_init_sdk(void);
__declspec(dllexport) void  wrp_cleanup_sdk(void);

// ② 设备管理
__declspec(dllexport) int   wrp_open_dongle(void);
__declspec(dllexport) void  wrp_close_dongle(void);
__declspec(dllexport) int   wrp_get_device_info(DeviceInfo* info);

// ③ 初始化扫描仪（最复杂的一步）
__declspec(dllexport) int   wrp_init_scanner(const ScannerParams* params);
__declspec(dllexport) void  wrp_close_scanner(void);

// ④ 亮度控制
__declspec(dllexport) int   wrp_set_brightness(int value, int* newValue);

// ⑤ 设置投影范围
__declspec(dllexport) int   wrp_set_project_mode(int mode);

// ⑥ 单次扫描（同步版 — 等得起）
//    返回: 数据对象句柄 (void*)，用完必须 wrp_data_release
__declspec(dllexport) void* wrp_scan_frame(void);

// ⑦ 开始连续扫描（异步）
__declspec(dllexport) int   wrp_start_continuous_scan(void);

// ⑧ 停止连续扫描
__declspec(dllexport) int   wrp_stop_scan(void);

// ⑨ 取最新一帧数据（连续扫描中）
__declspec(dllexport) void* wrp_get_latest_frame(void);

// ─── 数据处理函数 ───

// 数据对象操作
__declspec(dllexport) int   wrp_data_clone(void* src, void** dst);
__declspec(dllexport) void  wrp_data_release(void* obj);

// 获取点云数据到缓冲区
// ptsBuf 大小应 >= width * height * sizeof(Point3D)
// 先调一次(width=NULL)获取宽高，再调第二次取数据
__declspec(dllexport) int   wrp_data_copy_to(void* obj, Point3D* ptsBuf,
                                              int* width, int* height);

// ICP 配准（data → target）
__declspec(dllexport) int   wrp_data_icp_to(void* data, void* target,
                                             int* iters /* [in/out] */);

// 获取/设置 RT 矩阵（3×4 double）
__declspec(dllexport) int   wrp_data_get_rt(void* obj, double* rtOut);
__declspec(dllexport) int   wrp_data_set_rt(void* obj, const double* rtIn);

// 后处理
__declspec(dllexport) int   wrp_data_delete_border(void* obj, float distProp);
__declspec(dllexport) int   wrp_data_delete_small_pieces(void* obj,
                                                          float maxProp,
                                                          int minPiece);

// 体素融合准备
__declspec(dllexport) int   wrp_data_create_box(void* obj);  // 用默认参数
__declspec(dllexport) int   wrp_data_integrate(void* dst, void* src);

// 导出
__declspec(dllexport) int   wrp_data_save_stl(void* obj, const char* path,
                                               float* progress);
__declspec(dllexport) int   wrp_data_save_asc(void* obj, const char* path,
                                               int withColor);
__declspec(dllexport) int   wrp_data_save_ply(void* obj, const char* path,
                                               float* progress);
__declspec(dllexport) int   wrp_data_save_obj(void* obj, const char* path,
                                               float* progress);

// ─── 全局配准 ───
__declspec(dllexport) void* wrp_create_global_registration(void);
__declspec(dllexport) int   wrp_gr_add_frame(void* grObj, void* dataObj,
                                              const char* label);
__declspec(dllexport) int   wrp_gr_analyze(void* grObj, float* progress);
__declspec(dllexport) int   wrp_gr_run(void* grObj, int iters);
__declspec(dllexport) void* wrp_gr_fuse_and_export(void* grObj,
                                                    const char* stlPath,
                                                    int   hasColor);

#ifdef __cplusplus
}
#endif

#endif /* WRAPPER_V3_H */
