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 "InterruptPinCapture.h"
taylorza 0:c6f86d422a7e 6
taylorza 0:c6f86d422a7e 7 InterruptPinCapture::InterruptPinCapture(PinName pin, PinMode mode) :
taylorza 0:c6f86d422a7e 8 _started(false),
taylorza 0:c6f86d422a7e 9 _readTimeout(10000000),
taylorza 0:c6f86d422a7e 10 _state(Stopped),
taylorza 0:c6f86d422a7e 11 _signalPin(pin)
taylorza 0:c6f86d422a7e 12 {
taylorza 0:c6f86d422a7e 13 _signalPin.mode(mode);
taylorza 0:c6f86d422a7e 14 }
taylorza 0:c6f86d422a7e 15
taylorza 0:c6f86d422a7e 16 void InterruptPinCapture::setReadTimeout(uint32_t us)
taylorza 0:c6f86d422a7e 17 {
taylorza 0:c6f86d422a7e 18 _readTimeout = us;
taylorza 0:c6f86d422a7e 19 }
taylorza 0:c6f86d422a7e 20
taylorza 0:c6f86d422a7e 21 int InterruptPinCapture::read(bool triggerState, uint32_t *pReadings, int count)
taylorza 0:c6f86d422a7e 22 {
taylorza 0:c6f86d422a7e 23 return readInternal(&triggerState, pReadings, count, true);
taylorza 0:c6f86d422a7e 24 }
taylorza 0:c6f86d422a7e 25
taylorza 0:c6f86d422a7e 26 int InterruptPinCapture::read(bool *pInitialState, uint32_t *pReadings, int count)
taylorza 0:c6f86d422a7e 27 {
taylorza 0:c6f86d422a7e 28 return readInternal(pInitialState, pReadings, count, false);
taylorza 0:c6f86d422a7e 29 }
taylorza 0:c6f86d422a7e 30
taylorza 0:c6f86d422a7e 31 int InterruptPinCapture::readInternal(bool *pPinState, uint32_t *pReadings, int count, bool waitForTrigger)
taylorza 0:c6f86d422a7e 32 {
taylorza 0:c6f86d422a7e 33 _bufferIndex = 0;
taylorza 0:c6f86d422a7e 34 _bufferMaxCount = count;
taylorza 0:c6f86d422a7e 35 _pBuffer = pReadings;
taylorza 0:c6f86d422a7e 36 _triggerState = *pPinState ? 1 : 0;
taylorza 0:c6f86d422a7e 37
taylorza 0:c6f86d422a7e 38 if (waitForTrigger)
taylorza 0:c6f86d422a7e 39 {
taylorza 0:c6f86d422a7e 40 _state = WaitForTrigger;
taylorza 0:c6f86d422a7e 41 }
taylorza 0:c6f86d422a7e 42 else
taylorza 0:c6f86d422a7e 43 {
taylorza 0:c6f86d422a7e 44 *pPinState = _signalPin.read() ? true : false;
taylorza 0:c6f86d422a7e 45 _state = StartCapturing;
taylorza 0:c6f86d422a7e 46 }
taylorza 0:c6f86d422a7e 47
taylorza 0:c6f86d422a7e 48 _timer.reset();
taylorza 0:c6f86d422a7e 49 _timer.start();
taylorza 0:c6f86d422a7e 50
taylorza 0:c6f86d422a7e 51 _signalPin.rise(this, &InterruptPinCapture::onPinTransition);
taylorza 0:c6f86d422a7e 52 _signalPin.fall(this, &InterruptPinCapture::onPinTransition);
taylorza 0:c6f86d422a7e 53
taylorza 0:c6f86d422a7e 54 while (_state != Stopped && _timer.read_us() < _readTimeout);
taylorza 0:c6f86d422a7e 55
taylorza 0:c6f86d422a7e 56 _signalPin.rise(NULL);
taylorza 0:c6f86d422a7e 57 _signalPin.fall(NULL);
taylorza 0:c6f86d422a7e 58 _state = Stopped;
taylorza 0:c6f86d422a7e 59 _timer.stop();
taylorza 0:c6f86d422a7e 60
taylorza 0:c6f86d422a7e 61 return _bufferIndex;
taylorza 0:c6f86d422a7e 62 }
taylorza 0:c6f86d422a7e 63
taylorza 0:c6f86d422a7e 64 void InterruptPinCapture::onPinTransition()
taylorza 0:c6f86d422a7e 65 {
taylorza 0:c6f86d422a7e 66 uint32_t transitionTime = (uint32_t)_timer.read_us();
taylorza 0:c6f86d422a7e 67
taylorza 0:c6f86d422a7e 68 switch(_state)
taylorza 0:c6f86d422a7e 69 {
taylorza 0:c6f86d422a7e 70 case WaitForTrigger:
taylorza 0:c6f86d422a7e 71 if (_signalPin.read() == _triggerState)
taylorza 0:c6f86d422a7e 72 {
taylorza 0:c6f86d422a7e 73 _state = StartCapturing;
taylorza 0:c6f86d422a7e 74 }
taylorza 0:c6f86d422a7e 75 break;
taylorza 0:c6f86d422a7e 76
taylorza 0:c6f86d422a7e 77 case StartCapturing:
taylorza 0:c6f86d422a7e 78 _lastTransitionTime = transitionTime;
taylorza 0:c6f86d422a7e 79 _state = Capturing;
taylorza 0:c6f86d422a7e 80 break;
taylorza 0:c6f86d422a7e 81
taylorza 0:c6f86d422a7e 82 case Capturing:
taylorza 0:c6f86d422a7e 83 _pBuffer[_bufferIndex++] = transitionTime - _lastTransitionTime;
taylorza 0:c6f86d422a7e 84 _lastTransitionTime = transitionTime;
taylorza 0:c6f86d422a7e 85 if (_bufferIndex >= _bufferMaxCount)
taylorza 0:c6f86d422a7e 86 {
taylorza 0:c6f86d422a7e 87 _state = Stopped;
taylorza 0:c6f86d422a7e 88 }
taylorza 0:c6f86d422a7e 89 break;
taylorza 0:c6f86d422a7e 90 }
taylorza 0:c6f86d422a7e 91 }