Patrick Wensing / experiment_example_MATLAB
Committer:
Patrick Wensing
Date:
Wed Sep 09 23:19:10 2015 -0400
Revision:
2:ccafe893ef50
Parent:
1:30408caaef92
Child:
3:ba19438ac09e
removing print

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 1:30408caaef92 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 1:30408caaef92 32
pwensing@mit.edu 0:b568b8ff43f2 33 done = 0;
pwensing@mit.edu 0:b568b8ff43f2 34
pwensing@mit.edu 0:b568b8ff43f2 35 data = []; % output data
pwensing@mit.edu 0:b568b8ff43f2 36 % boolean to store if there is a callback
pwensing@mit.edu 0:b568b8ff43f2 37 has_callback = strcmp(class(params.callback) , 'function_handle');
pwensing@mit.edu 0:b568b8ff43f2 38
pwensing@mit.edu 0:b568b8ff43f2 39 % event handler for packet reception
pwensing@mit.edu 0:b568b8ff43f2 40 function [] = recv(obj,es)
pwensing@mit.edu 0:b568b8ff43f2 41 if es.Data.DatagramLength == 1
pwensing@mit.edu 0:b568b8ff43f2 42 done = 1;
pwensing@mit.edu 0:b568b8ff43f2 43 return
pwensing@mit.edu 0:b568b8ff43f2 44 end
pwensing@mit.edu 0:b568b8ff43f2 45 % All packets must contains floats, which are of size 4
pwensing@mit.edu 0:b568b8ff43f2 46 % if the packet isn't divisible by 4, there is an error
pwensing@mit.edu 0:b568b8ff43f2 47 if mod(es.Data.DatagramLength,4*output_size) > 0
pwensing@mit.edu 0:b568b8ff43f2 48 fprintf(1,'Error bad data size %d expected mod %d\n',es.Data.DatagramLength,4*output_size);
pwensing@mit.edu 0:b568b8ff43f2 49 fread(obj, es.Data.DatagramLength);
pwensing@mit.edu 0:b568b8ff43f2 50 return
pwensing@mit.edu 0:b568b8ff43f2 51 end
pwensing@mit.edu 0:b568b8ff43f2 52
pwensing@mit.edu 0:b568b8ff43f2 53 d = fread(obj, es.Data.DatagramLength);
pwensing@mit.edu 0:b568b8ff43f2 54 d = typecast(uint8(d),'single');
pwensing@mit.edu 0:b568b8ff43f2 55 %length(d)
pwensing@mit.edu 0:b568b8ff43f2 56
pwensing@mit.edu 0:b568b8ff43f2 57 num_data = length(d)/output_size;
pwensing@mit.edu 0:b568b8ff43f2 58
pwensing@mit.edu 0:b568b8ff43f2 59 d = reshape(d,output_size,num_data)';
pwensing@mit.edu 0:b568b8ff43f2 60 data(end+1 : end+num_data,:) = d;
pwensing@mit.edu 0:b568b8ff43f2 61
pwensing@mit.edu 0:b568b8ff43f2 62 if (has_callback)
pwensing@mit.edu 0:b568b8ff43f2 63 callback(d);
pwensing@mit.edu 0:b568b8ff43f2 64 end
pwensing@mit.edu 0:b568b8ff43f2 65 end
pwensing@mit.edu 0:b568b8ff43f2 66
pwensing@mit.edu 0:b568b8ff43f2 67 % create port and bind handler
pwensing@mit.edu 0:b568b8ff43f2 68 u = udp(dest_ip,port);
pwensing@mit.edu 0:b568b8ff43f2 69 u.InputBufferSize = 1000000;
pwensing@mit.edu 0:b568b8ff43f2 70 u.DatagramReceivedFcn = @recv;
pwensing@mit.edu 0:b568b8ff43f2 71 u.DatagramTerminateMode = 'on';
pwensing@mit.edu 0:b568b8ff43f2 72
pwensing@mit.edu 0:b568b8ff43f2 73 fopen(u);
pwensing@mit.edu 0:b568b8ff43f2 74
pwensing@mit.edu 0:b568b8ff43f2 75 % Send input data to mbed
pwensing@mit.edu 0:b568b8ff43f2 76 fwrite(u,typecast(single(input),'uint8'))
pwensing@mit.edu 0:b568b8ff43f2 77
pwensing@mit.edu 0:b568b8ff43f2 78 tic
pwensing@mit.edu 0:b568b8ff43f2 79
pwensing@mit.edu 0:b568b8ff43f2 80 % Wait for experiment to finish
pwensing@mit.edu 0:b568b8ff43f2 81 k = 0;
pwensing@mit.edu 0:b568b8ff43f2 82 pd = 0;
pwensing@mit.edu 0:b568b8ff43f2 83 pk = 0;
pwensing@mit.edu 0:b568b8ff43f2 84 while done == 0
pwensing@mit.edu 0:b568b8ff43f2 85 k = k+1;
pwensing@mit.edu 0:b568b8ff43f2 86
pwensing@mit.edu 0:b568b8ff43f2 87 if mod(k,20) == 0
pwensing@mit.edu 0:b568b8ff43f2 88 fprintf(' (%d bytes recieved, %d available)\n',u.ValuesReceived,u.BytesAvailable);
pwensing@mit.edu 0:b568b8ff43f2 89 else
pwensing@mit.edu 0:b568b8ff43f2 90 fprintf('.');
pwensing@mit.edu 0:b568b8ff43f2 91 end
pwensing@mit.edu 0:b568b8ff43f2 92
pwensing@mit.edu 0:b568b8ff43f2 93 d = size(data,1);
pwensing@mit.edu 0:b568b8ff43f2 94 if d > pd
pwensing@mit.edu 0:b568b8ff43f2 95 pk = k;
pwensing@mit.edu 0:b568b8ff43f2 96 pd = d;
pwensing@mit.edu 0:b568b8ff43f2 97 elseif (k-pk) > params.timeout/10
pwensing@mit.edu 0:b568b8ff43f2 98 break
pwensing@mit.edu 0:b568b8ff43f2 99 end
pwensing@mit.edu 0:b568b8ff43f2 100
pwensing@mit.edu 0:b568b8ff43f2 101 pause(.1);
pwensing@mit.edu 0:b568b8ff43f2 102 end
pwensing@mit.edu 0:b568b8ff43f2 103 fprintf('\nExperiment finished\n');
pwensing@mit.edu 0:b568b8ff43f2 104 toc
pwensing@mit.edu 0:b568b8ff43f2 105
pwensing@mit.edu 0:b568b8ff43f2 106
pwensing@mit.edu 0:b568b8ff43f2 107 fclose(u)
pwensing@mit.edu 0:b568b8ff43f2 108 delete(u)
pwensing@mit.edu 0:b568b8ff43f2 109 output = data;
pwensing@mit.edu 0:b568b8ff43f2 110 end