From dfc2cc908f1a8fb57b856754de17bdfc555114ab Mon Sep 17 00:00:00 2001 From: Javier Balloffet Date: Fri, 2 Feb 2024 06:24:27 -0300 Subject: [PATCH] Add PWM output interface and the Arduino implementation (#209) Signed-off-by: Javier Balloffet --- andino_firmware/src/pwm_out.h | 59 +++++++++++++++++++++++++ andino_firmware/src/pwm_out_arduino.cpp | 40 +++++++++++++++++ andino_firmware/src/pwm_out_arduino.h | 49 ++++++++++++++++++++ 3 files changed, 148 insertions(+) create mode 100644 andino_firmware/src/pwm_out.h create mode 100644 andino_firmware/src/pwm_out_arduino.cpp create mode 100644 andino_firmware/src/pwm_out_arduino.h diff --git a/andino_firmware/src/pwm_out.h b/andino_firmware/src/pwm_out.h new file mode 100644 index 00000000..65ec34ab --- /dev/null +++ b/andino_firmware/src/pwm_out.h @@ -0,0 +1,59 @@ +// BSD 3-Clause License +// +// Copyright (c) 2024, Ekumen Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#pragma once + +namespace andino { + +/// @brief This class defines an interface for PWM outputs. +class PwmOut { + public: + /// @brief Constructs a PwmOut using the specified GPIO pin. + /// + /// @param gpio_pin GPIO pin. + explicit PwmOut(const int gpio_pin) : gpio_pin_(gpio_pin) {} + + /// @brief Destructs the PWM output. + virtual ~PwmOut() {} + + /// @brief Initializes the PWM output. + virtual void begin() const = 0; + + /// @brief Sets the PWM output value (0 to 255). + /// + /// @param value PWM value. + // TODO(jballoffet): Change this API to expect values from 0 to 100 (%). + virtual void write(int value) const = 0; + + protected: + /// GPIO pin. + const int gpio_pin_; +}; + +} // namespace andino diff --git a/andino_firmware/src/pwm_out_arduino.cpp b/andino_firmware/src/pwm_out_arduino.cpp new file mode 100644 index 00000000..8bfc3584 --- /dev/null +++ b/andino_firmware/src/pwm_out_arduino.cpp @@ -0,0 +1,40 @@ +// BSD 3-Clause License +// +// Copyright (c) 2024, Ekumen Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#include "pwm_out_arduino.h" + +#include + +namespace andino { + +void PwmOutArduino::begin() const { pinMode(gpio_pin_, OUTPUT); } + +void PwmOutArduino::write(int value) const { analogWrite(gpio_pin_, value); } + +} // namespace andino diff --git a/andino_firmware/src/pwm_out_arduino.h b/andino_firmware/src/pwm_out_arduino.h new file mode 100644 index 00000000..77454131 --- /dev/null +++ b/andino_firmware/src/pwm_out_arduino.h @@ -0,0 +1,49 @@ +// BSD 3-Clause License +// +// Copyright (c) 2024, Ekumen Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#pragma once + +#include "pwm_out.h" + +namespace andino { + +/// @brief This class provides an Arduino implementation of the PWM output interface. +class PwmOutArduino : public PwmOut { + public: + /// @brief Constructs a PwmOutArduino using the specified GPIO pin. + /// + /// @param gpio_pin GPIO pin. + explicit PwmOutArduino(const int gpio_pin) : PwmOut(gpio_pin) {} + + void begin() const override; + + void write(int value) const override; +}; + +} // namespace andino