SimpleSocket 1.0 examples
Dependencies: EthernetNetIf SimpleSocket 1.0 mbed
ntpclient2.cpp@39:108499af2b53, 2012-06-06 (annotated)
- Committer:
- yamaguch
- Date:
- Wed Jun 06 03:34:16 2012 +0000
- Revision:
- 39:108499af2b53
updated link to the library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yamaguch | 39:108499af2b53 | 1 | #include "EthernetNetIf.h" |
yamaguch | 39:108499af2b53 | 2 | #include "SimpleSocket.h" |
yamaguch | 39:108499af2b53 | 3 | |
yamaguch | 39:108499af2b53 | 4 | typedef unsigned long long Time64; |
yamaguch | 39:108499af2b53 | 5 | |
yamaguch | 39:108499af2b53 | 6 | Time64 toTime64(char buf[]) { |
yamaguch | 39:108499af2b53 | 7 | Time64 time64 = 0; |
yamaguch | 39:108499af2b53 | 8 | for (int i = 0; i < 8; i++) { |
yamaguch | 39:108499af2b53 | 9 | time64 = (time64 << 8) | buf[i]; |
yamaguch | 39:108499af2b53 | 10 | } |
yamaguch | 39:108499af2b53 | 11 | return time64; |
yamaguch | 39:108499af2b53 | 12 | } |
yamaguch | 39:108499af2b53 | 13 | |
yamaguch | 39:108499af2b53 | 14 | Time64 toTime64(int usecs) { |
yamaguch | 39:108499af2b53 | 15 | return Time64(double(usecs) * (1ULL << 32) / 1000000); |
yamaguch | 39:108499af2b53 | 16 | } |
yamaguch | 39:108499af2b53 | 17 | |
yamaguch | 39:108499af2b53 | 18 | void printTime64(char *title, Time64 time64) { |
yamaguch | 39:108499af2b53 | 19 | unsigned long seconds = (unsigned long) (time64 >> 32); |
yamaguch | 39:108499af2b53 | 20 | unsigned long subsecs = (unsigned long) (time64 & 0xFFFFFFFFULL); |
yamaguch | 39:108499af2b53 | 21 | char buf[16]; |
yamaguch | 39:108499af2b53 | 22 | |
yamaguch | 39:108499af2b53 | 23 | time_t jstime = time_t(seconds - 2208988800UL) + 9 * 3600; |
yamaguch | 39:108499af2b53 | 24 | strftime(buf, sizeof(buf), "%m/%d %X", localtime(&jstime)); |
yamaguch | 39:108499af2b53 | 25 | printf("%s: %s", title, buf); |
yamaguch | 39:108499af2b53 | 26 | sprintf(buf, "%f\n", (double) subsecs / (1ULL << 32)); |
yamaguch | 39:108499af2b53 | 27 | printf("%s", &buf[1]); |
yamaguch | 39:108499af2b53 | 28 | } |
yamaguch | 39:108499af2b53 | 29 | |
yamaguch | 39:108499af2b53 | 30 | void ntpclient2() { |
yamaguch | 39:108499af2b53 | 31 | EthernetNetIf eth; |
yamaguch | 39:108499af2b53 | 32 | eth.setup(); |
yamaguch | 39:108499af2b53 | 33 | |
yamaguch | 39:108499af2b53 | 34 | char *NTP_SERVER = "pool.ntp.org"; |
yamaguch | 39:108499af2b53 | 35 | char buf[48] = {0x23};// 00100011 LI(0), Version(4), Mode(3: Client) |
yamaguch | 39:108499af2b53 | 36 | Timer timer; |
yamaguch | 39:108499af2b53 | 37 | Time64 adjustedTime = 0; |
yamaguch | 39:108499af2b53 | 38 | |
yamaguch | 39:108499af2b53 | 39 | for (int count = 0; count < 5; count++) { |
yamaguch | 39:108499af2b53 | 40 | buf[0] = 0x23; |
yamaguch | 39:108499af2b53 | 41 | DatagramSocket datagram; |
yamaguch | 39:108499af2b53 | 42 | datagram.write(buf, sizeof(buf)); |
yamaguch | 39:108499af2b53 | 43 | timer.reset(); |
yamaguch | 39:108499af2b53 | 44 | datagram.send(NTP_SERVER, 123); |
yamaguch | 39:108499af2b53 | 45 | timer.start(); |
yamaguch | 39:108499af2b53 | 46 | if (datagram.receive() > 0) { |
yamaguch | 39:108499af2b53 | 47 | int turnaround = timer.read_us(); |
yamaguch | 39:108499af2b53 | 48 | if (datagram.read(buf, sizeof(buf))) { |
yamaguch | 39:108499af2b53 | 49 | Time64 receivedTime = toTime64(&buf[32]); |
yamaguch | 39:108499af2b53 | 50 | Time64 transferTime = toTime64(&buf[40]); |
yamaguch | 39:108499af2b53 | 51 | adjustedTime = toTime64(turnaround / 2) + receivedTime / 2 + transferTime / 2; |
yamaguch | 39:108499af2b53 | 52 | timer.reset(); |
yamaguch | 39:108499af2b53 | 53 | timer.start(); |
yamaguch | 39:108499af2b53 | 54 | printTime64("transfer", transferTime); |
yamaguch | 39:108499af2b53 | 55 | printTime64("adjusted", adjustedTime); |
yamaguch | 39:108499af2b53 | 56 | printf("\n"); |
yamaguch | 39:108499af2b53 | 57 | } |
yamaguch | 39:108499af2b53 | 58 | } else { |
yamaguch | 39:108499af2b53 | 59 | wait(5); |
yamaguch | 39:108499af2b53 | 60 | } |
yamaguch | 39:108499af2b53 | 61 | } |
yamaguch | 39:108499af2b53 | 62 | |
yamaguch | 39:108499af2b53 | 63 | float subsecs = (double) (adjustedTime & 0xFFFFFFFFULL) / (1ULL << 32); |
yamaguch | 39:108499af2b53 | 64 | wait(1 - subsecs); |
yamaguch | 39:108499af2b53 | 65 | set_time((size_t) ((adjustedTime >> 32) - 2208988800UL) + 1); |
yamaguch | 39:108499af2b53 | 66 | |
yamaguch | 39:108499af2b53 | 67 | time_t jstime = time(NULL) + 9 * 3600; |
yamaguch | 39:108499af2b53 | 68 | strftime(buf, sizeof(buf), "%m/%d %X", localtime(&jstime)); |
yamaguch | 39:108499af2b53 | 69 | printf("RTC delta = %6d, %s\n\n", timer.read_us(), buf); |
yamaguch | 39:108499af2b53 | 70 | |
yamaguch | 39:108499af2b53 | 71 | for (int count = 0; count < 20; count++) { |
yamaguch | 39:108499af2b53 | 72 | buf[0] = 0x23; |
yamaguch | 39:108499af2b53 | 73 | DatagramSocket datagram; |
yamaguch | 39:108499af2b53 | 74 | datagram.write(buf, sizeof(buf)); |
yamaguch | 39:108499af2b53 | 75 | timer.reset(); |
yamaguch | 39:108499af2b53 | 76 | datagram.send(NTP_SERVER, 123); |
yamaguch | 39:108499af2b53 | 77 | timer.start(); |
yamaguch | 39:108499af2b53 | 78 | if (datagram.receive() > 0) { |
yamaguch | 39:108499af2b53 | 79 | int turnaround = timer.read_us(); |
yamaguch | 39:108499af2b53 | 80 | if (datagram.read(buf, sizeof(buf))) { |
yamaguch | 39:108499af2b53 | 81 | Time64 receivedTime = toTime64(&buf[32]); |
yamaguch | 39:108499af2b53 | 82 | Time64 transferTime = toTime64(&buf[40]); |
yamaguch | 39:108499af2b53 | 83 | adjustedTime = toTime64(turnaround / 2) + receivedTime / 2 + transferTime / 2; |
yamaguch | 39:108499af2b53 | 84 | printTime64("adjusted", adjustedTime); |
yamaguch | 39:108499af2b53 | 85 | time_t jstime = time(NULL) + 9 * 3600; |
yamaguch | 39:108499af2b53 | 86 | strftime(buf, sizeof(buf), "%m/%d %X", localtime(&jstime)); |
yamaguch | 39:108499af2b53 | 87 | printf(" RTC: %s\n\n", buf); |
yamaguch | 39:108499af2b53 | 88 | } |
yamaguch | 39:108499af2b53 | 89 | } else { |
yamaguch | 39:108499af2b53 | 90 | wait(5); |
yamaguch | 39:108499af2b53 | 91 | } |
yamaguch | 39:108499af2b53 | 92 | } |
yamaguch | 39:108499af2b53 | 93 | |
yamaguch | 39:108499af2b53 | 94 | } |