Manages the sending and reading of pulses via separate trigger and echo pins.
PulseManager.cpp@0:67bcc374fa16, 2015-08-03 (annotated)
- Committer:
- aagnone3
- Date:
- Mon Aug 03 18:26:05 2015 +0000
- Revision:
- 0:67bcc374fa16
Initial revision.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |