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:
Tue Mar 17 12:44:15 2015 -0500
Revision:
0:459a1af84a64
Child:
1:6647338e62d8
Initial commit

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 #define TARGET_EFM32
Steven Cooreman 0:459a1af84a64 36 #define TARGET_EFM32GG_STK3700
Steven Cooreman 0:459a1af84a64 37
Steven Cooreman 0:459a1af84a64 38 #ifndef TARGET_EFM32
Steven Cooreman 0:459a1af84a64 39 #error "The Silicon Labs EFM32 CapSenseSlider library is specifically designed for EFM32 targets."
Steven Cooreman 0:459a1af84a64 40 #elif (defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32TG_STK3300) || defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32WG_STK3800))
Steven Cooreman 0:459a1af84a64 41 #include "platform.h"
Steven Cooreman 0:459a1af84a64 42 #include <mbed.h>
Steven Cooreman 0:459a1af84a64 43
Steven Cooreman 0:459a1af84a64 44 #include "caplesense.h"
Steven Cooreman 0:459a1af84a64 45 #include "CThunk.h"
Steven Cooreman 0:459a1af84a64 46
Steven Cooreman 0:459a1af84a64 47 typedef void (*cbptr_t)(void);
Steven Cooreman 0:459a1af84a64 48
Steven Cooreman 0:459a1af84a64 49 namespace silabs {
Steven Cooreman 0:459a1af84a64 50
Steven Cooreman 0:459a1af84a64 51 /** A driver for the capacitive touch slider on some EFM32 STKs
Steven Cooreman 0:459a1af84a64 52 *
Steven Cooreman 0:459a1af84a64 53 * Currently supports EFM32 Wonder, Giant and Leopard Gecko kits.
Steven Cooreman 0:459a1af84a64 54 *
Steven Cooreman 0:459a1af84a64 55 * @code
Steven Cooreman 0:459a1af84a64 56 * #include "mbed.h"
Steven Cooreman 0:459a1af84a64 57 * #include "EFM32_CapSenseSlider.h"
Steven Cooreman 0:459a1af84a64 58 *
Steven Cooreman 0:459a1af84a64 59 * silabs::EFM32_CapSenseSlider capSlider;
Steven Cooreman 0:459a1af84a64 60 *
Steven Cooreman 0:459a1af84a64 61 * void touchCallback(void) {
Steven Cooreman 0:459a1af84a64 62 * if(!capSlider.isTouched()) {
Steven Cooreman 0:459a1af84a64 63 * printf("Lost touch");
Steven Cooreman 0:459a1af84a64 64 * } else {
Steven Cooreman 0:459a1af84a64 65 * printf("Finger detected! Position %d", capSlider.getPosition());
Steven Cooreman 0:459a1af84a64 66 * }
Steven Cooreman 0:459a1af84a64 67 * }
Steven Cooreman 0:459a1af84a64 68 *
Steven Cooreman 0:459a1af84a64 69 * int main() {
Steven Cooreman 0:459a1af84a64 70 * capSlider.start();
Steven Cooreman 0:459a1af84a64 71 * capSlider.attach_touch(touchCallback);
Steven Cooreman 0:459a1af84a64 72 *
Steven Cooreman 0:459a1af84a64 73 * while(1) sleep();
Steven Cooreman 0:459a1af84a64 74 * }
Steven Cooreman 0:459a1af84a64 75 * @endcode
Steven Cooreman 0:459a1af84a64 76 */
Steven Cooreman 0:459a1af84a64 77 class EFM32_CapSenseSlider {
Steven Cooreman 0:459a1af84a64 78 public:
Steven Cooreman 0:459a1af84a64 79 /**
Steven Cooreman 0:459a1af84a64 80 * Constructor.
Steven Cooreman 0:459a1af84a64 81 */
Steven Cooreman 0:459a1af84a64 82 EFM32_CapSenseSlider();
Steven Cooreman 0:459a1af84a64 83
Steven Cooreman 0:459a1af84a64 84 /**
Steven Cooreman 0:459a1af84a64 85 * Start measuring
Steven Cooreman 0:459a1af84a64 86 */
Steven Cooreman 0:459a1af84a64 87 void start();
Steven Cooreman 0:459a1af84a64 88
Steven Cooreman 0:459a1af84a64 89 /**
Steven Cooreman 0:459a1af84a64 90 * Stop measuring
Steven Cooreman 0:459a1af84a64 91 */
Steven Cooreman 0:459a1af84a64 92 void stop();
Steven Cooreman 0:459a1af84a64 93
Steven Cooreman 0:459a1af84a64 94 /**
Steven Cooreman 0:459a1af84a64 95 * Attach a callback handler, which gets called once on touch
Steven Cooreman 0:459a1af84a64 96 *
Steven Cooreman 0:459a1af84a64 97 * @param callback pointer to a void (void) function. If null, then the callback gets disabled.
Steven Cooreman 0:459a1af84a64 98 */
Steven Cooreman 0:459a1af84a64 99 void attach_touch(cbptr_t callback = NULL);
Steven Cooreman 0:459a1af84a64 100
Steven Cooreman 0:459a1af84a64 101 /**
Steven Cooreman 0:459a1af84a64 102 * Attach a callback handler, which gets called once on releasing touch
Steven Cooreman 0:459a1af84a64 103 *
Steven Cooreman 0:459a1af84a64 104 * @param callback pointer to a void (void) function. If null, then the callback gets disabled.
Steven Cooreman 0:459a1af84a64 105 */
Steven Cooreman 0:459a1af84a64 106 void attach_untouch(cbptr_t callback = NULL);
Steven Cooreman 0:459a1af84a64 107
Steven Cooreman 0:459a1af84a64 108 /**
Steven Cooreman 0:459a1af84a64 109 * Attach a callback which will trigger once the slider value passes a certain point.
Steven Cooreman 0:459a1af84a64 110 *
Steven Cooreman 0:459a1af84a64 111 * @param trip point after which the callback gets called. If -1, the callback gets called on any change in position.
Steven Cooreman 0:459a1af84a64 112 * @param callback pointer to a void (void) function. If null, then the callback gets disabled.
Steven Cooreman 0:459a1af84a64 113 */
Steven Cooreman 0:459a1af84a64 114 void attach_slide(int32_t trip = -1, cbptr_t callback = NULL);
Steven Cooreman 0:459a1af84a64 115
Steven Cooreman 0:459a1af84a64 116 /**
Steven Cooreman 0:459a1af84a64 117 * Check whether the slider is currently being touched.
Steven Cooreman 0:459a1af84a64 118 *
Steven Cooreman 0:459a1af84a64 119 * @return True if a finger is currently detected.
Steven Cooreman 0:459a1af84a64 120 */
Steven Cooreman 0:459a1af84a64 121 bool isTouched();
Steven Cooreman 0:459a1af84a64 122
Steven Cooreman 0:459a1af84a64 123 /**
Steven Cooreman 0:459a1af84a64 124 * Get the current position
Steven Cooreman 0:459a1af84a64 125 *
Steven Cooreman 0:459a1af84a64 126 * @return The finger position on the slider (0-48). -1 if not touched.
Steven Cooreman 0:459a1af84a64 127 */
Steven Cooreman 0:459a1af84a64 128 int32_t get_position();
Steven Cooreman 0:459a1af84a64 129
Steven Cooreman 0:459a1af84a64 130 protected:
Steven Cooreman 0:459a1af84a64 131 CThunk<EFM32_CapSenseSlider> _channelCallback;
Steven Cooreman 0:459a1af84a64 132 CThunk<EFM32_CapSenseSlider> _scanCallback;
Steven Cooreman 0:459a1af84a64 133
Steven Cooreman 0:459a1af84a64 134 cbptr_t _slideCb;
Steven Cooreman 0:459a1af84a64 135 cbptr_t _touchCb;
Steven Cooreman 0:459a1af84a64 136 cbptr_t _untouchCb;
Steven Cooreman 0:459a1af84a64 137 int32_t _trippingPoint;
Steven Cooreman 0:459a1af84a64 138 bool _running;
Steven Cooreman 0:459a1af84a64 139 bool _touched;
Steven Cooreman 0:459a1af84a64 140 volatile int32_t _lastValue, _position;
Steven Cooreman 0:459a1af84a64 141
Steven Cooreman 0:459a1af84a64 142 void channelCallbackHandler(void);
Steven Cooreman 0:459a1af84a64 143 void scanCallbackHandler(void);
Steven Cooreman 0:459a1af84a64 144
Steven Cooreman 0:459a1af84a64 145 };
Steven Cooreman 0:459a1af84a64 146 }
Steven Cooreman 0:459a1af84a64 147 #else
Steven Cooreman 0:459a1af84a64 148 #error "Target is not supported. (supported targets: EFM32WG/LG/GG/TG/G STK's)"
Steven Cooreman 0:459a1af84a64 149 #endif //TARGET Check
Steven Cooreman 0:459a1af84a64 150
Steven Cooreman 0:459a1af84a64 151 #endif //SILABS_EFM32_CAPSENSESLIDER_H