Skip to content

Commit

Permalink
Implement APA102Interface remove spatial namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
pawelirh committed Sep 3, 2024
1 parent 2249998 commit ce92e45
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 39 deletions.
25 changes: 19 additions & 6 deletions panther_lights/include/panther_lights/apa102.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,32 @@
#define PANTHER_LIGHTS_APA102_HPP_

#include <cstdint>
#include <memory>
#include <string>
#include <vector>

namespace panther_lights::apa102
namespace panther_lights
{

class APA102Interface
{
public:
virtual ~APA102Interface() = default;

virtual void SetGlobalBrightness(const std::uint8_t brightness) = 0;
virtual void SetGlobalBrightness(const float brightness) = 0;
virtual void SetPanel(const std::vector<std::uint8_t> & frame) const = 0;

using SharedPtr = std::shared_ptr<APA102Interface>;
};

/**
* @brief Class representing an APA102 LED panel.
*
* This class provides methods to control the APA102 LED panel, including setting the global
* brightness, setting the LED panel based on a given frame.
*/
class APA102
class APA102 : public APA102Interface
{
public:
APA102(
Expand All @@ -42,7 +55,7 @@ class APA102
*
* @exception std::out_of_range if brightness value is out of defined range
*/
void SetGlobalBrightness(const std::uint8_t brightness);
void SetGlobalBrightness(const std::uint8_t brightness) override;

/**
* @brief Set APA102 LED global brightness
Expand All @@ -51,7 +64,7 @@ class APA102
*
* @exception std::out_of_range if brightness value is out of defined range
*/
void SetGlobalBrightness(const float brightness);
void SetGlobalBrightness(const float brightness) override;

/**
* @brief Set APA102 LED panel based on given frame
Expand All @@ -61,7 +74,7 @@ class APA102
* @exception std::ios_base::failure if failed to send data over SPI
* or std::runtime_error if frame is invalid
*/
void SetPanel(const std::vector<std::uint8_t> & frame) const;
void SetPanel(const std::vector<std::uint8_t> & frame) const override;

protected:
/**
Expand Down Expand Up @@ -96,6 +109,6 @@ class APA102
const std::uint32_t speed_;
};

} // namespace panther_lights::apa102
} // namespace panther_lights

#endif // PANTHER_LIGHTS_APA102_HPP_
20 changes: 12 additions & 8 deletions panther_lights/include/panther_lights/lights_driver_node.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,18 @@ class LightsDriverNode : public rclcpp::Node
public:
LightsDriverNode(const rclcpp::NodeOptions & options = rclcpp::NodeOptions());

LightsDriverNode(
APA102Interface::SharedPtr channel_1, APA102Interface::SharedPtr channel_2,
const rclcpp::NodeOptions & options = rclcpp::NodeOptions());

protected:
int num_led_;
double frame_timeout_;
bool led_control_granted_;
bool led_control_pending_;

rclcpp::Time chanel_1_ts_;
rclcpp::Time chanel_2_ts_;
rclcpp::Time channel_1_ts_;
rclcpp::Time channel_2_ts_;

private:
void OnShutdown();
Expand Down Expand Up @@ -86,8 +90,8 @@ class LightsDriverNode : public rclcpp::Node
* logging. Valid names are: 'channel_1', 'channel_2'.
*/
void FrameCB(
const ImageMsg::UniquePtr & msg, const apa102::APA102 & panel, const rclcpp::Time & last_time,
const std::string & panel_name);
const ImageMsg::UniquePtr & msg, const APA102Interface::SharedPtr & panel,
const rclcpp::Time & last_time, const std::string & panel_name);

void SetBrightnessCB(
const SetLEDBrightnessSrv::Request::SharedPtr & request,
Expand All @@ -112,8 +116,8 @@ class LightsDriverNode : public rclcpp::Node
unsigned initialization_attempt_;
rclcpp::Time led_control_call_time_;

apa102::APA102 chanel_1_;
apa102::APA102 chanel_2_;
APA102Interface::SharedPtr channel_1_;
APA102Interface::SharedPtr channel_2_;

rclcpp::TimerBase::SharedPtr initialization_timer_;

Expand All @@ -122,8 +126,8 @@ class LightsDriverNode : public rclcpp::Node

rclcpp::CallbackGroup::SharedPtr client_callback_group_;

rclcpp::Subscription<ImageMsg>::SharedPtr chanel_1_sub_;
rclcpp::Subscription<ImageMsg>::SharedPtr chanel_2_sub_;
rclcpp::Subscription<ImageMsg>::SharedPtr channel_1_sub_;
rclcpp::Subscription<ImageMsg>::SharedPtr channel_2_sub_;

diagnostic_updater::Updater diagnostic_updater_;
};
Expand Down
4 changes: 2 additions & 2 deletions panther_lights/src/apa102.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
#include <string>
#include <vector>

namespace panther_lights::apa102
namespace panther_lights
{

APA102::APA102(const std::string & device, const std::uint32_t speed, const bool cs_high)
Expand Down Expand Up @@ -126,4 +126,4 @@ void APA102::SPISendBuffer(const std::vector<std::uint8_t> & buffer) const
}
}

} // namespace panther_lights::apa102
} // namespace panther_lights
36 changes: 18 additions & 18 deletions panther_lights/src/lights_driver_node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ LightsDriverNode::LightsDriverNode(const rclcpp::NodeOptions & options)
led_control_granted_(false),
led_control_pending_(false),
initialization_attempt_(0),
chanel_1_("/dev/spiled-channel1"),
chanel_2_("/dev/spiled-channel2"),
channel_1_(std::make_shared<APA102>("/dev/spiled-channel1")),
channel_2_(std::make_shared<APA102>("/dev/spiled-channel2")),
diagnostic_updater_(this)
{
RCLCPP_INFO(this->get_logger(), "Constructing node.");
Expand All @@ -60,8 +60,8 @@ LightsDriverNode::LightsDriverNode(const rclcpp::NodeOptions & options)
num_led_ = this->get_parameter("num_led").as_int();

const float global_brightness = this->get_parameter("global_brightness").as_double();
chanel_1_.SetGlobalBrightness(global_brightness);
chanel_2_.SetGlobalBrightness(global_brightness);
channel_1_->SetGlobalBrightness(global_brightness);
channel_2_->SetGlobalBrightness(global_brightness);

client_callback_group_ =
this->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive);
Expand All @@ -76,18 +76,18 @@ LightsDriverNode::LightsDriverNode(const rclcpp::NodeOptions & options)
initialization_timer_ = this->create_wall_timer(
std::chrono::milliseconds(100), std::bind(&LightsDriverNode::InitializationTimerCB, this));

