优化代码和脱机时长判断
diff --git a/supwisdom/sp_communicate.c b/supwisdom/sp_communicate.c
index 080a61d..7ed34f9 100644
--- a/supwisdom/sp_communicate.c
+++ b/supwisdom/sp_communicate.c
@@ -27,7 +27,7 @@
 }
 
 static uint8 sp_usart_recv(sp_pos_t* pos, sp_protocol_response_t* resp,
-                               uint32 timeout_ms)
+                           uint32 timeout_ms)
 {
   uint32 tick;
   uint16 len;
@@ -108,31 +108,31 @@
     sp_unpack_value(&unpack,&field);
     if(IS_KEY(PK_INT_PERMIT, field.key))
     {
-      card->permit = field.val.intval;
+      card->permit = (uint8)field.val.intval;
     }
     else if(IS_KEY(PK_STR_LIMITMSG, field.key))
     {
-      MEMCPY(card->limitmsg, field.val.strval, field.strlen);
+      snprintf(card->limitmsg,,sizeof(card->limitmsg),"%s", field.val.strval, field.strlen);
     }
     else if(IS_KEY(PK_INT_WATERLIMIT,field.key))
     {
-      card->waterlimit = field.val.intval;
+      card->waterlimit = (uint16)field.val.intval;
     }
     else if(IS_KEY(PK_INT_COBILLNO,field.key))
     {
-      card->cobillno = field.val.intval;
+      card->cobillno = (uint32)field.val.intval;
     }
     else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
     {
-      card->feepara.fee_amt = field.val.intval;
+      card->feepara.fee_amt = (uint8)field.val.intval;
     }
     else if(IS_KEY(PK_INT_FEEUNIT, field.key))
     {
-      card->feepara.fee_unit = field.val.intval;
+      card->feepara.fee_unit = (uint8)field.val.intval;
     }
     else if(IS_KEY(PK_INT_FEESTART, field.key))
     {
-      card->feepara.fee_start = field.val.intval;
+      card->feepara.fee_start = (uint8)field.val.intval;
     }
   }
   //disp_hint_info(pos,"Éí·ÝÈÏÖ¤³É¹¦",DELAY_TIME1s);
@@ -259,8 +259,7 @@
   ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
   if(ret)
   {
-    ret = RC_QRCODE_FAILURE;
-    return ret;
+    return RC_QRCODE_FAILURE;
   }
 
   sp_unpack_init(&unpack,resp.data,resp.datalen);
@@ -270,15 +269,15 @@
     sp_unpack_value(&unpack,&field);
     if(IS_KEY(PK_STR_SHORT_URL, field.key))
     {
-      MEMCPY(card->qrcode.qrcode_url, field.val.strval, field.strlen);
+      snprintf(card->qrcode.qrcode_url,sizeof(card->qrcode.qrcode_url),"%s", field.val.strval, field.strlen);
     }
     else if(IS_KEY(PK_INT_COBILLNO, field.key))
     {
-      card->cobillno = field.val.intval;
+      card->cobillno = (uint32)field.val.intval;
     }
     else if(IS_KEY(PK_INT_VAILDTIME, field.key))
     {
-      card->qrcode.validtime = field.val.intval;
+      card->qrcode.validtime = (uint32)field.val.intval;
     }
   }
   card->qrcode.starttime = sp_get_ticker();
@@ -317,8 +316,7 @@
   ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
   if(ret)
   {
-    ret = RC_QRCODE_QUERY_FAIL;
-    return ret;
+    return RC_QRCODE_QUERY_FAIL;
   }
 
   sp_unpack_init(&unpack,resp.data,resp.datalen);
@@ -328,35 +326,35 @@
     sp_unpack_value(&unpack,&field);
     if(IS_KEY(PK_INT_PERMIT, field.key))
     {
-      card->permit = field.val.intval;
+      card->permit = (uint8)field.val.intval;
     }
     else if(IS_KEY(PK_INT_COBILLNO, field.key))
     {
-      card->cobillno = field.val.intval;
+      card->cobillno = (uint32)field.val.intval;
     }
     else if(IS_KEY(PK_INT_AUTHSTATUS, field.key))
     {
-      card->qrcode.authstatus = field.val.intval;
+      card->qrcode.authstatus = (uint8)field.val.intval;
     }
     else if(IS_KEY(PK_INT_PAYSTATUS, field.key))
     {
-      card->qrcode.paystatus = field.val.intval;
+      card->qrcode.paystatus = (uint8)field.val.intval;
     }
     else if(IS_KEY(PK_INT_PAYAMT, field.key))
     {
-      card->qrcode.paidAmount = field.val.intval;
+      card->qrcode.paidAmount = (uint8)field.val.intval;
     }
     else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
     {
-      card->feepara.fee_amt = field.val.intval;
+      card->feepara.fee_amt = (uint8)field.val.intval;
     }
     else if(IS_KEY(PK_INT_FEEUNIT, field.key))
     {
-      card->feepara.fee_unit = field.val.intval;
+      card->feepara.fee_unit = (uint8)field.val.intval;
     }
     else if(IS_KEY(PK_INT_WATERLIMIT, field.key))
     {
-      card->waterlimit = field.val.intval;
+      card->waterlimit = (uint16)field.val.intval;
     }
   }
   return resp.retcode;
