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.cpp@3:8d096e5bc045, 2015-05-04 (annotated)
- Committer:
- Steven Cooreman
- Date:
- Mon May 04 09:37:34 2015 -0700
- Revision:
- 3:8d096e5bc045
- Parent:
- 0:459a1af84a64
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.cpp |
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 | #include <mbed.h> |
Steven Cooreman |
0:459a1af84a64 | 33 | #include "platform.h" |
Steven Cooreman |
0:459a1af84a64 | 34 | |
Steven Cooreman |
0:459a1af84a64 | 35 | #include "EFM32_CapSenseSlider.h" |
Steven Cooreman |
0:459a1af84a64 | 36 | #include "em_lesense.h" |
Steven Cooreman |
0:459a1af84a64 | 37 | |
Steven Cooreman |
0:459a1af84a64 | 38 | namespace silabs { |
Steven Cooreman |
0:459a1af84a64 | 39 | /* |
Steven Cooreman |
0:459a1af84a64 | 40 | * Constructor. |
Steven Cooreman |
0:459a1af84a64 | 41 | */ |
Steven Cooreman |
0:459a1af84a64 | 42 | EFM32_CapSenseSlider::EFM32_CapSenseSlider() : |
Steven Cooreman |
0:459a1af84a64 | 43 | _channelCallback(this, &EFM32_CapSenseSlider::channelCallbackHandler), |
Steven Cooreman |
0:459a1af84a64 | 44 | _scanCallback(this, &EFM32_CapSenseSlider::scanCallbackHandler) |
Steven Cooreman |
0:459a1af84a64 | 45 | { |
Steven Cooreman |
0:459a1af84a64 | 46 | _touchCb = NULL; |
Steven Cooreman |
0:459a1af84a64 | 47 | _untouchCb = NULL; |
Steven Cooreman |
0:459a1af84a64 | 48 | _slideCb = NULL; |
Steven Cooreman |
0:459a1af84a64 | 49 | _trippingPoint = 0; |
Steven Cooreman |
0:459a1af84a64 | 50 | _lastValue = -1; |
Steven Cooreman |
0:459a1af84a64 | 51 | _position = -1; |
Steven Cooreman |
0:459a1af84a64 | 52 | _touched = false; |
Steven Cooreman |
0:459a1af84a64 | 53 | _running = false; |
Steven Cooreman |
0:459a1af84a64 | 54 | } |
Steven Cooreman |
0:459a1af84a64 | 55 | |
Steven Cooreman |
0:459a1af84a64 | 56 | /* |
Steven Cooreman |
0:459a1af84a64 | 57 | * Start measuring |
Steven Cooreman |
0:459a1af84a64 | 58 | */ |
Steven Cooreman |
0:459a1af84a64 | 59 | void EFM32_CapSenseSlider::start() { |
Steven Cooreman |
0:459a1af84a64 | 60 | if(_running == false) { |
Steven Cooreman |
0:459a1af84a64 | 61 | CAPLESENSE_Init(true); |
Steven Cooreman |
0:459a1af84a64 | 62 | CAPLESENSE_setupCallbacks((cbptr_t)_scanCallback.entry(), (cbptr_t)_channelCallback.entry()); |
Steven Cooreman |
0:459a1af84a64 | 63 | blockSleepMode(EM2); |
Steven Cooreman |
0:459a1af84a64 | 64 | _running = true; |
Steven Cooreman |
0:459a1af84a64 | 65 | } |
Steven Cooreman |
0:459a1af84a64 | 66 | } |
Steven Cooreman |
0:459a1af84a64 | 67 | |
Steven Cooreman |
0:459a1af84a64 | 68 | /* |
Steven Cooreman |
0:459a1af84a64 | 69 | * Stop measuring |
Steven Cooreman |
0:459a1af84a64 | 70 | */ |
Steven Cooreman |
0:459a1af84a64 | 71 | void EFM32_CapSenseSlider::stop() { |
Steven Cooreman |
0:459a1af84a64 | 72 | if(_running == true) { |
Steven Cooreman |
0:459a1af84a64 | 73 | LESENSE_ScanStop(); |
Steven Cooreman |
0:459a1af84a64 | 74 | unblockSleepMode(EM2); |
Steven Cooreman |
0:459a1af84a64 | 75 | _running = false; |
Steven Cooreman |
0:459a1af84a64 | 76 | } |
Steven Cooreman |
0:459a1af84a64 | 77 | } |
Steven Cooreman |
0:459a1af84a64 | 78 | |
Steven Cooreman |
0:459a1af84a64 | 79 | /* |
Steven Cooreman |
0:459a1af84a64 | 80 | * Attach a callback handler, which gets called once on touch |
Steven Cooreman |
0:459a1af84a64 | 81 | * callback: pointer to a void (void) function. If null, then the callback gets disabled. |
Steven Cooreman |
0:459a1af84a64 | 82 | */ |
Steven Cooreman |
0:459a1af84a64 | 83 | void EFM32_CapSenseSlider::attach_touch(cbptr_t callback) { |
Steven Cooreman |
0:459a1af84a64 | 84 | _touchCb = callback; |
Steven Cooreman |
0:459a1af84a64 | 85 | } |
Steven Cooreman |
0:459a1af84a64 | 86 | |
Steven Cooreman |
0:459a1af84a64 | 87 | /* |
Steven Cooreman |
0:459a1af84a64 | 88 | * Attach a callback handler, which gets called once on releasing touch |
Steven Cooreman |
0:459a1af84a64 | 89 | * callback: pointer to a void (void) function. If null, then the callback gets disabled. |
Steven Cooreman |
0:459a1af84a64 | 90 | */ |
Steven Cooreman |
0:459a1af84a64 | 91 | void EFM32_CapSenseSlider::attach_untouch(cbptr_t callback) { |
Steven Cooreman |
0:459a1af84a64 | 92 | _untouchCb = callback; |
Steven Cooreman |
0:459a1af84a64 | 93 | } |
Steven Cooreman |
0:459a1af84a64 | 94 | |
Steven Cooreman |
0:459a1af84a64 | 95 | /* |
Steven Cooreman |
0:459a1af84a64 | 96 | * Attach a callback which will trigger once the slider value passes a certain point. |
Steven Cooreman |
0:459a1af84a64 | 97 | * |
Steven Cooreman |
0:459a1af84a64 | 98 | * trip: point accross which the callback gets called. |
Steven Cooreman |
0:459a1af84a64 | 99 | * callback: pointer to a void (void) function. If null, then the callback gets disabled. |
Steven Cooreman |
0:459a1af84a64 | 100 | */ |
Steven Cooreman |
0:459a1af84a64 | 101 | void EFM32_CapSenseSlider::attach_slide(int32_t trip, cbptr_t callback) { |
Steven Cooreman |
0:459a1af84a64 | 102 | _slideCb = callback; |
Steven Cooreman |
0:459a1af84a64 | 103 | _trippingPoint = trip; |
Steven Cooreman |
0:459a1af84a64 | 104 | } |
Steven Cooreman |
0:459a1af84a64 | 105 | |
Steven Cooreman |
0:459a1af84a64 | 106 | /* |
Steven Cooreman |
0:459a1af84a64 | 107 | * Check whether the slider is currently being touched. |
Steven Cooreman |
0:459a1af84a64 | 108 | */ |
Steven Cooreman |
0:459a1af84a64 | 109 | bool EFM32_CapSenseSlider::isTouched() { |
Steven Cooreman |
0:459a1af84a64 | 110 | return _touched; |
Steven Cooreman |
0:459a1af84a64 | 111 | } |
Steven Cooreman |
0:459a1af84a64 | 112 | |
Steven Cooreman |
0:459a1af84a64 | 113 | /* |
Steven Cooreman |
0:459a1af84a64 | 114 | * Get the current position |
Steven Cooreman |
0:459a1af84a64 | 115 | */ |
Steven Cooreman |
0:459a1af84a64 | 116 | int32_t EFM32_CapSenseSlider::get_position() { |
Steven Cooreman |
0:459a1af84a64 | 117 | return _position; |
Steven Cooreman |
0:459a1af84a64 | 118 | } |
Steven Cooreman |
0:459a1af84a64 | 119 | |
Steven Cooreman |
0:459a1af84a64 | 120 | void EFM32_CapSenseSlider::channelCallbackHandler(void) { |
Steven Cooreman |
0:459a1af84a64 | 121 | /* When a touch is detected, go to responsive scan mode */ |
Steven Cooreman |
0:459a1af84a64 | 122 | CAPLESENSE_setupLESENSE(false); |
Steven Cooreman |
0:459a1af84a64 | 123 | } |
Steven Cooreman |
0:459a1af84a64 | 124 | |
Steven Cooreman |
0:459a1af84a64 | 125 | void EFM32_CapSenseSlider::scanCallbackHandler(void) { |
Steven Cooreman |
0:459a1af84a64 | 126 | /* Calculate slider position */ |
Steven Cooreman |
0:459a1af84a64 | 127 | _position = CAPLESENSE_getSliderPosition(); |
Steven Cooreman |
0:459a1af84a64 | 128 | /* Check for touch */ |
Steven Cooreman |
0:459a1af84a64 | 129 | if(_position < 0) { |
Steven Cooreman |
0:459a1af84a64 | 130 | /* Slider is no longer being touched */ |
Steven Cooreman |
0:459a1af84a64 | 131 | if(_touched == true) { |
Steven Cooreman |
0:459a1af84a64 | 132 | _touched = false; |
Steven Cooreman |
0:459a1af84a64 | 133 | if(_untouchCb != NULL) _untouchCb(); |
Steven Cooreman |
0:459a1af84a64 | 134 | } |
Steven Cooreman |
0:459a1af84a64 | 135 | /* When no longer touched, go to sense mode */ |
Steven Cooreman |
0:459a1af84a64 | 136 | CAPLESENSE_setupLESENSE(true); |
Steven Cooreman |
0:459a1af84a64 | 137 | return; |
Steven Cooreman |
0:459a1af84a64 | 138 | } |
Steven Cooreman |
0:459a1af84a64 | 139 | |
Steven Cooreman |
0:459a1af84a64 | 140 | /* Touched, check if this is the first touch */ |
Steven Cooreman |
0:459a1af84a64 | 141 | if(_touched == false) { |
Steven Cooreman |
0:459a1af84a64 | 142 | _touched = true; |
Steven Cooreman |
0:459a1af84a64 | 143 | if(_touchCb != NULL) _touchCb(); |
Steven Cooreman |
0:459a1af84a64 | 144 | } |
Steven Cooreman |
0:459a1af84a64 | 145 | |
Steven Cooreman |
0:459a1af84a64 | 146 | /* Check if we tripped the threshold */ |
Steven Cooreman |
0:459a1af84a64 | 147 | if((_lastValue != _position) && (_slideCb != NULL)) { |
Steven Cooreman |
0:459a1af84a64 | 148 | if((_trippingPoint == -1) || (_position >= _trippingPoint)) _slideCb(); |
Steven Cooreman |
0:459a1af84a64 | 149 | } |
Steven Cooreman |
0:459a1af84a64 | 150 | |
Steven Cooreman |
0:459a1af84a64 | 151 | _lastValue = _position; |
Steven Cooreman |
0:459a1af84a64 | 152 | } |
Steven Cooreman |
0:459a1af84a64 | 153 | } |