SimpleSocket 1.0 examples

Dependencies:   EthernetNetIf SimpleSocket 1.0 mbed

Committer:
yamaguch
Date:
Mon Feb 04 09:04:25 2013 +0000
Revision:
40:84182fc63956
Parent:
ntpclient2.cpp@39:108499af2b53
changed SimpleSocket libary name to SimpleSocketV1

Who changed what in which revision?

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