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