Same as mallet... but distance

Dependencies:   EthernetInterface NetworkAPI mbed-rtos mbed

Fork of MalletFirmware by Impact-Echo

main.cpp

Committer:
timmey9
Date:
2014-11-18
Revision:
20:f533b3c9296f
Parent:
18:b17ddeeb1c09
Child:
21:1fb5023b72af

File content as of revision 20:f533b3c9296f:

// Server code

#include "mbed.h"
#include "EthernetInterface.h"

#include "NetworkAPI/buffer.hpp"
#include "NetworkAPI/select.hpp"
#include "NetworkAPI/ip/address.hpp"
#include "NetworkAPI/tcp/socket.hpp"

#define STATIC 1
#ifdef STATIC
#define IP "127.0.0.5" // "192.168.1.5"
#define MASK "255.255.255.0"
#define GATEWAY "127.0.0.1"//"192.168.1.1"
#define MAC "00:02:f7:f0:00:00"
#endif

#define PORT 23

Serial pc(USBTX, USBRX);
DigitalOut led_red(LED_RED);
DigitalOut led_green(LED_GREEN);
DigitalOut led_blue(LED_BLUE);

uint32_t sample_array[30000];

using namespace network;
 
#define MAX_CLIENTS 5
 
int main() {
    for(int i = 0; i < 30000; i++) sample_array[i] = 0x3132;
    led_red = 1;
    led_green = 1;
    led_blue = 1;
    pc.baud(230400);
    pc.printf("Starting Server\r\n");
    
    EthernetInterface interface;
    #ifdef STATIC
    interface.init(IP, MASK, GATEWAY);
    #else
    interface.init();
    #endif
    interface.connect();
    pc.printf("IP Address is: %s\n\r", interface.getIPAddress());
    pc.printf("Network Mask is: %s\n\r", interface.getNetworkMask());
    pc.printf("MAC address is: %s\n\r", interface.getMACAddress());
    pc.printf("Gateway is: %s\n\r", interface.getGateway());
    
    
    
    Select select;
    tcp::Socket server;
    tcp::Socket client[MAX_CLIENTS];
    tcp::Socket *socket = NULL;
     
    int result = 0;
    int index = 0;
     
    network::Buffer buffer(256);
    std::string message("Hello world!");
     
    // Configure the server socket (assume everty thing works)
    server.open();
    server.bind(PORT);
    server.listen(MAX_CLIENTS);
   
    // Add sockets to the select api
    select.set(&server, Select::Read);
    for (index = 0; index < MAX_CLIENTS; index++) {
        select.set(&client[index], Select::Read);
    }
     
    do {
        // Wait for activity
        result = select.wait();
        if (result < -1) {
            pc.printf("Failed to select\n\r");
            break;
        }
         
        // Get the first socket
        socket = (tcp::Socket *)select.getReadable();
         
        for (; socket != NULL; socket = (tcp::Socket *)select.getReadable()) {
            // Check if there was a connection request.
            if (socket->getHandle() == server.getHandle()) {                
                // Find an unused client
                for (index = 0; index < MAX_CLIENTS; index++) {
                    if (client[index].getStatus() == network::Socket::Closed) {
                        break;
                    }
                }
                 
                // Maximum connections reached
                if (index == MAX_CLIENTS) {
                    pc.printf("Maximum connections reached\n\r");
                    continue;
                }
                
                // Accept the client
                socket->accept(client[index]);
                pc.printf("Client connected %s:%d\n\r",
                    client[index].getRemoteEndpoint().getAddress().toString().c_str(),
                    client[index].getRemoteEndpoint().getPort());
                     
                // Send a nice message to the client
                client[index].write((void *)message.data(), message.size());
                
                // read some registers for some info.
                //uint32_t* rcr = (uint32_t*) 0x400C0084;
                //uint32_t* ecr = (uint32_t*) 0x400C0024;
                //pc.printf("RCR register: %x\r\n", *rcr);
                //pc.printf("ECR register: %x\r\n", *ecr);
                
                continue;
            }
            
            // It was not the server socket, so it must be a client talking to us.
            switch (socket->read(buffer)) {
                case 0:
                    // Remote end disconnected
                    pc.printf("Client disconnected %s:%d\n\r",
                        socket->getRemoteEndpoint().getAddress().toString().c_str(),
                        socket->getRemoteEndpoint().getPort());
                     
                    // Close socket
                    socket->close();
                    break;
                
                case -1:
                    pc.printf("Error while reading data from socket\n\r");
                    socket->close();
                    break;
//************* this is where data is printed to the screen
                default:
                    pc.printf("Message from %s:%d\n\r",
                        socket->getRemoteEndpoint().getAddress().toString().c_str(),
                        socket->getRemoteEndpoint().getPort());
                         
                    //pc.printf("%s\n\r", (char *)buffer.data());
                    
//***************** print a message back to the client
                    Timer timeStamp;
                    timeStamp.stop();
                    timeStamp.reset();
                    timeStamp.start();
                    client[index].write((void *)&sample_array,30000);
                    int timeStampVar = timeStamp.read_us();
                    timeStamp.stop();
                    wait(1);
                    pc.printf("*******\r\nTime taken to send data: %i\r\n", timeStampVar);
                    
                    char premessage[40];
                    sprintf(premessage, "Time taken to send data: %i\r\n", timeStampVar);
                    std::string response1 = premessage;
                    client[index].write((void *)response1.data(), response1.size());
                    
                    break;
            }
        }
             
    } while (server.getStatus() == network::Socket::Listening);
}