package com.team254.lib.util; import edu.wpi.first.wpilibj.I2C; import edu.wpi.first.wpilibj.I2C.Port; import edu.wpi.first.wpilibj.Timer; import java.util.TimerTask; public class LidarLiteSensor { private I2C mI2C; private byte[] mDistance; private java.util.Timer mUpdater; private boolean mHasSignal; private final static int LIDAR_ADDR = 0x62; private final static int LIDAR_CONFIG_REGISTER = 0x00; private final static int LIDAR_DISTANCE_REGISTER = 0x8f; public LidarLiteSensor(Port port) { mI2C = new I2C(port, LIDAR_ADDR); mDistance = new byte[2]; mUpdater = new java.util.Timer(); mHasSignal = false; } /** * @return Distance in meters */ public double getDistance() { int distCm = (int) Integer.toUnsignedLong(mDistance[0] << 8) + Byte.toUnsignedInt(mDistance[1]); return distCm / 100.0; } /** * @return true iff the sensor successfully provided data last loop */ public boolean hasSignal() { return mHasSignal; } /** * Start 10Hz polling */ public void start() { start(100); } /** * Start polling for period in milliseconds */ public void start(int period) { TimerTask task = new TimerTask() { @Override public void run() { update(); } }; mUpdater.scheduleAtFixedRate(task, 0, period); } public void stop() { mUpdater.cancel(); mUpdater = new java.util.Timer(); } private void update() { if (mI2C.write(LIDAR_CONFIG_REGISTER, 0x04)) { // the write failed to ack mHasSignal = false; return; } Timer.delay(0.04); // Delay for measurement to be taken if (!mI2C.read(LIDAR_DISTANCE_REGISTER, 2, mDistance)) { // the read failed mHasSignal = false; return; } mHasSignal = true; Timer.delay(0.005); // Delay to prevent over polling } }