Driver for HC-SR04 connected to a Microbit

Committer:
isaeldiaz@developer.mbed.org
Date:
Tue Oct 04 21:21:19 2016 +0200
Revision:
18:c425443e177c
Parent:
17:a82fb8fc4ca3
small adjustments to library, the echo function does not attach to the InterruptIn class, not sure why

Who changed what in which revision?

UserRevisionLine numberNew contents of line
isaeldiaz@developer.mbed.org 1:17a477201275 1 /*
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 2 The MIT License (MIT)
isaeldiaz@developer.mbed.org 1:17a477201275 3
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 4 Copyright (c) 2016 British Broadcasting Corporation.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 5 This software is provided by Lancaster University by arrangement with the BBC.
isaeldiaz@developer.mbed.org 1:17a477201275 6
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 7 Permission is hereby granted, free of charge, to any person obtaining a
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 8 copy of this software and associated documentation files (the "Software"),
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 9 to deal in the Software without restriction, including without limitation
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 10 the rights to use, copy, modify, merge, publish, distribute, sublicense,
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 11 and/or sell copies of the Software, and to permit persons to whom the
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 12 Software is furnished to do so, subject to the following conditions:
isaeldiaz@developer.mbed.org 1:17a477201275 13
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 14 The above copyright notice and this permission notice shall be included in
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 15 all copies or substantial portions of the Software.
isaeldiaz@developer.mbed.org 1:17a477201275 16
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 20 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 22 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 23 DEALINGS IN THE SOFTWARE.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 24 */
isaeldiaz@developer.mbed.org 1:17a477201275 25
isaeldiaz@developer.mbed.org 1:17a477201275 26 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 27 * Class definition for MicroBitPin.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 28 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 29 * Commonly represents an I/O pin on the edge connector.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 30 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 31 #include "MicrobitUltrasound.h"
isaeldiaz@developer.mbed.org 2:826744569821 32 #include "MicroBitSystemTimer.h"
isaeldiaz@developer.mbed.org 2:826744569821 33 #include "MicroBitFiber.h"
isaeldiaz@developer.mbed.org 1:17a477201275 34
isaeldiaz@developer.mbed.org 15:36c4434352ca 35 /**
isaeldiaz@developer.mbed.org 15:36c4434352ca 36 * Constructor.
isaeldiaz@developer.mbed.org 15:36c4434352ca 37 * Create new MicrobitUltrasound that reports distance to closest object
isaeldiaz@developer.mbed.org 15:36c4434352ca 38 *
isaeldiaz@developer.mbed.org 15:36c4434352ca 39 * @param triggerPinName Name of the MicroBitPin to be used as trigger.
isaeldiaz@developer.mbed.org 15:36c4434352ca 40 *
isaeldiaz@developer.mbed.org 15:36c4434352ca 41 * @param echoPinName Name of the MicroBitPin to be used as response from sensor.
isaeldiaz@developer.mbed.org 15:36c4434352ca 42 *
isaeldiaz@developer.mbed.org 15:36c4434352ca 43 * @code
isaeldiaz@developer.mbed.org 15:36c4434352ca 44 * MicrobitUltrasound uSoundSensor(MICROBIT_PIN_P1, 100, true, MICROBIT_PIN_P2, PullUp);
isaeldiaz@developer.mbed.org 15:36c4434352ca 45 * @endcode
isaeldiaz@developer.mbed.org 15:36c4434352ca 46 */
isaeldiaz@developer.mbed.org 16:491ac8d7685f 47 MicrobitUltrasound::MicrobitUltrasound(PinName triggerPinName, int _triggerPeriod_ms, bool _triggerActiveValue,
isaeldiaz@developer.mbed.org 16:491ac8d7685f 48 PinName echoPinName, PinMode echoPinMode, uint16_t id):
isaeldiaz@developer.mbed.org 15:36c4434352ca 49 trigger(triggerPinName), echo(echoPinName)
isaeldiaz@developer.mbed.org 15:36c4434352ca 50 {
isaeldiaz@developer.mbed.org 15:36c4434352ca 51 this->id = id;
isaeldiaz@developer.mbed.org 15:36c4434352ca 52 this->status = 0;
isaeldiaz@developer.mbed.org 15:36c4434352ca 53 this->sampleTime = 0;
isaeldiaz@developer.mbed.org 15:36c4434352ca 54 this->triggerDuration_us = MICROBIT_ULTRASOUND_TRIGGER_DURATION_DEFAULT_US;
isaeldiaz@developer.mbed.org 15:36c4434352ca 55 this->triggerPeriod_ms = (uint16_t)_triggerPeriod_ms;
isaeldiaz@developer.mbed.org 15:36c4434352ca 56 this->triggerActiveValue = _triggerActiveValue;
isaeldiaz@developer.mbed.org 15:36c4434352ca 57
isaeldiaz@developer.mbed.org 15:36c4434352ca 58 echo.mode(echoPinMode);
isaeldiaz@developer.mbed.org 15:36c4434352ca 59 echo.rise(this, &MicrobitUltrasound::onEchoRise);
isaeldiaz@developer.mbed.org 18:c425443e177c 60 echo.fall(this, &MicrobitUltrasound::onEchoFall);
isaeldiaz@developer.mbed.org 15:36c4434352ca 61 }
isaeldiaz@developer.mbed.org 15:36c4434352ca 62
isaeldiaz@developer.mbed.org 15:36c4434352ca 63 /**
isaeldiaz@developer.mbed.org 15:36c4434352ca 64 * Constructor.
isaeldiaz@developer.mbed.org 15:36c4434352ca 65 * Create new MicrobitUltrasound that reports distance to closest object
isaeldiaz@developer.mbed.org 15:36c4434352ca 66 *
isaeldiaz@developer.mbed.org 15:36c4434352ca 67 * @param triggerPinName Name of the MicroBitPin to be used as trigger.
isaeldiaz@developer.mbed.org 15:36c4434352ca 68 *
isaeldiaz@developer.mbed.org 15:36c4434352ca 69 * @param echoPinName Name of the MicroBitPin to be used as response from sensor.
isaeldiaz@developer.mbed.org 15:36c4434352ca 70 *
isaeldiaz@developer.mbed.org 15:36c4434352ca 71 * @code
isaeldiaz@developer.mbed.org 15:36c4434352ca 72 * MicrobitUltrasound uSoundSensor(MICROBIT_PIN_P1, MICROBIT_PIN_P2);
isaeldiaz@developer.mbed.org 15:36c4434352ca 73 * @endcode
isaeldiaz@developer.mbed.org 15:36c4434352ca 74 */
isaeldiaz@developer.mbed.org 13:26467bc2991c 75 MicrobitUltrasound::MicrobitUltrasound(PinName triggerPinName, PinName echoPinName, uint16_t id):
isaeldiaz@developer.mbed.org 14:3a9232725ff8 76 trigger(triggerPinName), echo(echoPinName)
isaeldiaz@developer.mbed.org 2:826744569821 77 {
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 78 this->id = id;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 79 this->status = 0;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 80 this->sampleTime = 0;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 81 this->triggerPeriod_ms = MICROBIT_ULTRASOUND_PERIOD_DEFAULT_MS;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 82 this->triggerDuration_us = MICROBIT_ULTRASOUND_TRIGGER_DURATION_DEFAULT_US;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 83 this->triggerActiveValue = TRIGGER_ACTIVE_VALUE;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 84
isaeldiaz@developer.mbed.org 18:c425443e177c 85 //echo.mode((PinMode)MICROBIT_ULTRASOUND_PULLMODE_DEFAULT);
isaeldiaz@developer.mbed.org 14:3a9232725ff8 86 echo.rise(this, &MicrobitUltrasound::onEchoRise);
isaeldiaz@developer.mbed.org 18:c425443e177c 87 echo.fall(this, &MicrobitUltrasound::onEchoFall);
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 88 }
isaeldiaz@developer.mbed.org 2:826744569821 89
isaeldiaz@developer.mbed.org 9:d153bcba081c 90 /**
isaeldiaz@developer.mbed.org 9:d153bcba081c 91 * Destructor for MicrobitUltrasound, where we deregister from the array of fiber components.
isaeldiaz@developer.mbed.org 9:d153bcba081c 92 */
isaeldiaz@developer.mbed.org 9:d153bcba081c 93 MicrobitUltrasound::~MicrobitUltrasound()
isaeldiaz@developer.mbed.org 9:d153bcba081c 94 {
isaeldiaz@developer.mbed.org 9:d153bcba081c 95 fiber_remove_idle_component(this);
isaeldiaz@developer.mbed.org 9:d153bcba081c 96 }
isaeldiaz@developer.mbed.org 2:826744569821 97
isaeldiaz@developer.mbed.org 2:826744569821 98 /**
isaeldiaz@developer.mbed.org 18:c425443e177c 99 * Set Echo PinMode
isaeldiaz@developer.mbed.org 18:c425443e177c 100 */
isaeldiaz@developer.mbed.org 18:c425443e177c 101 void MicrobitUltrasound::setEchoPinMode(PinMode echoPinMode)
isaeldiaz@developer.mbed.org 18:c425443e177c 102 {
isaeldiaz@developer.mbed.org 18:c425443e177c 103 echo.mode(echoPinMode);
isaeldiaz@developer.mbed.org 18:c425443e177c 104 }
isaeldiaz@developer.mbed.org 18:c425443e177c 105
isaeldiaz@developer.mbed.org 18:c425443e177c 106 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 107 * This member function manages the calculation of the timestamp of a pulse detected
isaeldiaz@developer.mbed.org 6:f3780669258d 108 * on the echo pin.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 109 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 110 * @param eventValue the event value to distribute onto the message bus.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 111 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 112 void MicrobitUltrasound::pulseWidthEvent(int eventValue)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 113 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 114 MicroBitEvent evt(id, eventValue, CREATE_ONLY);
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 115 uint64_t now = evt.timestamp;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 116 uint64_t previous = echo.getTimestamp();
isaeldiaz@developer.mbed.org 4:c67cff7b9733 117
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 118 if (previous != 0)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 119 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 120 evt.timestamp -= previous;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 121 evt.fire();
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 122 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 123
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 124 echo.setTimestamp(now);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 125 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 126
isaeldiaz@developer.mbed.org 4:c67cff7b9733 127
isaeldiaz@developer.mbed.org 4:c67cff7b9733 128 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 129 * Interrupt handler for when an rise interrupt is triggered.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 130 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 131 void MicrobitUltrasound::onEchoRise()
isaeldiaz@developer.mbed.org 4:c67cff7b9733 132 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 133 if(status & ULTRASOUND_STATUS_EVENTON_PULSE)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 134 pulseWidthEvent(MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_LO);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 135
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 136 if(status & ULTRASOUND_STATUS_EVENTON_RISE)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 137 MicroBitEvent(id, MICROBIT_ULTRASOUND_EVT_ECHO_RISE);
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 138
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 139 if(status & ULTRASOUND_STATUS_EVENTON_EDGE)
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 140 MicroBitEvent(id, MICROBIT_ULTRASOUND_EVT_ECHO_EDGE);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 141 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 142
isaeldiaz@developer.mbed.org 4:c67cff7b9733 143 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 144 * Interrupt handler for when an fall interrupt is triggered.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 145 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 146 void MicrobitUltrasound::onEchoFall()
isaeldiaz@developer.mbed.org 4:c67cff7b9733 147 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 148 if(status & ULTRASOUND_STATUS_EVENTON_PULSE)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 149 pulseWidthEvent(MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_HI);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 150
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 151 if(status & ULTRASOUND_STATUS_EVENTON_FALL)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 152 MicroBitEvent(id, MICROBIT_ULTRASOUND_EVT_ECHO_FALL);
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 153
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 154 if(status & ULTRASOUND_STATUS_EVENTON_EDGE)
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 155 MicroBitEvent(id, MICROBIT_ULTRASOUND_EVT_ECHO_EDGE);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 156 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 157
isaeldiaz@developer.mbed.org 4:c67cff7b9733 158 /**
isaeldiaz@developer.mbed.org 2:826744569821 159 * Set the sample rate at which the micro:bit triggers sensor (in ms).
isaeldiaz@developer.mbed.org 2:826744569821 160 *
isaeldiaz@developer.mbed.org 2:826744569821 161 * The default sample period is 1 second.
isaeldiaz@developer.mbed.org 2:826744569821 162 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 163 * @param period the requested time between triggers, in milliseconds.
isaeldiaz@developer.mbed.org 2:826744569821 164 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 165 * @note the micro:bit sends triggers in the background.
isaeldiaz@developer.mbed.org 2:826744569821 166 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 167 void MicrobitUltrasound::setPeriod(int period_ms)
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 168 {
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 169 this->triggerPeriod_ms = period_ms;
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 170 }
isaeldiaz@developer.mbed.org 2:826744569821 171
isaeldiaz@developer.mbed.org 2:826744569821 172 /**
isaeldiaz@developer.mbed.org 2:826744569821 173 * Get the sample rate at which the micro:bit triggers sensor (in ms).
isaeldiaz@developer.mbed.org 2:826744569821 174 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 175 * @return period the requested time between triggers, in milliseconds.
isaeldiaz@developer.mbed.org 2:826744569821 176 */
isaeldiaz@developer.mbed.org 15:36c4434352ca 177 int MicrobitUltrasound::getPeriod()
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 178 {
isaeldiaz@developer.mbed.org 15:36c4434352ca 179 return (int)triggerPeriod_ms;
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 180 }
isaeldiaz@developer.mbed.org 2:826744569821 181
isaeldiaz@developer.mbed.org 2:826744569821 182 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 183 * Send trigger to start measurement in sensor
isaeldiaz@developer.mbed.org 2:826744569821 184 *
isaeldiaz@developer.mbed.org 2:826744569821 185 * This call also will add the class to fiber components to receive
isaeldiaz@developer.mbed.org 2:826744569821 186 * one callback only.
isaeldiaz@developer.mbed.org 2:826744569821 187 *
isaeldiaz@developer.mbed.org 2:826744569821 188 * @return MICROBIT_OK on success.
isaeldiaz@developer.mbed.org 2:826744569821 189 */
isaeldiaz@developer.mbed.org 14:3a9232725ff8 190 void MicrobitUltrasound::fireTrigger(void)
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 191 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 192 int actVal, pasVal;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 193 actVal = triggerActiveValue? 1 : 0;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 194 pasVal = triggerActiveValue? 0 : 1;
isaeldiaz@developer.mbed.org 14:3a9232725ff8 195 trigger.write(pasVal);
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 196 wait_us(MICROBIT_ULTRASOUND_IDLE_DURATION_DEFAULT_US);
isaeldiaz@developer.mbed.org 14:3a9232725ff8 197 trigger.write(actVal);
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 198 wait_us(triggerDuration_us);
isaeldiaz@developer.mbed.org 14:3a9232725ff8 199 trigger.write(pasVal);
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 200 }
isaeldiaz@developer.mbed.org 2:826744569821 201
isaeldiaz@developer.mbed.org 2:826744569821 202 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 203 * Start periodic trigger to sensor. This call also will add the class
isaeldiaz@developer.mbed.org 2:826744569821 204 * to fiber components for periodic callbacks.
isaeldiaz@developer.mbed.org 2:826744569821 205 *
isaeldiaz@developer.mbed.org 2:826744569821 206 * @return MICROBIT_OK on success.
isaeldiaz@developer.mbed.org 2:826744569821 207 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 208 int MicrobitUltrasound::start(void)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 209 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 210 int result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 211 status |= MICROBIT_COMPONENT_RUNNING;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 212 result = updateSample();
isaeldiaz@developer.mbed.org 4:c67cff7b9733 213 return result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 214 }
isaeldiaz@developer.mbed.org 2:826744569821 215
isaeldiaz@developer.mbed.org 2:826744569821 216 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 217 * Stop periodic trigger to sensor.
isaeldiaz@developer.mbed.org 2:826744569821 218 *
isaeldiaz@developer.mbed.org 2:826744569821 219 * @return MICROBIT_OK on success.
isaeldiaz@developer.mbed.org 2:826744569821 220 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 221 int MicrobitUltrasound::stop(void)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 222 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 223 int result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 224 status &= !MICROBIT_COMPONENT_RUNNING;
isaeldiaz@developer.mbed.org 15:36c4434352ca 225 result = fiber_remove_idle_component(this);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 226 return result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 227 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 228
isaeldiaz@developer.mbed.org 4:c67cff7b9733 229
isaeldiaz@developer.mbed.org 4:c67cff7b9733 230
isaeldiaz@developer.mbed.org 4:c67cff7b9733 231 /**
isaeldiaz@developer.mbed.org 15:36c4434352ca 232 * Update Sensor measurement
isaeldiaz@developer.mbed.org 4:c67cff7b9733 233 *
isaeldiaz@developer.mbed.org 4:c67cff7b9733 234 * @return MICROBIT_OK on success.
isaeldiaz@developer.mbed.org 4:c67cff7b9733 235 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 236 int MicrobitUltrasound::updateSample(void)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 237 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 238 int result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 239 if(!(status & ULTRASOUND_STATUS_ADDED_TO_IDLE))
isaeldiaz@developer.mbed.org 4:c67cff7b9733 240 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 241 // If we're running under a fiber scheduer, register ourselves for a periodic callback to keep our data up to date.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 242 // Otherwise, we do just do this on demand with the trigger function.
isaeldiaz@developer.mbed.org 4:c67cff7b9733 243 result = fiber_add_idle_component(this);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 244 if (result != MICROBIT_OK)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 245 return result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 246 status |= ULTRASOUND_STATUS_ADDED_TO_IDLE;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 247 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 248
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 249 // check if we need to update our trigger...
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 250 if (isTriggerNeeded())
isaeldiaz@developer.mbed.org 4:c67cff7b9733 251 {
isaeldiaz@developer.mbed.org 14:3a9232725ff8 252 fireTrigger();
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 253 // Send an event to indicate that we just sent a new trigger.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 254 if (status & ULTRASOUND_STATUS_EVENTON_TRIGGER)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 255 MicroBitEvent e(id, MICROBIT_ULTRASOUND_EVT_TRIGGER);
isaeldiaz@developer.mbed.org 17:a82fb8fc4ca3 256
isaeldiaz@developer.mbed.org 17:a82fb8fc4ca3 257 // Schedule our next trigger.
isaeldiaz@developer.mbed.org 17:a82fb8fc4ca3 258 sampleTime = system_timer_current_time() + triggerPeriod_ms;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 259 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 260
isaeldiaz@developer.mbed.org 13:26467bc2991c 261 return MICROBIT_OK;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 262 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 263
isaeldiaz@developer.mbed.org 4:c67cff7b9733 264 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 265 * Periodic callback from MicroBit idle thread.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 266 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 267 void MicrobitUltrasound::idleTick()
isaeldiaz@developer.mbed.org 4:c67cff7b9733 268 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 269 updateSample();
isaeldiaz@developer.mbed.org 4:c67cff7b9733 270 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 271
isaeldiaz@developer.mbed.org 4:c67cff7b9733 272 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 273 * Determines if we're due to take another trigger
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 274 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 275 * @return 1 if we're due to take a new trigger, 0 otherwise.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 276 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 277 int MicrobitUltrasound::isTriggerNeeded()
isaeldiaz@developer.mbed.org 4:c67cff7b9733 278 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 279 return system_timer_current_time() >= sampleTime;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 280 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 281
isaeldiaz@developer.mbed.org 4:c67cff7b9733 282
isaeldiaz@developer.mbed.org 6:f3780669258d 283 /**
isaeldiaz@developer.mbed.org 6:f3780669258d 284 * Enables a particular event for the current module
isaeldiaz@developer.mbed.org 6:f3780669258d 285 *
isaeldiaz@developer.mbed.org 6:f3780669258d 286 * @return 1 if we're due to take a new trigger, 0 otherwise.
isaeldiaz@developer.mbed.org 6:f3780669258d 287 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 288 int MicrobitUltrasound::eventOn(int eventType)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 289 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 290 switch(eventType)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 291 {
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 292 case MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_HI : status |= ULTRASOUND_STATUS_EVENTON_PULSE;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 293 break;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 294 case MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_LO : status |= ULTRASOUND_STATUS_EVENTON_PULSE;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 295 break;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 296 case MICROBIT_ULTRASOUND_EVT_TRIGGER : status |= ULTRASOUND_STATUS_EVENTON_TRIGGER;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 297 break;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 298 case MICROBIT_ULTRASOUND_EVT_ECHO_RISE : status |= ULTRASOUND_STATUS_EVENTON_RISE;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 299 break;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 300 case MICROBIT_ULTRASOUND_EVT_ECHO_FALL : status |= ULTRASOUND_STATUS_EVENTON_FALL;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 301 break;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 302 case MICROBIT_ULTRASOUND_EVT_ECHO_EDGE : status |= ULTRASOUND_STATUS_EVENTON_EDGE;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 303 break;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 304 default : return MICROBIT_INVALID_PARAMETER;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 305 break;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 306 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 307 return MICROBIT_OK;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 308 }