SimpleSocket 1.0 examples

Dependencies:   EthernetNetIf SimpleSocket 1.0 mbed

Committer:
yamaguch
Date:
Wed Nov 02 12:16:51 2011 +0000
Revision:
33:39d9cdf99de8
added examples

Who changed what in which revision?

UserRevisionLine numberNew 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 }