Files
2024-07-20 22:09:06 +08:00

143 lines
2.1 KiB
C++

///
/// Created for personal use, use it at your own risk and benefit.
/// https://github.com/GitMoDu/Fast
///
#include "Fast.h"
bool FastShifter::Setup(const uint8_t pin, const bool startValue)
{
return FastOut::Setup(pin, startValue);
}
void FastShifter::PulseHigh()
{
Set(HIGH);
Set(LOW);
}
void FastShifter::PulseLow()
{
Set(LOW);
Set(HIGH);
}
void FastShifter::PulseHigh(const int16_t pulseIntervalMicros)
{
Set(HIGH);
delayMicroseconds(pulseIntervalMicros);
Set(LOW);
}
void FastShifter::PulseLow(const uint16_t pulseIntervalMicros)
{
Set(LOW);
delayMicroseconds(pulseIntervalMicros);
Set(HIGH);
}
FastOut::FastOut(const uint8_t pin, const bool startValue)
{
Setup(pin, startValue);
}
bool FastOut::Setup(const uint8_t pin, const bool startValue)
{
if (Fast::Setup(pin))
{
Set(startValue);
return true;
}
else
{
return false;
}
}
bool FastOutCached::Setup(const uint8_t pin, const bool startValue)
{
return FastOut::Setup(pin, startValue);
}
void FastOut::Toggle()
{
if (Get())
{
*OutPin &= PinAddressMaskOff;
}
else
{
*OutPin |= PinAddressMaskOn;
}
}
void FastOut::Set(const bool value)
{
if (value)
{
*OutPin |= PinAddressMaskOn;
}
else
{
*OutPin &= PinAddressMaskOff;
}
}
FastOutCached::FastOutCached(const uint8_t pin, const bool startValue)
{
Setup(pin, startValue);
}
void FastOutCached::Toggle()
{
if (LastValueCache)
{
Set(LOW);
}
else
{
Set(HIGH);
}
}
inline void FastOutCached::Set(const bool value)
{
LastValueCache = value;
if (LastValueCache)
{
*OutPin |= PinAddressMaskOn;
}
else
{
*OutPin &= PinAddressMaskOff;
}
}
Fast::Fast(const uint8_t pin)
{
if (pin != INVALID_PIN)
{
Setup(pin);
}
}
bool Fast::Setup(const uint8_t pin)
{
PinAddressMaskOn = digitalPinToBitMask(pin);
PinAddressMaskOff = ~PinAddressMaskOn;
Mode = portModeRegister(digitalPinToPort(pin));
OutPin = portOutputRegister(digitalPinToPort(pin));
InPin = portInputRegister(digitalPinToPort(pin));
*Mode |= PinAddressMaskOn;//TODO, ensure input compatibility
return true;
}
inline bool Fast::Get()
{
return *InPin & PinAddressMaskOn;
}