mirror of
https://github.com/meshtastic/firmware.git
synced 2026-01-30 05:32:08 +00:00
Compare commits
1 Commits
agc-reset
...
test/ai-sl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
069e8f6265 |
@@ -1,59 +1,8 @@
|
|||||||
#include "InputBroker.h"
|
#include "InputBroker.h"
|
||||||
#include "PowerFSM.h" // needed for event trigger
|
#include "PowerFSM.h" // needed for event trigger
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "graphics/Screen.h"
|
|
||||||
#include "modules/ExternalNotificationModule.h"
|
#include "modules/ExternalNotificationModule.h"
|
||||||
|
|
||||||
#if ARCH_PORTDUINO
|
|
||||||
#include "input/LinuxInputImpl.h"
|
|
||||||
#include "input/SeesawRotary.h"
|
|
||||||
#include "platform/portduino/PortduinoGlue.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !MESHTASTIC_EXCLUDE_INPUTBROKER
|
|
||||||
#include "input/ExpressLRSFiveWay.h"
|
|
||||||
#include "input/RotaryEncoderImpl.h"
|
|
||||||
#include "input/RotaryEncoderInterruptImpl1.h"
|
|
||||||
#include "input/SerialKeyboardImpl.h"
|
|
||||||
#include "input/UpDownInterruptImpl1.h"
|
|
||||||
#include "input/i2cButton.h"
|
|
||||||
#if HAS_TRACKBALL
|
|
||||||
#include "input/TrackballInterruptImpl1.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "modules/StatusLEDModule.h"
|
|
||||||
|
|
||||||
#if !MESHTASTIC_EXCLUDE_I2C
|
|
||||||
#include "input/cardKbI2cImpl.h"
|
|
||||||
#endif
|
|
||||||
#include "input/kbMatrixImpl.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAS_BUTTON || defined(ARCH_PORTDUINO)
|
|
||||||
#include "input/ButtonThread.h"
|
|
||||||
|
|
||||||
#if defined(BUTTON_PIN_TOUCH)
|
|
||||||
ButtonThread *TouchButtonThread = nullptr;
|
|
||||||
#if defined(TTGO_T_ECHO_PLUS) && defined(PIN_EINK_EN)
|
|
||||||
static bool touchBacklightWasOn = false;
|
|
||||||
static bool touchBacklightActive = false;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(BUTTON_PIN) || defined(ARCH_PORTDUINO)
|
|
||||||
ButtonThread *UserButtonThread = nullptr;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ALT_BUTTON_PIN)
|
|
||||||
ButtonThread *BackButtonThread = nullptr;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CANCEL_BUTTON_PIN)
|
|
||||||
ButtonThread *CancelButtonThread = nullptr;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
InputBroker *inputBroker = nullptr;
|
InputBroker *inputBroker = nullptr;
|
||||||
|
|
||||||
InputBroker::InputBroker()
|
InputBroker::InputBroker()
|
||||||
@@ -125,262 +74,3 @@ void InputBroker::pollSoonWorker(void *p)
|
|||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void InputBroker::Init()
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef BUTTON_PIN
|
|
||||||
#ifdef ARCH_ESP32
|
|
||||||
|
|
||||||
#if ESP_ARDUINO_VERSION_MAJOR >= 3
|
|
||||||
#ifdef BUTTON_NEED_PULLUP
|
|
||||||
pinMode(config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN, INPUT_PULLUP);
|
|
||||||
#else
|
|
||||||
pinMode(config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN, INPUT); // default to BUTTON_PIN
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
pinMode(config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN, INPUT); // default to BUTTON_PIN
|
|
||||||
#ifdef BUTTON_NEED_PULLUP
|
|
||||||
gpio_pullup_en((gpio_num_t)(config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN));
|
|
||||||
delay(10);
|
|
||||||
#endif
|
|
||||||
#ifdef BUTTON_NEED_PULLUP2
|
|
||||||
gpio_pullup_en((gpio_num_t)BUTTON_NEED_PULLUP2);
|
|
||||||
delay(10);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// buttons are now inputBroker, so have to come after setupModules
|
|
||||||
#if HAS_BUTTON
|
|
||||||
int pullup_sense = 0;
|
|
||||||
#ifdef INPUT_PULLUP_SENSE
|
|
||||||
// Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did
|
|
||||||
#ifdef BUTTON_SENSE_TYPE
|
|
||||||
pullup_sense = BUTTON_SENSE_TYPE;
|
|
||||||
#else
|
|
||||||
pullup_sense = INPUT_PULLUP_SENSE;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if defined(ARCH_PORTDUINO)
|
|
||||||
|
|
||||||
if (portduino_config.userButtonPin.enabled) {
|
|
||||||
|
|
||||||
LOG_DEBUG("Use GPIO%02d for button", portduino_config.userButtonPin.pin);
|
|
||||||
UserButtonThread = new ButtonThread("UserButton");
|
|
||||||
if (screen) {
|
|
||||||
ButtonConfig config;
|
|
||||||
config.pinNumber = (uint8_t)portduino_config.userButtonPin.pin;
|
|
||||||
config.activeLow = true;
|
|
||||||
config.activePullup = true;
|
|
||||||
config.pullupSense = INPUT_PULLUP;
|
|
||||||
config.intRoutine = []() {
|
|
||||||
UserButtonThread->userButton.tick();
|
|
||||||
UserButtonThread->setIntervalFromNow(0);
|
|
||||||
runASAP = true;
|
|
||||||
BaseType_t higherWake = 0;
|
|
||||||
concurrency::mainDelay.interruptFromISR(&higherWake);
|
|
||||||
};
|
|
||||||
config.singlePress = INPUT_BROKER_USER_PRESS;
|
|
||||||
config.longPress = INPUT_BROKER_SELECT;
|
|
||||||
UserButtonThread->initButton(config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BUTTON_PIN_TOUCH
|
|
||||||
TouchButtonThread = new ButtonThread("BackButton");
|
|
||||||
ButtonConfig touchConfig;
|
|
||||||
touchConfig.pinNumber = BUTTON_PIN_TOUCH;
|
|
||||||
touchConfig.activeLow = true;
|
|
||||||
touchConfig.activePullup = true;
|
|
||||||
touchConfig.pullupSense = pullup_sense;
|
|
||||||
touchConfig.intRoutine = []() {
|
|
||||||
TouchButtonThread->userButton.tick();
|
|
||||||
TouchButtonThread->setIntervalFromNow(0);
|
|
||||||
runASAP = true;
|
|
||||||
BaseType_t higherWake = 0;
|
|
||||||
concurrency::mainDelay.interruptFromISR(&higherWake);
|
|
||||||
};
|
|
||||||
touchConfig.singlePress = INPUT_BROKER_NONE;
|
|
||||||
touchConfig.longPress = INPUT_BROKER_BACK;
|
|
||||||
#if defined(TTGO_T_ECHO_PLUS) && defined(PIN_EINK_EN)
|
|
||||||
// On T-Echo Plus the touch pad should only drive the backlight, not UI navigation/sounds
|
|
||||||
touchConfig.longPress = INPUT_BROKER_NONE;
|
|
||||||
touchConfig.suppressLeadUpSound = true;
|
|
||||||
touchConfig.onPress = []() {
|
|
||||||
touchBacklightWasOn = uiconfig.screen_brightness == 1;
|
|
||||||
if (!touchBacklightWasOn) {
|
|
||||||
digitalWrite(PIN_EINK_EN, HIGH);
|
|
||||||
}
|
|
||||||
touchBacklightActive = true;
|
|
||||||
};
|
|
||||||
touchConfig.onRelease = []() {
|
|
||||||
if (touchBacklightActive && !touchBacklightWasOn) {
|
|
||||||
digitalWrite(PIN_EINK_EN, LOW);
|
|
||||||
}
|
|
||||||
touchBacklightActive = false;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
TouchButtonThread->initButton(touchConfig);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CANCEL_BUTTON_PIN)
|
|
||||||
// Buttons. Moved here cause we need NodeDB to be initialized
|
|
||||||
CancelButtonThread = new ButtonThread("CancelButton");
|
|
||||||
ButtonConfig cancelConfig;
|
|
||||||
cancelConfig.pinNumber = CANCEL_BUTTON_PIN;
|
|
||||||
cancelConfig.activeLow = CANCEL_BUTTON_ACTIVE_LOW;
|
|
||||||
cancelConfig.activePullup = CANCEL_BUTTON_ACTIVE_PULLUP;
|
|
||||||
cancelConfig.pullupSense = pullup_sense;
|
|
||||||
cancelConfig.intRoutine = []() {
|
|
||||||
CancelButtonThread->userButton.tick();
|
|
||||||
CancelButtonThread->setIntervalFromNow(0);
|
|
||||||
runASAP = true;
|
|
||||||
BaseType_t higherWake = 0;
|
|
||||||
concurrency::mainDelay.interruptFromISR(&higherWake);
|
|
||||||
};
|
|
||||||
cancelConfig.singlePress = INPUT_BROKER_CANCEL;
|
|
||||||
cancelConfig.longPress = INPUT_BROKER_SHUTDOWN;
|
|
||||||
cancelConfig.longPressTime = 4000;
|
|
||||||
CancelButtonThread->initButton(cancelConfig);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ALT_BUTTON_PIN)
|
|
||||||
// Buttons. Moved here cause we need NodeDB to be initialized
|
|
||||||
BackButtonThread = new ButtonThread("BackButton");
|
|
||||||
ButtonConfig backConfig;
|
|
||||||
backConfig.pinNumber = ALT_BUTTON_PIN;
|
|
||||||
backConfig.activeLow = ALT_BUTTON_ACTIVE_LOW;
|
|
||||||
backConfig.activePullup = ALT_BUTTON_ACTIVE_PULLUP;
|
|
||||||
backConfig.pullupSense = pullup_sense;
|
|
||||||
backConfig.intRoutine = []() {
|
|
||||||
BackButtonThread->userButton.tick();
|
|
||||||
BackButtonThread->setIntervalFromNow(0);
|
|
||||||
runASAP = true;
|
|
||||||
BaseType_t higherWake = 0;
|
|
||||||
concurrency::mainDelay.interruptFromISR(&higherWake);
|
|
||||||
};
|
|
||||||
backConfig.singlePress = INPUT_BROKER_ALT_PRESS;
|
|
||||||
backConfig.longPress = INPUT_BROKER_ALT_LONG;
|
|
||||||
backConfig.longPressTime = 500;
|
|
||||||
BackButtonThread->initButton(backConfig);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(BUTTON_PIN)
|
|
||||||
#if defined(USERPREFS_BUTTON_PIN)
|
|
||||||
int _pinNum = config.device.button_gpio ? config.device.button_gpio : USERPREFS_BUTTON_PIN;
|
|
||||||
#else
|
|
||||||
int _pinNum = config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN;
|
|
||||||
#endif
|
|
||||||
#ifndef BUTTON_ACTIVE_LOW
|
|
||||||
#define BUTTON_ACTIVE_LOW true
|
|
||||||
#endif
|
|
||||||
#ifndef BUTTON_ACTIVE_PULLUP
|
|
||||||
#define BUTTON_ACTIVE_PULLUP true
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Buttons. Moved here cause we need NodeDB to be initialized
|
|
||||||
// If your variant.h has a BUTTON_PIN defined, go ahead and define BUTTON_ACTIVE_LOW and BUTTON_ACTIVE_PULLUP
|
|
||||||
UserButtonThread = new ButtonThread("UserButton");
|
|
||||||
if (screen) {
|
|
||||||
ButtonConfig userConfig;
|
|
||||||
userConfig.pinNumber = (uint8_t)_pinNum;
|
|
||||||
userConfig.activeLow = BUTTON_ACTIVE_LOW;
|
|
||||||
userConfig.activePullup = BUTTON_ACTIVE_PULLUP;
|
|
||||||
userConfig.pullupSense = pullup_sense;
|
|
||||||
userConfig.intRoutine = []() {
|
|
||||||
UserButtonThread->userButton.tick();
|
|
||||||
UserButtonThread->setIntervalFromNow(0);
|
|
||||||
runASAP = true;
|
|
||||||
BaseType_t higherWake = 0;
|
|
||||||
concurrency::mainDelay.interruptFromISR(&higherWake);
|
|
||||||
};
|
|
||||||
userConfig.singlePress = INPUT_BROKER_USER_PRESS;
|
|
||||||
userConfig.longPress = INPUT_BROKER_SELECT;
|
|
||||||
userConfig.longPressTime = 500;
|
|
||||||
userConfig.longLongPress = INPUT_BROKER_SHUTDOWN;
|
|
||||||
UserButtonThread->initButton(userConfig);
|
|
||||||
} else {
|
|
||||||
ButtonConfig userConfigNoScreen;
|
|
||||||
userConfigNoScreen.pinNumber = (uint8_t)_pinNum;
|
|
||||||
userConfigNoScreen.activeLow = BUTTON_ACTIVE_LOW;
|
|
||||||
userConfigNoScreen.activePullup = BUTTON_ACTIVE_PULLUP;
|
|
||||||
userConfigNoScreen.pullupSense = pullup_sense;
|
|
||||||
userConfigNoScreen.intRoutine = []() {
|
|
||||||
UserButtonThread->userButton.tick();
|
|
||||||
UserButtonThread->setIntervalFromNow(0);
|
|
||||||
runASAP = true;
|
|
||||||
BaseType_t higherWake = 0;
|
|
||||||
concurrency::mainDelay.interruptFromISR(&higherWake);
|
|
||||||
};
|
|
||||||
userConfigNoScreen.singlePress = INPUT_BROKER_USER_PRESS;
|
|
||||||
userConfigNoScreen.longPress = INPUT_BROKER_NONE;
|
|
||||||
userConfigNoScreen.longPressTime = 500;
|
|
||||||
userConfigNoScreen.longLongPress = INPUT_BROKER_SHUTDOWN;
|
|
||||||
userConfigNoScreen.doublePress = INPUT_BROKER_SEND_PING;
|
|
||||||
userConfigNoScreen.triplePress = INPUT_BROKER_GPS_TOGGLE;
|
|
||||||
UserButtonThread->initButton(userConfigNoScreen);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (HAS_BUTTON || ARCH_PORTDUINO) && !MESHTASTIC_EXCLUDE_INPUTBROKER
|
|
||||||
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) {
|
|
||||||
#if defined(T_LORA_PAGER)
|
|
||||||
// use a special FSM based rotary encoder version for T-LoRa Pager
|
|
||||||
rotaryEncoderImpl = new RotaryEncoderImpl();
|
|
||||||
if (!rotaryEncoderImpl->init()) {
|
|
||||||
delete rotaryEncoderImpl;
|
|
||||||
rotaryEncoderImpl = nullptr;
|
|
||||||
}
|
|
||||||
#elif defined(INPUTDRIVER_ENCODER_TYPE) && (INPUTDRIVER_ENCODER_TYPE == 2)
|
|
||||||
upDownInterruptImpl1 = new UpDownInterruptImpl1();
|
|
||||||
if (!upDownInterruptImpl1->init()) {
|
|
||||||
delete upDownInterruptImpl1;
|
|
||||||
upDownInterruptImpl1 = nullptr;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
rotaryEncoderInterruptImpl1 = new RotaryEncoderInterruptImpl1();
|
|
||||||
if (!rotaryEncoderInterruptImpl1->init()) {
|
|
||||||
delete rotaryEncoderInterruptImpl1;
|
|
||||||
rotaryEncoderInterruptImpl1 = nullptr;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
cardKbI2cImpl = new CardKbI2cImpl();
|
|
||||||
cardKbI2cImpl->init();
|
|
||||||
#if defined(M5STACK_UNITC6L)
|
|
||||||
i2cButton = new i2cButtonThread("i2cButtonThread");
|
|
||||||
#endif
|
|
||||||
#ifdef INPUTBROKER_MATRIX_TYPE
|
|
||||||
kbMatrixImpl = new KbMatrixImpl();
|
|
||||||
kbMatrixImpl->init();
|
|
||||||
#endif // INPUTBROKER_MATRIX_TYPE
|
|
||||||
#ifdef INPUTBROKER_SERIAL_TYPE
|
|
||||||
aSerialKeyboardImpl = new SerialKeyboardImpl();
|
|
||||||
aSerialKeyboardImpl->init();
|
|
||||||
#endif // INPUTBROKER_MATRIX_TYPE
|
|
||||||
}
|
|
||||||
#endif // HAS_BUTTON
|
|
||||||
#if ARCH_PORTDUINO
|
|
||||||
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR && portduino_config.i2cdev != "") {
|
|
||||||
seesawRotary = new SeesawRotary("SeesawRotary");
|
|
||||||
if (!seesawRotary->init()) {
|
|
||||||
delete seesawRotary;
|
|
||||||
seesawRotary = nullptr;
|
|
||||||
}
|
|
||||||
aLinuxInputImpl = new LinuxInputImpl();
|
|
||||||
aLinuxInputImpl->init();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if !MESHTASTIC_EXCLUDE_INPUTBROKER && HAS_TRACKBALL
|
|
||||||
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) {
|
|
||||||
trackballInterruptImpl1 = new TrackballInterruptImpl1();
|
|
||||||
trackballInterruptImpl1->init(TB_DOWN, TB_UP, TB_LEFT, TB_RIGHT, TB_PRESS);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef INPUTBROKER_EXPRESSLRSFIVEWAY_TYPE
|
|
||||||
expressLRSFiveWayInput = new ExpressLRSFiveWay();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Observer.h"
|
#include "Observer.h"
|
||||||
#include "concurrency/OSThread.h"
|
|
||||||
#include "freertosinc.h"
|
#include "freertosinc.h"
|
||||||
|
|
||||||
#ifdef InputBrokerDebug
|
#ifdef InputBrokerDebug
|
||||||
@@ -77,7 +76,6 @@ class InputBroker : public Observable<const InputEvent *>
|
|||||||
void queueInputEvent(const InputEvent *event);
|
void queueInputEvent(const InputEvent *event);
|
||||||
void processInputEventQueue();
|
void processInputEventQueue();
|
||||||
#endif
|
#endif
|
||||||
void Init();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int handleInputEvent(const InputEvent *event);
|
int handleInputEvent(const InputEvent *event);
|
||||||
@@ -91,5 +89,4 @@ class InputBroker : public Observable<const InputEvent *>
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
extern InputBroker *inputBroker;
|
extern InputBroker *inputBroker;
|
||||||
extern bool runASAP;
|
|
||||||
235
src/main.cpp
235
src/main.cpp
@@ -120,6 +120,31 @@ void printPartitionTable()
|
|||||||
#endif // DEBUG_PARTITION_TABLE
|
#endif // DEBUG_PARTITION_TABLE
|
||||||
#endif // ARCH_ESP32
|
#endif // ARCH_ESP32
|
||||||
|
|
||||||
|
#if HAS_BUTTON || defined(ARCH_PORTDUINO)
|
||||||
|
#include "input/ButtonThread.h"
|
||||||
|
|
||||||
|
#if defined(BUTTON_PIN_TOUCH)
|
||||||
|
ButtonThread *TouchButtonThread = nullptr;
|
||||||
|
#if defined(TTGO_T_ECHO_PLUS) && defined(PIN_EINK_EN)
|
||||||
|
static bool touchBacklightWasOn = false;
|
||||||
|
static bool touchBacklightActive = false;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(BUTTON_PIN) || defined(ARCH_PORTDUINO)
|
||||||
|
ButtonThread *UserButtonThread = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ALT_BUTTON_PIN)
|
||||||
|
ButtonThread *BackButtonThread = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CANCEL_BUTTON_PIN)
|
||||||
|
ButtonThread *CancelButtonThread = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "AmbientLightingThread.h"
|
#include "AmbientLightingThread.h"
|
||||||
#include "PowerFSMThread.h"
|
#include "PowerFSMThread.h"
|
||||||
|
|
||||||
@@ -193,8 +218,6 @@ bool kb_found = false;
|
|||||||
// global bool to record that on-screen keyboard (OSK) is present
|
// global bool to record that on-screen keyboard (OSK) is present
|
||||||
bool osk_found = false;
|
bool osk_found = false;
|
||||||
|
|
||||||
unsigned long last_listen = 0;
|
|
||||||
|
|
||||||
// The I2C address of the RTC Module (if found)
|
// The I2C address of the RTC Module (if found)
|
||||||
ScanI2C::DeviceAddress rtc_found = ScanI2C::ADDRESS_NONE;
|
ScanI2C::DeviceAddress rtc_found = ScanI2C::ADDRESS_NONE;
|
||||||
// The I2C address of the Accelerometer (if found)
|
// The I2C address of the Accelerometer (if found)
|
||||||
@@ -486,6 +509,30 @@ void setup()
|
|||||||
LOG_INFO("Wait for peripherals to stabilize");
|
LOG_INFO("Wait for peripherals to stabilize");
|
||||||
delay(PERIPHERAL_WARMUP_MS);
|
delay(PERIPHERAL_WARMUP_MS);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef BUTTON_PIN
|
||||||
|
#ifdef ARCH_ESP32
|
||||||
|
|
||||||
|
#if ESP_ARDUINO_VERSION_MAJOR >= 3
|
||||||
|
#ifdef BUTTON_NEED_PULLUP
|
||||||
|
pinMode(config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN, INPUT_PULLUP);
|
||||||
|
#else
|
||||||
|
pinMode(config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN, INPUT); // default to BUTTON_PIN
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
pinMode(config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN, INPUT); // default to BUTTON_PIN
|
||||||
|
#ifdef BUTTON_NEED_PULLUP
|
||||||
|
gpio_pullup_en((gpio_num_t)(config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN));
|
||||||
|
delay(10);
|
||||||
|
#endif
|
||||||
|
#ifdef BUTTON_NEED_PULLUP2
|
||||||
|
gpio_pullup_en((gpio_num_t)BUTTON_NEED_PULLUP2);
|
||||||
|
delay(10);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
initSPI();
|
initSPI();
|
||||||
|
|
||||||
OSThread::setup();
|
OSThread::setup();
|
||||||
@@ -952,9 +999,180 @@ void setup()
|
|||||||
nodeDB->hasWarned = true;
|
nodeDB->hasWarned = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if !MESHTASTIC_EXCLUDE_INPUTBROKER
|
|
||||||
if (inputBroker)
|
// buttons are now inputBroker, so have to come after setupModules
|
||||||
inputBroker->Init();
|
#if HAS_BUTTON
|
||||||
|
int pullup_sense = 0;
|
||||||
|
#ifdef INPUT_PULLUP_SENSE
|
||||||
|
// Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did
|
||||||
|
#ifdef BUTTON_SENSE_TYPE
|
||||||
|
pullup_sense = BUTTON_SENSE_TYPE;
|
||||||
|
#else
|
||||||
|
pullup_sense = INPUT_PULLUP_SENSE;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if defined(ARCH_PORTDUINO)
|
||||||
|
|
||||||
|
if (portduino_config.userButtonPin.enabled) {
|
||||||
|
|
||||||
|
LOG_DEBUG("Use GPIO%02d for button", portduino_config.userButtonPin.pin);
|
||||||
|
UserButtonThread = new ButtonThread("UserButton");
|
||||||
|
if (screen) {
|
||||||
|
ButtonConfig config;
|
||||||
|
config.pinNumber = (uint8_t)portduino_config.userButtonPin.pin;
|
||||||
|
config.activeLow = true;
|
||||||
|
config.activePullup = true;
|
||||||
|
config.pullupSense = INPUT_PULLUP;
|
||||||
|
config.intRoutine = []() {
|
||||||
|
UserButtonThread->userButton.tick();
|
||||||
|
UserButtonThread->setIntervalFromNow(0);
|
||||||
|
runASAP = true;
|
||||||
|
BaseType_t higherWake = 0;
|
||||||
|
mainDelay.interruptFromISR(&higherWake);
|
||||||
|
};
|
||||||
|
config.singlePress = INPUT_BROKER_USER_PRESS;
|
||||||
|
config.longPress = INPUT_BROKER_SELECT;
|
||||||
|
UserButtonThread->initButton(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BUTTON_PIN_TOUCH
|
||||||
|
TouchButtonThread = new ButtonThread("BackButton");
|
||||||
|
ButtonConfig touchConfig;
|
||||||
|
touchConfig.pinNumber = BUTTON_PIN_TOUCH;
|
||||||
|
touchConfig.activeLow = true;
|
||||||
|
touchConfig.activePullup = true;
|
||||||
|
touchConfig.pullupSense = pullup_sense;
|
||||||
|
touchConfig.intRoutine = []() {
|
||||||
|
TouchButtonThread->userButton.tick();
|
||||||
|
TouchButtonThread->setIntervalFromNow(0);
|
||||||
|
runASAP = true;
|
||||||
|
BaseType_t higherWake = 0;
|
||||||
|
mainDelay.interruptFromISR(&higherWake);
|
||||||
|
};
|
||||||
|
touchConfig.singlePress = INPUT_BROKER_NONE;
|
||||||
|
touchConfig.longPress = INPUT_BROKER_BACK;
|
||||||
|
#if defined(TTGO_T_ECHO_PLUS) && defined(PIN_EINK_EN)
|
||||||
|
// On T-Echo Plus the touch pad should only drive the backlight, not UI navigation/sounds
|
||||||
|
touchConfig.longPress = INPUT_BROKER_NONE;
|
||||||
|
touchConfig.suppressLeadUpSound = true;
|
||||||
|
touchConfig.onPress = []() {
|
||||||
|
touchBacklightWasOn = uiconfig.screen_brightness == 1;
|
||||||
|
if (!touchBacklightWasOn) {
|
||||||
|
digitalWrite(PIN_EINK_EN, HIGH);
|
||||||
|
}
|
||||||
|
touchBacklightActive = true;
|
||||||
|
};
|
||||||
|
touchConfig.onRelease = []() {
|
||||||
|
if (touchBacklightActive && !touchBacklightWasOn) {
|
||||||
|
digitalWrite(PIN_EINK_EN, LOW);
|
||||||
|
}
|
||||||
|
touchBacklightActive = false;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
TouchButtonThread->initButton(touchConfig);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CANCEL_BUTTON_PIN)
|
||||||
|
// Buttons. Moved here cause we need NodeDB to be initialized
|
||||||
|
CancelButtonThread = new ButtonThread("CancelButton");
|
||||||
|
ButtonConfig cancelConfig;
|
||||||
|
cancelConfig.pinNumber = CANCEL_BUTTON_PIN;
|
||||||
|
cancelConfig.activeLow = CANCEL_BUTTON_ACTIVE_LOW;
|
||||||
|
cancelConfig.activePullup = CANCEL_BUTTON_ACTIVE_PULLUP;
|
||||||
|
cancelConfig.pullupSense = pullup_sense;
|
||||||
|
cancelConfig.intRoutine = []() {
|
||||||
|
CancelButtonThread->userButton.tick();
|
||||||
|
CancelButtonThread->setIntervalFromNow(0);
|
||||||
|
runASAP = true;
|
||||||
|
BaseType_t higherWake = 0;
|
||||||
|
mainDelay.interruptFromISR(&higherWake);
|
||||||
|
};
|
||||||
|
cancelConfig.singlePress = INPUT_BROKER_CANCEL;
|
||||||
|
cancelConfig.longPress = INPUT_BROKER_SHUTDOWN;
|
||||||
|
cancelConfig.longPressTime = 4000;
|
||||||
|
CancelButtonThread->initButton(cancelConfig);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ALT_BUTTON_PIN)
|
||||||
|
// Buttons. Moved here cause we need NodeDB to be initialized
|
||||||
|
BackButtonThread = new ButtonThread("BackButton");
|
||||||
|
ButtonConfig backConfig;
|
||||||
|
backConfig.pinNumber = ALT_BUTTON_PIN;
|
||||||
|
backConfig.activeLow = ALT_BUTTON_ACTIVE_LOW;
|
||||||
|
backConfig.activePullup = ALT_BUTTON_ACTIVE_PULLUP;
|
||||||
|
backConfig.pullupSense = pullup_sense;
|
||||||
|
backConfig.intRoutine = []() {
|
||||||
|
BackButtonThread->userButton.tick();
|
||||||
|
BackButtonThread->setIntervalFromNow(0);
|
||||||
|
runASAP = true;
|
||||||
|
BaseType_t higherWake = 0;
|
||||||
|
mainDelay.interruptFromISR(&higherWake);
|
||||||
|
};
|
||||||
|
backConfig.singlePress = INPUT_BROKER_ALT_PRESS;
|
||||||
|
backConfig.longPress = INPUT_BROKER_ALT_LONG;
|
||||||
|
backConfig.longPressTime = 500;
|
||||||
|
BackButtonThread->initButton(backConfig);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(BUTTON_PIN)
|
||||||
|
#if defined(USERPREFS_BUTTON_PIN)
|
||||||
|
int _pinNum = config.device.button_gpio ? config.device.button_gpio : USERPREFS_BUTTON_PIN;
|
||||||
|
#else
|
||||||
|
int _pinNum = config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN;
|
||||||
|
#endif
|
||||||
|
#ifndef BUTTON_ACTIVE_LOW
|
||||||
|
#define BUTTON_ACTIVE_LOW true
|
||||||
|
#endif
|
||||||
|
#ifndef BUTTON_ACTIVE_PULLUP
|
||||||
|
#define BUTTON_ACTIVE_PULLUP true
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Buttons. Moved here cause we need NodeDB to be initialized
|
||||||
|
// If your variant.h has a BUTTON_PIN defined, go ahead and define BUTTON_ACTIVE_LOW and BUTTON_ACTIVE_PULLUP
|
||||||
|
UserButtonThread = new ButtonThread("UserButton");
|
||||||
|
if (screen) {
|
||||||
|
ButtonConfig userConfig;
|
||||||
|
userConfig.pinNumber = (uint8_t)_pinNum;
|
||||||
|
userConfig.activeLow = BUTTON_ACTIVE_LOW;
|
||||||
|
userConfig.activePullup = BUTTON_ACTIVE_PULLUP;
|
||||||
|
userConfig.pullupSense = pullup_sense;
|
||||||
|
userConfig.intRoutine = []() {
|
||||||
|
UserButtonThread->userButton.tick();
|
||||||
|
UserButtonThread->setIntervalFromNow(0);
|
||||||
|
runASAP = true;
|
||||||
|
BaseType_t higherWake = 0;
|
||||||
|
mainDelay.interruptFromISR(&higherWake);
|
||||||
|
};
|
||||||
|
userConfig.singlePress = INPUT_BROKER_USER_PRESS;
|
||||||
|
userConfig.longPress = INPUT_BROKER_SELECT;
|
||||||
|
userConfig.longPressTime = 500;
|
||||||
|
userConfig.longLongPress = INPUT_BROKER_SHUTDOWN;
|
||||||
|
UserButtonThread->initButton(userConfig);
|
||||||
|
} else {
|
||||||
|
ButtonConfig userConfigNoScreen;
|
||||||
|
userConfigNoScreen.pinNumber = (uint8_t)_pinNum;
|
||||||
|
userConfigNoScreen.activeLow = BUTTON_ACTIVE_LOW;
|
||||||
|
userConfigNoScreen.activePullup = BUTTON_ACTIVE_PULLUP;
|
||||||
|
userConfigNoScreen.pullupSense = pullup_sense;
|
||||||
|
userConfigNoScreen.intRoutine = []() {
|
||||||
|
UserButtonThread->userButton.tick();
|
||||||
|
UserButtonThread->setIntervalFromNow(0);
|
||||||
|
runASAP = true;
|
||||||
|
BaseType_t higherWake = 0;
|
||||||
|
mainDelay.interruptFromISR(&higherWake);
|
||||||
|
};
|
||||||
|
userConfigNoScreen.singlePress = INPUT_BROKER_USER_PRESS;
|
||||||
|
userConfigNoScreen.longPress = INPUT_BROKER_NONE;
|
||||||
|
userConfigNoScreen.longPressTime = 500;
|
||||||
|
userConfigNoScreen.longLongPress = INPUT_BROKER_SHUTDOWN;
|
||||||
|
userConfigNoScreen.doublePress = INPUT_BROKER_SEND_PING;
|
||||||
|
userConfigNoScreen.triplePress = INPUT_BROKER_GPS_TOGGLE;
|
||||||
|
UserButtonThread->initButton(userConfigNoScreen);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MESHTASTIC_INCLUDE_NICHE_GRAPHICS
|
#ifdef MESHTASTIC_INCLUDE_NICHE_GRAPHICS
|
||||||
@@ -1170,13 +1388,6 @@ void loop()
|
|||||||
#endif
|
#endif
|
||||||
power->powerCommandsCheck();
|
power->powerCommandsCheck();
|
||||||
|
|
||||||
if (last_listen + 1000 * 60 < millis() &&
|
|
||||||
!(RadioLibInterface::instance->isSending() || RadioLibInterface::instance->isActivelyReceiving())) {
|
|
||||||
RadioLibInterface::instance->startReceive();
|
|
||||||
LOG_DEBUG("attempting AGC reset");
|
|
||||||
last_listen = millis();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG_STACK
|
#ifdef DEBUG_STACK
|
||||||
static uint32_t lastPrint = 0;
|
static uint32_t lastPrint = 0;
|
||||||
if (!Throttle::isWithinTimespanMs(lastPrint, 10 * 1000L)) {
|
if (!Throttle::isWithinTimespanMs(lastPrint, 10 * 1000L)) {
|
||||||
|
|||||||
@@ -17,6 +17,12 @@
|
|||||||
ErrorCode ReliableRouter::send(meshtastic_MeshPacket *p)
|
ErrorCode ReliableRouter::send(meshtastic_MeshPacket *p)
|
||||||
{
|
{
|
||||||
if (p->want_ack) {
|
if (p->want_ack) {
|
||||||
|
// If someone asks for acks on broadcast, we need the hop limit to be at least one, so that first node that receives our
|
||||||
|
// message will rebroadcast. But asking for hop_limit 0 in that context means the client app has no preference on hop
|
||||||
|
// counts and we want this message to get through the whole mesh, so use the default.
|
||||||
|
if (p->hop_limit == 0) {
|
||||||
|
p->hop_limit = Default::getConfiguredOrDefaultHopLimit(config.lora.hop_limit);
|
||||||
|
}
|
||||||
DEBUG_HEAP_BEFORE;
|
DEBUG_HEAP_BEFORE;
|
||||||
auto copy = packetPool.allocCopy(*p);
|
auto copy = packetPool.allocCopy(*p);
|
||||||
DEBUG_HEAP_AFTER("ReliableRouter::send", copy);
|
DEBUG_HEAP_AFTER("ReliableRouter::send", copy);
|
||||||
|
|||||||
@@ -266,13 +266,6 @@ ErrorCode Router::sendLocal(meshtastic_MeshPacket *p, RxSource src)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If someone asks for acks on broadcast, we need the hop limit to be at least one, so that first node that receives our
|
|
||||||
// message will rebroadcast. But asking for hop_limit 0 in that context means the client app has no preference on hop
|
|
||||||
// counts and we want this message to get through the whole mesh, so use the default.
|
|
||||||
if (src == RX_SRC_USER && p->want_ack && p->hop_limit == 0) {
|
|
||||||
p->hop_limit = Default::getConfiguredOrDefaultHopLimit(config.lora.hop_limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
return send(p);
|
return send(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,24 @@
|
|||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#if !MESHTASTIC_EXCLUDE_INPUTBROKER
|
#if !MESHTASTIC_EXCLUDE_INPUTBROKER
|
||||||
#include "buzz/BuzzerFeedbackThread.h"
|
#include "buzz/BuzzerFeedbackThread.h"
|
||||||
|
#include "input/ExpressLRSFiveWay.h"
|
||||||
|
#include "input/InputBroker.h"
|
||||||
|
#include "input/RotaryEncoderImpl.h"
|
||||||
|
#include "input/RotaryEncoderInterruptImpl1.h"
|
||||||
|
#include "input/SerialKeyboardImpl.h"
|
||||||
|
#include "input/UpDownInterruptImpl1.h"
|
||||||
|
#include "input/i2cButton.h"
|
||||||
#include "modules/SystemCommandsModule.h"
|
#include "modules/SystemCommandsModule.h"
|
||||||
|
#if HAS_TRACKBALL
|
||||||
|
#include "input/TrackballInterruptImpl1.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "modules/StatusLEDModule.h"
|
||||||
|
|
||||||
|
#if !MESHTASTIC_EXCLUDE_I2C
|
||||||
|
#include "input/cardKbI2cImpl.h"
|
||||||
|
#endif
|
||||||
|
#include "input/kbMatrixImpl.h"
|
||||||
#endif
|
#endif
|
||||||
#if !MESHTASTIC_EXCLUDE_PKI
|
#if !MESHTASTIC_EXCLUDE_PKI
|
||||||
#include "KeyVerificationModule.h"
|
#include "KeyVerificationModule.h"
|
||||||
@@ -42,6 +59,8 @@
|
|||||||
#include "modules/WaypointModule.h"
|
#include "modules/WaypointModule.h"
|
||||||
#endif
|
#endif
|
||||||
#if ARCH_PORTDUINO
|
#if ARCH_PORTDUINO
|
||||||
|
#include "input/LinuxInputImpl.h"
|
||||||
|
#include "input/SeesawRotary.h"
|
||||||
#include "modules/Telemetry/HostMetrics.h"
|
#include "modules/Telemetry/HostMetrics.h"
|
||||||
#if !MESHTASTIC_EXCLUDE_STOREFORWARD
|
#if !MESHTASTIC_EXCLUDE_STOREFORWARD
|
||||||
#include "modules/StoreForwardModule.h"
|
#include "modules/StoreForwardModule.h"
|
||||||
@@ -160,6 +179,63 @@ void setupModules()
|
|||||||
#endif
|
#endif
|
||||||
// Example: Put your module here
|
// Example: Put your module here
|
||||||
// new ReplyModule();
|
// new ReplyModule();
|
||||||
|
#if (HAS_BUTTON || ARCH_PORTDUINO) && !MESHTASTIC_EXCLUDE_INPUTBROKER
|
||||||
|
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) {
|
||||||
|
#if defined(T_LORA_PAGER)
|
||||||
|
// use a special FSM based rotary encoder version for T-LoRa Pager
|
||||||
|
rotaryEncoderImpl = new RotaryEncoderImpl();
|
||||||
|
if (!rotaryEncoderImpl->init()) {
|
||||||
|
delete rotaryEncoderImpl;
|
||||||
|
rotaryEncoderImpl = nullptr;
|
||||||
|
}
|
||||||
|
#elif defined(INPUTDRIVER_ENCODER_TYPE) && (INPUTDRIVER_ENCODER_TYPE == 2)
|
||||||
|
upDownInterruptImpl1 = new UpDownInterruptImpl1();
|
||||||
|
if (!upDownInterruptImpl1->init()) {
|
||||||
|
delete upDownInterruptImpl1;
|
||||||
|
upDownInterruptImpl1 = nullptr;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
rotaryEncoderInterruptImpl1 = new RotaryEncoderInterruptImpl1();
|
||||||
|
if (!rotaryEncoderInterruptImpl1->init()) {
|
||||||
|
delete rotaryEncoderInterruptImpl1;
|
||||||
|
rotaryEncoderInterruptImpl1 = nullptr;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
cardKbI2cImpl = new CardKbI2cImpl();
|
||||||
|
cardKbI2cImpl->init();
|
||||||
|
#if defined(M5STACK_UNITC6L)
|
||||||
|
i2cButton = new i2cButtonThread("i2cButtonThread");
|
||||||
|
#endif
|
||||||
|
#ifdef INPUTBROKER_MATRIX_TYPE
|
||||||
|
kbMatrixImpl = new KbMatrixImpl();
|
||||||
|
kbMatrixImpl->init();
|
||||||
|
#endif // INPUTBROKER_MATRIX_TYPE
|
||||||
|
#ifdef INPUTBROKER_SERIAL_TYPE
|
||||||
|
aSerialKeyboardImpl = new SerialKeyboardImpl();
|
||||||
|
aSerialKeyboardImpl->init();
|
||||||
|
#endif // INPUTBROKER_MATRIX_TYPE
|
||||||
|
}
|
||||||
|
#endif // HAS_BUTTON
|
||||||
|
#if ARCH_PORTDUINO
|
||||||
|
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR && portduino_config.i2cdev != "") {
|
||||||
|
seesawRotary = new SeesawRotary("SeesawRotary");
|
||||||
|
if (!seesawRotary->init()) {
|
||||||
|
delete seesawRotary;
|
||||||
|
seesawRotary = nullptr;
|
||||||
|
}
|
||||||
|
aLinuxInputImpl = new LinuxInputImpl();
|
||||||
|
aLinuxInputImpl->init();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if !MESHTASTIC_EXCLUDE_INPUTBROKER && HAS_TRACKBALL
|
||||||
|
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) {
|
||||||
|
trackballInterruptImpl1 = new TrackballInterruptImpl1();
|
||||||
|
trackballInterruptImpl1->init(TB_DOWN, TB_UP, TB_LEFT, TB_RIGHT, TB_PRESS);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef INPUTBROKER_EXPRESSLRSFIVEWAY_TYPE
|
||||||
|
expressLRSFiveWayInput = new ExpressLRSFiveWay();
|
||||||
|
#endif
|
||||||
#if HAS_SCREEN && !MESHTASTIC_EXCLUDE_CANNEDMESSAGES
|
#if HAS_SCREEN && !MESHTASTIC_EXCLUDE_CANNEDMESSAGES
|
||||||
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) {
|
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) {
|
||||||
cannedMessageModule = new CannedMessageModule();
|
cannedMessageModule = new CannedMessageModule();
|
||||||
|
|||||||
@@ -67,8 +67,6 @@ uint8_t RoutingModule::getHopLimitForResponse(const meshtastic_MeshPacket &mp)
|
|||||||
#if !(EVENTMODE) // This falls through to the default.
|
#if !(EVENTMODE) // This falls through to the default.
|
||||||
return hopsUsed; // If the request used more hops than the limit, use the same amount of hops
|
return hopsUsed; // If the request used more hops than the limit, use the same amount of hops
|
||||||
#endif
|
#endif
|
||||||
} else if (mp.hop_start == 0) {
|
|
||||||
return 0; // The requesting node wanted 0 hops, so the response also uses a direct/local path.
|
|
||||||
} else if ((uint8_t)(hopsUsed + 2) < config.lora.hop_limit) {
|
} else if ((uint8_t)(hopsUsed + 2) < config.lora.hop_limit) {
|
||||||
return hopsUsed + 2; // Use only the amount of hops needed with some margin as the way back may be different
|
return hopsUsed + 2; // Use only the amount of hops needed with some margin as the way back may be different
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,25 +63,28 @@
|
|||||||
SerialModule *serialModule;
|
SerialModule *serialModule;
|
||||||
SerialModuleRadio *serialModuleRadio;
|
SerialModuleRadio *serialModuleRadio;
|
||||||
|
|
||||||
#ifndef SERIAL_PRINT_PORT
|
#if defined(TTGO_T_ECHO) || defined(TTGO_T_ECHO_PLUS) || defined(CANARYONE) || defined(MESHLINK) || \
|
||||||
#define SERIAL_PRINT_PORT 2
|
defined(ELECROW_ThinkNode_M1) || defined(ELECROW_ThinkNode_M4) || defined(ELECROW_ThinkNode_M5) || \
|
||||||
#endif
|
defined(HELTEC_MESH_SOLAR) || defined(T_ECHO_LITE) || defined(ELECROW_ThinkNode_M3) || defined(MUZI_BASE)
|
||||||
|
|
||||||
#if SERIAL_PRINT_PORT == 0
|
SerialModule::SerialModule() : StreamAPI(&Serial), concurrency::OSThread("Serial")
|
||||||
#define SERIAL_PRINT_OBJECT Serial
|
|
||||||
#elif SERIAL_PRINT_PORT == 1
|
|
||||||
#define SERIAL_PRINT_OBJECT Serial1
|
|
||||||
#elif SERIAL_PRINT_PORT == 2
|
|
||||||
#define SERIAL_PRINT_OBJECT Serial2
|
|
||||||
#else
|
|
||||||
#error "Unsupported SERIAL_PRINT_PORT value. Allowed values are 0, 1, or 2."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SerialModule::SerialModule() : StreamAPI(&SERIAL_PRINT_OBJECT), concurrency::OSThread("Serial")
|
|
||||||
{
|
{
|
||||||
api_type = TYPE_SERIAL;
|
api_type = TYPE_SERIAL;
|
||||||
}
|
}
|
||||||
static Print *serialPrint = &SERIAL_PRINT_OBJECT;
|
static Print *serialPrint = &Serial;
|
||||||
|
#elif defined(CONFIG_IDF_TARGET_ESP32C6) || defined(RAK3172) || defined(EBYTE_E77_MBL)
|
||||||
|
SerialModule::SerialModule() : StreamAPI(&Serial1), concurrency::OSThread("Serial")
|
||||||
|
{
|
||||||
|
api_type = TYPE_SERIAL;
|
||||||
|
}
|
||||||
|
static Print *serialPrint = &Serial1;
|
||||||
|
#else
|
||||||
|
SerialModule::SerialModule() : StreamAPI(&Serial2), concurrency::OSThread("Serial")
|
||||||
|
{
|
||||||
|
api_type = TYPE_SERIAL;
|
||||||
|
}
|
||||||
|
static Print *serialPrint = &Serial2;
|
||||||
|
#endif
|
||||||
|
|
||||||
char serialBytes[512];
|
char serialBytes[512];
|
||||||
size_t serialPayloadSize;
|
size_t serialPayloadSize;
|
||||||
@@ -202,7 +205,9 @@ int32_t SerialModule::runOnce()
|
|||||||
Serial.begin(baud);
|
Serial.begin(baud);
|
||||||
Serial.setTimeout(moduleConfig.serial.timeout > 0 ? moduleConfig.serial.timeout : TIMEOUT);
|
Serial.setTimeout(moduleConfig.serial.timeout > 0 ? moduleConfig.serial.timeout : TIMEOUT);
|
||||||
}
|
}
|
||||||
#elif SERIAL_PRINT_PORT != 0
|
#elif !defined(TTGO_T_ECHO) && !defined(TTGO_T_ECHO_PLUS) && !defined(T_ECHO_LITE) && !defined(CANARYONE) && \
|
||||||
|
!defined(MESHLINK) && !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M3) && !defined(ELECROW_ThinkNode_M4) && \
|
||||||
|
!defined(ELECROW_ThinkNode_M5) && !defined(MUZI_BASE)
|
||||||
|
|
||||||
if (moduleConfig.serial.rxd && moduleConfig.serial.txd) {
|
if (moduleConfig.serial.rxd && moduleConfig.serial.txd) {
|
||||||
#ifdef ARCH_RP2040
|
#ifdef ARCH_RP2040
|
||||||
@@ -259,7 +264,9 @@ int32_t SerialModule::runOnce()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SERIAL_PRINT_PORT != 0
|
#if !defined(TTGO_T_ECHO) && !defined(TTGO_T_ECHO_PLUS) && !defined(T_ECHO_LITE) && !defined(CANARYONE) && !defined(MESHLINK) && \
|
||||||
|
!defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M3) && !defined(ELECROW_ThinkNode_M4) && \
|
||||||
|
!defined(ELECROW_ThinkNode_M5) && !defined(MUZI_BASE)
|
||||||
else if ((moduleConfig.serial.mode == meshtastic_ModuleConfig_SerialConfig_Serial_Mode_WS85)) {
|
else if ((moduleConfig.serial.mode == meshtastic_ModuleConfig_SerialConfig_Serial_Mode_WS85)) {
|
||||||
processWXSerial();
|
processWXSerial();
|
||||||
|
|
||||||
@@ -533,7 +540,11 @@ ParsedLine parseLine(const char *line)
|
|||||||
*/
|
*/
|
||||||
void SerialModule::processWXSerial()
|
void SerialModule::processWXSerial()
|
||||||
{
|
{
|
||||||
#if SERIAL_PRINT_PORT != 0 && !defined(ARCH_STM32WL) && !defined(CONFIG_IDF_TARGET_ESP32C6)
|
#if !defined(TTGO_T_ECHO) && !defined(TTGO_T_ECHO_PLUS) && !defined(T_ECHO_LITE) && !defined(CANARYONE) && \
|
||||||
|
!defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(MESHLINK) && !defined(ELECROW_ThinkNode_M1) && \
|
||||||
|
!defined(ELECROW_ThinkNode_M3) && \
|
||||||
|
!defined(ELECROW_ThinkNode_M4) && \
|
||||||
|
!defined(ELECROW_ThinkNode_M5) && !defined(ARCH_STM32WL) && !defined(MUZI_BASE)
|
||||||
|
|
||||||
static unsigned int lastAveraged = 0;
|
static unsigned int lastAveraged = 0;
|
||||||
static unsigned int averageIntervalMillis = 300000; // 5 minutes hard coded.
|
static unsigned int averageIntervalMillis = 300000; // 5 minutes hard coded.
|
||||||
|
|||||||
64
test_ai_slop.c
Normal file
64
test_ai_slop.c
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
/**
|
||||||
|
* AI Slop Test File - This is intentionally AI-generated looking content
|
||||||
|
*
|
||||||
|
* This function serves the purpose of demonstrating and testing the capability
|
||||||
|
* of the advanced machine learning model to comprehensively identify and accurately
|
||||||
|
* classify content that exhibits characteristics commonly associated with artificial
|
||||||
|
* intelligence-generated compositions, including but not limited to: redundant phrasing,
|
||||||
|
* verbose explanations, generic descriptions, lack of specific implementation details,
|
||||||
|
* and an overall tone that suggests automated generation rather than human authorship.
|
||||||
|
*
|
||||||
|
* The methodology employed herein leverages sophisticated algorithms and innovative
|
||||||
|
* approaches to systematically and methodically accomplish the following objectives:
|
||||||
|
* 1. To demonstrate the robustness of the classification system
|
||||||
|
* 2. To showcase the effectiveness of modern detection techniques
|
||||||
|
* 3. To validate the operational parameters of the triaging infrastructure
|
||||||
|
* 4. To comprehensively evaluate the performance metrics of the solution
|
||||||
|
*
|
||||||
|
* Implementation considerations and technical specifications have been carefully
|
||||||
|
* considered and thoughtfully incorporated to ensure optimal functionality and
|
||||||
|
* seamless integration with existing systems and protocols.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A comprehensive and thoroughly documented function that implements
|
||||||
|
* a sophisticated approach to value processing and subsequent display.
|
||||||
|
*/
|
||||||
|
void demonstrateAIGeneratedCode(const char *input_value)
|
||||||
|
{
|
||||||
|
// Initialize variables with appropriate data types
|
||||||
|
int status_code = 0;
|
||||||
|
char buffer[256];
|
||||||
|
|
||||||
|
// Implement conditional logic to handle various scenarios
|
||||||
|
if (input_value != NULL) {
|
||||||
|
// Perform string manipulation operations
|
||||||
|
snprintf(buffer, sizeof(buffer), "Processing input: %s", input_value);
|
||||||
|
printf("%s\n", buffer);
|
||||||
|
status_code = 1;
|
||||||
|
} else {
|
||||||
|
// Handle null input scenario appropriately
|
||||||
|
printf("Input value was null\n");
|
||||||
|
status_code = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return and indicate completion
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Primary entry point for application execution.
|
||||||
|
* This function orchestrates the overall flow and coordination of various
|
||||||
|
* components to achieve the desired outcomes and objectives.
|
||||||
|
*/
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
printf("Initiating execution of AI slop detection test...\n");
|
||||||
|
demonstrateAIGeneratedCode("test data");
|
||||||
|
printf("Execution completed successfully.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -50,5 +50,3 @@ void c6l_init();
|
|||||||
#endif
|
#endif
|
||||||
#define SCREEN_TRANSITION_FRAMERATE 10
|
#define SCREEN_TRANSITION_FRAMERATE 10
|
||||||
#define BRIGHTNESS_DEFAULT 130 // Medium Low Brightness
|
#define BRIGHTNESS_DEFAULT 130 // Medium Low Brightness
|
||||||
|
|
||||||
#define SERIAL_PRINT_PORT 1
|
|
||||||
|
|||||||
@@ -19,5 +19,3 @@
|
|||||||
#define SX126X_TXEN 14
|
#define SX126X_TXEN 14
|
||||||
#define SX126X_DIO2_AS_RF_SWITCH
|
#define SX126X_DIO2_AS_RF_SWITCH
|
||||||
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
||||||
|
|
||||||
#define SERIAL_PRINT_PORT 1
|
|
||||||
|
|||||||
@@ -81,6 +81,4 @@
|
|||||||
|
|
||||||
#define BUTTON_PIN PIN_BUTTON1
|
#define BUTTON_PIN PIN_BUTTON1
|
||||||
#define BUTTON_PIN_ALT PIN_BUTTON2
|
#define BUTTON_PIN_ALT PIN_BUTTON2
|
||||||
|
|
||||||
#define SERIAL_PRINT_PORT 0
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -159,8 +159,6 @@ External serial flash WP25R1635FZUIL0
|
|||||||
#define PIN_SERIAL1_TX GPS_TX_PIN
|
#define PIN_SERIAL1_TX GPS_TX_PIN
|
||||||
#define PIN_SERIAL1_RX GPS_RX_PIN
|
#define PIN_SERIAL1_RX GPS_RX_PIN
|
||||||
|
|
||||||
#define SERIAL_PRINT_PORT 0
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SPI Interfaces
|
* SPI Interfaces
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -113,8 +113,6 @@ extern "C" {
|
|||||||
#define LR11X0_DIO3_TCXO_VOLTAGE 3.3
|
#define LR11X0_DIO3_TCXO_VOLTAGE 3.3
|
||||||
#define LR11X0_DIO_AS_RF_SWITCH
|
#define LR11X0_DIO_AS_RF_SWITCH
|
||||||
|
|
||||||
#define SERIAL_PRINT_PORT 0
|
|
||||||
|
|
||||||
// PCF8563 RTC Module
|
// PCF8563 RTC Module
|
||||||
// REVISIT https://github.com/meshtastic/firmware/pull/9084
|
// REVISIT https://github.com/meshtastic/firmware/pull/9084
|
||||||
// #define PCF8563_RTC 0x51
|
// #define PCF8563_RTC 0x51
|
||||||
|
|||||||
@@ -135,8 +135,6 @@ static const uint8_t A0 = PIN_A0;
|
|||||||
#define PIN_SERIAL1_RX GPS_RX_PIN
|
#define PIN_SERIAL1_RX GPS_RX_PIN
|
||||||
#define PIN_SERIAL1_TX GPS_TX_PIN
|
#define PIN_SERIAL1_TX GPS_TX_PIN
|
||||||
|
|
||||||
#define SERIAL_PRINT_PORT 0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -170,8 +170,6 @@ static const uint8_t A0 = PIN_A0;
|
|||||||
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
|
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
|
||||||
#define ADC_MULTIPLIER (2.0F)
|
#define ADC_MULTIPLIER (2.0F)
|
||||||
|
|
||||||
#define SERIAL_PRINT_PORT 0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -142,8 +142,6 @@ No longer populated on PCB
|
|||||||
#define BQ4050_SCL_PIN (32 + 0) // I2C clock line pin
|
#define BQ4050_SCL_PIN (32 + 0) // I2C clock line pin
|
||||||
#define BQ4050_EMERGENCY_SHUTDOWN_PIN (32 + 3) // Emergency shutdown pin
|
#define BQ4050_EMERGENCY_SHUTDOWN_PIN (32 + 3) // Emergency shutdown pin
|
||||||
|
|
||||||
#define SERIAL_PRINT_PORT 0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -54,7 +54,6 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define PIN_SERIAL1_RX (32 + 8)
|
#define PIN_SERIAL1_RX (32 + 8)
|
||||||
#define PIN_SERIAL1_TX (7)
|
#define PIN_SERIAL1_TX (7)
|
||||||
#define SERIAL_PRINT_PORT 0
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SPI Interfaces
|
* SPI Interfaces
|
||||||
|
|||||||
@@ -176,8 +176,6 @@ extern "C" {
|
|||||||
#define EXTERNAL_FLASH_DEVICES W25Q32JVSS
|
#define EXTERNAL_FLASH_DEVICES W25Q32JVSS
|
||||||
#define EXTERNAL_FLASH_USE_QSPI
|
#define EXTERNAL_FLASH_USE_QSPI
|
||||||
|
|
||||||
#define SERIAL_PRINT_PORT 0
|
|
||||||
|
|
||||||
// NFC is disabled via CONFIG_NFCT_PINS_AS_GPIOS=1 build flag
|
// NFC is disabled via CONFIG_NFCT_PINS_AS_GPIOS=1 build flag
|
||||||
// This configures P0.09 and P0.10 as regular GPIO pins instead of NFC pins
|
// This configures P0.09 and P0.10 as regular GPIO pins instead of NFC pins
|
||||||
|
|
||||||
|
|||||||
@@ -171,8 +171,6 @@ static const uint8_t A0 = PIN_A0;
|
|||||||
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
|
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
|
||||||
#define ADC_MULTIPLIER (2.0F)
|
#define ADC_MULTIPLIER (2.0F)
|
||||||
|
|
||||||
#define SERIAL_PRINT_PORT 0
|
|
||||||
|
|
||||||
// #define NO_EXT_GPIO 1
|
// #define NO_EXT_GPIO 1
|
||||||
// PINs back side
|
// PINs back side
|
||||||
// Batt & solar connector left up corner
|
// Batt & solar connector left up corner
|
||||||
|
|||||||
@@ -138,8 +138,6 @@ static const uint8_t A0 = PIN_A0;
|
|||||||
// Battery / ADC already defined above
|
// Battery / ADC already defined above
|
||||||
#define HAS_RTC 1
|
#define HAS_RTC 1
|
||||||
|
|
||||||
#define SERIAL_PRINT_PORT 0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -88,7 +88,6 @@ static const uint8_t A0 = PIN_A0;
|
|||||||
/*
|
/*
|
||||||
* Serial interfaces
|
* Serial interfaces
|
||||||
*/
|
*/
|
||||||
#define SERIAL_PRINT_PORT 0
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
No longer populated on PCB
|
No longer populated on PCB
|
||||||
|
|||||||
@@ -19,7 +19,5 @@ Do not expect a working Meshtastic device with this target.
|
|||||||
// #define LED_PIN PB3 // LED2
|
// #define LED_PIN PB3 // LED2
|
||||||
#define LED_STATE_ON 1
|
#define LED_STATE_ON 1
|
||||||
|
|
||||||
#define SERIAL_PRINT_PORT 1
|
|
||||||
|
|
||||||
#define EBYTE_E77_MBL
|
#define EBYTE_E77_MBL
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -17,6 +17,5 @@ Do not expect a working Meshtastic device with this target.
|
|||||||
#define LED_STATE_ON 1
|
#define LED_STATE_ON 1
|
||||||
|
|
||||||
#define RAK3172
|
#define RAK3172
|
||||||
#define SERIAL_PRINT_PORT 1
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user