Skip to content
Snippets Groups Projects
Commit 227af211 authored by Tim Stadtmann's avatar Tim Stadtmann
Browse files

Move connection tests to dispatch-method

Adapted (and cleaned up) error messages and warnings accordingly.
parent 0726e13a
No related branches found
No related tags found
No related merge requests found
...@@ -268,12 +268,6 @@ classdef EV3 < MaskedHandle ...@@ -268,12 +268,6 @@ classdef EV3 < MaskedHandle
%% Device functions %% Device functions
function stopAllMotors(ev3) function stopAllMotors(ev3)
% Sends a stop-command to all motor-ports. % Sends a stop-command to all motor-ports.
if ~ev3.isConnected
error(['EV3::stopAllMotors: Brick-Object not connected physical brick. ',...
'You have to call ev3.connect(...) first!']);
end
ev3.commInterface.outputStopAll(); ev3.commInterface.outputStopAll();
end end
...@@ -289,12 +283,6 @@ classdef EV3 < MaskedHandle ...@@ -289,12 +283,6 @@ classdef EV3 < MaskedHandle
% b.connect('bt', 'serPort', '/dev/rfcomm0'); % |br| % b.connect('bt', 'serPort', '/dev/rfcomm0'); % |br|
% b.beep(); % |br| % b.beep(); % |br|
% %
if ~ev3.isConnected
error(['EV3::beep: Brick-Object not connected physical brick. ',...
'You have to call ev3.connect(...) first!']);
end
ev3.handleCommand(@soundPlayTone, 10, 1000, 100); ev3.handleCommand(@soundPlayTone, 10, 1000, 100);
end end
...@@ -312,12 +300,6 @@ classdef EV3 < MaskedHandle ...@@ -312,12 +300,6 @@ classdef EV3 < MaskedHandle
% b.playTone(40, 5000, 1000); % Plays tone with 40% volume and 5000Hz for 1 % b.playTone(40, 5000, 1000); % Plays tone with 40% volume and 5000Hz for 1
% second. |br| % second. |br|
% %
if ~ev3.isConnected
error(['EV3::isConnected: Brick-Object not connected physical brick. ',...
'You have to call ev3.connect(...) first!']);
end
ev3.handleCommand(@soundPlayTone, volume, frequency, duration); ev3.handleCommand(@soundPlayTone, volume, frequency, duration);
end end
...@@ -330,12 +312,6 @@ classdef EV3 < MaskedHandle ...@@ -330,12 +312,6 @@ classdef EV3 < MaskedHandle
% b.playTone(10,100,100000000); % Accidentally given wrong tone duration :) |br| % b.playTone(10,100,100000000); % Accidentally given wrong tone duration :) |br|
% b.stopTone(); % Stops tone immediately. |br| % b.stopTone(); % Stops tone immediately. |br|
% %
if ~ev3.isConnected
error(['EV3::stopTone: Brick-Object not connected physical brick. ',...
'You have to call ev3.connect(...) first!']);
end
ev3.handleCommand(@soundStopTone); ev3.handleCommand(@soundStopTone);
end end
...@@ -352,12 +328,6 @@ classdef EV3 < MaskedHandle ...@@ -352,12 +328,6 @@ classdef EV3 < MaskedHandle
% pause(0.5); % Small pause is necessary as tone does not start instantaneously |br| % pause(0.5); % Small pause is necessary as tone does not start instantaneously |br|
% b.tonePlayed(); % -> Outputs 1 to console. |br| % b.tonePlayed(); % -> Outputs 1 to console. |br|
% %
if ~ev3.isConnected
error(['EV3::tonePlayed: Brick-Object not connected physical brick. ',...
'You have to call ev3.connect(...) first!']);
end
status = ev3.handleCommand(@soundTest); status = ev3.handleCommand(@soundTest);
end end
...@@ -442,7 +412,7 @@ classdef EV3 < MaskedHandle ...@@ -442,7 +412,7 @@ classdef EV3 < MaskedHandle
%% Getter %% Getter
function bat = get.batteryValue(ev3) function bat = get.batteryValue(ev3)
if ~ev3.isConnected if ~ev3.isConnected
warning(ID('noConnection'), 'EV3::getBattery: EV3-Object not connected to physical EV3.'); warning(ID('noConnection'), 'EV3-Object not connected to physical EV3.');
bat = 0; bat = 0;
return; return;
...@@ -477,7 +447,15 @@ classdef EV3 < MaskedHandle ...@@ -477,7 +447,15 @@ classdef EV3 < MaskedHandle
% %
% As those methods have different, fixed numbers of output arguments, this quantity % As those methods have different, fixed numbers of output arguments, this quantity
% has to be retrieved first. % has to be retrieved first.
if ~ev3.isConnected
msg = ['Brick-Object not connected physical brick. ',...
'You have to call connect(...) first!'];
id = [ID(), ':', 'NotConnected'];
throw(MException(id, msg));
end
if ev3.debug if ev3.debug
fprintf('(DEBUG) Sending %s\n', func2str(commandHandle)); fprintf('(DEBUG) Sending %s\n', func2str(commandHandle));
end end
...@@ -486,12 +464,27 @@ classdef EV3 < MaskedHandle ...@@ -486,12 +464,27 @@ classdef EV3 < MaskedHandle
% do this ugly workaround using strings. See % do this ugly workaround using strings. See
% https://de.mathworks.com/matlabcentral/answers/96617-how-can-i-use-nargin-nargout-to-determine-the-number-of-input-output-arguments-of-an-object-method % https://de.mathworks.com/matlabcentral/answers/96617-how-can-i-use-nargin-nargout-to-determine-the-number-of-input-output-arguments-of-an-object-method
nOut = nargout(strcat('CommunicationInterface>CommunicationInterface.', func2str(commandHandle))); nOut = nargout(strcat('CommunicationInterface>CommunicationInterface.', func2str(commandHandle)));
[varargout{1:nOut}] = commandHandle(ev3.commInterface, varargin{:});
try
[varargout{1:nOut}] = commandHandle(ev3.commInterface, varargin{:});
catch ME
%ev3.detectedCommError(ME.identifier, ME.message);
if ~isempty(strfind(exceptionID, 'CommError'))
warning('Lost connection to the Brick!');
ev3.disconnect();
else
warning('Something went wrong. Trying to reset the connection...');
ev3.disconnect();
ev3.connect();
end
throw(exception);
end
end end
function bat = getBattery(ev3) function bat = getBattery(ev3)
% Retrieve batteryValue from brick in current mode. (Wrapped by EV3.batteryValue) % Retrieve batteryValue from brick in current mode. (Wrapped by get.batteryValue)
if strcmpi(ev3.batteryMode, 'Percentage') if strcmpi(ev3.batteryMode, 'Percentage')
bat = ev3.handleCommand(@uiReadLbatt); bat = ev3.handleCommand(@uiReadLbatt);
else else
......
This diff is collapsed.
...@@ -243,14 +243,12 @@ classdef Sensor < MaskedHandle ...@@ -243,14 +243,12 @@ classdef Sensor < MaskedHandle
% * This clears ALL the sensors right now, no other Op-Code available... :( % * This clears ALL the sensors right now, no other Op-Code available... :(
% %
if ~sensor.connectedToBrick if ~sensor.physicalSensorConnected
error('Sensor::reset: Sensor-Object not connected to comm handle.'); error('Could not detect sensor at Port %d',...
elseif ~sensor.physicalSensorConnected
error('Sensor::reset: No physical sensor connected to Port %d.',...
sensor.port+1); sensor.port+1);
end end
% warning(['Sensor::reset: Current version of reset resets ALL devices, that is, ',... % warning(['Current version of reset resets ALL devices, that is, ',...
% 'all motor tacho counts and all other sensor counters!']); % 'all motor tacho counts and all other sensor counters!']);
sensor.handleCommand(@inputDeviceClrAll, 0); sensor.handleCommand(@inputDeviceClrAll, 0);
end end
...@@ -264,7 +262,7 @@ classdef Sensor < MaskedHandle ...@@ -264,7 +262,7 @@ classdef Sensor < MaskedHandle
type = sensor.type; type = sensor.type;
if ~isModeValid(mode, type) if ~isModeValid(mode, type)
error('Sensor::set.mode: Invalid sensor mode.'); error('Invalid sensor mode.');
else else
sensor.mode = mode; sensor.mode = mode;
...@@ -281,7 +279,7 @@ classdef Sensor < MaskedHandle ...@@ -281,7 +279,7 @@ classdef Sensor < MaskedHandle
function set.debug(sensor, debug) function set.debug(sensor, debug)
% Check if debug is valid and set sensor.debug if it is. % Check if debug is valid and set sensor.debug if it is.
if ~isBool(debug) if ~isBool(debug)
error('Sensor::set.debug: Given parameter is not a bool.'); error('Given parameter is not a bool.');
end end
sensor.debug = str2bool(debug); sensor.debug = str2bool(debug);
...@@ -289,7 +287,7 @@ classdef Sensor < MaskedHandle ...@@ -289,7 +287,7 @@ classdef Sensor < MaskedHandle
function set.port(sensor, port) function set.port(sensor, port)
if ~isPortStrValid(class(sensor),port) if ~isPortStrValid(class(sensor),port)
error('Sensor::set.port: Given port is not a valid port.'); error('Given port is not a valid port.');
else else
sensor.port = str2PortParam(class(sensor), port); sensor.port = str2PortParam(class(sensor), port);
end end
...@@ -297,7 +295,7 @@ classdef Sensor < MaskedHandle ...@@ -297,7 +295,7 @@ classdef Sensor < MaskedHandle
function set.commInterface(sensor, comm) function set.commInterface(sensor, comm)
if ~isCommInterfaceValid(comm) if ~isCommInterfaceValid(comm)
error('Sensor::set.commInterface: Handle to commInterface not valid.'); error('Handle to commInterface not valid.');
else else
sensor.commInterface = comm; sensor.commInterface = comm;
end end
...@@ -354,7 +352,7 @@ classdef Sensor < MaskedHandle ...@@ -354,7 +352,7 @@ classdef Sensor < MaskedHandle
if sensor.connectedToBrick if sensor.connectedToBrick
value = sensor.getValue(defaultMode); value = sensor.getValue(defaultMode);
if isnan(value) if isnan(value)
warning('Sensor::get.value: Could not detect sensor at port %d.', ... warning('Could not detect sensor at port %d.', ...
sensor.port+1); sensor.port+1);
value = 0; value = 0;
end end
...@@ -383,10 +381,8 @@ classdef Sensor < MaskedHandle ...@@ -383,10 +381,8 @@ classdef Sensor < MaskedHandle
methods (Access = private) % Private brick functions that are wrapped by dependent params methods (Access = private) % Private brick functions that are wrapped by dependent params
function setMode(sensor, mode) function setMode(sensor, mode)
if ~sensor.connectedToBrick if ~sensor.physicalSensorConnected
error('Sensor::getTachoCount: Sensor-Object not connected to comm handle.'); error('Could not detect sensor at Port %d',...
elseif ~sensor.physicalSensorConnected
error('Sensor::getTachoCount: No physical sensor connected to Port %d',...
sensor.port+1); sensor.port+1);
end end
...@@ -407,16 +403,12 @@ classdef Sensor < MaskedHandle ...@@ -407,16 +403,12 @@ classdef Sensor < MaskedHandle
% 5 is numerically highest available number of modes for a sensor(NXT Color) % 5 is numerically highest available number of modes for a sensor(NXT Color)
if ~isnumeric(defaultMode) || defaultMode > 5 if ~isnumeric(defaultMode) || defaultMode > 5
error('Sensor::getValue: Invalid mode'); error('Invalid mode');
end end
else else
defaultMode = -1; defaultMode = -1;
end end
if ~sensor.connectedToBrick
error('Sensor::getValue: Sensor-Object not connected to comm handle.');
end
if defaultMode ~= -1 if defaultMode ~= -1
mode = defaultMode; mode = defaultMode;
else else
...@@ -439,19 +431,11 @@ classdef Sensor < MaskedHandle ...@@ -439,19 +431,11 @@ classdef Sensor < MaskedHandle
end end
function status = getStatus(sensor) function status = getStatus(sensor)
if ~sensor.connectedToBrick
error('Sensor::getStatus: Sensor-Object not connected to comm handle.');
end
statusNo = sensor.handleCommand(@inputDeviceGetConnection, 0, sensor.port); statusNo = sensor.handleCommand(@inputDeviceGetConnection, 0, sensor.port);
status = ConnectionType(statusNo); status = ConnectionType(statusNo);
end end
function [type,mode] = getTypeMode(sensor) function [type,mode] = getTypeMode(sensor)
if ~sensor.connectedToBrick
error('Sensor::getTypeMode: Sensor-Object not connected to comm handle.');
end
type = DeviceType.Error; type = DeviceType.Error;
for i = 1:10 for i = 1:10
...@@ -471,15 +455,20 @@ classdef Sensor < MaskedHandle ...@@ -471,15 +455,20 @@ classdef Sensor < MaskedHandle
end end
end end
end function varargout = handleCommand(sensor, commandHandle, varargin)
methods (Access = private)
function varargout = handleCommand(sensor, commandHandle, varargin)
% Execute a CommunicationInterface-method given as a handle % Execute a CommunicationInterface-method given as a handle
% %
% As those methods have different, fixed numbers of output arguments, this quantity % As those methods have different, fixed numbers of output arguments, this quantity
% has to be retrieved first. % has to be retrieved first.
if ~sensor.connectedToBrick
msg = ['Not connected to physical brick. ',...
'You have to call connect(...) on the EV3 object first!'];
id = [ID(), ':', 'NotConnected'];
throw(MException(id, msg));
end
if sensor.debug if sensor.debug
fprintf('(DEBUG) Sending %s\n', func2str(commandHandle)); fprintf('(DEBUG) Sending %s\n', func2str(commandHandle));
end end
...@@ -488,7 +477,21 @@ classdef Sensor < MaskedHandle ...@@ -488,7 +477,21 @@ classdef Sensor < MaskedHandle
% do this ugly workaround using strings. See % do this ugly workaround using strings. See
% https://de.mathworks.com/matlabcentral/answers/96617-how-can-i-use-nargin-nargout-to-determine-the-number-of-input-output-arguments-of-an-object-method % https://de.mathworks.com/matlabcentral/answers/96617-how-can-i-use-nargin-nargout-to-determine-the-number-of-input-output-arguments-of-an-object-method
nOut = nargout(strcat('CommunicationInterface>CommunicationInterface.', func2str(commandHandle))); nOut = nargout(strcat('CommunicationInterface>CommunicationInterface.', func2str(commandHandle)));
[varargout{1:nOut}] = commandHandle(sensor.commInterface, varargin{:}); try
[varargout{1:nOut}] = commandHandle(sensor.commInterface, varargin{:});
catch ME
%sensor.ev3Handle.detectedCommError(ME.identifier, ME.message);
if ~isempty(strfind(ME.identifier, 'CommError'))
warning('Lost connection to the Brick!');
sensor.disconnect();
else
warning('Something went wrong. Trying to reset the connection...');
sensor.disconnect();
sensor.connect();
end
throw(exception);
end
end end
end end
...@@ -498,16 +501,16 @@ classdef Sensor < MaskedHandle ...@@ -498,16 +501,16 @@ classdef Sensor < MaskedHandle
if sensor.connectedToBrick if sensor.connectedToBrick
if isCommInterfaceValid(sensor.commInterface) if isCommInterfaceValid(sensor.commInterface)
error('Sensor::connect: Sensor-Object already has a comm handle.'); error('Sensor-Object already has a comm handle.');
else else
warning(['Sensor::connect: Sensor.connectedToBrick is set to ''True'', but ',... warning(['Sensor.connectedToBrick is set to ''True'', but ',...
'comm handle is invalid. Deleting invalid handle and ' ,... 'comm handle is invalid. Deleting invalid handle and ' ,...
'resetting Sensor.connectedToBrick now...']); 'resetting Sensor.connectedToBrick now...']);
sensor.commInterface = 0; sensor.commInterface = 0;
sensor.connectedToBrick = false; sensor.connectedToBrick = false;
error('Sensor::connect: Disconnected due to internal error.'); error('Disconnected due to internal error.');
end end
end end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment