Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: RunExperiment.m
- Revision:
- 0:b568b8ff43f2
- Child:
- 1:30408caaef92
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RunExperiment.m Wed Aug 12 08:34:57 2015 -0400 @@ -0,0 +1,111 @@ +function output = RunExperiment(dest_ip,port,input,output_size,params) + % RunExperiment + % [output] = RunExperiment(dest_ip, port, input, output_size,params) + % + % Sends input to the FRDM board and processes output data + % + % INPUT PARAMETERS + % dest_ip: (string) ip address of FRDM board + % port: (int) port used by server on FRDM board + % input: (float vector) input variables for the experiment + % which are sent to the FRDM board + % ouput_size: (int) number of floats to be sent back by the FRDM + % board at each control step + % params: (struct) (optional) contains arguments below + % params.callback - callback function + % params.timeout - timeout to end experiment (seconds) + % + % OUTPUT PARAMETERS + % output: (float vector) matrix of all data recieved from FRDM + % board during the experiment + + if nargin == 4 + params = struct(); + end + if ~isfiend(params,'callback') + params.callback = 0; + end + + if ~isfiend(params,'timeout') + params.timeout = 2; + end + + + done = 0; + + data = []; % output data + % boolean to store if there is a callback + has_callback = strcmp(class(params.callback) , 'function_handle'); + + % event handler for packet reception + function [] = recv(obj,es) + if es.Data.DatagramLength == 1 + done = 1; + return + end + % All packets must contains floats, which are of size 4 + % if the packet isn't divisible by 4, there is an error + if mod(es.Data.DatagramLength,4*output_size) > 0 + fprintf(1,'Error bad data size %d expected mod %d\n',es.Data.DatagramLength,4*output_size); + fread(obj, es.Data.DatagramLength); + return + end + + d = fread(obj, es.Data.DatagramLength); + d = typecast(uint8(d),'single'); + %length(d) + + num_data = length(d)/output_size; + + d = reshape(d,output_size,num_data)'; + data(end+1 : end+num_data,:) = d; + + if (has_callback) + callback(d); + end + end + + % create port and bind handler + u = udp(dest_ip,port); + u.InputBufferSize = 1000000; + u.DatagramReceivedFcn = @recv; + u.DatagramTerminateMode = 'on'; + + fopen(u); + + % Send input data to mbed + fwrite(u,typecast(single(input),'uint8')) + + tic + + % Wait for experiment to finish + k = 0; + pd = 0; + pk = 0; + while done == 0 + k = k+1; + + if mod(k,20) == 0 + fprintf(' (%d bytes recieved, %d available)\n',u.ValuesReceived,u.BytesAvailable); + else + fprintf('.'); + end + + d = size(data,1); + if d > pd + pk = k; + pd = d; + elseif (k-pk) > params.timeout/10 + break + end + + pause(.1); + end + fprintf('\nExperiment finished\n'); + toc + + + fclose(u) + delete(u) + output = data; +end \ No newline at end of file