大理水控初始版本
diff --git a/supwisdom/sp_display.c b/supwisdom/sp_display.c
new file mode 100644
index 0000000..fb0417c
--- /dev/null
+++ b/supwisdom/sp_display.c
@@ -0,0 +1,356 @@
+#include "glcd.h"
+#include "../zk/gb2312_16.h"
+#include "../libqr/qrencode.h"
+#include "sp_util.h"
+#include "sp_constant.h"
+#include "sp_display.h"
+
+#define GLCD_TITLE_X 0
+#define GLCD_TITLE_Y 0
+#define GLCD_TITLE_LINE 8
+#define GLCD_CONTENT_Y_ONE 0x10
+#define GLCD_CONTENT_Y_TWO 0x20
+#define GLCD_CONTENT_Y_THREE 0x30
+#define GLCD_BUTTOM_Y 56
+#define GLCD_LINE_LENGTH 0x10
+
+static char line_buff[17];
+
+/********************************************************************************************************
+* º¯Êý(Name)      : void  Show_Money(uint32 money)
+* ¹¦ÄÜ(Function)  : ÏÔʾ½ð¶î
+* ²ÎÊý(Parameter) : money--¿¨Óà¶î(µ¥Î»:Ôª)
+* ·µ»Ø(Return)    : ÎÞ
+**********************************************************************************************************/
+void show_money(sp_pos_t* pos, uint32 money)
+{
+  char msg[32];
+  sprintf(msg,"     %.02f Ԫ",money/100.0f);
+  disp_hint_info_two(pos,"ÀÛ¼ÆË®·Ñ:",msg,0);
+}
+
+void glcd_tiny_init(void)
+{
+  uint8 retry;
+  glcd_tiny_set_font(Font5x7,5,7,32,127);
+  glcd_clear_buffer();
+  glcd_write();
+  for(retry=0; retry<3; retry++)
+  {
+    if(gb2312_16_verify() == 0)
+    {
+      break;
+    }
+  }
+  glcd_write();
+}
+static void show_title(void)
+{
+  uint8 ctime[7];
+  glcd_tiny_set_font(Font5x7,5,7,32,127);
+  glcd_clear_buffer();
+  sp_get_bcdtime(ctime);
+  sprintf(line_buff, "%02x-%02x-%02x %02x:%02x:%02x",
+          ctime[0],ctime[1],ctime[2],
+          ctime[3],ctime[4],ctime[5]);
+  glcd_draw_string_xy(0, 0, line_buff);
+  glcd_draw_line(0, GLCD_TITLE_LINE, 127, 8, BLACK);
+}
+
+static void show_bottom(sp_pos_t* pos)
+{
+  sprintf(line_buff,"%02d:%02x%02x%02x%02x",pos->deviceno, pos->devphyid[0],
+          pos->devphyid[1], pos->devphyid[2], pos->devphyid[3]);
+  glcd_draw_string_xy(0, GLCD_BUTTOM_Y, line_buff);
+}
+
+static char last_qrcode_url[32]= {0};
+void show_home_qrcode(char* qrcode_url)
+{
+  uint8 i,j;
+  if(MEMCMP(qrcode_url,last_qrcode_url,(int)strlen(qrcode_url)) != 0)
+  {
+    sprintf(last_qrcode_url,"%s",qrcode_url);
+    //¶þάÂëÉú³ÉµãÕó
+    QRencode(last_qrcode_url, NULL);
+  }
+  //¶þάÂëµãÕóÏÔʾ
+  for(i=0; i<MAX_MODULESIZE*2; i++)
+  {
+    for(j=0; j<MAX_MODULESIZE*2; j++)
+    {
+      uint8_t pixel = m_byModuleData[i/2][j/2];
+
+      glcd_set_pixel(j+70, 12+i, pixel);
+      glcd_set_pixel(j+70, 12+i+1, pixel);
+      j ++;
+      glcd_set_pixel(j+70, 12+i, pixel);
+      glcd_set_pixel(j+70, 12+i+1, pixel);
+    }
+    i ++;
+  }
+  glcd_write();
+
+}
+static uint8 last_ctime[6];
+void show_home(sp_pos_t* pos)
+{
+  uint8 ctime[6];
+  sp_get_bcdtime(ctime);
+  if(MEMCMP(ctime,last_ctime,6) != 0)
+  {
+    MEMCPY(last_ctime,ctime,6);
+    disp_hint_info_two(pos,"F°æ±¾",PRO_VERSION,0);
+	/*
+    if(pos->sysconf.register_flag)
+    {
+      if(pos->dynamic.ws_client_stat)
+      {
+        show_home_qrcode(pos->dynamic.qrcode_url);
+      }
+    }
+	*/
+  }
+}
+
+void show_set_devno(sp_pos_t* pos, uint8 devno)
+{
+  char msg[32];
+  sprintf(msg,"»úºÅ=%d",devno);
+  disp_hint_info_two(pos, "ÉèÖûúºÅ³É¹¦",msg,DELAY_TIME1s);
+}
+void show_set_devphyid(sp_pos_t* pos, uint8 devphyid[4])
+{
+  char msg[32];
+  sprintf(msg,"ID=%02x%02x%02x%02x",
+          devphyid[0],devphyid[1],devphyid[2],devphyid[3]);
+  disp_hint_info_two(pos,"ÉèÖÃÎïÀíID³É¹¦",msg,DELAY_TIME1s);
+}
+void show_set_dev_offline_maxhour(sp_pos_t* pos, uint16 maxhour)
+{
+  char msg[32];
+  sprintf(msg,"ÍÑ»ú¹¤×÷ʱ¼ä=%d",maxhour);
+  disp_hint_info_two(pos, "ÉèÖÃÍÑ»ú¹¤×÷ʱ¼ä³É¹¦",msg,DELAY_TIME1s);
+}
+
+void show_manage_passwd(sp_pos_t* pos, const char* hint,uint8 passwd[],uint8 len)
+{
+  char msg[32];
+  switch(len)
+  {
+  case 0:
+    sprintf(msg,"");
+    break;
+  case 1:
+    sprintf(msg,"%d",passwd[0]);
+    break;
+  case 2:
+    sprintf(msg,"%d%d",passwd[0],passwd[1]);
+    break;
+  case 3:
+    sprintf(msg,"%d%d%d",passwd[0],passwd[1],passwd[2]);
+    break;
+  case 4:
+    sprintf(msg,"%d%d%d%d",passwd[0],passwd[1],passwd[2],passwd[3]);
+    break;
+  case 5:
+    sprintf(msg,"%d%d%d%d%d",passwd[0],passwd[1],passwd[2],passwd[3],passwd[4]);
+    break;
+  case 6:
+    sprintf(msg,"%d%d%d%d%d%d",passwd[0],passwd[1],passwd[2],passwd[3],passwd[4],passwd[5]);
+    break;
+  default:
+    sprintf(msg,"");
+  }
+  disp_hint_info_two(pos,hint,msg,0);
+}
+
+void show_error(sp_pos_t* pos, const char* hint, uint16 errcode)
+{
+  char msg[32];
+  switch(errcode)
+  {
+  case RC_PSAM_ERR:
+    sprintf(msg,"%s", "SAM¸´Î»Ê§°Ü");
+    break;
+  case RC_CARD_LOGIN:
+    sprintf(msg,"%s", "ÑéÖ¤ÃØÔ¿Ê§°Ü");
+    break;
+  case RC_CARD_READ:
+    sprintf(msg,"%s", "¶Á¿¨Ê§°Ü");
+    break;
+  case RC_CARD_WRITE:
+    sprintf(msg,"%s", "д¿¨Ê§°Ü");
+    break;
+  case RC_FLASH_ERR:
+    sprintf(msg,"%s", "FLASHÒì³£");
+    break;
+  case RC_HARDWARE_ERR:
+    sprintf(msg,"%s", "¹Ì¼þÒì³£");
+    break;
+  case RC_FLASH_NO_RIGHT:
+    sprintf(msg,"%s", "FLASHÏÞÖÆ");
+    break;
+  case RC_CARD_NORIGHT:
+    sprintf(msg,"%s", "¿¨ÎÞȨÏÞ");
+    break;
+  case RC_CARD_EXPIRED:
+    sprintf(msg,"%s", "¿¨ÒѹýÆÚ");
+    break;
+  case RC_CARD_LOST:
+    sprintf(msg,"%s", "¿¨ÒÑËø¶¨");
+    break;
+  case RC_CARDNO_EXCEPT:
+    sprintf(msg,"%s", "¿¨Òì³£");
+    break;
+  case RC_CARD_TIMEOUT:
+    sprintf(msg,"%s", "ʹÓÃÌ«¾Ã");
+    break;
+  case RC_CARDBAL_EXCEPT:
+    sprintf(msg,"%s", "Óà¶îÒì³£");
+    break;
+  case RC_CARDBAL_LACK:
+    sprintf(msg,"%s", "ÇëÁª»úÏû·Ñ");
+    break;
+  case RC_DEVPHYID_NOTSET:
+    sprintf(msg,"%s", "δÉèÖûúºÅ");
+    break;
+  case RC_FEERATE_NOTSET:
+    sprintf(msg,"%s", "δÉèÖ÷ÑÂÊ");
+    break;
+  case RC_DEV_OFFLINE_ERROR:
+    sprintf(msg,"%s", "É豸ÍÑ»úÌ«¾Ã");
+    break;
+  case RC_TRANSDTL_FULL:
+    sprintf(msg,"%s", "Á÷Ë®ÒÑÂú");
+    break;
+  case RC_FILE09_CRC_ERR:
+    sprintf(msg,"%s", "09CRC´íÎó");
+    break;
+  case RC_FILE10_CRC_ERR:
+    sprintf(msg,"%s", "10CRC´íÎó");
+    break;
+  case RC_CARD_INVALID:
+    sprintf(msg,"%s", "ÎÞЧ¿¨");
+    break;
+  case RC_FEENUM_ERROR:
+    sprintf(msg,"%s", "·ÑÂʸöÊý´íÎó");
+    break;
+  case RC_NOTSUPPORT:
+    sprintf(msg,"%s", "²»Ö§³Ö");
+    break;
+  case RC_NOT_SAME_CARD:
+    sprintf(msg,"%s", "²»Í¬¿¨");
+    break;
+  case RC_MODE_NOT_SUPPORT:
+    sprintf(msg,"%s", "ģʽ²»Ö§³Ö");
+    break;
+  case RC_UPDPROG_ERR:
+    sprintf(msg,"%s", "Éý¼¶Ê§°Ü");
+    break;
+  case RC_CONFPARA_CRC_ERR:
+    sprintf(msg,"%s", "ÅäÖÃCRC´íÎó");
+    break;
+  case RC_TRANSDTL_NO_ERR:
+    sprintf(msg,"%s", "Á÷Ë®ºÅÒì³£");
+    break;
+  case RC_DEVICENO_OUT:
+    sprintf(msg,"%s", "»úºÅ¹ý´ó");
+    break;
+  case RC_QRCODE_FAILURE:
+  	sprintf(msg,"%s", "¶þάÂë»ñȡʧ°Ü");
+	break;
+  case RC_QRCODE_TIMEOUT:
+  	sprintf(msg,"%s", "¶þάÂ볬ʱ");
+	break;
+  case RC_QRCODE_QUERY_FAIL:
+  	sprintf(msg,"%s", "¶þάÂëÈÏ֤ʧ°Ü");
+	break;
+  case RC_DEV_NOT_LOGIN:
+  	sprintf(msg,"%s", "É豸δǩµ½");
+	break;
+  case RC_DEV_FAULT:
+  	sprintf(msg,"%s", "É豸ÒÉËÆ¹ÊÕÏ");
+	break;
+  case RC_DEV_NOSET_FLOWSENSOR_UNIT:
+  	sprintf(msg,"%s", "Á÷Á¿¼ÆË㵥λδÉèÖÃ");
+	break;
+  case RC_CARD_AUTHENTICATION:
+  	sprintf(msg,"%s", "¿¨ÈÏ֤ʧ°Ü");
+	break;
+  default:
+    sprintf(msg,"´íÎóÂë=0x%04x",errcode);
+  }
+  disp_hint_info_two(pos,hint,msg,DELAY_TIME3s);
+}
+
+void disp_hint_info_three(sp_pos_t* pos,const char* msg1,const char* msg2,const char* msg3,uint32 ms)
+{
+  show_title();
+  show_bottom(pos);
+
+  snprintf(line_buff,sizeof line_buff,"%s               ",msg1);
+  gb2312_16_draw_str(0, GLCD_CONTENT_Y_ONE, line_buff);
+  snprintf(line_buff,sizeof line_buff,"%s               ",msg2);
+  gb2312_16_draw_str(0, GLCD_CONTENT_Y_TWO, line_buff);
+  snprintf(line_buff,sizeof line_buff,"%s               ",msg3);
+  gb2312_16_draw_str(0, GLCD_CONTENT_Y_THREE, line_buff);
+
+  glcd_write();
+  if(ms > 0)
+  {
+    Delay_ms(ms);
+  }
+}
+
+void disp_hint_info_two(sp_pos_t* pos,const char* msg1,const char* msg2,uint32 ms)
+{
+  show_title();
+  show_bottom(pos);
+
+  snprintf(line_buff,sizeof line_buff,"%s               ",msg1);
+  gb2312_16_draw_str(0, GLCD_CONTENT_Y_ONE, line_buff);
+  snprintf(line_buff,sizeof line_buff,"%s               ",msg2);
+  gb2312_16_draw_str(0, GLCD_CONTENT_Y_TWO, line_buff);
+
+  glcd_write();
+  if(ms > 0)
+  {
+    Delay_ms(ms);
+  }
+}
+void disp_hint_info(sp_pos_t* pos,const char* msg1,uint32 ms)
+{
+  show_title();
+  show_bottom(pos);
+
+  snprintf(line_buff,sizeof line_buff,"%s               ",msg1);
+  gb2312_16_draw_str(0, GLCD_CONTENT_Y_ONE, line_buff);
+  snprintf(line_buff,sizeof line_buff,"                  ");
+  gb2312_16_draw_str(0, GLCD_CONTENT_Y_TWO, line_buff);
+
+  glcd_write();
+  if(ms > 0)
+  {
+    Delay_ms(ms);
+  }
+}
+void disp_server_errmsg(sp_pos_t* pos,const char* hint,uint8 data[],uint16 len)
+{
+  uint8 strlen;
+  char errmsg[64];
+  strlen = data[0];
+  //command+canid+excmd+flag+retcode+len+crc
+  if((strlen +8) != len)
+  {
+    disp_hint_info_two(pos,hint,"ÇëÇó³¬Ê±",DELAY_TIME3s);
+    return;
+  }
+  if(strlen > 32)
+  {
+    strlen = 32;
+  }
+  snprintf(errmsg,strlen+1,"%s",data +1);
+  disp_hint_info_two(pos,hint,errmsg,DELAY_TIME3s);
+}
+