?login_element?

Subversion Repositories NedoOS

Rev

Rev 1660 | Rev 2069 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <oscalls.h>
  4. #include <socket.h>
  5. #include <intrz80.h>
  6.  
  7. int GMT = 3;
  8. no_init unsigned char is_atm;
  9. no_init unsigned char netbuf[4 * 1024];
  10. no_init struct sockaddr_in ntp_ia;
  11. union
  12. {
  13.         unsigned long ul;
  14.         unsigned char b[4];
  15. } secsUnix;
  16. unsigned int hour, minute, second, day, month, year, weekday;
  17. SOCKET s = 0;
  18. unsigned char inet = 0;
  19. const unsigned char monthDays[12] =
  20.         {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  21. const unsigned char ntpnead[48] =
  22.         {
  23.                 0xdb,
  24.                 0x00,
  25.                 0x11,
  26.                 0xfa,
  27.                 0x00,
  28.                 0x00,
  29.                 0x00,
  30.                 0x00,
  31.                 0x00,
  32.                 0x01,
  33.                 0x03,
  34.                 0xfe,
  35. };
  36. unsigned char *defntp = "2.ru.pool.ntp.org";
  37. const unsigned char regaddr_ve[16] = {0x10, 0, 0x50, 0, 0x90, 0, 0, 0x12, 0x52, 0x92, 0, 0, 0, 0, 0, 0};
  38.  
  39. const unsigned char help[] = "\
  40. -H help\r\n\
  41. -T set time(-T17:59:38)\r\n\
  42. -D set date(-D21-06-2019)\r\n\
  43. -N ntp-server default: -N2.ru.pool.ntp.org\r\n\
  44. -Z time-zone default: -Z3\r\n\
  45. -i get datetime from internet";
  46.  
  47. extern void dns_resolve(void);
  48.  
  49. void exit(int e)
  50. {
  51.         if (s)
  52.                 closesocket(s, 0);
  53.         if (e != 0)
  54.         {
  55.                 puts((char *)e);
  56.         }
  57.         ((void (*)(int))0x0000)(e);
  58. }
  59.  
  60. extern void dns_resolve(void);
  61.  
  62. unsigned char readcmos(unsigned char r)
  63. {
  64.         disable_interrupt();
  65.         if (is_atm == 2 || is_atm == 3)
  66.         {
  67.                 r = regaddr_ve[r];
  68.                 if (r != 0)
  69.                 {
  70.                         input(0x55FE);
  71.                         r = input((r << 8) | 0x00fe);
  72.                 }
  73.         }
  74.         else
  75.         {
  76.                 output(0xdef7, r);
  77.                 r = input(0xbef7);
  78.         }
  79.         enable_interrupt();
  80.         return r;
  81. }
  82.  
  83. void writecmos(unsigned char r, unsigned char v)
  84. {
  85.         disable_interrupt();
  86.         if (is_atm == 2 || is_atm == 3)
  87.         {
  88.                 r = regaddr_ve[r] + 1; // На запись порт + 1
  89.                 if (r != 0)
  90.                 {
  91.                         input(0x55FE);
  92.                         input((r << 8) | 0x00fe);
  93.                         input((v << 8) | 0x00fe);
  94.                 }
  95.         }
  96.         else
  97.         {
  98.                 output(0xdef7, r);
  99.                 output(0xbef7, v);
  100.         }
  101.         enable_interrupt();
  102. }
  103.  
  104. void Unix_to_GMT(void)
  105. {
  106.         unsigned char monthLength = 0;
  107.         // корректировка часового пояса и синхронизация
  108.         int days = 0;
  109.         secsUnix.ul = secsUnix.ul + GMT * 3600;
  110.  
  111.         second = secsUnix.ul % 60;
  112.         secsUnix.ul /= 60; // now it is minutes
  113.         minute = secsUnix.ul % 60;
  114.         secsUnix.ul /= 60; // now it is hours
  115.         hour = secsUnix.ul % 24;
  116.         secsUnix.ul /= 24;                               // now it is days
  117.         weekday = (secsUnix.ul + 4) % 7; // day week, 0-sunday
  118.         year = 70;
  119.         while (days + ((year % 4) ? 365 : 366) <= secsUnix.ul)
  120.         {
  121.                 days += (year % 4) ? 365 : 366;
  122.                 year++;
  123.         }
  124.         secsUnix.ul -= days; // now it is days in this year, starting at 0
  125.  
  126.         days = 0;
  127.         month = 0;
  128.         for (month = 0; month < 12; month++)
  129.         {
  130.                 if (month == 1)
  131.                 { // february
  132.                         if (year % 4)
  133.                                 monthLength = 28;
  134.                         else
  135.                                 monthLength = 29;
  136.                 }
  137.                 else
  138.                         monthLength = monthDays[month];
  139.                 if (secsUnix.ul >= monthLength)
  140.                         secsUnix.ul -= monthLength;
  141.                 else
  142.                         break;
  143.         }
  144.         month++;                           // jan is month 1
  145.         day = secsUnix.ul + 1; // day of month
  146. }
  147. void ntp_resolver(void)
  148. {
  149.         unsigned char i, j;
  150.         signed char res;
  151.         int len;
  152.         ntp_ia.sin_port = 123 << 8;
  153.         ntp_ia.sin_addr = *dns_resolver((void *)defntp);
  154.         if (!ntp_ia.sin_addr.S_un.S_addr)
  155.                 exit((int)"error: domain name not resolved");
  156.         i = 200;
  157. inetloop:
  158.         YIELD();
  159.         i--;
  160.         YIELD();
  161.         if (i == 0)
  162.         {
  163.                 exit((int)"inet error");
  164.         }
  165.         s = socket(AF_INET, SOCK_DGRAM, 0);
  166.         if (s < 0)
  167.         {
  168.                 s = 0;
  169.                 goto inetloop;
  170.         }
  171.         memcpy(netbuf, ntpnead, sizeof(ntpnead));
  172.  
  173.         len = sendto(s, netbuf, 48, 0, &ntp_ia, sizeof(ntp_ia));
  174.         if (res < 0)
  175.         {
  176.                 closesocket(s, 0);
  177.                 s = 0;
  178.                 goto inetloop;
  179.         }
  180.         j = 50;
  181.         while (j)
  182.         {
  183.                 j--;
  184.                 len = recvfrom(s, netbuf, sizeof(netbuf), 0, &ntp_ia, sizeof(ntp_ia));
  185.                 if (len < 0)
  186.                 {
  187.                         YIELD();
  188.                         YIELD();
  189.                         continue;
  190.                 }
  191.                 break;
  192.         }
  193.  
  194.         closesocket(s, 0);
  195.         s = 0;
  196.         if (len <= 0)
  197.         {
  198.                 exit((int)"server error");
  199.         }
  200.         secsUnix.b[3] = netbuf[40];
  201.         secsUnix.b[2] = netbuf[41];
  202.         secsUnix.b[1] = netbuf[42];
  203.         secsUnix.b[0] = netbuf[43];
  204.         secsUnix.ul -= 2208988800UL;
  205.         Unix_to_GMT();
  206. }
  207.  
  208. void set_datetime(void)
  209. {
  210.         writecmos(0x0b, readcmos(0x0b) | 6);
  211.         writecmos(0x07, day);
  212.         writecmos(0x08, month);
  213.         if (is_atm == 2 || is_atm == 3)
  214.         {
  215.                 writecmos(0x09, year - 80);
  216.         }
  217.         else
  218.         {
  219.                 writecmos(0x09, year - 100);
  220.         }
  221.  
  222.         writecmos(0x00, second);
  223.         writecmos(0x02, minute);
  224.         writecmos(0x04, hour);
  225. }
  226. void get_datetime(void)
  227. {
  228.         writecmos(0x0b, readcmos(0x0b) | 6);
  229.         second = readcmos(0x00);
  230.         minute = readcmos(0x02);
  231.         hour = readcmos(0x04);
  232.         weekday = readcmos(0x06) - 1;
  233.         day = readcmos(0x07);
  234.         month = readcmos(0x08);
  235.         if (is_atm == 2 || is_atm == 3)
  236.         {
  237.         year = readcmos(0x09) + 80;
  238.         }
  239.         else{year = readcmos(0x09) + 100;}
  240. }
  241.  
  242. C_task main(int argc, char *argv[])
  243. {
  244.         unsigned char i = 1;
  245.         os_initstdio();
  246.         is_atm = (unsigned char)OS_GETCONFIG();
  247.  
  248.         if (argc == 1)
  249.         {
  250.                 get_datetime();
  251.                 puts(help);
  252.         }
  253.         while (i != argc)
  254.         {
  255.                 char *p = argv[i];
  256.                 if (p[0] != '-')
  257.                         exit((int)"Wrong parameter. Use -H for help");
  258.                 switch (p[1] & 0xdf)
  259.                 {
  260.                 case 'T':
  261.                         get_datetime();
  262.                         if (sscanf(p + 2, "%d:%d:%d", &hour, &minute, &second) == 3)
  263.                         {
  264.                                 disable_interrupt();
  265.                                 set_datetime();
  266.                                 enable_interrupt();
  267.                         }
  268.                         break;
  269.                 case 'D':
  270.                         get_datetime();
  271.                         if (sscanf(p + 2, "%d-%d-%d", &day, &month, &year) == 3)
  272.                         {
  273.                                 disable_interrupt();
  274.                                 year -= 1900;
  275.                                 set_datetime();
  276.                                 enable_interrupt();
  277.                         }
  278.                         break;
  279.                 case 'N':
  280.                         defntp = p + 2;
  281.                         break;
  282.                 case 'Z':
  283.                         if (sscanf(p + 2, "%d", &GMT) != 1)
  284.                         {
  285.                                 GMT = 3;
  286.                         }
  287.                         break;
  288.                 case 'H':
  289.                         exit((int)help);
  290.                         break;
  291.                 case 'I':
  292.                         inet = 1;
  293.                         break;
  294.                 default:
  295.                         exit((int)"Wrong parameter. Use -H for help");
  296.                 }
  297.                 i++;
  298.         }
  299.         if (inet)
  300.         {
  301.                 ntp_resolver();
  302.                 set_datetime();
  303.                 writecmos(0x06, weekday + 1);
  304.         }
  305.         puts("Now time:");
  306.         printf("%02u-%02u-%04u ", day, month, year + 1900);
  307.         printf("%02u:%02u:%02u\r\n", hour, minute, second);
  308.         exit(0);
  309.         return 0;
  310. }
  311.