TFmini(Micro LiDAR Module) library tested on mbedos5.x

Dependents:   2018NHK_gakugaku_robo 2018NHK_gaku_ver2 2019NHK_A_sensor

TFmini.cpp

Committer:
highfieldsnj
Date:
2019-06-24
Revision:
7:81f9d1372c45
Parent:
5:eeb0e5bdd8b9

File content as of revision 7:81f9d1372c45:

#include "TFmini.h"

TFmini::TFmini(PinName serialTX, PinName serialRX) :
    RawSerial(serialTX, serialRX, TF_DEFAULT_BAUD)
{
    attach(callback(this, &TFmini::receiveByte));
}

void TFmini::receiveByte()
{
    buffer[bufferPoint % TF_SERIAL_BUFFER_SIZE] = getc();
 
    if(bufferPoint != 0xff) {
        ++bufferPoint;
    } else {
        bufferPoint = (255 % TF_SERIAL_BUFFER_SIZE)+1;
    }
 
    ++receivedBytes;
 
    if(receivedBytes >= TF_SERIAL_BUFFER_SIZE){
        checkData();
    }
}
void TFmini::checkData()
{
    for(int i = 0; i < TF_SERIAL_BUFFER_SIZE; i++) {
        if(buffer[i % TF_SERIAL_BUFFER_SIZE] == TF_HEADER_FIRST_BYTE && buffer[(i + 1) % TF_SERIAL_BUFFER_SIZE] == TF_HEADER_SECOND_BYTE) {
            uint8_t checksum = 0x00;
            for(int j = 0; j < TF_SERIAL_BUFFER_SIZE - 1; j++) {
                checksum += buffer[(i + j)% TF_SERIAL_BUFFER_SIZE];
            }
            if(checksum == buffer[(i + TF_SERIAL_BUFFER_SIZE - 1)% TF_SERIAL_BUFFER_SIZE]) {
                for(int j = 0; j < TF_SERIAL_BUFFER_SIZE - 3; j++) {
                    data[j] = buffer[(i + 2 + j) % TF_SERIAL_BUFFER_SIZE];
                }
                receivedBytes = 0;
 
                assemble();
                return;
            }
        }
    }
}

void TFmini::assemble()
{
    distance = (data[0] & 0xFF) | ((data[1] << 8) & 0xFF00);
    strength = (data[2] & 0xFF) | ((data[3] << 8) & 0xFF00);
    reserved = data[4];
    rawQual = data[5];
}

int TFmini::getDistance()
{
    return distance;
}

int TFmini::getStrength()
{
    return strength;
}