Subversion Repositories NedoOS

Rev

Rev 2388 | 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;
2068 kulich 26
const unsigned char sendOk[] = "SEND OK";
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
                {
305
                        puts("Timeout waiting '+TIME_UPDATED'");
306
                        writeLog("Timeout waiting '+TIME_UPDATED'", "espntp_resolver");
307
                        exit(255);
308
                }
2388 kulich 309
        }
310
 
2078 kulich 311
retryTime:
312
        count = 0;
2361 kulich 313
        delay(300);
2388 kulich 314
        finish = time() + (5 * 50);
2068 kulich 315
        sendcommand("AT+CIPSNTPTIME?");
2361 kulich 316
 
2389 kulich 317
        if (!getAnswer3()) // TIME......
318
        {
319
                puts("Timeout waiting answer to AT+CIPSNTPTIME?");
320
                writeLog("Timeout waiting answer to AT+CIPSNTPTIME?", "espntp_resolver");
321
                exit(255);
322
        }
2068 kulich 323
 
2388 kulich 324
        count1 = strstr(netbuf, "+CIPSNTPTIME:");
325
        if (count1 == NULL)
2361 kulich 326
        {
2388 kulich 327
                puts("Error. No '+CIPSNTPTIME:' in answer ");
328
                writeLog("Error. No '+CIPSNTPTIME:' in answer", "espntp_resolver");
2361 kulich 329
                exit(255);
330
        }
331
 
2388 kulich 332
        strncpy(cmd, netbuf + 13, 3);
2068 kulich 333
        cmd[3] = 0;
334
 
335
        if (cmd[0] == 'S' && cmd[1] == 'u')
336
        {
337
                weekday = 1;
338
        }
339
        else if (cmd[0] == 'M' && cmd[1] == 'o')
340
        {
341
                weekday = 2;
342
        }
343
        else if (cmd[0] == 'T' && cmd[1] == 'u')
344
        {
345
                weekday = 3;
346
        }
347
        else if (cmd[0] == 'W' && cmd[1] == 'e')
348
        {
349
                weekday = 4;
350
        }
351
        else if (cmd[0] == 'T' && cmd[1] == 'h')
352
        {
353
                weekday = 5;
354
        }
355
        else if (cmd[0] == 'F' && cmd[1] == 'r')
356
        {
357
                weekday = 6;
358
        }
359
        else if (cmd[0] == 'S' && cmd[1] == 'a')
360
        {
361
                weekday = 7;
362
        }
363
 
2388 kulich 364
        strncpy(cmd, netbuf + 4 + 13, 3);
2068 kulich 365
        cmd[3] = 0;
366
 
367
        if (cmd[0] == 'J' && cmd[1] == 'a')
368
        {
369
                month = 1;
370
        }
371
        else if (cmd[0] == 'F' && cmd[1] == 'e')
372
        {
373
                month = 2;
374
        }
375
        else if (cmd[0] == 'M' && cmd[2] == 'r')
376
        {
377
                month = 3;
378
        }
379
        else if (cmd[0] == 'A' && cmd[1] == 'p')
380
        {
381
                month = 4;
382
        }
383
        else if (cmd[0] == 'M' && cmd[2] == 'y')
384
        {
385
                month = 5;
386
        }
387
        else if (cmd[0] == 'J' && cmd[2] == 'n')
388
        {
389
                month = 6;
390
        }
391
        else if (cmd[0] == 'J' && cmd[2] == 'l')
392
        {
393
                month = 7;
394
        }
395
        else if (cmd[0] == 'A' && cmd[1] == 'u')
396
        {
397
                month = 8;
398
        }
399
        else if (cmd[0] == 'S' && cmd[1] == 'e')
400
        {
401
                month = 9;
402
        }
403
        else if (cmd[0] == 'O' && cmd[1] == 'c')
404
        {
405
                month = 10;
406
        }
407
        else if (cmd[0] == 'N' && cmd[1] == 'o')
408
        {
409
                month = 11;
410
        }
411
        else if (cmd[0] == 'D' && cmd[1] == 'e')
412
        {
413
                month = 12;
414
        }
415
 
2388 kulich 416
        strncpy(cmd, netbuf + 8 + 13, 2);
2068 kulich 417
        cmd[2] = 0;
418
        day = atoi(cmd);
419
 
2388 kulich 420
        strncpy(cmd, netbuf + 11 + 13, 2);
2068 kulich 421
        hour = atoi(cmd);
422
 
2388 kulich 423
        strncpy(cmd, netbuf + 14 + 13, 2);
2068 kulich 424
        minute = atoi(cmd);
425
 
2388 kulich 426
        strncpy(cmd, netbuf + 17 + 13, 2);
2068 kulich 427
        second = atoi(cmd);
428
 
2388 kulich 429
        strncpy(cmd, netbuf + 22 + 13, 2);
2068 kulich 430
        cmd[4] = 0;
431
        year = atoi(cmd) + 100;
2070 kulich 432
 
2388 kulich 433
        // 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);
434
 
