wayne roberts / tsi_sensor

Fork of tsi_sensor by Martin Kojtal

Committer:
dudmuck
Date:
Fri Apr 17 01:53:22 2015 +0000
Revision:
9:525736a96433
Parent:
4:f64097679f27
only builds for PLATFORM_Freescale

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 0:9331e373c138 1 /* Freescale Semiconductor Inc.
Kojto 0:9331e373c138 2 * mbed Microcontroller Library
Kojto 0:9331e373c138 3 * (c) Copyright 2014 ARM Limited.
Kojto 0:9331e373c138 4 *
Kojto 0:9331e373c138 5 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Kojto 0:9331e373c138 6 * and associated documentation files (the "Software"), to deal in the Software without
Kojto 0:9331e373c138 7 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
Kojto 0:9331e373c138 8 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
Kojto 0:9331e373c138 9 * Software is furnished to do so, subject to the following conditions:
Kojto 0:9331e373c138 10 *
Kojto 0:9331e373c138 11 * The above copyright notice and this permission notice shall be included in all copies or
Kojto 0:9331e373c138 12 * substantial portions of the Software.
Kojto 0:9331e373c138 13 *
Kojto 0:9331e373c138 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
Kojto 0:9331e373c138 15 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Kojto 0:9331e373c138 16 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
Kojto 0:9331e373c138 17 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Kojto 0:9331e373c138 18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Kojto 0:9331e373c138 19 */
Kojto 0:9331e373c138 20
Kojto 0:9331e373c138 21 #include "mbed.h"
Kojto 1:8a2098a10330 22 #include "tsi_sensor.h"
dudmuck 9:525736a96433 23 #ifdef TARGET_Freescale
Kojto 0:9331e373c138 24
Kojto 0:9331e373c138 25 void tsi_irq(void);
Kojto 0:9331e373c138 26 TSIAnalogSlider *TSIAnalogSlider::_instance;
Kojto 0:9331e373c138 27
bjo3rn 4:f64097679f27 28 TSIAnalogSlider::TSIAnalogSlider(PinName pin0, PinName pin1, uint32_t range): _elec0(pin0), _elec1(pin1), _range(range) {
bjo3rn 4:f64097679f27 29 initObject();
bjo3rn 4:f64097679f27 30 }
Kojto 3:20ffa9b18488 31 TSIAnalogSlider::TSIAnalogSlider(uint32_t elec0, uint32_t elec1,
Kojto 0:9331e373c138 32 uint32_t range)
Kojto 0:9331e373c138 33 : _elec0(elec0), _elec1(elec1), _range(range) {
bjo3rn 4:f64097679f27 34 initObject();
bjo3rn 4:f64097679f27 35 }
bjo3rn 4:f64097679f27 36
bjo3rn 4:f64097679f27 37 void TSIAnalogSlider::initObject(void) {
Kojto 0:9331e373c138 38 _instance = this;
Kojto 3:20ffa9b18488 39 _current_elec = &_elec0;
Kojto 0:9331e373c138 40 SIM->SCGC5 |= SIM_SCGC5_TSI_MASK;
Kojto 0:9331e373c138 41
Kojto 0:9331e373c138 42 TSI0->GENCS |= (TSI_GENCS_ESOR_MASK | TSI_GENCS_MODE(0) | TSI_GENCS_REFCHRG(4)
Kojto 0:9331e373c138 43 | TSI_GENCS_DVOLT(0) | TSI_GENCS_EXTCHRG(7) | TSI_GENCS_PS(4)
Kojto 0:9331e373c138 44 | TSI_GENCS_NSCN(11) | TSI_GENCS_TSIIEN_MASK | TSI_GENCS_STPE_MASK);
Kojto 0:9331e373c138 45 TSI0->GENCS |= TSI_GENCS_TSIEN_MASK;
Kojto 0:9331e373c138 46
Kojto 0:9331e373c138 47 NVIC_SetVector(TSI0_IRQn, (uint32_t)&tsi_irq);
Kojto 0:9331e373c138 48 NVIC_EnableIRQ(TSI0_IRQn);
Kojto 0:9331e373c138 49
Kojto 0:9331e373c138 50 selfCalibration();
Kojto 0:9331e373c138 51 }
Kojto 0:9331e373c138 52
Kojto 0:9331e373c138 53 static void initBaseline(TSIElectrode& elec)
Kojto 0:9331e373c138 54 {
Kojto 0:9331e373c138 55 uint32_t channel0 = elec.getChannel();
Kojto 0:9331e373c138 56 TSI0->DATA = ((channel0 << TSI_DATA_TSICH_SHIFT) );
Kojto 0:9331e373c138 57 TSI0->DATA |= TSI_DATA_SWTS_MASK;
Kojto 0:9331e373c138 58 while(!(TSI0->GENCS & TSI_GENCS_EOSF_MASK));
Kojto 0:9331e373c138 59 TSI0->GENCS |= TSI_GENCS_EOSF_MASK;
Kojto 0:9331e373c138 60 elec.setBaseline(TSI0->DATA & TSI_DATA_TSICNT_MASK);
Kojto 0:9331e373c138 61 }
Kojto 0:9331e373c138 62
Kojto 0:9331e373c138 63 void TSIAnalogSlider::selfCalibration(void)
Kojto 0:9331e373c138 64 {
Kojto 0:9331e373c138 65 TSI0->GENCS |= TSI_GENCS_EOSF_MASK; // Clear End of Scan Flag
Kojto 0:9331e373c138 66 TSI0->GENCS &= ~TSI_GENCS_TSIEN_MASK; // Disable TSI module
Kojto 0:9331e373c138 67
Kojto 0:9331e373c138 68 uint32_t trigger_backup;
Kojto 0:9331e373c138 69 if(TSI0->GENCS & TSI_GENCS_STM_MASK) { // Back-up TSI Trigger mode from Application
Kojto 0:9331e373c138 70 trigger_backup = 1;
Kojto 0:9331e373c138 71 } else {
Kojto 0:9331e373c138 72 trigger_backup = 0;
Kojto 0:9331e373c138 73 }
Kojto 0:9331e373c138 74
Kojto 0:9331e373c138 75 TSI0->GENCS &= ~TSI_GENCS_STM_MASK; // Use SW trigger
Kojto 0:9331e373c138 76 TSI0->GENCS &= ~TSI_GENCS_TSIIEN_MASK; // Enable TSI interrupts
Kojto 0:9331e373c138 77 TSI0->GENCS |= TSI_GENCS_TSIEN_MASK; // Enable TSI module
Kojto 0:9331e373c138 78
Kojto 0:9331e373c138 79 initBaseline(_elec0);
Kojto 0:9331e373c138 80 initBaseline(_elec1);
Kojto 0:9331e373c138 81
Kojto 0:9331e373c138 82 TSI0->DATA = ((_elec0.getChannel() << TSI_DATA_TSICH_SHIFT));
Kojto 0:9331e373c138 83
Kojto 0:9331e373c138 84 TSI0->GENCS &= ~TSI_GENCS_TSIEN_MASK; // Disable TSI module
Kojto 0:9331e373c138 85 TSI0->GENCS |= TSI_GENCS_TSIIEN_MASK; // Enale TSI interrupt
Kojto 0:9331e373c138 86 if (trigger_backup) { // Restore trigger mode
Kojto 0:9331e373c138 87 TSI0->GENCS |= TSI_GENCS_STM_MASK;
Kojto 0:9331e373c138 88 } else {
Kojto 0:9331e373c138 89 TSI0->GENCS &= ~TSI_GENCS_STM_MASK;
Kojto 0:9331e373c138 90 }
Kojto 0:9331e373c138 91
Kojto 0:9331e373c138 92 TSI0->GENCS |= TSI_GENCS_TSIEN_MASK; // Enable TSI module
Kojto 0:9331e373c138 93 TSI0->DATA |= TSI_DATA_SWTS_MASK;
Kojto 0:9331e373c138 94 }
Kojto 0:9331e373c138 95
Kojto 0:9331e373c138 96
Kojto 0:9331e373c138 97 void TSIAnalogSlider::sliderRead(void ) {
Kojto 0:9331e373c138 98 if (_scan_in_progress) {
Kojto 0:9331e373c138 99 _scan_in_progress = 0;
Kojto 0:9331e373c138 100 uint32_t delta0 = _elec0.getDelta();
Kojto 0:9331e373c138 101 uint32_t delta1 = _elec1.getDelta();
Kojto 0:9331e373c138 102
Kojto 0:9331e373c138 103 if ((delta0 > _elec0.getThreshold()) || (delta1 > _elec1.getThreshold())) {
Kojto 0:9331e373c138 104 uint32_t perc_pos0 = (delta0 * 100) / (delta0 + delta1);
Kojto 0:9331e373c138 105 uint32_t perc_pos1 = (delta1 * 100) / (delta0 + delta1);
Kojto 0:9331e373c138 106 setSliderPercPosition(0, perc_pos0);
Kojto 0:9331e373c138 107 setSliderPercPosition(1, perc_pos1);
Kojto 0:9331e373c138 108 uint32_t dist_pos0 = (perc_pos0 * _range) / 100;
Kojto 0:9331e373c138 109 uint32_t dist_pos1 = (perc_pos0 * _range) / 100;
Kojto 0:9331e373c138 110 setSliderDisPosition(0, dist_pos0);
Kojto 0:9331e373c138 111 setSliderDisPosition(1, dist_pos1);
Kojto 0:9331e373c138 112
Kojto 0:9331e373c138 113 setAbsolutePosition(((100 - perc_pos0) + perc_pos1) / 2);
Kojto 0:9331e373c138 114 setAbsoluteDistance(((_range - dist_pos0) + dist_pos1) / 2);
Kojto 0:9331e373c138 115 } else {
Kojto 0:9331e373c138 116 setSliderPercPosition(0, 0);
Kojto 0:9331e373c138 117 setSliderPercPosition(1, 0);
Kojto 0:9331e373c138 118 setSliderDisPosition(0, 0);
Kojto 0:9331e373c138 119 setSliderDisPosition(1, 0);
Kojto 0:9331e373c138 120 setAbsolutePosition(0);
Kojto 0:9331e373c138 121 setAbsoluteDistance(0);
Kojto 0:9331e373c138 122 }
Kojto 0:9331e373c138 123 }
Kojto 0:9331e373c138 124 }
Kojto 0:9331e373c138 125
Kojto 0:9331e373c138 126 float TSIAnalogSlider::readPercentage() {
Kojto 0:9331e373c138 127 sliderRead();
Kojto 0:9331e373c138 128 return (float)getAbsolutePosition() / 100.0;
Kojto 0:9331e373c138 129 }
Kojto 0:9331e373c138 130
Kojto 0:9331e373c138 131 uint32_t TSIAnalogSlider::readDistance() {
Kojto 0:9331e373c138 132 sliderRead();
Kojto 0:9331e373c138 133 return getAbsoluteDistance();
Kojto 0:9331e373c138 134 }
Kojto 0:9331e373c138 135
Kojto 0:9331e373c138 136 static void changeElectrode(TSIAnalogSlider *analog_slider)
Kojto 0:9331e373c138 137 {
Kojto 0:9331e373c138 138 TSIElectrode* elec = analog_slider->getCurrentElectrode();
Kojto 0:9331e373c138 139 uint32_t signal = (TSI0->DATA & TSI_DATA_TSICNT_MASK);
Kojto 0:9331e373c138 140 elec->setSignal(signal);
Kojto 0:9331e373c138 141
Kojto 0:9331e373c138 142 TSIElectrode *next_elec = analog_slider->getNextElectrode(elec);
Kojto 0:9331e373c138 143
Kojto 0:9331e373c138 144 analog_slider->setCurrentElectrode(next_elec);
Kojto 0:9331e373c138 145 TSI0->DATA = ((next_elec->getChannel() << TSI_DATA_TSICH_SHIFT) );
Kojto 0:9331e373c138 146 TSI0->DATA |= TSI_DATA_SWTS_MASK;
Kojto 0:9331e373c138 147 }
Kojto 0:9331e373c138 148
Kojto 0:9331e373c138 149
Kojto 0:9331e373c138 150 void tsi_irq(void)
Kojto 0:9331e373c138 151 {
Kojto 0:9331e373c138 152 TSIAnalogSlider *analog_slider = TSIAnalogSlider::getInstance();
Kojto 0:9331e373c138 153 analog_slider->setScan(1);
Kojto 0:9331e373c138 154 TSI0->GENCS |= TSI_GENCS_EOSF_MASK; // Clear End of Scan Flag
Kojto 0:9331e373c138 155 changeElectrode(analog_slider);
Kojto 0:9331e373c138 156 }
dudmuck 9:525736a96433 157 #endif /* TARGET_Freescale */