File: configurePin.m

package info (click to toggle)
octave-arduino 0.12.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,616 kB
  • sloc: cpp: 3,221; python: 438; makefile: 152; xml: 22; sh: 1
file content (140 lines) | stat: -rw-r--r-- 4,198 bytes parent folder | download | duplicates (3)
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");