2389 kulich 435
        if (!getAnswer3()) // OK
436
        {
437
                puts("Timeout waiting last OK. Continue");
438
                writeLog("Timeout waiting last OK. Continue", "espntp_resolver");
439
        }
2075 kulich 440
 
2070 kulich 441
        if (year == 170)
2068 kulich 442
        {
2070 kulich 443
                YIELD();
2388 kulich 444
                if (retry == 0)
2070 kulich 445
                {
2388 kulich 446
                        puts("error getting time...");
447
                        exit(255);
2070 kulich 448
                }
2388 kulich 449
 
450
                retry--;
451
                printf("Retry [NTP][%u]\r\n", retry);
452
                writeLog("Retry [NTP] incorrect year", "espntp_resolver");
453
                delay(500);
454
                goto retryTime;
2068 kulich 455
        }
456
}
457
 
1668 kulich 458
void set_datetime(void)
459
{
460
        writecmos(0x0b, readcmos(0x0b) | 6);
461
        writecmos(0x07, day);
462
        writecmos(0x08, month);
463
        if (is_atm == 2 || is_atm == 3)
464
        {
465
                writecmos(0x09, year - 80);
466
        }
467
        else
468
        {
469
                writecmos(0x09, year - 100);
470
        }
1393 Kulich 471
 
1668 kulich 472
        writecmos(0x00, second);
473
        writecmos(0x02, minute);
474
        writecmos(0x04, hour);
1393 Kulich 475
}
476
void get_datetime(void)
477
{
1668 kulich 478
        writecmos(0x0b, readcmos(0x0b) | 6);
479
        second = readcmos(0x00);
480
        minute = readcmos(0x02);
481
        hour = readcmos(0x04);
482
        weekday = readcmos(0x06) - 1;
483
        day = readcmos(0x07);
484
        month = readcmos(0x08);
485
        if (is_atm == 2 || is_atm == 3)
486
        {
2068 kulich 487
                year = readcmos(0x09) + 80;
1668 kulich 488
        }
2068 kulich 489
        else
490
        {
491
                year = readcmos(0x09) + 100;
492
        }
1393 Kulich 493
}
494
 
1668 kulich 495
C_task main(int argc, char *argv[])
1393 Kulich 496
{
1668 kulich 497
        unsigned char i = 1;
1393 Kulich 498
        os_initstdio();
2389 kulich 499
        printf("[TIME2 Build:%s  %s]\r\n\r\n", __DATE__, __TIME__);
1393 Kulich 500
        is_atm = (unsigned char)OS_GETCONFIG();
501
 
1668 kulich 502
        if (argc == 1)
503
        {
1393 Kulich 504
                get_datetime();
505
                puts(help);
506
        }
2389 kulich 507
 
1668 kulich 508
        while (i != argc)
509
        {
510
                char *p = argv[i];
511
                if (p[0] != '-')
512
                        exit((int)"Wrong parameter. Use -H for help");
513
                switch (p[1] & 0xdf)
514
                {
515
                case 'T':
516
                        get_datetime();
517
                        if (sscanf(p + 2, "%d:%d:%d", &hour, &minute, &second) == 3)
518
                        {
519
                                disable_interrupt();
520
                                set_datetime();
521
                                enable_interrupt();
522
                        }
523
                        break;
524
                case 'D':
525
                        get_datetime();
526
                        if (sscanf(p + 2, "%d-%d-%d", &day, &month, &year) == 3)
527
                        {
528
                                disable_interrupt();
529
                                year -= 1900;
530
                                set_datetime();
531
                                enable_interrupt();
532
                        }
533
                        break;
534
                case 'N':
535
                        defntp = p + 2;
536
                        break;
537
                case 'Z':
2369 kulich 538
                        if (sscanf(p + 2, "%d", &GMT) != 1)
1668 kulich 539
                        {
540
                                GMT = 3;
541
                        }
542
                        break;
543
                case 'H':
544
                        exit((int)help);
545
                        break;
546
                case 'I':
547
                        inet = 1;
548
                        break;
2068 kulich 549
                case 'E':
550
                        espInet = 1;
551
                        break;
552
 
1668 kulich 553
                default:
554
                        exit((int)"Wrong parameter. Use -H for help");
1393 Kulich 555
                }
556
                i++;
557
        }
1668 kulich 558
        if (inet)
559
        {
1393 Kulich 560
                ntp_resolver();
561
                set_datetime();
1668 kulich 562
                writecmos(0x06, weekday + 1);
1393 Kulich 563
        }
2068 kulich 564
        if (espInet)
565
        {
566
                espntp_resolver();
567
                set_datetime();
568
                writecmos(0x06, weekday + 1);
2366 kulich 569
                uartFlush(500);
2068 kulich 570
        }
1393 Kulich 571
        puts("Now time:");
1668 kulich 572
        printf("%02u-%02u-%04u ", day, month, year + 1900);
573
        printf("%02u:%02u:%02u\r\n", hour, minute, second);
1393 Kulich 574
        exit(0);
575
        return 0;
1668 kulich 576
}