Timo Karppinen / Mbed OS UDP_RoundTripEcho_OS6_H743ZI
Revision:
3:9615ce1548c4
Parent:
2:150dadff3c6b
Child:
6:11edc8f9d870
--- 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(&timestamp));
-    } 
-    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));