Library for interfacing with the Parallax Ping))) sensor.

Dependencies:   FPointer

ping.cpp

Committer:
d34d
Date:
2014-07-29
Revision:
5:cbe07c09c64c
Parent:
3:0c337c262d84

File content as of revision 5:cbe07c09c64c:

#include "ping.h"

Ping::Ping(PinName signalPin) : mSignalIo(signalPin), mEvent(signalPin), 
        mBusy(0), mValid(0), mContinuous(0),
        mDelayBetweenReadings(DEFAULT_MEASUREMENT_DELAY_US), mTimer(), mRawReading(0) {
    mEvent.rise(this, &Ping::start);
    mEvent.fall(this, &Ping::stop);
}

bool Ping::startReading() {
    return this->startReading(false);
}

bool Ping::startReading(bool continuous) {
    mContinuous = continuous;
    if (mBusy) return false;
    
    mSignalIo.output();
    mSignalIo.write(0);
    wait_us(3);
    mSignalIo.write(1);
    wait_us(3);
    mSignalIo.write(0);
    mSignalIo.input();
    
    return true;
}

void Ping::start() {
    mBusy = true;
    mValid = false;
    mTimer.reset();
    mTimer.start();
}

void Ping::stop() {
    mBusy = false;
    mValid = true;
    // The time it takes is for a round trip.  We divide by two to get the time for one way.
    mRawReading = mTimer.read_us() >> 1;
    mTimer.stop();
    mCallback.call(mRawReading);
    if (mContinuous) mMeasureDelayTicker.attach_us(this, &Ping::nextMeasurement, mDelayBetweenReadings);
}

void Ping::nextMeasurement() {
    mMeasureDelayTicker.detach();
    this->startReading(mContinuous);
}