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