Patrick Wensing / experiment_example_MATLAB
Committer:
Patrick Wensing
Date:
Thu Sep 10 12:00:44 2015 -0400
Revision:
3:ba19438ac09e
Parent:
2:ccafe893ef50
updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pwensing@mit.edu 0:b568b8ff43f2 1 function output = RunExperiment(dest_ip,port,input,output_size,params)
pwensing@mit.edu 0:b568b8ff43f2 2 % RunExperiment
pwensing@mit.edu 0:b568b8ff43f2 3 % [output] = RunExperiment(dest_ip, port, input, output_size,params)
pwensing@mit.edu 0:b568b8ff43f2 4 %
pwensing@mit.edu 0:b568b8ff43f2 5 % Sends input to the FRDM board and processes output data
pwensing@mit.edu 0:b568b8ff43f2 6 %
pwensing@mit.edu 0:b568b8ff43f2 7 % INPUT PARAMETERS
pwensing@mit.edu 0:b568b8ff43f2 8 % dest_ip: (string) ip address of FRDM board
pwensing@mit.edu 0:b568b8ff43f2 9 % port: (int) port used by server on FRDM board
pwensing@mit.edu 0:b568b8ff43f2 10 % input: (float vector) input variables for the experiment
pwensing@mit.edu 0:b568b8ff43f2 11 % which are sent to the FRDM board
pwensing@mit.edu 0:b568b8ff43f2 12 % ouput_size: (int) number of floats to be sent back by the FRDM
pwensing@mit.edu 0:b568b8ff43f2 13 % board at each control step
pwensing@mit.edu 0:b568b8ff43f2 14 % params: (struct) (optional) contains arguments below
pwensing@mit.edu 0:b568b8ff43f2 15 % params.callback - callback function
pwensing@mit.edu 0:b568b8ff43f2 16 % params.timeout - timeout to end experiment (seconds)
pwensing@mit.edu 0:b568b8ff43f2 17 %
pwensing@mit.edu 0:b568b8ff43f2 18 % OUTPUT PARAMETERS
pwensing@mit.edu 0:b568b8ff43f2 19 % output: (float vector) matrix of all data recieved from FRDM
pwensing@mit.edu 0:b568b8ff43f2 20 % board during the experiment
Patrick Wensing 3:ba19438ac09e 21
pwensing@mit.edu 0:b568b8ff43f2 22 if nargin == 4
pwensing@mit.edu 0:b568b8ff43f2 23 params = struct();
pwensing@mit.edu 0:b568b8ff43f2 24 end
Patrick Wensing 1:30408caaef92 25 if ~isfield(params,'callback')
pwensing@mit.edu 0:b568b8ff43f2 26 params.callback = 0;
pwensing@mit.edu 0:b568b8ff43f2 27 end
pwensing@mit.edu 0:b568b8ff43f2 28
Patrick Wensing 1:30408caaef92 29 if ~isfield(params,'timeout')
pwensing@mit.edu 0:b568b8ff43f2 30 params.timeout = 2;
pwensing@mit.edu 0:b568b8ff43f2 31 end
Patrick Wensing 3:ba19438ac09e 32
Patrick Wensing 3:ba19438ac09e 33
pwensing@mit.edu 0:b568b8ff43f2 34 done = 0;
pwensing@mit.edu 0:b568b8ff43f2 35
pwensing@mit.edu 0:b568b8ff43f2 36 data = []; % output data
pwensing@mit.edu 0:b568b8ff43f2 37 % boolean to store if there is a callback
pwensing@mit.edu 0:b568b8ff43f2 38 has_callback = strcmp(class(params.callback) , 'function_handle');
pwensing@mit.edu 0:b568b8ff43f2 39
pwensing@mit.edu 0:b568b8ff43f2 40 % event handler for packet reception
pwensing@mit.edu 0:b568b8ff43f2 41 function [] = recv(obj,es)
pwensing@mit.edu 0:b568b8ff43f2 42 if es.Data.DatagramLength == 1
pwensing@mit.edu 0:b568b8ff43f2 43 done = 1;
pwensing@mit.edu 0:b568b8ff43f2 44 return
pwensing@mit.edu 0:b568b8ff43f2 45 end
pwensing@mit.edu 0:b568b8ff43f2 46 % All packets must contains floats, which are of size 4
pwensing@mit.edu 0:b568b8ff43f2 47 % if the packet isn't divisible by 4, there is an error
pwensing@mit.edu 0:b568b8ff43f2 48 if mod(es.Data.DatagramLength,4*output_size) > 0
pwensing@mit.edu 0:b568b8ff43f2 49 fprintf(1,'Error bad data size %d expected mod %d\n',es.Data.DatagramLength,4*output_size);
pwensing@mit.edu 0:b568b8ff43f2 50 fread(obj, es.Data.DatagramLength);
pwensing@mit.edu 0:b568b8ff43f2 51 return
pwensing@mit.edu 0:b568b8ff43f2 52 end
pwensing@mit.edu 0:b568b8ff43f2 53
pwensing@mit.edu 0:b568b8ff43f2 54 d = fread(obj, es.Data.DatagramLength);
pwensing@mit.edu 0:b568b8ff43f2 55 d = typecast(uint8(d),'single');
pwensing@mit.edu 0:b568b8ff43f2 56 %length(d)
pwensing@mit.edu 0:b568b8ff43f2 57
pwensing@mit.edu 0:b568b8ff43f2 58 num_data = length(d)/output_size;
pwensing@mit.edu 0:b568b8ff43f2 59
pwensing@mit.edu 0:b568b8ff43f2 60 d = reshape(d,output_size,num_data)';
pwensing@mit.edu 0:b568b8ff43f2 61 data(end+1 : end+num_data,:) = d;
pwensing@mit.edu 0:b568b8ff43f2 62
pwensing@mit.edu 0:b568b8ff43f2 63 if (has_callback)
Patrick Wensing 3:ba19438ac09e 64 params.callback(d);
pwensing@mit.edu 0:b568b8ff43f2 65 end
pwensing@mit.edu 0:b568b8ff43f2 66 end
pwensing@mit.edu 0:b568b8ff43f2 67
pwensing@mit.edu 0:b568b8ff43f2 68 % create port and bind handler
pwensing@mit.edu 0:b568b8ff43f2 69 u = udp(dest_ip,port);
pwensing@mit.edu 0:b568b8ff43f2 70 u.InputBufferSize = 1000000;
pwensing@mit.edu 0:b568b8ff43f2 71 u.DatagramReceivedFcn = @recv;
pwensing@mit.edu 0:b568b8ff43f2 72 u.DatagramTerminateMode = 'on';
pwensing@mit.edu 0:b568b8ff43f2 73
pwensing@mit.edu 0:b568b8ff43f2 74 fopen(u);
pwensing@mit.edu 0:b568b8ff43f2 75
pwensing@mit.edu 0:b568b8ff43f2 76 % Send input data to mbed
pwensing@mit.edu 0:b568b8ff43f2 77 fwrite(u,typecast(single(input),'uint8'))
pwensing@mit.edu 0:b568b8ff43f2 78
pwensing@mit.edu 0:b568b8ff43f2 79 tic
pwensing@mit.edu 0:b568b8ff43f2 80
pwensing@mit.edu 0:b568b8ff43f2 81 % Wait for experiment to finish
pwensing@mit.edu 0:b568b8ff43f2 82 k = 0;
pwensing@mit.edu 0:b568b8ff43f2 83 pd = 0;
pwensing@mit.edu 0:b568b8ff43f2 84 pk = 0;
pwensing@mit.edu 0:b568b8ff43f2 85 while done == 0
pwensing@mit.edu 0:b568b8ff43f2 86 k = k+1;
pwensing@mit.edu 0:b568b8ff43f2 87
pwensing@mit.edu 0:b568b8ff43f2 88 if mod(k,20) == 0
pwensing@mit.edu 0:b568b8ff43f2 89 fprintf(' (%d bytes recieved, %d available)\n',u.ValuesReceived,u.BytesAvailable);
pwensing@mit.edu 0:b568b8ff43f2 90 else
pwensing@mit.edu 0:b568b8ff43f2 91 fprintf('.');
pwensing@mit.edu 0:b568b8ff43f2 92 end
pwensing@mit.edu 0:b568b8ff43f2 93
pwensing@mit.edu 0:b568b8ff43f2 94 d = size(data,1);
pwensing@mit.edu 0:b568b8ff43f2 95 if d > pd
pwensing@mit.edu 0:b568b8ff43f2 96 pk = k;
pwensing@mit.edu 0:b568b8ff43f2 97 pd = d;
Patrick Wensing 3:ba19438ac09e 98 elseif (k-pk) > params.timeout*10
pwensing@mit.edu 0:b568b8ff43f2 99 break
pwensing@mit.edu 0:b568b8ff43f2 100 end
pwensing@mit.edu 0:b568b8ff43f2 101
pwensing@mit.edu 0:b568b8ff43f2 102 pause(.1);
pwensing@mit.edu 0:b568b8ff43f2 103 end
pwensing@mit.edu 0:b568b8ff43f2 104 fprintf('\nExperiment finished\n');
pwensing@mit.edu 0:b568b8ff43f2 105 toc
pwensing@mit.edu 0:b568b8ff43f2 106
pwensing@mit.edu 0:b568b8ff43f2 107
pwensing@mit.edu 0:b568b8ff43f2 108 fclose(u)
pwensing@mit.edu 0:b568b8ff43f2 109 delete(u)
pwensing@mit.edu 0:b568b8ff43f2 110 output = data;
pwensing@mit.edu 0:b568b8ff43f2 111 end