?login_element?

Subversion Repositories NedoOS

Rev

Rev 2175 | Blame | Compare with Previous | Last modification | View Log | Download

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <oscalls.h>
  4. #include <socket.h>
  5. #include <intrz80.h>
  6. #include <osfs.h>
  7. #include <stdlib.h>
  8. unsigned int RBR_THR = 0xf8ef;
  9. unsigned int IER = 0xf9ef;
  10. unsigned int IIR_FCR = 0xfaef;
  11. unsigned int LCR = 0xfbef;
  12. unsigned int MCR = 0xfcef;
  13. unsigned int LSR = 0xfdef;
  14. unsigned int MSR = 0xfeef;
  15. unsigned int SR = 0xffef;
  16. unsigned int divider = 1;
  17. unsigned char comType = 0;
  18. unsigned int espType = 32;
  19.  
  20. unsigned char cmd[512];
  21. const unsigned char sendOk[] = "SEND OK";
  22. const unsigned char gotWiFi[] = "WIFI GOT IP";
  23. const unsigned char timeUpdated[] = "+CIPSNTPTIME:";
  24. int GMT = 3;
  25. unsigned char is_atm;
  26. unsigned char netbuf[4 * 1024];
  27. struct sockaddr_in ntp_ia;
  28. union
  29. {
  30.         unsigned long ul;
  31.         unsigned char b[4];
  32. } secsUnix;
  33. unsigned int hour, minute, second, day, month, year, weekday;
  34. SOCKET s = 0;
  35. unsigned char inet = 0, espInet = 0;
  36. const unsigned char monthDays[12] =
  37.         {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  38. const unsigned char ntpnead[48] =
  39.         {
  40.                 0xdb,
  41.                 0x00,
  42.                 0x11,
  43.                 0xfa,
  44.                 0x00,
  45.                 0x00,
  46.                 0x00,
  47.                 0x00,
  48.                 0x00,
  49.                 0x01,
  50.                 0x03,
  51.                 0xfe,
  52. };
  53. unsigned char *defntp = "2.ru.pool.ntp.org";
  54. const unsigned char regaddr_ve[16] = {0x10, 0, 0x50, 0, 0x90, 0, 0, 0x12, 0x52, 0x92, 0, 0, 0, 0, 0, 0};
  55.  
  56. const unsigned char help[] = "\
  57. -H help\r\n\
  58. -T set time(-T17:59:38)\r\n\
  59. -D set date(-D21-06-2019)\r\n\
  60. -N ntp-server default: -N2.ru.pool.ntp.org\r\n\
  61. -Z time-zone default: -Z3\r\n\
  62. -i get datetime from internet\r\n\
  63. -e get datetime from ESP-COM";
  64.  
  65. extern void
  66. dns_resolve(void);
  67.  
  68. void clearStatus(void)
  69. {
  70. }
  71.  
  72. void delay(unsigned long counter)
  73. {
  74.         unsigned long start, finish;
  75.         counter = counter / 20;
  76.         if (counter < 1)
  77.         {
  78.                 counter = 1;
  79.         }
  80.         start = time();
  81.         finish = start + counter;
  82.  
  83.         while (start < finish)
  84.         {
  85.                 start = time();
  86.         }
  87. }
  88.  
  89. void exit(int e)
  90. {
  91.         if (s)
  92.                 closesocket(s, 0);
  93.         if (e != 0)
  94.         {
  95.                 puts((char *)e);
  96.         }
  97.         ((void (*)(int))0x0000)(e);
  98. }
  99.  
  100. extern void dns_resolve(void);
  101.  
  102. unsigned char readcmos(unsigned char r)
  103. {
  104.         disable_interrupt();
  105.         if (is_atm == 2 || is_atm == 3)
  106.         {
  107.                 r = regaddr_ve[r];
  108.                 if (r != 0)
  109.                 {
  110.                         input(0x55FE);
  111.                         r = input((r << 8) | 0x00fe);
  112.                 }
  113.         }
  114.         else
  115.         {
  116.                 output(0xdef7, r);
  117.                 r = input(0xbef7);
  118.         }
  119.         enable_interrupt();
  120.         return r;
  121. }
  122.  
  123. void writecmos(unsigned char r, unsigned char v)
  124. {
  125.         disable_interrupt();
  126.         if (is_atm == 2 || is_atm == 3)
  127.         {
  128.                 r = regaddr_ve[r] + 1; // На запись порт + 1
  129.                 if (r != 0)
  130.                 {
  131.                         input(0x55FE);
  132.                         input((r << 8) | 0x00fe);
  133.                         input((v << 8) | 0x00fe);
  134.                 }
  135.         }
  136.         else
  137.         {
  138.                 output(0xdef7, r);
  139.                 output(0xbef7, v);
  140.         }
  141.         enable_interrupt();
  142. }
  143.  
  144. void Unix_to_GMT(void)
  145. {
  146.         unsigned char monthLength = 0;
  147.         // корректировка часового пояса и синхронизация
  148.         int days = 0;
  149.         secsUnix.ul = secsUnix.ul + GMT * 3600;
  150.  
  151.         second = secsUnix.ul % 60;
  152.         secsUnix.ul /= 60; // now it is minutes
  153.         minute = secsUnix.ul % 60;
  154.         secsUnix.ul /= 60; // now it is hours
  155.         hour = secsUnix.ul % 24;
  156.         secsUnix.ul /= 24;                               // now it is days
  157.         weekday = (secsUnix.ul + 4) % 7; // day week, 0-sunday
  158.         year = 70;
  159.         while (days + ((year % 4) ? 365 : 366) <= secsUnix.ul)
  160.         {
  161.                 days += (year % 4) ? 365 : 366;
  162.                 year++;
  163.         }
  164.         secsUnix.ul -= days; // now it is days in this year, starting at 0
  165.  
  166.         days = 0;
  167.         month = 0;
  168.         for (month = 0; month < 12; month++)
  169.         {
  170.                 if (month == 1)
  171.                 { // february
  172.                         if (year % 4)
  173.                                 monthLength = 28;
  174.                         else
  175.                                 monthLength = 29;
  176.                 }
  177.                 else
  178.                         monthLength = monthDays[month];
  179.                 if (secsUnix.ul >= monthLength)
  180.                         secsUnix.ul -= monthLength;
  181.                 else
  182.                         break;
  183.         }
  184.         month++;                           // jan is month 1
  185.         day = secsUnix.ul + 1; // day of month
  186. }
  187. void ntp_resolver(void)
  188. {
  189.         unsigned char i, j;
  190.         signed char res;
  191.         int len;
  192.         ntp_ia.sin_port = 123 << 8;
  193.         ntp_ia.sin_addr = *dns_resolver((void *)defntp);
  194.         if (!ntp_ia.sin_addr.S_un.S_addr)
  195.                 exit((int)"error: domain name not resolved");
  196.         i = 200;
  197. inetloop:
  198.         YIELD();
  199.         i--;
  200.         YIELD();
  201.         if (i == 0)
  202.         {
  203.                 exit((int)"inet error");
  204.         }
  205.         s = socket(AF_INET, SOCK_DGRAM, 0);
  206.         if (s < 0)
  207.         {
  208.                 s = 0;
  209.                 goto inetloop;
  210.         }
  211.         memcpy(netbuf, ntpnead, sizeof(ntpnead));
  212.  
  213.         len = sendto(s, netbuf, 48, 0, &ntp_ia, sizeof(ntp_ia));
  214.         if (res < 0)
  215.         {
  216.                 closesocket(s, 0);
  217.                 s = 0;
  218.                 goto inetloop;
  219.         }
  220.         j = 50;
  221.         while (j)
  222.         {
  223.                 j--;
  224.                 len = recvfrom(s, netbuf, sizeof(netbuf), 0, &ntp_ia, sizeof(ntp_ia));
  225.                 if (len < 0)
  226.                 {
  227.                         YIELD();
  228.                         YIELD();
  229.                         continue;
  230.                 }
  231.                 break;
  232.         }
  233.  
  234.         closesocket(s, 0);
  235.         s = 0;
  236.         if (len <= 0)
  237.         {
  238.                 exit((int)"server error");
  239.         }
  240.         secsUnix.b[3] = netbuf[40];
  241.         secsUnix.b[2] = netbuf[41];
  242.         secsUnix.b[1] = netbuf[42];
  243.         secsUnix.b[0] = netbuf[43];
  244.         secsUnix.ul -= 2208988800UL;
  245.         Unix_to_GMT();
  246. }
  247.  
  248. ///////////////////////////
  249. #include <../common/esp-com.c>
  250. //////////////////////////
  251. void espntp_resolver(void)
  252. {
  253.         unsigned char retry = 10;
  254.         unsigned char byte, count = 0;
  255.         loadEspConfig();
  256.         uart_init(divider);
  257.         espReBoot();
  258.  
  259.         // AT+CIPSNTPCFG=1,8,"cn.ntp.org.cn","ntp.sjtu.edu.cn"
  260.         weekday = 0;
  261.         month = 0;
  262.         day = 0;
  263.         hour = 0;
  264.         second = 0;
  265.         year = 170;
  266.         strcpy(cmd, "AT+CIPSNTPCFG=1,");
  267.         sprintf(netbuf, "%u,\"%s\",\"time.google.com\"", GMT, defntp);
  268.         strcat(cmd, netbuf);
  269.         sendcommand(cmd);
  270.         getAnswer2(); // OK
  271. retryTime:
  272.         count = 0;
  273.         delay(250);
  274.         sendcommand("AT+CIPSNTPTIME?");
  275.         do
  276.         {
  277.                 byte = uart_readBlock();
  278.                 // printf("[%c]", byte);
  279.                 if (byte == timeUpdated[count])
  280.                 {
  281.                         count++;
  282.                 }
  283.                 else
  284.                 {
  285.                         count = 0;
  286.                 }
  287.         } while (count < strlen(timeUpdated));
  288.         getAnswer2(); // TIME
  289.  
  290.         strncpy(cmd, netbuf, 3);
  291.         cmd[3] = 0;
  292.  
  293.         if (cmd[0] == 'S' && cmd[1] == 'u')
  294.         {
  295.                 weekday = 1;
  296.         }
  297.         else if (cmd[0] == 'M' && cmd[1] == 'o')
  298.         {
  299.                 weekday = 2;
  300.         }
  301.         else if (cmd[0] == 'T' && cmd[1] == 'u')
  302.         {
  303.                 weekday = 3;
  304.         }
  305.         else if (cmd[0] == 'W' && cmd[1] == 'e')
  306.         {
  307.                 weekday = 4;
  308.         }
  309.         else if (cmd[0] == 'T' && cmd[1] == 'h')
  310.         {
  311.                 weekday = 5;
  312.         }
  313.         else if (cmd[0] == 'F' && cmd[1] == 'r')
  314.         {
  315.                 weekday = 6;
  316.         }
  317.         else if (cmd[0] == 'S' && cmd[1] == 'a')
  318.         {
  319.                 weekday = 7;
  320.         }
  321.  
  322.         strncpy(cmd, netbuf + 4, 3);
  323.         cmd[3] = 0;
  324.  
  325.         if (cmd[0] == 'J' && cmd[1] == 'a')
  326.         {
  327.                 month = 1;
  328.         }
  329.         else if (cmd[0] == 'F' && cmd[1] == 'e')
  330.         {
  331.                 month = 2;
  332.         }
  333.         else if (cmd[0] == 'M' && cmd[2] == 'r')
  334.         {
  335.                 month = 3;
  336.         }
  337.         else if (cmd[0] == 'A' && cmd[1] == 'p')
  338.         {
  339.                 month = 4;
  340.         }
  341.         else if (cmd[0] == 'M' && cmd[2] == 'y')
  342.         {
  343.                 month = 5;
  344.         }
  345.         else if (cmd[0] == 'J' && cmd[2] == 'n')
  346.         {
  347.                 month = 6;
  348.         }
  349.         else if (cmd[0] == 'J' && cmd[2] == 'l')
  350.         {
  351.                 month = 7;
  352.         }
  353.         else if (cmd[0] == 'A' && cmd[1] == 'u')
  354.         {
  355.                 month = 8;
  356.         }
  357.         else if (cmd[0] == 'S' && cmd[1] == 'e')
  358.         {
  359.                 month = 9;
  360.         }
  361.         else if (cmd[0] == 'O' && cmd[1] == 'c')
  362.         {
  363.                 month = 10;
  364.         }
  365.         else if (cmd[0] == 'N' && cmd[1] == 'o')
  366.         {
  367.                 month = 11;
  368.         }
  369.         else if (cmd[0] == 'D' && cmd[1] == 'e')
  370.         {
  371.                 month = 12;
  372.         }
  373.  
  374.         strncpy(cmd, netbuf + 8, 2);
  375.         cmd[2] = 0;
  376.         day = atoi(cmd);
  377.  
  378.         strncpy(cmd, netbuf + 11, 2);
  379.         hour = atoi(cmd);
  380.  
  381.         strncpy(cmd, netbuf + 14, 2);
  382.         minute = atoi(cmd);
  383.  
  384.         strncpy(cmd, netbuf + 17, 2);
  385.         second = atoi(cmd);
  386.  
  387.         strncpy(cmd, netbuf + 22, 2);
  388.         cmd[4] = 0;
  389.         year = atoi(cmd) + 100;
  390.  
  391.         getAnswer2(); // OK
  392.  
  393.         // printf("day of week:%u Month:%u day:%u hours:%u minutes:%u seconds:%u year:%u\r\n", weekday, month, day, hour, minute, second, year);
  394.  
  395.         if (year == 170)
  396.         {
  397.                 YIELD();
  398.                 if (retry != 0)
  399.                 {
  400.                         retry--;
  401.                         printf("Retry [%u]\r\n", retry);
  402.                         delay(500);
  403.                         goto retryTime;
  404.                 }
  405.                 puts("error getting time...");
  406.                 exit(255);
  407.         }
  408. }
  409.  
  410. void set_datetime(void)
  411. {
  412.         writecmos(0x0b, readcmos(0x0b) | 6);
  413.         writecmos(0x07, day);
  414.         writecmos(0x08, month);
  415.         if (is_atm == 2 || is_atm == 3)
  416.         {
  417.                 writecmos(0x09, year - 80);
  418.         }
  419.         else
  420.         {
  421.                 writecmos(0x09, year - 100);
  422.         }
  423.  
  424.         writecmos(0x00, second);
  425.         writecmos(0x02, minute);
  426.         writecmos(0x04, hour);
  427. }
  428. void get_datetime(void)
  429. {
  430.         writecmos(0x0b, readcmos(0x0b) | 6);
  431.         second = readcmos(0x00);
  432.         minute = readcmos(0x02);
  433.         hour = readcmos(0x04);
  434.         weekday = readcmos(0x06) - 1;
  435.         day = readcmos(0x07);
  436.         month = readcmos(0x08);
  437.         if (is_atm == 2 || is_atm == 3)
  438.         {
  439.                 year = readcmos(0x09) + 80;
  440.         }
  441.         else
  442.         {
  443.                 year = readcmos(0x09) + 100;
  444.         }
  445. }
  446.  
  447. C_task main(int argc, char *argv[])
  448. {
  449.         unsigned char i = 1;
  450.         os_initstdio();
  451.         is_atm = (unsigned char)OS_GETCONFIG();
  452.  
  453.         if (argc == 1)
  454.         {
  455.                 get_datetime();
  456.                 puts(help);
  457.         }
  458.         while (i != argc)
  459.         {
  460.                 char *p = argv[i];
  461.                 if (p[0] != '-')
  462.                         exit((int)"Wrong parameter. Use -H for help");
  463.                 switch (p[1] & 0xdf)
  464.                 {
  465.                 case 'T':
  466.                         get_datetime();
  467.                         if (sscanf(p + 2, "%d:%d:%d", &hour, &minute, &second) == 3)
  468.                         {
  469.                                 disable_interrupt();
  470.                                 set_datetime();
  471.                                 enable_interrupt();
  472.                         }
  473.                         break;
  474.                 case 'D':
  475.                         get_datetime();
  476.                         if (sscanf(p + 2, "%d-%d-%d", &day, &month, &year) == 3)
  477.                         {
  478.                                 disable_interrupt();
  479.                                 year -= 1900;
  480.                                 set_datetime();
  481.                                 enable_interrupt();
  482.                         }
  483.                         break;
  484.                 case 'N':
  485.                         defntp = p + 2;
  486.                         break;
  487.                 case 'Z':
  488.                         if (sscanf(p + 2, "%d", &GMT) != 1)
  489.                         {
  490.                                 GMT = 3;
  491.                         }
  492.                         break;
  493.                 case 'H':
  494.                         exit((int)help);
  495.                         break;
  496.                 case 'I':
  497.                         inet = 1;
  498.                         break;
  499.                 case 'E':
  500.                         espInet = 1;
  501.                         break;
  502.  
  503.                 default:
  504.                         exit((int)"Wrong parameter. Use -H for help");
  505.                 }
  506.                 i++;
  507.         }
  508.         if (inet)
  509.         {
  510.                 ntp_resolver();
  511.                 set_datetime();
  512.                 writecmos(0x06, weekday + 1);
  513.         }
  514.  
  515.         if (espInet)
  516.         {
  517.                 espntp_resolver();
  518.                 set_datetime();
  519.                 writecmos(0x06, weekday + 1);
  520.         }
  521.         puts("Now time:");
  522.         printf("%02u-%02u-%04u ", day, month, year + 1900);
  523.         printf("%02u:%02u:%02u\r\n", hour, minute, second);
  524.         uart_setrts(1);
  525.         exit(0);
  526.         return 0;
  527. }
  528.