Interface library for the Devantech SRF02/SRF08 ultrasonic i2c rangers. Depends on I2cRtosDriver lib!

SRF02_IF.cpp

Committer:
humlet
Date:
2013-02-23
Revision:
1:32c4dd194228
Parent:
0:2686e857daf6

File content as of revision 1:32c4dd194228:

#include "SRF02_IF.h"

SRF02_IF::SRF02_IF(int adr, I2C& i2c) : m_adr(adr), m_i2c(i2c)
{}

int SRF02_IF::triggerRanging()
{
    const char regNcmd[2]= {0x00,0x52};
    return m_i2c.write(m_adr, regNcmd, 2);
}

int SRF02_IF::triggerPing()
{
    const char regNcmd[2]= {0x00,0x5C};
    return m_i2c.write(m_adr, regNcmd, 2);
}

int SRF02_IF::triggerEchoMeasurement()
{
    const char regNcmd[2]= {0x00,0x58};
    return m_i2c.write(m_adr, regNcmd, 2);
}

int SRF02_IF::readTransitTime_us(int* dbg)
{
    static Timer tmr;
    tmr.reset();
    tmr.start();
    char chk[1]= {0xff};
    int cnt=0;
    while((unsigned char)chk[0] == 0xff && tmr.read_ms()<100) {
        dbg[0]=m_i2c.write(m_adr, 0x00, 1);  // evillive: check if necessary
        dbg[1]=tmr.read_us();
        dbg[2]=m_i2c.read(m_adr, chk, 1);
        dbg[3]=tmr.read_us();
        dbg[4]=(unsigned char)chk[0];
        dbg[5]=++cnt;
    }
    /*int a=m_i2c.write(m_adr, 0x00, 1, 1);  // evillive: check if necessary
    int eco;
    do {
        eco=m_i2c.read(1);
        pc.printf("%x ", eco);
    } while(eco == 0xff);
    pc.printf("\n");*/

    const char reg[1] = {0x02};
    char result[2];
    m_i2c.write(m_adr, reg, 1);
    m_i2c.read(m_adr, result, 2);

    return (static_cast<int>(result[0])<<8)| static_cast<int>(result[1]);
}

void SRF02_IF::resetI2CAdress(int newAddress)
{
    char regNcmd[2];

    regNcmd[0]=0x00;

    regNcmd[1]=0xA0;
    m_i2c.write(m_adr,regNcmd,2);

    regNcmd[1]=0xAA;
    m_i2c.write(m_adr,regNcmd,2);

    regNcmd[1]=0xA5;
    m_i2c.write(m_adr,regNcmd,2);

    regNcmd[1]=newAddress;
    m_i2c.write(m_adr,regNcmd,2);
}