Driver for HC-SR04 connected to a Microbit
MicrobitUltrasound.cpp@18:c425443e177c, 2016-10-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |