UDP Experiment Server

Dependents:   Bezier_Trajectory_Follower Dolphin 2_131TEST Jerby ... more

Committer:
gbravop
Date:
Fri Jul 19 16:57:05 2019 +0000
Revision:
10:20f31902ac9f
Parent:
9:5a1f3abfca66
Updated For Mbed 5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pwensing 0:85e387719efd 1 #include "ExperimentServer.h"
pwensing 0:85e387719efd 2 #include "EthernetInterface.h"
pwensing 0:85e387719efd 3
pwensing 0:85e387719efd 4 ExperimentServer::ExperimentServer() {
pwensing 0:85e387719efd 5 _terminal = NULL;
pwensing 0:85e387719efd 6 _data_cnt = 0;
pwensing 0:85e387719efd 7 }
pwensing 0:85e387719efd 8
pwensing 1:63635482312f 9 void ExperimentServer::attachTerminal( Serial & terminal) {
pwensing 0:85e387719efd 10 _terminal = &terminal;
pwensing 0:85e387719efd 11 }
pwensing 0:85e387719efd 12
pwensing 2:bb4b95f37896 13 void ExperimentServer::init() {
pwensing 2:bb4b95f37896 14 // default configuration
pwensing 2:bb4b95f37896 15 char ip_address[] = "192.168.1.100";
pwensing 2:bb4b95f37896 16 char subnet_mask[]= "255.255.255.0";
pwensing 2:bb4b95f37896 17 char gateway[] = "192.168.1.1";
pwensing 2:bb4b95f37896 18 int server_port = 11223;
pwensing 2:bb4b95f37896 19 init(ip_address,subnet_mask,gateway, server_port);
pwensing 2:bb4b95f37896 20 }
pwensing 2:bb4b95f37896 21
pwensing 1:63635482312f 22 void ExperimentServer::init(const char * ip_addr, const char * subnet_mask, const char * gateway, unsigned int port) {
pwensing 1:63635482312f 23 if(_terminal!=NULL) {
pwensing 9:5a1f3abfca66 24 _terminal->printf("\r\n==============================\r\nStarting Server\r\n");
pwensing 9:5a1f3abfca66 25 _terminal->printf("...Intializing Ethernet\r\n");
pwensing 0:85e387719efd 26 }
pwensing 0:85e387719efd 27
gbravop 10:20f31902ac9f 28 int code = _eth.set_network(ip_addr,subnet_mask,gateway);
gbravop 10:20f31902ac9f 29 if(_terminal!=NULL) {
gbravop 10:20f31902ac9f 30 _terminal->printf("...Connecting\r\n");
gbravop 10:20f31902ac9f 31 if(code!=0)
gbravop 10:20f31902ac9f 32 _terminal->printf("Error Code = %d\r\n",code);
gbravop 10:20f31902ac9f 33 }
gbravop 10:20f31902ac9f 34
gbravop 10:20f31902ac9f 35 code = _eth.connect();
gbravop 10:20f31902ac9f 36 if(_terminal!=NULL) {
gbravop 10:20f31902ac9f 37 _terminal->printf("...Ethernet IP Address is %s\r\n",_eth.get_ip_address());
gbravop 10:20f31902ac9f 38 if(code!=0)
gbravop 10:20f31902ac9f 39 _terminal->printf("Error Code = %d\r\n",code);
gbravop 10:20f31902ac9f 40 }
pwensing 0:85e387719efd 41
gbravop 10:20f31902ac9f 42 SocketAddress sock;
gbravop 10:20f31902ac9f 43 sock.set_port(port);
gbravop 10:20f31902ac9f 44 sock.set_ip_address(ip_addr);
pwensing 0:85e387719efd 45
gbravop 10:20f31902ac9f 46 code = _server.open(&_eth);
gbravop 10:20f31902ac9f 47 if(_terminal!=NULL) {
gbravop 10:20f31902ac9f 48 _terminal->printf("...Opened\n");
gbravop 10:20f31902ac9f 49 if(code!=0)
gbravop 10:20f31902ac9f 50 _terminal->printf("Error Code = %d\r\n",code);
gbravop 10:20f31902ac9f 51 }
gbravop 10:20f31902ac9f 52
gbravop 10:20f31902ac9f 53 code = _server.bind(sock);
gbravop 10:20f31902ac9f 54 if(_terminal!=NULL) {
gbravop 10:20f31902ac9f 55 _terminal->printf("...Listening on Port %d\r\n",port);
gbravop 10:20f31902ac9f 56 if(code!=0)
gbravop 10:20f31902ac9f 57 _terminal->printf("Error Code = %d\r\n",code);
gbravop 10:20f31902ac9f 58 }
pwensing 0:85e387719efd 59 }
pwensing 0:85e387719efd 60
pwensing 1:63635482312f 61 int ExperimentServer::getParams(float params[], int num_params) {
pwensing 1:63635482312f 62 if(_terminal!=NULL) {
pwensing 9:5a1f3abfca66 63 _terminal->printf("\r\n========================\r\nNew Experiment\r\n");
pwensing 9:5a1f3abfca66 64 _terminal->printf("...Waiting for parameters...\r\n");
pwensing 0:85e387719efd 65 }
pwensing 0:85e387719efd 66
gbravop 10:20f31902ac9f 67 int n = _server.recvfrom(&_client,(char *) params, num_params*sizeof(float));
pwensing 1:63635482312f 68 if ( (n% 4) > 0 ) {
pwensing 3:588db37d9079 69 if(_terminal!=NULL) {
pwensing 9:5a1f3abfca66 70 _terminal->printf("ERROR: input data bad size\r\n");
pwensing 9:5a1f3abfca66 71 _terminal->printf("ERROR: Expected %d got %d\r\n",4*num_params,n);
pwensing 3:588db37d9079 72 }
pwensing 0:85e387719efd 73 return false;
pwensing 0:85e387719efd 74 }
pwensing 1:63635482312f 75 if ( n / 4 != num_params) {
pwensing 3:588db37d9079 76 if(_terminal!=NULL) {
pwensing 9:5a1f3abfca66 77 _terminal->printf("ERROR: input data bad size\r\n");
pwensing 9:5a1f3abfca66 78 _terminal->printf("ERROR: Expected %d got %d\r\n",4*num_params,n);
pwensing 3:588db37d9079 79 }
pwensing 0:85e387719efd 80 return false;
pwensing 0:85e387719efd 81 }
pwensing 0:85e387719efd 82
pwensing 1:63635482312f 83 if(_terminal!=NULL) {
gbravop 10:20f31902ac9f 84 _terminal->printf("...Received input from: %s\r\n", _client.get_ip_address());
pwensing 9:5a1f3abfca66 85 _terminal->printf("...Parameters: \r\n");
pwensing 1:63635482312f 86 for ( int j = 0 ; j < n/sizeof(float) ; j++) {
pwensing 9:5a1f3abfca66 87 _terminal->printf(" %d) %f\r\n",j+1,params[j]);
pwensing 0:85e387719efd 88 }
pwensing 0:85e387719efd 89 }
pwensing 0:85e387719efd 90 return true;
pwensing 0:85e387719efd 91 }
pwensing 0:85e387719efd 92 void ExperimentServer::flushBuffer() {
pwensing 0:85e387719efd 93 if(_data_cnt > 0) {
gbravop 10:20f31902ac9f 94 _server.sendto(_client,(char*) _buffer, 4*_data_cnt );
pwensing 0:85e387719efd 95 _data_cnt = 0;
pwensing 0:85e387719efd 96 }
pwensing 0:85e387719efd 97 }
pwensing 0:85e387719efd 98
pwensing 0:85e387719efd 99 void ExperimentServer::sendData(float data_output[], int data_size) {
pwensing 1:63635482312f 100 if( data_size + _data_cnt > _MAX_BUFFER_SIZE) {
pwensing 0:85e387719efd 101 flushBuffer();
pwensing 0:85e387719efd 102 }
pwensing 0:85e387719efd 103 for(int j = 0; j < data_size; j++) {
pwensing 0:85e387719efd 104 _buffer[ _data_cnt++ ] = data_output[j];
pwensing 0:85e387719efd 105 }
pwensing 0:85e387719efd 106 }
pwensing 0:85e387719efd 107 void ExperimentServer::setExperimentComplete() {
pwensing 0:85e387719efd 108 flushBuffer();
pwensing 4:434982de99ed 109 char buff[] = {'0'};
gbravop 10:20f31902ac9f 110 _server.sendto(_client,buff,1);
pwensing 0:85e387719efd 111 }