📄 cardreviewerdlg.cpp
字号:
{
memset(szVerifyVal, 0, sizeof(szVerifyVal));
memset(szInfo, 0, sizeof(szInfo));
pszPos = &m_szCardData[(24 + nCur) * 32];
StrXor((char *)pszPos, 30, (char *)szVerifyVal);
if (memcmp(pszPos + 30, szVerifyVal, 2) != 0)
{
_snprintf(szInfo, sizeof(szInfo), "S6B%d校验位错误", nCur);
m_ListAnalyse.AddMsg(szInfo, M_ERROR);
}
else
{
_snprintf(szInfo, sizeof(szInfo), "S6B%d校验位正确", nCur);
m_ListAnalyse.AddMsg(szInfo, M_OK);
}
}
memset(szInfo, 0, sizeof(szInfo));
if (memcmp(&m_szCardData[24 * 32], &m_szCardData[25 * 32], 32) != 0)
{
_snprintf(szInfo, sizeof(szInfo), "S6B0和S6B1不符合!");
m_ListAnalyse.AddMsg(szInfo, M_ERROR);
}
else
{
_snprintf(szInfo, sizeof(szInfo), "S6B0和S6B1符合");
m_ListAnalyse.AddMsg(szInfo, M_OK);
}
IsValidPublic(&m_szCardData[24 * 32]);
IsValidPublic(&m_szCardData[25 * 32]);
// 判断是否为黑名单卡
if (memcmp(&m_szCardData[24 * 32 + 12], "04", 2) == 0)
{
_snprintf(szInfo, sizeof(szInfo), "次卡为黑名单卡!");
m_ListAnalyse.AddMsg(szInfo, M_ERROR);
GetDlgItem(IDC_BUTTONUnBlockCard)->EnableWindow(TRUE);
}
}
// Flush Card Content
void CCardReviewerDlg::ShowCardInfo(void)
{
char szVerifyVal[3] = {0};
char szInfo[256] = {0};
char szValue[32] = {0};
char *pszPos = NULL;
int nCur = 0;
if ('\0' == m_szCardData[0])
{
_snprintf(szInfo, sizeof(szInfo), "读卡错误");
m_ListAnalyse.AddMsg(szInfo, M_ERROR);
return ;
}
// 城市代码
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[4 * 32], 4);
SetEditText(IDC_EDITCityCode, szValue);
// 行业代码
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[4 * 32 + 4], 4);
SetEditText(IDC_EDITIndustryCode, szValue);
// 发行流水 ==> 用户卡号
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[4 * 32 + 8], 8);
char szCardNo[32] = {0};
int nCardNo = HexStrToLong(szValue, 8);
_snprintf(szCardNo, sizeof(szCardNo), "1500%08d", nCardNo);
SetEditText(IDC_EDITCardNo, szCardNo);
// 卡认证码
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[4 * 32 + 16], 8);
SetEditText(IDC_EDITCardMAC, szValue);
// 启用标志
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[4 * 32 + 24], 2);
if (memcmp(szValue, "01", 2) == 0)
{
SetEditText(IDC_EDITInitFlag, "未启用");
}
else if (memcmp(szValue, "02", 2) == 0)
{
SetEditText(IDC_EDITInitFlag, "启用");
}
else if (memcmp(szValue, "03", 2) == 0)
{
SetEditText(IDC_EDITInitFlag, "停用");
}
else if (memcmp(szValue, "04", 2) == 0)
{
SetEditText(IDC_EDITInitFlag, "黑名单卡");
}
else
{
SetEditText(IDC_EDITInitFlag, szValue);
_snprintf(szInfo, sizeof(szInfo), "未知启用标志");
m_ListAnalyse.AddMsg(szInfo, M_WARING);
}
// 卡类
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[4 * 32 + 26], 2);
if (memcmp(szValue, "00", 2) == 0)
{
SetEditText(IDC_EDITCardType, "普通卡");
}
else if (memcmp(szValue, "01", 2) == 0)
{
SetEditText(IDC_EDITCardType, "学生卡");
}
else if (memcmp(szValue, "02", 2) == 0)
{
SetEditText(IDC_EDITCardType, "老人卡");
}
else if (memcmp(szValue, "03", 2) == 0)
{
SetEditText(IDC_EDITCardType, "优待卡");
}
else
{
SetEditText(IDC_EDITCardType, szValue);
_snprintf(szInfo, sizeof(szInfo), "未知卡");
m_ListAnalyse.AddMsg(szInfo, M_WARING);
}
// 卡片押金
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[4 * 32 + 28], 2);
int nForgift = HexStrToLong(szValue, 2);
_snprintf(szValue, sizeof(szValue), "%0.02f元", (float)nForgift);
SetEditText(IDC_EDITForegift, szValue);
// 发行日期
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[5 * 32], 8);
SetEditText(IDC_EDITIssueDate, szValue);
// 有效日期
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[5 * 32 + 8], 8);
SetEditText(IDC_EDITVaildDate, szValue);
// 启用日期
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[5 * 32 + 16], 8);
SetEditText(IDC_EDITStartDate, szValue);
// 充值时间
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[6 * 32], 8);
SetEditText(IDC_EDITReloadTime, szValue);
// 充值前余额
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[6 * 32 + 8], 8);
int nAmt = ConverseHexStrToLong(szValue, 8);
_snprintf(szValue, sizeof(szValue), "%0.02f.元", (float)nAmt / 100);
SetEditText(IDC_EDITReloadBefore, szValue);
// 本次充值金额
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[6 * 32 + 16], 4);
_snprintf(szValue, sizeof(szValue), "%0.02f.元", (float)atoi(szValue) / 100);
SetEditText(IDC_EDITCurReload, szValue);
// 操作员号
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[6 * 32 + 20], 6);
SetEditText(IDC_EDITOperator, szValue);
// 充值总额
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[8 * 32], 8);
nAmt = ConverseHexStrToLong(szValue, 8);
_snprintf(szValue, sizeof(szValue), "%0.02f.元", (float)nAmt / 100);
SetEditText(IDC_EDITTotalReload, szValue);
// 最大余额
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[8 * 32 + 8], 8);
nAmt = ConverseHexStrToLong(szValue, 8);
_snprintf(szValue, sizeof(szValue), "%0.02f.元", (float)nAmt / 100);
SetEditText(IDC_EDITMaxAmt, szValue);
// 充值设备编号
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[8 * 32 + 16], 8);
SetEditText(IDC_EDITReloadDev, szValue);
// 钱包金额
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[9 * 32], 8);
nAmt = ConverseHexStrToLong(szValue, 8);
_snprintf(szValue, sizeof(szValue), "%0.02f.元", (float)nAmt / 100);
SetEditText(IDC_EDITPurseAmt, szValue);
_snprintf(szValue, sizeof(szValue), "%0.02f元", (float)nAmt / 100);
IC_LcdClrScrn(m_hPOS, 0);
IC_LcdClrScrn(m_hPOS, 1);
IC_DispInfo(m_hPOS, 1, 0, szValue);
IC_DispInfo(m_hPOS, 0, 0, "卡片金额:");
IC_CtlBackLight(m_hPOS, 1);
IC_PosBeep(m_hPOS, 5);
// 钱包累计交易次数
memset(szValue, 0, sizeof(szValue));
memcpy(szValue, &m_szCardData[24 * 32 + 2], 4);
memcpy(&szValue[4], "0000", 4);
int nTimes = ConverseHexStrToLong(szValue, 8);
_snprintf(szValue, sizeof(szValue), "%d.次", nTimes);
SetEditText(IDC_EDITPurseTranCount, szValue);
// 交易记录
char szTranTime[64] = {0};
char szTranAmtBefore[64] = {0};
char szTranAmt[64] = {0};
char szTranType[64] = {0};
char szTypeDes[64] = {0};
char szDevNo[64] = {0};
m_ListCtlTranRep.DeleteAllItems();
int i = 0;
char szIndx[8] = {0};
for (nCur = 1; nCur <= 12; nCur++)
{
if (0 == nCur % 4)
{
continue;
}
memset(szTranTime, sizeof(szTranTime), 0);
memset(szTranAmtBefore, sizeof(szTranAmtBefore), 0);
memset(szTranAmt, sizeof(szTranAmt), 0);
memset(szTranType, sizeof(szTranType), 0);
memset(szDevNo, sizeof(szDevNo), 0);
memset(szTypeDes, sizeof(szTypeDes), 0);
char *pszPos = &m_szCardData[(11 + nCur) * 32];
memcpy(szTranTime, pszPos, 8);
memcpy(szTranAmtBefore, pszPos + 8, 8);
memcpy(szTranAmt, pszPos + 16, 6);
memcpy(szTranType, pszPos + 22, 2);
memcpy(szDevNo, pszPos + 24, 8);
if (memcmp(szTranType, "01", 2) == 0)
{
strncpy(szTypeDes, "消费", sizeof(szTypeDes));
}
else if (memcmp(szTranType, "88", 2) == 0)
{
strncpy(szTypeDes, "充值", sizeof(szTypeDes));
}
else
{
strncpy(szTypeDes, szTranType, sizeof(szTypeDes));
}
memset(szIndx, 0, sizeof(szIndx));
nAmt = ConverseHexStrToLong(szTranAmtBefore, 8);
memset(szTranAmtBefore, 0, sizeof(szTranAmtBefore));
_snprintf(szTranAmtBefore, sizeof(szTranAmtBefore), "%0.02f.元", (float)nAmt / 100);
_snprintf(szIndx, sizeof(szIndx), "%02d", i + 1);
m_ListCtlTranRep.InsertItem(LVIF_TEXT|LVIF_STATE, i, szIndx, 0, LVIS_SELECTED, 0, 0);
m_ListCtlTranRep.SetItemText(i,1,szTranTime);
m_ListCtlTranRep.SetItemText(i,2,szTranAmtBefore);
nAmt = ConverseHexStrToLong(szTranAmt, 8);
memset(szTranAmt, 0, sizeof(szTranAmt));
_snprintf(szTranAmt, sizeof(szTranAmt), "%0.02f.元", (float)nAmt / 100);
m_ListCtlTranRep.SetItemText(i,3,szTranAmt);
m_ListCtlTranRep.SetItemText(i,4,szTypeDes);
m_ListCtlTranRep.SetItemText(i,5,szDevNo);
i++;
}
}
// Display all card data
void CCardReviewerDlg::ShowAllCardData(void)
{
if ('\0' == m_szCardData[0])
{
return ;
}
SetEditText(IDC_EDITAnaRes, "");
memset(m_szCardAllData, 0, sizeof(m_szCardAllData));
char szSecHeader[128];
char szTempData[33];
for (int nSec = 0; nSec < 7; nSec++)
{
memset(szSecHeader, 0, sizeof(szSecHeader));
_snprintf(szSecHeader, sizeof(szSecHeader), "第%d扇区信息:\r\n", nSec);
strcat(m_szCardAllData, szSecHeader);
for (int nBlk = 0; nBlk < 3; nBlk++)
{
memset(szTempData, 0, sizeof(szTempData));
memcpy(szTempData, &m_szCardData[(nSec * 4 + nBlk) * 32], 32);
strcat(m_szCardAllData, szTempData);
strcat(m_szCardAllData, "\r\n");
}
}
SetEditText(IDC_EDITAnaRes, m_szCardAllData);
}
void CCardReviewerDlg::OnBUTTONReadCard()
{
GetDlgItem(IDC_BUTTONReadCard)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTONPrintReport)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTONUnBlockCard)->EnableWindow(FALSE);
ReadCardContent();
AnalanyCard();
ShowCardInfo();
ShowAllCardData();
GetDlgItem(IDC_BUTTONReadCard)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTONPrintReport)->EnableWindow(TRUE);
IC_PosBeep(m_hPOS, 1);
IC_PosBeep(m_hPOS, 1);
}
void CCardReviewerDlg::OnBUTTONUnBlock()
{
}
bool g_bTrueIsIn = true;
DWORD WINAPI TreatThread(void * pParam)
{
CCardReviewerDlg *dlgReviewer = (CCardReviewerDlg *)pParam;
unsigned long ulSnr=0;
if (NULL == dlgReviewer)
{
return -1;
}
bool bTrueIsIn = false;
for(;; Sleep(1))
{
if (0 >= dlgReviewer->m_hPOS)
{
continue ;
}
if (bTrueIsIn)
{
if (0 != IC_Card(dlgReviewer->m_hPOS,0,&ulSnr))
{
dlgReviewer->CleanCardInfo();
bTrueIsIn = false;
}
continue;
}
if (0 != IC_Card(dlgReviewer->m_hPOS,0,&ulSnr))
{
bTrueIsIn = false;
continue;
}
bTrueIsIn = true;
dlgReviewer->OnBUTTONReadCard();
}
return 0;
}
int CCardReviewerDlg::CreatMakeCardThread(void)
{
DWORD threadId;
HANDLE hThread;
hThread = CreateThread(0, 0x1000, TreatThread, (PVOID)this, 0, &threadId);
return 0;
}
void CCardReviewerDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
DisConnectReader();
CDialog::OnClose();
}
// Flush Card Content
void CCardReviewerDlg::CleanCardInfo(void)
{
// 城市代码
SetEditText(IDC_EDITCityCode, "");
// 行业代码
SetEditText(IDC_EDITIndustryCode, "");
// 发行流水 ==> 用户卡号
SetEditText(IDC_EDITCardNo, "");
// 卡认证码
SetEditText(IDC_EDITCardMAC, "");
// 启用标志
SetEditText(IDC_EDITInitFlag, "");
// 卡类
SetEditText(IDC_EDITCardType, "");
// 卡片押金
SetEditText(IDC_EDITForegift, "");
// 发行日期
SetEditText(IDC_EDITIssueDate, "");
// 有效日期
SetEditText(IDC_EDITVaildDate, "");
// 启用日期
SetEditText(IDC_EDITStartDate, "");
// 充值时间
SetEditText(IDC_EDITReloadTime, "");
// 充值前余额
SetEditText(IDC_EDITReloadBefore, "");
// 本次充值金额
SetEditText(IDC_EDITCurReload, "");
// 操作员号
SetEditText(IDC_EDITOperator, "");
// 充值总额
SetEditText(IDC_EDITTotalReload, "");
// 最大余额
SetEditText(IDC_EDITMaxAmt, "");
// 充值设备编号
SetEditText(IDC_EDITReloadDev, "");
// 钱包金额
SetEditText(IDC_EDITPurseAmt, "");
// 钱包累计交易次数
SetEditText(IDC_EDITPurseTranCount, "");
// 交易记录
m_ListCtlTranRep.DeleteAllItems();
m_ListAnalyse.ClearStr();
SetEditText(IDC_EDITAnaRes, "");
}
void CCardReviewerDlg::OnBUTTONUnBlockCard()
{
char szInfo[256] = {0};
short st;
unsigned long ulSnr=0;
if (0 != IC_Card(m_hPOS,0,&ulSnr))
{
MessageBox("Get Card Error!");
return ;
}
if (!LoadKey((unsigned char*)m_szKey06, 6))
{
memset(szInfo, 0, sizeof(szInfo));
_snprintf(szInfo, sizeof(szInfo), "6扇区加载密钥失败");
m_ListAnalyse.AddMsg(szInfo, M_ERROR);
MessageBox(szInfo);
}
if (!Authentic(6,1))
{
memset(szInfo, 0, sizeof(szInfo));
_snprintf(szInfo, sizeof(szInfo), "6扇区密钥认证失败");
m_ListAnalyse.AddMsg(szInfo, M_ERROR);
MessageBox(szInfo);
}
char szData[33] = {0};
char szVerifyVal[3] = {0};
// 应用标识目录区
// 读取6扇区内容
if (!ReadBlock(6, 0, (unsigned char*)&szData[0]))
{
memset(szInfo, 0, sizeof(szInfo));
_snprintf(szInfo, sizeof(szInfo), "读取S2B%d失败", 0);
m_ListAnalyse.AddMsg(szInfo, M_ERROR);
MessageBox(szInfo);
return ;
}
memcpy(&szData[12], "00", 2);
memset(szVerifyVal, 0, sizeof(szVerifyVal));
StrXor(&szData[0], 30, szVerifyVal);
memcpy(&szData[30], szVerifyVal, 2);
if (!WriteBlock(6, 0, (unsigned char *)szData))
{
memset(szInfo, 0, sizeof(szInfo));
_snprintf(szInfo, sizeof(szInfo), "更新S2B%d失败", 0);
m_ListAnalyse.AddMsg(szInfo, M_ERROR);
MessageBox(szInfo);
}
if (!WriteBlock(6, 1, (unsigned char *)szData))
{
memset(szInfo, 0, sizeof(szInfo));
_snprintf(szInfo, sizeof(szInfo), "更新S2B%d失败", 1);
m_ListAnalyse.AddMsg(szInfo, M_ERROR);
MessageBox(szInfo);
}
MessageBox("操作完毕!");
GetDlgItem(IDC_BUTTONUnBlockCard)->EnableWindow(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -