Driver for HC-SR04 connected to a Microbit

Committer:
isaeldiaz@developer.mbed.org
Date:
Tue Aug 30 20:56:14 2016 +0200
Revision:
9:d153bcba081c
Parent:
8:12e6c5d3dc5f
Child:
10:9008f714df44
Child:
11:41b7e18b8e06
missing destructor added to library

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 "MicroBitConfig.h"
isaeldiaz@developer.mbed.org 2:826744569821 33 #include "MicroBitSystemTimer.h"
isaeldiaz@developer.mbed.org 2:826744569821 34 #include "MicroBitFiber.h"
isaeldiaz@developer.mbed.org 1:17a477201275 35
isaeldiaz@developer.mbed.org 2:826744569821 36 /**
isaeldiaz@developer.mbed.org 2:826744569821 37 * Constructor.
isaeldiaz@developer.mbed.org 7:13ba98b16e74 38 * Create new MicrobitUltrasound that reports distance to closest object
isaeldiaz@developer.mbed.org 2:826744569821 39 *
isaeldiaz@developer.mbed.org 2:826744569821 40 * @param _trigPinName Name of the MicroBitPin to be used as trigger.
isaeldiaz@developer.mbed.org 2:826744569821 41 *
isaeldiaz@developer.mbed.org 2:826744569821 42 * @param _echoPinName Name of the MicroBitPin to be used as response from sensor.
isaeldiaz@developer.mbed.org 2:826744569821 43 *
isaeldiaz@developer.mbed.org 2:826744569821 44 * @code
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 45 * MicroBitPin P1_TRIGGER = MicroBitPin(MICROBIT_ID_IO_P1, MICROBIT_PIN_P1, PIN_CAPABILITY_DIGITAL);
isaeldiaz@developer.mbed.org 2:826744569821 46 * MicroBitPin P2_ECHO = MicroBitPin(MICROBIT_ID_IO_P2, MICROBIT_PIN_P2, PIN_CAPABILITY_DIGITAL);
isaeldiaz@developer.mbed.org 7:13ba98b16e74 47 * MicrobitUltrasound uSoundSensor(P1_TRIGGER, P2_ECHO);
isaeldiaz@developer.mbed.org 2:826744569821 48 * @endcode
isaeldiaz@developer.mbed.org 2:826744569821 49 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 50 MicrobitUltrasound(PinName triggerPinName, PinName echoPinName, uint16_t id)
isaeldiaz@developer.mbed.org 2:826744569821 51 {
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 52 this->id = id;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 53 this->status = 0;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 54 this->sampleTime = 0;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 55 this->echoDuration = 0;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 56 this->triggerPeriod_ms = MICROBIT_ULTRASOUND_PERIOD_DEFAULT_MS;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 57 this->triggerDuration_us = MICROBIT_ULTRASOUND_TRIGGER_DURATION_DEFAULT_US;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 58 this->triggerActiveValue = TRIGGER_ACTIVE_VALUE;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 59
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 60 trigger = new DigitalOut(triggerPinName);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 61 echo = new TimedInterruptIn(echoPinName);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 62 echo->mode((PinMode)MICROBIT_ULTRASOUND_PULLMODE_DEFAULT);
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 63 echo->rise(this, &MicroBitUlstrasound::onEchoRise);
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 64 echo->rise(this, &MicroBitUlstrasound::onEchoFall);
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 65 }
isaeldiaz@developer.mbed.org 2:826744569821 66
isaeldiaz@developer.mbed.org 9:d153bcba081c 67 /**
isaeldiaz@developer.mbed.org 9:d153bcba081c 68 * Destructor for MicrobitUltrasound, where we deregister from the array of fiber components.
isaeldiaz@developer.mbed.org 9:d153bcba081c 69 */
isaeldiaz@developer.mbed.org 9:d153bcba081c 70 MicrobitUltrasound::~MicrobitUltrasound()
isaeldiaz@developer.mbed.org 9:d153bcba081c 71 {
isaeldiaz@developer.mbed.org 9:d153bcba081c 72 fiber_remove_idle_component(this);
isaeldiaz@developer.mbed.org 9:d153bcba081c 73 }
isaeldiaz@developer.mbed.org 2:826744569821 74
isaeldiaz@developer.mbed.org 2:826744569821 75 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 76 * This member function manages the calculation of the timestamp of a pulse detected
isaeldiaz@developer.mbed.org 6:f3780669258d 77 * on the echo pin.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 78 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 79 * @param eventValue the event value to distribute onto the message bus.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 80 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 81 void MicrobitUltrasound::pulseWidthEvent(int eventValue)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 82 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 83 MicroBitEvent evt(id, eventValue, CREATE_ONLY);
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 84 uint64_t now = evt.timestamp;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 85 uint64_t previous = echo.getTimestamp();
isaeldiaz@developer.mbed.org 4:c67cff7b9733 86
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 87 if (previous != 0)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 88 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 89 evt.timestamp -= previous;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 90 evt.fire();
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 91 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 92
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 93 echo.setTimestamp(now);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 94 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 95
isaeldiaz@developer.mbed.org 4:c67cff7b9733 96
isaeldiaz@developer.mbed.org 4:c67cff7b9733 97 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 98 * Interrupt handler for when an rise interrupt is triggered.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 99 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 100 void MicrobitUltrasound::onEchoRise()
isaeldiaz@developer.mbed.org 4:c67cff7b9733 101 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 102 if(status & ULTRASOUND_STATUS_EVENTON_PULSE)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 103 pulseWidthEvent(MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_LO);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 104
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 105 if(status & ULTRASOUND_STATUS_EVENTON_RISE)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 106 MicroBitEvent(id, MICROBIT_ULTRASOUND_EVT_ECHO_RISE);
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 107
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 108 if(status & ULTRASOUND_STATUS_EVENTON_EDGE)
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 109 MicroBitEvent(id, MICROBIT_ULTRASOUND_EVT_ECHO_EDGE);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 110 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 111
isaeldiaz@developer.mbed.org 4:c67cff7b9733 112 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 113 * Interrupt handler for when an fall interrupt is triggered.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 114 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 115 void MicrobitUltrasound::onEchoFall()
isaeldiaz@developer.mbed.org 4:c67cff7b9733 116 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 117 if(status & ULTRASOUND_STATUS_EVENTON_PULSE)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 118 pulseWidthEvent(MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_HI);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 119
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 120 if(status & ULTRASOUND_STATUS_EVENTON_FALL)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 121 MicroBitEvent(id, MICROBIT_ULTRASOUND_EVT_ECHO_FALL);
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 122
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 123 if(status & ULTRASOUND_STATUS_EVENTON_EDGE)
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 124 MicroBitEvent(id, MICROBIT_ULTRASOUND_EVT_ECHO_EDGE);
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 2:826744569821 128 * Set the sample rate at which the micro:bit triggers sensor (in ms).
isaeldiaz@developer.mbed.org 2:826744569821 129 *
isaeldiaz@developer.mbed.org 2:826744569821 130 * The default sample period is 1 second.
isaeldiaz@developer.mbed.org 2:826744569821 131 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 132 * @param period the requested time between triggers, in milliseconds.
isaeldiaz@developer.mbed.org 2:826744569821 133 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 134 * @note the micro:bit sends triggers in the background.
isaeldiaz@developer.mbed.org 2:826744569821 135 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 136 void MicrobitUltrasound::setPeriod(int period_ms)
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 137 {
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 138 this->triggerPeriod_ms = period_ms;
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 139 }
isaeldiaz@developer.mbed.org 2:826744569821 140
isaeldiaz@developer.mbed.org 2:826744569821 141 /**
isaeldiaz@developer.mbed.org 2:826744569821 142 * Get the sample rate at which the micro:bit triggers sensor (in ms).
isaeldiaz@developer.mbed.org 2:826744569821 143 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 144 * @return period the requested time between triggers, in milliseconds.
isaeldiaz@developer.mbed.org 2:826744569821 145 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 146 void MicrobitUltrasound::getPeriod()
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 147 {
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 148 return triggerPeriod_ms;
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 149 }
isaeldiaz@developer.mbed.org 2:826744569821 150
isaeldiaz@developer.mbed.org 2:826744569821 151 /**
isaeldiaz@developer.mbed.org 2:826744569821 152 * Get the pulse's duration from sensor, last updated sample
isaeldiaz@developer.mbed.org 2:826744569821 153 *
isaeldiaz@developer.mbed.org 2:826744569821 154 * @return the latest updated pulse duration.
isaeldiaz@developer.mbed.org 2:826744569821 155 *
isaeldiaz@developer.mbed.org 2:826744569821 156 */
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 157 int getEchoDuration()
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 158 {
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 159 return echoDuration;
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 160 }
isaeldiaz@developer.mbed.org 2:826744569821 161
isaeldiaz@developer.mbed.org 2:826744569821 162 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 163 * Send trigger to start measurement in sensor
isaeldiaz@developer.mbed.org 2:826744569821 164 *
isaeldiaz@developer.mbed.org 2:826744569821 165 * This call also will add the class to fiber components to receive
isaeldiaz@developer.mbed.org 2:826744569821 166 * one callback only.
isaeldiaz@developer.mbed.org 2:826744569821 167 *
isaeldiaz@developer.mbed.org 2:826744569821 168 * @return MICROBIT_OK on success.
isaeldiaz@developer.mbed.org 2:826744569821 169 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 170 int MicrobitUltrasound::fireTrigger(void)
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 171 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 172 int result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 173 int actVal, pasVal;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 174 actVal = triggerActiveValue? 1 : 0;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 175 pasVal = triggerActiveValue? 0 : 1;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 176 result = trigger.write(pasVal);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 177 if (result =! 0)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 178 return result;
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 179 wait_us(MICROBIT_ULTRASOUND_IDLE_DURATION_DEFAULT_US);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 180 result = trigger.write(actVal);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 181 if (result =! 0)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 182 return result;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 183 wait_us(triggerDuration_us);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 184 result = trigger.write(pasVal);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 185 return result;
isaeldiaz@developer.mbed.org 3:8a5d2e5f64fb 186 }
isaeldiaz@developer.mbed.org 2:826744569821 187
isaeldiaz@developer.mbed.org 2:826744569821 188 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 189 * Start periodic trigger to sensor. This call also will add the class
isaeldiaz@developer.mbed.org 2:826744569821 190 * to fiber components for periodic callbacks.
isaeldiaz@developer.mbed.org 2:826744569821 191 *
isaeldiaz@developer.mbed.org 2:826744569821 192 * @return MICROBIT_OK on success.
isaeldiaz@developer.mbed.org 2:826744569821 193 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 194 int MicrobitUltrasound::start(void)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 195 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 196 int result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 197 status |= MICROBIT_COMPONENT_RUNNING;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 198 result = updateSample();
isaeldiaz@developer.mbed.org 4:c67cff7b9733 199 return result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 200 }
isaeldiaz@developer.mbed.org 2:826744569821 201
isaeldiaz@developer.mbed.org 2:826744569821 202 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 203 * Stop periodic trigger to sensor.
isaeldiaz@developer.mbed.org 2:826744569821 204 *
isaeldiaz@developer.mbed.org 2:826744569821 205 * @return MICROBIT_OK on success.
isaeldiaz@developer.mbed.org 2:826744569821 206 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 207 int MicrobitUltrasound::stop(void)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 208 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 209 int result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 210 status &= !MICROBIT_COMPONENT_RUNNING;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 211 result = fiber_add_idle_component(this);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 212 return result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 213 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 214
isaeldiaz@developer.mbed.org 4:c67cff7b9733 215
isaeldiaz@developer.mbed.org 4:c67cff7b9733 216
isaeldiaz@developer.mbed.org 4:c67cff7b9733 217 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 218 * Update sample by schedulling new trigger
isaeldiaz@developer.mbed.org 4:c67cff7b9733 219 *
isaeldiaz@developer.mbed.org 4:c67cff7b9733 220 * @return MICROBIT_OK on success.
isaeldiaz@developer.mbed.org 4:c67cff7b9733 221 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 222 int MicrobitUltrasound::updateSample(void)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 223 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 224 int result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 225 if(!(status & ULTRASOUND_STATUS_ADDED_TO_IDLE))
isaeldiaz@developer.mbed.org 4:c67cff7b9733 226 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 227 // 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 228 // Otherwise, we do just do this on demand with the trigger function.
isaeldiaz@developer.mbed.org 4:c67cff7b9733 229 result = fiber_add_idle_component(this);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 230 if (result != MICROBIT_OK)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 231 return result;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 232 status |= ULTRASOUND_STATUS_ADDED_TO_IDLE;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 233 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 234
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 235 // check if we need to update our trigger...
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 236 if (isTriggerNeeded())
isaeldiaz@developer.mbed.org 4:c67cff7b9733 237 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 238 result = fireTrigger();
isaeldiaz@developer.mbed.org 4:c67cff7b9733 239 if (result != MICROBIT_OK)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 240 return result;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 241 // Send an event to indicate that we just sent a new trigger.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 242 if (status & ULTRASOUND_STATUS_EVENTON_TRIGGER)
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 243 MicroBitEvent e(id, MICROBIT_ULTRASOUND_EVT_TRIGGER);
isaeldiaz@developer.mbed.org 4:c67cff7b9733 244 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 245
isaeldiaz@developer.mbed.org 4:c67cff7b9733 246
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 247 // Schedule our next trigger.
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 248 sampleTime = system_timer_current_time() + triggerPeriod_ms;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 249
isaeldiaz@developer.mbed.org 4:c67cff7b9733 250 return MICROBIT_OK
isaeldiaz@developer.mbed.org 4:c67cff7b9733 251 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 252
isaeldiaz@developer.mbed.org 4:c67cff7b9733 253 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 254 * Periodic callback from MicroBit idle thread.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 255 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 256 void MicrobitUltrasound::idleTick()
isaeldiaz@developer.mbed.org 4:c67cff7b9733 257 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 258 updateSample();
isaeldiaz@developer.mbed.org 4:c67cff7b9733 259 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 260
isaeldiaz@developer.mbed.org 4:c67cff7b9733 261 /**
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 262 * Determines if we're due to take another trigger
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 263 *
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 264 * @return 1 if we're due to take a new trigger, 0 otherwise.
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 265 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 266 int MicrobitUltrasound::isTriggerNeeded()
isaeldiaz@developer.mbed.org 4:c67cff7b9733 267 {
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 268 return system_timer_current_time() >= sampleTime;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 269 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 270
isaeldiaz@developer.mbed.org 4:c67cff7b9733 271
isaeldiaz@developer.mbed.org 6:f3780669258d 272 /**
isaeldiaz@developer.mbed.org 6:f3780669258d 273 * Enables a particular event for the current module
isaeldiaz@developer.mbed.org 6:f3780669258d 274 *
isaeldiaz@developer.mbed.org 6:f3780669258d 275 * @return 1 if we're due to take a new trigger, 0 otherwise.
isaeldiaz@developer.mbed.org 6:f3780669258d 276 */
isaeldiaz@developer.mbed.org 7:13ba98b16e74 277 int MicrobitUltrasound::eventOn(int eventType)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 278 {
isaeldiaz@developer.mbed.org 4:c67cff7b9733 279 switch(eventType)
isaeldiaz@developer.mbed.org 4:c67cff7b9733 280 {
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 281 case MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_HI : status |= ULTRASOUND_STATUS_EVENTON_PULSE;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 282 break;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 283 case MICROBIT_ULTRASOUND_EVT_ECHO_PULSE_LO : status |= ULTRASOUND_STATUS_EVENTON_PULSE;
isaeldiaz@developer.mbed.org 8:12e6c5d3dc5f 284 break;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 285 case MICROBIT_ULTRASOUND_EVT_TRIGGER : status |= ULTRASOUND_STATUS_EVENTON_TRIGGER;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 286 break;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 287 case MICROBIT_ULTRASOUND_EVT_ECHO_RISE : status |= ULTRASOUND_STATUS_EVENTON_RISE;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 288 break;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 289 case MICROBIT_ULTRASOUND_EVT_ECHO_FALL : status |= ULTRASOUND_STATUS_EVENTON_FALL;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 290 break;
isaeldiaz@developer.mbed.org 5:5667dcf9c45d 291 case MICROBIT_ULTRASOUND_EVT_ECHO_EDGE : status |= ULTRASOUND_STATUS_EVENTON_EDGE;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 292 break;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 293 default : return MICROBIT_INVALID_PARAMETER;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 294 break;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 295 }
isaeldiaz@developer.mbed.org 4:c67cff7b9733 296 return MICROBIT_OK;
isaeldiaz@developer.mbed.org 4:c67cff7b9733 297 }