Changeset 246
- Timestamp:
- 08/29/08 16:28:25 (5 years ago)
- Location:
- branches/telle/RWTHMindstormsNXT
- Files:
-
- 1 added
- 22 modified
-
@NXTmotor/NXTmotor.m (modified) (2 diffs)
-
@NXTmotor/get.m (modified) (4 diffs)
-
@NXTmotor/read.m (modified) (1 diff)
-
@NXTmotor/reset.m (modified) (1 diff)
-
@NXTmotor/send.m (modified) (1 diff)
-
@NXTmotor/set.m (modified) (9 diffs)
-
@NXTmotor/stop.m (modified) (1 diff)
-
@NXTmotor/subsasgn.m (modified) (1 diff)
-
@NXTmotorsettings/NXTmotorsettings.m (modified) (2 diffs)
-
@NXTmotorsettings/display.m (modified) (1 diff)
-
@NXTmotorsettings/get.m (modified) (1 diff)
-
@NXTmotorsettings/length.m (modified) (1 diff)
-
@NXTmotorsettings/private/applyProperties.m (modified) (5 diffs)
-
@NXTmotorsettings/private/checkForSyncedMotors.m (added)
-
@NXTmotorsettings/read.m (modified) (1 diff)
-
@NXTmotorsettings/reset.m (modified) (1 diff)
-
@NXTmotorsettings/send.m (modified) (1 diff)
-
@NXTmotorsettings/set.m (modified) (3 diffs)
-
@NXTmotorsettings/stop.m (modified) (1 diff)
-
@NXTmotorsettings/subsasgn.m (modified) (2 diffs)
-
@NXTmotorsettings/subsref.m (modified) (2 diffs)
-
@NXTmotorsettings/sync.m (modified) (6 diffs)
-
@NXTmotorsettings/wait.m (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/telle/RWTHMindstormsNXT/@NXTmotor/NXTmotor.m
r221 r246 31 31 % Author: Aulis Telle, IND, RWTH Aachen 32 32 33 data = [];34 33 35 34 if nargin > 0 && isa(varargin{1}, 'NXTmotor') 36 tmp = varargin{1}; 37 data = tmp.data(); 35 obj = varargin{1}; 38 36 else 39 37 port = 0; … … 60 58 end 61 59 62 data.port = port;63 data.power = 0;64 data.mode.motorOn= 1;65 data.mode.brake= 1;66 data.regulationMode = 'IDLE';67 data.turnRatio = 0;68 data.runState = 'RUNNING';69 data.tachoLimit = 0;60 obj.port = port; 61 obj.power = 0; 62 obj.motorOn = 1; 63 obj.brake = 1; 64 obj.regulationMode = 'IDLE'; 65 obj.turnRatio = 0; 66 obj.runState = 'RUNNING'; 67 obj.tachoLimit = 0; 70 68 end 71 69 72 73 obj.data = @dataClosure;74 70 75 71 obj = class(obj, 'NXTmotor'); 76 72 77 73 if nargin > 1 78 set(obj, varargin{2:end});74 obj = set(obj, varargin{2:end}); 79 75 end 80 81 % This is the nested function for the function closure. The variable82 % "data", which is in the scope of the outer function, can be accessed from83 % within the nested function. A handel to this function is returned to the84 % caller of the outer function. This makes the variable "data" persistent85 % and from now on it can be accessed from within the nested function, even86 % when it is called from another scope.87 function val = dataClosure(varargin)88 89 % if there are two arguments, this indicates, that a property field90 % shall be set. varargin{1} is the field name and varargin{2} the91 % value, to which it should be set.92 if nargin == 293 switch varargin{1}94 case {'port'}95 data.port = varargin{2};96 97 case {'power'}98 data.power = varargin{2};99 100 case {'motorOn'}101 data.mode.motorOn = varargin{2};102 103 case {'brake'}104 data.mode.brake = varargin{2};105 106 case {'regulationMode'}107 data.regulationMode = varargin{2};108 109 case {'turnRatio'}110 data.turnRatio = varargin{2};111 112 case {'runState'}113 data.runState = varargin{2};114 115 case {'tachoLimit'}116 data.tachoLimit = varargin{2};117 end118 end119 val = data;120 end121 % END OF NESTED FUNCTION dataClosure()122 76 123 77 end -
branches/telle/RWTHMindstormsNXT/@NXTmotor/get.m
r218 r246 23 23 end 24 24 25 data = obj.data(); 25 26 26 if nargin > 1 27 27 switch prop 28 28 case 'Port' 29 val = data.port;29 val = obj.port; 30 30 case 'Power' 31 val = data.power;31 val = obj.power; 32 32 case 'MotorOn' 33 if data.mode.motorOn == 133 if obj.motorOn == 1 34 34 val = 'on'; 35 35 else … … 37 37 end 38 38 case 'Brake' 39 if data.mode.brake == 139 if obj.brake == 1 40 40 val = 'on'; 41 41 else 42 42 val = 'off'; 43 43 end 44 % case 'Regulated'45 % if ischar(val)46 % if strcmpi(val,'on')47 % data.mode.regulated = 1;48 % elseif strcmpi(val,'off')49 % data.mode.regulated = 0;50 % else51 % error('MototSettingError:InvalidRegulated', ...52 % 'MotorOn may be ''on'' or ''off''.');53 % end54 % end55 44 case 'RegulationMode' 56 switch data.regulationMode45 switch obj.regulationMode 57 46 case 'IDLE' 58 47 val = 'idle'; … … 65 54 end 66 55 case 'TurnRatio' 67 val = data.turnRatio;56 val = obj.turnRatio; 68 57 case 'RunState' 69 switch data.runState58 switch obj.runState 70 59 case 'IDLE'; 71 60 val = 'idle'; … … 78 67 end 79 68 case 'TachoLimit' 80 val = data.tachoLimit;69 val = obj.tachoLimit; 81 70 otherwise 82 71 error('RWTHMINDSTORMS:NXTmotor:unsupportedProperty',... -
branches/telle/RWTHMindstormsNXT/@NXTmotor/read.m
r218 r246 13 13 'No NXTmotor object.'); 14 14 end 15 data = obj.data();16 data = NXT_GetOutputState(data.port);17 15 16 data = NXT_GetOutputState(obj.port); 17 -
branches/telle/RWTHMindstormsNXT/@NXTmotor/reset.m
r218 r246 28 28 end 29 29 30 data = obj.data();31 32 30 switch lower(type) 33 31 case 'absolute' 34 NXT_ResetMotorPosition( data.port, 0);32 NXT_ResetMotorPosition(obj.port, 0); 35 33 case 'relative' 36 NXT_ResetMotorPosition( data.port, 1);34 NXT_ResetMotorPosition(obj.port, 1); 37 35 case 'full' 38 36 NXT_StartProgram('ResetCounter'); -
branches/telle/RWTHMindstormsNXT/@NXTmotor/send.m
r218 r246 17 17 end 18 18 19 data = obj.data();20 19 if nargout == 1 21 20 22 21 out = NXT_SetOutputState(... 23 data.port, ...24 data.power, ...25 data.mode.motorOn, ...26 data.mode.brake, ...27 data.regulationMode, ...28 data.turnRatio, ...29 data.runState, ...30 data.tachoLimit, ...22 obj.port, ... 23 obj.power, ... 24 obj.motorOn, ... 25 obj.brake, ... 26 obj.regulationMode, ... 27 obj.turnRatio, ... 28 obj.runState, ... 29 obj.tachoLimit, ... 31 30 'reply'... 32 31 ); 33 32 else 34 33 NXT_SetOutputState(... 35 data.port, ...36 data.power, ...37 data.mode.motorOn, ...38 data.mode.brake, ...39 data.regulationMode, ...40 data.turnRatio, ...41 data.runState, ...42 data.tachoLimit, ...34 obj.port, ... 35 obj.power, ... 36 obj.motorOn, ... 37 obj.brake, ... 38 obj.regulationMode, ... 39 obj.turnRatio, ... 40 obj.runState, ... 41 obj.tachoLimit, ... 43 42 'dontreply'... 44 43 ); -
branches/telle/RWTHMindstormsNXT/@NXTmotor/set.m
r243 r246 1 function set( obj, varargin )1 function obj = set( obj, varargin ) 2 2 % SET Configure or display NXTmotor object properties. 3 3 % … … 30 30 end 31 31 32 if nargout == 0 33 error('RWTHMINDSTORMS:NXTmotor:InvalidUseOfSet',... 34 'No output argument supplied to set.'); 35 end 36 32 37 if numel(obj) > 1 33 error('RWTHMINDSTORMS:NXTmotor: inputNotScalar',...38 error('RWTHMINDSTORMS:NXTmotor:InputNotScalar',... 34 39 'Set method supports only scalar objects.'); 35 40 end … … 57 62 case 'Port' 58 63 if isscalar(val) && isnumeric(val) && val >= 0 && val <= 2 59 obj. data('port', val);64 obj.port = val; 60 65 elseif ischar(val) 61 66 val = lower(val); 62 67 switch val 63 68 case 'a' 64 obj. data('port', 0);69 obj.port = 0; 65 70 case 'b' 66 obj. data('port', 1);71 obj.port = 1; 67 72 case 'c' 68 obj. data('port', 2);73 obj.port = 2; 69 74 otherwise 70 75 error('MotorSettingError:InvalidPort',... … … 78 83 case 'Power' 79 84 if isscalar(val) && isnumeric(val) && val >= -100 && val <= 100 80 obj. data('power',val);85 obj.power = val; 81 86 else 82 87 error('MotorSettingError:InvalidPower',... … … 86 91 case 'MotorOn' 87 92 if isscalar(val) && isnumeric(val) && (val == 0 || val == 1) 88 obj. data('motorOn', val);93 obj.motorOn = val; 89 94 elseif islogical(val) 90 95 if val 91 obj. data('motorOn', 1);92 else 93 obj. data('motorOn', 0);96 obj.motorOn = 1; 97 else 98 obj.motorOn = 0; 94 99 end 95 100 elseif ischar(val) 96 101 if strcmpi(val,'on') 97 obj. data('motorOn', 1);102 obj.motorOn = 1; 98 103 elseif strcmpi(val,'off') 99 obj. data('motorOn', 0);104 obj.motorOn = 0; 100 105 else 101 106 error('MototSettingError:InvalidMotorOn',... … … 109 114 case 'Brake' 110 115 if isscalar(val) && isnumeric(val) && (val == 0 || val == 1) 111 obj. data('brake', val);116 obj.brake = val; 112 117 elseif islogical(val) 113 118 if val 114 obj. data('brake', 1);115 else 116 obj. data('brake', 0);119 obj.brake = 1; 120 else 121 obj.brake = 0; 117 122 end 118 123 elseif ischar(val) 119 124 if strcmpi(val,'on') 120 obj. data('brake', 1);125 obj.brake = 1; 121 126 elseif strcmpi(val,'off') 122 obj. data('brake', 0);127 obj.brake = 0; 123 128 else 124 129 error('MototSettingError:InvalidBreak',... … … 144 149 switch lower(val) 145 150 case 'idle' 146 obj. data('regulationMode', 'IDLE');151 obj.regulationMode = 'IDLE'; 147 152 case 'speed' 148 obj. data('regulationMode', 'SPEED');153 obj.regulationMode = 'SPEED'; 149 154 case 'sync' 150 obj. data('regulationMode', 'SYNC');155 obj.regulationMode = 'SYNC'; 151 156 case 'speedsync' 152 obj. data('regulationMode', 'SPEEDSYNC');157 obj.regulationMode = 'SPEEDSYNC'; 153 158 otherwise 154 159 error('MototSettingError:InvalidRegulationMode', ... 155 160 'RegulationMode may be ''idle'', ''speed'', or ''sync''.'); 156 161 end 162 else 163 error('MototSettingError:InvalidRegulationMode', ... 164 'RegulationMode may be ''idle'', ''speed'', or ''sync''.'); 157 165 end 158 166 159 167 case 'TurnRatio' 160 168 if isscalar(val) && isnumeric(val) && val >= -100 && val <= 100 161 obj. data('turnRatio', val);169 obj.turnRatio = val; 162 170 else 163 171 error('MotorSettingError:InvalidTurnRatio',... … … 169 177 switch lower(val) 170 178 case 'idle' 171 obj. data('runState', 'IDLE');179 obj.runState = 'IDLE'; 172 180 case 'rampup' 173 obj. data('runState', 'RAMPUP');181 obj.runState = 'RAMPUP'; 174 182 case 'running' 175 obj. data('runState', 'RUNNING');183 obj.runState = 'RUNNING'; 176 184 case 'rampdown' 177 obj. data('runState', 'RAMPDOWN');185 obj.runState = 'RAMPDOWN'; 178 186 otherwise 179 187 error('MototSettingError:InvalidRunState', ... 180 188 'RunState may be ''idle'', ''rampup'', ''running'', or ''rampdown''.'); 181 189 end 190 else 191 error('MototSettingError:InvalidRunState', ... 192 'RunState may be ''idle'', ''rampup'', ''running'', or ''rampdown''.'); 182 193 end 183 194 184 195 case 'TachoLimit' 185 196 if isscalar(val) && isnumeric(val) 186 obj. data('tachoLimit', val);197 obj.tachoLimit = val; 187 198 else 188 199 error('MotorSettingError:InvalidTachoLimit',... … … 195 206 end 196 207 208 if (nargout == 0) 209 clear obj; 210 end -
branches/telle/RWTHMindstormsNXT/@NXTmotor/stop.m
r218 r246 25 25 withBrake = 1; 26 26 end 27 data = obj.data(); 27 28 28 NXT_SetOutputState(... 29 data.port, ... % Port29 obj.port, ... % Port 30 30 0, ... % Power 31 31 withBrake, ... % IsMotorOn -
branches/telle/RWTHMindstormsNXT/@NXTmotor/subsasgn.m
r218 r246 50 50 51 51 Index = Struct(1).subs{:}; 52 set(obj(Index), Struct(2).subs,Value);52 obj(Index) = set(obj(Index), Struct(2).subs,Value); 53 53 else 54 54 if strcmp(Struct(1).type,'.') 55 set(obj, Struct(1).subs, Value);55 obj = set(obj, Struct(1).subs, Value); 56 56 elseif strcmp(Struct(1).type,'()') 57 57 obj(Struct(1).subs{:}) = Value; -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/NXTmotorsettings.m
r222 r246 29 29 30 30 if nargin > 0 && isa(varargin{1}, 'NXTmotorsettings') 31 tmp = varargin{1}; 32 data = tmp.data(); 33 for k = 1:length(data.motors) 34 data.motors(k) = NXTmotor(data.motors(k)); 35 end 31 obj = varargin{1}; 36 32 else 37 33 useMotors = []; 38 data = [];39 34 40 35 if nargin > 0 … … 81 76 82 77 for k = 1:length(useMotors) 83 data.motors(k) = NXTmotor(useMotors(k));78 obj.motors(k) = NXTmotor(useMotors(k)); 84 79 end 85 80 else 86 81 for k = 1:3 87 data.motors(k) = NXTmotor(k-1);82 obj.motors(k) = NXTmotor(k-1); 88 83 end 89 84 end 90 85 end 91 86 92 obj.data = @dataClosure;93 94 87 obj = class(obj, 'NXTmotorsettings'); 95 88 96 89 if nargin > 1 97 applyProperties(obj, varargin(2:end));90 obj = applyProperties(obj, varargin(2:end)); 98 91 end 99 100 % Nested functions101 function val = dataClosure()102 val = data;103 end104 92 105 93 end -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/display.m
r222 r246 16 16 17 17 if isscalar(obj) 18 data = obj.data(); 19 for k = 1:length(data.motors) 20 display(data.motors(k)); 18 for k = 1:length(obj.motors) 19 display(obj.motors(k)); 21 20 end 22 21 else -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/get.m
r222 r246 24 24 return; 25 25 end 26 data = obj.data();27 26 28 val = cell(length( data.motors), 1);29 for k = 1:length( data.motors)30 val{k} = get( data.motors(k), prop);27 val = cell(length(obj.motors), 1); 28 for k = 1:length(obj.motors) 29 val{k} = get(obj.motors(k), prop); 31 30 end 32 31 -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/length.m
r222 r246 12 12 'No NXTmotorsettings object.'); 13 13 end 14 data = obj.data();15 l = length(data.motors);16 14 15 l = length(obj.motors); 16 -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/private/applyProperties.m
r243 r246 1 function applyProperties(obj, settings)1 function obj = applyProperties(obj, settings) 2 2 3 3 propertyArgIn = settings; 4 data = obj.data(); 4 5 5 while length(propertyArgIn) >= 2 6 6 prop = propertyArgIn{1}; … … 12 12 end 13 13 14 % if character string is provided, stuff it into a cell. 15 % Only for the Port property this is allowed 14 16 if ischar(val) && (strcmp(prop,'Port') == 0) 15 17 val = {val}; … … 18 20 switch prop 19 21 case 'Port' 20 setProperty( data.motors,'Port', val);22 setProperty('Port', val); 21 23 case 'Power' 22 setProperty( data.motors,'Power', val);24 setProperty('Power', val); 23 25 case 'Brake' 24 setProperty( data.motors,'Brake', val);26 setProperty('Brake', val); 25 27 case 'TachoLimit' 26 setProperty( data.motors,'TachoLimit', val);28 setProperty('TachoLimit', val); 27 29 case 'RegulationMode' 28 setProperty( data.motors,'RegulationMode', val);30 setProperty('RegulationMode', val); 29 31 case 'TurnRatio' 30 setProperty( data.motors,'TurnRatio', val);32 setProperty('TurnRatio', val); 31 33 case 'RunState' 34 % DO WE WANT THIS ??? 32 35 for k = 1:numel(val) 33 36 if strcmpi(val{k},'idle') … … 37 40 end 38 41 end 39 setProperty( data.motors,'RunState', val);40 setProperty( data.motors,'MotorOn', motorOn);42 setProperty('RunState', val); 43 setProperty('MotorOn', motorOn); 41 44 case 'MotorOn' 42 setProperty( data.motors,'MotorOn', val);45 setProperty('MotorOn', val); 43 46 otherwise 44 47 error('Unsupported property %s', prop); … … 46 49 end 47 50 48 end 51 obj = checkForSyncedMotors(obj); 52 return 49 53 50 %-------------------------------------------------------------------------- 51 function setProperty(motors, prop, val) 54 % NESTED FUNCTION HAS ACCESS TO obj ---------------------------------- 55 function setProperty(prop, val) 56 57 if numel(val) == 1 58 val = repmat(val, size(obj.motors)); 59 elseif numel(val) ~= numel(obj.motors) 60 error('MotorSettingsError:InvalidParameterSize',... 61 'Number of elements must be 1 or the number of motors.'); 62 end 52 63 53 if numel(val) == 1 54 val = repmat(val, size(motors)); 55 elseif numel(val) ~= numel(motors) 56 error('MotorSettingsError:InvalidParameterSize',... 57 'Number of elements must be 1 or the number of motors.'); 58 end 64 if strcmp(prop,'RegulationMode') == 1 65 % if one cell, there have to be exactly two motors in this 66 % settings object. if this is the case, sync with the settings 67 % of the latter 68 % if array with more cells, check, whether 69 70 motorsToSync = []; 71 for index = 1:length(val) 72 if strcmp(val{index}, 'sync') 73 motorsToSync = [motorsToSync index]; 74 end 75 end 76 77 % Check, that there are exactly two motors to sync 78 if ~isempty(motorsToSync) && length(motorsToSync) ~= 2 79 error('RWTHMINDSTORMS:NXTmotorsettings:InvalidSyncCount',... 80 'The number of motors to sync is not 2.'); 81 end 82 end 59 83 60 if iscell(val) 61 for k = 1:length(motors) 62 set(motors(k), prop, val{k}); 63 end 64 else 65 for k = 1:length(motors) 66 set(motors(k), prop, val(k)); 84 if iscell(val) 85 for m = 1:length(obj.motors) 86 obj.motors(m) = set(obj.motors(m), prop, val{m}); 87 end 88 else 89 for m = 1:length(obj.motors) 90 obj.motors(m) = set(obj.motors(m), prop, val(m)); 91 end 92 end 67 93 end 68 94 end 69 95 70 end -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/read.m
r222 r246 16 16 end 17 17 18 data = obj.data();19 18 for k = 1:length(data.motors) 20 settings(k) = read( data.motors(k));19 settings(k) = read(obj.motors(k)); 21 20 end -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/reset.m
r222 r246 30 30 end 31 31 32 data = obj.data();33 32 if numel(type) == 1 34 type = repmat(type, size( data.motors));35 elseif numel(type) ~= numel( data.motors)33 type = repmat(type, size(obj.motors)); 34 elseif numel(type) ~= numel(obj.motors) 36 35 error('MotorSettingsError:InvalidParameterSize',... 37 36 'Number of elements must be 1 or the number of motors.'); 38 37 end 39 38 40 for k = 1:length( data.motors)41 reset( data.motors(k), type{k});39 for k = 1:length(obj.motors) 40 reset(obj.motors(k), type{k}); 42 41 end 43 42 -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/send.m
r222 r246 16 16 end 17 17 18 data = obj.data();19 18 20 out = zeros(size( data.motors));21 for k = 1:length( data.motors)22 out(k) = send( data.motors(k));19 out = zeros(size(obj.motors)); 20 for k = 1:length(obj.motors) 21 out(k) = send(obj.motors(k)); 23 22 end 24 23 -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/set.m
r222 r246 1 function set( obj, varargin )1 function obj = set( obj, varargin ) 2 2 % SET Configure or display properties of the unterlying NXTmotor objects. 3 3 % … … 21 21 % Examples: 22 22 % ms = NXTmotorsettings('AB'); 23 % set(ms) % Display all configurable properties and their possible 24 % % values 25 % set(ms, 'Power', [80, 20]); % Set Power of A to 80 and Power 23 % ms = set(ms, 'Power', [80, 20]); % Set Power of A to 80 and Power 26 24 % % of B to 20 27 25 % ms.RegulationMode = 'speed'; % Set Regulation mode for A and … … 34 32 35 33 if ~isa(obj,'NXTmotorsettings') 36 error('RWTHMINDSTORMS:NXTmotor :InvalidObject',...34 error('RWTHMINDSTORMS:NXTmotorsettings:InvalidObject',... 37 35 'No NXTmotorsettings object.'); 38 36 end 39 37 40 applyProperties(obj, varargin); 38 if nargout == 0 39 error('RWTHMINDSTORMS:NXTmotorsettings:InvalidUseOfSet',... 40 'No output argument supplied to set.'); 41 end 42 43 obj = applyProperties(obj, varargin); -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/stop.m
r222 r246 27 27 end 28 28 29 data = obj.data();30 31 29 if numel(withBrake) == 1 32 withBrake = repmat(withBrake, size( data.motors));33 elseif numel(withBrake) ~= numel( data.motors)30 withBrake = repmat(withBrake, size(obj.motors)); 31 elseif numel(withBrake) ~= numel(obj.motors) 34 32 error('MotorSettingsError:InvalidParameterSize',... 35 33 'Number of elements must be 1 or the number of motors.'); 36 34 end 37 35 38 for k = 1:length( data.motors)39 stop( data.motors(k), withBrake{k});36 for k = 1:length(obj.motors) 37 stop(obj.motors(k), withBrake{k}); 40 38 end 41 39 -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/subsasgn.m
r222 r246 32 32 end 33 33 34 data = obj.data();35 36 34 if StructLength == 2 37 35 if (strcmp(Struct(1).type,'()') == 0) || (strcmp(Struct(2).type,'.') == 0) … … 40 38 41 39 Index = Struct(1).subs{:}; 42 set(data.motors(Index), Struct(2).subs, Value);40 obj.motors(Index) = set(obj.motors(Index), Struct(2).subs, Value); 43 41 else 44 42 if strcmp(Struct(1).type,'.') 45 set(obj, Struct(1).subs, Value);43 obj = set(obj, Struct(1).subs, Value); 46 44 elseif strcmp(Struct(1).type,'()') 47 data.motors(Struct(1).subs{:}) = Value;45 obj.motors(Struct(1).subs{:}) = Value; 48 46 else 49 47 error('RWTHMINDSTORMS:motor:unsupportedSubscript','Unsupported subscription'); 50 48 end 51 49 end 50 obj = checkForSyncedMotors(obj); 52 51 -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/subsref.m
r222 r246 29 29 end 30 30 31 data = obj.data();32 33 31 if StructLength == 2 34 32 if (strcmp(Struct(1).type,'()') == 0) || (strcmp(Struct(2).type,'.') == 0) … … 37 35 38 36 Index = Struct(1).subs{:}; 39 result = get( data.motors(Index), Struct(2).subs);37 result = get(obj.motors(Index), Struct(2).subs); 40 38 else 41 39 if strcmp(Struct(1).type,'.') 42 40 result = get(obj, Struct(1).subs); 43 41 elseif strcmp(Struct(1).type,'()') 44 result = data.motors(Struct(1).subs{:});42 result = obj.motors(Struct(1).subs{:}); 45 43 else 46 44 error('RWTHMINDSTORMS:NXTmotorsettings:unsupportedSubscript','Unsupported subscription'); -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/sync.m
r222 r246 1 function sync(obj, motorsToSync)1 function obj = sync(obj, motorsToSync) 2 2 % SYNC Synchronize two motors 3 3 % … … 32 32 end 33 33 34 data = obj.data();35 34 motorIndex = []; 35 syncMotorPorts =[]; 36 36 37 37 if (exist('motorsToSync', 'var')) 38 if (length( data.motors) >= 2)38 if (length(obj.motors) >= 2) 39 39 if length(motorsToSync) == 2 40 40 if motorsToSync(1) ~= motorsToSync(2) … … 43 43 switch lower(motorsToSync(k)) 44 44 case 'a' 45 motorIndex(end+1) = 0;45 syncMotorPorts(end+1) = 0; 46 46 case 'b' 47 motorIndex(end+1) = 1;47 syncMotorPorts(end+1) = 1; 48 48 case 'c' 49 motorIndex(end+1) = 2;49 syncMotorPorts(end+1) = 2; 50 50 otherwise 51 51 error('Unsupported motor identifier %s', motorsToSync(k)); … … 54 54 elseif isnumeric(motorsToSync) 55 55 for k = 1:length(motorsToSync) 56 if (motorsToSync(k) >= 0 && motorsToSync <= 2)57 motorIndex(end+1) = motorsToSync(k);56 if (motorsToSync(k) >= 0 && motorsToSync(k) <= 2) 57 syncMotorPorts(end+1) = motorsToSync(k); 58 58 else 59 59 error('Unsupported motor port number %d', motorsToSync(k)); … … 73 73 74 74 % check, whether the selected motors are present 75 for k = motorIndex76 for m = 1:length( data.motors)77 port = get( data.motors(m), 'Port');75 for k = syncMotorPorts 76 for m = 1:length(obj.motors) 77 port = get(obj.motors(m), 'Port'); 78 78 if port == k 79 79 motorIndex(end+1) = m; … … 89 89 'The number of motors in the NXTmotorsettings object must be at least 2.'); 90 90 end 91 elseif (length(obj.motors) == 2) 92 syncMotors([1,2]); 91 93 else 92 if (length(data.motors) == 2) 93 syncMotors([1,2]); 94 else 95 error('RWTHMINDSTORMS:NXTmotorsettings:InvalidSyncCount',... 96 'The number of motors to sync is not 2.'); 94 error('RWTHMINDSTORMS:NXTmotorsettings:InvalidSyncCount',... 95 'The number of motors to sync is not 2.'); 96 end 97 98 return 99 100 101 function syncMotors(index) 102 val = {}; 103 for m = 1:length(obj.motors) 104 if valueInArray(m,index) 105 val(m) = {'sync'}; 106 else 107 v = get(obj.motors(m), 'RegulationMode'); 108 if strcmp(v,'sync') 109 v = 'idle'; 110 end 111 val(m) = {v}; 112 end 113 end 114 obj = set(obj, 'RegulationMode', val); 115 end 116 117 end 118 119 function isInArray = valueInArray(val, arr) 120 for m = 1:length(arr) 121 if val == arr(m) 122 isInArray = 1; 123 return; 97 124 end 98 125 end 99 100 function syncMotors(index) 101 set(data.motors(index(1)), 'RegulationMode', 'sync'); 102 set(data.motors(index(2)), 'RegulationMode', 'sync'); 103 104 set(data.motors(index(1)), 'Power', get(data.motors(index(2)), 'Power')); 105 set(data.motors(index(1)), 'MotorOn', get(data.motors(index(2)), 'MotorOn')); 106 set(data.motors(index(1)), 'Brake', get(data.motors(index(2)), 'Brake')); 107 set(data.motors(index(1)), 'TurnRatio', get(data.motors(index(2)), 'TurnRatio')); 108 set(data.motors(index(1)), 'RunState', get(data.motors(index(2)), 'RunState')); 109 set(data.motors(index(1)), 'TachoLimit', get(data.motors(index(2)), 'TachoLimit')); 110 end 126 isInArray = 0; 111 127 end -
branches/telle/RWTHMindstormsNXT/@NXTmotorsettings/wait.m
r222 r246 36 36 timedOut = zeros(size(obj.motors)); 37 37 38 data = obj.data();39 40 38 if ~exist('timeout','var') 41 timeout = zeros(size( data.motors));39 timeout = zeros(size(obj.motors)); 42 40 elseif numel(timeout) == 1 43 timeout = repmat(timeout, size( data.motors));44 elseif numel(timeout) ~= numel( data.motors)41 timeout = repmat(timeout, size(obj.motors)); 42 elseif numel(timeout) ~= numel(obj.motors) 45 43 error('MotorSettingsError:InvalidParameterSize',... 46 44 'Number of elements must be 1 or the number of motors.'); … … 48 46 49 47 for k = 1:length(obj.motors) 50 timedOut(k) = wait( data.motors(k), timeout(k));48 timedOut(k) = wait(obj.motors(k), timeout(k)); 51 49 end
