mirror of
https://github.com/alexhopeoconnor/firmware.git
synced 2026-10-14 23:41:29 +10:00
* preliminary io pin definitions * Update product link * Move to new variant structure and refactor inkHUD - Display does not work and SX1262 init fails on HT752-02 * update variant definitions * add EPD driver * fix lora, add v1/v2 variant targets * adapt pins for v1/v2 * alt button * add compile guards * use lilygo epd47 lib * workaround for INT ERR_NOT_FOUND * USE_EPD (e-ink parallel display) * use FastEPD driver * create screen * EInkParallelDisplay definition * setup screen * dispaly() implementation * enable touchscreen * rotate touch screen * refactor display buffer processing * provide local copy of TwoWire instance as the touch driver calls end() * use larger fonts * replace touch driver; enable debugging * replace touch driver; enable debugging * consider bitsremain == 0 * tryfix crash * fix button * update touch driver * set lora_cs pin * update touch driver and lib reference * add locks * limit Ghosting similar to EInkDynamicDisplay * workaround for FastEPD partial update bug (artifacts) * display() code cleanup * fix a few platformio definitions * more EPD display cleanup * set rotation * use FastEPD arduino I2C by default * touch rotation * update screen for EPD * increase swipe distance for larger screen * EPD UIRenderer * trunk fmt * further #ifdef USE_EPD * disable rotation which messes up w/h; more cleanup * switch off ghosting algo * releease build; V1 buttons * swap V1 buttons * rearrange USE_EINK/EPD macros, use large font * cleanup (revert modified files) * more cleanup * revert * revert file * revert file Removed redundant line continuation in preprocessor directives. * Temporary gate off PSRam calculations until we can fix them * move variant.cpp and update commit references * revert wrong merge * add earlyInitVariant() * initialize all port 0 pins (0-7) as outputs / HIGH --------- Co-authored-by: Thomas Göttgens <tgoettgens@gmail.com> Co-authored-by: Jason P <applewiz@mac.com> Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz> Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
107 lines
3.7 KiB
C++
107 lines
3.7 KiB
C++
#pragma once
|
|
|
|
#if defined(USE_EINK) && !defined(USE_EINK_PARALLELDISPLAY)
|
|
|
|
#include "GxEPD2_BW.h"
|
|
#include <OLEDDisplay.h>
|
|
|
|
#ifdef GXEPD2_DRIVER_0 // If variant has multiple possible display models
|
|
#include "GxEPD2Multi.h"
|
|
#endif
|
|
|
|
// Limit how often we push a full E-Ink refresh. T-Deck Pro needs faster updates for typing.
|
|
#ifndef EINK_FORCE_DISPLAY_THROTTLE_MS
|
|
#if defined(T_DECK_PRO)
|
|
#define EINK_FORCE_DISPLAY_THROTTLE_MS 200
|
|
#else
|
|
#define EINK_FORCE_DISPLAY_THROTTLE_MS 1000
|
|
#endif
|
|
#endif
|
|
|
|
/**
|
|
* An adapter class that allows using the GxEPD2 library as if it was an OLEDDisplay implementation.
|
|
*
|
|
* Note: EInkDynamicDisplay derives from this class.
|
|
*
|
|
* Remaining TODO:
|
|
* optimize display() to only draw changed pixels (see other OLED subclasses for examples)
|
|
* implement displayOn/displayOff to turn off the TFT device (and backlight)
|
|
* Use the fast NRF52 SPI API rather than the slow standard arduino version
|
|
*
|
|
* turn radio back on - currently with both on spi bus is fucked? or are we leaving chip select asserted?
|
|
* Suggestion: perhaps similar to HELTEC_WIRELESS_PAPER issue, which resolved with rtc_gpio_hold_dis()
|
|
*/
|
|
class EInkDisplay : public OLEDDisplay
|
|
{
|
|
/// How often should we update the display
|
|
/// thereafter we do once per 5 minutes
|
|
uint32_t slowUpdateMsec = 5 * 60 * 1000;
|
|
|
|
public:
|
|
/* constructor
|
|
FIXME - the parameters are not used, just a temporary hack to keep working like the old displays
|
|
*/
|
|
EInkDisplay(uint8_t, int, int, OLEDDISPLAY_GEOMETRY, HW_I2C);
|
|
|
|
// Write the buffer to the display memory (for eink we only do this occasionally)
|
|
virtual void display(void) override;
|
|
|
|
/**
|
|
* Force a display update if we haven't drawn within the specified msecLimit
|
|
*
|
|
* @return true if we did draw the screen
|
|
*/
|
|
virtual bool forceDisplay(uint32_t msecLimit = EINK_FORCE_DISPLAY_THROTTLE_MS);
|
|
|
|
/**
|
|
* Run any code needed to complete an update, after the physical refresh has completed.
|
|
* Split from forceDisplay(), to enable async refresh in derived EInkDynamicDisplay class.
|
|
*
|
|
*/
|
|
virtual void endUpdate();
|
|
|
|
/**
|
|
* shim to make the abstraction happy
|
|
*
|
|
*/
|
|
void setDetected(uint8_t detected);
|
|
|
|
protected:
|
|
// the header size of the buffer used, e.g. for the SPI command header
|
|
virtual int getBufferOffset(void) override { return 0; }
|
|
|
|
// Send a command to the display (low level function)
|
|
virtual void sendCommand(uint8_t com) override;
|
|
|
|
// Connect to the display
|
|
virtual bool connect() override;
|
|
|
|
#ifdef GXEPD2_DRIVER_0
|
|
// AdafruitGFX display object - wrapper for multiple drivers
|
|
// Allows runtime detection of multiple displays
|
|
// Avoid this situation if possible!
|
|
GxEPD2_Multi<GXEPD2_DRIVER_0, GXEPD2_DRIVER_1> *adafruitDisplay = NULL;
|
|
#else
|
|
// AdafruitGFX display object (for single display model) - instantiated in connect(), variant specific
|
|
GxEPD2_BW<EINK_DISPLAY_MODEL, EINK_DISPLAY_MODEL::HEIGHT> *adafruitDisplay = NULL;
|
|
#endif
|
|
|
|
// If display uses HSPI
|
|
#if defined(HELTEC_WIRELESS_PAPER) || defined(HELTEC_WIRELESS_PAPER_V1_0) || defined(HELTEC_VISION_MASTER_E213) || \
|
|
defined(HELTEC_VISION_MASTER_E290) || defined(TLORA_T3S3_EPAPER) || defined(CROWPANEL_ESP32S3_5_EPAPER) || \
|
|
defined(CROWPANEL_ESP32S3_4_EPAPER) || defined(CROWPANEL_ESP32S3_2_EPAPER) || defined(ELECROW_ThinkNode_M5) || \
|
|
defined(MINI_EPAPER_S3)
|
|
SPIClass *hspi = NULL;
|
|
#endif
|
|
|
|
#if defined(HELTEC_MESH_POCKET) || defined(SEEED_WIO_TRACKER_L1_EINK) || defined(HELTEC_MESH_SOLAR_EINK)
|
|
SPIClass *spi1 = NULL;
|
|
#endif
|
|
|
|
private:
|
|
// FIXME quick hack to limit drawing to a very slow rate
|
|
uint32_t lastDrawMsec = 0;
|
|
};
|
|
|
|
#endif
|