65 lines
1.4 KiB
C++
65 lines
1.4 KiB
C++
/*
|
|
* DigitalIoPin.cpp
|
|
*
|
|
* Created on: Aug 29, 2022
|
|
* Author: Vasily Davydov
|
|
*/
|
|
|
|
#include "DigitalIoPin.h"
|
|
|
|
DigitalIoPin::DigitalIoPin (int port, int pin, bool input, bool pullup,
|
|
bool invert)
|
|
{
|
|
assert ((port <= UINT8_MAX_VALUE) && (pin <= UINT8_MAX_VALUE));
|
|
_io._port = (uint8_t)port;
|
|
_io._pin = (uint8_t)pin;
|
|
_io._input = input;
|
|
_io._pullup = pullup;
|
|
_io._invert = invert;
|
|
_io.IOCON_mode = IOCON_MODE_INACT;
|
|
_io.IOCON_inv = IOCON_FUNC0;
|
|
setIoPin ();
|
|
}
|
|
|
|
DigitalIoPin::~DigitalIoPin ()
|
|
{
|
|
}
|
|
|
|
void
|
|
DigitalIoPin::setIoPin ()
|
|
{
|
|
bool direction = true;
|
|
if (_io._input)
|
|
{
|
|
direction = false;
|
|
_io.IOCON_mode = IOCON_MODE_PULLUP;
|
|
if (!_io._pullup)
|
|
{
|
|
_io.IOCON_mode = IOCON_MODE_PULLDOWN;
|
|
}
|
|
if (_io._invert)
|
|
{
|
|
_io.IOCON_inv = IOCON_INV_EN;
|
|
}
|
|
}
|
|
Chip_IOCON_PinMuxSet (LPC_IOCON, _io._port, _io._pin,
|
|
(_io.IOCON_mode | _io.DigitalEn | _io.IOCON_inv));
|
|
/** False direction equals input */
|
|
Chip_GPIO_SetPinDIR (LPC_GPIO, _io._port, _io._pin, direction);
|
|
}
|
|
|
|
bool
|
|
DigitalIoPin::read ()
|
|
{
|
|
bool state = (Chip_GPIO_GetPinState (LPC_GPIO, _io._port, _io._pin));
|
|
return (_io._invert && !_io._input) ? !state : state;
|
|
}
|
|
|
|
void
|
|
DigitalIoPin::write (bool value)
|
|
{
|
|
assert (!(_io._input));
|
|
Chip_GPIO_SetPinState (LPC_GPIO, _io._port, _io._pin, ((_io._invert) ? !value : value));
|
|
}
|
|
|