Dixon/src/RobotNode/cardio/heart.cpp
Russell Gilbert 2125e936dc Centralizes GPIO pin definitions
Moves GPIO pin and chip definitions to a central
constants file for easier management and consistency.

Refactors the heart component to utilize these centralized
constants, enhancing code maintainability and readability.
2026-02-24 16:41:01 +00:00

58 lines
1.8 KiB
C++

#include "../constants.h"
#include "heart.h"
#include <gpiod.hpp>
#include "../dixon_node_state.h"
namespace cardio
{
Heart::Heart()
: _lastBeat(std::chrono::steady_clock::now()),
chip_(std::string("/dev/") + dixon::GPIO_CHIP_NAME),
isOn_(false),
request_(get_line_request(chip_, dixon::GPIO_HEART_PIN)),
logger_("Heart")
{
}
void Heart::beat()
{
if (const auto nodeStatus = DixonNodeState::instance().getNodeStatus();
nodeStatus == NodeStatus::Stopped || nodeStatus == NodeStatus::Stopping)
return;
const auto now = std::chrono::steady_clock::now();
if (const auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>
(now - _lastBeat); elapsed.count() >= 500)
{
isOn_ = !isOn_;
const auto val = isOn_ ? gpiod::line::value::ACTIVE : gpiod::line::value::INACTIVE;
request_.set_value(dixon::GPIO_HEART_PIN, val);
_lastBeat = now;
if (isOn_) {
logger_.debug("Heart::beat()");
}
}
}
void Heart::stop()
{
logger_.info("Stopping heart.");
isOn_ = false;
request_.set_value(dixon::GPIO_HEART_PIN, gpiod::line::value::INACTIVE);
logger_.info("Stopped heart.");
}
gpiod::line_request Heart::get_line_request(gpiod::chip& chip, const unsigned int lineOffset)
{
const auto settings = gpiod::line_settings() // Force it to a known state immediately on acquisition
.set_output_value(gpiod::line::value::INACTIVE)
.set_direction(gpiod::line::direction::OUTPUT);
return chip.prepare_request()
.set_consumer("dixon-robot")
.add_line_settings(lineOffset, settings)
.do_request();
}
}