Delta Robot example
Dependencies: BufferedSerial Eigen
Fork of TCPSocket_Example by
ntp.cpp@5:01e1e68309ae, 2018-10-15 (annotated)
- Committer:
- je310
- Date:
- Mon Oct 15 18:30:20 2018 +0000
- Revision:
- 5:01e1e68309ae
testing eigen;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
je310 | 5:01e1e68309ae | 1 | #include "ntp.h" |
je310 | 5:01e1e68309ae | 2 | #include "mbed.h" |
je310 | 5:01e1e68309ae | 3 | |
je310 | 5:01e1e68309ae | 4 | //this code has been taken from https://github.com/ARMmbed/ntp-client |
je310 | 5:01e1e68309ae | 5 | |
je310 | 5:01e1e68309ae | 6 | NTPClient::NTPClient(NetworkInterface *iface) |
je310 | 5:01e1e68309ae | 7 | : iface(iface), nist_server_address((char *)NTP_DEFULT_NIST_SERVER_ADDRESS), nist_server_port(NTP_DEFULT_NIST_SERVER_PORT) { |
je310 | 5:01e1e68309ae | 8 | } |
je310 | 5:01e1e68309ae | 9 | |
je310 | 5:01e1e68309ae | 10 | void NTPClient::set_server(char* server, int port){ |
je310 | 5:01e1e68309ae | 11 | nist_server_address = server; |
je310 | 5:01e1e68309ae | 12 | nist_server_port = port; |
je310 | 5:01e1e68309ae | 13 | } |
je310 | 5:01e1e68309ae | 14 | |
je310 | 5:01e1e68309ae | 15 | time_t NTPClient::get_timestamp(int timeout) { |
je310 | 5:01e1e68309ae | 16 | const time_t TIME1970 = (time_t)2208988800UL; |
je310 | 5:01e1e68309ae | 17 | int ntp_send_values[12] = {0}; |
je310 | 5:01e1e68309ae | 18 | int ntp_recv_values[12] = {0}; |
je310 | 5:01e1e68309ae | 19 | |
je310 | 5:01e1e68309ae | 20 | SocketAddress nist; |
je310 | 5:01e1e68309ae | 21 | int ret_gethostbyname = iface->gethostbyname(nist_server_address, &nist); |
je310 | 5:01e1e68309ae | 22 | |
je310 | 5:01e1e68309ae | 23 | if (ret_gethostbyname < 0) { |
je310 | 5:01e1e68309ae | 24 | // Network error on DNS lookup |
je310 | 5:01e1e68309ae | 25 | return ret_gethostbyname; |
je310 | 5:01e1e68309ae | 26 | } |
je310 | 5:01e1e68309ae | 27 | |
je310 | 5:01e1e68309ae | 28 | nist.set_port(nist_server_port); |
je310 | 5:01e1e68309ae | 29 | |
je310 | 5:01e1e68309ae | 30 | memset(ntp_send_values, 0x00, sizeof(ntp_send_values)); |
je310 | 5:01e1e68309ae | 31 | ntp_send_values[0] = '\x1b'; |
je310 | 5:01e1e68309ae | 32 | |
je310 | 5:01e1e68309ae | 33 | memset(ntp_recv_values, 0x00, sizeof(ntp_recv_values)); |
je310 | 5:01e1e68309ae | 34 | |
je310 | 5:01e1e68309ae | 35 | UDPSocket sock; |
je310 | 5:01e1e68309ae | 36 | sock.open(iface); |
je310 | 5:01e1e68309ae | 37 | sock.set_timeout(timeout); |
je310 | 5:01e1e68309ae | 38 | |
je310 | 5:01e1e68309ae | 39 | sock.sendto(nist, (void*)ntp_send_values, sizeof(ntp_send_values)); |
je310 | 5:01e1e68309ae | 40 | |
je310 | 5:01e1e68309ae | 41 | SocketAddress source; |
je310 | 5:01e1e68309ae | 42 | const int n = sock.recvfrom(&source, (void*)ntp_recv_values, sizeof(ntp_recv_values)); |
je310 | 5:01e1e68309ae | 43 | |
je310 | 5:01e1e68309ae | 44 | if (n > 10) { |
je310 | 5:01e1e68309ae | 45 | return ntohl(ntp_recv_values[10]) - TIME1970; |
je310 | 5:01e1e68309ae | 46 | } else { |
je310 | 5:01e1e68309ae | 47 | if (n < 0) { |
je310 | 5:01e1e68309ae | 48 | // Network error |
je310 | 5:01e1e68309ae | 49 | return n; |
je310 | 5:01e1e68309ae | 50 | } else { |
je310 | 5:01e1e68309ae | 51 | // No or partial data returned |
je310 | 5:01e1e68309ae | 52 | return -1; |
je310 | 5:01e1e68309ae | 53 | } |
je310 | 5:01e1e68309ae | 54 | } |
je310 | 5:01e1e68309ae | 55 | } |
je310 | 5:01e1e68309ae | 56 | |
je310 | 5:01e1e68309ae | 57 | uint32_t NTPClient::ntohl(uint32_t x) { |
je310 | 5:01e1e68309ae | 58 | uint32_t ret = (x & 0xff) << 24; |
je310 | 5:01e1e68309ae | 59 | ret |= (x & 0xff00) << 8; |
je310 | 5:01e1e68309ae | 60 | ret |= (x & 0xff0000UL) >> 8; |
je310 | 5:01e1e68309ae | 61 | ret |= (x & 0xff000000UL) >> 24; |
je310 | 5:01e1e68309ae | 62 | return ret; |
je310 | 5:01e1e68309ae | 63 | } |