using System;
using System.Runtime.InteropServices;
using System.Text;
namespace EC.AutoWeightServer.IfManager.FingerPrint
{
///
/// 指纹动态库有两套独立的对外接口,一套是简单接口,一套是复杂接口;
/// 简单接口以函数名 FPI 开始,调用接口较少,开发者不用关心底层调用,直接调用对外接口即可,使用非常简单。但是这种方式相呆板,不能够进行配置。
/// 复杂接口以函数名 Tc 开始,调用接口较多,需要自己对指纹设备或者算法进行控制,当然,也可以使用默认值。复杂接口可以非常灵活的使用,可以对一些功能进行配置,例如,是否显示对话框,配置超时时间等功能。
///
public class TesoLiveSDK
{
#region FPI(No Test)
///
/// 获得注册指纹模板。驱动 USB 指纹设备时,可以获得图像
///
/// 端口号,0=USB,1=COM1,2=COM2,3=COM3...
/// 输出的 B64 模板缓冲,最大 513 字节(含'\0'结束符)
/// 返回注册指纹模板实际长度(不含'\0'结束符)
/// 返回出错时字符串信息,最大 64 字节(含'\0'结束符)
/// 成功时:返回值大于等于0,失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int FPIGetTemplate(int nPort, byte[] pRegBuf, ref int pnRegLen, byte[] pszErrMsg);
//public static extern int FPIGetTemplate(int nPort, ref string pRegBuf, ref int pnRegLen, ref string pszErrMsg);
//int FPIGetTemplate(int nPort, char* pRegBuf, int* pnRegLen, char* pszErrMsg);
///
/// 获得验证用的指纹特征;驱动 USB 指纹设备时,可以获得图像
///
/// 端口号,0=USB,1=COM1,2=COM2,3=COM3...
/// 输出的 B64 特征缓冲,最大 513 字节(含'\0'结束符)
/// 返回验证指纹特征实际长度(不含'\0'结束符)
/// 返回出错时字符串信息,最大 64 字节(含'\0'结束符)
/// 成功时:返回值大于等于0,失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int FPIGetFeature(int nPort, ref byte pVerBuf, ref int pnVerLen, ref byte pszErrMsg);
//int FPIGetFeature(int nPort, char* pVerBuf, int* pnVerLen, char* pszErrMsg);
///
/// 比对采集时得到的模板和特征数据,可指定安全级
///
/// 输入的 B64 模板数据,最大 513 字节(含'\0'结束符)
/// 输入的 B64 特征数据,最大 513 字节(含'\0'结束符)
/// 全级别,数字[1, 5],默认为 3 级别
/// 成功时:返回值大于等于0,失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int FPIMatch(string pRegBuf, string pVerBuf, int nLevel = 3);
//int FPIMatch(const char* pRegBuf, const char* pVerBuf,int nLevel);
///
/// 取得指纹图像
///
/// 要取得指纹图像的索引数字[1, 3]
/// 成功时:返回B64编码纯数据区图像,失败时:返回NULL
[DllImport("TesoLive.dll")]
public static extern string FPIGetImageData(int nImageIdx);
//char* FPIGetImageData(int nImageIdx);
///
/// 通过前期采集的一幅指纹图象数据,产生验证用特征数据
///
/// B64 编码图像,请参见 FPIGetImageData 函数中的说明
/// 输出的B64特征缓冲,最大513字节(含'\0'结束符)
/// 返回验证指纹特征实际长度(不含'\0'结束符)
/// 返回出错时字符串信息,最大 64 字节(含'\0'结束符)
/// 成功时:返回值大于等于0,失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int FPIGetFeatureByImg(string pImg, ref byte pVerBuf, ref int pnVerLen, ref byte pszErrMsg);
//int FPIGetFeatureByImg(const char* pImg,char* pVerBuf, int* pnVerLen,char* pszErrMsg);
///
/// 通过前期采集的三幅指纹图象数据,产生注册用模版数据
///
/// B64 编码图像 1,请参见 FPIGetImageData 函数中的说明
/// B64 编码图像 2,请参见 FPIGetImageData 函数中的说明
/// B64 编码图像 3,请参见 FPIGetImageData 函数中的说明
/// 输出的B64模板缓冲,最大513字节(含'\0'结束符)
/// 返回注册指纹模板实际长度(不含'\0'结束符)
/// 返回出错时字符串信息,最大 64 字节(含'\0'结束符)
/// 成功时:返回值大于等于0,失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int FPIGetTemplateByImg(string pImg1, string pImg2, string pImg3, ref byte pRegBuf, ref int pnRegLen, ref byte pszErrMsg);
//int FPIGetTemplateByImg(const char* pImg1, const char* pImg2, const char* pImg3, char* pRegBuf, int* pnRegLen,char* pszErrMsg);
#endregion FPI(No Test)
#region Tc(Test)
///
/// 创建通讯句柄,并初始化环境
///
/// 通讯端口号(USB=0,COM=[1, 255])
/// 协议号(USB=0,COM=2)
/// 索引号(波特率级别,默认给 3,如表 1 所示)
/// 串口是否提速(如果是 USB 则,该值为 0,如果是串口,则该值为 2)
/// 成功时:返回值大于等于0(句柄),失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcCreateHDL(int port, int nPort, int nRidx, int nSped);
//int TcCreateHDL(int Port, int nPort, int nRidx, int nSped);
///
/// 释放句柄所占用资源,若设备已连接则会自行断开
///
/// 由 TcCreateHDL 获取的上下文控制句柄
/// 成功时:返回值大于等于0,失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcDeleteHDL(int vHdl);
//int TcDeleteHDL(int vHdl);
///
/// 连接设备,等待用户按捺 3 或者 4 次直到超时(超时默认 30 秒),成功后返回模板
///
/// 由 TcCreateHDL 获取的上下文控制句柄
/// 返回的模板数据(最大不会超过 513 字节)
/// 成功时:返回值大于等于0(模板长度),失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcDoTemplet(int vHdl, byte[] hTpl);
//int TcDoTemplet(int vHdl, void* hTpl);
///
/// 连接设备,等待用户按捺一次直到超时(默认超时 18 秒),成功后返回特征
///
/// 由 TcCreateHDL 获取的上下文控制句柄
/// 返回的特征数据(最大不会超过 513 字节)
/// 成功时:返回值大于等于0(特征长度),失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcDoFeature(int vHdl, byte[] hFea);
//int TcDoFeature(int vHdl, void* hFea);
///
/// 基于安全级别,比对给定的特征和模板,判断它俩是否匹配
///
/// 由 TcCreateHDL 获取的上下文控制句柄(一般传 0 值即可)
/// 指纹特征数据
/// 指纹模板数据
/// 安全等级[1-5]
/// 成功时:返回值大于等于0,失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcSafeMatch(int vHdl, string hFea, string hTpl, int nLvl = 3);
//int TcSafeMatch(int vHdl, const void* hFea,const void* hTpl, int nLvl);
///
/// 配置是否弹出对话框,采集指纹特征超时时间等
///
/// 由 TcCreateHDL 获取的上下文控制句柄
/// 操作方向(0=设定新值,1=读取配置值)
/// 准备要操作的功能代码(详见配置参数宏定义说明)
/// 要配置的新值(详见配置参数宏定义说明)
/// 固定 NULL
/// 成功时:返回值大于等于0,失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcExtnEntry(int vHdl, int nRead, int nIdx, int nVal, string hVoid);
//int TcExtnEntry(int vHdl, int nRead, int nIdx, int nVal, void* hVoid);
///
/// 控制设备上的 LED 闪灯和 BUZZER 蜂鸣,声光同时提示
///
/// 由 TcCreateHDL 获取的上下文控制句柄
/// 方式:0=短嘀,1=长嘀,2=嘀嘀
/// 成功时:返回值大于等于0,失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcBeepLight(int vHdl, int nMode);
//int TcBeepLight(int vHdl, int nMode);
///
/// 获取设备的 32 字节的 SN 产品序列号+1 字节'\0'
///
/// 由 TcCreateHDL 获取的上下文控制句柄
/// 返回的 SN 字符串(建议提供 64 个字节缓存)
/// 成功时:返回值大于等于0( SN 的长度),失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcReadDevSn(int vHdl, StringBuilder chSn);
//int TcReadDevSn(int vHdl, char* chSn);
///
/// 获取内核版本
///
/// 由 TcCreateHDL 获取的上下文控制句柄
/// 返回的 SN 字符串(建议提供 64 个字节缓存)
/// 成功时:返回值大于等于0( SN 的长度),失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcGetDevVsin(int vHdl, StringBuilder devSn);
#endregion Tc(Test)
#region Tc(No Test)
///
/// 读取 Win32 的标准 BMP 文件到内存里
///
/// 要读取的来源 BMP 文件的路径
/// 要写入的目标内存缓存区
/// 固定为 3
/// 成功时:返回值大于等于0(编码后图像长度),失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcLoadFrBmp(string chFile, IntPtr hFpr, int nStyle);
//int TcLoadFrBmp(const char* chFile, void* hFpr, int nStyle);
///
/// 指定句柄内五个图像缓冲区中的一个,获取图像数据区数据;
/// 在调用此函数前,一定要先调用 TcDoTemplet 或者 TcDoFeature。否则调用失败
///
/// 由 TcCreateHDL 获取的上下文控制句柄
/// 图像缓冲号[0, 4],特征区号 128+[0, 4]
/// 返回图像或特征数据区数据,如果是图像建议大小 90K 空间大小
/// 成功时:返回值大于等于0(图像/特征数据长度),失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcGetImgDat(int vHdl, int nIdx, IntPtr hFpr);
//int TcGetImgDat(int vHdl, int nIdx, void* hFpr);
///
/// 另存指纹图像为 Win32 的标准 BMP 文件格式
///
/// 要保存的目标 BMP 文件,已存在则覆盖
/// 由 TcGetImgDat 获取的,将要保存的图像数据
/// 成功时:返回值大于等于0(保存的 BMP 文件字节大小),失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcSaveAsBmp(string chFile, IntPtr hFpr);
//int TcSaveAsBmp(const char* chFile, const void* hFpr);
///
/// 由给定的一枚指纹图像,提取出一枚指纹特征
///
/// TcCreateHDL 获取的上下文控制句柄
/// 由 TcGetImgDat 或者 TcLoadFrBmp 的一枚图像数据
/// 指纹特征数据(最大 513 字节,非定长)
/// 成功时:返回值大于等于0(特征长度),失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcFeaFrmImg(int vHdl, IntPtr hFpr, StringBuilder hFea);
//int TcFeaFrmImg(int vHdl, const void* hFpr, void* hFea);
///
/// 由给定的四枚指纹 BMP 图像(或特征),合成出一枚指纹模板
///
/// 由 TcCreateHDL 获取的上下文控制句柄
/// 由 TcGetImgDat 或者 TcLoadFrBmp 获取的四枚图像数据
///
///
/// 其中第四枚图像可以传入 NULL
/// 指纹模板数据(最大 513 字节,非定长)
/// 成功时:返回值大于等于0(模板长度),失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcTplFrmImg(int vHdl, IntPtr hFp0, IntPtr hFp1, IntPtr hFp2, IntPtr hFp3, StringBuilder hTpl);
//int TcTplFrmImg(int vHdl, const void* hFp0, const void* hFp1, const void* hFp2, const void* hFp3, void* hTpl);
///
/// 给定端口区间,速率,返回首个设备所在的端口号
///
/// 要搜索的目标端口区间[],0 为 USB,>=1 为 COM
///
/// 串口波特率索引号[0, 7],对应为[1200, 115200]
/// 默认 0
/// BP 盒的前后缀字串儿,可为 NULL,默认用'|'分隔
/// 成功时:返回值大于等于0(0 为 USB,>=1 为 COM,1-com1,2-com2…),失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcWhereAreu(int nBgn, int nEnd, int nRidx, int nMask, string chFix);
//int TcWhereAreu(int nBgn, int nEnd, int nRidx, int nMask, const char* chFix);
///
/// 判断是否有手指按捺(仅限于 USB 设备使用)
///
/// TcCreateHDL 获取的上下文控制句柄
/// 成功时:返回值大于等于0(有手指按捺),失败时:返回值小于0(详见函数返回码说明)
[DllImport("TesoLive.dll")]
public static extern int TcChkPressed(int vHdl);
//int TcChkPressed(int vHdl);
#endregion Tc(No Test)
}
}