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.
Diff: main.cpp
- Revision:
- 3:9615ce1548c4
- Parent:
- 2:150dadff3c6b
- Child:
- 6:11edc8f9d870
diff -r 150dadff3c6b -r 9615ce1548c4 main.cpp --- a/main.cpp Sat Nov 21 16:03:30 2020 +0000 +++ b/main.cpp Mon Nov 23 12:56:05 2020 +0000 @@ -2,61 +2,58 @@ * 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. + * Round trip delay meter. This is the "echo" module. * A microcontroller board with an Ethernet interface. - * An other microcontroller with "Round trip delay echo" will be needed. - * NXP FRDM-K64F used for testing. + * An other microcontroller with "Round Trip Delay" will be needed. + * ST NUCLEO H743ZI2 used for testing. * - * Timo Karppinen 20.11.2020 + * Timo Karppinen 23.11.2020 ***********************************/ #include "mbed.h" #include "EthernetInterface.h" -#include "ntp-client/NTPClient.h" + -#define REMOTE_PORT 5000 -#define LOCAL_PORT 5001 +#define REMOTE_PORT 5001 // The port numbers the other way round +#define LOCAL_PORT 5000 // than in the "Round Trip Delay" #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 +uint8_t ip[4] = {192, 168, 1, 104}; +SocketAddress clientUDP(ip, NSAPI_IPv4); +//SocketAddress clientUDP(strIP); // Client on remote device +//SocketAddress clientUDP; 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); +DigitalIn sw2(PC_13); // Blue button on H743ZI, button pressed = TRUE +DigitalOut led2(PE_1); // Yellow LED on H743ZI int sw2state = 0; int sw2old = 1; char in_data[BUFF_SIZE]; int newDatagram = 0; int newDatagramOld = 0; -time_t timeNTP = 0; + +char out_data[BUFF_SIZE]; //using namespace std::chrono; -Timer stopwatch; + Timer armedFor; int main() { - printf("\nNTP Client example (using Ethernet)\r\n"); + printf("\nEcho for the Round Trip Delay application (using Ethernet)\r\n"); //Bring up the network interface net.connect(); @@ -64,10 +61,8 @@ // 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"); + printf("\n\n 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 @@ -78,53 +73,52 @@ 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"); + printf("Sending out \"Echo\" data to port number %d", REMOTE_PORT); + printf(" will be armed for triggering by pushing Blue button.\n"); + printf("The IP is 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); + if((sw2state == 1)&&(sw2state != sw2old)) { + led2.write(1); armedFor.reset(); // reset timer to zero - stopwatch.reset(); // reset stopwatch timer to zero - timeNTP = getNTP(); armedFor.start(); - stopwatch.start(); - udpSend(); + snprintf(out_data, BUFF_SIZE, "Echo -server listening" ); + clientUDP.set_port(REMOTE_PORT); + udpSend(); + snprintf(out_data, BUFF_SIZE, "Echo" ); - // Start polling for the incomening "Echo" UDP datagram while ( armedFor.elapsed_time().count() < 8000000 ){ if((newDatagram == 1)&&(newDatagram != newDatagramOld)){ char firstChar; firstChar = in_data[0]; - if (firstChar == 69){ // ASCII symbol 69 = "E" for the Echo - stopwatch.stop(); + if (firstChar == 85){ // ASCII symbol 85 = "U" for the incoming + udpSend(); // Sending out first and then printing! printf( "firstChar: %s\n", &firstChar); } for (int k =0; k < BUFF_SIZE; k++){ in_data[k] = 0; } } - newDatagramOld = newDatagram; //Reading the stopwatch once only + newDatagramOld = newDatagram; //Sending the "Echo" once only. } - // 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()); } newDatagram = 0; sw2old = sw2state; // Once only with pushing the button as long as you like. - led2.write(1); - armedFor.stop(); - stopwatch.stop(); // Stop the stopwatch if we did not receive the echo. - + led2.write(0); + armedFor.stop(); // Stop the "armed for" if did not receive the request. + printf("\nWe stopped sending more UDP packets to the server.\nYou can unplug your device!\n"); ThisThread::sleep_for(4000ms); } @@ -132,42 +126,28 @@ // 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); + newDatagram = 1; // set this before using time for printing 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]; + //char out_data[BUFF_SIZE]; - snprintf(out_data, BUFF_SIZE, "UDP message for getting the Echo" ); - clientUDP.set_port(REMOTE_PORT); + //snprintf(out_data, BUFF_SIZE, "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));