Same as mallet... but distance

Dependencies:   EthernetInterface NetworkAPI mbed-rtos mbed

Fork of MalletFirmware by Impact-Echo

Committer:
timmey9
Date:
Wed Dec 03 03:28:54 2014 +0000
Revision:
21:1fb5023b72af
Parent:
20:f533b3c9296f
Child:
22:523e316cbe70
API interfaces with MATLAB

Who changed what in which revision?

UserRevisionLine numberNew contents of line
timmey9 20:f533b3c9296f 1 // Server code
donatien 0:bb128f0e952f 2 #include "mbed.h"
donatien 0:bb128f0e952f 3 #include "EthernetInterface.h"
timmey9 20:f533b3c9296f 4
timmey9 17:2f978f823020 5 #include "NetworkAPI/buffer.hpp"
timmey9 17:2f978f823020 6 #include "NetworkAPI/select.hpp"
timmey9 17:2f978f823020 7 #include "NetworkAPI/ip/address.hpp"
timmey9 17:2f978f823020 8 #include "NetworkAPI/tcp/socket.hpp"
timmey9 18:b17ddeeb1c09 9
timmey9 21:1fb5023b72af 10 // some macro variables to set before compiling
timmey9 21:1fb5023b72af 11 #define MALLET 6 // set mallet to a value between 1-7
timmey9 21:1fb5023b72af 12 #define STATIC 1 // set STATIC to 1 for static ip, set STATIC to 0 for dynamic
timmey9 21:1fb5023b72af 13 #define PORT 22 // set to a random port number. All the mallets can use the same port number.
timmey9 21:1fb5023b72af 14 #define MAX_CLIENTS 2 // set the max number of clients to at least 2 (first client is MATLAB, second is the distance unit)
timmey9 21:1fb5023b72af 15
timmey9 21:1fb5023b72af 16
timmey9 21:1fb5023b72af 17
timmey9 21:1fb5023b72af 18 #if MALLET == 1
timmey9 21:1fb5023b72af 19 extern "C" void mbed_mac_address(char *mac) { mac[0]=0x00; mac[1]=0x02; mac[2]=0xf7; mac[3]=0xf0; mac[4]=0x00; mac[5]=0x01; } // overwrites the MAC address because mbed gave them duplicate address (this is fine for a closed network)
timmey9 21:1fb5023b72af 20 char mac[16];
timmey9 21:1fb5023b72af 21 #define NAME "Mallet1\n\r"
timmey9 21:1fb5023b72af 22
timmey9 21:1fb5023b72af 23 #elif MALLET == 2
timmey9 21:1fb5023b72af 24 extern "C" void mbed_mac_address(char *mac) { mac[0]=0x00; mac[1]=0x02; mac[2]=0xf7; mac[3]=0xf0; mac[4]=0x00; mac[5]=0x02; } // overwrites the MAC address because mbed gave them duplicate address (this is fine for a closed network)
timmey9 21:1fb5023b72af 25 char mac[16];
timmey9 21:1fb5023b72af 26 #define NAME "Mallet2\n\r"
timmey9 21:1fb5023b72af 27
timmey9 21:1fb5023b72af 28 #elif MALLET == 3
timmey9 21:1fb5023b72af 29 extern "C" void mbed_mac_address(char *mac) { mac[0]=0x00; mac[1]=0x02; mac[2]=0xf7; mac[3]=0xf0; mac[4]=0x00; mac[5]=0x03; } // overwrites the MAC address because mbed gave them duplicate address (this is fine for a closed network)
timmey9 21:1fb5023b72af 30 char mac[16];
timmey9 21:1fb5023b72af 31 #define NAME "Mallet3\n\r"
timmey9 21:1fb5023b72af 32
timmey9 21:1fb5023b72af 33 #elif MALLET == 4
timmey9 21:1fb5023b72af 34 extern "C" void mbed_mac_address(char *mac) { mac[0]=0x00; mac[1]=0x02; mac[2]=0xf7; mac[3]=0xf0; mac[4]=0x00; mac[5]=0x04; } // overwrites the MAC address because mbed gave them duplicate address (this is fine for a closed network)
timmey9 21:1fb5023b72af 35 char mac[16];
timmey9 21:1fb5023b72af 36 #define NAME "Mallet4\n\r"
timmey9 21:1fb5023b72af 37
timmey9 21:1fb5023b72af 38 #elif MALLET == 5
timmey9 21:1fb5023b72af 39 extern "C" void mbed_mac_address(char *mac) { mac[0]=0x00; mac[1]=0x02; mac[2]=0xf7; mac[3]=0xf0; mac[4]=0x00; mac[5]=0x05; } // overwrites the MAC address because mbed gave them duplicate address (this is fine for a closed network)
timmey9 21:1fb5023b72af 40 char mac[16];
timmey9 21:1fb5023b72af 41 #define NAME "Mallet5\n\r"
timmey9 21:1fb5023b72af 42
timmey9 21:1fb5023b72af 43 #elif MALLET == 6
timmey9 21:1fb5023b72af 44 extern "C" void mbed_mac_address(char *mac) { mac[0]=0x00; mac[1]=0x02; mac[2]=0xf7; mac[3]=0xf0; mac[4]=0x00; mac[5]=0x06; } // overwrites the MAC address because mbed gave them duplicate address (this is fine for a closed network)
timmey9 21:1fb5023b72af 45 char mac[16];
timmey9 21:1fb5023b72af 46 #define NAME "Mallet6\n\r"
timmey9 21:1fb5023b72af 47
timmey9 21:1fb5023b72af 48 #elif MALLET == 7
timmey9 21:1fb5023b72af 49 extern "C" void mbed_mac_address(char *mac) { mac[0]=0x00; mac[1]=0x02; mac[2]=0xf7; mac[3]=0xf0; mac[4]=0x00; mac[5]=0x07; } // overwrites the MAC address because mbed gave them duplicate address (this is fine for a closed network)
timmey9 21:1fb5023b72af 50 char mac[16];
timmey9 21:1fb5023b72af 51 #define NAME "Mallet7\n\r"
timmey9 21:1fb5023b72af 52
timmey9 20:f533b3c9296f 53 #endif
timmey9 20:f533b3c9296f 54
timmey9 21:1fb5023b72af 55
timmey9 21:1fb5023b72af 56
timmey9 21:1fb5023b72af 57 #if STATIC == 1
timmey9 21:1fb5023b72af 58 #define IP "169.254.225.206"//"127.0.0.5" // "192.168.1.5"
timmey9 21:1fb5023b72af 59 #define GATEWAY "169.254.225.1"//"127.0.0.1"//"192.168.1.1"
timmey9 21:1fb5023b72af 60 #define MASK "255.255.0.0"
timmey9 21:1fb5023b72af 61 #endif
timmey9 21:1fb5023b72af 62
timmey9 21:1fb5023b72af 63
timmey9 20:f533b3c9296f 64
timmey9 18:b17ddeeb1c09 65 Serial pc(USBTX, USBRX);
timmey9 18:b17ddeeb1c09 66 DigitalOut led_red(LED_RED);
timmey9 18:b17ddeeb1c09 67 DigitalOut led_green(LED_GREEN);
timmey9 18:b17ddeeb1c09 68 DigitalOut led_blue(LED_BLUE);
timmey9 18:b17ddeeb1c09 69
timmey9 21:1fb5023b72af 70 #define SAMPLES 5000
timmey9 21:1fb5023b72af 71 uint32_t sample_array[SAMPLES];
timmey9 20:f533b3c9296f 72
timmey9 17:2f978f823020 73 using namespace network;
timmey9 17:2f978f823020 74
emilmont 7:65188f4a8c25 75 int main() {
timmey9 21:1fb5023b72af 76 for(int i = 0; i < SAMPLES; i++) sample_array[i] = i;
timmey9 21:1fb5023b72af 77 sample_array[0] = 0x12345678;
timmey9 21:1fb5023b72af 78 sample_array[SAMPLES-1] = 0xDEADBEEF;
timmey9 18:b17ddeeb1c09 79 led_red = 1;
timmey9 18:b17ddeeb1c09 80 led_green = 1;
timmey9 18:b17ddeeb1c09 81 led_blue = 1;
timmey9 18:b17ddeeb1c09 82 pc.baud(230400);
timmey9 18:b17ddeeb1c09 83 pc.printf("Starting Server\r\n");
timmey9 20:f533b3c9296f 84
timmey9 17:2f978f823020 85 EthernetInterface interface;
timmey9 21:1fb5023b72af 86
timmey9 21:1fb5023b72af 87 #if STATIC == 1
timmey9 20:f533b3c9296f 88 interface.init(IP, MASK, GATEWAY);
timmey9 20:f533b3c9296f 89 #else
timmey9 17:2f978f823020 90 interface.init();
timmey9 20:f533b3c9296f 91 #endif
timmey9 21:1fb5023b72af 92
timmey9 17:2f978f823020 93 interface.connect();
timmey9 21:1fb5023b72af 94 pc.printf(NAME);
timmey9 20:f533b3c9296f 95 pc.printf("IP Address is: %s\n\r", interface.getIPAddress());
timmey9 20:f533b3c9296f 96 pc.printf("Network Mask is: %s\n\r", interface.getNetworkMask());
timmey9 20:f533b3c9296f 97 pc.printf("MAC address is: %s\n\r", interface.getMACAddress());
timmey9 20:f533b3c9296f 98 pc.printf("Gateway is: %s\n\r", interface.getGateway());
timmey9 21:1fb5023b72af 99 pc.printf("Port is: %i\n\r", PORT);
timmey9 20:f533b3c9296f 100
timmey9 17:2f978f823020 101 Select select;
timmey9 17:2f978f823020 102 tcp::Socket server;
timmey9 17:2f978f823020 103 tcp::Socket client[MAX_CLIENTS];
timmey9 17:2f978f823020 104 tcp::Socket *socket = NULL;
timmey9 17:2f978f823020 105
timmey9 17:2f978f823020 106 int result = 0;
timmey9 17:2f978f823020 107 int index = 0;
timmey9 17:2f978f823020 108
timmey9 21:1fb5023b72af 109 network::Buffer buffer(4*SAMPLES);
timmey9 21:1fb5023b72af 110 std::string message(NAME);
timmey9 17:2f978f823020 111
timmey9 21:1fb5023b72af 112 // Configure the server socket (assume every thing works)
timmey9 17:2f978f823020 113 server.open();
timmey9 20:f533b3c9296f 114 server.bind(PORT);
timmey9 17:2f978f823020 115 server.listen(MAX_CLIENTS);
timmey9 17:2f978f823020 116
timmey9 17:2f978f823020 117 // Add sockets to the select api
timmey9 17:2f978f823020 118 select.set(&server, Select::Read);
timmey9 17:2f978f823020 119 for (index = 0; index < MAX_CLIENTS; index++) {
timmey9 17:2f978f823020 120 select.set(&client[index], Select::Read);
timmey9 17:2f978f823020 121 }
timmey9 17:2f978f823020 122
timmey9 17:2f978f823020 123 do {
timmey9 17:2f978f823020 124 // Wait for activity
timmey9 17:2f978f823020 125 result = select.wait();
timmey9 17:2f978f823020 126 if (result < -1) {
timmey9 18:b17ddeeb1c09 127 pc.printf("Failed to select\n\r");
emilmont 7:65188f4a8c25 128 break;
timmey9 16:c3f922f61b8f 129 }
timmey9 17:2f978f823020 130
timmey9 17:2f978f823020 131 // Get the first socket
timmey9 17:2f978f823020 132 socket = (tcp::Socket *)select.getReadable();
timmey9 17:2f978f823020 133
timmey9 17:2f978f823020 134 for (; socket != NULL; socket = (tcp::Socket *)select.getReadable()) {
timmey9 17:2f978f823020 135 // Check if there was a connection request.
timmey9 17:2f978f823020 136 if (socket->getHandle() == server.getHandle()) {
timmey9 17:2f978f823020 137 // Find an unused client
timmey9 17:2f978f823020 138 for (index = 0; index < MAX_CLIENTS; index++) {
timmey9 17:2f978f823020 139 if (client[index].getStatus() == network::Socket::Closed) {
timmey9 17:2f978f823020 140 break;
timmey9 17:2f978f823020 141 }
timmey9 17:2f978f823020 142 }
timmey9 17:2f978f823020 143
timmey9 17:2f978f823020 144 // Maximum connections reached
timmey9 17:2f978f823020 145 if (index == MAX_CLIENTS) {
timmey9 18:b17ddeeb1c09 146 pc.printf("Maximum connections reached\n\r");
timmey9 21:1fb5023b72af 147 wait(1);
timmey9 17:2f978f823020 148 continue;
timmey9 17:2f978f823020 149 }
timmey9 20:f533b3c9296f 150
timmey9 17:2f978f823020 151 // Accept the client
timmey9 17:2f978f823020 152 socket->accept(client[index]);
timmey9 18:b17ddeeb1c09 153 pc.printf("Client connected %s:%d\n\r",
timmey9 17:2f978f823020 154 client[index].getRemoteEndpoint().getAddress().toString().c_str(),
timmey9 17:2f978f823020 155 client[index].getRemoteEndpoint().getPort());
timmey9 17:2f978f823020 156
timmey9 21:1fb5023b72af 157 // Send a nice message to the client (tell MATLAB your name
timmey9 17:2f978f823020 158 client[index].write((void *)message.data(), message.size());
timmey9 20:f533b3c9296f 159
timmey9 20:f533b3c9296f 160 // read some registers for some info.
timmey9 20:f533b3c9296f 161 //uint32_t* rcr = (uint32_t*) 0x400C0084;
timmey9 20:f533b3c9296f 162 //uint32_t* ecr = (uint32_t*) 0x400C0024;
timmey9 20:f533b3c9296f 163 //pc.printf("RCR register: %x\r\n", *rcr);
timmey9 20:f533b3c9296f 164 //pc.printf("ECR register: %x\r\n", *ecr);
timmey9 20:f533b3c9296f 165
timmey9 17:2f978f823020 166 continue;
timmey9 16:c3f922f61b8f 167 }
timmey9 20:f533b3c9296f 168
timmey9 17:2f978f823020 169 // It was not the server socket, so it must be a client talking to us.
timmey9 17:2f978f823020 170 switch (socket->read(buffer)) {
timmey9 17:2f978f823020 171 case 0:
timmey9 17:2f978f823020 172 // Remote end disconnected
timmey9 18:b17ddeeb1c09 173 pc.printf("Client disconnected %s:%d\n\r",
timmey9 17:2f978f823020 174 socket->getRemoteEndpoint().getAddress().toString().c_str(),
timmey9 17:2f978f823020 175 socket->getRemoteEndpoint().getPort());
timmey9 17:2f978f823020 176
timmey9 17:2f978f823020 177 // Close socket
timmey9 17:2f978f823020 178 socket->close();
timmey9 17:2f978f823020 179 break;
timmey9 20:f533b3c9296f 180
timmey9 17:2f978f823020 181 case -1:
timmey9 18:b17ddeeb1c09 182 pc.printf("Error while reading data from socket\n\r");
timmey9 17:2f978f823020 183 socket->close();
timmey9 17:2f978f823020 184 break;
timmey9 20:f533b3c9296f 185 //************* this is where data is printed to the screen
timmey9 17:2f978f823020 186 default:
timmey9 18:b17ddeeb1c09 187 pc.printf("Message from %s:%d\n\r",
timmey9 17:2f978f823020 188 socket->getRemoteEndpoint().getAddress().toString().c_str(),
timmey9 17:2f978f823020 189 socket->getRemoteEndpoint().getPort());
timmey9 17:2f978f823020 190
timmey9 21:1fb5023b72af 191 pc.printf("%s\n\r", (char *)buffer.data());
timmey9 21:1fb5023b72af 192
timmey9 21:1fb5023b72af 193 // read first character for command
timmey9 21:1fb5023b72af 194 char command[2];
timmey9 21:1fb5023b72af 195 buffer.read(command,2,0);
timmey9 21:1fb5023b72af 196 if(command[1] == ':') {
timmey9 21:1fb5023b72af 197 switch(command[0])
timmey9 21:1fb5023b72af 198 {
timmey9 21:1fb5023b72af 199 case 'b':
timmey9 21:1fb5023b72af 200 led_blue = !led_blue;
timmey9 21:1fb5023b72af 201 client[index].write((void *)"Blue LED\n",9);
timmey9 21:1fb5023b72af 202 break;
timmey9 21:1fb5023b72af 203 case 'r':
timmey9 21:1fb5023b72af 204 led_red = !led_red;
timmey9 21:1fb5023b72af 205 client[index].write((void *)"Red LED\n",8);
timmey9 21:1fb5023b72af 206 break;
timmey9 21:1fb5023b72af 207 case 'p':
timmey9 21:1fb5023b72af 208 led_green = !led_green;
timmey9 21:1fb5023b72af 209 client[index].write((void *)"Data\n",5);
timmey9 21:1fb5023b72af 210 client[index].write((void *)&sample_array,4*SAMPLES);
timmey9 21:1fb5023b72af 211 }
timmey9 21:1fb5023b72af 212 }
timmey9 21:1fb5023b72af 213 else {
timmey9 21:1fb5023b72af 214
timmey9 21:1fb5023b72af 215 }
timmey9 21:1fb5023b72af 216
timmey9 21:1fb5023b72af 217
timmey9 20:f533b3c9296f 218
timmey9 20:f533b3c9296f 219 //***************** print a message back to the client
timmey9 21:1fb5023b72af 220
timmey9 21:1fb5023b72af 221 //client[index].write((void *)&sample_array,SAMPLES);
timmey9 21:1fb5023b72af 222
timmey9 21:1fb5023b72af 223
timmey9 21:1fb5023b72af 224
timmey9 20:f533b3c9296f 225
timmey9 21:1fb5023b72af 226 /*for(int i = 1; i <= SAMPLES+1;)
timmey9 21:1fb5023b72af 227 {
timmey9 21:1fb5023b72af 228 for(int j = 0; j < 20; j++)
timmey9 21:1fb5023b72af 229 {
timmey9 21:1fb5023b72af 230 Timer timeStamp;
timmey9 21:1fb5023b72af 231 timeStamp.stop();
timmey9 21:1fb5023b72af 232 timeStamp.reset();
timmey9 21:1fb5023b72af 233 timeStamp.start();
timmey9 21:1fb5023b72af 234
timmey9 21:1fb5023b72af 235 client[index].write((void *)&sample_array,i);
timmey9 21:1fb5023b72af 236 int timeStampVar = timeStamp.read_us();
timmey9 21:1fb5023b72af 237 timeStamp.stop();
timmey9 21:1fb5023b72af 238
timmey9 21:1fb5023b72af 239 pc.printf("*******\r\n%i\r\nTime taken to send data: %i\r\n", i,timeStampVar);
timmey9 21:1fb5023b72af 240
timmey9 21:1fb5023b72af 241 char premessage[40];
timmey9 21:1fb5023b72af 242 sprintf(premessage, "******\r\n%i\r\nTime taken to send data: %i\r\n", i, timeStampVar);
timmey9 21:1fb5023b72af 243 std::string response1 = premessage;
timmey9 21:1fb5023b72af 244 client[index].write((void *)response1.data(), response1.size());
timmey9 21:1fb5023b72af 245 wait_us(5000);
timmey9 21:1fb5023b72af 246 }
timmey9 21:1fb5023b72af 247 if(i == 10000) i = SAMPLES;
timmey9 21:1fb5023b72af 248 else if(i == SAMPLES) i = i*10;
timmey9 21:1fb5023b72af 249 else i = i*10;
timmey9 21:1fb5023b72af 250 }
timmey9 21:1fb5023b72af 251 std::string endMessage("end");
timmey9 21:1fb5023b72af 252 client[index].write((void *)endMessage.data(), endMessage.size());
timmey9 21:1fb5023b72af 253 */
timmey9 17:2f978f823020 254 break;
timmey9 17:2f978f823020 255 }
timmey9 16:c3f922f61b8f 256 }
timmey9 17:2f978f823020 257
timmey9 17:2f978f823020 258 } while (server.getStatus() == network::Socket::Listening);
timmey9 20:f533b3c9296f 259 }