using Edge.Core.Parser.BinaryParser.MessageEntity;
using Edge.Core.Parser.BinaryParser.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Edge.Core.Parser.BinaryParser.Util;
namespace ShengJu_CUT100_DES.MessageEntity
{
public enum CommandType
{
保留0x11 = 0x11,
保留0x12 = 0x12,
保留0x13 = 0x13,
///
/// 通过 INT 引脚可以输出控制信号
///
通用命令_控制LED闪烁 = 0x14,
///
/// 返回模块版本 ASCII 码信息
///
通用命令_读取模块信息 = 0x15,
///
/// 此命令可以读取 A 型卡卡号
///
通用命令_A型卡激活 = 0x16,
///
/// 此命令可以读取 B 型卡卡号(仅 CUT-200系列读卡模块支持)
///
通用命令_RC523_B型卡激活 = 0x17,
///
/// 后续可以进行 APDU 命令操作
///
通用命令_激活卡片到ISO1443_4 = 0x18,
///
/// 数据透传命令,支持自定义开发 CPU 卡
///
通用命令_CPU卡数据透传APDU = 0x19,
///
/// 通过验证根密钥重建卡片文件结构
///
DesFireEV1操作命令_格式化卡片 = 0xB0,
///
/// 验证对应的密钥读取应用文件数据
///
DesFireEV1操作命令_写数据_高级命令 = 0xB1,
DesFireEV1操作命令_读数据_高级命令 = 0xB2,
DesFireEV1操作命令_更改密钥 = 0xB3,
DesFireEV1操作命令_增加应用 = 0xB4,
DesFireEV1操作命令_写应用目录下的文件数据 = 0xB5,
DesFireEV1操作命令_读应用目录下的文件数据 = 0xB6,
DesFireEV1操作命令_修改指定应用目录下指定密钥ID的密钥值 = 0xB7,
DesFireEV1操作命令_获取卡片应用目录信息 = 0xB8,
///
/// 单步指令-选择应用目录
///
DesFireEV1操作命令_选择应用目录 = 0xB9,
///
/// 单步指令-密钥验证
///
DesFireEV1操作命令_验证密钥 = 0xBA,
///
/// 单步指令-读指定的文件数据
///
DesFireEV1操作命令_读数据_基本命令 = 0xBB,
///
/// 单步指令-写指定的文件数据
///
DesFireEV1操作命令_写数据_基本命令 = 0xBC,
}
public abstract class MessageBase : MessageTemplateBase
{
///
/// 整个数据帧的长度,包含 LEN 本身及帧最后的校验值
///
[Format(1, EncodingType.BIN, -9999)]
[Range(4, 0x32, "数据长度 must be range from {1} to {2}, but actual is {0}")]
public byte Length { get; set; }
///
/// 读卡模块的地址,485 通信会校验此地址,地址错误模块不响应命令
///
[Format(1, EncodingType.BIN, -9950)]
[Range(0, 255, "模块地址 must be range from {1} to {2}, but actual is {0}")]
public byte ModulePhysicalAddress { get; set; } = 1;
[Format(1, EncodingType.BIN, -9930)]
public CommandType 命令代码 { get; set; }
///
/// 数据区+校验值(除了 CHECK 以外的所有数据累加和取反后取最低字节)
///
[EnumerableFormat("%cascade", 0)]
public List RawDataAndCheck { get; set; }
//public override string ToLogString()
//{
// if (this.ControlCharacter == ControlCharacter.EOT)
// return "EOT(Adrs: 0x" + this.Adrs.ToString("X").PadLeft(2, '0') + ", SeqNo: 0x" + this.BlockSeqNumber.ToString("X").PadLeft(2, '0') + ")";
// else if (this.ControlCharacter == ControlCharacter.ACK)
// return "ACK(Adrs: 0x" + this.Adrs.ToString("X").PadLeft(2, '0') + ", SeqNo: 0x" + this.BlockSeqNumber.ToString("X").PadLeft(2, '0') + ")";
// else
// return base.ToLogString();
//}
}
}