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.
RunExperiment.m@3:ba19438ac09e, 2015-09-10 (annotated)
- 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?
User | Revision | Line number | New 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 |