Add Distance Sensor
This commit is contained in:
parent
17916ae3db
commit
230a41f143
@ -8,7 +8,7 @@ namespace Arduino {
|
|||||||
|
|
||||||
UltrasonicSensor::UltrasonicSensor(Configuration config, Thing* parent)
|
UltrasonicSensor::UltrasonicSensor(Configuration config, Thing* parent)
|
||||||
: Thing(parent) {
|
: Thing(parent) {
|
||||||
this->type = Type::DistanceSensor;
|
this->type = Type::DistanceSensor;
|
||||||
this->name = "Ultrasonic sensor";
|
this->name = "Ultrasonic sensor";
|
||||||
this->pinTrigger = config.trigger;
|
this->pinTrigger = config.trigger;
|
||||||
this->pinEcho = config.echo;
|
this->pinEcho = config.echo;
|
||||||
@ -57,6 +57,28 @@ void UltrasonicSensor::Update(bool recursive) {
|
|||||||
Thing::Update(recursive);
|
Thing::Update(recursive);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma region Distance sensor
|
||||||
|
|
||||||
|
UltrasonicSensor::DistanceSensor::DistanceSensor(
|
||||||
|
UltrasonicSensor::Configuration config,
|
||||||
|
Thing* parent)
|
||||||
|
: RoboidControl::DistanceSensor(parent), ultrasonic(config, this) {}
|
||||||
|
|
||||||
|
void UltrasonicSensor::DistanceSensor::Update(bool recursive) {
|
||||||
|
RoboidControl::DistanceSensor::Update(recursive);
|
||||||
|
this->ultrasonic.Update(false);
|
||||||
|
if (this->ultrasonic.distance > 0)
|
||||||
|
this->internalDistance = this->ultrasonic.distance;
|
||||||
|
else
|
||||||
|
#if ARDUNIO
|
||||||
|
this->internalDistance = INFINITY;
|
||||||
|
#else
|
||||||
|
this->internalDistance = std::numeric_limits<float>::infinity();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma endregion Distance sensor
|
||||||
|
|
||||||
#pragma region Touch sensor
|
#pragma region Touch sensor
|
||||||
|
|
||||||
UltrasonicSensor::TouchSensor::TouchSensor(Configuration config, Thing* parent)
|
UltrasonicSensor::TouchSensor::TouchSensor(Configuration config, Thing* parent)
|
||||||
@ -66,10 +88,10 @@ void UltrasonicSensor::TouchSensor::Update(bool recursive) {
|
|||||||
RoboidControl::TouchSensor::Update(recursive);
|
RoboidControl::TouchSensor::Update(recursive);
|
||||||
this->ultrasonic.Update(false);
|
this->ultrasonic.Update(false);
|
||||||
this->internalTouch = (this->ultrasonic.distance > 0 &&
|
this->internalTouch = (this->ultrasonic.distance > 0 &&
|
||||||
this->ultrasonic.distance <= this->touchDistance);
|
this->ultrasonic.distance <= this->touchDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma region Touch sensor
|
#pragma endregion Touch sensor
|
||||||
|
|
||||||
} // namespace Arduino
|
} // namespace Arduino
|
||||||
} // namespace RoboidControl
|
} // namespace RoboidControl
|
@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Things/DistanceSensor.h"
|
||||||
#include "Things/TouchSensor.h"
|
#include "Things/TouchSensor.h"
|
||||||
|
|
||||||
namespace RoboidControl {
|
namespace RoboidControl {
|
||||||
@ -39,9 +40,26 @@ class UltrasonicSensor : Thing {
|
|||||||
unsigned char pinEcho = 0;
|
unsigned char pinEcho = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
class DistanceSensor;
|
||||||
class TouchSensor;
|
class TouchSensor;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#pragma region Distance sensor
|
||||||
|
|
||||||
|
class UltrasonicSensor::DistanceSensor : public RoboidControl::DistanceSensor {
|
||||||
|
public:
|
||||||
|
DistanceSensor(UltrasonicSensor::Configuration config,
|
||||||
|
Thing* parent = Thing::LocalRoot());
|
||||||
|
|
||||||
|
/// @copydoc RoboidControl::Thing::Update(unsigned long currentTimeMs)
|
||||||
|
virtual void Update(bool recursive = false) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
UltrasonicSensor ultrasonic;
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma endregion Distance sensor
|
||||||
|
|
||||||
#pragma region Touch sensor
|
#pragma region Touch sensor
|
||||||
|
|
||||||
class UltrasonicSensor::TouchSensor : public RoboidControl::TouchSensor {
|
class UltrasonicSensor::TouchSensor : public RoboidControl::TouchSensor {
|
||||||
@ -58,7 +76,7 @@ class UltrasonicSensor::TouchSensor : public RoboidControl::TouchSensor {
|
|||||||
UltrasonicSensor ultrasonic;
|
UltrasonicSensor ultrasonic;
|
||||||
};
|
};
|
||||||
|
|
||||||
#pragma region Touch sensor
|
#pragma endregion Touch sensor
|
||||||
|
|
||||||
} // namespace Arduino
|
} // namespace Arduino
|
||||||
} // namespace RoboidControl
|
} // namespace RoboidControl
|
29
Things/DistanceSensor.cpp
Normal file
29
Things/DistanceSensor.cpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#include "DistanceSensor.h"
|
||||||
|
|
||||||
|
#include "Messages/LowLevelMessages.h"
|
||||||
|
|
||||||
|
namespace RoboidControl {
|
||||||
|
|
||||||
|
DistanceSensor::DistanceSensor(Thing* parent) : Thing(parent) {
|
||||||
|
this->type = Type::DistanceSensor;
|
||||||
|
this->name = "Distance sensor";
|
||||||
|
}
|
||||||
|
|
||||||
|
float DistanceSensor::GetDistance() {
|
||||||
|
if (this->externalDistance < this->internalDistance)
|
||||||
|
return this->externalDistance;
|
||||||
|
else
|
||||||
|
return this->internalDistance;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DistanceSensor::GenerateBinary(char* bytes, unsigned char* ix) {
|
||||||
|
LowLevelMessages::SendFloat16(bytes, ix, this->internalDistance);
|
||||||
|
return *ix;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DistanceSensor::ProcessBinary(char* bytes) {
|
||||||
|
unsigned char ix = 0;
|
||||||
|
this->externalDistance = LowLevelMessages::ReceiveFloat16(bytes, &ix);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace RoboidControl
|
41
Things/DistanceSensor.h
Normal file
41
Things/DistanceSensor.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if !NO_STD
|
||||||
|
#include <limits>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "Thing.h"
|
||||||
|
|
||||||
|
namespace RoboidControl {
|
||||||
|
|
||||||
|
/// @brief A sensor measuring distance
|
||||||
|
class DistanceSensor : public Thing {
|
||||||
|
public:
|
||||||
|
/// @brief Create a new child touch sensor
|
||||||
|
/// @param parent The parent thing
|
||||||
|
/// @param thingId The ID of the thing, leave out or set to zero to generate
|
||||||
|
/// an ID
|
||||||
|
DistanceSensor(Thing* parent = Thing::LocalRoot());
|
||||||
|
|
||||||
|
/// @brief Get the current distance
|
||||||
|
float GetDistance();
|
||||||
|
|
||||||
|
/// @brief Function used to generate binary data for this sensor
|
||||||
|
/// @param buffer The byte array for thw binary data
|
||||||
|
/// @param ix The starting position for writing the binary data
|
||||||
|
int GenerateBinary(char* bytes, unsigned char* ix) override;
|
||||||
|
/// @brief Function used to process binary data received for this sensor
|
||||||
|
/// @param bytes The binary data to process
|
||||||
|
virtual void ProcessBinary(char* bytes) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
#if ARDUNIO
|
||||||
|
float internalDistance = INFINITY;
|
||||||
|
float externalDistance = INFINITY;
|
||||||
|
#else
|
||||||
|
float internalDistance = std::numeric_limits<double>::infinity();
|
||||||
|
float externalDistance = std::numeric_limits<double>::infinity();
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace RoboidControl
|
@ -6,7 +6,7 @@ namespace RoboidControl {
|
|||||||
|
|
||||||
/// @brief A sensor which can detect touches
|
/// @brief A sensor which can detect touches
|
||||||
class TouchSensor : public Thing {
|
class TouchSensor : public Thing {
|
||||||
// Why finishing this release (0.3), I notice that this is equivalent to a digital sensor
|
// When finishing this release (0.3), I notice that this is equivalent to a digital sensor
|
||||||
public:
|
public:
|
||||||
/// @brief Create a new child touch sensor
|
/// @brief Create a new child touch sensor
|
||||||
/// @param parent The parent thing
|
/// @param parent The parent thing
|
||||||
|
Loading…
x
Reference in New Issue
Block a user