/*! \file pigpio.h * \ingroup IO * \~\brief * \~english GPIO support. * \~russian Поддержка GPIO. */ /* PIP - Platform Independent Primitives GPIO Andrey Bychkov work.a.b@yandex.ru, Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef PIGPIO_H #define PIGPIO_H #include "pithread.h" //! \~\ingroup IO //! \~\brief //! \~english GPIO support library. //! \~russian Библиотека поддержки GPIO. //! \~\details //! \~english The PIGPIO class provides functions for GPIO pin initialization, reading, writing, and monitoring. //! \~russian Класс PIGPIO предоставляет функции для инициализации, чтения, записи и мониторинга GPIO пинов. class PIP_EXPORT PIGPIO: public PIThread { PIOBJECT_SUBCLASS(PIGPIO, PIThread); public: //! \~english Work mode for pin. //! \~russian Режим работы пина. //! \~\sa initPin(), pinSet() enum Direction { In /** \~english Input direction (read) \~russian Входной (чтение) */, Out /** \~english Output direction (write) \~russian Выходной (запись) */ }; //! \~english Returns singleton object of %PIGPIO. //! \~russian Возвращает синглтон объекта %PIGPIO. //! \~\sa instance() static PIGPIO * instance(); //! \~english Initialize pin "gpio_num" for "dir" mode //! \~russian Инициализирует пин "gpio_num" для режима работы "dir" void initPin(int gpio_num, Direction dir = PIGPIO::In); //! \~english Set pin "gpio_num" value to "value" //! \~russian Устанавливает значение пина "gpio_num" в "value" void pinSet(int gpio_num, bool value); //! \~english Set pin "gpio_num" value to \b true. //! \~russian Устанавливает значение пина "gpio_num" в \b true. //! \~\sa pinSet() void pinHigh(int gpio_num) { pinSet(gpio_num, true); } //! \~english Set pin "gpio_num" value to \b false. //! \~russian Устанавливает значение пина "gpio_num" в \b false. //! \~\sa pinSet() void pinLow(int gpio_num) { pinSet(gpio_num, false); } //! \~english Returns pin "gpio_num" state //! \~russian Возвращает значение пина "gpio_num" bool pinState(int gpio_num); //! \~english Start watch for pin "gpio_num". //! \~russian Начинает наблюдение за пином "gpio_num". //! \~\details //! \~english This function doesn't affect thread state. Pins watching starts only with \a PIThread::start(). //! \~russian Этот метод не меняет состояние потока наблюдения. Наблюдение за пинами начинается методом \a PIThread::start(). void pinBeginWatch(int gpio_num); //! \~english End watch for pin "gpio_num". //! \~russian Заканчивает наблюдение за пином "gpio_num". //! \~\details //! \~english This function doesn't affect thread state. Pins watching starts only with \a PIThread::start(). //! \~russian Этот метод не меняет состояние потока наблюдения. Наблюдение за пинами начинается методом \a PIThread::start(). void pinEndWatch(int gpio_num); //! \~english End watch for all pins. //! \~russian Заканчивает наблюдение за всеми пинами. //! \~\details //! \~english This function doesn't affect thread state. Pins watching starts only with \a PIThread::start(). //! \~russian Этот метод не меняет состояние потока наблюдения. Наблюдение за пинами начинается методом \a PIThread::start(). void clearWatch(); EVENT2(pinChanged, int, gpio_num, bool, new_value); //! \events //! \{ //! \fn void pinChanged(int gpio_num, bool new_value) //! \~english Raised when pin "gpio_num" state changes to "new_value". //! \~russian Вызывается при смене состояния пина "gpio_num" на "new_value". //! \~\details //! \~\warning //! \~english This event is raised only when the thread is started. //! \~russian Это событие вызывается только при запущенном потоке. //! \~\note //! \~english Use \a PIThread::start() to begin watching pins. //! \~russian Используйте \a PIThread::start() для начала наблюдения за пинами. //! \} private: PIGPIO(); virtual ~PIGPIO(); NO_COPY_CLASS(PIGPIO); struct PIP_EXPORT GPIOData { GPIOData() { dir = PIGPIO::In; num = fd = -1; } PIString name; int dir; int num; int fd; }; void exportGPIO(int gpio_num); void openGPIO(GPIOData & g); bool getPinState(int gpio_num); void begin() override; void run() override; void end() override; static PIString GPIOName(int gpio_num); PIMap gpio_; PIMap watch_state; PIMutex mutex; }; #endif // PIDIR_H