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