Subversion Repositories NedoOS

Rev

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