2#include "../../../../utilities/Utilities.hpp"
8const uint8_t kFirstAddress = 112;
9const uint8_t kLastAddress = 127;
10const uint8_t kRangingCommandRegister = 0x00;
11const uint8_t kRangingInCm = 0x51;
37 static const uint8_t kFirstEchoHighByte = 0x02;
38 static const uint8_t kNumberOfBytesToRequest = 2;
43 mRuntime.
i2cWrite(kFirstEchoHighByte);
49 return static_cast<unsigned int>(-1);
54 static constexpr auto kBitsInByte = 8;
56 return static_cast<uint16_t
>((high << kBitsInByte) + low);
63 return static_cast<unsigned int>(-1);
67 for (
auto i = 0; i < iterations; i++)
73 return getMedian(measurements, iterations);
80 static const uint8_t kGainRegister = 0x01;
81 static const uint8_t kMinGain = 0;
82 static const uint8_t kMaxGain = 31;
94 static const uint8_t kRangeRegister = 0x02;
105 mPingDelay = milliseconds;
113 static const uint8_t kLightSensorByte = 0x01;
114 static const uint8_t kNumberOfBytesToRequest = 1;
121 mRuntime.
i2cWrite(kLightSensorByte);
127 :
static_cast<uint8_t
>(-1);
134 static const uint8_t kFirstInChangeAddressSequence = 0xA0;
135 static const uint8_t kSecondInChangeAddressSequence = 0xAA;
136 static const uint8_t kThirdInChangeAddressSequence = 0xA5;
138 newAddress =
getConstrain(newAddress, kFirstAddress, kLastAddress);
141 mRuntime.
i2cWrite(kRangingCommandRegister);
142 mRuntime.
i2cWrite(kFirstInChangeAddressSequence);
146 mRuntime.
i2cWrite(kRangingCommandRegister);
147 mRuntime.
i2cWrite(kSecondInChangeAddressSequence);
151 mRuntime.
i2cWrite(kRangingCommandRegister);
152 mRuntime.
i2cWrite(kThirdInChangeAddressSequence);
156 mRuntime.
i2cWrite(kRangingCommandRegister);
157 mRuntime.
i2cWrite(
static_cast<uint8_t
>(newAddress << 0x01));
160 mAddress = newAddress;
165void SRF08::measureDistance()
168 mRuntime.
i2cWrite(kRangingCommandRegister);
An interface to serve as a wrapper for the native runtime environment, greatly inspired by the Arduin...
virtual size_t i2cWrite(uint8_t value)=0
Send the specified byte via i2c, equivalent of Wire.write in Arduino.
virtual void delayMillis(unsigned long milliseconds)=0
Block the execution for the specified number of milliseconds, equivalent of delay in Arduino.
virtual void i2cBeginTransmission(uint8_t address)=0
Initiate a transmission to the specified I2C slave device, equivalent of Wire.beginTransmission in Ar...
virtual uint8_t i2cEndTransmission()=0
Ends a transmission to an I2C device equivalent of Wire.endTransmission in Arduino.
virtual int i2cAvailable()=0
Gets the number of bytes available to be retrieved, equivalent of Wire.availableO in Arduino.
virtual int i2cRead()=0
Reads a byte from I2C bus, equivalent of Wire.read in Arduino.
virtual void i2cInit()=0
Initialize I2C bus as master, equivalent of Wire.begin in Arduino.
virtual uint8_t i2cRequestFrom(uint8_t address, uint8_t numberOfBytes)=0
Request a number of bytes from the specified I2C slave, equivalent of Wire.requestFrom in Arduino.
unsigned long setPingDelay(unsigned long milliseconds=smartcarlib::constants::srf08::kDefaultPingDelay)
Delay between ranging measurements.
SRF08(Runtime &runtime, uint8_t address)
Constructs an SRF08 sensor that communicates over I2C.
void setRange(uint8_t range)
Combined with the gain setting affects how much time each measurement will last as well as the maximu...
unsigned int getMedianDistance(uint8_t iterations=smartcarlib::constants::srf08::kDefaultIterations) override
Gets the median distance from the specified number of measurements.
unsigned int getDistance() override
Gets the distance measured by the sensor in centimeters.
uint8_t changeAddress(uint8_t newAddress)
Changes the address of the specific SRF08 sensor.
uint8_t getLightReading()
Conducts a measurement from the on-board light sensor.
void setGain(uint8_t gain)
Combined with the range setting affects how much time each measurement will last as well as the maxim...
const int kMaxMedianMeasurements
AnyNumber getMedian(AnyNumber unsortedNumbers[], const unsigned int &arraySize)
Gets the median value out of the supplied number array.
constexpr AnyNumber getConstrain(AnyNumber number, AnyNumber min, AnyNumber max)
Limit the number between a range.