@@ -532,11 +530,11 @@
     sp_unpack_value(&unpack,&field);
     if(IS_KEY(PK_INT_OFFLINEMAXHOUR, field.key))
     {
-      offline_maxhour = field.val.intval;
+      offline_maxhour = (uint8)field.val.intval;
     }
     else if(IS_KEY(PK_INT_PULSEINHML, field.key))
     {
-      unit = field.val.intval;
+      unit = (uint8)field.val.intval;
     }
     else if(IS_KEY(PK_BIN_SYSTIME, field.key))
     {
diff --git a/supwisdom/sp_config.h b/supwisdom/sp_config.h
index f895a46..13375f3 100644
--- a/supwisdom/sp_config.h
+++ b/supwisdom/sp_config.h
@@ -232,10 +232,10 @@
   uint8 cardtype;
   uint8 expiredate[4];
 
-  uint8 waterlimit;		//µ¥´Î³öË®ÉÏÏÞ£¨100ml£©
+  uint16 waterlimit;		//µ¥´Î³öË®ÉÏÏÞ£¨100ml£©
   uint32 cobillno;		//½»Ò×¶©µ¥±àºÅ,BCDÂë
   uint8	permit;			//ÊÇ·ñÔÊÐíÏû·Ñ£¬0-ÔÊÐí£¬1-²»ÔÊÐí
-  uint8 limitmsg[45];		//ÏÞÖÆÏû·ÑÐÅÏ¢
+  char limitmsg[45];		//ÏÞÖÆÏû·ÑÐÅÏ¢
   sp_qrcode_t qrcode;	//¶þάÂë
   sp_feepara_t feepara;
 } sp_card_t;
diff --git a/supwisdom/sp_consume.c b/supwisdom/sp_consume.c
index cfa75b7..b416a6d 100644
--- a/supwisdom/sp_consume.c
+++ b/supwisdom/sp_consume.c
@@ -121,8 +121,27 @@
 }
 
 //¶ÁÈ¡µÚÒ»±ÊδÉÏ´«Á÷Ë®Ïû·ÑÈÕÆÚʱ¼ä
-static uint8 sp_read_unconfirm_first_record(uint8 termtime[6])
+static uint8 sp_read_unconfirm_first_record(const sp_pos_t* pos,uint8 termtime[6])
 {
+  sp_transdtl_t record;
+  uint16 ret;
+  uint8 crc[2];
+  //¼ì²âµ±Ç°ÊÇ·ñÓÐδÉÏ´«µÄÁ÷Ë®
+  if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
+  {
+    ret = sp_flash_read((uint32)pos->unconfirm_transdtl.transaddr, (uint8*)&record,
+                        sizeof(record));
+    if(!ret)
+    {
+      sp_protocol_crc((uint8*)&record, sizeof(record)-2,crc);
+      if(MEMCMP(record.crc,crc, 2) == 0)
+      {
+        MEMCPY(termtime,record.transdate, 3);
+        MEMCPY(termtime +3,record.transtime,3);
+        return 0;
+      }
+    }
+  }
   return 1;
 }
 
@@ -208,6 +227,15 @@
   return 0;
 }
 
+static uint16 do_card_check(sp_pos_t* pos,sp_card_t* card)
+{
+  if(card->permit == 1)
+  {
+    return RC_LIMIT_CONSUMPTION;
+  }
+  return 0;
+}
+
 static uint16 do_new(sp_pos_t* pos, sp_card_t* card)
 {
   uint16 ret;
@@ -238,7 +266,12 @@
   ret = sp_card_authentication(pos, card);
   if(ret)
   {
-    return RC_CARD_AUTHENTICATION;
+    return ret;
+  }
+  ret = do_card_check(pos,card);
+  if(ret)
+  {
+    return ret;
   }
   ret = sp_prepare_behalf_transdtl(pos, card, &record);
   if(ret)
@@ -599,7 +632,7 @@
       cardWorkState->current_state = CARDWORKSTATUS_ERROR;
       break;
     }
-	disp_hint_info_two(pos, "ÇëÇó¶þάÂë","ÇëÉÔµÈ...",0);
+    disp_hint_info_two(pos, "ÇëÇó¶þάÂë","ÇëÉÔµÈ...",0);
     ret = sp_qrcode_init(pos, &CARD);
     if(ret)
     {
diff --git a/supwisdom/sp_display.c b/supwisdom/sp_display.c
index d4fda4f..76ab136 100644
--- a/supwisdom/sp_display.c
+++ b/supwisdom/sp_display.c
@@ -280,7 +280,7 @@
     sprintf(msg, "%s", "Á÷Á¿¼ÆË㵥λδÉèÖÃ");
     break;
   case RC_CARD_AUTHENTICATION:
-    sprintf(msg, "%s", "¿¨ÈÏ֤ʧ°Ü");
+    sprintf(msg, "%s", "Éí·ÝÈÏÖ¤³¬Ê±");
     break;
   case RC_LIMIT_CONSUMPTION:
     sprintf(msg, "%s", "¸ÃÓû§±»ÏÞÖÆÏû·Ñ");