mirror of
https://github.com/meshtastic/firmware.git
synced 2025-10-02 05:37:45 +00:00
support M5 corebasic2.7+Module-LoRa433_V1.1+GNSS Module
This commit is contained in:
parent
464f270b12
commit
e2712b478d
@ -39,7 +39,7 @@ default_envs = tbeam
|
|||||||
;default_envs = heltec_vision_master_e213
|
;default_envs = heltec_vision_master_e213
|
||||||
;default_envs = heltec_vision_master_e290
|
;default_envs = heltec_vision_master_e290
|
||||||
;default_envs = heltec_mesh_node_t114
|
;default_envs = heltec_mesh_node_t114
|
||||||
|
;default_envs = m5stack-corebasic
|
||||||
extra_configs =
|
extra_configs =
|
||||||
arch/*/*.ini
|
arch/*/*.ini
|
||||||
variants/*/platformio.ini
|
variants/*/platformio.ini
|
||||||
|
@ -13,7 +13,9 @@
|
|||||||
#ifdef ARCH_PORTDUINO
|
#ifdef ARCH_PORTDUINO
|
||||||
#include "platform/portduino/PortduinoGlue.h"
|
#include "platform/portduino/PortduinoGlue.h"
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
#include <M5Unified.h>
|
||||||
|
#endif
|
||||||
#define DEBUG_BUTTONS 0
|
#define DEBUG_BUTTONS 0
|
||||||
#if DEBUG_BUTTONS
|
#if DEBUG_BUTTONS
|
||||||
#define LOG_BUTTON(...) LOG_DEBUG(__VA_ARGS__)
|
#define LOG_BUTTON(...) LOG_DEBUG(__VA_ARGS__)
|
||||||
@ -124,6 +126,9 @@ int32_t ButtonThread::runOnce()
|
|||||||
switch (btnEvent) {
|
switch (btnEvent) {
|
||||||
case BUTTON_EVENT_PRESSED: {
|
case BUTTON_EVENT_PRESSED: {
|
||||||
LOG_BUTTON("press!\n");
|
LOG_BUTTON("press!\n");
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
M5.Speaker.tone(1000, 100);
|
||||||
|
#endif
|
||||||
#ifdef BUTTON_PIN
|
#ifdef BUTTON_PIN
|
||||||
if (((config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN) !=
|
if (((config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN) !=
|
||||||
moduleConfig.canned_message.inputbroker_pin_press) ||
|
moduleConfig.canned_message.inputbroker_pin_press) ||
|
||||||
@ -144,6 +149,9 @@ int32_t ButtonThread::runOnce()
|
|||||||
|
|
||||||
case BUTTON_EVENT_DOUBLE_PRESSED: {
|
case BUTTON_EVENT_DOUBLE_PRESSED: {
|
||||||
LOG_BUTTON("Double press!\n");
|
LOG_BUTTON("Double press!\n");
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
M5.Speaker.tone(2000, 100);
|
||||||
|
#endif
|
||||||
service->refreshLocalMeshNode();
|
service->refreshLocalMeshNode();
|
||||||
auto sentPosition = service->trySendPosition(NODENUM_BROADCAST, true);
|
auto sentPosition = service->trySendPosition(NODENUM_BROADCAST, true);
|
||||||
if (screen) {
|
if (screen) {
|
||||||
@ -185,6 +193,9 @@ int32_t ButtonThread::runOnce()
|
|||||||
|
|
||||||
case BUTTON_EVENT_LONG_PRESSED: {
|
case BUTTON_EVENT_LONG_PRESSED: {
|
||||||
LOG_BUTTON("Long press!\n");
|
LOG_BUTTON("Long press!\n");
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
M5.Speaker.tone(3000, 300);
|
||||||
|
#endif
|
||||||
powerFSM.trigger(EVENT_PRESS);
|
powerFSM.trigger(EVENT_PRESS);
|
||||||
if (screen) {
|
if (screen) {
|
||||||
screen->startAlert("Shutting down...");
|
screen->startAlert("Shutting down...");
|
||||||
@ -197,6 +208,9 @@ int32_t ButtonThread::runOnce()
|
|||||||
// may wake the board immediatedly.
|
// may wake the board immediatedly.
|
||||||
case BUTTON_EVENT_LONG_RELEASED: {
|
case BUTTON_EVENT_LONG_RELEASED: {
|
||||||
LOG_INFO("Shutdown from long press\n");
|
LOG_INFO("Shutdown from long press\n");
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
M5.Speaker.tone(4000, 300);
|
||||||
|
#endif
|
||||||
playShutdownMelody();
|
playShutdownMelody();
|
||||||
delay(3000);
|
delay(3000);
|
||||||
power->shutdown();
|
power->shutdown();
|
||||||
|
@ -62,7 +62,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#if ARCH_PORTDUINO
|
#if ARCH_PORTDUINO
|
||||||
#include "platform/portduino/PortduinoGlue.h"
|
#include "platform/portduino/PortduinoGlue.h"
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
#include "M5Unified.h"
|
||||||
|
extern DataInfo DataRegion;
|
||||||
|
#endif
|
||||||
using namespace meshtastic; /** @todo remove */
|
using namespace meshtastic; /** @todo remove */
|
||||||
|
|
||||||
namespace graphics
|
namespace graphics
|
||||||
@ -949,7 +952,26 @@ bool deltaToTimestamp(uint32_t secondsAgo, uint8_t *hours, uint8_t *minutes, int
|
|||||||
validCached = true;
|
validCached = true;
|
||||||
return validCached;
|
return validCached;
|
||||||
}
|
}
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
static void drawLoraMessage(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y){
|
||||||
|
display->clear();
|
||||||
|
display->drawString(x + 0, y + 0, myRegion->name);
|
||||||
|
display->setFont(FONT_MEDIUM);
|
||||||
|
display->drawString(x + 10, y + 30,"channel: "+String(DataRegion.lora_channel_num+1));
|
||||||
|
display->drawString(x + 10, y + 60,"bw: "+ String(DataRegion.lora_bw));
|
||||||
|
display->drawString(x + SCREEN_WIDTH/2+10, y+30,"freq: "+String(DataRegion.lora_freq));
|
||||||
|
display->drawString(x + SCREEN_WIDTH/2+10, y+60,"power: "+ String(DataRegion.lora_power_output));
|
||||||
|
display->drawString(x + 10, y + 90,"sf: "+String(DataRegion.lora_sf));
|
||||||
|
display->drawString(x + SCREEN_WIDTH/2+10, y+90,"cr: 4/:"+ String(DataRegion.lora_cr));
|
||||||
|
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
||||||
|
const char *title = "LoRa";
|
||||||
|
display->drawString(x + SCREEN_WIDTH/2-20, y +0, title);
|
||||||
|
display->setFont(FONT_SMALL);
|
||||||
|
display->setTextAlignment(TEXT_ALIGN_RIGHT);
|
||||||
|
display->drawString(x + SCREEN_WIDTH, y,String(DataRegion.lora_channel_name));
|
||||||
|
display->setTextAlignment(TEXT_ALIGN_LEFT); // Restore left align, just to be kind to any other unsuspecting code
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/// Draw the last text message we received
|
/// Draw the last text message we received
|
||||||
static void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
|
static void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
|
||||||
{
|
{
|
||||||
@ -968,7 +990,11 @@ static void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state
|
|||||||
display->setFont(FONT_SMALL);
|
display->setFont(FONT_SMALL);
|
||||||
if (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_INVERTED) {
|
if (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_INVERTED) {
|
||||||
display->fillRect(0 + x, 0 + y, x + display->getWidth(), y + FONT_HEIGHT_SMALL);
|
display->fillRect(0 + x, 0 + y, x + display->getWidth(), y + FONT_HEIGHT_SMALL);
|
||||||
display->setColor(BLACK);
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
display->setColor(OLEDDISPLAY_COLOR::BLACK);
|
||||||
|
#else
|
||||||
|
display->setColor(BLACK);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// For time delta
|
// For time delta
|
||||||
@ -1002,7 +1028,11 @@ static void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
display->setColor(OLEDDISPLAY_COLOR::WHITE);
|
||||||
|
#else
|
||||||
display->setColor(WHITE);
|
display->setColor(WHITE);
|
||||||
|
#endif
|
||||||
#ifndef EXCLUDE_EMOJI
|
#ifndef EXCLUDE_EMOJI
|
||||||
if (strcmp(reinterpret_cast<const char *>(mp.decoded.payload.bytes), u8"\U0001F44D") == 0) {
|
if (strcmp(reinterpret_cast<const char *>(mp.decoded.payload.bytes), u8"\U0001F44D") == 0) {
|
||||||
display->drawXbm(x + (SCREEN_WIDTH - thumbs_width) / 2,
|
display->drawXbm(x + (SCREEN_WIDTH - thumbs_width) / 2,
|
||||||
@ -1075,10 +1105,15 @@ void Screen::drawColumns(OLEDDisplay *display, int16_t x, int16_t y, const char
|
|||||||
int xo = x, yo = y;
|
int xo = x, yo = y;
|
||||||
while (*f) {
|
while (*f) {
|
||||||
display->drawString(xo, yo, *f);
|
display->drawString(xo, yo, *f);
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
if ((display->getColor() == OLEDDISPLAY_COLOR::BLACK) && config.display.heading_bold)
|
||||||
|
display->drawString(xo + 1, yo, *f);
|
||||||
|
display->setColor(OLEDDISPLAY_COLOR::WHITE);
|
||||||
|
#else
|
||||||
if ((display->getColor() == BLACK) && config.display.heading_bold)
|
if ((display->getColor() == BLACK) && config.display.heading_bold)
|
||||||
display->drawString(xo + 1, yo, *f);
|
display->drawString(xo + 1, yo, *f);
|
||||||
|
|
||||||
display->setColor(WHITE);
|
display->setColor(WHITE);
|
||||||
|
#endif
|
||||||
yo += FONT_HEIGHT_SMALL;
|
yo += FONT_HEIGHT_SMALL;
|
||||||
if (yo > SCREEN_HEIGHT - FONT_HEIGHT_SMALL) {
|
if (yo > SCREEN_HEIGHT - FONT_HEIGHT_SMALL) {
|
||||||
xo += SCREEN_WIDTH / 2;
|
xo += SCREEN_WIDTH / 2;
|
||||||
@ -1487,7 +1522,11 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_
|
|||||||
display->drawCircle(compassX, compassY, compassDiam / 2);
|
display->drawCircle(compassX, compassY, compassDiam / 2);
|
||||||
|
|
||||||
if (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_INVERTED) {
|
if (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_INVERTED) {
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
display->setColor(OLEDDISPLAY_COLOR::BLACK);
|
||||||
|
#else
|
||||||
display->setColor(BLACK);
|
display->setColor(BLACK);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
// Must be after distStr is populated
|
// Must be after distStr is populated
|
||||||
screen->drawColumns(display, x, y, fields);
|
screen->drawColumns(display, x, y, fields);
|
||||||
@ -2103,7 +2142,13 @@ void Screen::setFrames(FrameFocus focus)
|
|||||||
fsi.positions.textMessage = numframes;
|
fsi.positions.textMessage = numframes;
|
||||||
if (devicestate.has_rx_text_message && shouldDrawMessage(&devicestate.rx_text_message)) {
|
if (devicestate.has_rx_text_message && shouldDrawMessage(&devicestate.rx_text_message)) {
|
||||||
normalFrames[numframes++] = drawTextMessageFrame;
|
normalFrames[numframes++] = drawTextMessageFrame;
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
M5.Speaker.tone(3000, 400);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
normalFrames[numframes++] = drawLoraMessage;
|
||||||
|
#endif
|
||||||
|
|
||||||
// then all the nodes
|
// then all the nodes
|
||||||
// We only show a few nodes in our scrolling list - because meshes with many nodes would have too many screens
|
// We only show a few nodes in our scrolling list - because meshes with many nodes would have too many screens
|
||||||
@ -2365,7 +2410,11 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
|||||||
|
|
||||||
if (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_INVERTED) {
|
if (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_INVERTED) {
|
||||||
display->fillRect(0 + x, 0 + y, x + display->getWidth(), y + FONT_HEIGHT_SMALL);
|
display->fillRect(0 + x, 0 + y, x + display->getWidth(), y + FONT_HEIGHT_SMALL);
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
display->setColor(OLEDDISPLAY_COLOR::BLACK);
|
||||||
|
#else
|
||||||
display->setColor(BLACK);
|
display->setColor(BLACK);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
char channelStr[20];
|
char channelStr[20];
|
||||||
@ -2406,7 +2455,11 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
display->setColor(WHITE);
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
display->setColor(OLEDDISPLAY_COLOR::WHITE);
|
||||||
|
#else
|
||||||
|
display->setColor(WHITE);
|
||||||
|
#endif
|
||||||
// Draw the channel name
|
// Draw the channel name
|
||||||
display->drawString(x, y + FONT_HEIGHT_SMALL, channelStr);
|
display->drawString(x, y + FONT_HEIGHT_SMALL, channelStr);
|
||||||
// Draw our hardware ID to assist with bluetooth pairing. Either prefix with Info or S&F Logo
|
// Draw our hardware ID to assist with bluetooth pairing. Either prefix with Info or S&F Logo
|
||||||
@ -2477,7 +2530,11 @@ void DebugInfo::drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, i
|
|||||||
|
|
||||||
if (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_INVERTED) {
|
if (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_INVERTED) {
|
||||||
display->fillRect(0 + x, 0 + y, x + display->getWidth(), y + FONT_HEIGHT_SMALL);
|
display->fillRect(0 + x, 0 + y, x + display->getWidth(), y + FONT_HEIGHT_SMALL);
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
display->setColor(OLEDDISPLAY_COLOR::BLACK);
|
||||||
|
#else
|
||||||
display->setColor(BLACK);
|
display->setColor(BLACK);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WiFi.status() != WL_CONNECTED) {
|
if (WiFi.status() != WL_CONNECTED) {
|
||||||
@ -2497,7 +2554,11 @@ void DebugInfo::drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
display->setColor(WHITE);
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
display->setColor(OLEDDISPLAY_COLOR::WHITE);
|
||||||
|
#else
|
||||||
|
display->setColor(WHITE);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
- WL_CONNECTED: assigned when connected to a WiFi network;
|
- WL_CONNECTED: assigned when connected to a WiFi network;
|
||||||
@ -2557,7 +2618,11 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat
|
|||||||
|
|
||||||
if (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_INVERTED) {
|
if (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_INVERTED) {
|
||||||
display->fillRect(0 + x, 0 + y, x + display->getWidth(), y + FONT_HEIGHT_SMALL);
|
display->fillRect(0 + x, 0 + y, x + display->getWidth(), y + FONT_HEIGHT_SMALL);
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
display->setColor(OLEDDISPLAY_COLOR::BLACK);
|
||||||
|
#else
|
||||||
display->setColor(BLACK);
|
display->setColor(BLACK);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
char batStr[20];
|
char batStr[20];
|
||||||
@ -2596,7 +2661,11 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat
|
|||||||
// minutes %= 60;
|
// minutes %= 60;
|
||||||
// hours %= 24;
|
// hours %= 24;
|
||||||
|
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
display->setColor(OLEDDISPLAY_COLOR::WHITE);
|
||||||
|
#else
|
||||||
display->setColor(WHITE);
|
display->setColor(WHITE);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Show uptime as days, hours, minutes OR seconds
|
// Show uptime as days, hours, minutes OR seconds
|
||||||
std::string uptime = screen->drawTimeDelta(days, hours, minutes, seconds);
|
std::string uptime = screen->drawTimeDelta(days, hours, minutes, seconds);
|
||||||
|
@ -311,7 +311,11 @@ class LGFX : public lgfx::LGFX_Device
|
|||||||
cfg.dummy_read_pixel = 8; // Number of bits for dummy read before pixel readout
|
cfg.dummy_read_pixel = 8; // Number of bits for dummy read before pixel readout
|
||||||
cfg.dummy_read_bits = 1; // Number of bits for dummy read before non-pixel data read
|
cfg.dummy_read_bits = 1; // Number of bits for dummy read before non-pixel data read
|
||||||
cfg.readable = true; // Set to true if data can be read
|
cfg.readable = true; // Set to true if data can be read
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
cfg.invert = true; // Set to true if the light/darkness of the panel is reversed
|
||||||
|
#else
|
||||||
cfg.invert = false; // Set to true if the light/darkness of the panel is reversed
|
cfg.invert = false; // Set to true if the light/darkness of the panel is reversed
|
||||||
|
#endif
|
||||||
cfg.rgb_order = false; // Set to true if the panel's red and blue are swapped
|
cfg.rgb_order = false; // Set to true if the panel's red and blue are swapped
|
||||||
cfg.dlen_16bit =
|
cfg.dlen_16bit =
|
||||||
false; // Set to true for panels that transmit data length in 16-bit units with 16-bit parallel or SPI
|
false; // Set to true for panels that transmit data length in 16-bit units with 16-bit parallel or SPI
|
||||||
@ -586,7 +590,7 @@ void TFTDisplay::sendCommand(uint8_t com)
|
|||||||
#elif defined(ST7735_BL_V05)
|
#elif defined(ST7735_BL_V05)
|
||||||
pinMode(ST7735_BL_V05, OUTPUT);
|
pinMode(ST7735_BL_V05, OUTPUT);
|
||||||
digitalWrite(ST7735_BL_V05, TFT_BACKLIGHT_ON);
|
digitalWrite(ST7735_BL_V05, TFT_BACKLIGHT_ON);
|
||||||
#elif !defined(RAK14014) && !defined(M5STACK) && !defined(UNPHONE)
|
#elif !defined(RAK14014) && !defined(M5STACK) && !defined(UNPHONE) && !defined(M5STACK_COREBASIC)
|
||||||
tft->wakeup();
|
tft->wakeup();
|
||||||
tft->powerSaveOff();
|
tft->powerSaveOff();
|
||||||
#elif defined(TFT_BL) && defined(TFT_BACKLIGHT_ON)
|
#elif defined(TFT_BL) && defined(TFT_BACKLIGHT_ON)
|
||||||
@ -604,7 +608,7 @@ void TFTDisplay::sendCommand(uint8_t com)
|
|||||||
unphone.backlight(true); // using unPhone library
|
unphone.backlight(true); // using unPhone library
|
||||||
#endif
|
#endif
|
||||||
#ifdef RAK14014
|
#ifdef RAK14014
|
||||||
#elif !defined(M5STACK) && !defined(ST7789_CS) // T-Deck gets brightness set in Screen.cpp in the handleSetOn function
|
#elif !defined(M5STACK) && !defined(ST7789_CS) && !defined(M5STACK_COREBASIC)// T-Deck gets brightness set in Screen.cpp in the handleSetOn function
|
||||||
tft->setBrightness(172);
|
tft->setBrightness(172);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@ -619,7 +623,7 @@ void TFTDisplay::sendCommand(uint8_t com)
|
|||||||
#elif defined(ST7735_BL_V05)
|
#elif defined(ST7735_BL_V05)
|
||||||
pinMode(ST7735_BL_V05, OUTPUT);
|
pinMode(ST7735_BL_V05, OUTPUT);
|
||||||
digitalWrite(ST7735_BL_V05, !TFT_BACKLIGHT_ON);
|
digitalWrite(ST7735_BL_V05, !TFT_BACKLIGHT_ON);
|
||||||
#elif !defined(RAK14014) && !defined(M5STACK) && !defined(UNPHONE)
|
#elif !defined(RAK14014) && !defined(M5STACK) && !defined(UNPHONE) && !defined(M5STACK_COREBASIC)
|
||||||
tft->sleep();
|
tft->sleep();
|
||||||
tft->powerSaveOn();
|
tft->powerSaveOn();
|
||||||
#elif defined(TFT_BL) && defined(TFT_BACKLIGHT_ON)
|
#elif defined(TFT_BL) && defined(TFT_BACKLIGHT_ON)
|
||||||
@ -636,7 +640,7 @@ void TFTDisplay::sendCommand(uint8_t com)
|
|||||||
unphone.backlight(false); // using unPhone library
|
unphone.backlight(false); // using unPhone library
|
||||||
#endif
|
#endif
|
||||||
#ifdef RAK14014
|
#ifdef RAK14014
|
||||||
#elif !defined(M5STACK)
|
#elif !defined(M5STACK) || !defined(M5STACK_COREBASIC)
|
||||||
tft->setBrightness(0);
|
tft->setBrightness(0);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@ -670,7 +674,7 @@ bool TFTDisplay::hasTouch(void)
|
|||||||
{
|
{
|
||||||
#ifdef RAK14014
|
#ifdef RAK14014
|
||||||
return true;
|
return true;
|
||||||
#elif !defined(M5STACK)
|
#elif !defined(M5STACK) || !defined(M5STACK_COREBASIC)
|
||||||
return tft->touch() != nullptr;
|
return tft->touch() != nullptr;
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
@ -689,7 +693,7 @@ bool TFTDisplay::getTouch(int16_t *x, int16_t *y)
|
|||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#elif !defined(M5STACK)
|
#elif !defined(M5STACK) || !defined(M5STACK_COREBASIC)
|
||||||
return tft->getTouch(x, y);
|
return tft->getTouch(x, y);
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
@ -733,7 +737,7 @@ bool TFTDisplay::connect()
|
|||||||
|
|
||||||
tft->init();
|
tft->init();
|
||||||
|
|
||||||
#if defined(M5STACK)
|
#if defined(M5STACK) || defined(M5STACK_COREBASIC)
|
||||||
tft->setRotation(0);
|
tft->setRotation(0);
|
||||||
#elif defined(RAK14014)
|
#elif defined(RAK14014)
|
||||||
tft->setRotation(1);
|
tft->setRotation(1);
|
||||||
|
13
src/main.cpp
13
src/main.cpp
@ -111,7 +111,9 @@ AccelerometerThread *accelerometerThread = nullptr;
|
|||||||
#include "AudioThread.h"
|
#include "AudioThread.h"
|
||||||
AudioThread *audioThread = nullptr;
|
AudioThread *audioThread = nullptr;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
#include <M5Unified.h>
|
||||||
|
#endif
|
||||||
using namespace concurrency;
|
using namespace concurrency;
|
||||||
|
|
||||||
// We always create a screen object, but we only init it if we find the hardware
|
// We always create a screen object, but we only init it if we find the hardware
|
||||||
@ -757,7 +759,14 @@ void setup()
|
|||||||
if (!pmu_found)
|
if (!pmu_found)
|
||||||
RECORD_CRITICALERROR(meshtastic_CriticalErrorCode_NO_AXP192); // Record a hardware fault for missing hardware
|
RECORD_CRITICALERROR(meshtastic_CriticalErrorCode_NO_AXP192); // Record a hardware fault for missing hardware
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
M5.begin();
|
||||||
|
M5.Speaker.tone(2000, 600);
|
||||||
|
M5.Display.init();
|
||||||
|
M5.Display.clearDisplay();
|
||||||
|
M5.Display.display();
|
||||||
|
M5.Display.fillScreen(TFT_BLACK);
|
||||||
|
#endif
|
||||||
#if !MESHTASTIC_EXCLUDE_I2C
|
#if !MESHTASTIC_EXCLUDE_I2C
|
||||||
// Don't call screen setup until after nodedb is setup (because we need
|
// Don't call screen setup until after nodedb is setup (because we need
|
||||||
// the current region name)
|
// the current region name)
|
||||||
|
12
src/main.h
12
src/main.h
@ -42,7 +42,17 @@ extern bool isUSBPowered;
|
|||||||
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
|
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
|
||||||
extern ATECCX08A atecc;
|
extern ATECCX08A atecc;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
struct DataInfo {
|
||||||
|
int lora_channel_num;
|
||||||
|
double lora_freq;
|
||||||
|
const char* lora_channel_name;
|
||||||
|
int lora_power_output;
|
||||||
|
float lora_bw;
|
||||||
|
int lora_sf;
|
||||||
|
int lora_cr;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
#ifdef T_WATCH_S3
|
#ifdef T_WATCH_S3
|
||||||
#include <Adafruit_DRV2605.h>
|
#include <Adafruit_DRV2605.h>
|
||||||
extern Adafruit_DRV2605 drv;
|
extern Adafruit_DRV2605 drv;
|
||||||
|
@ -11,7 +11,9 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <pb_decode.h>
|
#include <pb_decode.h>
|
||||||
#include <pb_encode.h>
|
#include <pb_encode.h>
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
DataInfo DataRegion;
|
||||||
|
#endif
|
||||||
#define RDEF(name, freq_start, freq_end, duty_cycle, spacing, power_limit, audio_permitted, frequency_switching, wide_lora) \
|
#define RDEF(name, freq_start, freq_end, duty_cycle, spacing, power_limit, audio_permitted, frequency_switching, wide_lora) \
|
||||||
{ \
|
{ \
|
||||||
meshtastic_Config_LoRaConfig_RegionCode_##name, freq_start, freq_end, duty_cycle, spacing, power_limit, audio_permitted, \
|
meshtastic_Config_LoRaConfig_RegionCode_##name, freq_start, freq_end, duty_cycle, spacing, power_limit, audio_permitted, \
|
||||||
@ -199,7 +201,10 @@ uint32_t RadioInterface::getPacketTime(uint32_t pl)
|
|||||||
float tPacket = tPreamble + tPayload;
|
float tPacket = tPreamble + tPayload;
|
||||||
|
|
||||||
uint32_t msecs = tPacket * 1000;
|
uint32_t msecs = tPacket * 1000;
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
DataRegion.lora_sf=sf;
|
||||||
|
DataRegion.lora_cr=cr;
|
||||||
|
#endif
|
||||||
LOG_DEBUG("(bw=%d, sf=%d, cr=4/%d) packet symLen=%d ms, payloadSize=%u, time %d ms\n", (int)bw, sf, cr, (int)(tSym * 1000),
|
LOG_DEBUG("(bw=%d, sf=%d, cr=4/%d) packet symLen=%d ms, payloadSize=%u, time %d ms\n", (int)bw, sf, cr, (int)(tSym * 1000),
|
||||||
pl, msecs);
|
pl, msecs);
|
||||||
return msecs;
|
return msecs;
|
||||||
@ -514,7 +519,13 @@ void RadioInterface::applyModemConfig()
|
|||||||
|
|
||||||
preambleTimeMsec = getPacketTime((uint32_t)0);
|
preambleTimeMsec = getPacketTime((uint32_t)0);
|
||||||
maxPacketTimeMsec = getPacketTime(meshtastic_Constants_DATA_PAYLOAD_LEN + sizeof(PacketHeader));
|
maxPacketTimeMsec = getPacketTime(meshtastic_Constants_DATA_PAYLOAD_LEN + sizeof(PacketHeader));
|
||||||
|
#if defined(M5STACK_COREBASIC)
|
||||||
|
DataRegion.lora_channel_num=channel_num;
|
||||||
|
DataRegion.lora_freq=getFreq();
|
||||||
|
DataRegion.lora_channel_name=channelName;
|
||||||
|
DataRegion.lora_power_output=power;
|
||||||
|
DataRegion.lora_bw=bw;
|
||||||
|
#endif
|
||||||
LOG_INFO("Radio freq=%.3f, config.lora.frequency_offset=%.3f\n", freq, loraConfig.frequency_offset);
|
LOG_INFO("Radio freq=%.3f, config.lora.frequency_offset=%.3f\n", freq, loraConfig.frequency_offset);
|
||||||
LOG_INFO("Set radio: region=%s, name=%s, config=%u, ch=%d, power=%d\n", myRegion->name, channelName, loraConfig.modem_preset,
|
LOG_INFO("Set radio: region=%s, name=%s, config=%u, ch=%d, power=%d\n", myRegion->name, channelName, loraConfig.modem_preset,
|
||||||
channel_num, power);
|
channel_num, power);
|
||||||
|
@ -187,6 +187,8 @@ typedef enum _meshtastic_HardwareModel {
|
|||||||
/* RadioMaster 900 Bandit, https://www.radiomasterrc.com/products/bandit-expresslrs-rf-module
|
/* RadioMaster 900 Bandit, https://www.radiomasterrc.com/products/bandit-expresslrs-rf-module
|
||||||
SSD1306 OLED and No GPS */
|
SSD1306 OLED and No GPS */
|
||||||
meshtastic_HardwareModel_RADIOMASTER_900_BANDIT = 74,
|
meshtastic_HardwareModel_RADIOMASTER_900_BANDIT = 74,
|
||||||
|
/* M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, Paper) https://m5stack.com/ */
|
||||||
|
meshtastic_HardwareModel_M5STACK_COREBASIC=75,
|
||||||
/* ------------------------------------------------------------------------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits.
|
Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits.
|
||||||
------------------------------------------------------------------------------------------------------------------------------------------ */
|
------------------------------------------------------------------------------------------------------------------------------------------ */
|
||||||
|
@ -159,6 +159,8 @@
|
|||||||
#define HW_VENDOR meshtastic_HardwareModel_HELTEC_VISION_MASTER_E290
|
#define HW_VENDOR meshtastic_HardwareModel_HELTEC_VISION_MASTER_E290
|
||||||
#elif defined(HELTEC_MESH_NODE_T114)
|
#elif defined(HELTEC_MESH_NODE_T114)
|
||||||
#define HW_VENDOR meshtastic_HardwareModel_HELTEC_MESH_NODE_T114
|
#define HW_VENDOR meshtastic_HardwareModel_HELTEC_MESH_NODE_T114
|
||||||
|
#elif defined(M5STACK_COREBASIC)
|
||||||
|
#define HW_VENDOR meshtastic_HardwareModel_M5STACK_COREBASIC
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
13
variants/m5stack_corebasic/pins_arduino.h
Normal file
13
variants/m5stack_corebasic/pins_arduino.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef Pins_Arduino_h
|
||||||
|
#define Pins_Arduino_h
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
static const uint8_t SDA = 21;
|
||||||
|
static const uint8_t SCL = 22;
|
||||||
|
|
||||||
|
static const uint8_t SS = 5;
|
||||||
|
static const uint8_t MOSI = 23;
|
||||||
|
static const uint8_t MISO = 19;
|
||||||
|
static const uint8_t SCK = 18;
|
||||||
|
#endif /* Pins_Arduino_h */
|
25
variants/m5stack_corebasic/platformio.ini
Normal file
25
variants/m5stack_corebasic/platformio.ini
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
[env:m5stack-corebasic]
|
||||||
|
extends = esp32_base
|
||||||
|
board = m5stack-core-esp32
|
||||||
|
monitor_filters = esp32_exception_decoder
|
||||||
|
build_src_filter =
|
||||||
|
${esp32_base.build_src_filter}
|
||||||
|
build_flags =
|
||||||
|
${esp32_base.build_flags} -I variants/m5stack_corebasic
|
||||||
|
|
||||||
|
-DILI9341_DRIVER
|
||||||
|
-DM5STACK_COREBASIC
|
||||||
|
-DTFT_DRIVER=0x9341
|
||||||
|
-DTFT_MISO=19
|
||||||
|
-DTFT_MOSI=23
|
||||||
|
-DTFT_SCLK=18
|
||||||
|
-DTFT_CS=14
|
||||||
|
-DTFT_DC=27
|
||||||
|
-DTFT_RST=33
|
||||||
|
-DTFT_BL=32
|
||||||
|
-DSPI_FREQUENCY=40000000
|
||||||
|
-DSPI_READ_FREQUENCY=16000000
|
||||||
|
lib_deps =
|
||||||
|
${esp32_base.lib_deps}
|
||||||
|
lovyan03/LovyanGFX@^1.1.8
|
||||||
|
m5stack/M5Unified@^0.1.14
|
50
variants/m5stack_corebasic/variant.h
Normal file
50
variants/m5stack_corebasic/variant.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
// #define BUTTON_NEED_PULLUP // if set we need to turn on the internal CPU pullup during sleep
|
||||||
|
|
||||||
|
#define I2C_SDA 21
|
||||||
|
#define I2C_SCL 22
|
||||||
|
|
||||||
|
#define BUTTON_NEED_PULLUP
|
||||||
|
// #define EXT_NOTIFY_OUT 13 // Default pin to use for Ext Notify Plugin.
|
||||||
|
// Select Use the middle button, you can also use 39, 37
|
||||||
|
#define BUTTON_PIN 38
|
||||||
|
|
||||||
|
#define PIN_BUZZER 25
|
||||||
|
// The Module used here is module-LORa433_V1.1. You can also use module-LORa868_V1.1
|
||||||
|
// https://docs.m5stack.com/en/module/Module-LoRa433_V1.1
|
||||||
|
// https://docs.m5stack.com/en/module/Module-LoRa868_V1.1
|
||||||
|
#undef LORA_SCK
|
||||||
|
#undef LORA_MISO
|
||||||
|
#undef LORA_MOSI
|
||||||
|
#undef LORA_CS
|
||||||
|
|
||||||
|
#define LORA_SCK 18
|
||||||
|
#define LORA_MISO 19
|
||||||
|
#define LORA_MOSI 23
|
||||||
|
#define LORA_CS 5 //NSS
|
||||||
|
|
||||||
|
#define USE_RF95
|
||||||
|
#define LORA_DIO0 35 // IRQ
|
||||||
|
#define LORA_RESET 13 // RST
|
||||||
|
#define LORA_DIO1 RADIOLIB_NC // Not really used
|
||||||
|
#define LORA_DIO2 RADIOLIB_NC // Not really used
|
||||||
|
|
||||||
|
// The gnss module is used here https://docs.m5stack.com/en/module/GNSS%20Module
|
||||||
|
#undef GPS_RX_PIN
|
||||||
|
#undef GPS_TX_PIN
|
||||||
|
#define GPS_RX_PIN 16
|
||||||
|
#define GPS_TX_PIN 17
|
||||||
|
|
||||||
|
|
||||||
|
//Note: If you use corebasic version 2.7 or later,
|
||||||
|
//you need to go to the src>graphics>TFTDisplay.cpp file to change the value of cfg.invert,
|
||||||
|
//this one is to set the color inversion
|
||||||
|
#define TFT_HEIGHT 240
|
||||||
|
#define TFT_WIDTH 320
|
||||||
|
#define TFT_OFFSET_X 0
|
||||||
|
#define TFT_OFFSET_Y 0
|
||||||
|
#define TFT_BUSY -1
|
||||||
|
|
||||||
|
// LCD screens are slow, so slowdown the wipe so it looks better
|
||||||
|
#define SCREEN_TRANSITION_FRAMERATE 1 // fps
|
||||||
|
|
||||||
|
#define ILI9341_SPI_HOST VSPI_HOST // VSPI_HOST or HSPI_HOST
|
Loading…
Reference in New Issue
Block a user