Driver for HC-SR04 connected to a Microbit

Committer:
isaeldiaz@developer.mbed.org
Date:
Fri Sep 16 22:30:47 2016 +0200
Revision:
17:a82fb8fc4ca3
Parent:
16:491ac8d7685f
Child:
18:c425443e177c
Automatic trigger working

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 15:36c4434352ca 60 echo.rise(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 14:3a9232725ff8 85 echo.mode((PinMode)MICROBIT_ULTRASOUND_PULLMODE_DEFAULT);
isaeldiaz@developer.mbed.org 14:3a9232725ff8 86 echo.rise(this, &MicrobitUltrasound::onEchoRise);
isaeldiaz@developer.mbed.org 14:3a9232725ff8 87 echo.rise(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 5:5667dcf9c45d 99 * This member function manages the calculation of the timestamp of a pulse detected
isaeldiaz@developer.mbed.org 6:f3780669258d 100 * on the echo pin.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 101 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 102 * @param eventValue the event value to distribute onto the message bus.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 103 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 104 void MicrobitUltrasound::pulseWidthEvent(int eventValue)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 105 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 106 MicroBitEvent evt(id, eventValue, CREATE_ONLY);
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 107 uint64_t now = evt.timestamp;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 108 uint64_t previous = echo.getTimestamp();
isaeldiaz@developer.mbed.org 4:c67cff7b9733 109
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 110 if (previous != 0)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 111 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 112 evt.timestamp -= previous;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 113 evt.fire();
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 114 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 115
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 116 echo.setTimestamp(now);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 117 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 118
isaeldiaz@developer.mbed.org 4:c67cff7b9733 119
isaeldiaz@developer.mbed.org 4:c67cff7b9733 120 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 121 * Interrupt handler for when an rise interrupt is triggered.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 122 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 123 void MicrobitUltrasound::onEchoRise()
isaeldiaz@developer.mbed.org 4:c67cff7b9733 124 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 125 if(status & ULTRASOUND_STATUS_EVENTON_PULSE)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 126 pulseWidthEvent(MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_LO);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 127
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 128 if(status & ULTRASOUND_STATUS_EVENTON_RISE)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 129 MicroBitEvent(id, MICROBIT_ULTRASOUND_EVT_ECHO_RISE);
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 130
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 131 if(status & ULTRASOUND_STATUS_EVENTON_EDGE)
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 132 MicroBitEvent(id, MICROBIT_ULTRASOUND_EVT_ECHO_EDGE);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 133 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 134
isaeldiaz@developer.mbed.org 4:c67cff7b9733 135 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 136 * Interrupt handler for when an fall interrupt is triggered.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 137 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 138 void MicrobitUltrasound::onEchoFall()
isaeldiaz@developer.mbed.org 4:c67cff7b9733 139 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 140 if(status & ULTRASOUND_STATUS_EVENTON_PULSE)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 141 pulseWidthEvent(MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_HI);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 142
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 143 if(status & ULTRASOUND_STATUS_EVENTON_FALL)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 144 MicroBitEvent(id, MICROBIT_ULTRASOUND_EVT_ECHO_FALL);
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 145
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 146 if(status & ULTRASOUND_STATUS_EVENTON_EDGE)
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 147 MicroBitEvent(id, MICROBIT_ULTRASOUND_EVT_ECHO_EDGE);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 148 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 149
isaeldiaz@developer.mbed.org 4:c67cff7b9733 150 /**
isaeldiaz@developer.mbed.org 2:826744569821 151 * Set the sample rate at which the micro:bit triggers sensor (in ms).
isaeldiaz@developer.mbed.org 2:826744569821 152 *
isaeldiaz@developer.mbed.org 2:826744569821 153 * The default sample period is 1 second.
isaeldiaz@developer.mbed.org 2:826744569821 154 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 155 * @param period the requested time between triggers, in milliseconds.
isaeldiaz@developer.mbed.org 2:826744569821 156 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 157 * @note the micro:bit sends triggers in the background.
isaeldiaz@developer.mbed.org 2:826744569821 158 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 159 void MicrobitUltrasound::setPeriod(int period_ms)
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 160 {
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 161 this->triggerPeriod_ms = period_ms;
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 162 }
isaeldiaz@developer.mbed.org 2:826744569821 163
isaeldiaz@developer.mbed.org 2:826744569821 164 /**
isaeldiaz@developer.mbed.org 2:826744569821 165 * Get the sample rate at which the micro:bit triggers sensor (in ms).
isaeldiaz@developer.mbed.org 2:826744569821 166 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 167 * @return period the requested time between triggers, in milliseconds.
isaeldiaz@developer.mbed.org 2:826744569821 168 */
isaeldiaz@developer.mbed.org 15:36c4434352ca 169 int MicrobitUltrasound::getPeriod()
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 170 {
isaeldiaz@developer.mbed.org 15:36c4434352ca 171 return (int)triggerPeriod_ms;
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 172 }
isaeldiaz@developer.mbed.org 2:826744569821 173
isaeldiaz@developer.mbed.org 2:826744569821 174 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 175 * Send trigger to start measurement in sensor
isaeldiaz@developer.mbed.org 2:826744569821 176 *
isaeldiaz@developer.mbed.org 2:826744569821 177 * This call also will add the class to fiber components to receive
isaeldiaz@developer.mbed.org 2:826744569821 178 * one callback only.
isaeldiaz@developer.mbed.org 2:826744569821 179 *
isaeldiaz@developer.mbed.org 2:826744569821 180 * @return MICROBIT_OK on success.
isaeldiaz@developer.mbed.org 2:826744569821 181 */
isaeldiaz@developer.mbed.org 14:3a9232725ff8 182 void MicrobitUltrasound::fireTrigger(void)
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 183 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 184 int actVal, pasVal;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 185 actVal = triggerActiveValue? 1 : 0;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 186 pasVal = triggerActiveValue? 0 : 1;
isaeldiaz@developer.mbed.org 14:3a9232725ff8 187 trigger.write(pasVal);
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 188 wait_us(MICROBIT_ULTRASOUND_IDLE_DURATION_DEFAULT_US);
isaeldiaz@developer.mbed.org 14:3a9232725ff8 189 trigger.write(actVal);
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 190 wait_us(triggerDuration_us);
isaeldiaz@developer.mbed.org 14:3a9232725ff8 191 trigger.write(pasVal);
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 192 }
isaeldiaz@developer.mbed.org 2:826744569821 193
isaeldiaz@developer.mbed.org 2:826744569821 194 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 195 * Start periodic trigger to sensor. This call also will add the class
isaeldiaz@developer.mbed.org 2:826744569821 196 * to fiber components for periodic callbacks.
isaeldiaz@developer.mbed.org 2:826744569821 197 *
isaeldiaz@developer.mbed.org 2:826744569821 198 * @return MICROBIT_OK on success.
isaeldiaz@developer.mbed.org 2:826744569821 199 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 200 int MicrobitUltrasound::start(void)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 201 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 202 int result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 203 status |= MICROBIT_COMPONENT_RUNNING;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 204 result = updateSample();
isaeldiaz@developer.mbed.org 4:c67cff7b9733 205 return result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 206 }
isaeldiaz@developer.mbed.org 2:826744569821 207
isaeldiaz@developer.mbed.org 2:826744569821 208 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 209 * Stop periodic trigger to sensor.
isaeldiaz@developer.mbed.org 2:826744569821 210 *
isaeldiaz@developer.mbed.org 2:826744569821 211 * @return MICROBIT_OK on success.
isaeldiaz@developer.mbed.org 2:826744569821 212 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 213 int MicrobitUltrasound::stop(void)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 214 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 215 int result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 216 status &= !MICROBIT_COMPONENT_RUNNING;
isaeldiaz@developer.mbed.org 15:36c4434352ca 217 result = fiber_remove_idle_component(this);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 218 return result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 219 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 220
isaeldiaz@developer.mbed.org 4:c67cff7b9733 221
isaeldiaz@developer.mbed.org 4:c67cff7b9733 222
isaeldiaz@developer.mbed.org 4:c67cff7b9733 223 /**
isaeldiaz@developer.mbed.org 15:36c4434352ca 224 * Update Sensor measurement
isaeldiaz@developer.mbed.org 4:c67cff7b9733 225 *
isaeldiaz@developer.mbed.org 4:c67cff7b9733 226 * @return MICROBIT_OK on success.
isaeldiaz@developer.mbed.org 4:c67cff7b9733 227 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 228 int MicrobitUltrasound::updateSample(void)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 229 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 230 int result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 231 if(!(status & ULTRASOUND_STATUS_ADDED_TO_IDLE))
isaeldiaz@developer.mbed.org 4:c67cff7b9733 232 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 233 // 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 234 // Otherwise, we do just do this on demand with the trigger function.
isaeldiaz@developer.mbed.org 4:c67cff7b9733 235 result = fiber_add_idle_component(this);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 236 if (result != MICROBIT_OK)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 237 return result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 238 status |= ULTRASOUND_STATUS_ADDED_TO_IDLE;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 239 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 240
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 241 // check if we need to update our trigger...
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 242 if (isTriggerNeeded())
isaeldiaz@developer.mbed.org 4:c67cff7b9733 243 {
isaeldiaz@developer.mbed.org 14:3a9232725ff8 244 fireTrigger();
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 245 // Send an event to indicate that we just sent a new trigger.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 246 if (status & ULTRASOUND_STATUS_EVENTON_TRIGGER)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 247 MicroBitEvent e(id, MICROBIT_ULTRASOUND_EVT_TRIGGER);
isaeldiaz@developer.mbed.org 17:a82fb8fc4ca3 248
isaeldiaz@developer.mbed.org 17:a82fb8fc4ca3 249 // Schedule our next trigger.
isaeldiaz@developer.mbed.org 17:a82fb8fc4ca3 250 sampleTime = system_timer_current_time() + triggerPeriod_ms;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 251 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 252
isaeldiaz@developer.mbed.org 13:26467bc2991c 253 return MICROBIT_OK;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 254 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 255
isaeldiaz@developer.mbed.org 4:c67cff7b9733 256 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 257 * Periodic callback from MicroBit idle thread.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 258 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 259 void MicrobitUltrasound::idleTick()
isaeldiaz@developer.mbed.org 4:c67cff7b9733 260 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 261 updateSample();
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 * Determines if we're due to take another trigger
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 266 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 267 * @return 1 if we're due to take a new trigger, 0 otherwise.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 268 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 269 int MicrobitUltrasound::isTriggerNeeded()
isaeldiaz@developer.mbed.org 4:c67cff7b9733 270 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 271 return system_timer_current_time() >= sampleTime;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 272 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 273
isaeldiaz@developer.mbed.org 4:c67cff7b9733 274
isaeldiaz@developer.mbed.org 6:f3780669258d 275 /**
isaeldiaz@developer.mbed.org 6:f3780669258d 276 * Enables a particular event for the current module
isaeldiaz@developer.mbed.org 6:f3780669258d 277 *
isaeldiaz@developer.mbed.org 6:f3780669258d 278 * @return 1 if we're due to take a new trigger, 0 otherwise.
isaeldiaz@developer.mbed.org 6:f3780669258d 279 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 280 int MicrobitUltrasound::eventOn(int eventType)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 281 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 282 switch(eventType)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 283 {
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 284 case MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_HI : status |= ULTRASOUND_STATUS_EVENTON_PULSE;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 285 break;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 286 case MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_LO : status |= ULTRASOUND_STATUS_EVENTON_PULSE;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 287 break;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 288 case MICROBIT_ULTRASOUND_EVT_TRIGGER : status |= ULTRASOUND_STATUS_EVENTON_TRIGGER;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 289 break;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 290 case MICROBIT_ULTRASOUND_EVT_ECHO_RISE : status |= ULTRASOUND_STATUS_EVENTON_RISE;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 291 break;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 292 case MICROBIT_ULTRASOUND_EVT_ECHO_FALL : status |= ULTRASOUND_STATUS_EVENTON_FALL;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 293 break;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 294 case MICROBIT_ULTRASOUND_EVT_ECHO_EDGE : status |= ULTRASOUND_STATUS_EVENTON_EDGE;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 295 break;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 296 default : return MICROBIT_INVALID_PARAMETER;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 297 break;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 298 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 299 return MICROBIT_OK;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 300 }