mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-07-18 09:38:45 +00:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e70e6e859f | ||
|
|
b941958b52 |
@@ -725,7 +725,7 @@ void UITask::loop() {
|
|||||||
next_batt_chck = millis() + 8000;
|
next_batt_chck = millis() + 8000;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (_display != NULL && _display->isOn() && millis >= next_batt_chck) {
|
if (_display != NULL && _display->isOn() && millis() >= next_batt_chck) {
|
||||||
_cached_batt_mv = getBattMilliVolts();
|
_cached_batt_mv = getBattMilliVolts();
|
||||||
next_batt_chck = millis() + 8000;
|
next_batt_chck = millis() + 8000;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
#include "SSD1315Display.h"
|
||||||
|
|
||||||
|
#ifndef SCREEN_XOFFSET
|
||||||
|
#define SCREEN_XOFFSET 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SCREEN_YOFFSET
|
||||||
|
#define SCREEN_YOFFSET 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool SSD1315Display::i2c_probe(TwoWire& wire, uint8_t addr) {
|
||||||
|
wire.beginTransmission(addr);
|
||||||
|
uint8_t error = wire.endTransmission();
|
||||||
|
return (error == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SSD1315Display::begin() {
|
||||||
|
if (!_isOn) {
|
||||||
|
if (_peripher_power) _peripher_power->claim();
|
||||||
|
_isOn = true;
|
||||||
|
}
|
||||||
|
#ifdef DISPLAY_ROTATION
|
||||||
|
display.setRotation(DISPLAY_ROTATION);
|
||||||
|
#endif
|
||||||
|
return display.begin(SSD1306_SWITCHCAPVCC, DISPLAY_ADDRESS, true, false) && i2c_probe(Wire, DISPLAY_ADDRESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1315Display::turnOn() {
|
||||||
|
if (!_isOn) {
|
||||||
|
if (_peripher_power) _peripher_power->claim();
|
||||||
|
_isOn = true; // set before begin() to prevent double claim
|
||||||
|
if (_peripher_power) begin(); // re-init display after power was cut
|
||||||
|
}
|
||||||
|
display.ssd1306_command(SSD1306_DISPLAYON);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1315Display::turnOff() {
|
||||||
|
display.ssd1306_command(SSD1306_DISPLAYOFF);
|
||||||
|
if (_isOn) {
|
||||||
|
if (_peripher_power) {
|
||||||
|
#if PIN_OLED_RESET >= 0
|
||||||
|
digitalWrite(PIN_OLED_RESET, LOW);
|
||||||
|
#endif
|
||||||
|
_peripher_power->release();
|
||||||
|
}
|
||||||
|
_isOn = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1315Display::clear() {
|
||||||
|
display.clearDisplay();
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1315Display::startFrame(Color bkg) {
|
||||||
|
display.clearDisplay(); // TODO: apply 'bkg'
|
||||||
|
_color = SSD1306_WHITE;
|
||||||
|
display.setTextColor(_color);
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setTextWrap(false);
|
||||||
|
display.cp437(true); // Use full 256 char 'Code Page 437' font
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1315Display::setTextSize(int sz) {
|
||||||
|
display.setTextSize(1); // only small allowed
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1315Display::setColor(Color c) {
|
||||||
|
_color = (c != 0) ? SSD1306_WHITE : SSD1306_BLACK;
|
||||||
|
display.setTextColor(_color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1315Display::setCursor(int x, int y) {
|
||||||
|
display.setCursor(x + SCREEN_XOFFSET, y + SCREEN_YOFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1315Display::print(const char* str) {
|
||||||
|
display.print(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1315Display::fillRect(int x, int y, int w, int h) {
|
||||||
|
display.fillRect(x + SCREEN_XOFFSET, y + SCREEN_YOFFSET, w, h, _color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1315Display::drawRect(int x, int y, int w, int h) {
|
||||||
|
display.drawRect(x + SCREEN_XOFFSET, y + SCREEN_YOFFSET, w, h, _color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1315Display::drawXbm(int x, int y, const uint8_t* bits, int w, int h) {
|
||||||
|
// Width in bytes for bitmap processing
|
||||||
|
uint16_t widthInBytes = (w + 7) / 8;
|
||||||
|
|
||||||
|
x += SCREEN_XOFFSET;
|
||||||
|
y += SCREEN_YOFFSET;
|
||||||
|
// Process the bitmap row by row
|
||||||
|
for (int by = 0; by < h; by++) {
|
||||||
|
// Scan across the row bit by bit
|
||||||
|
for (int bx = 0; bx < w; bx++) {
|
||||||
|
// Get the current bit using MSB ordering (like GxEPDDisplay)
|
||||||
|
uint16_t byteOffset = (by * widthInBytes) + (bx / 8);
|
||||||
|
uint8_t bitMask = 1 << (bx & 7);
|
||||||
|
bool bitSet = bits[byteOffset] & bitMask;
|
||||||
|
|
||||||
|
// If the bit is set, draw the pixel
|
||||||
|
if (bitSet) {
|
||||||
|
display.drawPixel(x + bx, y + by, SSD1306_WHITE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// wrong bit order:
|
||||||
|
// display.drawBitmap(x + SCREEN_XOFFSET, y + SCREEN_YOFFSET, bits, w, h, SSD1306_WHITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t SSD1315Display::getTextWidth(const char* str) {
|
||||||
|
int16_t x1, y1;
|
||||||
|
uint16_t w, h;
|
||||||
|
display.getTextBounds(str, 0, 0, &x1, &y1, &w, &h);
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSD1315Display::endFrame() {
|
||||||
|
display.display();
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "DisplayDriver.h"
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#define SSD1306_NO_SPLASH
|
||||||
|
#include <Adafruit_SSD1306.h>
|
||||||
|
#include <helpers/RefCountedDigitalPin.h>
|
||||||
|
|
||||||
|
#ifndef PIN_OLED_RESET
|
||||||
|
#define PIN_OLED_RESET 21 // Reset pin # (or -1 if sharing Arduino reset pin)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DISPLAY_ADDRESS
|
||||||
|
#define DISPLAY_ADDRESS 0x3C
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class SSD1315Display : public DisplayDriver {
|
||||||
|
Adafruit_SSD1306 display;
|
||||||
|
bool _isOn;
|
||||||
|
uint8_t _color;
|
||||||
|
RefCountedDigitalPin* _peripher_power;
|
||||||
|
|
||||||
|
bool i2c_probe(TwoWire& wire, uint8_t addr);
|
||||||
|
public:
|
||||||
|
SSD1315Display(RefCountedDigitalPin* peripher_power=NULL) : DisplayDriver(64, 32),
|
||||||
|
display(128, 64, &Wire, PIN_OLED_RESET),
|
||||||
|
_peripher_power(peripher_power)
|
||||||
|
{
|
||||||
|
_isOn = false;
|
||||||
|
}
|
||||||
|
bool begin();
|
||||||
|
|
||||||
|
bool isOn() override { return _isOn; }
|
||||||
|
void turnOn() override;
|
||||||
|
void turnOff() override;
|
||||||
|
void clear() override;
|
||||||
|
void startFrame(Color bkg = DARK) override;
|
||||||
|
void setTextSize(int sz) override;
|
||||||
|
void setColor(Color c) override;
|
||||||
|
void setCursor(int x, int y) override;
|
||||||
|
void print(const char* str) override;
|
||||||
|
void fillRect(int x, int y, int w, int h) override;
|
||||||
|
void drawRect(int x, int y, int w, int h) override;
|
||||||
|
void drawXbm(int x, int y, const uint8_t* bits, int w, int h) override;
|
||||||
|
uint16_t getTextWidth(const char* str) override;
|
||||||
|
void endFrame() override;
|
||||||
|
};
|
||||||
@@ -29,8 +29,8 @@ void TImpulsePlusBoard::begin() {
|
|||||||
// configure user button
|
// configure user button
|
||||||
pinMode(TTP223_KEY, INPUT_PULLDOWN);
|
pinMode(TTP223_KEY, INPUT_PULLDOWN);
|
||||||
|
|
||||||
#if defined(PIN_WIRE_SDA) && defined(PIN_WIRE_SCL)
|
#if defined(SCREEN_SDA) && defined(SCREEN_SCL)
|
||||||
Wire.setPins(PIN_WIRE_SDA, PIN_WIRE_SCL);
|
Wire.setPins(SCREEN_SDA, SCREEN_SCL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
|
|||||||
@@ -12,20 +12,22 @@ build_flags = ${nrf52_base.build_flags}
|
|||||||
-D SX126X_CURRENT_LIMIT=140
|
-D SX126X_CURRENT_LIMIT=140
|
||||||
-D SX126X_RX_BOOSTED_GAIN=1
|
-D SX126X_RX_BOOSTED_GAIN=1
|
||||||
-D PIN_USER_BTN=-1
|
-D PIN_USER_BTN=-1
|
||||||
; -D PIN_USER_BTN=TTP223_KEY ; leave button disabled until screen implemented
|
-D PIN_USER_BTN=TTP223_KEY
|
||||||
; -D USER_BTN_PRESSED=HIGH
|
-D USER_BTN_PRESSED=HIGH
|
||||||
-D PIN_WIRE_SDA=SCREEN_SDA
|
-D PIN_WIRE_SDA=SCREEN_SDA
|
||||||
-D PIN_WIRE_SCL=SCREEN_SCL
|
-D PIN_WIRE_SCL=SCREEN_SCL
|
||||||
-D ENV_PIN_SDA=IIC_SDA_2 ; firmware hangs without this
|
-D SCREEN_XOFFSET=32
|
||||||
-D ENV_PIN_SCL=IIC_SCL_2 ; firmware hangs without this
|
-D SCREEN_YOFFSET=32
|
||||||
|
-D ENV_PIN_SDA=IIC_SDA_1 ; firmware hangs without this
|
||||||
|
-D ENV_PIN_SCL=IIC_SCL_1 ; firmware hangs without this
|
||||||
build_src_filter = ${nrf52_base.build_src_filter}
|
build_src_filter = ${nrf52_base.build_src_filter}
|
||||||
+<TImpulsePlusBoard.cpp>
|
+<TImpulsePlusBoard.cpp>
|
||||||
+<../variants/lilygo_t_impulse_plus>
|
+<../variants/lilygo_t_impulse_plus>
|
||||||
+<helpers/ui/SSD1306Display.cpp>
|
+<helpers/ui/SSD1315Display.cpp>
|
||||||
+<helpers/sensors>
|
+<helpers/sensors>
|
||||||
lib_deps= ${nrf52_base.lib_deps}
|
lib_deps= ${nrf52_base.lib_deps}
|
||||||
${sensor_base.lib_deps}
|
${sensor_base.lib_deps}
|
||||||
adafruit/Adafruit SSD1306 @ ^2.5.13
|
adafruit/Adafruit SSD1306 @ ^2.5.14
|
||||||
adafruit/Adafruit GFX Library @ ^1.12.1
|
adafruit/Adafruit GFX Library @ ^1.12.1
|
||||||
|
|
||||||
[env:LilyGo_T_Impulse_Plus_repeater]
|
[env:LilyGo_T_Impulse_Plus_repeater]
|
||||||
@@ -49,8 +51,8 @@ extends = LilyGo_T_Impulse_Plus
|
|||||||
build_flags =
|
build_flags =
|
||||||
${LilyGo_T_Impulse_Plus.build_flags}
|
${LilyGo_T_Impulse_Plus.build_flags}
|
||||||
-I src/helpers/ui
|
-I src/helpers/ui
|
||||||
-I examples/companion_radio/ui-new
|
-I examples/companion_radio/ui-tiny
|
||||||
-D DISPLAY_CLASS=SSD1306Display
|
-D DISPLAY_CLASS=SSD1315Display
|
||||||
-D MAX_CONTACTS=350
|
-D MAX_CONTACTS=350
|
||||||
-D MAX_GROUP_CHANNELS=40
|
-D MAX_GROUP_CHANNELS=40
|
||||||
-D QSPIFLASH=1
|
-D QSPIFLASH=1
|
||||||
@@ -62,7 +64,7 @@ build_flags =
|
|||||||
build_src_filter = ${LilyGo_T_Impulse_Plus.build_src_filter}
|
build_src_filter = ${LilyGo_T_Impulse_Plus.build_src_filter}
|
||||||
+<helpers/nrf52/SerialBLEInterface.cpp>
|
+<helpers/nrf52/SerialBLEInterface.cpp>
|
||||||
+<../examples/companion_radio/*.cpp>
|
+<../examples/companion_radio/*.cpp>
|
||||||
+<../examples/companion_radio/ui-new/*.cpp>
|
+<../examples/companion_radio/ui-tiny/*.cpp>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${LilyGo_T_Impulse_Plus.lib_deps}
|
${LilyGo_T_Impulse_Plus.lib_deps}
|
||||||
densaugeo/base64 @ ~1.4.0
|
densaugeo/base64 @ ~1.4.0
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ EnvironmentSensorManager sensors = EnvironmentSensorManager();
|
|||||||
|
|
||||||
#ifdef DISPLAY_CLASS
|
#ifdef DISPLAY_CLASS
|
||||||
DISPLAY_CLASS display;
|
DISPLAY_CLASS display;
|
||||||
MomentaryButton user_btn(PIN_USER_BTN, 1000, true);
|
MomentaryButton user_btn(PIN_USER_BTN, 1000, false, true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool radio_init() {
|
bool radio_init() {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#include <helpers/ArduinoHelpers.h>
|
#include <helpers/ArduinoHelpers.h>
|
||||||
#include <helpers/sensors/EnvironmentSensorManager.h>
|
#include <helpers/sensors/EnvironmentSensorManager.h>
|
||||||
#ifdef DISPLAY_CLASS
|
#ifdef DISPLAY_CLASS
|
||||||
#include <helpers/ui/SSD1306Display.h>
|
#include <helpers/ui/SSD1315Display.h>
|
||||||
#include <helpers/ui/MomentaryButton.h>
|
#include <helpers/ui/MomentaryButton.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -94,6 +94,9 @@ extern "C"
|
|||||||
#define GPS_BAUD_RATE 38400
|
#define GPS_BAUD_RATE 38400
|
||||||
#define PIN_GPS_EN_ACTIVE LOW
|
#define PIN_GPS_EN_ACTIVE LOW
|
||||||
|
|
||||||
|
// vibrate
|
||||||
|
#define VIBRATION_MOTOR_DATA _PINNUM(0, 22)
|
||||||
|
|
||||||
// Battery
|
// Battery
|
||||||
#define BATTERY_MEASUREMENT_CONTROL _PINNUM(0, 25)
|
#define BATTERY_MEASUREMENT_CONTROL _PINNUM(0, 25)
|
||||||
#define BATTERY_ADC_DATA _PINNUM(0, 5)
|
#define BATTERY_ADC_DATA _PINNUM(0, 5)
|
||||||
@@ -186,11 +189,11 @@ static const uint8_t SCK = PIN_SPI_SCK ;
|
|||||||
*/
|
*/
|
||||||
#define WIRE_INTERFACES_COUNT 2
|
#define WIRE_INTERFACES_COUNT 2
|
||||||
|
|
||||||
#define PIN_WIRE_SDA (26)
|
#define PIN_WIRE_SDA _PINNUM(0, 20)
|
||||||
#define PIN_WIRE_SCL (27)
|
#define PIN_WIRE_SCL _PINNUM(0, 15)
|
||||||
|
|
||||||
#define PIN_WIRE1_SDA (26)
|
#define PIN_WIRE1_SDA _PINNUM(1, 8)
|
||||||
#define PIN_WIRE1_SCL (27)
|
#define PIN_WIRE1_SCL _PINNUM(0, 11)
|
||||||
|
|
||||||
// ZD25WQ32CEIGR SPI
|
// ZD25WQ32CEIGR SPI
|
||||||
#define ZD25WQ32C_CS _PINNUM(0, 12)
|
#define ZD25WQ32C_CS _PINNUM(0, 12)
|
||||||
|
|||||||
Reference in New Issue
Block a user