添加读取市民卡号和卡有效期
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;
   }
 }