#ifndef __RKNN_SDK_H__
#define __RKNN_SDK_H__

#include <stdint.h>

// 返回错误码
enum XErrorCode {
	RKNN_SUCCEED         =  0,         
	RKNN_NOT_INIT        = -1,  //SDK未初始化
	RKNN_INVAILD_IMGSIZE = -2,  //输入图像尺寸不匹配模型输入要求
	RKNN_INVAILD_PARAM   = -3,  //参数无效                            
};

enum ObjCls {
	OBJ_Unknown      = -1,  //未知
	OBJ_MaoGouWan    = 0,   //猫碗/狗碗      
	OBJ_BTYDiZuo     = 1,   //吧台椅底座
	OBJ_FSDiZuo      = 2,   //风扇底座
	OBJ_XiYiJi       = 3,   //洗衣机
	OBJ_BingXiang    = 4,   //冰箱    
	OBJ_MaTong       = 5,   //马桶
	OBJ_TiZhongCheng = 6,   //体重秤
	OBJ_DianXian     = 7,   //电线
	OBJ_DianShiJi    = 8,   //电视机
	OBJ_CanZhuo      = 9,   //餐桌
	OBJ_DiTan        = 10,  //地毯
	OBJ_MaBu         = 11,  //抹布
	OBJ_ChaJi        = 12,  //茶几
	OBJ_DianShiGui   = 13,  //电视柜
	OBJ_XieZi        = 14,  //拖鞋/鞋子
	OBJ_WaZi         = 15,  //袜子
	OBJ_YiGui        = 16,  //衣柜
	OBJ_Chuang       = 17,  //床
	OBJ_ShaFa        = 18,  //沙发
	OBJ_YiZi         = 19,  //椅子
	OBJ_Men          = 20,  //门
	OBJ_DLS          = 21,   //da li shi
	OBJ_DiBan        = 22   //di ban
	//OBJ_Xiang        = 21   //宠物粪便
};


// 图像信息与buffer
typedef struct _InputData {   
	int    shape[4]; // Num, Channel, Height, Width       
	void*  data;     // img.data
} InputData;

// 检测结果
typedef struct _DetRet
{
	int    nID;       //图像ID
	int    nLabel;    //物体类别 ObjCls nLabel;    //物体类别
	float  fConf;     //置信度
	float  fLeft;     //检测框左上角比例坐标x_min -> int(x_min*width)  获取像素坐标
	float  fTop;      //检测框左上角比例坐标y_min -> int(y_min*height) 获取像素坐标
	float  fRight;    //检测框右下角比例坐标x_max -> int(x_max*width)  获取像素坐标
	float  fBottom;   //检测框右下角比例坐标y_max -> int(y_max*height) 获取像素坐标
} DetRet;



#define RKNNSDK_API(retType) retType

///
#ifdef __cplusplus
extern "C" {
#endif

typedef uint64_t rknn_handle;


/*  RKNN_Create 
    SDK加载模型，仅初始化一次;  
	input:
		rknn_handle hd                 句柄
		const char* model_path         模型路径
	return:
	    int                            错误码
*/
RKNNSDK_API(int) RKNN_Create(rknn_handle* hd, const char* model_path);

/*  RKNN_ObjDet
	输入图像，获取检测结果和检测目标数量;
	input:
		rknn_handle hd                 句柄
		const InputData* input_data    输入图像数据
		DetRet** det_ret               获取检测结果
		int* det_num                   获取检测目标数量
	return:
	    int                            错误码
*/
RKNNSDK_API(int) RKNN_ObjDet(rknn_handle hd, const InputData* input_data, DetRet** det_ret, int* det_num);

/*  RKNN_Release 
    SDK资源释放，仅在程序退出前调用;
	input:
		rknn_handle hd                 句柄
	return:
	    int                            错误码
*/
RKNNSDK_API(int) RKNN_Release(rknn_handle hd);

#ifdef __cplusplus
}
#endif



#endif //__RKNN_SDK_H__
