添加读取市民卡号和卡有效期
diff --git a/supwisdom/sp_card.c b/supwisdom/sp_card.c
index 5c6796a..c88bfa9 100644
--- a/supwisdom/sp_card.c
+++ b/supwisdom/sp_card.c
@@ -52,7 +52,7 @@
if(!card_cpu_mode())
{
Delay_ms(200);
- if(sp_select_sfi("\x3f\x00") == 0)
+ if(sp_select_sfi("\x3f\x00") == 0)
{
sp_select_adf();
cardpcd->cardphyid[0] = snr[3];
@@ -67,7 +67,7 @@
else
{
cardpcd->cardtype = TAG_TYPE_UNKONWN;
- return 1;
+ return 1;
}
}
return 1;
@@ -78,11 +78,57 @@
return card_cpu_exist();
}
+static uint16 sp_select_adf15()
+{
+ uint16 ret = 0;
+ uint8* temp_buff = NULL;
+ uint8 buff_len = 0;
+ uint8 cmd_buff[] = {"\x00\xA4\x00\x00\x02\x3F\x00"};
+ ret = card_cpu_exchange(cmd_buff, sizeof(cmd_buff)-1, 0, &temp_buff, &buff_len);
+ if(ret != RETCODE_OK)
+ {
+ return ret;
+ }
+ return 0;
+}
+
+static uint16 sp_read_binary_file(uint8 out[])
+{
+ uint16 ret = 0;
+ uint8* temp_buff = NULL;
+ uint8 buff_len = 0;
+ uint8 cmd_buff[5] = {"\x00\xB0\x95\x00\x47"};
+ ret = card_cpu_exchange(cmd_buff, sizeof(cmd_buff), 0, &temp_buff, &buff_len);
+ if(ret != RETCODE_OK)
+ {
+ return ret;
+ }
+ MEMCPY(out, temp_buff, buff_len);
+ return 0;
+}
static uint16 sp_cpu_read(sp_card_t* card)
{
uint16 ret = 0;
+ uint8 buff[72];
+ uint8 offset = 0;
+ MEMCLEAR(buff, sizeof(buff));
+ ret = sp_select_adf15();
+ if(ret)
+ {
+ return ret;
+
+ }
+ ret = sp_read_binary_file(buff);
+ if(ret)
+ {
+ return ret;
+ }
MEMCLEAR(card->citizen_cardno, sizeof(card->citizen_cardno));
- MEMCPY(card->expiredate, "\x20\x22\x08\x02", 4);
+ offset += 31;
+ MEMCPY(card->citizen_cardno, buff+offset, sizeof(card->citizen_cardno));
+ offset += 12;
+ offset += 18;
+ MEMCPY(card->expiredate, buff+offset, 4);
return ret;
}
diff --git a/supwisdom/sp_communicate.c b/supwisdom/sp_communicate.c
index baf378c..a86f503 100644
--- a/supwisdom/sp_communicate.c
+++ b/supwisdom/sp_communicate.c
@@ -121,7 +121,7 @@
cw_pack_map_size(&pack,4);
sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, card->cardphyid, 4);
- sp_pack_put_bin(&pack, PK_BIN_CITIZEN_CARDNO, card->citizen_cardno, 12);
+ sp_pack_put_bin(&pack, PK_BIN_CITIZEN_CARDNO, card->citizen_cardno+8, 4);
sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
diff --git a/supwisdom/sp_consume.c b/supwisdom/sp_consume.c
index 587e2a4..703c00c 100644
--- a/supwisdom/sp_consume.c
+++ b/supwisdom/sp_consume.c
@@ -240,12 +240,6 @@
ret = RC_CARD_INVALID;
return ret;
}
- ret = sp_card_authentication(pos, card);
- if(ret)
- {
- ret = RC_CARD_AUTHENTICATION;
- return ret;
- }
if(pos->load_para_status)
{
return pos->load_para_status;
@@ -266,6 +260,12 @@
{
return ret;
}
+ ret = sp_card_authentication(pos, card);
+ if(ret)
+ {
+ ret = RC_CARD_AUTHENTICATION;
+ return ret;
+ }
ret = sp_prepare_behalf_transdtl(pos, card, &record);
if(ret)
{
@@ -590,30 +590,31 @@
uint8 keycode = SP_KEY_NONE;
keycode = sp_get_key();
//ÔÚ¿¨Ïû·ÑÔÝÍ£Çé¿öϰ´ÈÎÒâ¼üΪ½áÊøµ±Ç°Ïû·Ñ״̬
- if(keycode >= SP_KEY_0 && keycode <= SP_KEY_ENTER && pos->cardState.cur_state == STATE_NONE
+ if(keycode >= SP_KEY_0 && keycode <= SP_KEY_ENTER
+ && pos->cardState.cur_state == STATE_NONE
&& cardWorkState->current_state == CARDWORKSTATUS_PAUSE && pos->paymode == PAYMODE_CARD)
{
- cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
- return;
+ cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
+ return;
}
//Ïû·Ñģʽ³õʼ»¯×´Ì¬Ï°´È·ÈϼüÑ¡Ôñ¶þάÂëÏû·Ñ
if((keycode == SP_KEY_ENTER) && (pos->paymode == PAYMODE_INIT))
{
cardWorkState->current_state = CARDWORKSTATUS_NONE;
pos->paymode = PAYMODE_QRCODE;
- return;
+ return;
}
//¶þάÂëģʽϰ´È¡Ïû¼üΪֹͣ¹¤×÷
if((pos->paymode == PAYMODE_QRCODE) && (keycode == SP_KEY_CLEAR))
{
cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
- return;
+ return;
}
//°´0¼ü½øÈëÉ豸²Ù×÷½çÃæ
if(keycode == SP_KEY_0 && (pos->paymode == PAYMODE_INIT))
{
cardWorkState->current_state = CARDWORKSTATUS_SET_DEV;
- return;
+ return;
}
}