1 /*
2  * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
3  * Copyright (c) 2014 Intel Corporation.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 #pragma once
25 
26 #include <string>
27 #include <mraa/aio.hpp>
28 
29 #include <mraa/gpio.hpp>
30 #include <mraa/spi.hpp>
31 
32 #define HIGH                    1
33 #define LOW                     0
34 
35 namespace upm {
36 
37 /**
38  * @brief MAX5487 Digital Potentiometer library
39  * @defgroup max5487 libupm-max5487
40  * @ingroup maxim spi digipot
41  */
42 /**
43  * @library max5487
44  * @sensor max5487
45  * @comname MAX5487 Digital Potentiometer
46  * @type digipot
47  * @man maxim
48  * @con spi
49  *
50  * @brief API for the MAX5487 SPI Digital Potentiometer
51  *
52  * Maxim Integrated*
53  * [MAX5487](http://datasheets.maximintegrated.com/en/ds/MAX5487-MAX5489.pdf)
54  * is a dual, 256-tap, nonvolatile, SPI, linear-taper digital
55  * potentiometer. This module was tested on the  Maxim Integrated [MAX5487PMB1
56  * PMOD module](http://datasheets.maximintegrated.com/en/ds/MAX5487PMB1.pdf)
57  * from the analog PMOD kit.
58  *
59  * @snippet max5487.cxx Interesting
60  */
61 class MAX5487 {
62     public:
63         static const uint8_t R_WR_WIPER_A   = 0x01;
64         static const uint8_t R_WR_WIPER_B   = 0x02;
65 
66         /**
67          * Instantiates an MAX5487 object
68          *
69          * @param csn CSN to use, if any; by default, ICSP CS (-1) is used
70          */
71         MAX5487 (int csn = -1);
72 
73         /**
74          * MAX5487 object destructor, closes all IO connections
75          * no more needed as the connections will be closed when
76          * m_spi and m_csnPinCtx will go out of scope
77          * ~MAX5487 ();
78          **/
79 
80         /**
81          * Sets a wiper for port A.
82          */
83         void setWiperA (uint8_t wiper);
84 
85         /**
86          * Sets a wiper for port B.
87          */
88         void setWiperB (uint8_t wiper);
89 
90         /**
91          * Returns the name of the component
92          */
name()93         std::string name()
94         {
95             return m_name;
96         }
97     private:
98         std::string m_name;
99         mraa::Spi        m_spi;
100         mraa::Gpio       m_csnPinCtx;
101 
102         /**
103          * Sets the chip select pin to LOW
104          */
105         mraa::Result CSOn ();
106 
107         /**
108          * Sets the chip select pin to HIGH
109          */
110         mraa::Result CSOff ();
111 };
112 
113 }
114