1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
## Copyright (C) 2018 John Donoghue <john.donoghue@ieee.org>
##
## This program is free software: you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program. If not, see
## <https://www.gnu.org/licenses/>.
## -*- texinfo -*-
## @deftypefn {} {@var{currmode} =} configurePin (@var{ar}, @var{pin})
## @deftypefnx {} {} configurePin (@var{ar}, @var{pin}, @var{mode})
## Set/Get pin mode for a specified pin on arduino connection.
##
## configurePin (@var{ar}, @var{pin}) will get the current mode of the specified pin.
##
## configurePin (@var{ar}, @var{pin}, @var{mode}) will attempt set the pin to the specified
## mode if the mode is unset.
##
## @subsubheading Inputs
## @var{ar} - the arduino object of the connection to an arduino board.
##
## @var{pin} - string name of the pin to set/get the mode of.
##
## @var{mode} - string mode to set the pin to.
##
## @subsubheading Outputs
## @var{mode} - string current mode of the pin.
##
## Valid modes can be:
## @itemize @bullet
## @item AnalogInput
## - Acquire analog signals from pin
## @item DigitalInput
## - Acquire digital signals from pin
## @item DigitalOutput
## - Generate digital signals from pin
## @item I2C
## - Specify a pin to use with I2C protocol
## @item Pullup
## - Specify pin to use a pullup switch
## @item PWM
## - Specify pin to use a pulse width modulator
## @item Servo
## - Specify pin to use a servo
## @item SPI
## - Specify a pin to use with SPI protocol
## @item Interrupt
## - Specify a pin to use for with interrupts
## @item Reserved
## - Specify a pin to be reserved
## @item Unset
## - Clears pin designation. The pin is no longer reserved and can be automatically
## set at the next operation.
## @end itemize
##
## @seealso{arduino}
##
## @end deftypefn
function retval = configurePin (obj, pin, mode)
persistent ARDUINO_CONFIGPIN = 2;
if nargin != 2 && nargin != 3
error ("@arduino.configurePin: expected pin name and value");
endif
if !ischar (pin) && !isnumeric (pin)
error ("@arduino.configurePin: expected pin name as string");
endif
pininfo = obj.get_pin (pin);
if nargin == 3
% set mode
if !ischar (mode)
error ("@arduino.configurePin: expected pin mode as string");
endif
mode = tolower (mode);
[pinstate, pinmode] = pinStateMode (mode);
if strcmp (pinmode,"spi")
# check special case of when pin is miso, make it an input
idx = find (cellfun(@(x) ~isempty (strfind (x, "_miso")), pininfo.modes), 1);
if !isempty (idx)
pinstate = 2;
endif
endif
% valid setting for this pin ?
if !strcmpi (mode, "unset") && !strcmp(mode, "reserved")
validatePin (obj, pin, pinmode);
else
pinmode = getResourceOwner (obj, pin);
endif
% own this pin
configurePinResource (obj, pin, pinmode, mode);
# send config command to arduino
datain = uint8 ([pininfo.id pinstate]);
[dataout, status] = __sendCommand__ (obj, 0, ARDUINO_CONFIGPIN, datain);
if status != 0
error ("@arduino.configurePin: failed to set pin state err=%d - %s", status, char(dataout));
endif
else
% get mode ?
datain = uint8 ([pininfo.id]);
[dataout, status] = __sendCommand__ (obj, 0, ARDUINO_CONFIGPIN, datain);
if status != 0
error ("@arduino.configurePin: failed to set pin state err=%d - %s", status, char(dataout));
endif
retval = pinStateMode (dataout(2));
endif
endfunction
%!test
%! ar = arduino();
%! assert(!isempty(ar));
%! configurePin(ar, "d2", "digitaloutput");
%! assert(configurePin(ar, "d2"), "digitaloutput");
%! configurePin(ar, "d2", "unset");
%! assert(configurePin(ar, "d2"), "unset");
|