using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace PTMedicalInsurance.Business.MetalKeyboard.JustTideEPP
{
///
/// JustTide 金属密码键盘驱动接口封装类
///
public class JustTideEPPDrv
{
// 指定 DLL 名称(确保 DLL 在程序运行目录或系统路径中)
private const string DllName = "JustTideEPPDrv.dll";
// ===================================================================
// 5.1.1 OpenCom - 打开串口
// ===================================================================
///
/// 打开通讯端口,使键盘可以进行通讯。
///
/// 串口号:1=COM1, 2=COM2, ..., 9=COM9
/// 波特率:4800, 9600, 19200, 57600, 115200
/// 成功返回 0,否则返回 -2
[DllImport(DllName, CallingConvention = CallingConvention.StdCall)]
public static extern short OpenCom(short iPort, int lBaud); // long 在 C# 中对应 int (32位)
// ===================================================================
// 5.1.2 CloseCom - 关闭串口
// ===================================================================
///
/// 关闭通讯端口,停止对键盘的通讯。
///
/// 成功返回 0,否则返回错误码
[DllImport(DllName, CallingConvention = CallingConvention.StdCall)]
public static extern short CloseCom();
// ===================================================================
// 5.1.3 PinInitialization - 密码键盘初始化
// ===================================================================
///
/// 初始化密码键盘。
///
///
/// 初始化模式:
/// 0: 初始化键盘,不清除密钥
/// 1: 初始化键盘,清除所有密钥,恢复出厂设置
///
/// 成功返回 0,否则返回错误码
[DllImport(DllName, CallingConvention = CallingConvention.StdCall)]
public static extern short PinInitialization(short iInitMode);
// ===================================================================
// 5.1.4 PinReadVersion - 读取版本信息
// ===================================================================
///
/// 读取密码键盘的版本信息、序列号和描述代码。
///
/// 输出:版本信息 (16 字节 ASCII)
/// 输出:生产序列号 (8 字节 BCD + 4 字节填充或芯片编号)
/// 输出:描述代码 (2 字节,如充电时间)
/// 成功返回 0,否则返回错误码
[DllImport(DllName, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern short PinReadVersion(
[Out] StringBuilder cpVersion,
[Out] StringBuilder cpSN,
[Out] StringBuilder cpRechang);
// ===================================================================
// 可选:定义返回值常量(根据文档补充)
// ===================================================================
public const short SUCCESS = 0;
public const short ERROR_OPEN_COM = -2;
// 注意:实际错误码需参考“函数返回表”(文档中未提供完整表)
///
/// 发送多功能控制命令(开关键盘、声音、设置模式等)
///
/// 控制命令值(详见文档 CTL 表)
/// 成功返回 0,否则返回错误码
[DllImport(DllName, CallingConvention = CallingConvention.StdCall)]
public static extern short OpenKeyVoic(short iValue);
// ===================================================================
// 便捷方法
// ===================================================================
///
/// 开启键盘(带声音)
///
public static short EnableKeyboard() => OpenKeyVoic((short)KeyControlCommand.TurnOnKeyboardAndSound);
///
/// 关闭键盘(静音)
///
public static short DisableKeyboard() => OpenKeyVoic((short)KeyControlCommand.TurnOffKeyboardAndSound);
///
/// 打开夜视灯(如支持)
///
public static short TurnOnNightLight() => OpenKeyVoic((short)KeyControlCommand.TurnOnNightVisionLight);
///
/// 关闭夜视灯(如支持)
///
public static short TurnOffNightLight() => OpenKeyVoic((short)KeyControlCommand.TurnOffNightVisionLight);
///
/// 设置通信编码模式:0-9加30H, A-F加37H
///
public static short SetHexEncoding() => OpenKeyVoic((short)KeyControlCommand.CommEncodingHex37H);
///
/// 从密码键盘接收一个按键字符(阻塞式,带超时)
///
/// 输出:接收到的字符(ASCII)
/// 超时时间(毫秒)
/// 成功返回 0;超时或错误返回非 0 值
[DllImport(DllName, CallingConvention = CallingConvention.StdCall)]
public static extern short PinReportPressed(ref char cpKey, short iTimeOut);
}
// ===================================================================
// 枚举:常用控制命令(便于使用)
// ===================================================================
public enum KeyControlCommand : short
{
///
/// 关闭键盘 + 关闭蜂鸣声(非固化)
///
TurnOffKeyboardAndSound = 0x00,
///
/// 打开键盘 + 关闭蜂鸣声(非固化)
///
TurnOnKeyboardMuteSound = 0x01,
///
/// 关闭键盘 + 打开蜂鸣声(非固化)
///
TurnOffKeyboardOnlySound = 0x02,
///
/// 打开键盘 + 打开蜂鸣声(非固化,正常模式)
///
TurnOnKeyboardAndSound = 0x03,
///
/// IC卡使用 02 头命令(固化,默认)
///
ICCardUse02Header = 0x04,
///
/// IC卡使用 ESC(1B) 头命令(固化)
///
ICCardUseEscHeader = 0x05,
///
/// 打开夜视灯(非固化,需硬件支持)
///
TurnOnNightVisionLight = 0x06,
///
/// 关闭夜视灯(非固化,需硬件支持)
///
TurnOffNightVisionLight = 0x07,
///
/// 命令尾不加 03h(固化)
///
CommandTailNo03 = 0x08,
///
/// 命令尾加 03h(固化)
///
CommandTailWith03 = 0x09,
///
/// 更正键:删除所有已输入字符(固化,默认)
///
CorrectKeyDeleteAll = 0x14, // 20
///
/// 更正键:删除一个字符(固化)
///
CorrectKeyDeleteOne = 0x15, // 21
///
/// 通信:拆分后全加 30H(固化)
///
CommEncodingAdd30H = 0x1E, // 30
///
/// 通信:0-9加30H, A-F加37H(固化)
///
CommEncodingHex37H = 0x25, // 37
// 波特率设置(0x41 ~ 0x48)
SetBaudRate1200 = 0x41,
SetBaudRate2400 = 0x42,
SetBaudRate4800 = 0x43,
SetBaudRate9600 = 0x44,
SetBaudRate19200 = 0x45,
SetBaudRate38400 = 0x46,
SetBaudRate57600 = 0x47,
SetBaudRate115200 = 0x48,
}
}