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:
1:6647338e62d8
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.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