Driver for the capacitive sense slider available on the EFM32 Giant, Wonder and Leopard starter kits.
Dependents: EFM32 RDA5807M RDS Radio EMF32-Segment-Touch-Demo EFM32_Bugs MFALHIMOHAMMED ... more
Information
All examples in this repo are considered EXPERIMENTAL QUALITY, meaning this code has been created as one-off proof-of-concept and is suitable as a demonstration for experimental purposes only. This code will not be regularly maintained by Silicon Labs and there is no guarantee that these projects will work across all environments, SDK versions and hardware.
EFM32_CapSenseSlider.h@3:8d096e5bc045, 2015-05-04 (annotated)
- Committer:
- Steven Cooreman
- Date:
- Mon May 04 09:37:34 2015 -0700
- Revision:
- 3:8d096e5bc045
- Parent:
- 1:6647338e62d8
Merge
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Steven Cooreman |
0:459a1af84a64 | 1 | /***************************************************************************//** |
Steven Cooreman |
0:459a1af84a64 | 2 | * @file EFM32_CapSenseSlider.h |
Steven Cooreman |
0:459a1af84a64 | 3 | * @brief Driver class for the capacitive touch slider on some EFM32 STK's. |
Steven Cooreman |
0:459a1af84a64 | 4 | ******************************************************************************* |
Steven Cooreman |
0:459a1af84a64 | 5 | * @section License |
Steven Cooreman |
0:459a1af84a64 | 6 | * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b> |
Steven Cooreman |
0:459a1af84a64 | 7 | ******************************************************************************* |
Steven Cooreman |
0:459a1af84a64 | 8 | * |
Steven Cooreman |
0:459a1af84a64 | 9 | * Permission is granted to anyone to use this software for any purpose, |
Steven Cooreman |
0:459a1af84a64 | 10 | * including commercial applications, and to alter it and redistribute it |
Steven Cooreman |
0:459a1af84a64 | 11 | * freely, subject to the following restrictions: |
Steven Cooreman |
0:459a1af84a64 | 12 | * |
Steven Cooreman |
0:459a1af84a64 | 13 | * 1. The origin of this software must not be misrepresented; you must not |
Steven Cooreman |
0:459a1af84a64 | 14 | * claim that you wrote the original software. |
Steven Cooreman |
0:459a1af84a64 | 15 | * 2. Altered source versions must be plainly marked as such, and must not be |
Steven Cooreman |
0:459a1af84a64 | 16 | * misrepresented as being the original software. |
Steven Cooreman |
0:459a1af84a64 | 17 | * 3. This notice may not be removed or altered from any source distribution. |
Steven Cooreman |
0:459a1af84a64 | 18 | * |
Steven Cooreman |
0:459a1af84a64 | 19 | * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no |
Steven Cooreman |
0:459a1af84a64 | 20 | * obligation to support this Software. Silicon Labs is providing the |
Steven Cooreman |
0:459a1af84a64 | 21 | * Software "AS IS", with no express or implied warranties of any kind, |
Steven Cooreman |
0:459a1af84a64 | 22 | * including, but not limited to, any implied warranties of merchantability |
Steven Cooreman |
0:459a1af84a64 | 23 | * or fitness for any particular purpose or warranties against infringement |
Steven Cooreman |
0:459a1af84a64 | 24 | * of any proprietary rights of a third party. |
Steven Cooreman |
0:459a1af84a64 | 25 | * |
Steven Cooreman |
0:459a1af84a64 | 26 | * Silicon Labs will not be liable for any consequential, incidental, or |
Steven Cooreman |
0:459a1af84a64 | 27 | * special damages, or any other relief, or for any claim by any third party, |
Steven Cooreman |
0:459a1af84a64 | 28 | * arising from your use of this Software. |
Steven Cooreman |
0:459a1af84a64 | 29 | * |
Steven Cooreman |
0:459a1af84a64 | 30 | ******************************************************************************/ |
Steven Cooreman |
0:459a1af84a64 | 31 | |
Steven Cooreman |
0:459a1af84a64 | 32 | #ifndef SILABS_EFM32_CAPSENSESLIDER_H |
Steven Cooreman |
0:459a1af84a64 | 33 | #define SILABS_EFM32_CAPSENSESLIDER_H |
Steven Cooreman |
0:459a1af84a64 | 34 | |
Steven Cooreman |
0:459a1af84a64 | 35 | #ifndef TARGET_EFM32 |
Steven Cooreman |
0:459a1af84a64 | 36 | #error "The Silicon Labs EFM32 CapSenseSlider library is specifically designed for EFM32 targets." |
Steven Cooreman |
0:459a1af84a64 | 37 | #elif (defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32TG_STK3300) || defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32WG_STK3800)) |
Steven Cooreman |
0:459a1af84a64 | 38 | #include "platform.h" |
Steven Cooreman |
0:459a1af84a64 | 39 | #include <mbed.h> |
Steven Cooreman |
0:459a1af84a64 | 40 | |
Steven Cooreman |
0:459a1af84a64 | 41 | #include "caplesense.h" |
Steven Cooreman |
0:459a1af84a64 | 42 | #include "CThunk.h" |
stevew817 | 1:6647338e62d8 | 43 | #include "sleepmodes.h" |
Steven Cooreman |
0:459a1af84a64 | 44 | |
Steven Cooreman |
0:459a1af84a64 | 45 | typedef void (*cbptr_t)(void); |
Steven Cooreman |
0:459a1af84a64 | 46 | |
Steven Cooreman |
0:459a1af84a64 | 47 | namespace silabs { |
Steven Cooreman |
0:459a1af84a64 | 48 | |
Steven Cooreman |
0:459a1af84a64 | 49 | /** A driver for the capacitive touch slider on some EFM32 STKs |
Steven Cooreman |
0:459a1af84a64 | 50 | * |
Steven Cooreman |
0:459a1af84a64 | 51 | * Currently supports EFM32 Wonder, Giant and Leopard Gecko kits. |
Steven Cooreman |
0:459a1af84a64 | 52 | * |
Steven Cooreman |
0:459a1af84a64 | 53 | * @code |
Steven Cooreman |
0:459a1af84a64 | 54 | * #include "mbed.h" |
Steven Cooreman |
0:459a1af84a64 | 55 | * #include "EFM32_CapSenseSlider.h" |
Steven Cooreman |
0:459a1af84a64 | 56 | * |
Steven Cooreman |
0:459a1af84a64 | 57 | * silabs::EFM32_CapSenseSlider capSlider; |
Steven Cooreman |
0:459a1af84a64 | 58 | * |
Steven Cooreman |
0:459a1af84a64 | 59 | * void touchCallback(void) { |
Steven Cooreman |
0:459a1af84a64 | 60 | * if(!capSlider.isTouched()) { |
Steven Cooreman |
0:459a1af84a64 | 61 | * printf("Lost touch"); |
Steven Cooreman |
0:459a1af84a64 | 62 | * } else { |
Steven Cooreman |
0:459a1af84a64 | 63 | * printf("Finger detected! Position %d", capSlider.getPosition()); |
Steven Cooreman |
0:459a1af84a64 | 64 | * } |
Steven Cooreman |
0:459a1af84a64 | 65 | * } |
Steven Cooreman |
0:459a1af84a64 | 66 | * |
Steven Cooreman |
0:459a1af84a64 | 67 | * int main() { |
Steven Cooreman |
0:459a1af84a64 | 68 | * capSlider.start(); |
Steven Cooreman |
0:459a1af84a64 | 69 | * capSlider.attach_touch(touchCallback); |
Steven Cooreman |
0:459a1af84a64 | 70 | * |
Steven Cooreman |
0:459a1af84a64 | 71 | * while(1) sleep(); |
Steven Cooreman |
0:459a1af84a64 | 72 | * } |
Steven Cooreman |
0:459a1af84a64 | 73 | * @endcode |
Steven Cooreman |
0:459a1af84a64 | 74 | */ |
Steven Cooreman |
0:459a1af84a64 | 75 | class EFM32_CapSenseSlider { |
Steven Cooreman |
0:459a1af84a64 | 76 | public: |
Steven Cooreman |
0:459a1af84a64 | 77 | /** |
Steven Cooreman |
0:459a1af84a64 | 78 | * Constructor. |
Steven Cooreman |
0:459a1af84a64 | 79 | */ |
Steven Cooreman |
0:459a1af84a64 | 80 | EFM32_CapSenseSlider(); |
Steven Cooreman |
0:459a1af84a64 | 81 | |
Steven Cooreman |
0:459a1af84a64 | 82 | /** |
Steven Cooreman |
0:459a1af84a64 | 83 | * Start measuring |
Steven Cooreman |
0:459a1af84a64 | 84 | */ |
Steven Cooreman |
0:459a1af84a64 | 85 | void start(); |
Steven Cooreman |
0:459a1af84a64 | 86 | |
Steven Cooreman |
0:459a1af84a64 | 87 | /** |
Steven Cooreman |
0:459a1af84a64 | 88 | * Stop measuring |
Steven Cooreman |
0:459a1af84a64 | 89 | */ |
Steven Cooreman |
0:459a1af84a64 | 90 | void stop(); |
Steven Cooreman |
0:459a1af84a64 | 91 | |
Steven Cooreman |
0:459a1af84a64 | 92 | /** |
Steven Cooreman |
0:459a1af84a64 | 93 | * Attach a callback handler, which gets called once on touch |
Steven Cooreman |
0:459a1af84a64 | 94 | * |
Steven Cooreman |
0:459a1af84a64 | 95 | * @param callback pointer to a void (void) function. If null, then the callback gets disabled. |
Steven Cooreman |
0:459a1af84a64 | 96 | */ |
Steven Cooreman |
0:459a1af84a64 | 97 | void attach_touch(cbptr_t callback = NULL); |
Steven Cooreman |
0:459a1af84a64 | 98 | |
Steven Cooreman |
0:459a1af84a64 | 99 | /** |
Steven Cooreman |
0:459a1af84a64 | 100 | * Attach a callback handler, which gets called once on releasing touch |
Steven Cooreman |
0:459a1af84a64 | 101 | * |
Steven Cooreman |
0:459a1af84a64 | 102 | * @param callback pointer to a void (void) function. If null, then the callback gets disabled. |
Steven Cooreman |
0:459a1af84a64 | 103 | */ |
Steven Cooreman |
0:459a1af84a64 | 104 | void attach_untouch(cbptr_t callback = NULL); |
Steven Cooreman |
0:459a1af84a64 | 105 | |
Steven Cooreman |
0:459a1af84a64 | 106 | /** |
Steven Cooreman |
0:459a1af84a64 | 107 | * Attach a callback which will trigger once the slider value passes a certain point. |
Steven Cooreman |
0:459a1af84a64 | 108 | * |
Steven Cooreman |
0:459a1af84a64 | 109 | * @param trip point after which the callback gets called. If -1, the callback gets called on any change in position. |
Steven Cooreman |
0:459a1af84a64 | 110 | * @param callback pointer to a void (void) function. If null, then the callback gets disabled. |
Steven Cooreman |
0:459a1af84a64 | 111 | */ |
Steven Cooreman |
0:459a1af84a64 | 112 | void attach_slide(int32_t trip = -1, cbptr_t callback = NULL); |
Steven Cooreman |
0:459a1af84a64 | 113 | |
Steven Cooreman |
0:459a1af84a64 | 114 | /** |
Steven Cooreman |
0:459a1af84a64 | 115 | * Check whether the slider is currently being touched. |
Steven Cooreman |
0:459a1af84a64 | 116 | * |
Steven Cooreman |
0:459a1af84a64 | 117 | * @return True if a finger is currently detected. |
Steven Cooreman |
0:459a1af84a64 | 118 | */ |
Steven Cooreman |
0:459a1af84a64 | 119 | bool isTouched(); |
Steven Cooreman |
0:459a1af84a64 | 120 | |
Steven Cooreman |
0:459a1af84a64 | 121 | /** |
Steven Cooreman |
0:459a1af84a64 | 122 | * Get the current position |
Steven Cooreman |
0:459a1af84a64 | 123 | * |
Steven Cooreman |
0:459a1af84a64 | 124 | * @return The finger position on the slider (0-48). -1 if not touched. |
Steven Cooreman |
0:459a1af84a64 | 125 | */ |
Steven Cooreman |
0:459a1af84a64 | 126 | int32_t get_position(); |
Steven Cooreman |
0:459a1af84a64 | 127 | |
Steven Cooreman |
0:459a1af84a64 | 128 | protected: |
Steven Cooreman |
0:459a1af84a64 | 129 | CThunk<EFM32_CapSenseSlider> _channelCallback; |
Steven Cooreman |
0:459a1af84a64 | 130 | CThunk<EFM32_CapSenseSlider> _scanCallback; |
Steven Cooreman |
0:459a1af84a64 | 131 | |
Steven Cooreman |
0:459a1af84a64 | 132 | cbptr_t _slideCb; |
Steven Cooreman |
0:459a1af84a64 | 133 | cbptr_t _touchCb; |
Steven Cooreman |
0:459a1af84a64 | 134 | cbptr_t _untouchCb; |
Steven Cooreman |
0:459a1af84a64 | 135 | int32_t _trippingPoint; |
Steven Cooreman |
0:459a1af84a64 | 136 | bool _running; |
Steven Cooreman |
0:459a1af84a64 | 137 | bool _touched; |
Steven Cooreman |
0:459a1af84a64 | 138 | volatile int32_t _lastValue, _position; |
Steven Cooreman |
0:459a1af84a64 | 139 | |
Steven Cooreman |
0:459a1af84a64 | 140 | void channelCallbackHandler(void); |
Steven Cooreman |
0:459a1af84a64 | 141 | void scanCallbackHandler(void); |
Steven Cooreman |
0:459a1af84a64 | 142 | |
Steven Cooreman |
0:459a1af84a64 | 143 | }; |
Steven Cooreman |
0:459a1af84a64 | 144 | } |
Steven Cooreman |
0:459a1af84a64 | 145 | #else |
Steven Cooreman |
0:459a1af84a64 | 146 | #error "Target is not supported. (supported targets: EFM32WG/LG/GG/TG/G STK's)" |
Steven Cooreman |
0:459a1af84a64 | 147 | #endif //TARGET Check |
Steven Cooreman |
0:459a1af84a64 | 148 | |
Steven Cooreman |
0:459a1af84a64 | 149 | #endif //SILABS_EFM32_CAPSENSESLIDER_H |