Subversion Repositories NedoOS

Rev

Rev 2405 | Details | Compare with Previous | Last modification | View Log

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