Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- timo_k2
- Date:
- 2020-11-20
- Revision:
- 0:2a5da7b2278c
- Child:
- 1:961861d73841
File content as of revision 0:2a5da7b2278c:
/*
* Copyright (c) 2006-2020 Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
***********************************
* Round trip delay meter. Date and time is taken from a NTP server.
* A microcontroller board with an Ethernet interface.
* An other microcontroller with "Round trip delay echo" will be needed.
* NXP FRDM-K64F used for testing.
*
* Timo Karppinen 20.11.2020
***********************************/
#include "mbed.h"
#include "EthernetInterface.h"
#include "ntp-client/NTPClient.h"
#define REMOTE_PORT 5000
#define LOCAL_PORT 5001
#define BUFF_SIZE 128
//Network interface
EthernetInterface net;
//Threads
Thread ntp_thread;
Thread recv_thread;
Thread send_thread;
// UDP
SocketAddress clientUDP; // Client on remote device
UDPSocket serverUDP; // UDP server in this device
//NTP server is a time server used for delivering timing information for networks.
// Returns 32 bits for seconds and 32 bits for fraction of seconds.
//#define ntpAddress "2.pool.ntp.org"
#define ntpAddress "time.mikes.fi" // The VTT Mikes in Helsinki
#define ntpPort 123
// Functions
time_t getNTP();
void udpReceive( void );
void udpSend( void );
DigitalIn sw2(SW2);
DigitalOut led2(LED2);
int sw2state = 0;
int sw2old = 1;
char in_data[BUFF_SIZE];
int newDatagram = 0;
time_t timeNTP = 0;
using namespace std::chrono;
Timer stopwatch;
int main() {
printf("\nNTP Client example (using Ethernet)\r\n");
//Bring up the network interface
net.connect();
// Show network address
SocketAddress netAddress;
net.get_ip_address(&netAddress);
printf("\n\n NTPClient - UDPServer IP Address: %s\n", netAddress.get_ip_address() ? netAddress.get_ip_address():"None");
// NTP client at ntp thread
ntp_thread.start(getNTP);
// UDP server
serverUDP.open(&net);
int err = serverUDP.bind(LOCAL_PORT);
printf("Port status is: %d\n",err);
recv_thread.start(udpReceive);
printf("Listening has been started at port number %d\n", LOCAL_PORT);
send_thread.start(udpSend);
printf("Sending out demo data to port number %d", REMOTE_PORT);
printf(" has been started.\n");
printf("The IP will be taken from the incoming message\n");
while(1) {
sw2state = sw2.read();
printf( "sw2state is %d\n", sw2state);
if((sw2state == 0)&&(sw2state != sw2old)) {
led2.write(0);
stopwatch.reset(); // reset stopwatch timer to zero
timeNTP = getNTP();
stopwatch.start();
udpSend();
// Start polling for the incomening "echo" UDP datagram
while ( stopwatch.elapsed_time().count() < 8000000 ){
if(newDatagram == 1){
char firstChar;
firstChar = in_data[0];
if (firstChar == 83){ // ASCII symbol 83 = "S"
stopwatch.stop();
}
newDatagram = 0;
}
for (int k =0; k < BUFF_SIZE; k++){
in_data[k] = 0;
}
}
}
sw2old = sw2state; // Once only with pushing the button as long as you like.
led2.write(1);
stopwatch.stop(); // Stop the stopwatch if we did not receive the echo.
ThisThread::sleep_for(10000ms);
// printing for testing. Replace with writing once to a SD memory card.
printf("Current time in day month hour.min.sec year is %s\r\n", ctime(&timeNTP));
printf("The time taken was %llu microseconds\n", stopwatch.elapsed_time().count());
printf("\nWe stopped sending more UDP packets to the server.\nYou can unplug your device!\n");
//ThisThread::sleep_for(2s);
}
}
// The functions
time_t getNTP() {
NTPClient ntp(&net);
ntp.set_server(ntpAddress, ntpPort);
time_t timestamp = ntp.get_timestamp();
if (timestamp < 0) {
printf("An error occurred when getting the time. Code: %u\r\n", timestamp);
}
else { // the printings for testing only!
//printf("The timestamp seconds from the NTP server in\r\n 32 bit hexadecimal number is %X\r\n", timestamp);
//printf(" decimal number is %u\r\n", timestamp);
timestamp += (60*60*2); // GMT +2 for Finland for the winter time.
//printf("Current time is %s\r\n", ctime(×tamp));
}
return timestamp;
}
void udpReceive()
{
int bytes;
while(1) {
bytes = serverUDP.recvfrom(&clientUDP, &in_data, BUFF_SIZE);
printf("\n");
printf("bytes received: %d\n",bytes);
printf("string: %s\n",in_data);
printf("client address: %s\n", clientUDP.get_ip_address());
printf("\n");
newDatagram = 1;;
}
}
void udpSend()
{
char out_data[BUFF_SIZE];
snprintf(out_data, BUFF_SIZE, "UDP message for getting the echo" );
clientUDP.set_port(REMOTE_PORT);
serverUDP.sendto(clientUDP, out_data, sizeof(out_data));
printf("Sending out: %s\n", out_data);
printf("with %d" , sizeof(out_data));
printf(" data bytes in UDP datagram\n");
}