From b090ca856f77d2475f93ca218acbbc0e60b9df87 Mon Sep 17 00:00:00 2001 From: Tim Stadtmann <tim.stadtmann@rwth-aachen.de> Date: Tue, 18 Oct 2016 13:30:45 +0200 Subject: [PATCH] Slave-motor now saves its master in sync mode --- source/Motor.m | 81 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 20 deletions(-) diff --git a/source/Motor.m b/source/Motor.m index 8d028f8..a0f7842 100755 --- a/source/Motor.m +++ b/source/Motor.m @@ -155,11 +155,35 @@ classdef Motor < MaskedHandle & dynamicprops end % If motor has been started synced with another, and it stopped 'itself' (when - % using a tacholimit), the sync cache has to be deleted (in general, syncedStop + % using a tacholimit), the sync cache has to be deleted (otherwise, syncedStop % would do so) if motor.isSynced - delete(motor.findprop('slave')); - motor.internalReset(); % Better safe than sorry + % Retrieve and delete former slave + if length(findprop(motor, 'slave'))==1 + syncMotor = motor.slave; + delete(motor.findprop('slave')); + delete(syncMotor.findprop('master')); + else + syncMotor = motor.master; + delete(motor.findprop('master')); + delete(syncMotor.findprop('slave')); + end + + % Reset state + motor.applyState(); + syncMotor.applyState(); + + % Send power on next set + if motor.state.sendPowerOnSet + motor.state.sendOnStart = bitset(motor.state.sendOnStart, SendOnStart.Power, 1); + end + if syncMotor.state.sendPowerOnSet + syncMotor.state.sendOnStart = bitset(syncMotor.state.sendOnStart, SendOnStart.Power, 1); + end + + % Better safe than sorry + motor.internalReset(); + syncMotor.internalReset(); end % If the motor coasts into its stops, the internal tachocount has to be reset @@ -357,18 +381,11 @@ classdef Motor < MaskedHandle & dynamicprops end end - % Cache old values to make it possible to reset them on stopSynced + % Cache old values to make it possible to reset them on syncedStop % Note: the existence of 'slave' is also used to determine whether motor is % running synchronized or not, see get.isSynced() - meta = motor.findprop('slave'); - if isempty(meta) - meta = motor.addprop('slave'); - meta.Hidden = true; - meta.Access = 'private'; - end - meta.Hidden = true; - meta.Access = 'private'; - motor.slave = syncMotor; + motor.addProperty(syncMotor, 'slave', true); + syncMotor.addProperty(motor, 'master', true); motor.saveState(); syncMotor.saveState(); @@ -411,13 +428,20 @@ classdef Motor < MaskedHandle & dynamicprops if ~motor.isSynced error('Motor::syncedStop: Motor has not been started synchronized with another.'); + else + % Retrieve synced motor from cache + if length(findprop(motor, 'slave'))==1 + syncMotor = motor.slave; + delete(motor.findprop('slave')); + delete(syncMotor.findprop('master')); + else + syncMotor = motor.master; + delete(motor.findprop('master')); + delete(syncMotor.findprop('slave')); + end end - % Retrieve synced motor from cache - syncMotor = motor.slave; - delete(motor.findprop('slave')); - - if ~motor.state.connectedToBrick || ~syncMotor.state.connectedToBrick + if ~motor.connectedToBrick || ~syncMotor.connectedToBrick error('Motor::syncedStop: Motor-Object not connected to comm handle.'); elseif ~motor.physicalMotorConnected || ~syncMotor.physicalMotorConnected error('Motor::syncedStop: No physical motor connected to either Port %s or %s.',... @@ -847,11 +871,12 @@ classdef Motor < MaskedHandle & dynamicprops end function synced = get.isSynced(motor) - synced = (length(findprop(motor, 'slave'))==1); + synced = (length(findprop(motor, 'slave'))==1 || ... + length(findprop(motor, 'master'))==1); end function motorType = get.type(motor) - if motor.state.connectedToBrick + if motor.connectedToBrick [motorType, ~] = motor.getTypeMode(); else motorType = DeviceType.Unknown; @@ -1075,6 +1100,22 @@ classdef Motor < MaskedHandle & dynamicprops motor.state = motor.savedState; delete(motor.findprop('savedState')) end + + function addProperty(motor, propValue, propName, override) + override = str2bool(override); + + meta = motor.findprop(propName); + + if isempty(meta) + meta = motor.addprop(propName); + meta.Hidden = true; + meta.Access = 'private'; + elseif ~override + error('Motor::addProperty: Motor already has this property.'); + end + + motor.(propName) = propValue; + end end methods (Access = {?EV3}) -- GitLab