Added Pin Manager
This commit is contained in:
54
wled00/pin_manager.cpp
Normal file
54
wled00/pin_manager.cpp
Normal file
@@ -0,0 +1,54 @@
|
||||
#include "wled.h"
|
||||
|
||||
/*
|
||||
* Registers pins so there is no attempt for two interfaces to use the same pin
|
||||
*/
|
||||
|
||||
void PinManagerClass::deallocatePin(byte gpio)
|
||||
{
|
||||
if (!isPinOk(gpio, false)) return;
|
||||
|
||||
byte by = gpio >> 3;
|
||||
byte bi = gpio - 8*by;
|
||||
bitWrite(pinAlloc[by], bi, false);
|
||||
}
|
||||
|
||||
bool PinManagerClass::allocatePin(byte gpio, bool output)
|
||||
{
|
||||
if (!isPinOk(gpio, output)) return false;
|
||||
if (isPinAllocated(gpio)) {
|
||||
DEBUG_PRINT(F("Attempted duplicate allocation of pin "));
|
||||
DEBUG_PRINTLN(gpio);
|
||||
return false;
|
||||
}
|
||||
|
||||
byte by = gpio >> 3;
|
||||
byte bi = gpio - 8*by;
|
||||
bitWrite(pinAlloc[by], bi, true);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PinManagerClass::isPinAllocated(byte gpio)
|
||||
{
|
||||
if (!isPinOk(gpio, false)) return true;
|
||||
|
||||
byte by = gpio >> 3;
|
||||
byte bi = gpio - 8*by;
|
||||
return bitRead(pinAlloc[by], bi);
|
||||
}
|
||||
|
||||
bool PinManagerClass::isPinOk(byte gpio, bool output)
|
||||
{
|
||||
if (gpio < 6) return true;
|
||||
if (gpio < 12) return false; //SPI flash pins
|
||||
|
||||
#ifdef ESP8266
|
||||
if (gpio < 17) return true;
|
||||
#else //ESP32
|
||||
if (gpio < 34) return true;
|
||||
if (gpio < 40 && !output) return true; //34-39 input only
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
Reference in New Issue
Block a user