Mateusz Jaskula
/
KL25Z_TangoIO
KL25 driver for Tango Control System
tsi_sensor/tsi_sensor.h@2:9fe6f1e273b4, 2014-08-28 (annotated)
- Committer:
- jskl
- Date:
- Thu Aug 28 07:50:06 2014 +0000
- Revision:
- 2:9fe6f1e273b4
- Parent:
- 0:5d27c333afa6
Fixed bugs in JSON format replies
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jskl | 0:5d27c333afa6 | 1 | /* Freescale Semiconductor Inc. |
jskl | 0:5d27c333afa6 | 2 | * |
jskl | 0:5d27c333afa6 | 3 | * mbed Microcontroller Library |
jskl | 0:5d27c333afa6 | 4 | * (c) Copyright 2009-2012 ARM Limited. |
jskl | 0:5d27c333afa6 | 5 | * |
jskl | 0:5d27c333afa6 | 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy of this software |
jskl | 0:5d27c333afa6 | 7 | * and associated documentation files (the "Software"), to deal in the Software without |
jskl | 0:5d27c333afa6 | 8 | * restriction, including without limitation the rights to use, copy, modify, merge, publish, |
jskl | 0:5d27c333afa6 | 9 | * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the |
jskl | 0:5d27c333afa6 | 10 | * Software is furnished to do so, subject to the following conditions: |
jskl | 0:5d27c333afa6 | 11 | * |
jskl | 0:5d27c333afa6 | 12 | * The above copyright notice and this permission notice shall be included in all copies or |
jskl | 0:5d27c333afa6 | 13 | * substantial portions of the Software. |
jskl | 0:5d27c333afa6 | 14 | * |
jskl | 0:5d27c333afa6 | 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
jskl | 0:5d27c333afa6 | 16 | * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
jskl | 0:5d27c333afa6 | 17 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
jskl | 0:5d27c333afa6 | 18 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
jskl | 0:5d27c333afa6 | 19 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
jskl | 0:5d27c333afa6 | 20 | */ |
jskl | 0:5d27c333afa6 | 21 | |
jskl | 0:5d27c333afa6 | 22 | #ifndef TSISENSOR_H |
jskl | 0:5d27c333afa6 | 23 | #define TSISENSOR_H |
jskl | 0:5d27c333afa6 | 24 | |
jskl | 0:5d27c333afa6 | 25 | /** |
jskl | 0:5d27c333afa6 | 26 | * TSISensor example |
jskl | 0:5d27c333afa6 | 27 | * |
jskl | 0:5d27c333afa6 | 28 | * @code |
jskl | 0:5d27c333afa6 | 29 | * #include "mbed.h" |
jskl | 0:5d27c333afa6 | 30 | * #include "TSISensor.h" |
jskl | 0:5d27c333afa6 | 31 | * |
jskl | 0:5d27c333afa6 | 32 | * int main(void) { |
jskl | 0:5d27c333afa6 | 33 | * DigitalOut led(LED_GREEN); |
jskl | 0:5d27c333afa6 | 34 | * TSIElectrode elec0(9); |
jskl | 0:5d27c333afa6 | 35 | * TSIElectrode elec1(10); |
jskl | 0:5d27c333afa6 | 36 | * TSIAnalogSlider tsi(elec0, elec1, 40); |
jskl | 0:5d27c333afa6 | 37 | * |
jskl | 0:5d27c333afa6 | 38 | * while (true) { |
jskl | 0:5d27c333afa6 | 39 | * printf("slider percentage: %f%\r\n", tsi.readPercentage()); |
jskl | 0:5d27c333afa6 | 40 | * printf("slider distance: %dmm\r\n", tsi.readDistance()); |
jskl | 0:5d27c333afa6 | 41 | * wait(1); |
jskl | 0:5d27c333afa6 | 42 | * led = !led; |
jskl | 0:5d27c333afa6 | 43 | * } |
jskl | 0:5d27c333afa6 | 44 | * } |
jskl | 0:5d27c333afa6 | 45 | * @endcode |
jskl | 0:5d27c333afa6 | 46 | */ |
jskl | 0:5d27c333afa6 | 47 | #define NO_TOUCH 0 |
jskl | 0:5d27c333afa6 | 48 | |
jskl | 0:5d27c333afa6 | 49 | /** TSI Electrode with simple data required for touch detection. |
jskl | 0:5d27c333afa6 | 50 | */ |
jskl | 0:5d27c333afa6 | 51 | class TSIElectrode { |
jskl | 0:5d27c333afa6 | 52 | public: |
jskl | 0:5d27c333afa6 | 53 | /** Initialize electrode. |
jskl | 0:5d27c333afa6 | 54 | */ |
jskl | 0:5d27c333afa6 | 55 | TSIElectrode(uint32_t tsi_channel) : _threshold(100) { |
jskl | 0:5d27c333afa6 | 56 | _channel = (uint8_t)tsi_channel; |
jskl | 0:5d27c333afa6 | 57 | } |
jskl | 0:5d27c333afa6 | 58 | /** Set baseline. |
jskl | 0:5d27c333afa6 | 59 | */ |
jskl | 0:5d27c333afa6 | 60 | void setBaseline(uint32_t baseline) { |
jskl | 0:5d27c333afa6 | 61 | _baseline = (uint16_t)baseline; |
jskl | 0:5d27c333afa6 | 62 | } |
jskl | 0:5d27c333afa6 | 63 | /** Set threshold. |
jskl | 0:5d27c333afa6 | 64 | */ |
jskl | 0:5d27c333afa6 | 65 | void setThreshold(uint32_t threshold) { |
jskl | 0:5d27c333afa6 | 66 | _threshold = (uint16_t)threshold; |
jskl | 0:5d27c333afa6 | 67 | } |
jskl | 0:5d27c333afa6 | 68 | /** Set signal. |
jskl | 0:5d27c333afa6 | 69 | */ |
jskl | 0:5d27c333afa6 | 70 | void setSignal(uint32_t signal) { |
jskl | 0:5d27c333afa6 | 71 | _signal = (uint16_t)signal; |
jskl | 0:5d27c333afa6 | 72 | } |
jskl | 0:5d27c333afa6 | 73 | /** Get baseline. |
jskl | 0:5d27c333afa6 | 74 | */ |
jskl | 0:5d27c333afa6 | 75 | uint32_t getBaseline() { |
jskl | 0:5d27c333afa6 | 76 | return _baseline; |
jskl | 0:5d27c333afa6 | 77 | } |
jskl | 0:5d27c333afa6 | 78 | /** Get delta. |
jskl | 0:5d27c333afa6 | 79 | */ |
jskl | 0:5d27c333afa6 | 80 | uint32_t getDelta() { |
jskl | 0:5d27c333afa6 | 81 | int32_t delta = getSignal() - getBaseline(); |
jskl | 0:5d27c333afa6 | 82 | if (delta < 0) { |
jskl | 0:5d27c333afa6 | 83 | return 0; |
jskl | 0:5d27c333afa6 | 84 | } else { |
jskl | 0:5d27c333afa6 | 85 | return delta; |
jskl | 0:5d27c333afa6 | 86 | } |
jskl | 0:5d27c333afa6 | 87 | } |
jskl | 0:5d27c333afa6 | 88 | /** Get signal. |
jskl | 0:5d27c333afa6 | 89 | */ |
jskl | 0:5d27c333afa6 | 90 | uint32_t getSignal() { |
jskl | 0:5d27c333afa6 | 91 | return _signal; |
jskl | 0:5d27c333afa6 | 92 | } |
jskl | 0:5d27c333afa6 | 93 | /** Get threshold. |
jskl | 0:5d27c333afa6 | 94 | */ |
jskl | 0:5d27c333afa6 | 95 | uint32_t getThreshold() { |
jskl | 0:5d27c333afa6 | 96 | return _threshold; |
jskl | 0:5d27c333afa6 | 97 | } |
jskl | 0:5d27c333afa6 | 98 | /** Get channel. |
jskl | 0:5d27c333afa6 | 99 | */ |
jskl | 0:5d27c333afa6 | 100 | uint32_t getChannel() { |
jskl | 0:5d27c333afa6 | 101 | return _channel; |
jskl | 0:5d27c333afa6 | 102 | } |
jskl | 0:5d27c333afa6 | 103 | private: |
jskl | 0:5d27c333afa6 | 104 | uint8_t _channel; |
jskl | 0:5d27c333afa6 | 105 | uint16_t _signal; |
jskl | 0:5d27c333afa6 | 106 | uint16_t _baseline; |
jskl | 0:5d27c333afa6 | 107 | uint16_t _threshold; |
jskl | 0:5d27c333afa6 | 108 | }; |
jskl | 0:5d27c333afa6 | 109 | |
jskl | 0:5d27c333afa6 | 110 | /** Analog slider which consists of two electrodes. |
jskl | 0:5d27c333afa6 | 111 | */ |
jskl | 0:5d27c333afa6 | 112 | class TSIAnalogSlider { |
jskl | 0:5d27c333afa6 | 113 | public: |
jskl | 0:5d27c333afa6 | 114 | /** |
jskl | 0:5d27c333afa6 | 115 | * Initialize the TSI Touch Sensor |
jskl | 0:5d27c333afa6 | 116 | */ |
jskl | 0:5d27c333afa6 | 117 | TSIAnalogSlider(uint32_t elec0, uint32_t elec1, uint32_t range); |
jskl | 0:5d27c333afa6 | 118 | /** |
jskl | 0:5d27c333afa6 | 119 | * Read Touch Sensor percentage value |
jskl | 0:5d27c333afa6 | 120 | * |
jskl | 0:5d27c333afa6 | 121 | * @returns percentage value between [0 ... 1] |
jskl | 0:5d27c333afa6 | 122 | */ |
jskl | 0:5d27c333afa6 | 123 | float readPercentage(); |
jskl | 0:5d27c333afa6 | 124 | /** |
jskl | 0:5d27c333afa6 | 125 | * Read Touch Sensor distance |
jskl | 0:5d27c333afa6 | 126 | * |
jskl | 0:5d27c333afa6 | 127 | * @returns distance in mm. The value is between [0 ... _range] |
jskl | 0:5d27c333afa6 | 128 | */ |
jskl | 0:5d27c333afa6 | 129 | uint32_t readDistance(); |
jskl | 0:5d27c333afa6 | 130 | /** Get current electrode. |
jskl | 0:5d27c333afa6 | 131 | */ |
jskl | 0:5d27c333afa6 | 132 | TSIElectrode* getCurrentElectrode() { |
jskl | 0:5d27c333afa6 | 133 | return _current_elec; |
jskl | 0:5d27c333afa6 | 134 | } |
jskl | 0:5d27c333afa6 | 135 | /** Set current electrode which is being measured. |
jskl | 0:5d27c333afa6 | 136 | */ |
jskl | 0:5d27c333afa6 | 137 | void setCurrentElectrode(TSIElectrode *elec){ |
jskl | 0:5d27c333afa6 | 138 | _current_elec = elec; |
jskl | 0:5d27c333afa6 | 139 | } |
jskl | 0:5d27c333afa6 | 140 | /** Get next electrode. |
jskl | 0:5d27c333afa6 | 141 | */ |
jskl | 0:5d27c333afa6 | 142 | TSIElectrode* getNextElectrode(TSIElectrode* electrode) { |
jskl | 0:5d27c333afa6 | 143 | if (electrode->getChannel() == _elec0.getChannel()) { |
jskl | 0:5d27c333afa6 | 144 | return &_elec1; |
jskl | 0:5d27c333afa6 | 145 | } else { |
jskl | 0:5d27c333afa6 | 146 | return &_elec0; |
jskl | 0:5d27c333afa6 | 147 | } |
jskl | 0:5d27c333afa6 | 148 | } |
jskl | 0:5d27c333afa6 | 149 | /** Return absolute distance position. |
jskl | 0:5d27c333afa6 | 150 | */ |
jskl | 0:5d27c333afa6 | 151 | uint32_t getAbsoluteDistance() { |
jskl | 0:5d27c333afa6 | 152 | return _absolute_distance_pos; |
jskl | 0:5d27c333afa6 | 153 | } |
jskl | 0:5d27c333afa6 | 154 | /** Return absolute precentage position. |
jskl | 0:5d27c333afa6 | 155 | */ |
jskl | 0:5d27c333afa6 | 156 | uint32_t getAbsolutePosition() { |
jskl | 0:5d27c333afa6 | 157 | return _absolute_percentage_pos; |
jskl | 0:5d27c333afa6 | 158 | } |
jskl | 0:5d27c333afa6 | 159 | /** Set value to the scan in progress flag. |
jskl | 0:5d27c333afa6 | 160 | */ |
jskl | 0:5d27c333afa6 | 161 | void setScan(uint32_t scan) { |
jskl | 0:5d27c333afa6 | 162 | _scan_in_progress = scan; |
jskl | 0:5d27c333afa6 | 163 | } |
jskl | 0:5d27c333afa6 | 164 | /** Return instance to Analog slider. Used in tsi irq. |
jskl | 0:5d27c333afa6 | 165 | */ |
jskl | 0:5d27c333afa6 | 166 | static TSIAnalogSlider *getInstance() { |
jskl | 0:5d27c333afa6 | 167 | return _instance; |
jskl | 0:5d27c333afa6 | 168 | } |
jskl | 0:5d27c333afa6 | 169 | private: |
jskl | 0:5d27c333afa6 | 170 | void sliderRead(void); |
jskl | 0:5d27c333afa6 | 171 | void selfCalibration(void); |
jskl | 0:5d27c333afa6 | 172 | void setSliderPercPosition(uint32_t elec_num, uint32_t position) { |
jskl | 0:5d27c333afa6 | 173 | _percentage_position[elec_num] = position; |
jskl | 0:5d27c333afa6 | 174 | } |
jskl | 0:5d27c333afa6 | 175 | void setSliderDisPosition(uint32_t elec_num, uint32_t position) { |
jskl | 0:5d27c333afa6 | 176 | _distance_position[elec_num] = position; |
jskl | 0:5d27c333afa6 | 177 | } |
jskl | 0:5d27c333afa6 | 178 | void setAbsolutePosition(uint32_t position) { |
jskl | 0:5d27c333afa6 | 179 | _absolute_percentage_pos = position; |
jskl | 0:5d27c333afa6 | 180 | } |
jskl | 0:5d27c333afa6 | 181 | void setAbsoluteDistance(uint32_t distance) { |
jskl | 0:5d27c333afa6 | 182 | _absolute_distance_pos = distance; |
jskl | 0:5d27c333afa6 | 183 | } |
jskl | 0:5d27c333afa6 | 184 | private: |
jskl | 0:5d27c333afa6 | 185 | TSIElectrode _elec0; |
jskl | 0:5d27c333afa6 | 186 | TSIElectrode _elec1; |
jskl | 0:5d27c333afa6 | 187 | uint8_t _scan_in_progress; |
jskl | 0:5d27c333afa6 | 188 | TSIElectrode* _current_elec; |
jskl | 0:5d27c333afa6 | 189 | uint8_t _percentage_position[2]; |
jskl | 0:5d27c333afa6 | 190 | uint8_t _distance_position[2]; |
jskl | 0:5d27c333afa6 | 191 | uint32_t _absolute_percentage_pos; |
jskl | 0:5d27c333afa6 | 192 | uint32_t _absolute_distance_pos; |
jskl | 0:5d27c333afa6 | 193 | uint8_t _range; |
jskl | 0:5d27c333afa6 | 194 | protected: |
jskl | 0:5d27c333afa6 | 195 | static TSIAnalogSlider *_instance; |
jskl | 0:5d27c333afa6 | 196 | }; |
jskl | 0:5d27c333afa6 | 197 | |
jskl | 0:5d27c333afa6 | 198 | #endif |