classdef RitecRpr4000 < handle % RitecRpr4000 Control class for the RITEC RPR4000 unit (version 0.1020140721). % Simplifies external PC control for the RITEC RPR4000 unit, including checking for: % - Over voltage condition; % - Parameter bounds; % - Parameter changes. % This documentation is not complete. If adding to the documentation, please follow the format described in: % http://www.mathworks.co.uk/help/matlab/matlab_prog/create-help-for-classes.html % % RitecRpr4000 Copyright: % % Copyright (c) 2013, Phillip Anthony Petcher % All rights reserved. % % Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: % % - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. % - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. % % THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. % % RitecRpr4000 Properties: % Frequency - pulse frequency (MHz). 0.03MHz >= Frequency (float) >= 21.999999MHz % Cycles - pulse cycles. 0 > Cycles (integer) >= 4444 % PulseWidth - pulse width ( = Cycles / Frequency ). 0.0mus > PulseWidth (float) >= 200.0mus % Tracking - automatic or manual control of RF gain and bias level. Tracking (char) = 'Y' or 'N' % Control - level of RF gain and bias level when tracking is automatic. 0 >= Control (integer) >= 100 % Rf - RF gain (V) if tracking is manual. 0.0V > Rf (float) >= 4.99V % Bias - bias level (V) if tracking is manual. 0V > Bias (float) >= 4.99V % Input - receiver input currently active (enter as character, '1', '2', or 'A' for alternating). Input (char) = '1' or '2' or 'A' % Gain - receiver gain (dB). 20.0dB > Gain (float) >= 99.9dB % HpFilter - high-pass filter setting (see RITEC documentation). HpFilter (integer) = 1 or 2 or 3 or 4 % LpFilter - low-pass filter setting (see RITEC documentation). LpFilter (integer) = 1 or 2 or 3 or 4 % Trigger - pulse trigger source (enter as character, 'I' for internal, 'E' for external, or 'C' for RS232 port). Trigger (char) = 'I' or 'E' or 'C' % RepRate - pulse repetition rate (Hz) - see the RITEC documentation for acceptable values. 0.080Hz > RepRate (float) >= 10000.000Hz % Mode - console update mode, UPDATE or PASSTHRU. Mode (string) = 'UP:' or 'PS:' % OverVoltagePoweredDown - if the RITEC is powered down due to an over voltage condition, this is set to true, and it remains that way unless the user changes it directly, or a control change occurs. % SaveProgram - (set only) - saves the current settings to the RITEC (0-9). 0 >= SaveProgram (integer) >= 9 % LoadProgram - (set only) - loads saved settings from the RITEC (0-9). 0 >= LoadProgram (integer) >= 9 % Keypad - (set only) - if the keypad should be locked ('KL:') or unlocked ('KU:'). Keypad (string) = 'KL:' or 'KU:' % BurstPeakVolts - (get only) - the burst peak voltage (V) - if this exceeds 1000V, the unit will enter a warning state. 0 >= BurstPeakVolts (integer) >= 9999 % OverVoltage - (get only) - if the RITEC unit is currently in an over voltage state. OverVoltage (boolean) = true or false % Connected - (get only) - if a RITEC unit is currently connected. Connected (boolean) = true or false % ComPort - (get only) - the COM port the RITEC unit is connected via. 1 >= ComPort (integer) >= 16 % SerialPort - (get only) - the serial port object for the RITEC connection. % Retries - how many attempts to make when changing a parameter before it is considered a failure. 1 >= Retries (integer) >= 100 % % RitecRpr4000 Methods: % RitecRpr4000(Port) - constructs the control class, and connects to the RITEC on the specified COM Port. 1 >= Port (integer) >= 16 % Connect(Port) - connects to the RITEC on the specified COM Port (it will disconnect first if already connected). 1 >= Port (integer) >= 16 % Disconnect() - disconnects the RITEC from the COM port and deletes the serial port object. % PowerDown() - sets the Ritec control setting to 0 after setting the tracking setting to 'Y'. % ExternalComputerTrigger() - triggers the pulse if trigger set to 'C'. % Defaults() - set the RITEC to safe defaults (it is useful to return to a known safe state before disconnecting). % SetParameters(Settings) - set the RITEC to the values provided in the Settings structure, e.g. Settings.Frequency = 1.0, Settings.Cycles = 3. % Settings = GetParameters() - get the RITEC settings and return them in a structure, e.g. Settings.Frequency = 1.0, Settings.Cycles = 3. % Settings = Filters() - get the RITEC filter options and return them in a structure, e.g. Settings(1).Lp = Frequency, Settings.Hp = Frequency. All frequencies are given in MHz. % delete(obj) - destructs the control class, and disconnects the RITEC from the COM port. %% RITEC control properties - set/get methods available. properties Retries = 3; % How many attempts to make when changing a parameter before it is considered a failure. 1 >= Retries (integer) >= 100 Frequency; % Pulse frequency (MHz). 0.03MHz >= Frequency (float) >= 21.999999MHz Cycles; % Pulse cycles. 0 > Cycles (integer) >= 4444 PulseWidth; % Pulse width ( = Cycles / Frequency ). 0.0mus > PulseWidth (float) >= 200.0mus Tracking; % Automatic or manual control of RF gain and bias level. Tracking (char) = 'Y' or 'N' Control; % Level of RF gain and bias level when tracking is automatic. 0 >= Control (integer) >= 100 Rf; % RF gain (V) if tracking is manual. 0.0V > Rf (float) >= 4.99V Bias; % Bias level (V) if tracking is manual. 0V > Bias (float) >= 4.99V Input; % Receiver input currently active (enter as character, '1', '2', or 'A' for alternating). Input (char) = '1' or '2' or 'A' Gain; % Receiver gain (dB). 20.0dB > Gain (float) >= 99.9dB HpFilter; % High-pass filter setting (see RITEC documentation). HpFilter (integer) = 1 or 2 or 3 or 4 LpFilter; % Low-pass filter setting (see RITEC documentation). LpFilter (integer) = 1 or 2 or 3 or 4 Trigger; % Pulse trigger source (enter as character, 'I' for internal, 'E' for external, or 'C' for RS232 port). Trigger (char) = 'I' or 'E' or 'C' RepRate; % Pulse repetition rate (Hz) - see the RITEC documentation for acceptable values. 0.080Hz > RepRate (float) >= 10000.000Hz Mode; % Console update mode, UPDATE or PASSTHRU. Mode (string) = 'UP:' or 'PS:' OverVoltagePoweredDown = false; % If the RITEC is powered down due to an over voltage condition, this is set to true, and it remains that way unless the user changes it directly, or a control change occurs. end %% RITEC control properties - only set methods available. properties (GetAccess = private) SaveProgram; % (NOT USER GETTABLE - SET ONLY) Saves the current settings to the RITEC (0-9). 0 >= SaveProgram (integer) >= 9 LoadProgram; % (NOT USER GETTABLE - SET ONLY) Loads saved settings from the RITEC (0-9). 0 >= LoadProgram (integer) >= 9 Keypad; % (NOT USER GETTABLE - SET ONLY) If the keypad should be locked ('KL:') or unlocked ('KU:'). Keypad (string) = 'KL:' or 'KU:' end %% RITEC control properties - only get methods available. properties (SetAccess = private) BurstPeakVolts; % (NOT USER SETTABLE - GET ONLY) Burst peak voltage (V) - if this exceeds 1000V, the unit will enter a warning state. 0 >= BurstPeakVolts (integer) >= 9999 OverVoltage; % (NOT USER SETTABLE - USE GET AND PowerDown METHODS) If the RITEC unit is currently in an over voltage state. OverVoltage (boolean) = true or false Connected = false; % (NOT USER SETTABLE - USE CONSTRUCTOR/DESTRUCTOR OR Connect AND Disconnect METHODS) If a RITEC unit is currently connected. Connected (boolean) = true or false ComPort = []; % (NOT USER SETTABLE - USE CONSTRUCTOR/DESTRUCTOR OR Connect AND Disconnect METHODS) The COM port the RITEC unit is connected via. 1 >= ComPort (integer) >= 16 SerialPort = []; % (NOT USER SETTABLE - USE CONSTRUCTOR/DESTRUCTOR OR Connect AND Disconnect METHODS) The serial port object for the RITEC connection. end %% Public methods (accessible by users of the class) methods %% Constructor function obj = RitecRpr4000(Port) % Constructs the control class, and connects to the RITEC on the specified COM Port. % 1 >= Port (integer) >= 16 obj.Connect(Port); end %% Destructor function delete(obj) % Destructs the control class, and disconnects the RITEC from the COM port. Disconnect(obj); delete(obj.SerialPort); end %% Public methods function Connect(obj,Port) % Connects to the RITEC on the specified COM Port (it will disconnect first if already connected). % 1 >= Port (integer) >= 16 if obj.Connected obj.Disconnect(); obj.Connect(Port); elseif (length(Port) == 1) && isreal(Port) && (floor(Port) == ceil(Port)) && (Port >= 0) && (Port <= 16) obj.ComPort = ['COM' sprintf('%u',Port)]; obj.SerialPort = serial(obj.ComPort,'BaudRate',57600,'DataBits',8,'StopBits',1,'Parity','none','FlowControl','none','Terminator','CR'); fopen(obj.SerialPort); obj.Connected = true; else error('RitecRpr4000:PortIncorrect','The COM port entered for the RITEC remote control is outside of valid bounds.'); end end function Disconnect(obj) % Disconnects the RITEC from the COM port. fclose(obj.SerialPort); obj.Connected = false; end function PowerDown(obj) % Sets the Ritec control setting to 0 after setting the tracking setting to 'Y'. obj.Tracking = 'Y'; obj.Control = 0; end function ExternalComputerTrigger(obj) % Triggers the pulse if trigger set to 'C'. if ~ChangeParameter(obj,'CT:'); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end end function Defaults(obj) % Set the RITEC to safe defaults (it is useful to return to a known safe state before disconnecting). obj.Mode = 'UP:'; obj.Tracking = 'Y'; obj.Control = 0; obj.Trigger = 'I'; obj.Frequency = 0.3; obj.Cycles = 3; obj.RepRate = 1.0; obj.Input = '2'; obj.Gain = 30.0; obj.HpFilter = 1; obj.LpFilter = 1; obj.Input = '1'; obj.Gain = 30.0; obj.HpFilter = 1; obj.LpFilter = 1; obj.Keypad = 'KU:'; end function SetParameters(obj,Settings) % Set the RITEC to the values provided in the Settings structure, e.g. Settings.Frequency = 1.0, Settings.Cycles = 3. if ~isempty(Settings) if isfield(Settings,'Mode') obj.Mode = Settings.Mode; end if isfield(Settings,'Tracking') obj.Tracking = Settings.Tracking; end if isfield(Settings,'Control') obj.Control = Settings.Control; end if isfield(Settings,'Trigger') obj.Trigger = Settings.Trigger; end if isfield(Settings,'Frequency') obj.Frequency = Settings.Frequency; end if isfield(Settings,'Cycles') obj.Cycles = Settings.Cycles; end if isfield(Settings,'RepRate') obj.RepRate = Settings.RepRate; end if isfield(Settings,'Input') obj.Input = Settings.Input; end if isfield(Settings,'Gain') obj.Gain = Settings.Gain; end if isfield(Settings,'HpFilter') obj.HpFilter = Settings.HpFilter; end if isfield(Settings,'LpFilter') obj.LpFilter = Settings.LpFilter; end if isfield(Settings,'Keypad') obj.Keypad = Settings.Keypad; end end end function Settings = GetParameters(obj) % Get the RITEC settings and return them in a structure, e.g. Settings.Frequency = 1.0, Settings.Cycles = 3. Settings.Mode = obj.Mode; Settings.Tracking = obj.Tracking; Settings.Control = obj.Control; Settings.Trigger = obj.Trigger; Settings.Frequency = obj.Frequency; Settings.Cycles = obj.Cycles; Settings.RepRate = obj.RepRate; Settings.Input = obj.Input; Settings.Gain = obj.Gain; Settings.HpFilter = obj.HpFilter; Settings.LpFilter = obj.LpFilter; Settings.BurstPeakVolts = obj.BurstPeakVolts; end function Settings = Filters(obj) % Get the RITEC filter options and return them in a structure, e.g. Settings(1).Lp = Frequency, Settings.Hp = Frequency. All frequencies are given in MHz. Lp = obj.LpFilter; Hp = obj.HpFilter; FoundLp = false; FoundHp = false; Settings.Lp = zeros(4,1); Settings.Hp = zeros(4,1); for Choice=1:1:4 obj.LpFilter = Choice; obj.HpFilter = Choice; Current = obj.LpFilter; if strcmp(Current((end-2):1:end),'MHZ') Settings.Lp(Choice) = sscanf(Current(1:1:(end-2)),'%f'); elseif strcmp(Current((end-2):1:end),'KHZ') Settings.Lp(Choice) = sscanf(Current(1:1:(end-2)),'%f').*0.001; else warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end if ~FoundLp&&strcmp(Lp,Current) FoundLp = true; Lp = Choice; end Current = obj.HpFilter; if strcmp(Current((end-2):1:end),'MHZ') Settings.Hp(Choice) = sscanf(Current(1:1:(end-2)),'%f'); elseif strcmp(Current((end-2):1:end),'KHZ') Settings.Hp(Choice) = sscanf(Current(1:1:(end-2)),'%f').*0.001; else warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end if ~FoundHp&&strcmp(Hp,Current) FoundHp = true; Hp = Choice; end end obj.LpFilter = Lp; obj.HpFilter = Hp; end %% Set/Get methods for properties function set.Retries(obj,Value) if (Value >= 1) && (Value <= 100) obj.Retries = floor(Value); else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function set.Frequency(obj,Value) if (Value >= 0.03) && (Value <= 21.999999) if ~ChangeParameter(obj,['FR:' sprintf('%09.6f',Value)],'FR:?'); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.Frequency(obj) Result = CheckParameter(obj,'FR:?'); if strcmp(Result(1:1:3),'FR:') && (length(Result) == 12) Value = sscanf(Result(4:1:end),'%f'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.Cycles(obj,Value) if (Value > 0) && (Value <= 4444) if ~ChangeParameter(obj,['CY:' sprintf('%04u',floor(Value))],'CY:?'); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.Cycles(obj) Result = CheckParameter(obj,'CY:?'); if strcmp(Result(1:1:3),'CY:') && (length(Result) == 7) Value = sscanf(Result(4:1:end),'%f'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.PulseWidth(obj,Value) if (Value > 0.0) && (Value <= 200.0) if ~ChangeParameter(obj,['PW:' sprintf('%05.1f',Value)],'PW:?'); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.PulseWidth(obj) Result = CheckParameter(obj,'PW:?'); if strcmp(Result(1:1:3),'PW:') && (length(Result) == 8) Value = sscanf(Result(4:1:end),'%f'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.Tracking(obj,Value) if (Value == 'Y') || (Value == 'N') if ~ChangeParameter(obj,['TK:' Value],'TK:?'); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.Tracking(obj) Result = CheckParameter(obj,'TK:?'); if strcmp(Result(1:1:3),'TK:') && (length(Result) == 4) Value = sscanf(Result(4),'%s'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.Control(obj,Value) if (Value >= 0) && (Value <= 100) if ~ChangeParameter(obj,['CO:' sprintf('%03u',floor(Value))],'CO:?'); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.Control(obj) Result = CheckParameter(obj,'CO:?'); if strcmp(Result(1:1:3),'CO:') && (length(Result) == 6) Value = sscanf(Result(4:1:end),'%f'); if Value > 0 obj.OverVoltagePoweredDown = false; end else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.Rf(obj,Value) if (Value > 0) && (Value <= 4.99) if ~ChangeParameter(obj,['RF:' sprintf('%04.2f',Value)],'RF:?'); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.Rf(obj) Result = CheckParameter(obj,'RF:?'); if strcmp(Result(1:1:3),'RF:') && (length(Result) == 7) Value = sscanf(Result(4:1:end),'%f'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.Bias(obj,Value) if (Value > 0) && (Value <= 4.99) if ~ChangeParameter(obj,['BI:' sprintf('%04.2f',Value),'BI:?']); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.Bias(obj) Result = CheckParameter(obj,'BI:?'); if strcmp(Result(1:1:3),'BI:') && (length(Result) == 7) Value = sscanf(Result(4:1:end),'%f'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.Input(obj,Value) if (Value == '1') || (Value == '2') || (Value == 'A') if ~ChangeParameter(obj,['IN:' Value],'IN:?'); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range. Note that value must be entered as a character, "1", "2", or "A".'); end end function Value = get.Input(obj) Result = CheckParameter(obj,'IN:?'); if strcmp(Result(1:1:3),'IN:') && (length(Result) == 4) Value = sscanf(Result(4:1:end),'%s'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.Gain(obj,Value) if (Value >= 20.0) && (Value <= 99.9) if ~ChangeParameter(obj,['GA:' sprintf('%04.1f',Value)],'GA:?'); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.Gain(obj) Result = CheckParameter(obj,'GA:?'); if strcmp(Result(1:1:3),'GA:') && (length(Result) == 7) Value = sscanf(Result(4:1:end),'%f'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.HpFilter(obj,Value) if (Value == 1) || (Value == 2) || (Value == 3) || (Value == 4) if ~ChangeParameter(obj,['HF:' sprintf('%1u',Value)]); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.HpFilter(obj) Result = CheckParameter(obj,'HF:?'); if strcmp(Result(1:1:3),'HF:') Value = sscanf(Result(4:1:end),'%s'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.LpFilter(obj,Value) if (Value == 1) || (Value == 2) || (Value == 3) || (Value == 4) if ~ChangeParameter(obj,['LF:' sprintf('%1u',Value)]); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.LpFilter(obj) Result = CheckParameter(obj,'LF:?'); if strcmp(Result(1:1:3),'LF:') Value = sscanf(Result(4:1:end),'%s'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.Trigger(obj,Value) if (Value == 'I') || (Value == 'E') || (Value == 'C') if ~ChangeParameter(obj,['TG:' Value]); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.Trigger(obj) Result = CheckParameter(obj,'TG:?'); if length(Result) == 6 Value = sscanf(Result(4:1:6),'%s'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.RepRate(obj,Value) if (Value >= 0.080) && (Value <= 10000.000) if ~ChangeParameter(obj,['RR:' sprintf('%09.3f',Value)],'RR:?'); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.RepRate(obj) Result = CheckParameter(obj,'RR:?'); if strcmp(Result(1:1:3),'RR:') && (length(Result) == 12) Value = sscanf(Result(4:1:end),'%f'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.SaveProgram(obj,Value) if (Value == 0) || (Value == 1) || (Value == 2) || (Value == 3) || (Value == 4) || (Value == 5) || (Value == 6) || (Value == 7) || (Value == 8) || (Value == 9) if ~ChangeParameter(obj,['SP:' sprintf('%1u',Value)]); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function set.LoadProgram(obj,Value) if (Value == 0) || (Value == 1) || (Value == 2) || (Value == 3) || (Value == 4) || (Value == 5) || (Value == 6) || (Value == 7) || (Value == 8) || (Value == 9) if ~ChangeParameter(obj,['LP:' sprintf('%1u',Value)]); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function set.Mode(obj,Value) if strcmp(Value,'UP:') || strcmp(Value,'PS:') if ~ChangeParameter(obj,Value); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.Mode(obj) Result = CheckParameter(obj,'MO:?'); if (length(Result) == 15) Value = sscanf(Result,'%s'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function set.Keypad(obj,Value) if strcmp(Value,'KL:') || strcmp(Value,'KU:') if ~ChangeParameter(obj,Value,'KS:?'); warning('RitecRpr4000:ChangeFailure','RITEC parameter change failure.'); end else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end function Value = get.Keypad(obj) Result = CheckParameter(obj,'KS:?'); if Result(1) == 'K' Value = sscanf(Result,'%s'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function Value = get.BurstPeakVolts(obj) Result = CheckParameter(obj,'BV:?'); if strcmp(Result(1:1:3),'BV:') && (length(Result) == 8) Value = sscanf(Result(4:1:end),'%f'); else Value = NaN; warning('RitecRpr4000:RequestFailure','RITEC parameter request failed.'); end end function Value = get.OverVoltage(obj) Value = false; obj.ConnectedCheck(); obj.SerialCts(); while (obj.SerialPort.BytesAvailable>0) if strcmp(fgetl(obj.SerialPort),'O.V. RESET CONT'); Value = true; end end end function set.OverVoltagePoweredDown(obj,Value) if Value obj.OverVoltagePoweredDown = true; elseif ~Value obj.OverVoltagePoweredDown = false; else warning('RitecRpr4000:OutOfRange','RITEC parameter out of range.'); end end end %% Helper methods methods (Access = private, Hidden = true) function ConnectedCheck(obj) % Checks if a RITEC unit is connected, and sends an error if it is not. if ~obj.Connected error('RitecRpr4000:NotConnected','A RITEC unit must be connected.'); end end function OverVoltageCheck(obj) % Checks if a RITEC unit is over voltage, and sends a warning if it is. if obj.OverVoltage obj.OverVoltagePoweredDown = true; obj.PowerDown(); warning('RitecRpr4000:OverVoltage','RITEC over voltage - powered down.'); end end function SerialCts(obj) % Checks if it is safe to transmit data down the serial port. pause(0.1); while strcmp(obj.SerialPort.PinStatus.ClearToSend,'off'); pause(0.1); end end function Result = CheckParameter(obj,Check) % Checks a RITEC parameter value, and returns the result. Will retry if the request times out. for Attempt = 1:1:obj.Retries obj.OverVoltageCheck(); obj.SerialCts(); tic; fprintf(obj.SerialPort,Check); obj.SerialCts(); Result = fgetl(obj.SerialPort); Time = toc; if Time < 1 break; end end end function Result = ChangeParameter(obj,Change,Check) % Changes a RITEC parameter value, checks the change if requested, and returns boolean true (change successful) or false (change unsuccessful). Will retry if the request times out. Result = false; for Attempt = 1:1:obj.Retries if ~obj.OverVoltagePoweredDown obj.OverVoltageCheck(); end obj.SerialCts(); tic; fprintf(obj.SerialPort,Change); Time = toc; if Time < 1 if nargin > 2 if strcmp(Change,obj.CheckParameter(Check)) Result = true; break; end else Result = true; break; end end end end end end