Manages the sending and reading of pulses via separate trigger and echo pins.

Dependents:   HCSR04

Committer:
aagnone3
Date:
Mon Aug 03 18:26:05 2015 +0000
Revision:
0:67bcc374fa16
Initial revision.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aagnone3 0:67bcc374fa16 1 #include "PulseManager.h"
aagnone3 0:67bcc374fa16 2
aagnone3 0:67bcc374fa16 3 PulseManager::PulseManager(PinName trigger, PinName echo):
aagnone3 0:67bcc374fa16 4 startval(0), pulsetime(), runtime(), trigger(trigger), echo(echo) {}
aagnone3 0:67bcc374fa16 5
aagnone3 0:67bcc374fa16 6
aagnone3 0:67bcc374fa16 7 PulseManager::~PulseManager() {}
aagnone3 0:67bcc374fa16 8
aagnone3 0:67bcc374fa16 9 void PulseManager::write(int val) {
aagnone3 0:67bcc374fa16 10 trigger = val;
aagnone3 0:67bcc374fa16 11 }
aagnone3 0:67bcc374fa16 12
aagnone3 0:67bcc374fa16 13 void PulseManager::write_us(int val, int time) {
aagnone3 0:67bcc374fa16 14 // Write the complement of the high/low signal for a clean desired signal
aagnone3 0:67bcc374fa16 15 trigger = !val;
aagnone3 0:67bcc374fa16 16 wait_us(4);
aagnone3 0:67bcc374fa16 17
aagnone3 0:67bcc374fa16 18 // Now write the desired signal for the given amount of time in us
aagnone3 0:67bcc374fa16 19 trigger = val;
aagnone3 0:67bcc374fa16 20 wait_us(time);
aagnone3 0:67bcc374fa16 21
aagnone3 0:67bcc374fa16 22 // Write the complement again to end the signal write
aagnone3 0:67bcc374fa16 23 trigger = !val;
aagnone3 0:67bcc374fa16 24 }
aagnone3 0:67bcc374fa16 25
aagnone3 0:67bcc374fa16 26 int PulseManager::read_us() {
aagnone3 0:67bcc374fa16 27 // Reset the pulse timer
aagnone3 0:67bcc374fa16 28 pulsetime.reset();
aagnone3 0:67bcc374fa16 29
aagnone3 0:67bcc374fa16 30 // Wait for edge
aagnone3 0:67bcc374fa16 31 startval = echo;
aagnone3 0:67bcc374fa16 32 while (echo == startval) {}
aagnone3 0:67bcc374fa16 33
aagnone3 0:67bcc374fa16 34 // Measure pulse width
aagnone3 0:67bcc374fa16 35 pulsetime.start();
aagnone3 0:67bcc374fa16 36 while (echo != startval) {}
aagnone3 0:67bcc374fa16 37 pulsetime.stop();
aagnone3 0:67bcc374fa16 38
aagnone3 0:67bcc374fa16 39 return pulsetime.read_us();
aagnone3 0:67bcc374fa16 40 }
aagnone3 0:67bcc374fa16 41
aagnone3 0:67bcc374fa16 42 int PulseManager::read_us(int timeout) {
aagnone3 0:67bcc374fa16 43 // Reset timers, start runtime timer to detect timeout
aagnone3 0:67bcc374fa16 44 runtime.reset();
aagnone3 0:67bcc374fa16 45 runtime.start();
aagnone3 0:67bcc374fa16 46 pulsetime.reset();
aagnone3 0:67bcc374fa16 47
aagnone3 0:67bcc374fa16 48 // Wait for edge
aagnone3 0:67bcc374fa16 49 startval = echo;
aagnone3 0:67bcc374fa16 50 while (echo == startval) {
aagnone3 0:67bcc374fa16 51 if (runtime.read_us() > timeout) return -1;
aagnone3 0:67bcc374fa16 52 }
aagnone3 0:67bcc374fa16 53
aagnone3 0:67bcc374fa16 54 // Measure pulse width
aagnone3 0:67bcc374fa16 55 pulsetime.start();
aagnone3 0:67bcc374fa16 56 while (echo != startval) {
aagnone3 0:67bcc374fa16 57 if (runtime.read_us() > timeout) return -1;
aagnone3 0:67bcc374fa16 58 }
aagnone3 0:67bcc374fa16 59 pulsetime.stop();
aagnone3 0:67bcc374fa16 60
aagnone3 0:67bcc374fa16 61 return pulsetime.read_us();
aagnone3 0:67bcc374fa16 62 }
aagnone3 0:67bcc374fa16 63
aagnone3 0:67bcc374fa16 64 int PulseManager::read_high_us() {
aagnone3 0:67bcc374fa16 65 // Reset timer
aagnone3 0:67bcc374fa16 66 pulsetime.reset();
aagnone3 0:67bcc374fa16 67
aagnone3 0:67bcc374fa16 68 // Wait for next edge of echo signal
aagnone3 0:67bcc374fa16 69 while (echo == 1) {}
aagnone3 0:67bcc374fa16 70 while (echo == 0) {}
aagnone3 0:67bcc374fa16 71
aagnone3 0:67bcc374fa16 72 // Measure pulse width of the echo pulse
aagnone3 0:67bcc374fa16 73 pulsetime.start();
aagnone3 0:67bcc374fa16 74 while (echo == 1) {}
aagnone3 0:67bcc374fa16 75 pulsetime.stop();
aagnone3 0:67bcc374fa16 76
aagnone3 0:67bcc374fa16 77 return pulsetime.read_us();
aagnone3 0:67bcc374fa16 78 }
aagnone3 0:67bcc374fa16 79
aagnone3 0:67bcc374fa16 80 int PulseManager::read_high_us(int timeout) {
aagnone3 0:67bcc374fa16 81 // Reset runtime timer for timeout detection
aagnone3 0:67bcc374fa16 82 runtime.reset();
aagnone3 0:67bcc374fa16 83 runtime.start();
aagnone3 0:67bcc374fa16 84
aagnone3 0:67bcc374fa16 85 // Reset pulseTimer
aagnone3 0:67bcc374fa16 86 pulsetime.reset();
aagnone3 0:67bcc374fa16 87
aagnone3 0:67bcc374fa16 88 // Wait for next edge of echo signal
aagnone3 0:67bcc374fa16 89 while (echo == 1) {
aagnone3 0:67bcc374fa16 90 if (runtime.read_us() > timeout) return -1;
aagnone3 0:67bcc374fa16 91 }
aagnone3 0:67bcc374fa16 92 while (echo == 0) {
aagnone3 0:67bcc374fa16 93 if (runtime.read_us() > timeout) return -1;
aagnone3 0:67bcc374fa16 94 }
aagnone3 0:67bcc374fa16 95
aagnone3 0:67bcc374fa16 96 // Measure pulse width of the echo pulse
aagnone3 0:67bcc374fa16 97 pulsetime.start();
aagnone3 0:67bcc374fa16 98 while (echo == 1) {
aagnone3 0:67bcc374fa16 99 if (runtime.read_us() > timeout) return -1;
aagnone3 0:67bcc374fa16 100 }
aagnone3 0:67bcc374fa16 101 pulsetime.stop();
aagnone3 0:67bcc374fa16 102
aagnone3 0:67bcc374fa16 103 return pulsetime.read_us();
aagnone3 0:67bcc374fa16 104 }
aagnone3 0:67bcc374fa16 105
aagnone3 0:67bcc374fa16 106 int PulseManager::read_low_us() {
aagnone3 0:67bcc374fa16 107 // Wait for next edge of echo signal
aagnone3 0:67bcc374fa16 108 while (echo == 0) {
aagnone3 0:67bcc374fa16 109 }
aagnone3 0:67bcc374fa16 110 while (echo == 1) {
aagnone3 0:67bcc374fa16 111 }
aagnone3 0:67bcc374fa16 112
aagnone3 0:67bcc374fa16 113 // Measure pulse width of the echo pulse
aagnone3 0:67bcc374fa16 114 pulsetime.start();
aagnone3 0:67bcc374fa16 115 while (echo == 0) {}
aagnone3 0:67bcc374fa16 116 pulsetime.stop();
aagnone3 0:67bcc374fa16 117
aagnone3 0:67bcc374fa16 118 return pulsetime.read_us();
aagnone3 0:67bcc374fa16 119 }
aagnone3 0:67bcc374fa16 120
aagnone3 0:67bcc374fa16 121 int PulseManager::read_low_us(int timeout) {
aagnone3 0:67bcc374fa16 122 // Reset runtime timer for timeout detection
aagnone3 0:67bcc374fa16 123 runtime.reset();
aagnone3 0:67bcc374fa16 124 runtime.start();
aagnone3 0:67bcc374fa16 125
aagnone3 0:67bcc374fa16 126 // Wait for next edge of echo signal
aagnone3 0:67bcc374fa16 127 while (echo == 0) {
aagnone3 0:67bcc374fa16 128 if (runtime.read_us() > timeout) return -1;
aagnone3 0:67bcc374fa16 129 }
aagnone3 0:67bcc374fa16 130 while (echo == 1) {
aagnone3 0:67bcc374fa16 131 if (runtime.read_us() > timeout) return -1;
aagnone3 0:67bcc374fa16 132 }
aagnone3 0:67bcc374fa16 133
aagnone3 0:67bcc374fa16 134 // Measure pulse width of the echo pulse
aagnone3 0:67bcc374fa16 135 pulsetime.start();
aagnone3 0:67bcc374fa16 136 while (echo == 0) {
aagnone3 0:67bcc374fa16 137 if (runtime.read_us() > timeout) return -1;
aagnone3 0:67bcc374fa16 138 }
aagnone3 0:67bcc374fa16 139 pulsetime.stop();
aagnone3 0:67bcc374fa16 140
aagnone3 0:67bcc374fa16 141 return pulsetime.read_us();
aagnone3 0:67bcc374fa16 142 }