Simple code for comunication via TCP between the mbed and PC.

Dependencies:   EthernetInterface SimpleSocket mbed-rtos mbed

Fork of SimpleSocketExamples by Hiroshi Yamaguchi

Committer:
numeral369
Date:
Wed Dec 17 16:06:00 2014 +0000
Revision:
1:016774025718
Parent:
0:6dc3cfd058c6
A simple code for comunication via TCP between the Mbed and a PC

Who changed what in which revision?

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