A library for Freescale MCU which contain TSI peripheral, just for Kinetis L version. Because they use "lighter" version of TSI peripheral.

Dependents:   kl25z-tinyshell-demo tsi_slider_light_senso_LED frdm_tsi_slider_led_blend demo_slider ... more

This library is "fork" of the TSI library created by the mbed team.

Committer:
Kojto
Date:
Wed Apr 15 08:21:46 2015 +0000
Revision:
7:f4bb237d08ca
Fix KL05Z and KL46Z

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 7:f4bb237d08ca 1 /* Freescale Semiconductor Inc.
Kojto 7:f4bb237d08ca 2 *
Kojto 7:f4bb237d08ca 3 * mbed Microcontroller Library
Kojto 7:f4bb237d08ca 4 * (c) Copyright 2009-2012 ARM Limited.
Kojto 7:f4bb237d08ca 5 *
Kojto 7:f4bb237d08ca 6 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Kojto 7:f4bb237d08ca 7 * and associated documentation files (the "Software"), to deal in the Software without
Kojto 7:f4bb237d08ca 8 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
Kojto 7:f4bb237d08ca 9 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
Kojto 7:f4bb237d08ca 10 * Software is furnished to do so, subject to the following conditions:
Kojto 7:f4bb237d08ca 11 *
Kojto 7:f4bb237d08ca 12 * The above copyright notice and this permission notice shall be included in all copies or
Kojto 7:f4bb237d08ca 13 * substantial portions of the Software.
Kojto 7:f4bb237d08ca 14 *
Kojto 7:f4bb237d08ca 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
Kojto 7:f4bb237d08ca 16 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Kojto 7:f4bb237d08ca 17 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
Kojto 7:f4bb237d08ca 18 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Kojto 7:f4bb237d08ca 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Kojto 7:f4bb237d08ca 20 */
Kojto 7:f4bb237d08ca 21
Kojto 7:f4bb237d08ca 22 #ifndef TSISENSOR_H
Kojto 7:f4bb237d08ca 23 #define TSISENSOR_H
Kojto 7:f4bb237d08ca 24
Kojto 7:f4bb237d08ca 25 /**
Kojto 7:f4bb237d08ca 26 * TSISensor example
Kojto 7:f4bb237d08ca 27 *
Kojto 7:f4bb237d08ca 28 * @code
Kojto 7:f4bb237d08ca 29 * #include "mbed.h"
Kojto 7:f4bb237d08ca 30 * #include "TSISensor.h"
Kojto 7:f4bb237d08ca 31 *
Kojto 7:f4bb237d08ca 32 * int main(void) {
Kojto 7:f4bb237d08ca 33 * DigitalOut led(LED_GREEN);
Kojto 7:f4bb237d08ca 34 * TSIElectrode elec0(9);
Kojto 7:f4bb237d08ca 35 * TSIElectrode elec1(10);
Kojto 7:f4bb237d08ca 36 * TSIAnalogSlider tsi(elec0, elec1, 40);
Kojto 7:f4bb237d08ca 37 *
Kojto 7:f4bb237d08ca 38 * while (true) {
Kojto 7:f4bb237d08ca 39 * printf("slider percentage: %f%\r\n", tsi.readPercentage());
Kojto 7:f4bb237d08ca 40 * printf("slider distance: %dmm\r\n", tsi.readDistance());
Kojto 7:f4bb237d08ca 41 * wait(1);
Kojto 7:f4bb237d08ca 42 * led = !led;
Kojto 7:f4bb237d08ca 43 * }
Kojto 7:f4bb237d08ca 44 * }
Kojto 7:f4bb237d08ca 45 * @endcode
Kojto 7:f4bb237d08ca 46 */
Kojto 7:f4bb237d08ca 47 #define NO_TOUCH 0
Kojto 7:f4bb237d08ca 48
Kojto 7:f4bb237d08ca 49 /** TSI Electrode with simple data required for touch detection.
Kojto 7:f4bb237d08ca 50 */
Kojto 7:f4bb237d08ca 51 class TSIElectrode {
Kojto 7:f4bb237d08ca 52 public:
Kojto 7:f4bb237d08ca 53 /** Initialize electrode.
Kojto 7:f4bb237d08ca 54 */
Kojto 7:f4bb237d08ca 55 TSIElectrode(PinName pin) : _threshold(100) {
Kojto 7:f4bb237d08ca 56 _channel = getTSIChannel(pin);
Kojto 7:f4bb237d08ca 57 }
Kojto 7:f4bb237d08ca 58
Kojto 7:f4bb237d08ca 59 /** Initialize electrode.
Kojto 7:f4bb237d08ca 60 */
Kojto 7:f4bb237d08ca 61 TSIElectrode(uint32_t tsi_channel) : _threshold(100) {
Kojto 7:f4bb237d08ca 62 _channel = (uint8_t)tsi_channel;
Kojto 7:f4bb237d08ca 63 }
Kojto 7:f4bb237d08ca 64 /** Set baseline.
Kojto 7:f4bb237d08ca 65 */
Kojto 7:f4bb237d08ca 66 void setBaseline(uint32_t baseline) {
Kojto 7:f4bb237d08ca 67 _baseline = (uint16_t)baseline;
Kojto 7:f4bb237d08ca 68 }
Kojto 7:f4bb237d08ca 69 /** Set threshold.
Kojto 7:f4bb237d08ca 70 */
Kojto 7:f4bb237d08ca 71 void setThreshold(uint32_t threshold) {
Kojto 7:f4bb237d08ca 72 _threshold = (uint16_t)threshold;
Kojto 7:f4bb237d08ca 73 }
Kojto 7:f4bb237d08ca 74 /** Set signal.
Kojto 7:f4bb237d08ca 75 */
Kojto 7:f4bb237d08ca 76 void setSignal(uint32_t signal) {
Kojto 7:f4bb237d08ca 77 _signal = (uint16_t)signal;
Kojto 7:f4bb237d08ca 78 }
Kojto 7:f4bb237d08ca 79 /** Get baseline.
Kojto 7:f4bb237d08ca 80 */
Kojto 7:f4bb237d08ca 81 uint32_t getBaseline() {
Kojto 7:f4bb237d08ca 82 return _baseline;
Kojto 7:f4bb237d08ca 83 }
Kojto 7:f4bb237d08ca 84 /** Get delta.
Kojto 7:f4bb237d08ca 85 */
Kojto 7:f4bb237d08ca 86 uint32_t getDelta() {
Kojto 7:f4bb237d08ca 87 int32_t delta = getSignal() - getBaseline();
Kojto 7:f4bb237d08ca 88 if (delta < 0) {
Kojto 7:f4bb237d08ca 89 return 0;
Kojto 7:f4bb237d08ca 90 } else {
Kojto 7:f4bb237d08ca 91 return delta;
Kojto 7:f4bb237d08ca 92 }
Kojto 7:f4bb237d08ca 93 }
Kojto 7:f4bb237d08ca 94 /** Get signal.
Kojto 7:f4bb237d08ca 95 */
Kojto 7:f4bb237d08ca 96 uint32_t getSignal() {
Kojto 7:f4bb237d08ca 97 return _signal;
Kojto 7:f4bb237d08ca 98 }
Kojto 7:f4bb237d08ca 99 /** Get threshold.
Kojto 7:f4bb237d08ca 100 */
Kojto 7:f4bb237d08ca 101 uint32_t getThreshold() {
Kojto 7:f4bb237d08ca 102 return _threshold;
Kojto 7:f4bb237d08ca 103 }
Kojto 7:f4bb237d08ca 104 /** Get channel.
Kojto 7:f4bb237d08ca 105 */
Kojto 7:f4bb237d08ca 106 uint32_t getChannel() {
Kojto 7:f4bb237d08ca 107 return _channel;
Kojto 7:f4bb237d08ca 108 }
Kojto 7:f4bb237d08ca 109 /** Get TSI Channel for PinName.
Kojto 7:f4bb237d08ca 110 *
Kojto 7:f4bb237d08ca 111 * @returns TSI channel ID for use in constructor of TSIAnalogSlider and TSIElectrode.
Kojto 7:f4bb237d08ca 112 * @throws compile-time error if target is not supported, or runtime error if pin does not match any channel.
Kojto 7:f4bb237d08ca 113 */
Kojto 7:f4bb237d08ca 114 static uint8_t getTSIChannel(PinName pin) {
Kojto 7:f4bb237d08ca 115 #if defined (TARGET_KL25Z) || defined (TARGET_KL05Z)
Kojto 7:f4bb237d08ca 116 switch(pin) {
Kojto 7:f4bb237d08ca 117 //these are
Kojto 7:f4bb237d08ca 118 case PTA0: return 1;
Kojto 7:f4bb237d08ca 119 case PTA1: return 2;
Kojto 7:f4bb237d08ca 120 case PTA2: return 3;
Kojto 7:f4bb237d08ca 121 case PTA3: return 4;
Kojto 7:f4bb237d08ca 122 case PTA4: return 5;
Kojto 7:f4bb237d08ca 123 case PTB0: return 0;
Kojto 7:f4bb237d08ca 124 case PTB1: return 6;
Kojto 7:f4bb237d08ca 125 case PTB2: return 7;
Kojto 7:f4bb237d08ca 126 case PTB3: return 8;
Kojto 7:f4bb237d08ca 127 case PTB16: return 9;
Kojto 7:f4bb237d08ca 128 case PTB17: return 10;
Kojto 7:f4bb237d08ca 129 case PTB18: return 11;
Kojto 7:f4bb237d08ca 130 case PTB19: return 12;
Kojto 7:f4bb237d08ca 131 #ifdef TARGET_KL25Z
Kojto 7:f4bb237d08ca 132 case PTC0: return 13;
Kojto 7:f4bb237d08ca 133 case PTC1: return 14;
Kojto 7:f4bb237d08ca 134 #endif
Kojto 7:f4bb237d08ca 135 default: error("PinName provided to TSIElectrode::getTSIChannel() does not correspond to any known TSI channel.");
Kojto 7:f4bb237d08ca 136 }
Kojto 7:f4bb237d08ca 137 # else
Kojto 7:f4bb237d08ca 138 #error "Unknown target for TSIElectrode::getTSIChannel() - only supports KL25Z so far."
Kojto 7:f4bb237d08ca 139 # endif
Kojto 7:f4bb237d08ca 140 return 0xFF; //should never get here
Kojto 7:f4bb237d08ca 141 }
Kojto 7:f4bb237d08ca 142
Kojto 7:f4bb237d08ca 143 private:
Kojto 7:f4bb237d08ca 144 uint8_t _channel;
Kojto 7:f4bb237d08ca 145 uint16_t _signal;
Kojto 7:f4bb237d08ca 146 uint16_t _baseline;
Kojto 7:f4bb237d08ca 147 uint16_t _threshold;
Kojto 7:f4bb237d08ca 148 };
Kojto 7:f4bb237d08ca 149
Kojto 7:f4bb237d08ca 150 /** Analog slider which consists of two electrodes.
Kojto 7:f4bb237d08ca 151 */
Kojto 7:f4bb237d08ca 152 class TSIAnalogSlider {
Kojto 7:f4bb237d08ca 153 public:
Kojto 7:f4bb237d08ca 154 /**
Kojto 7:f4bb237d08ca 155 *
Kojto 7:f4bb237d08ca 156 * Initialize the TSI Touch Sensor with the given PinNames
Kojto 7:f4bb237d08ca 157 */
Kojto 7:f4bb237d08ca 158 TSIAnalogSlider(PinName elec0, PinName elec1, uint32_t range);
Kojto 7:f4bb237d08ca 159 /**
Kojto 7:f4bb237d08ca 160 * Initialize the TSI Touch Sensor
Kojto 7:f4bb237d08ca 161 */
Kojto 7:f4bb237d08ca 162 TSIAnalogSlider(uint32_t elec0, uint32_t elec1, uint32_t range);
Kojto 7:f4bb237d08ca 163 /**
Kojto 7:f4bb237d08ca 164 * Read Touch Sensor percentage value
Kojto 7:f4bb237d08ca 165 *
Kojto 7:f4bb237d08ca 166 * @returns percentage value between [0 ... 1]
Kojto 7:f4bb237d08ca 167 */
Kojto 7:f4bb237d08ca 168 float readPercentage();
Kojto 7:f4bb237d08ca 169 /**
Kojto 7:f4bb237d08ca 170 * Read Touch Sensor distance
Kojto 7:f4bb237d08ca 171 *
Kojto 7:f4bb237d08ca 172 * @returns distance in mm. The value is between [0 ... _range]
Kojto 7:f4bb237d08ca 173 */
Kojto 7:f4bb237d08ca 174 uint32_t readDistance();
Kojto 7:f4bb237d08ca 175 /** Get current electrode.
Kojto 7:f4bb237d08ca 176 */
Kojto 7:f4bb237d08ca 177 TSIElectrode* getCurrentElectrode() {
Kojto 7:f4bb237d08ca 178 return _current_elec;
Kojto 7:f4bb237d08ca 179 }
Kojto 7:f4bb237d08ca 180 /** Set current electrode which is being measured.
Kojto 7:f4bb237d08ca 181 */
Kojto 7:f4bb237d08ca 182 void setCurrentElectrode(TSIElectrode *elec){
Kojto 7:f4bb237d08ca 183 _current_elec = elec;
Kojto 7:f4bb237d08ca 184 }
Kojto 7:f4bb237d08ca 185 /** Get next electrode.
Kojto 7:f4bb237d08ca 186 */
Kojto 7:f4bb237d08ca 187 TSIElectrode* getNextElectrode(TSIElectrode* electrode) {
Kojto 7:f4bb237d08ca 188 if (electrode->getChannel() == _elec0.getChannel()) {
Kojto 7:f4bb237d08ca 189 return &_elec1;
Kojto 7:f4bb237d08ca 190 } else {
Kojto 7:f4bb237d08ca 191 return &_elec0;
Kojto 7:f4bb237d08ca 192 }
Kojto 7:f4bb237d08ca 193 }
Kojto 7:f4bb237d08ca 194 /** Return absolute distance position.
Kojto 7:f4bb237d08ca 195 */
Kojto 7:f4bb237d08ca 196 uint32_t getAbsoluteDistance() {
Kojto 7:f4bb237d08ca 197 return _absolute_distance_pos;
Kojto 7:f4bb237d08ca 198 }
Kojto 7:f4bb237d08ca 199 /** Return absolute precentage position.
Kojto 7:f4bb237d08ca 200 */
Kojto 7:f4bb237d08ca 201 uint32_t getAbsolutePosition() {
Kojto 7:f4bb237d08ca 202 return _absolute_percentage_pos;
Kojto 7:f4bb237d08ca 203 }
Kojto 7:f4bb237d08ca 204 /** Set value to the scan in progress flag.
Kojto 7:f4bb237d08ca 205 */
Kojto 7:f4bb237d08ca 206 void setScan(uint32_t scan) {
Kojto 7:f4bb237d08ca 207 _scan_in_progress = scan;
Kojto 7:f4bb237d08ca 208 }
Kojto 7:f4bb237d08ca 209 /** Return instance to Analog slider. Used in tsi irq.
Kojto 7:f4bb237d08ca 210 */
Kojto 7:f4bb237d08ca 211 static TSIAnalogSlider *getInstance() {
Kojto 7:f4bb237d08ca 212 return _instance;
Kojto 7:f4bb237d08ca 213 }
Kojto 7:f4bb237d08ca 214 private:
Kojto 7:f4bb237d08ca 215 void initObject(void); //shared constructor code
Kojto 7:f4bb237d08ca 216 void sliderRead(void);
Kojto 7:f4bb237d08ca 217 void selfCalibration(void);
Kojto 7:f4bb237d08ca 218 void setSliderPercPosition(uint32_t elec_num, uint32_t position) {
Kojto 7:f4bb237d08ca 219 _percentage_position[elec_num] = position;
Kojto 7:f4bb237d08ca 220 }
Kojto 7:f4bb237d08ca 221 void setSliderDisPosition(uint32_t elec_num, uint32_t position) {
Kojto 7:f4bb237d08ca 222 _distance_position[elec_num] = position;
Kojto 7:f4bb237d08ca 223 }
Kojto 7:f4bb237d08ca 224 void setAbsolutePosition(uint32_t position) {
Kojto 7:f4bb237d08ca 225 _absolute_percentage_pos = position;
Kojto 7:f4bb237d08ca 226 }
Kojto 7:f4bb237d08ca 227 void setAbsoluteDistance(uint32_t distance) {
Kojto 7:f4bb237d08ca 228 _absolute_distance_pos = distance;
Kojto 7:f4bb237d08ca 229 }
Kojto 7:f4bb237d08ca 230 private:
Kojto 7:f4bb237d08ca 231 TSIElectrode _elec0;
Kojto 7:f4bb237d08ca 232 TSIElectrode _elec1;
Kojto 7:f4bb237d08ca 233 uint8_t _scan_in_progress;
Kojto 7:f4bb237d08ca 234 TSIElectrode* _current_elec;
Kojto 7:f4bb237d08ca 235 uint8_t _percentage_position[2];
Kojto 7:f4bb237d08ca 236 uint8_t _distance_position[2];
Kojto 7:f4bb237d08ca 237 uint32_t _absolute_percentage_pos;
Kojto 7:f4bb237d08ca 238 uint32_t _absolute_distance_pos;
Kojto 7:f4bb237d08ca 239 uint8_t _range;
Kojto 7:f4bb237d08ca 240 protected:
Kojto 7:f4bb237d08ca 241 static TSIAnalogSlider *_instance;
Kojto 7:f4bb237d08ca 242 };
Kojto 7:f4bb237d08ca 243
Kojto 7:f4bb237d08ca 244 #endif