KL25 driver for Tango Control System

Dependencies:   mbed

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?

UserRevisionLine numberNew 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