Provides a simple way to capture the wave form of a pin. For example it can be used to capture the digital state transitions of a pin connected to an IR receiver. These signals can later be played back using the Signal Generator library to control IR devices. The library supports two means of capturing the signal. The signal can be captured on any digital pin using polling while for higher resolution and more accurate timing the interrupt driven capture feature can be used.

Committer:
taylorza
Date:
Sat Sep 27 04:04:16 2014 +0000
Revision:
0:c6f86d422a7e
Initial commit of the Signal Capture library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
taylorza 0:c6f86d422a7e 1 ///////////////////////////////////////////////////////////////////////////////
taylorza 0:c6f86d422a7e 2 // Signal Capture Library
taylorza 0:c6f86d422a7e 3 // Author: Chris Taylor (taylorza)
taylorza 0:c6f86d422a7e 4 #include "mbed.h"
taylorza 0:c6f86d422a7e 5 #include "DigitalPinCapture.h"
taylorza 0:c6f86d422a7e 6
taylorza 0:c6f86d422a7e 7 DigitalPinCapture::DigitalPinCapture(PinName pin, PinMode mode) :
taylorza 0:c6f86d422a7e 8 _signalPin(pin, mode),
taylorza 0:c6f86d422a7e 9 _readTimeout(10000000)
taylorza 0:c6f86d422a7e 10 {
taylorza 0:c6f86d422a7e 11
taylorza 0:c6f86d422a7e 12 }
taylorza 0:c6f86d422a7e 13
taylorza 0:c6f86d422a7e 14 void DigitalPinCapture::setReadTimeout(uint32_t us)
taylorza 0:c6f86d422a7e 15 {
taylorza 0:c6f86d422a7e 16 _readTimeout = us;
taylorza 0:c6f86d422a7e 17 }
taylorza 0:c6f86d422a7e 18
taylorza 0:c6f86d422a7e 19 int DigitalPinCapture::read(bool triggerState, uint32_t *pReadings, int count)
taylorza 0:c6f86d422a7e 20 {
taylorza 0:c6f86d422a7e 21 return readInternal(&triggerState, pReadings, count, true);
taylorza 0:c6f86d422a7e 22 }
taylorza 0:c6f86d422a7e 23
taylorza 0:c6f86d422a7e 24 int DigitalPinCapture::read(bool *pInitialState, uint32_t *pReadings, int count)
taylorza 0:c6f86d422a7e 25 {
taylorza 0:c6f86d422a7e 26 return readInternal(pInitialState, pReadings, count, false);
taylorza 0:c6f86d422a7e 27 }
taylorza 0:c6f86d422a7e 28
taylorza 0:c6f86d422a7e 29 int DigitalPinCapture::readInternal(bool *pPinState, uint32_t *pReadings, int count, bool waitForTrigger)
taylorza 0:c6f86d422a7e 30 {
taylorza 0:c6f86d422a7e 31 Timer timer;
taylorza 0:c6f86d422a7e 32
taylorza 0:c6f86d422a7e 33 int lastPinState;
taylorza 0:c6f86d422a7e 34 int lastTransitionTime;
taylorza 0:c6f86d422a7e 35
taylorza 0:c6f86d422a7e 36 timer.start();
taylorza 0:c6f86d422a7e 37 if (waitForTrigger)
taylorza 0:c6f86d422a7e 38 {
taylorza 0:c6f86d422a7e 39 while (_signalPin == *pPinState)
taylorza 0:c6f86d422a7e 40 {
taylorza 0:c6f86d422a7e 41 if (timer.read_us() >= _readTimeout) return 0;
taylorza 0:c6f86d422a7e 42 }
taylorza 0:c6f86d422a7e 43
taylorza 0:c6f86d422a7e 44 while (_signalPin != *pPinState)
taylorza 0:c6f86d422a7e 45 {
taylorza 0:c6f86d422a7e 46 if (timer.read_us() >= _readTimeout) return 0;
taylorza 0:c6f86d422a7e 47 }
taylorza 0:c6f86d422a7e 48 lastTransitionTime = timer.read_us();
taylorza 0:c6f86d422a7e 49 }
taylorza 0:c6f86d422a7e 50 else
taylorza 0:c6f86d422a7e 51 {
taylorza 0:c6f86d422a7e 52 *pPinState = _signalPin ? true : false;
taylorza 0:c6f86d422a7e 53 lastTransitionTime = timer.read_us();
taylorza 0:c6f86d422a7e 54 }
taylorza 0:c6f86d422a7e 55
taylorza 0:c6f86d422a7e 56 lastPinState = *pPinState;
taylorza 0:c6f86d422a7e 57
taylorza 0:c6f86d422a7e 58 int bufferIndex = 0;
taylorza 0:c6f86d422a7e 59 while (bufferIndex < count && timer.read_us() < _readTimeout)
taylorza 0:c6f86d422a7e 60 {
taylorza 0:c6f86d422a7e 61 if (_signalPin != lastPinState)
taylorza 0:c6f86d422a7e 62 {
taylorza 0:c6f86d422a7e 63 uint32_t transitionTime = timer.read_us();
taylorza 0:c6f86d422a7e 64 pReadings[bufferIndex++] = transitionTime - lastTransitionTime;
taylorza 0:c6f86d422a7e 65 lastPinState = !lastPinState;
taylorza 0:c6f86d422a7e 66 lastTransitionTime = transitionTime;
taylorza 0:c6f86d422a7e 67 }
taylorza 0:c6f86d422a7e 68 }
taylorza 0:c6f86d422a7e 69
taylorza 0:c6f86d422a7e 70 timer.stop();
taylorza 0:c6f86d422a7e 71
taylorza 0:c6f86d422a7e 72 return bufferIndex;
taylorza 0:c6f86d422a7e 73 }
taylorza 0:c6f86d422a7e 74