chanel_1_ts_ = this->get_clock()->now();
chanel_1_sub_ = this->create_subscription<ImageMsg>(
channel_1_ts_ = this->get_clock()->now();
channel_1_sub_ = this->create_subscription<ImageMsg>(
"lights/channel_1_frame", 5, [&](const ImageMsg::UniquePtr & msg) {
FrameCB(msg, chanel_1_, chanel_1_ts_, "channel_1");
chanel_1_ts_ = msg->header.stamp;
FrameCB(msg, channel_1_, channel_1_ts_, "channel_1");
channel_1_ts_ = msg->header.stamp;
});

chanel_2_ts_ = this->get_clock()->now();
chanel_2_sub_ = this->create_subscription<ImageMsg>(
channel_2_ts_ = this->get_clock()->now();
channel_2_sub_ = this->create_subscription<ImageMsg>(
"lights/channel_2_frame", 5, [&](const ImageMsg::UniquePtr & msg) {
FrameCB(msg, chanel_2_, chanel_2_ts_, "channel_2");
chanel_2_ts_ = msg->header.stamp;
FrameCB(msg, channel_2_, channel_2_ts_, "channel_2");
channel_2_ts_ = msg->header.stamp;
});

diagnostic_updater_.setHardwareID("Bumper Lights");
Expand Down Expand Up @@ -133,8 +133,8 @@ void LightsDriverNode::InitializationTimerCB()

void LightsDriverNode::ClearLEDs()
{
chanel_1_.SetPanel(std::vector<std::uint8_t>(num_led_ * 4, 0));
chanel_2_.SetPanel(std::vector<std::uint8_t>(num_led_ * 4, 0));
channel_1_->SetPanel(std::vector<std::uint8_t>(num_led_ * 4, 0));
channel_2_->SetPanel(std::vector<std::uint8_t>(num_led_ * 4, 0));
}

void LightsDriverNode::ToggleLEDControl(const bool enable)
Expand Down Expand Up @@ -191,7 +191,7 @@ void LightsDriverNode::ToggleLEDControlCB(
}

void LightsDriverNode::FrameCB(
const ImageMsg::UniquePtr & msg, const apa102::APA102 & panel, const rclcpp::Time & last_time,
const ImageMsg::UniquePtr & msg, const APA102::SharedPtr & panel, const rclcpp::Time & last_time,
const std::string & panel_name)
{
if (!led_control_granted_) {
Expand Down Expand Up @@ -222,7 +222,7 @@ void LightsDriverNode::FrameCB(
return;
}

panel.SetPanel(msg->data);
panel->SetPanel(msg->data);
}

void LightsDriverNode::SetBrightnessCB(
Expand All @@ -231,8 +231,8 @@ void LightsDriverNode::SetBrightnessCB(
const float brightness = req->data;

try {
chanel_1_.SetGlobalBrightness(brightness);
chanel_2_.SetGlobalBrightness(brightness);
channel_1_->SetGlobalBrightness(brightness);
channel_2_->SetGlobalBrightness(brightness);
} catch (const std::out_of_range & e) {
res->success = false;
res->message = "Failed to set brightness: " + std::string(e.what());
Expand Down
6 changes: 3 additions & 3 deletions panther_lights/test/test_apa102.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

#include "panther_lights/apa102.hpp"

class APA102Wrapper : public panther_lights::apa102::APA102
class APA102Wrapper : public panther_lights::APA102
{
public:
APA102Wrapper(const std::string & device) : APA102(device) {}
Expand All @@ -40,8 +40,8 @@ class TestAPA102 : public testing::Test

TEST_F(TestAPA102, PortsAvailable)
{
EXPECT_NO_THROW({ panther_lights::apa102::APA102 chanel_1_("/dev/spidev0.0"); });
EXPECT_NO_THROW({ panther_lights::apa102::APA102 chanel_2_("/dev/spidev0.1"); });
EXPECT_NO_THROW({ panther_lights::APA102 channel_1_("/dev/spidev0.0"); });
EXPECT_NO_THROW({ panther_lights::APA102 channel_2_("/dev/spidev0.1"); });
}

TEST_F(TestAPA102, SetGlobalBrightnessFloat)
Expand Down
4 changes: 2 additions & 2 deletions panther_lights/test/test_lights_driver_node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ class DriverNodeWrapper : public panther_lights::LightsDriverNode
int getNumLeds() const { return num_led_; }
double getTimeout() const { return frame_timeout_; }
bool isInitialised() const { return led_control_granted_; }
rclcpp::Time setChanel1TS(const rclcpp::Time & ts) { return chanel_1_ts_ = ts; }
rclcpp::Time setChanel2TS(const rclcpp::Time & ts) { return chanel_2_ts_ = ts; }
rclcpp::Time setChanel1TS(const rclcpp::Time & ts) { return channel_1_ts_ = ts; }
rclcpp::Time setChanel2TS(const rclcpp::Time & ts) { return channel_2_ts_ = ts; }
};

class TestDriverNode : public testing::Test
Expand Down

0 comments on commit ce92e45

Please sign in to comment.