mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-27 18:31:37 +00:00

* Decouple ButtonThread from sleep.cpp Reorganize sleep observables. Don't call ButtonThread methods inside doLightSleep. Instead, handle in class with new lightsleep Observables. * InkHUD: initial commit (WIP) Publicly discloses the current work in progress. Not ready for use. * feat: battery icon * chore: implement meshtastic/firmware #5454 Clean up some inline functions * feat: menu & settings for "jump to applet" * Remove the beforeRender pattern It hugely complicates things. If we can achieve acceptable performance without it, so much the better. * Remove previous Map Applet Needs re-implementation to work without the beforeRender pattern * refactor: reimplement map applet Doesn't require own position Doesn't require the beforeRender pattern to precalculate; now all-at-once in render Lays groundwork for fixed-size map with custom background image * feat: autoshow Allow user to select which applets (if any) should be automatically brought to foreground when they have new data to display * refactor: tidy-up applet constructors misc. jobs including: - consistent naming - move initializer-list-only constructors to header - give derived applets unique identifiers for MeshModule and OSThread logging * hotfix: autoshow always uses FAST update In future, it *will* often use FAST, but this will be controlled by a WindowManager component which has not yet been written. Hotfixed, in case anybody is attempting to use this development version on their deployed devices. * refactor: bringToForeground no longer requests FAST update In situations where an applet has moved to foreground because of user input, requestUpdate can be manually called, to upgrade to FAST refresh. More permanent solution for #23e1dfc * refactor: extract string storage from ThreadedMessageApplet Separates the code responsible for storing the limited message history, which was previously part of the ThreadedMessageApplet. We're now also using this code to store the "most recent message". Previously, this was stored in the `InkHUD::settings` struct, which was much less space-efficient. We're also now storing the latest DM, laying the foundation for an applet to display only DMs, which will complement the threaded message applet. * fix: text wrapping Attempts to fix a disparity between `Applet::printWrapped` and `Applet::getWrappedTextHeight`, which would occasionally cause a ThreadedMessageApplet message to render "too short", overlapping other text. * fix: purge old constructor This one slipped through the last commit.. * feat: DM Applet Useful in combination with the ThreadedMessageApplets, which don't show DMs * fix: applets shouldn't handle events while deactivated Only one or two applets were actually doing this, but I'm making a habit of having all applets return early from their event handling methods (as good practice), even if those methods are disabled elsewhere (e.g. not observing observable, return false from wantPacket) * refactor: allow requesting update without requesting autoshow Some applets may want to redraw, if they are displayed, but not feel the information is worth being brought to foreground for. Example: ActiveNodesApplet, when purging old nodes from list. * feat: custom "Recently Active" duration Allows users to tailor how long nodes will appear in the "Recents" applets, to suit the activity level of their mesh. * refactor: rename some applets * fix: autoshow * fix: getWrappedTextHeight Remove the "simulate" option from printWrapped; too hard to keep inline with genuine printing (because of AdafruitGFX Fonts' xAdvance, mabye?). Instead of simulating, we printWrapped as normal, and discard pixel output by setting crop. Both methods are similarly inefficient, apparently. * fix: text wrapping in ThreadedMessageApplet Wrong arguments were passed to Applet::printWrapped * feat: notifications for text messages Only shown if current applet does not already display the same info. Autoshow takes priority over notifications, if both would be used to display the same info. * feat: optimize FAST vs FULL updates New UpdateMediator class counts the number of each update type, and suggets which one to use, if the code doesn't already have an explicit prefence. Also performs "maintenance refreshes" unprovoked if display is not given an opportunity to before a FULL refresh through organic use. * chore: update todo list * fix: rare lock-up of buttons * refactor: backlight Replaces the initial proof-of-concept frontlight code for T-Echo Presses less than 5 seconds momentarily illuminate the display Presses longer than 5 seconds latch the light, requiring another tap to disable If user has previously removed the T-Echo's capacitive touch button (some DIY projects), the light is controlled by the on-screen menu. This fallback is used by all T-Echo devices, until a press of the capacitive touch button is detected. * feat: change tile with aux button Applied to VM-E290. Working as is, but a refactor of WindowManager::render is expected shortly, which will also tidy code from this push. * fix: specify out-of-the-box tile assignments Prevents placeholder applet showing on initial boot, for devices which use a mult-tile layout by default (VM-E290) * fix: verify settings version when loading * fix: wrong settings version * refactor: remove unimplemented argument from requestUpdate Specified whether or not to update "async", however the implementation was slightly broken, Applet::requestUpdate is only handled next time WindowManager::runOnce is called. This didn't allow code to actually await an update, which was misleading. * refactor: renaming Applet::render becomes Applet::onRender. Tile::displayedApplet becomes Tile::assignedApplet. New onRender method name allows us to move some of the pre and post render code from WindowManager into new Applet::render method, which will call onRender for us. * refactor: rendering Bit of a tidy-up. No intended change in behavior. * fix: optimize refresh times Shorter wait between retrying update if display was previously busy. Set anticipated update durations closer to observed values. No signifacant performance increase, but does decrease the amount of polling required. * feat: blocking update for E-Ink Option to wait for display update to complete before proceeding. Important when shutting down the device. * refactor: allow system applets to lock rendering Temporarily prevents other applets from rendering. * feat: boot and shutdown screens * feat: BluetoothStatus Adds a meshtastic::Status object which exposes the state of the Bluetooth connection. Intends to allow decoupling of UI code. * feat: Bluetooth pairing screen * fix: InkHUD defaults not honored * fix: random Bluetooth pin for NicheGraphics UIs * chore: button interrupts tested * fix: emoji reactions show as blank messages * fix: autoshow and notification triggered by outgoing message * feat: save InkHUD data before reboot Implemented with a new Observable. Previously, config and a few recent messages were saved on shutdown. These were lost if the device rebooted, for example when firmware settings were changed by a client. Now, the InkHUD config and recent messages saved on reboot, the same as during an intentional shutdown. * feat: imperial distances Controlled by the config.display.units setting * fix: hide features which are not yet implemented * refactor: faster rendering Previously, only tiles which requested update were re-rendered. Affected tiles had their region blanked before render, pixel by pixel. Benchmarking revealed that it is significantly faster to memset the framebuffer and redraw all tiles. * refactor: tile ownership Tiles and Applets now maintain a reciprocal link, which is enforced by asserts. Less confusing than the old situation, where an applet and a tile may disagree on their relationship. Empty tiles are now identified by a nullptr *Applet, instead of by having the placeholderApplet assigned. * fix: notifications and battery when menu open Do render notifications in front of menu; don't render battery icon in front of menu. * fix: simpler defaults Don't expose new users to multiplexed applets straight away: make them enable the feature for themselves. * fix: Inputs::TwoButton interrupts, when only one button in use * fix: ensure display update is complete when ESP32 enters light sleep Many panels power down automatically, but some require active intervention from us. If light sleep (ESP32) occurs during a display update, these panels could potentially remain powered on, applying voltage the pixels for an extended period of time, and potentially damaging the display. * fix: honor per-variant user tile limit Set as the default value for InkHUD::settings.userTiles.maxCount in nicheGraphics.h * feat: initial InkHUD support for Wireless Paper v1.1 and VM-E213 * refactor: Heard and Recents Applets Tidier code, significant speed boost. Possibly no noticable change in responsiveness, but rendering now spends much less time blocking execution, which is important for correction functioning of the other firmware components. * refactor: use a common pio base config Easier to make any future PlatformIO config changes * feat: tips Show information that we think the user might find helpful. Some info shown first boot only. Other info shown when / if relevant. * fix: text wrapping for '\n' Previously, the newline was honored, but the adojining word was not printed. * Decouple ButtonThread from sleep.cpp Reorganize sleep observables. Don't call ButtonThread methods inside doLightSleep. Instead, handle in class with new lightsleep Observables. * feat: BluetoothStatus Adds a meshtastic::Status object which exposes the state of the Bluetooth connection. Intends to allow decoupling of UI code. * feat: observable for reboot * refactor: Heltec VM-E290 installDefaultConfig * fix: random Bluetooth pin for NicheGraphics UIs
229 lines
6.5 KiB
C
229 lines
6.5 KiB
C
/*
|
|
Copyright (c) 2014-2015 Arduino LLC. All right reserved.
|
|
Copyright (c) 2016 Sandeep Mistry All right reserved.
|
|
Copyright (c) 2018, Adafruit Industries (adafruit.com)
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
See the GNU Lesser General Public License for more details.
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef _VARIANT_TTGO_EINK_V1_0_
|
|
#define _VARIANT_TTGO_EINK_V1_0_
|
|
|
|
/** Master clock frequency */
|
|
#define VARIANT_MCK (64000000ul)
|
|
|
|
#define USE_LFXO // Board uses 32khz crystal for LF
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* Headers
|
|
*----------------------------------------------------------------------------*/
|
|
|
|
#include "WVariant.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif // __cplusplus
|
|
|
|
#define TTGO_T_ECHO
|
|
|
|
// Number of pins defined in PinDescription array
|
|
#define PINS_COUNT (48)
|
|
#define NUM_DIGITAL_PINS (48)
|
|
#define NUM_ANALOG_INPUTS (1)
|
|
#define NUM_ANALOG_OUTPUTS (0)
|
|
|
|
// LEDs
|
|
#define PIN_LED1 (0 + 14) // 13 red (confirmed on 1.0 board)
|
|
// Unused(by firmware) LEDs:
|
|
#define PIN_LED2 (0 + 15) // 14 blue
|
|
#define PIN_LED3 (0 + 13) // 15 green
|
|
|
|
#define LED_RED PIN_LED3
|
|
#define LED_BLUE PIN_LED1
|
|
#define LED_GREEN PIN_LED2
|
|
|
|
#define LED_BUILTIN LED_BLUE
|
|
#define LED_CONN PIN_GREEN
|
|
|
|
#define LED_STATE_ON 0 // State when LED is lit
|
|
|
|
/*
|
|
* Buttons
|
|
*/
|
|
#define PIN_BUTTON1 (32 + 10)
|
|
#define PIN_BUTTON2 (0 + 18) // 0.18 is labeled on the board as RESET but we configure it in the bootloader as a regular GPIO
|
|
#define PIN_BUTTON_TOUCH (0 + 11) // 0.11 is the soft touch button on T-Echo
|
|
|
|
#define BUTTON_CLICK_MS 400
|
|
#define BUTTON_TOUCH_MS 200
|
|
|
|
/*
|
|
* Analog pins
|
|
*/
|
|
#define PIN_A0 (4) // Battery ADC
|
|
|
|
#define BATTERY_PIN PIN_A0
|
|
|
|
static const uint8_t A0 = PIN_A0;
|
|
|
|
#define ADC_RESOLUTION 14
|
|
|
|
#define PIN_NFC1 (9)
|
|
#define PIN_NFC2 (10)
|
|
|
|
/*
|
|
* Serial interfaces
|
|
*/
|
|
|
|
/*
|
|
No longer populated on PCB
|
|
*/
|
|
// #define PIN_SERIAL2_RX (0 + 6)
|
|
// #define PIN_SERIAL2_TX (0 + 8)
|
|
// #define PIN_SERIAL2_EN (0 + 17)
|
|
|
|
/**
|
|
Wire Interfaces
|
|
*/
|
|
#define WIRE_INTERFACES_COUNT 1
|
|
|
|
#define PIN_WIRE_SDA (26)
|
|
#define PIN_WIRE_SCL (27)
|
|
|
|
/* touch sensor, active high */
|
|
|
|
#define TP_SER_IO (0 + 11)
|
|
|
|
#define PIN_RTC_INT (0 + 16) // Interrupt from the PCF8563 RTC
|
|
|
|
/*
|
|
External serial flash WP25R1635FZUIL0
|
|
*/
|
|
|
|
// QSPI Pins
|
|
#define PIN_QSPI_SCK (32 + 14)
|
|
#define PIN_QSPI_CS (32 + 15)
|
|
#define PIN_QSPI_IO0 (32 + 12) // MOSI if using two bit interface
|
|
#define PIN_QSPI_IO1 (32 + 13) // MISO if using two bit interface
|
|
#define PIN_QSPI_IO2 (0 + 7) // WP if using two bit interface (i.e. not used)
|
|
#define PIN_QSPI_IO3 (0 + 5) // HOLD if using two bit interface (i.e. not used)
|
|
|
|
// On-board QSPI Flash
|
|
#define EXTERNAL_FLASH_DEVICES MX25R1635F
|
|
#define EXTERNAL_FLASH_USE_QSPI
|
|
|
|
/*
|
|
* Lora radio
|
|
*/
|
|
|
|
#define USE_SX1262
|
|
#define USE_SX1268
|
|
#define SX126X_CS (0 + 24) // FIXME - we really should define LORA_CS instead
|
|
#define SX126X_DIO1 (0 + 20)
|
|
// Note DIO2 is attached internally to the module to an analog switch for TX/RX switching
|
|
#define SX1262_DIO3 \
|
|
(0 + 21) // This is used as an *output* from the sx1262 and connected internally to power the tcxo, do not drive from the main
|
|
// CPU?
|
|
#define SX126X_BUSY (0 + 17)
|
|
#define SX126X_RESET (0 + 25)
|
|
// Not really an E22 but TTGO seems to be trying to clone that
|
|
#define SX126X_DIO2_AS_RF_SWITCH
|
|
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
|
// Internally the TTGO module hooks the SX1262-DIO2 in to control the TX/RX switch (which is the default for the sx1262interface
|
|
// code)
|
|
|
|
// #define LORA_DISABLE_SENDING // Define this to disable transmission for testing (power testing etc...)
|
|
|
|
// #undef SX126X_CS
|
|
|
|
/*
|
|
* eink display pins
|
|
*/
|
|
|
|
#define PIN_EINK_EN (32 + 11) // Note: this is really just backlight power
|
|
#define PIN_EINK_CS (0 + 30)
|
|
#define PIN_EINK_BUSY (0 + 3)
|
|
#define PIN_EINK_DC (0 + 28)
|
|
#define PIN_EINK_RES (0 + 2)
|
|
#define PIN_EINK_SCLK (0 + 31)
|
|
#define PIN_EINK_MOSI (0 + 29) // also called SDI
|
|
|
|
// Controls power for all peripherals (eink + GPS + LoRa + Sensor)
|
|
#define PIN_POWER_EN (0 + 12)
|
|
// #define PIN_POWER_EN1 (0 + 13)
|
|
|
|
#define PIN_SPI1_MISO \
|
|
(32 + 7) // FIXME not really needed, but for now the SPI code requires something to be defined, pick an used GPIO
|
|
#define PIN_SPI1_MOSI PIN_EINK_MOSI
|
|
#define PIN_SPI1_SCK PIN_EINK_SCLK
|
|
|
|
/*
|
|
* GPS pins
|
|
*/
|
|
|
|
#define GPS_L76K
|
|
#define PIN_GPS_REINIT (32 + 5) // An output to reset L76K GPS. As per datasheet, low for > 100ms will reset the L76K
|
|
|
|
#define PIN_GPS_STANDBY (32 + 2) // An output to wake GPS, low means allow sleep, high means force wake
|
|
// Seems to be missing on this new board
|
|
// #define PIN_GPS_PPS (32 + 4) // Pulse per second input from the GPS
|
|
#define GPS_TX_PIN (32 + 9) // This is for bits going TOWARDS the CPU
|
|
#define GPS_RX_PIN (32 + 8) // This is for bits going TOWARDS the GPS
|
|
|
|
#define GPS_THREAD_INTERVAL 50
|
|
|
|
#define PIN_SERIAL1_RX GPS_TX_PIN
|
|
#define PIN_SERIAL1_TX GPS_RX_PIN
|
|
|
|
// PCF8563 RTC Module
|
|
#define PCF8563_RTC 0x51
|
|
|
|
/*
|
|
* SPI Interfaces
|
|
*/
|
|
#define SPI_INTERFACES_COUNT 2
|
|
|
|
// For LORA, spi 0
|
|
#define PIN_SPI_MISO (0 + 23)
|
|
#define PIN_SPI_MOSI (0 + 22)
|
|
#define PIN_SPI_SCK (0 + 19)
|
|
|
|
#define PIN_PWR_EN (0 + 6)
|
|
|
|
// To debug via the segger JLINK console rather than the CDC-ACM serial device
|
|
// #define USE_SEGGER
|
|
|
|
// Battery
|
|
// The battery sense is hooked to pin A0 (4)
|
|
// it is defined in the anlaolgue pin section of this file
|
|
// and has 12 bit resolution
|
|
#define BATTERY_SENSE_RESOLUTION_BITS 12
|
|
#define BATTERY_SENSE_RESOLUTION 4096.0
|
|
#undef AREF_VOLTAGE
|
|
#define AREF_VOLTAGE 3.0
|
|
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
|
|
#define ADC_MULTIPLIER (2.0F)
|
|
|
|
#define NO_EXT_GPIO 1
|
|
|
|
#define HAS_RTC 1
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* Arduino objects - C++ only
|
|
*----------------------------------------------------------------------------*/
|
|
|
|
#endif |