大理水控初始版本
diff --git a/supwisdom/sp_util.c b/supwisdom/sp_util.c
new file mode 100644
index 0000000..df70b13
--- /dev/null
+++ b/supwisdom/sp_util.c
@@ -0,0 +1,530 @@
+#include "../sys_hw/keypad.h"
+#include "../sys_hw/drv_adc.h"
+#include "sp_display.h"
+
+#include "sp_util.h"
+
+uint16 crc_table[] =
+{
+  0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
+  0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
+  0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
+  0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
+  0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
+  0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
+  0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
+  0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
+  0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
+  0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
+  0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
+  0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
+  0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
+  0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
+  0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
+  0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
+  0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
+  0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
+  0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
+  0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
+  0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
+  0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
+  0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
+  0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
+  0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
+  0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
+  0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
+  0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
+  0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
+  0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
+  0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
+  0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
+};
+
+void sp_protocol_crc(const uint8* buf, uint16 len, uint8 crc[2])
+{
+  //uint16	accnum = 0xc78c;
+  uint8 temp_crc[2];
+  temp_crc[0] = 0xc7;
+  temp_crc[1] = 0x8c;
+  sp_protocol_crc_init(buf,len,temp_crc,crc);
+}
+
+void sp_protocol_crc_init(const uint8* buf, uint16 len,uint8 init[2], uint8 crc[2])
+{
+  uint16 accnum = (uint16)init[0]<<8 |(uint16)init[1];
+  uint16 i;
+  for(i = 0; i < len; ++i)
+  {
+    accnum = (accnum << 8) ^ crc_table[((accnum >> 8)
+                                        ^ buf[i]) & 0xFF];
+  }
+  crc[0] = (uint8)((accnum >> 8) & 0xFF);
+  crc[1] = (uint8)(accnum & 0xFF);
+}
+
+void sp_key_calibrate(void)
+{
+  calibrate_key(0);
+}
+
+uint8 sp_key_init(void)
+{
+  adc_init();
+  return keypad_init();
+}
+uint8 sp_get_key(void)
+{
+  uint8 key = keypad_get_key();
+  switch(key)
+  {
+  case KEY_NONE:
+    return SP_KEY_NONE;
+  case KEY_DIG0:
+    return SP_KEY_0;
+  case KEY_DIG1:
+    return SP_KEY_1;
+  case KEY_DIG2:
+    return SP_KEY_2;
+  case KEY_DIG3:
+    return SP_KEY_3;
+  case KEY_DIG4:
+    return SP_KEY_4;
+  case KEY_DIG5:
+    return SP_KEY_5;
+  case KEY_DIG6:
+    return SP_KEY_6;
+  case KEY_DIG7:
+    return SP_KEY_7;
+  case KEY_DIG8:
+    return SP_KEY_8;
+  case KEY_DIG9:
+    return SP_KEY_9;
+  case KEY_ENTER:
+    return SP_KEY_ENTER;
+  case KEY_CANCEL:
+    return SP_KEY_CLEAR;
+  default:
+    return SP_KEY_NONE;
+  }
+}
+void sp_reset(void)
+{
+  while(1);
+}
+void sp_bcd_to_str(const uint8* bcd, uint8 bcd_len, char* str)
+{
+  uint8 i;
+  uint16 j;
+  for(i = 0; i < bcd_len; ++i)
+  {
+    j = i << 1;
+    str[j] = ((bcd[i] >> 4) & 0x0F) + 0x30;
+    str[j + 1] = (bcd[i] & 0x0F) + 0x30;
+  }
+  str[i << 1] = 0;
+}
+void sp_str_to_bcd(const char* str, uint8 str_len, uint8* bcd)
+{
+  uint8 i,j;
+  for(i = 0; i < str_len; i += 2)
+  {
+    j = i/2;
+    bcd[j] = (((str[i]-0x30) & 0x0F) <<4) | ((str[i+1]-0x30) & 0x0F);
+  }
+}
+static uint8 charTohex(char ch)
+{
+  if(ch >= '0' && ch <= '9')
+  {
+    return (ch -'0');
+  }
+  if(ch >= 'a' && ch <= 'f')
+  {
+    return (ch -'a' +10);
+  }
+  if(ch >= 'A' && ch <= 'F')
+  {
+    return (ch -'A' +10);
+  }
+  return 0;
+}
+void sp_str_to_hex(const char* str,const uint16 len,uint8* hex)
+{
+  uint8 t,temp;
+  uint16 i;
+  for(i = 0; i < len; i += 2)
+  {
+    temp = charTohex(str[i]);
+    t = temp << 4;
+    temp = charTohex(str[i+1]);
+    t += temp;
+    hex[i/2] = t;
+  }
+}
+
+static char hexToCharTable[]= {"0123456789ABCDEF"};
+void sp_hex_to_str(const uint8* hex,const uint8 len,char* str)
+{
+  uint8 i,j;
+  for(i = 0; i < len; i++)
+  {
+    j = i << 1;
+    str[j] = hexToCharTable[(hex[i] >> 4) &0x0F];
+    str[j +1] = hexToCharTable[hex[i] &0x0F];
+  }
+  str[i << 1] = 0;
+}
+
+void sp_get_bcdtime(uint8 ctime[6])
+{
+  _SystemTime time;
+  memset(&time,0,sizeof time);
+  rtc_get_time(&time); //bcd
+  ctime[0] = time.year;
+  ctime[1] = time.month;
+  ctime[2] = time.day;
+  ctime[3] = time.hour;
+  ctime[4] = time.minute;
+  ctime[5] = time.second;
+}
+void sp_set_bcdtime(uint8 ctime[6])
+{
+  _SystemTime time;
+  memset(&time,0,sizeof time);
+  time.year = ctime[0];
+  time.month = ctime[1];
+  time.day = ctime[2];
+  time.hour = ctime[3];
+  time.minute = ctime[4];
+  time.second = ctime[5];
+
+  rtc_set_time(&time);
+}
+uint8 sp_check_time_valid(uint8 ctime[6])
+{
+  if(BCD2Dec(ctime[0]) < 18)
+    return 1;
+  if(BCD2Dec(ctime[1]) > 12)
+    return 1;
+  if(BCD2Dec(ctime[2]) > 31)
+    return 1;
+  if(BCD2Dec(ctime[3]) > 23)
+    return 1;
+  if(BCD2Dec(ctime[4]) > 59)
+    return 1;
+  if(BCD2Dec(ctime[5]) > 59)
+    return 1;
+
+  return 0;
+}
+uint8 sp_crc_sum(uint8 buf[],uint8 len)
+{
+  uint8 i;
+  uint8 sum = 0;
+  //¼ÆËãУÑéºÍ
+  for(i = 0; i < len; i++)
+  {
+    sum = sum + buf[i];
+  }
+  return sum;
+}
+
+int8 isFF(uint8 buf[],uint16 len)
+{
+  uint16 i;
+  for(i = 0; i < len; i++)
+  {
+    if(0xFF != buf[i])
+    {
+      return -1;
+    }
+  }
+  return 0;
+}
+
+//ms
+uint32 sp_get_ticker(void)
+{
+  return timer_get_ticker();
+}
+
+void Delay_ms(uint32 ms)
+{
+  uint32 t = sp_get_ticker();
+  while(sp_get_ticker() - t < ms);
+}
+void sp_valve_on(void)
+{
+  valve_sta_set(valve_state_on);
+  valve_ctrl();
+}
+void sp_valve_off(void)
+{
+  valve_sta_set(valve_state_off);
+  valve_ctrl();
+}
+uint8 sp_valve_state(void)
+{
+  return valve_sta_get();
+}
+
+int16 get_2byte_int(uint8 value_str[2])
+{
+  int32 r = 0, t = 0;
+  t = value_str[0];
+  r = t << 8;
+  r |= value_str[1];
+  return (int16)r;
+}
+int32 get_3byte_int(uint8 value_str[3])
+{
+  int32 r = 0, t = 0;
+  t = value_str[0];
+  r = t << 16;
+  t = value_str[1];
+  r |= t << 8;
+  r |= value_str[2];
+  return r;
+}
+int32 get_4byte_int(uint8 value_str[4])
+{
+  int32 r = 0, t = 0;
+  t = value_str[0];
+  r = t << 24;
+  t = value_str[1];
+  r |= t << 16;
+  t = value_str[2];
+  r |= t << 8;
+  r |= value_str[3];
+  return r;
+}
+void set_2byte_int(uint8 value_str[2], int num)
+{
+  value_str[0] = (num >> 8) & 0xFF;
+  value_str[1] = num & 0xFF;
+}
+void set_3byte_int(uint8 value_str[3], int num)
+{
+  value_str[0] = (num >> 16) & 0xFF;
+  value_str[1] = (num >> 8) & 0xFF;
+  value_str[2] = num & 0xFF;
+}
+void set_4byte_int(uint8 value_str[4], int num)
+{
+  value_str[0] = (num >> 24) & 0xFF;
+  value_str[1] = (num >> 16) & 0xFF;
+  value_str[2] = (num >> 8) & 0xFF;
+  value_str[3] = num & 0xFF;
+}
+
+//»ñµÃµ¥×Ö½ÚÖÐijһλµÄÖµ
+int32 Get1Bit(uint8 buf, int n)
+{
+  return (buf >> n) & 0x01;
+}
+
+int16 get_2byte_int_le(uint8 value_str[2])
+{
+  int32 r = 0, t = 0;
+  t = value_str[1];
+  r = t << 8;
+  r |= value_str[0];
+  return (int16)r;
+}
+//С×Ö½ÚÐò
+int32 get_3byte_int_le(uint8 value_str[3])
+{
+  int32 r = 0, t = 0;
+  t = value_str[2];
+  r = t << 16;
+  t = value_str[1];
+  r |= t << 8;
+  r |= value_str[0];
+  return r;
+}
+//С×Ö½ÚÐò
+int32 get_4byte_int_le(uint8 value_str[4])
+{
+  int32 r = 0, t = 0;
+  t = value_str[3];
+  r = t << 24;
+  t = value_str[2];
+  r |= t << 16;
+  t = value_str[1];
+  r |= t << 8;
+  r |= value_str[0];
+  return r;
+}
+
+void set_2byte_int_le(uint8 value_str[2], int num)
+{
+  value_str[1] = (num >> 8) & 0xFF;
+  value_str[0] = num & 0xFF;
+}
+
+void set_3byte_int_le(uint8 value_str[3], int num)
+{
+  value_str[2] = (num >> 16) & 0xFF;
+  value_str[1] = (num >> 8) & 0xFF;
+  value_str[0] = num & 0xFF;
+}
+
+/*¼ÆËã´Óbcd starttime µ½ÏÖÔÚµÄÃëÊý*/
+uint32 diff_time(uint8 starttime[6])
+{
+  uint8 ctime[6];
+  uint32 start_second;
+  uint32 end_second;
+
+  sp_get_bcdtime(ctime);
+  start_second = format_time_covert_secs(starttime);
+  end_second = format_time_covert_secs(ctime);
+  if(end_second < start_second)
+  {
+    return 0;
+  }
+  return (end_second - start_second);
+}
+
+void mycpy(void* dest, const void* src, uint32 len)
+{
+  char* tmp_dest = (char*)dest;
+  char* tmp_src = (char*)src;
+  while(len--)
+  {
+    *tmp_dest = *tmp_src++;
+    tmp_dest++;
+  }
+}
+
+void sp_bcd2asc(const uint8 bcdbuf[], uint8 bcdlen, uint8* ascstr)
+{
+  uint8 i;
+  uint8 lch, hch;
+  for(i = 0; i < bcdlen; i++)
+  {
+    hch = (bcdbuf[i] & 0x0F);
+    lch = (bcdbuf[i] & 0xF0);
+    lch = lch >> 4;
+    ascstr[2 * i] = lch + '0';
+    ascstr[2 * i + 1] = hch + '0';
+  }
+  ascstr[2*i] = 0;
+}
+int32 sp_atoi(const char* src)
+{
+  int i = 0;
+  while(*src != 0)
+  {
+    i = i * 10 + *src - '0';
+    src++;
+  }
+  return i;
+}
+/**
+**2000.0.0:0.0.0ʱ¼äΪ»ùÊý
+**/
+static int MINUTE_SECS = 60;
+static int HOUR_SECS = 3600;
+static int DAY_SECS = 24*3600;
+static int YEAR_SECS = 365*24*3600;
+static int FOURYEAR_SECS = (365*3+366)*24*3600;
+static int norMoth[] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+static int leapMoth[] = {0,31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+/*time: string(yyyyMMddHHmmss) to int */
+int format_time_covert_secs(uint8 ctime[6])
+{
+  int secs;
+  int i;
+  int remain;
+  int year = BCD2Dec(ctime[0]);
+  int month = BCD2Dec(ctime[1]);
+  int day = BCD2Dec(ctime[2]);
+  int hour = BCD2Dec(ctime[3]);
+  int minute = BCD2Dec(ctime[4]);
+  int second = BCD2Dec(ctime[5]);
+
+  secs = year/4 *FOURYEAR_SECS;
+  remain = year%4;
+  secs += remain*YEAR_SECS;
+
+  if(remain == 0)
+  {
+    for(i = 0; i < month; ++i)
+    {
+      secs += leapMoth[i] *DAY_SECS;
+    }
+  }
+  else
+  {
+    for(i = 0; i < month; ++i)
+    {
+      secs += norMoth[i] *DAY_SECS;
+    }
+  }
+  secs += day*DAY_SECS;
+  secs += hour *HOUR_SECS;
+  secs += minute*MINUTE_SECS;
+  secs += second;
+  return secs;
+}
+
+uint8 sp_check_passwd(sp_pos_t* pos,const char* hint,uint8 passwd[6])
+{
+  uint8 temp[6];
+  uint8 offset = 0;
+  uint8 kcode;
+  uint32 ticker = sp_get_ticker();
+
+  show_manage_passwd(pos,hint,temp,offset);
+  while(sp_get_ticker() -ticker < DELAY_TIME60s)
+  {
+    sp_feed_dog();
+    kcode = sp_get_key();
+    if(kcode != SP_KEY_NONE)
+    {
+      switch(kcode)
+      {
+      case SP_KEY_0:
+      case SP_KEY_1:
+      case SP_KEY_2:
+      case SP_KEY_3:
+      case SP_KEY_4:
+      case SP_KEY_5:
+      case SP_KEY_6:
+      case SP_KEY_7:
+      case SP_KEY_8:
+      case SP_KEY_9:
+        if(offset < 6)
+        {
+          temp[offset++] = (uint8)(kcode-SP_KEY_0);
+          show_manage_passwd(pos,hint,temp,offset);
+        }
+        if(offset >= 6)
+        {
+          if(0 == MEMCMP(temp,passwd,6))
+          {
+            return 0;
+          }
+          else
+          {
+            disp_hint_info_two(pos,hint,"ÃÜÂë´íÎó",DELAY_TIME2s);
+            MEMCLEAR(temp, sizeof temp);
+            offset = 0;
+          }
+        }
+        break;
+      case SP_KEY_CLEAR:
+        if(offset == 0)
+        {
+          return 1;
+        }
+        --offset;
+        temp[offset] = 0;
+        show_manage_passwd(pos,hint,temp,offset);
+        break;
+      }
+    }
+  }
+  return 1;
+}