Skip to content

File gpio.cpp

File List > controls > sae_2025_ws > src > payload > src > gpio.cpp

Go to the documentation of this file

#include "payload/gpio.hpp"
#include <pigpiod_if2.h>

GPIO::GPIO(int pi, int pin, Direction direction)
: pi_(pi), pin_(pin), direction_(direction)
{
    int rc = 0;
    switch (direction_) {
        case Direction::Input:
            rc = set_mode(pi_, pin_, PI_INPUT);
            break;
        case Direction::Output:
            rc = set_mode(pi_, pin_, PI_OUTPUT);
            if (rc == 0) {
                gpio_write(pi_, pin_, 0);
                set_PWM_range(pi_, pin_, 10000);
            }
            break;
    }
    if (rc != 0) {
        RCLCPP_ERROR(logger(), "GPIO claim failed on pin %d (rc=%d)", pin_, rc);
    }
}

void GPIO::write_high()
{
    if (direction_ != Direction::Output) {
        RCLCPP_WARN(logger(), "Illegal Binary HIGH write on pin %d", pin_);
        return;
    }
    int rc = gpio_write(pi_, pin_, 1);
    if (rc != 0) RCLCPP_WARN(logger(), "gpio_write HIGH failed on pin %d: rc=%d", pin_, rc);
}

void GPIO::write_low()
{
    if (direction_ != Direction::Output) {
        RCLCPP_WARN(logger(), "Illegal Binary LOW write on pin %d", pin_);
        return;
    }
    int rc = gpio_write(pi_, pin_, 0);
    if (rc != 0) RCLCPP_WARN(logger(), "gpio_write LOW failed on pin %d: rc=%d", pin_, rc);
}

void GPIO::write_pwm(float frequency, float duty_cycle)
{
    if (direction_ != Direction::Output) {
        RCLCPP_WARN(logger(), "Illegal PWM write on pin %d", pin_);
        return;
    }
    int rc = set_PWM_frequency(pi_, pin_, static_cast<unsigned>(frequency));
    if (rc < 0) {
        RCLCPP_WARN(logger(), "set_PWM_frequency failed on pin %d: rc=%d", pin_, rc);
        return;
    }
    int duty_val = static_cast<int>(duty_cycle * 100.0f);
    rc = set_PWM_dutycycle(pi_, pin_, duty_val);
    if (rc != 0) RCLCPP_WARN(logger(), "set_PWM_dutycycle failed on pin %d: rc=%d", pin_, rc);
}

void GPIO::write_servo(int pulse_width)
{
    if (direction_ != Direction::Output) {
        RCLCPP_WARN(logger(), "Illegal servo write on pin %d", pin_);
        return;
    }
    int rc = set_servo_pulsewidth(pi_, pin_, pulse_width);
    if (rc != 0) RCLCPP_WARN(logger(), "set_servo_pulsewidth failed on pin %d: rc=%d", pin_, rc);
}

rclcpp::Logger GPIO::logger()
{
    return rclcpp::get_logger("gpio");
}