You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.6 KiB
166 lines
4.6 KiB
%SensorLog Receive data from SensorLog app
|
|
%
|
|
% Class to receive data from the SensorLog iPhone app
|
|
%
|
|
% S = SensorLogconnect to a server and read a message
|
|
%
|
|
% Usage - message = client(host, port, number_of_retries)
|
|
%
|
|
% Usage:
|
|
% start the matlab code
|
|
% start the server
|
|
%
|
|
|
|
% Copyright (C) 1993-2015, by Peter I. Corke
|
|
%
|
|
% This file is part of The Robotics Toolbox for MATLAB (RTB).
|
|
%
|
|
% RTB is free software: you can redistribute it and/or modify
|
|
% it under the terms of the GNU Lesser General Public License as published by
|
|
% the Free Software Foundation, either version 3 of the License, or
|
|
% (at your option) any later version.
|
|
%
|
|
% RTB is distributed in the hope that it will be useful,
|
|
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
% GNU Lesser General Public License for more details.
|
|
%
|
|
% You should have received a copy of the GNU Leser General Public License
|
|
% along with RTB. If not, see <http://www.gnu.org/licenses/>.
|
|
%
|
|
% http://www.petercorke.com
|
|
|
|
classdef SensorLog < handle
|
|
properties
|
|
socket
|
|
stream
|
|
d_stream
|
|
struct
|
|
names
|
|
timer
|
|
end
|
|
|
|
properties (Hidden)
|
|
cleanup
|
|
end
|
|
|
|
|
|
methods
|
|
|
|
function s = SensorLog(host, port, timeout)
|
|
|
|
|
|
|
|
import java.net.Socket
|
|
import java.io.*
|
|
|
|
|
|
retry = 0;
|
|
number_of_retries = 5;
|
|
message = [];
|
|
|
|
if nargin < 3
|
|
timeout = 30;
|
|
end
|
|
|
|
while true
|
|
|
|
retry = retry + 1;
|
|
if ((number_of_retries > 0) && (retry > number_of_retries))
|
|
fprintf(1, 'Too many retries\n');
|
|
break;
|
|
end
|
|
|
|
try
|
|
fprintf(1, 'Retry %d connecting to %s:%d\n', ...
|
|
retry, host, port);
|
|
|
|
% throws if unable to connect
|
|
s.socket = Socket(host, port);
|
|
|
|
% get a buffered data input stream from the socket
|
|
s.stream = s.socket.getInputStream;
|
|
s.d_stream = DataInputStream(s.stream);
|
|
|
|
fprintf(1, 'Connected to server\n');
|
|
|
|
break;
|
|
|
|
|
|
catch me
|
|
me
|
|
me.message
|
|
% pause before retrying
|
|
pause(1);
|
|
end
|
|
end
|
|
|
|
% s.timer = timer('Period', 0.5, ...
|
|
% 'TimerFcn', @timercb, ...
|
|
% 'UserData', s, ...
|
|
% 'executionMode', 'fixedSpacing');
|
|
%
|
|
% start(s.timer)
|
|
end
|
|
|
|
|
|
function delete(s)
|
|
if ~isempty(s.socket)
|
|
s.socket.close;
|
|
end
|
|
% stop(s.timer)
|
|
% set(s.timer, 'UserData', []);
|
|
% delete(s.timer)
|
|
|
|
end
|
|
|
|
function flush(s)
|
|
end
|
|
|
|
function plot(s)
|
|
end
|
|
|
|
function msg = get(s)
|
|
% read data from the socket - wait a short time first
|
|
bytes_available = s.stream.available;
|
|
%fprintf(1, 'Reading %d bytes\n', bytes_available);
|
|
data_reader = DataReader(s.d_stream);
|
|
msg = data_reader.readBuffer(bytes_available);
|
|
|
|
msg = char(msg'); % Data comes out as a column vector
|
|
|
|
for line = strsplit(msg, '\n')
|
|
line = line{1};
|
|
|
|
fields = strsplit(line, ',');
|
|
if strcmp(fields{1}, 'time')
|
|
% have a header line
|
|
s.struct = [];
|
|
for i=1:length(fields)
|
|
s.struct = setfield(s.struct, fields{i}, 0);
|
|
end
|
|
fprintf('received header line\n');
|
|
s.names = fieldnames(s.struct)
|
|
continue;
|
|
else
|
|
if ~isempty(s.names)
|
|
for i=1:length(fields)
|
|
s.struct = setfield(s.struct, s.names{i}, str2num(fields{i}));
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
msg = s.struct;
|
|
end
|
|
|
|
end
|
|
end
|
|
function timercb(t, event)
|
|
1
|
|
%s = get(t, 'UserData');
|
|
%s.get()
|
|
|
|
end
|
|
|
|
|