mirror of
https://github.com/meshtastic/firmware.git
synced 2025-09-18 08:12:57 +00:00
for #4154 use a binary gpio transformer to manage vext on heltec-tracker (saves power)
This commit is contained in:
parent
cdafa87cef
commit
8a9cc727a8
@ -12,6 +12,7 @@ void GpioVirtPin::set(bool value)
|
|||||||
|
|
||||||
void GpioHwPin::set(bool value)
|
void GpioHwPin::set(bool value)
|
||||||
{
|
{
|
||||||
|
// if (num == 3) LOG_DEBUG("Setting pin %d to %d\n", num, value);
|
||||||
pinMode(num, OUTPUT);
|
pinMode(num, OUTPUT);
|
||||||
digitalWrite(num, value);
|
digitalWrite(num, value);
|
||||||
}
|
}
|
||||||
@ -23,7 +24,7 @@ void GpioTransformer::set(bool value)
|
|||||||
outPin->set(value);
|
outPin->set(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
GpioNotTransformer::GpioNotTransformer(GpioVirtPin *inPin, GpioPin *outPin) : GpioTransformer(outPin), inPin(inPin)
|
GpioUnaryTransformer::GpioUnaryTransformer(GpioVirtPin *inPin, GpioPin *outPin) : GpioTransformer(outPin), inPin(inPin)
|
||||||
{
|
{
|
||||||
assert(!inPin->dependentPin); // We only allow one dependent pin
|
assert(!inPin->dependentPin); // We only allow one dependent pin
|
||||||
inPin->dependentPin = this;
|
inPin->dependentPin = this;
|
||||||
@ -33,6 +34,18 @@ GpioNotTransformer::GpioNotTransformer(GpioVirtPin *inPin, GpioPin *outPin) : Gp
|
|||||||
// update();
|
// update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the output pin based on the current state of the input pin.
|
||||||
|
*/
|
||||||
|
void GpioUnaryTransformer::update()
|
||||||
|
{
|
||||||
|
auto p = inPin->get();
|
||||||
|
if (p == GpioVirtPin::PinState::Unset)
|
||||||
|
return; // Not yet fully initialized
|
||||||
|
|
||||||
|
set(p);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the output pin based on the current state of the input pin.
|
* Update the output pin based on the current state of the input pin.
|
||||||
*/
|
*/
|
||||||
@ -75,6 +88,7 @@ void GpioBinaryTransformer::update()
|
|||||||
newValue = (GpioVirtPin::PinState)(p1 && p2);
|
newValue = (GpioVirtPin::PinState)(p1 && p2);
|
||||||
break;
|
break;
|
||||||
case Or:
|
case Or:
|
||||||
|
// LOG_DEBUG("Doing GPIO OR\n");
|
||||||
newValue = (GpioVirtPin::PinState)(p1 || p2);
|
newValue = (GpioVirtPin::PinState)(p1 || p2);
|
||||||
break;
|
break;
|
||||||
case Xor:
|
case Xor:
|
||||||
|
@ -42,7 +42,7 @@ class GpioBinaryTransformer;
|
|||||||
class GpioVirtPin : public GpioPin
|
class GpioVirtPin : public GpioPin
|
||||||
{
|
{
|
||||||
friend class GpioBinaryTransformer;
|
friend class GpioBinaryTransformer;
|
||||||
friend class GpioNotTransformer;
|
friend class GpioUnaryTransformer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum PinState { On = true, Off = false, Unset = 2 };
|
enum PinState { On = true, Off = false, Unset = 2 };
|
||||||
@ -79,12 +79,31 @@ class GpioTransformer
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A transformer that performs a unary NOT operation from an input.
|
* A transformer that just drives a hw pin based on a virtual pin.
|
||||||
*/
|
*/
|
||||||
class GpioNotTransformer : public GpioTransformer
|
class GpioUnaryTransformer : public GpioTransformer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
GpioNotTransformer(GpioVirtPin *inPin, GpioPin *outPin);
|
GpioUnaryTransformer(GpioVirtPin *inPin, GpioPin *outPin);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
friend class GpioVirtPin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the output pin based on the current state of the input pin.
|
||||||
|
*/
|
||||||
|
virtual void update();
|
||||||
|
|
||||||
|
GpioVirtPin *inPin;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A transformer that performs a unary NOT operation from an input.
|
||||||
|
*/
|
||||||
|
class GpioNotTransformer : public GpioUnaryTransformer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GpioNotTransformer(GpioVirtPin *inPin, GpioPin *outPin) : GpioUnaryTransformer(inPin, outPin) {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class GpioVirtPin;
|
friend class GpioVirtPin;
|
||||||
@ -93,9 +112,6 @@ class GpioNotTransformer : public GpioTransformer
|
|||||||
* Update the output pin based on the current state of the input pin.
|
* Update the output pin based on the current state of the input pin.
|
||||||
*/
|
*/
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
private:
|
|
||||||
GpioVirtPin *inPin;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1415,19 +1415,18 @@ GPS *GPS::createGps()
|
|||||||
new_gps->rx_gpio = _rx_gpio;
|
new_gps->rx_gpio = _rx_gpio;
|
||||||
new_gps->tx_gpio = _tx_gpio;
|
new_gps->tx_gpio = _tx_gpio;
|
||||||
|
|
||||||
|
GpioVirtPin *virtPin = new GpioVirtPin();
|
||||||
|
new_gps->enablePin = virtPin; // Always at least populate a virtual pin
|
||||||
if (_en_gpio) {
|
if (_en_gpio) {
|
||||||
GpioPin *p = new GpioHwPin(_en_gpio);
|
GpioPin *p = new GpioHwPin(_en_gpio);
|
||||||
|
|
||||||
if (!GPS_EN_ACTIVE) { // Need to invert the pin before hardware
|
if (!GPS_EN_ACTIVE) { // Need to invert the pin before hardware
|
||||||
auto virtPin = new GpioVirtPin();
|
|
||||||
new GpioNotTransformer(
|
new GpioNotTransformer(
|
||||||
virtPin, p); // We just leave this created object on the heap so it can stay watching virtPin and driving en_gpio
|
virtPin, p); // We just leave this created object on the heap so it can stay watching virtPin and driving en_gpio
|
||||||
p = virtPin;
|
} else {
|
||||||
|
new GpioUnaryTransformer(
|
||||||
|
virtPin, p); // We just leave this created object on the heap so it can stay watching virtPin and driving en_gpio
|
||||||
}
|
}
|
||||||
new_gps->enablePin = p;
|
|
||||||
} else {
|
|
||||||
// Just use a simulated pin
|
|
||||||
new_gps->enablePin = new GpioVirtPin();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PIN_GPS_PPS
|
#ifdef PIN_GPS_PPS
|
||||||
|
@ -157,7 +157,7 @@ class GPS : private concurrency::OSThread
|
|||||||
*
|
*
|
||||||
* Normally set by GPS::createGPS()
|
* Normally set by GPS::createGPS()
|
||||||
*/
|
*/
|
||||||
GpioPin *enablePin;
|
GpioVirtPin *enablePin;
|
||||||
|
|
||||||
GPS() : concurrency::OSThread("GPS") {}
|
GPS() : concurrency::OSThread("GPS") {}
|
||||||
|
|
||||||
|
@ -25,6 +25,8 @@ extern SX1509 gpioExtender;
|
|||||||
#define TFT_INVERT true
|
#define TFT_INVERT true
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
GpioPin *TFTDisplay::backlightEnable;
|
||||||
|
|
||||||
class LGFX : public lgfx::LGFX_Device
|
class LGFX : public lgfx::LGFX_Device
|
||||||
{
|
{
|
||||||
lgfx::Panel_ST7735S _panel_instance;
|
lgfx::Panel_ST7735S _panel_instance;
|
||||||
@ -584,6 +586,7 @@ void TFTDisplay::sendCommand(uint8_t com)
|
|||||||
// handle display on/off directly
|
// handle display on/off directly
|
||||||
switch (com) {
|
switch (com) {
|
||||||
case DISPLAYON: {
|
case DISPLAYON: {
|
||||||
|
// LOG_DEBUG("Display on\n");
|
||||||
backlightEnable->set(true);
|
backlightEnable->set(true);
|
||||||
#if ARCH_PORTDUINO
|
#if ARCH_PORTDUINO
|
||||||
display(true);
|
display(true);
|
||||||
@ -607,6 +610,7 @@ void TFTDisplay::sendCommand(uint8_t com)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DISPLAYOFF: {
|
case DISPLAYOFF: {
|
||||||
|
// LOG_DEBUG("Display off\n");
|
||||||
backlightEnable->set(false);
|
backlightEnable->set(false);
|
||||||
#if ARCH_PORTDUINO
|
#if ARCH_PORTDUINO
|
||||||
tft->clear();
|
tft->clear();
|
||||||
|
@ -43,8 +43,10 @@ class TFTDisplay : public OLEDDisplay
|
|||||||
/**
|
/**
|
||||||
* This is normally managed entirely by TFTDisplay, but some rare applications (heltec tracker) might need to replace the
|
* This is normally managed entirely by TFTDisplay, but some rare applications (heltec tracker) might need to replace the
|
||||||
* default GPIO behavior with something a bit more complex.
|
* default GPIO behavior with something a bit more complex.
|
||||||
|
*
|
||||||
|
* We (cruftily) make it static so that variant.cpp can access it without needing a ptr to the TFTDisplay instance.
|
||||||
*/
|
*/
|
||||||
GpioPin *backlightEnable;
|
static GpioPin *backlightEnable;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// the header size of the buffer used, e.g. for the SPI command header
|
// the header size of the buffer used, e.g. for the SPI command header
|
||||||
|
Loading…
Reference in New Issue
Block a user