From 0b9d6fa78095763022aa93da2ecb813d8a47bf1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andis=20Z=C4=ABle?= Date: Wed, 10 Apr 2024 15:45:03 +0300 Subject: [PATCH] Created digital IO classes --- firmware/src/board/din.cpp | 40 ++++++++++++++++++++++++++++ firmware/src/board/din.h | 35 +++++++++++++++++++++++++ firmware/src/board/dio.cpp | 46 +++----------------------------- firmware/src/board/dio.h | 21 +++++---------- firmware/src/board/dout.cpp | 52 +++++++++++++++++++++++++++++++++++++ firmware/src/board/dout.h | 36 +++++++++++++++++++++++++ 6 files changed, 174 insertions(+), 56 deletions(-) create mode 100644 firmware/src/board/din.cpp create mode 100644 firmware/src/board/din.h create mode 100644 firmware/src/board/dout.cpp create mode 100644 firmware/src/board/dout.h diff --git a/firmware/src/board/din.cpp b/firmware/src/board/din.cpp new file mode 100644 index 0000000..5a89808 --- /dev/null +++ b/firmware/src/board/din.cpp @@ -0,0 +1,40 @@ +/**** Includes ****/ +#include "../utils/utils.h" +#include "mcu/mcu_hal.h" +#include "din.h" + +using namespace board; + +/**** Private definitions ****/ +/**** Private constants ****/ +/**** Private variables ****/ +/**** Private function declarations ****/ + +/**** Public function definitions ****/ +board::DigitalIn::DigitalIn(uint8_t gpio_ch, uint8_t inverted, uint8_t init_value) +{ + this->gpio_ch = gpio_ch; + this->invert = inverted; + + if(init_value) this->last_read = DIN_HIGH; + else this->last_read = DIN_LOW; +} + +board::DigitalIn::~DigitalIn(void) +{ + return; +} + +uint8_t board::DigitalIn::read(void) +{ + uint8_t lvl = mcu::gpio_read(this->gpio_ch); + + if(this->invert) lvl = util::invert(lvl); + + if(lvl>0) this->last_read = DIN_HIGH; + else this->last_read = DIN_LOW; + + return this->last_read; +} + +/**** Private function definitions ****/ diff --git a/firmware/src/board/din.h b/firmware/src/board/din.h new file mode 100644 index 0000000..4b0776e --- /dev/null +++ b/firmware/src/board/din.h @@ -0,0 +1,35 @@ +#ifndef DIGITAL_INPUT_H_ +#define DIGITAL_INPUT_H_ + +/**** Includes ****/ +#include + +namespace board { + +/**** Public definitions ****/ +const uint8_t DIN_LOW = 0; +const uint8_t DIN_HIGH = 1; + +class DigitalIn +{ + protected: + uint8_t gpio_ch; + uint8_t invert; + + public: + DigitalIn(uint8_t gpio_ch, uint8_t inverted, uint8_t init_value); + ~DigitalIn(void); + + uint8_t last_read; + + uint8_t read(void); +}; + +/**** Public function declarations ****/ + +#ifdef TESTING +#endif + +} //namespace + +#endif /* DIGITAL_INPUT_H_ */ \ No newline at end of file diff --git a/firmware/src/board/dio.cpp b/firmware/src/board/dio.cpp index c70f4d0..9dc2934 100644 --- a/firmware/src/board/dio.cpp +++ b/firmware/src/board/dio.cpp @@ -11,52 +11,19 @@ using namespace board; /**** Private function declarations ****/ /**** Public function definitions ****/ -board::DigitalIO::DigitalIO(uint8_t gpio_ch, uint8_t init_read) +board::DigitalIO::DigitalIO(uint8_t gpio_ch, uint8_t init_value) : DigitalIn(gpio_ch, 0, init_value), DigitalOut(gpio_ch, 0) { - this->gpio_ch = gpio_ch; - - if(init_read) this->last_read = (uint8_t)DIO_HIGH; - else this->last_read = (uint8_t)DIO_LOW; - - this->write(DIO_HIZ); + return; } board::DigitalIO::~DigitalIO(void) { - this->write(DIO_HIZ); -} - -uint8_t board::DigitalIO::read(void) -{ - uint8_t lvl = mcu::gpio_read(this->gpio_ch); - if(lvl>0) this->last_read = (uint8_t)DIO_HIGH; - else this->last_read = (uint8_t)DIO_LOW; - - return this->last_read; -} - -void board::DigitalIO::write(int8_t level) -{ - if(level > 0) - { - this->last_set = DIO_HIGH; - mcu::gpio_write(this->gpio_ch, mcu::LEVEL_HIGH); - } - else if(level < 0) - { - this->last_set = DIO_HIZ; - mcu::gpio_write(this->gpio_ch, mcu::LEVEL_HIZ); - } - else - { - this->last_set = DIO_LOW; - mcu::gpio_write(this->gpio_ch, mcu::LEVEL_LOW); - } + this->write(DOUT_HIZ); } uint8_t board::DigitalIO::is_io_match(void) { - if(this->last_set == DIO_HIZ) return 1; + if(this->last_set == DOUT_HIZ) return 1; uint8_t read_lvl = this->read(); @@ -64,9 +31,4 @@ uint8_t board::DigitalIO::is_io_match(void) else return 0; } -int8_t board::DigitalIO::get_set_level(void) -{ - return this->last_set; -} - /**** Private function definitions ****/ diff --git a/firmware/src/board/dio.h b/firmware/src/board/dio.h index 96585f4..bddd90b 100644 --- a/firmware/src/board/dio.h +++ b/firmware/src/board/dio.h @@ -1,8 +1,10 @@ -#ifndef DIGITAL_OUT_H_ -#define DIGITAL_OUT_H_ +#ifndef DIGITAL_IO_H_ +#define DIGITAL_IO_H_ /**** Includes ****/ #include +#include "din.h" +#include "dout.h" namespace board { @@ -11,22 +13,13 @@ const int8_t DIO_LOW = 0; const int8_t DIO_HIGH = 1; const int8_t DIO_HIZ = -1; -class DigitalIO +class DigitalIO : public DigitalIn, public DigitalOut { - protected: - uint8_t gpio_ch; - int8_t last_set; - public: - DigitalIO(uint8_t gpio_ch, uint8_t init_read); + DigitalIO(uint8_t gpio_ch, uint8_t init_value); ~DigitalIO(void); - uint8_t last_read; - - uint8_t read(void); - void write(int8_t level); uint8_t is_io_match(void); - int8_t get_set_level(void); }; /**** Public function declarations ****/ @@ -36,4 +29,4 @@ class DigitalIO } //namespace -#endif /* DIGITAL_OUT_H_ */ \ No newline at end of file +#endif /* DIGITAL_IO_H_ */ \ No newline at end of file diff --git a/firmware/src/board/dout.cpp b/firmware/src/board/dout.cpp new file mode 100644 index 0000000..b2e6608 --- /dev/null +++ b/firmware/src/board/dout.cpp @@ -0,0 +1,52 @@ +/**** Includes ****/ +#include "../utils/utils.h" +#include "mcu/mcu_hal.h" +#include "dout.h" + +using namespace board; + +/**** Private definitions ****/ +/**** Private constants ****/ +/**** Private variables ****/ +/**** Private function declarations ****/ + +/**** Public function definitions ****/ +board::DigitalOut::DigitalOut(uint8_t gpio_ch, uint8_t inverted) +{ + this->gpio_ch = gpio_ch; + this->invert = inverted; + this->write(DOUT_HIZ); +} + +board::DigitalOut::~DigitalOut(void) +{ + this->write(DOUT_HIZ); +} + +void board::DigitalOut::write(int8_t level) +{ + if(level > 0) + { + this->last_set = DOUT_HIGH; + if(this->invert) mcu::gpio_write(this->gpio_ch, mcu::LEVEL_LOW); + else mcu::gpio_write(this->gpio_ch, mcu::LEVEL_HIGH); + } + else if(level == 0) + { + this->last_set = DOUT_LOW; + if(this->invert) mcu::gpio_write(this->gpio_ch, mcu::LEVEL_HIGH); + else mcu::gpio_write(this->gpio_ch, mcu::LEVEL_LOW); + } + else + { + this->last_set = DOUT_HIZ; + mcu::gpio_write(this->gpio_ch, mcu::LEVEL_HIZ); + } +} + +int8_t board::DigitalOut::get_set_level(void) +{ + return this->last_set; +} + +/**** Private function definitions ****/ diff --git a/firmware/src/board/dout.h b/firmware/src/board/dout.h new file mode 100644 index 0000000..0cf0833 --- /dev/null +++ b/firmware/src/board/dout.h @@ -0,0 +1,36 @@ +#ifndef DIGITAL_OUTPUT_H_ +#define DIGITAL_OUTPUT_H_ + +/**** Includes ****/ +#include + +namespace board { + +/**** Public definitions ****/ +const int8_t DOUT_LOW = 0; +const int8_t DOUT_HIGH = 1; +const int8_t DOUT_HIZ = -1; + +class DigitalOut +{ + protected: + uint8_t gpio_ch; + uint8_t invert; + int8_t last_set; + + public: + DigitalOut(uint8_t gpio_ch, uint8_t inverted); + ~DigitalOut(void); + + void write(int8_t level); + int8_t get_set_level(void); +}; + +/**** Public function declarations ****/ + +#ifdef TESTING +#endif + +} //namespace + +#endif /* DIGITAL_OUTPUT_H_ */ \ No newline at end of file