]> git.piffa.net Git - sketchbook_andrea/blob - libraries/CapacitiveSensor/CapacitiveSensor.h
Capacitance fir st commit,
[sketchbook_andrea] / libraries / CapacitiveSensor / CapacitiveSensor.h
1 /*
2   CapacitiveSense.h v.04 - Capacitive Sensing Library for 'duino / Wiring
3   https://github.com/PaulStoffregen/CapacitiveSensor
4   http://www.pjrc.com/teensy/td_libs_CapacitiveSensor.html
5   http://playground.arduino.cc/Main/CapacitiveSensor
6   Copyright (c) 2008 Paul Bagder  All rights reserved.
7   Version 05 by Paul Stoffregen - Support non-AVR board: Teensy 3.x, Arduino Due
8   Version 04 by Paul Stoffregen - Arduino 1.0 compatibility, issue 146 fix
9   vim: set ts=4:
10 */
11
12 // ensure this library description is only included once
13 #ifndef CapacitiveSensor_h
14 #define CapacitiveSensor_h
15
16 #if ARDUINO >= 100
17 #include "Arduino.h"
18 #else
19 #include "WProgram.h"
20 #endif
21
22 // Direct I/O through registers and bitmask (from OneWire library)
23
24 #if defined(__AVR__)
25 #define PIN_TO_BASEREG(pin)             (portInputRegister(digitalPinToPort(pin)))
26 #define PIN_TO_BITMASK(pin)             (digitalPinToBitMask(pin))
27 #define IO_REG_TYPE uint8_t
28 #define DIRECT_READ(base, mask)         (((*(base)) & (mask)) ? 1 : 0)
29 #define DIRECT_MODE_INPUT(base, mask)   ((*((base)+1)) &= ~(mask), (*((base)+2)) &= ~(mask))
30 #define DIRECT_MODE_OUTPUT(base, mask)  ((*((base)+1)) |= (mask))
31 #define DIRECT_WRITE_LOW(base, mask)    ((*((base)+2)) &= ~(mask))
32 #define DIRECT_WRITE_HIGH(base, mask)   ((*((base)+2)) |= (mask))
33
34 #elif defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK66FX1M0__) || defined(__MK64FX512__)
35 #define PIN_TO_BASEREG(pin)             (portOutputRegister(pin))
36 #define PIN_TO_BITMASK(pin)             (1)
37 #define IO_REG_TYPE uint8_t
38 #define IO_REG_ASM
39 #define DIRECT_READ(base, mask)         (*((base)+512))
40 #define DIRECT_MODE_INPUT(base, mask)   (*((base)+640) = 0)
41 #define DIRECT_MODE_OUTPUT(base, mask)  (*((base)+640) = 1)
42 #define DIRECT_WRITE_LOW(base, mask)    (*((base)+256) = 1)
43 #define DIRECT_WRITE_HIGH(base, mask)   (*((base)+128) = 1)
44
45 #elif defined(__MKL26Z64__)
46 #define PIN_TO_BASEREG(pin)             (portOutputRegister(pin))
47 #define PIN_TO_BITMASK(pin)             (digitalPinToBitMask(pin))
48 #define IO_REG_TYPE uint8_t
49 #define IO_REG_ASM
50 #define DIRECT_READ(base, mask)         ((*((base)+16) & (mask)) ? 1 : 0)
51 #define DIRECT_MODE_INPUT(base, mask)   (*((base)+20) &= ~(mask))
52 #define DIRECT_MODE_OUTPUT(base, mask)  (*((base)+20) |= (mask))
53 #define DIRECT_WRITE_LOW(base, mask)    (*((base)+8) = (mask))
54 #define DIRECT_WRITE_HIGH(base, mask)   (*((base)+4) = (mask))
55
56 #elif defined(__SAM3X8E__)
57 #define PIN_TO_BASEREG(pin)             (&(digitalPinToPort(pin)->PIO_PER))
58 #define PIN_TO_BITMASK(pin)             (digitalPinToBitMask(pin))
59 #define IO_REG_TYPE uint32_t
60 #define IO_REG_ASM
61 #define DIRECT_READ(base, mask)         (((*((base)+15)) & (mask)) ? 1 : 0)
62 #define DIRECT_MODE_INPUT(base, mask)   ((*((base)+5)) = (mask))
63 #define DIRECT_MODE_OUTPUT(base, mask)  ((*((base)+4)) = (mask))
64 #define DIRECT_WRITE_LOW(base, mask)    ((*((base)+13)) = (mask))
65 #define DIRECT_WRITE_HIGH(base, mask)   ((*((base)+12)) = (mask))
66
67 #elif defined(__PIC32MX__)
68 #define PIN_TO_BASEREG(pin)             (portModeRegister(digitalPinToPort(pin)))
69 #define PIN_TO_BITMASK(pin)             (digitalPinToBitMask(pin))
70 #define IO_REG_TYPE uint32_t
71 #define IO_REG_ASM
72 #define DIRECT_READ(base, mask)         (((*(base+4)) & (mask)) ? 1 : 0)  //PORTX + 0x10
73 #define DIRECT_MODE_INPUT(base, mask)   ((*(base+2)) = (mask))            //TRISXSET + 0x08
74 #define DIRECT_MODE_OUTPUT(base, mask)  ((*(base+1)) = (mask))            //TRISXCLR + 0x04
75 #define DIRECT_WRITE_LOW(base, mask)    ((*(base+8+1)) = (mask))          //LATXCLR  + 0x24
76 #define DIRECT_WRITE_HIGH(base, mask)   ((*(base+8+2)) = (mask))          //LATXSET + 0x28
77
78 #elif defined(ARDUINO_ARCH_ESP8266)
79 #define PIN_TO_BASEREG(pin)             (portOutputRegister(digitalPinToPort(pin)))
80 #define PIN_TO_BITMASK(pin)             (digitalPinToBitMask(pin))
81 #define IO_REG_TYPE uint32_t
82 #define IO_REG_ASM
83 #define DIRECT_READ(base, mask)         (((*(base+6)) & (mask)) ? 1 : 0)    //GPIO_IN_ADDRESS
84 #define DIRECT_MODE_INPUT(base, mask)   ((*(base+5)) = (mask))              //GPIO_ENABLE_W1TC_ADDRESS
85 #define DIRECT_MODE_OUTPUT(base, mask)  ((*(base+4)) = (mask))              //GPIO_ENABLE_W1TS_ADDRESS
86 #define DIRECT_WRITE_LOW(base, mask)    ((*(base+2)) = (mask))              //GPIO_OUT_W1TC_ADDRESS
87 #define DIRECT_WRITE_HIGH(base, mask)   ((*(base+1)) = (mask))              //GPIO_OUT_W1TS_ADDRESS
88
89 #elif defined(__SAMD21G18A__)
90 // runs extremely slow/unreliable on Arduino Zero - help wanted....
91 #define PIN_TO_BASEREG(pin)             portModeRegister(digitalPinToPort(pin))
92 #define PIN_TO_BITMASK(pin)             (digitalPinToBitMask(pin))
93 #define IO_REG_TYPE uint32_t
94 #define IO_REG_ASM
95 #define DIRECT_READ(base, mask)         (((*((base)+8)) & (mask)) ? 1 : 0)
96 #define DIRECT_MODE_INPUT(base, mask)   ((*((base)+1)) = (mask))
97 #define DIRECT_MODE_OUTPUT(base, mask)  ((*((base)+2)) = (mask))
98 #define DIRECT_WRITE_LOW(base, mask)    ((*((base)+5)) = (mask))
99 #define DIRECT_WRITE_HIGH(base, mask)   ((*((base)+6)) = (mask))
100
101 #elif defined(RBL_NRF51822)
102 #define PIN_TO_BASEREG(pin)             (0)
103 #define PIN_TO_BITMASK(pin)             (pin)
104 #define IO_REG_TYPE uint32_t
105 #define IO_REG_ASM
106 #define DIRECT_READ(base, pin)          nrf_gpio_pin_read(pin)
107 #define DIRECT_WRITE_LOW(base, pin)     nrf_gpio_pin_clear(pin)
108 #define DIRECT_WRITE_HIGH(base, pin)    nrf_gpio_pin_set(pin)
109 #define DIRECT_MODE_INPUT(base, pin)    nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL)
110 #define DIRECT_MODE_OUTPUT(base, pin)   nrf_gpio_cfg_output(pin)
111
112 #elif defined(__arc__)
113
114 #include "scss_registers.h"
115 #include "portable.h"
116 #include "avr/pgmspace.h"
117
118 #define GPIO_ID(pin)                    (g_APinDescription[pin].ulGPIOId)
119 #define GPIO_TYPE(pin)                  (g_APinDescription[pin].ulGPIOType)
120 #define GPIO_BASE(pin)                  (g_APinDescription[pin].ulGPIOBase)
121 #define DIR_OFFSET_SS                   0x01
122 #define DIR_OFFSET_SOC                  0x04
123 #define EXT_PORT_OFFSET_SS              0x0A
124 #define EXT_PORT_OFFSET_SOC             0x50
125
126 /* GPIO registers base address */
127 #define PIN_TO_BASEREG(pin)             ((volatile uint32_t *)g_APinDescription[pin].ulGPIOBase)
128 #define PIN_TO_BITMASK(pin)             pin
129 #define IO_REG_TYPE                             uint32_t
130 #define IO_REG_ASM
131
132 static inline __attribute__((always_inline))
133 IO_REG_TYPE directRead(volatile IO_REG_TYPE *base, IO_REG_TYPE pin)
134 {
135     IO_REG_TYPE ret;
136     if (SS_GPIO == GPIO_TYPE(pin)) {
137         ret = READ_ARC_REG(((IO_REG_TYPE)base + EXT_PORT_OFFSET_SS));
138     } else {
139         ret = MMIO_REG_VAL_FROM_BASE((IO_REG_TYPE)base, EXT_PORT_OFFSET_SOC);
140     }
141     return ((ret >> GPIO_ID(pin)) & 0x01);
142 }
143
144 static inline __attribute__((always_inline))
145 void directModeInput(volatile IO_REG_TYPE *base, IO_REG_TYPE pin)
146 {
147     if (SS_GPIO == GPIO_TYPE(pin)) {
148         WRITE_ARC_REG(READ_ARC_REG((((IO_REG_TYPE)base) + DIR_OFFSET_SS)) & ~(0x01 << GPIO_ID(pin)),
149                         ((IO_REG_TYPE)(base) + DIR_OFFSET_SS));
150     } else {
151         MMIO_REG_VAL_FROM_BASE((IO_REG_TYPE)base, DIR_OFFSET_SOC) &= ~(0x01 << GPIO_ID(pin));
152     }
153 }
154
155 static inline __attribute__((always_inline))
156 void directModeOutput(volatile IO_REG_TYPE *base, IO_REG_TYPE pin)
157 {
158     if (SS_GPIO == GPIO_TYPE(pin)) {
159         WRITE_ARC_REG(READ_ARC_REG(((IO_REG_TYPE)(base) + DIR_OFFSET_SS)) | (0x01 << GPIO_ID(pin)),
160                         ((IO_REG_TYPE)(base) + DIR_OFFSET_SS));
161     } else {
162         MMIO_REG_VAL_FROM_BASE((IO_REG_TYPE)base, DIR_OFFSET_SOC) |= (0x01 << GPIO_ID(pin));
163     }
164 }
165
166 static inline __attribute__((always_inline))
167 void directWriteLow(volatile IO_REG_TYPE *base, IO_REG_TYPE pin)
168 {
169     if (SS_GPIO == GPIO_TYPE(pin)) {
170         WRITE_ARC_REG(READ_ARC_REG(base) & ~(0x01 << GPIO_ID(pin)), base);
171     } else {
172         MMIO_REG_VAL(base) &= ~(0x01 << GPIO_ID(pin));
173     }
174 }
175
176 static inline __attribute__((always_inline))
177 void directWriteHigh(volatile IO_REG_TYPE *base, IO_REG_TYPE pin)
178 {
179     if (SS_GPIO == GPIO_TYPE(pin)) {
180         WRITE_ARC_REG(READ_ARC_REG(base) | (0x01 << GPIO_ID(pin)), base);
181     } else {
182         MMIO_REG_VAL(base) |= (0x01 << GPIO_ID(pin));
183     }
184 }
185
186 #define DIRECT_READ(base, pin)          directRead(base, pin)
187 #define DIRECT_MODE_INPUT(base, pin)    directModeInput(base, pin)
188 #define DIRECT_MODE_OUTPUT(base, pin)   directModeOutput(base, pin)
189 #define DIRECT_WRITE_LOW(base, pin)     directWriteLow(base, pin)
190 #define DIRECT_WRITE_HIGH(base, pin)    directWriteHigh(base, pin)
191
192 #endif
193
194 // some 3.3V chips with 5V tolerant pins need this workaround
195 //
196 #if defined(__MK20DX256__)
197 #define FIVE_VOLT_TOLERANCE_WORKAROUND
198 #endif
199
200 // library interface description
201 class CapacitiveSensor
202 {
203   // user-accessible "public" interface
204   public:
205   // methods
206         CapacitiveSensor(uint8_t sendPin, uint8_t receivePin);
207         long capacitiveSensorRaw(uint8_t samples);
208         long capacitiveSensor(uint8_t samples);
209         void set_CS_Timeout_Millis(unsigned long timeout_millis);
210         void reset_CS_AutoCal();
211         void set_CS_AutocaL_Millis(unsigned long autoCal_millis);
212   // library-accessible "private" interface
213   private:
214   // variables
215         int error;
216         unsigned long  leastTotal;
217         unsigned int   loopTimingFactor;
218         unsigned long  CS_Timeout_Millis;
219         unsigned long  CS_AutocaL_Millis;
220         unsigned long  lastCal;
221         unsigned long  total;
222         IO_REG_TYPE sBit;   // send pin's ports and bitmask
223         volatile IO_REG_TYPE *sReg;
224         IO_REG_TYPE rBit;    // receive pin's ports and bitmask
225         volatile IO_REG_TYPE *rReg;
226   // methods
227         int SenseOneCycle(void);
228 };
229
230 #endif