////**********************************************************************************************************
//
//  Copyright(c) 2017, Shenzhen Gaochuan Industrial Automation Co.,Ltd
//
//  Moudle Name :   nio_lib20.h
//
//  Abstract    :   GaoChuan IO 2.0 User Header
//
//  Note        :   
// Modification History :
////**********************************************************************************************************
#ifndef _H_NIO_LIB20_H_
#define _H_NIO_LIB20_H_

#ifdef __cplusplus
extern "C" {
#endif

//------------------------------------------------------------------------------------------------------------
//
//              宏定义
//
//------------------------------------------------------------------------------------------------------------
// 编译控制
#ifndef NIO_API
    #ifdef WIN32 
        #ifdef NIO_LIB_EXPORTS
            #define NIO_API __declspec(dllexport)
        #else
            #define NIO_API 
        #endif
    #else
        #define NIO_API 
        #define __stdcall 
    #endif    
#endif


// 标准数据类型定义
typedef unsigned char  U8;
typedef short          I16;
typedef unsigned short U16;
typedef long           I32;
typedef unsigned long  U32;
typedef float          F32;
typedef double         F64;

// 句柄类型定义
typedef     unsigned short*     PHAND;
typedef     unsigned short      HAND;


//设备信息结构
typedef struct
{
    I16 address;			// 板上的拨码地址
	I16 diNum;				// 资源数量：数字量输入
	I16 doNum;				// 资源数量：数字量输出
	I16 adNum;				// 资源数量：模拟量输入
	I16 daNum;				// 资源数量：模拟量输出
	I16 intNum;				// 资源数量：中断数量
	I16 encNum;				// 资源数量：编码器数量
    I16 resource[17];       // 资源列表
}TIODevInfo;

// 板卡搜寻
// 参数: mode:通讯模式
// pDevNum : 返回设备的数目
// pInfoList：返回设备信息
NIO_API I16 __stdcall NIO_DevSearch( I16 mode, I16 *pDevNum, TIODevInfo *pInfoList );

// 板卡打开（根据序号）
// devNo: 设备序号,取值范围[0,n]； pDevHandle: 返回设备操作句柄
NIO_API I16 __stdcall NIO_DevOpen ( I16 devNo, PHAND pDevHandle );

// 板卡打开（根据拨码地址）
NIO_API I16 __stdcall NIO_DevOpenByAddress ( I16 addr, PHAND pDevHandle );

// 获取卡信息
// pCardInfo:信息
NIO_API I16 __stdcall NIO_DevGetInfo ( HAND devHandle, TIODevInfo *pCardInfo );
NIO_API I16 __stdcall NIO_DevReset ( HAND devHandle);
// 获取错误代码信息
// errCode:错误代码
// errDesc:返回的错误代码描述
NIO_API short  __stdcall NIO_GetErrDesc( short errCode,char *errDesc);


// 数字量输入
NIO_API I16 __stdcall NIO_DIGet32Bit(HAND devHandle,I16 offset,I32 *pValue);
NIO_API I16 __stdcall NIO_DIGet16Bit(HAND devHandle,I16 offset,I16 *pValue);
NIO_API I16 __stdcall NIO_DIGetBit(HAND devHandle,I16 offset,I16 *pValue);


// 数字量输出
NIO_API I16 __stdcall NIO_DOSet32Bit(HAND devHandle,I16 offset,I32 val);
NIO_API I16 __stdcall NIO_DOSet16Bit(HAND devHandle,I16 offset,I16 val);
NIO_API I16 __stdcall NIO_DOSetBit(HAND devHandle,I16 offset,I16 val);

NIO_API I16 __stdcall NIO_DOGet32Bit(HAND devHandle,I16 offset,I32 *pValue);
NIO_API I16 __stdcall NIO_DOGet16Bit(HAND devHandle,I16 offset,I16 *pValue);
NIO_API I16 __stdcall NIO_DOGetBit(HAND devHandle,I16 offset,I16 *pValue);


// -----------------------------------------------------------------中断
//中断回调函数指针定义
typedef void (*GCNIO_IntCallback)(void);

// 设置中断
// idx	  : 中断序号，取值范围[0,1]
// sns	  : 中断触发电平: 0下降沿 1上升沿
// autoClr: 中断触发后是否自动清除标志位
// onOff  : 操作标志位，0:关闭 1:打开 2:清除状态
NIO_API I16 __stdcall NIO_IntConfig(HAND devHandle,I16 idx,I16 sns,I16 autoClr,I16 onOff,GCNIO_IntCallback pCallback);

// 中断清除，中断触发后，需要清除才能接收下一次中断
// idx	  : 中断序号，取值范围[0,1]
NIO_API I16 __stdcall NIO_IntClr(HAND devHandle,I16 idx);

// 中断软触发
// idx	  : 中断序号，取值范围[0,1]
NIO_API I16 __stdcall NIO_IntPreSet(HAND devHandle,I16 idx);

// 读取中断状态
// idx	  : 中断序号，取值范围[0,1]
// pTrigCnt	  : 中断触发计数
// pOnOff  : 中断的开关状态，0:关闭 1:打开 2:清除状态
NIO_API I16 __stdcall NIO_IntGetSts(HAND devHandle,I16 idx,I32 *pTrigCnt,I16 *pOnOff);

// 模拟量输入


// 模拟量输出





#ifdef __cplusplus
}
#endif


#endif  // _H_NIO_LIB20_H_
