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.

/media/uploads/stevew817/screenshot_2015-03-17_13.40.06.png

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?

UserRevisionLine numberNew 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 }