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

Add first version of high-level dispatch

This 'execute'-method is only implemented in Motor.m for now.
parent 2f6197df
Branches
Tags
No related merge requests found
......@@ -272,10 +272,7 @@ classdef Motor < MaskedHandle & dynamicprops
end
if motor.debug
fprintf('\n(DEBUG) Motor::start: Calling ''outputStart''-command on Port %s...\n', port2str('Motor', motor.port));
end
motor.commInterface.outputStart(0, motor.port);
motor.execute(@outputStart, 0, motor.port);
motor.state.startedNotBusy = true;
else
......@@ -287,41 +284,21 @@ classdef Motor < MaskedHandle & dynamicprops
if strcmpi(motor.limitMode, 'Tacho')
if motor.speedRegulation
if motor.debug
fprintf('\n(DEBUG) Motor::start: Calling ''outputStepSpeed''-command on Port %s...\n',...
port2str('Motor', motor.port));
end
motor.commInterface.outputStepSpeed(0, motor.port, motor.power,...
motor.execute(@outputStepSpeed, 0, motor.port, motor.power,...
motor.smoothStart, limit, motor.smoothStop,...
motor.brakeMode_);
else
if motor.debug
fprintf('\n(DEBUG) Motor::start: Calling ''outputStepPower''-command on Port %s...\n',...
port2str('Motor', motor.port));
end
motor.commInterface.outputStepPower(0, motor.port, motor.power,...
motor.execute(@outputStepPower, 0, motor.port, motor.power,...
motor.smoothStart, limit, motor.smoothStop,...
motor.brakeMode_);
end
elseif strcmpi(motor.limitMode, 'Time')
if motor.speedRegulation
if motor.debug
fprintf('\n(DEBUG) Motor::start: Calling ''outputTimeSpeed''-command on Port %s...\n',...
port2str('Motor', motor.port));
end
motor.commInterface.outputTimeSpeed(0, motor.port, motor.power,...
motor.execute(@outputTimeSpeed, 0, motor.port, motor.power,...
motor.smoothStart, limit, motor.smoothStop,...
motor.brakeMode_);
else
if motor.debug
fprintf('\n(DEBUG) Motor::start: Calling ''outputTimePower''-command on Port %s...\n',...
port2str('Motor', motor.port));
end
motor.commInterface.outputTimePower(0, motor.port, motor.power,...
motor.execute(@outputTimePower, 0, motor.port, motor.power,...
motor.smoothStart, limit, motor.smoothStop,...
motor.brakeMode_);
end
......@@ -349,10 +326,7 @@ classdef Motor < MaskedHandle & dynamicprops
return;
end
if motor.debug
fprintf('\n(DEBUG) Motor::stop: Calling ''outputStop''-command on Port %s...\n', port2str('Motor', motor.port));
end
motor.commInterface.outputStop(0, motor.port, motor.brakeMode_);
motor.execute(@outputStop, 0, motor.port, motor.brakeMode_);
motor.state.startedNotBusy = false;
end
......@@ -473,19 +447,11 @@ classdef Motor < MaskedHandle & dynamicprops
if strcmpi(motor.limitMode, 'Tacho')
if motor.debug
fprintf(['\n(DEBUG) Motor::syncedStart: Calling ''outputStepSync''-command on ' ,...
'Ports %s and %s.\n'], port2str('Motor', motor.port), port2str('Motor', syncMotor.port));
end
motor.commInterface.outputStepSync(0, motor.port+syncMotor.port, ...
motor.execute(@outputStepSync, 0, motor.port+syncMotor.port, ...
motor.power, turnRatio, ...
motor.limitValue, motor.brakeMode_);
elseif strcmpi(motor.limitMode, 'Time')
if motor.debug
fprintf('\n(DEBUG) Motor::start: Calling ''outputStepSync''-command on Ports %s and %s.\n',...
port2str('Motor', motor.port), port2str('Motor', syncMotor.port));
end
motor.commInterface.outputTimeSync(0, motor.port+syncMotor.port, ...
motor.execute(@outputTimeSync, 0, motor.port+syncMotor.port, ...
motor.power, turnRatio, ...
motor.limitValue, motor.brakeMode_);
end
......@@ -527,11 +493,7 @@ classdef Motor < MaskedHandle & dynamicprops
syncMotor.applyState();
% Synced stopping
if motor.debug
fprintf('\n(DEBUG) Motor::syncedStop: Calling ''outputStop''-command on Ports %s and %s.\n', ...
port2str('Motor', motor.port), port2str('Motor', syncMotor.port));
end
motor.commInterface.outputStop(0, motor.port+syncMotor.port, motor.brakeMode_);
motor.execute(@outputStop, 0, motor.port+syncMotor.port, motor.brakeMode_);
% On next start, both motors have to send power-opcode again
if motor.state.sendPowerOnSet
......@@ -590,11 +552,7 @@ classdef Motor < MaskedHandle & dynamicprops
port2str('Motor', motor.port));
end
if motor.debug
fprintf('\n(DEBUG) Motor::internalReset: Calling ''outputReset''-command on Port %s...\n',...
port2str('Motor', motor.port));
end
motor.commInterface.outputReset(0, motor.port);
motor.execute(@outputReset, 0, motor.port);
end
function resetTachoCount(motor)
......@@ -609,11 +567,7 @@ classdef Motor < MaskedHandle & dynamicprops
port2str('Motor', motor.port));
end
if motor.debug
fprintf('\n(DEBUG) Motor::resetTachoCount: Calling ''outputClrCount''-command on Port %s...\n',...
port2str('Motor', motor.port));
end
motor.commInterface.outputClrCount(0, motor.port);
motor.execute(@outputClrCount, 0, motor.port);
end
function setBrake(motor, brake)
......@@ -963,7 +917,24 @@ classdef Motor < MaskedHandle & dynamicprops
end
end
methods (Access = private) % Private functions that directly interact with commLayer
methods (Access = private) % Private functions that directly interact with commLayer#
function varargout = execute(motor, commandHandle, varargin)
% Execute a CommunicationInterface-method given as a handle
%
% As those methods have different, fixed numbers of output arguments, this quantity
% has to be retrieved first.
if motor.debug
fprintf('(DEBUG) Sending %s\n', func2str(commandHandle));
end
% Note: Arrg. MATLAB does not support nargout for class methods directly, so I have to
% 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
nOut = nargout(strcat('CommunicationInterface>CommunicationInterface.', func2str(commandHandle)));
[varargout{1:nOut}] = commandHandle(motor.commInterface, varargin{:});
end
function success = setPower(motor, power)
% Sets given power value on the physical Brick.
%
......@@ -983,15 +954,9 @@ classdef Motor < MaskedHandle & dynamicprops
end;
if motor.currentSpeedRegulation
if motor.debug
fprintf('\n(DEBUG) Motor::setPower: Calling ''outputSpeed''-command on Port %s...\n', port2str('Motor', motor.port));
end
motor.commInterface.outputSpeed(0, motor.port, power);
motor.execute(@outputSpeed, 0, motor.port, power);
else
if motor.debug
fprintf('\n(DEBUG) Motor::setPower: Calling ''outputPower''-command on Port %s...\n', port2str('Motor', motor.port));
end
motor.commInterface.outputPower(0, motor.port, power);
motor.execute(@outputPower, 0, motor.port, power);
end
success = true;
return;
......@@ -1002,12 +967,7 @@ classdef Motor < MaskedHandle & dynamicprops
error('Motor::getTypeMode: Motor-Object not connected to comm handle.');
end
if motor.debug
fprintf('\n(DEBUG) Motor::getTypeMode: Calling ''inputDeviceGetTypeMode''-command on Port %s...\n',...
port2str('Motor', motor.port));
end
[typeNo,modeNo] = motor.commInterface.inputDeviceGetTypeMode(0, motor.portInput);
[typeNo, modeNo] = motor.execute(@inputDeviceGetTypeMode, 0, motor.portInput);
type = DeviceType(typeNo);
mode = DeviceMode(type,modeNo);
end
......@@ -1017,11 +977,7 @@ classdef Motor < MaskedHandle & dynamicprops
error('Motor::getStatus: Motor-Object not connected to comm handle.');
end
if motor.debug
fprintf('\n(DEBUG) Motor::getStatus: Calling ''inputDeviceGetConnection''-command on Port %s...\n',...
port2str('Motor', motor.port));
end
statusNo = motor.commInterface.inputDeviceGetConnection(0, motor.portInput);
statusNo = motor.execute(@inputDeviceGetConnection, 0, motor.portInput);
status = ConnectionType(statusNo);
end
......@@ -1030,17 +986,11 @@ classdef Motor < MaskedHandle & dynamicprops
error('Motor::getTachoCount: Motor-Object not connected to comm handle.');
end
if motor.debug
fprintf('\n(DEBUG) Motor::getTachoCount: Calling ''outputGetCount''-command on Port %s...\n', port2str('Motor', motor.port));
end
cnt = motor.commInterface.outputGetCount(0, motor.portNo);
cnt = motor.execute(@outputGetCount, 0, motor.portNo);
end
function cnt = getInternalTachoCount(motor)
if motor.debug
fprintf('\n(DEBUG) Motor::getInternalTachoCount: Calling ''outputRead''-command on Port %s...\n', port2str('Motor', motor.port));
end
[~, cnt] = motor.commInterface.outputRead(0, motor.portNo);
[~, cnt] = motor.execute(@outputRead, 0, motor.portNo);
end
function speed = getSpeed(motor)
......@@ -1048,10 +998,7 @@ classdef Motor < MaskedHandle & dynamicprops
error('Motor::getSpeed: Motor-Object not connected to comm handle.');
end
if motor.debug
fprintf('\n(DEBUG) Motor::getSpeed: Calling ''inputReadSI''-command on Port %s...\n', port2str('Motor', motor.port));
end
speed = motor.commInterface.inputReadSI(0, motor.portInput, DeviceMode.Motor.Speed);
speed = motor.execute(@inputReadSI, 0, motor.portInput, DeviceMode.Motor.Speed);
end
function busy = getBusyFlag(motor)
......@@ -1067,10 +1014,7 @@ classdef Motor < MaskedHandle & dynamicprops
error('Motor::getBusyFlag: Motor-Object not connected to comm handle.');
end
if motor.debug
fprintf('\n(DEBUG) Motor::getBusyFlag: Calling ''outputTest''-command on Port %s...\n', port2str('Motor', motor.port));
end
busy = motor.commInterface.outputTest(0, motor.port);
busy = motor.execute(@outputTest, 0, motor.port);
end
function applyBrake(motor)
......@@ -1083,18 +1027,13 @@ classdef Motor < MaskedHandle & dynamicprops
error('Motor::applyBrake: Can''t apply brake because Motor is moving');
end
if motor.debug
fprintf(['\n(DEBUG) Motor::applyBrake: Calling ''outputPower'', ''outputStart'' and' ,...
'''outputStop'' on Port %s...\n'], port2str('Motor', motor.port));
end
if motor.speedRegulation
motor.commInterface.outputPower(0, motor.port, 0);
motor.execute(@outputPower, 0, motor.port, 0);
else
motor.commInterface.outputSpeed(0, motor.port, 0);
motor.execute(@outputSpeed, 0, motor.port, 0);
end
motor.commInterface.outputStart(0, motor.port);
motor.commInterface.outputStop(0, motor.port, BrakeMode.Brake);
motor.execute(@outputStart, 0, motor.port);
motor.execute(@outputStop, 0, motor.port, BrakeMode.Brake);
end
function releaseBrake(motor)
......@@ -1107,17 +1046,13 @@ classdef Motor < MaskedHandle & dynamicprops
error('Motor::releaseBrake: Can''t release brake because Motor is moving');
end
if motor.debug
fprintf(['\n(DEBUG) Motor::releaseBrake: Calling ''outputPower'', ''outputStart'' and' ,...
'''outputStop'' on Port %s...\n'], port2str('Motor', motor.port));
end
if motor.speedRegulation
motor.commInterface.outputPower(0, motor.port, 0);
motor.execute(@outputPower, 0, motor.port, 0);
else
motor.commInterface.outputSpeed(0, motor.port, 0);
motor.execute(@outputSpeed, 0, motor.port, 0);
end
motor.commInterface.outputStart(0, motor.port);
motor.commInterface.outputStop(0, motor.port, BrakeMode.Coast);
motor.execute(@outputStart, 0, motor.port);
motor.execute(@outputStop, 0, motor.port, BrakeMode.Coast);
end
end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment