UDP Experiment Server
Dependents: Bezier_Trajectory_Follower Dolphin 2_131TEST Jerby ... more
ExperimentServer.cpp@10:20f31902ac9f, 2019-07-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |