mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-11 23:52:14 +00:00
Merge branch 'master' into neighborinfo
This commit is contained in:
commit
2e7c95a110
4
.github/ISSUE_TEMPLATE/Bug Report.yml
vendored
4
.github/ISSUE_TEMPLATE/Bug Report.yml
vendored
@ -37,7 +37,9 @@ body:
|
|||||||
- T-Lora v1
|
- T-Lora v1
|
||||||
- T-Lora v1.3
|
- T-Lora v1.3
|
||||||
- T-Lora v2 1.6
|
- T-Lora v2 1.6
|
||||||
|
- T-Deck
|
||||||
- T-Echo
|
- T-Echo
|
||||||
|
- T-Watch
|
||||||
- Rak4631
|
- Rak4631
|
||||||
- Rak11200
|
- Rak11200
|
||||||
- Rak11310
|
- Rak11310
|
||||||
@ -45,6 +47,8 @@ body:
|
|||||||
- Heltec v2
|
- Heltec v2
|
||||||
- Heltec v2.1
|
- Heltec v2.1
|
||||||
- Heltec V3
|
- Heltec V3
|
||||||
|
- Heltec Wireless Paper
|
||||||
|
- Heltec Wireless Tracker
|
||||||
- Raspberry Pi Pico (W)
|
- Raspberry Pi Pico (W)
|
||||||
- Relay v1
|
- Relay v1
|
||||||
- Relay v2
|
- Relay v2
|
||||||
|
5
.github/workflows/main_matrix.yml
vendored
5
.github/workflows/main_matrix.yml
vendored
@ -33,6 +33,8 @@ jobs:
|
|||||||
- board: m5stack-coreink
|
- board: m5stack-coreink
|
||||||
- board: tbeam-s3-core
|
- board: tbeam-s3-core
|
||||||
- board: tlora-t3s3-v1
|
- board: tlora-t3s3-v1
|
||||||
|
- board: t-watch-s3
|
||||||
|
- board: t-deck
|
||||||
#- board: rak11310
|
#- board: rak11310
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -88,6 +90,8 @@ jobs:
|
|||||||
- board: heltec-wireless-paper
|
- board: heltec-wireless-paper
|
||||||
- board: tbeam-s3-core
|
- board: tbeam-s3-core
|
||||||
- board: tlora-t3s3-v1
|
- board: tlora-t3s3-v1
|
||||||
|
- board: t-watch-s3
|
||||||
|
- board: t-deck
|
||||||
uses: ./.github/workflows/build_esp32_s3.yml
|
uses: ./.github/workflows/build_esp32_s3.yml
|
||||||
with:
|
with:
|
||||||
board: ${{ matrix.board }}
|
board: ${{ matrix.board }}
|
||||||
@ -251,6 +255,7 @@ jobs:
|
|||||||
retention-days: 30
|
retention-days: 30
|
||||||
|
|
||||||
- name: Create request artifacts
|
- name: Create request artifacts
|
||||||
|
continue-on-error: true # FIXME: Why are we getting 502, but things still work?
|
||||||
if: ${{ github.event_name == 'pull_request_target' || github.event_name == 'pull_request' }}
|
if: ${{ github.event_name == 'pull_request_target' || github.event_name == 'pull_request' }}
|
||||||
uses: gavv/pull-request-artifacts@v1.1.0
|
uses: gavv/pull-request-artifacts@v1.1.0
|
||||||
with:
|
with:
|
||||||
|
38
boards/t-watch-s3.json
Normal file
38
boards/t-watch-s3.json
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino": {
|
||||||
|
"ldscript": "esp32s3_out.ld"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"-DBOARD_HAS_PSRAM",
|
||||||
|
"-DT_WATCH_S3",
|
||||||
|
"-DARDUINO_USB_CDC_ON_BOOT=1",
|
||||||
|
"-DARDUINO_USB_MODE=0",
|
||||||
|
"-DARDUINO_RUNNING_CORE=1",
|
||||||
|
"-DARDUINO_EVENT_RUNNING_CORE=1"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "80000000L",
|
||||||
|
"flash_mode": "dio",
|
||||||
|
"hwids": [["0X303A", "0x1001"]],
|
||||||
|
"mcu": "esp32s3",
|
||||||
|
"variant": "t-watch-s3"
|
||||||
|
},
|
||||||
|
"connectivity": ["wifi"],
|
||||||
|
"debug": {
|
||||||
|
"openocd_target": "esp32s3.cfg"
|
||||||
|
},
|
||||||
|
"frameworks": ["arduino"],
|
||||||
|
"name": "LilyGo T-Watch 2020 V3",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "8MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 8388608,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"use_1200bps_touch": true,
|
||||||
|
"wait_for_upload_port": true
|
||||||
|
},
|
||||||
|
"url": "http://www.lilygo.cn/",
|
||||||
|
"vendor": "LilyGo"
|
||||||
|
}
|
@ -121,3 +121,4 @@ lib_deps =
|
|||||||
adafruit/Adafruit PM25 AQI Sensor@^1.0.6
|
adafruit/Adafruit PM25 AQI Sensor@^1.0.6
|
||||||
adafruit/Adafruit MPU6050@^2.2.4
|
adafruit/Adafruit MPU6050@^2.2.4
|
||||||
adafruit/Adafruit LIS3DH@^1.2.4
|
adafruit/Adafruit LIS3DH@^1.2.4
|
||||||
|
https://github.com/lewisxhe/BMA423_Library@^0.0.1
|
@ -1 +1 @@
|
|||||||
Subproject commit 64c2a11d371cae3a2e7bb2cc86b9e6e764de7175
|
Subproject commit f17298c2b093ac0d2536642b508f6cf84771b172
|
@ -6,10 +6,37 @@
|
|||||||
|
|
||||||
#include <Adafruit_LIS3DH.h>
|
#include <Adafruit_LIS3DH.h>
|
||||||
#include <Adafruit_MPU6050.h>
|
#include <Adafruit_MPU6050.h>
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <bma.h>
|
||||||
|
|
||||||
|
BMA423 bmaSensor;
|
||||||
|
bool BMA_IRQ = false;
|
||||||
|
|
||||||
#define ACCELEROMETER_CHECK_INTERVAL_MS 100
|
#define ACCELEROMETER_CHECK_INTERVAL_MS 100
|
||||||
#define ACCELEROMETER_CLICK_THRESHOLD 40
|
#define ACCELEROMETER_CLICK_THRESHOLD 40
|
||||||
|
|
||||||
|
uint16_t readRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len)
|
||||||
|
{
|
||||||
|
Wire.beginTransmission(address);
|
||||||
|
Wire.write(reg);
|
||||||
|
Wire.endTransmission();
|
||||||
|
Wire.requestFrom((uint8_t)address, (uint8_t)len);
|
||||||
|
uint8_t i = 0;
|
||||||
|
while (Wire.available()) {
|
||||||
|
data[i++] = Wire.read();
|
||||||
|
}
|
||||||
|
return 0; // Pass
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t writeRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len)
|
||||||
|
{
|
||||||
|
Wire.beginTransmission(address);
|
||||||
|
Wire.write(reg);
|
||||||
|
Wire.write(data, len);
|
||||||
|
return (0 != Wire.endTransmission());
|
||||||
|
}
|
||||||
|
|
||||||
namespace concurrency
|
namespace concurrency
|
||||||
{
|
{
|
||||||
class AccelerometerThread : public concurrency::OSThread
|
class AccelerometerThread : public concurrency::OSThread
|
||||||
@ -29,10 +56,10 @@ class AccelerometerThread : public concurrency::OSThread
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
accleremoter_type = type;
|
acceleremoter_type = type;
|
||||||
LOG_DEBUG("AccelerometerThread initializing\n");
|
LOG_DEBUG("AccelerometerThread initializing\n");
|
||||||
|
|
||||||
if (accleremoter_type == ScanI2C::DeviceType::MPU6050 && mpu.begin(accelerometer_found.address)) {
|
if (acceleremoter_type == ScanI2C::DeviceType::MPU6050 && mpu.begin(accelerometer_found.address)) {
|
||||||
LOG_DEBUG("MPU6050 initializing\n");
|
LOG_DEBUG("MPU6050 initializing\n");
|
||||||
// setup motion detection
|
// setup motion detection
|
||||||
mpu.setHighPassFilter(MPU6050_HIGHPASS_0_63_HZ);
|
mpu.setHighPassFilter(MPU6050_HIGHPASS_0_63_HZ);
|
||||||
@ -40,11 +67,60 @@ class AccelerometerThread : public concurrency::OSThread
|
|||||||
mpu.setMotionDetectionDuration(20);
|
mpu.setMotionDetectionDuration(20);
|
||||||
mpu.setInterruptPinLatch(true); // Keep it latched. Will turn off when reinitialized.
|
mpu.setInterruptPinLatch(true); // Keep it latched. Will turn off when reinitialized.
|
||||||
mpu.setInterruptPinPolarity(true);
|
mpu.setInterruptPinPolarity(true);
|
||||||
} else if (accleremoter_type == ScanI2C::DeviceType::LIS3DH && lis.begin(accelerometer_found.address)) {
|
} else if (acceleremoter_type == ScanI2C::DeviceType::LIS3DH && lis.begin(accelerometer_found.address)) {
|
||||||
LOG_DEBUG("LIS3DH initializing\n");
|
LOG_DEBUG("LIS3DH initializing\n");
|
||||||
lis.setRange(LIS3DH_RANGE_2_G);
|
lis.setRange(LIS3DH_RANGE_2_G);
|
||||||
// Adjust threshold, higher numbers are less sensitive
|
// Adjust threshold, higher numbers are less sensitive
|
||||||
lis.setClick(config.device.double_tap_as_button_press ? 2 : 1, ACCELEROMETER_CLICK_THRESHOLD);
|
lis.setClick(config.device.double_tap_as_button_press ? 2 : 1, ACCELEROMETER_CLICK_THRESHOLD);
|
||||||
|
} else if (acceleremoter_type == ScanI2C::DeviceType::BMA423 && bmaSensor.begin(readRegister, writeRegister, delay)) {
|
||||||
|
LOG_DEBUG("BMA423 initializing\n");
|
||||||
|
Acfg cfg;
|
||||||
|
cfg.odr = BMA4_OUTPUT_DATA_RATE_100HZ;
|
||||||
|
cfg.range = BMA4_ACCEL_RANGE_2G;
|
||||||
|
cfg.bandwidth = BMA4_ACCEL_NORMAL_AVG4;
|
||||||
|
cfg.perf_mode = BMA4_CONTINUOUS_MODE;
|
||||||
|
bmaSensor.setAccelConfig(cfg);
|
||||||
|
bmaSensor.enableAccel();
|
||||||
|
|
||||||
|
struct bma4_int_pin_config pin_config;
|
||||||
|
pin_config.edge_ctrl = BMA4_LEVEL_TRIGGER;
|
||||||
|
pin_config.lvl = BMA4_ACTIVE_HIGH;
|
||||||
|
pin_config.od = BMA4_PUSH_PULL;
|
||||||
|
pin_config.output_en = BMA4_OUTPUT_ENABLE;
|
||||||
|
pin_config.input_en = BMA4_INPUT_DISABLE;
|
||||||
|
// The correct trigger interrupt needs to be configured as needed
|
||||||
|
bmaSensor.setINTPinConfig(pin_config, BMA4_INTR1_MAP);
|
||||||
|
|
||||||
|
#ifdef BMA423_INT
|
||||||
|
pinMode(BMA4XX_INT, INPUT);
|
||||||
|
attachInterrupt(
|
||||||
|
BMA4XX_INT,
|
||||||
|
[] {
|
||||||
|
// Set interrupt to set irq value to true
|
||||||
|
BMA_IRQ = true;
|
||||||
|
},
|
||||||
|
RISING); // Select the interrupt mode according to the actual circuit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct bma423_axes_remap remap_data;
|
||||||
|
remap_data.x_axis = 0;
|
||||||
|
remap_data.x_axis_sign = 1;
|
||||||
|
remap_data.y_axis = 1;
|
||||||
|
remap_data.y_axis_sign = 0;
|
||||||
|
remap_data.z_axis = 2;
|
||||||
|
remap_data.z_axis_sign = 1;
|
||||||
|
// Need to raise the wrist function, need to set the correct axis
|
||||||
|
bmaSensor.setRemapAxes(&remap_data);
|
||||||
|
// sensor.enableFeature(BMA423_STEP_CNTR, true);
|
||||||
|
bmaSensor.enableFeature(BMA423_TILT, true);
|
||||||
|
bmaSensor.enableFeature(BMA423_WAKEUP, true);
|
||||||
|
// sensor.resetStepCounter();
|
||||||
|
|
||||||
|
// Turn on feature interrupt
|
||||||
|
bmaSensor.enableStepCountInterrupt();
|
||||||
|
bmaSensor.enableTiltInterrupt();
|
||||||
|
// It corresponds to isDoubleClick interrupt
|
||||||
|
bmaSensor.enableWakeupInterrupt();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,9 +129,9 @@ class AccelerometerThread : public concurrency::OSThread
|
|||||||
{
|
{
|
||||||
canSleep = true; // Assume we should not keep the board awake
|
canSleep = true; // Assume we should not keep the board awake
|
||||||
|
|
||||||
if (accleremoter_type == ScanI2C::DeviceType::MPU6050 && mpu.getMotionInterruptStatus()) {
|
if (acceleremoter_type == ScanI2C::DeviceType::MPU6050 && mpu.getMotionInterruptStatus()) {
|
||||||
wakeScreen();
|
wakeScreen();
|
||||||
} else if (accleremoter_type == ScanI2C::DeviceType::LIS3DH && lis.getClick() > 0) {
|
} else if (acceleremoter_type == ScanI2C::DeviceType::LIS3DH && lis.getClick() > 0) {
|
||||||
uint8_t click = lis.getClick();
|
uint8_t click = lis.getClick();
|
||||||
if (!config.device.double_tap_as_button_press) {
|
if (!config.device.double_tap_as_button_press) {
|
||||||
wakeScreen();
|
wakeScreen();
|
||||||
@ -65,7 +141,13 @@ class AccelerometerThread : public concurrency::OSThread
|
|||||||
buttonPress();
|
buttonPress();
|
||||||
return 500;
|
return 500;
|
||||||
}
|
}
|
||||||
|
} else if (acceleremoter_type == ScanI2C::DeviceType::BMA423 && bmaSensor.getINT()) {
|
||||||
|
if (bmaSensor.isTilt() || bmaSensor.isDoubleClick()) {
|
||||||
|
wakeScreen();
|
||||||
|
return 500;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ACCELEROMETER_CHECK_INTERVAL_MS;
|
return ACCELEROMETER_CHECK_INTERVAL_MS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,9 +166,9 @@ class AccelerometerThread : public concurrency::OSThread
|
|||||||
powerFSM.trigger(EVENT_PRESS);
|
powerFSM.trigger(EVENT_PRESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
ScanI2C::DeviceType accleremoter_type;
|
ScanI2C::DeviceType acceleremoter_type;
|
||||||
Adafruit_MPU6050 mpu;
|
Adafruit_MPU6050 mpu;
|
||||||
Adafruit_LIS3DH lis;
|
Adafruit_LIS3DH lis;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace concurrency
|
} // namespace concurrency
|
@ -4,6 +4,7 @@
|
|||||||
#include "concurrency/OSThread.h"
|
#include "concurrency/OSThread.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "graphics/Screen.h"
|
#include "graphics/Screen.h"
|
||||||
|
#include "main.h"
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
#include <OneButton.h>
|
#include <OneButton.h>
|
||||||
|
|
||||||
@ -100,6 +101,21 @@ class ButtonThread : public concurrency::OSThread
|
|||||||
#endif
|
#endif
|
||||||
// if (!canSleep) LOG_DEBUG("Suppressing sleep!\n");
|
// if (!canSleep) LOG_DEBUG("Suppressing sleep!\n");
|
||||||
// else LOG_DEBUG("sleep ok\n");
|
// else LOG_DEBUG("sleep ok\n");
|
||||||
|
#if defined(ST7735_CS) || defined(ILI9341_DRIVER) || defined(ST7789_CS)
|
||||||
|
int x, y = 0;
|
||||||
|
screen->getTouch(&x, &y);
|
||||||
|
if (x > 0 && y > 0) {
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
drv.setWaveform(0, 75);
|
||||||
|
drv.setWaveform(1, 0); // end waveform
|
||||||
|
drv.go();
|
||||||
|
#endif
|
||||||
|
LOG_DEBUG("touch %d %d\n", x, y);
|
||||||
|
powerFSM.trigger(EVENT_PRESS);
|
||||||
|
return 150; // Check for next touch every in 150ms
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
|
@ -540,10 +540,12 @@ int32_t Power::runOnce()
|
|||||||
LOG_DEBUG("Battery removed\n");
|
LOG_DEBUG("Battery removed\n");
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
#ifndef T_WATCH_S3 // FIXME - why is this triggering on the T-Watch S3?
|
||||||
if (PMU->isPekeyLongPressIrq()) {
|
if (PMU->isPekeyLongPressIrq()) {
|
||||||
LOG_DEBUG("PEK long button press\n");
|
LOG_DEBUG("PEK long button press\n");
|
||||||
screen->setOn(false);
|
screen->setOn(false);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
PMU->clearIrqStatus();
|
PMU->clearIrqStatus();
|
||||||
}
|
}
|
||||||
@ -681,7 +683,8 @@ bool Power::axpChipInit()
|
|||||||
// GNSS VDD 3300mV
|
// GNSS VDD 3300mV
|
||||||
PMU->setPowerChannelVoltage(XPOWERS_ALDO3, 3300);
|
PMU->setPowerChannelVoltage(XPOWERS_ALDO3, 3300);
|
||||||
PMU->enablePowerOutput(XPOWERS_ALDO3);
|
PMU->enablePowerOutput(XPOWERS_ALDO3);
|
||||||
} else if (HW_VENDOR == meshtastic_HardwareModel_LILYGO_TBEAM_S3_CORE) {
|
} else if (HW_VENDOR == meshtastic_HardwareModel_LILYGO_TBEAM_S3_CORE ||
|
||||||
|
HW_VENDOR == meshtastic_HardwareModel_T_WATCH_S3) {
|
||||||
// t-beam s3 core
|
// t-beam s3 core
|
||||||
/**
|
/**
|
||||||
* gnss module power channel
|
* gnss module power channel
|
||||||
@ -716,6 +719,12 @@ bool Power::axpChipInit()
|
|||||||
PMU->setPowerChannelVoltage(XPOWERS_BLDO1, 3300);
|
PMU->setPowerChannelVoltage(XPOWERS_BLDO1, 3300);
|
||||||
PMU->enablePowerOutput(XPOWERS_BLDO1);
|
PMU->enablePowerOutput(XPOWERS_BLDO1);
|
||||||
|
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
// DRV2605 power channel
|
||||||
|
PMU->setPowerChannelVoltage(XPOWERS_BLDO2, 3300);
|
||||||
|
PMU->enablePowerOutput(XPOWERS_BLDO2);
|
||||||
|
#endif
|
||||||
|
|
||||||
// PMU->setPowerChannelVoltage(XPOWERS_DCDC4, 3300);
|
// PMU->setPowerChannelVoltage(XPOWERS_DCDC4, 3300);
|
||||||
// PMU->enablePowerOutput(XPOWERS_DCDC4);
|
// PMU->enablePowerOutput(XPOWERS_DCDC4);
|
||||||
|
|
||||||
|
@ -123,6 +123,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
#define MPU6050_ADDR 0x68
|
#define MPU6050_ADDR 0x68
|
||||||
#define LIS3DH_ADR 0x18
|
#define LIS3DH_ADR 0x18
|
||||||
|
#define BMA423_ADDR 0x19
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// LED
|
// LED
|
||||||
@ -193,4 +194,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
#ifndef HW_VENDOR
|
#ifndef HW_VENDOR
|
||||||
#error HW_VENDOR must be defined
|
#error HW_VENDOR must be defined
|
||||||
#endif
|
#endif
|
@ -36,8 +36,8 @@ ScanI2C::FoundDevice ScanI2C::firstKeyboard() const
|
|||||||
|
|
||||||
ScanI2C::FoundDevice ScanI2C::firstAccelerometer() const
|
ScanI2C::FoundDevice ScanI2C::firstAccelerometer() const
|
||||||
{
|
{
|
||||||
ScanI2C::DeviceType types[] = {MPU6050, LIS3DH};
|
ScanI2C::DeviceType types[] = {MPU6050, LIS3DH, BMA423};
|
||||||
return firstOfOrNONE(2, types);
|
return firstOfOrNONE(3, types);
|
||||||
}
|
}
|
||||||
|
|
||||||
ScanI2C::FoundDevice ScanI2C::find(ScanI2C::DeviceType) const
|
ScanI2C::FoundDevice ScanI2C::find(ScanI2C::DeviceType) const
|
||||||
@ -73,4 +73,4 @@ bool ScanI2C::DeviceAddress::operator<(const ScanI2C::DeviceAddress &other) cons
|
|||||||
|| (port != NO_I2C && other.port != NO_I2C && (address < other.address));
|
|| (port != NO_I2C && other.port != NO_I2C && (address < other.address));
|
||||||
}
|
}
|
||||||
|
|
||||||
ScanI2C::FoundDevice::FoundDevice(ScanI2C::DeviceType type, ScanI2C::DeviceAddress address) : type(type), address(address) {}
|
ScanI2C::FoundDevice::FoundDevice(ScanI2C::DeviceType type, ScanI2C::DeviceAddress address) : type(type), address(address) {}
|
@ -33,6 +33,7 @@ class ScanI2C
|
|||||||
PMSA0031,
|
PMSA0031,
|
||||||
MPU6050,
|
MPU6050,
|
||||||
LIS3DH,
|
LIS3DH,
|
||||||
|
BMA423,
|
||||||
#ifdef HAS_NCP5623
|
#ifdef HAS_NCP5623
|
||||||
NCP5623,
|
NCP5623,
|
||||||
#endif
|
#endif
|
||||||
|
@ -274,6 +274,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port)
|
|||||||
|
|
||||||
SCAN_SIMPLE_CASE(PMSA0031_ADDR, PMSA0031, "PMSA0031 air quality sensor found\n")
|
SCAN_SIMPLE_CASE(PMSA0031_ADDR, PMSA0031, "PMSA0031 air quality sensor found\n")
|
||||||
SCAN_SIMPLE_CASE(MPU6050_ADDR, MPU6050, "MPU6050 accelerometer found\n");
|
SCAN_SIMPLE_CASE(MPU6050_ADDR, MPU6050, "MPU6050 accelerometer found\n");
|
||||||
|
SCAN_SIMPLE_CASE(BMA423_ADDR, BMA423, "BMA423 accelerometer found\n");
|
||||||
|
|
||||||
default:
|
default:
|
||||||
LOG_INFO("Device found at address 0x%x was not able to be enumerated\n", addr.address);
|
LOG_INFO("Device found at address 0x%x was not able to be enumerated\n", addr.address);
|
||||||
|
@ -944,6 +944,9 @@ void Screen::handleSetOn(bool on)
|
|||||||
if (on != screenOn) {
|
if (on != screenOn) {
|
||||||
if (on) {
|
if (on) {
|
||||||
LOG_INFO("Turning on screen\n");
|
LOG_INFO("Turning on screen\n");
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
PMU->enablePowerOutput(XPOWERS_ALDO2);
|
||||||
|
#endif
|
||||||
dispdev.displayOn();
|
dispdev.displayOn();
|
||||||
dispdev.displayOn();
|
dispdev.displayOn();
|
||||||
enabled = true;
|
enabled = true;
|
||||||
@ -952,6 +955,9 @@ void Screen::handleSetOn(bool on)
|
|||||||
} else {
|
} else {
|
||||||
LOG_INFO("Turning off screen\n");
|
LOG_INFO("Turning off screen\n");
|
||||||
dispdev.displayOff();
|
dispdev.displayOff();
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
PMU->disablePowerOutput(XPOWERS_ALDO2);
|
||||||
|
#endif
|
||||||
enabled = false;
|
enabled = false;
|
||||||
}
|
}
|
||||||
screenOn = on;
|
screenOn = on;
|
||||||
|
@ -313,6 +313,13 @@ class Screen : public concurrency::OSThread
|
|||||||
|
|
||||||
void setWelcomeFrames();
|
void setWelcomeFrames();
|
||||||
|
|
||||||
|
void getTouch(int *x, int *y)
|
||||||
|
{
|
||||||
|
#if defined(ST7735_CS) || defined(ILI9341_DRIVER) || defined(ST7789_CS)
|
||||||
|
dispdev.getTouch(x, y);
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// Updates the UI.
|
/// Updates the UI.
|
||||||
//
|
//
|
||||||
@ -394,4 +401,4 @@ class Screen : public concurrency::OSThread
|
|||||||
};
|
};
|
||||||
|
|
||||||
} // namespace graphics
|
} // namespace graphics
|
||||||
#endif
|
#endif
|
@ -108,7 +108,11 @@ class LGFX : public lgfx::LGFX_Device
|
|||||||
lgfx::Panel_ST7789 _panel_instance;
|
lgfx::Panel_ST7789 _panel_instance;
|
||||||
lgfx::Bus_SPI _bus_instance;
|
lgfx::Bus_SPI _bus_instance;
|
||||||
lgfx::Light_PWM _light_instance;
|
lgfx::Light_PWM _light_instance;
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
lgfx::Touch_FT5x06 _touch_instance;
|
||||||
|
#else
|
||||||
lgfx::Touch_GT911 _touch_instance;
|
lgfx::Touch_GT911 _touch_instance;
|
||||||
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LGFX(void)
|
LGFX(void)
|
||||||
@ -194,8 +198,13 @@ class LGFX : public lgfx::LGFX_Device
|
|||||||
// I2C
|
// I2C
|
||||||
cfg.i2c_port = 1;
|
cfg.i2c_port = 1;
|
||||||
cfg.i2c_addr = TOUCH_SLAVE_ADDRESS;
|
cfg.i2c_addr = TOUCH_SLAVE_ADDRESS;
|
||||||
|
#ifdef SCREEN_TOUCH_USE_I2C1
|
||||||
|
cfg.pin_sda = I2C_SDA1;
|
||||||
|
cfg.pin_scl = I2C_SCL1;
|
||||||
|
#else
|
||||||
cfg.pin_sda = I2C_SDA;
|
cfg.pin_sda = I2C_SDA;
|
||||||
cfg.pin_scl = I2C_SCL;
|
cfg.pin_scl = I2C_SCL;
|
||||||
|
#endif
|
||||||
cfg.freq = 400000;
|
cfg.freq = 400000;
|
||||||
|
|
||||||
_touch_instance.config(cfg);
|
_touch_instance.config(cfg);
|
||||||
@ -261,7 +270,7 @@ void TFTDisplay::sendCommand(uint8_t com)
|
|||||||
// handle display on/off directly
|
// handle display on/off directly
|
||||||
switch (com) {
|
switch (com) {
|
||||||
case DISPLAYON: {
|
case DISPLAYON: {
|
||||||
#ifdef TFT_BL
|
#if defined(TFT_BL) && defined(TFT_BACKLIGHT_ON)
|
||||||
digitalWrite(TFT_BL, TFT_BACKLIGHT_ON);
|
digitalWrite(TFT_BL, TFT_BACKLIGHT_ON);
|
||||||
#endif
|
#endif
|
||||||
#ifdef VTFT_CTRL
|
#ifdef VTFT_CTRL
|
||||||
@ -270,7 +279,7 @@ void TFTDisplay::sendCommand(uint8_t com)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DISPLAYOFF: {
|
case DISPLAYOFF: {
|
||||||
#ifdef TFT_BL
|
#if defined(TFT_BL) && defined(TFT_BACKLIGHT_ON)
|
||||||
digitalWrite(TFT_BL, !TFT_BACKLIGHT_ON);
|
digitalWrite(TFT_BL, !TFT_BACKLIGHT_ON);
|
||||||
#endif
|
#endif
|
||||||
#ifdef VTFT_CTRL
|
#ifdef VTFT_CTRL
|
||||||
@ -304,6 +313,8 @@ bool TFTDisplay::connect()
|
|||||||
tft.init();
|
tft.init();
|
||||||
#if defined(M5STACK) || defined(T_DECK)
|
#if defined(M5STACK) || defined(T_DECK)
|
||||||
tft.setRotation(1); // M5Stack/T-Deck have the TFT in landscape
|
tft.setRotation(1); // M5Stack/T-Deck have the TFT in landscape
|
||||||
|
#elif defined(T_WATCH_S3)
|
||||||
|
tft.setRotation(0); // T-Watch S3 has the TFT in portrait
|
||||||
#else
|
#else
|
||||||
tft.setRotation(3); // Orient horizontal and wide underneath the silkscreen name label
|
tft.setRotation(3); // Orient horizontal and wide underneath the silkscreen name label
|
||||||
#endif
|
#endif
|
||||||
@ -311,4 +322,12 @@ bool TFTDisplay::connect()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get touch coords from the display
|
||||||
|
void TFTDisplay::getTouch(int *x, int *y)
|
||||||
|
{
|
||||||
|
#ifndef M5STACK
|
||||||
|
tft.getTouch(x, y);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -28,6 +28,8 @@ class TFTDisplay : public OLEDDisplay
|
|||||||
*/
|
*/
|
||||||
void setDetected(uint8_t detected);
|
void setDetected(uint8_t detected);
|
||||||
|
|
||||||
|
void getTouch(int *x, int *y);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// the header size of the buffer used, e.g. for the SPI command header
|
// the header size of the buffer used, e.g. for the SPI command header
|
||||||
virtual int getBufferOffset(void) override { return 0; }
|
virtual int getBufferOffset(void) override { return 0; }
|
||||||
@ -37,4 +39,4 @@ class TFTDisplay : public OLEDDisplay
|
|||||||
|
|
||||||
// Connect to the display
|
// Connect to the display
|
||||||
virtual bool connect() override;
|
virtual bool connect() override;
|
||||||
};
|
};
|
14
src/main.cpp
14
src/main.cpp
@ -110,6 +110,11 @@ ScanI2C::FoundDevice rgb_found = ScanI2C::FoundDevice(ScanI2C::DeviceType::NONE,
|
|||||||
ATECCX08A atecc;
|
ATECCX08A atecc;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
Adafruit_DRV2605 drv;
|
||||||
|
#endif
|
||||||
|
bool isVibrating = false;
|
||||||
|
|
||||||
bool eink_found = true;
|
bool eink_found = true;
|
||||||
|
|
||||||
uint32_t serialSinceMsec;
|
uint32_t serialSinceMsec;
|
||||||
@ -485,10 +490,19 @@ void setup()
|
|||||||
|
|
||||||
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
|
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
|
||||||
if (acc_info.type != ScanI2C::DeviceType::NONE) {
|
if (acc_info.type != ScanI2C::DeviceType::NONE) {
|
||||||
|
config.display.wake_on_tap_or_motion = true;
|
||||||
|
moduleConfig.external_notification.enabled = true;
|
||||||
accelerometerThread = new AccelerometerThread(acc_info.type);
|
accelerometerThread = new AccelerometerThread(acc_info.type);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
drv.begin();
|
||||||
|
drv.selectLibrary(1);
|
||||||
|
// I2C trigger by sending 'go' command
|
||||||
|
drv.setMode(DRV2605_MODE_INTTRIG);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Init our SPI controller (must be before screen and lora)
|
// Init our SPI controller (must be before screen and lora)
|
||||||
initSPI();
|
initSPI();
|
||||||
#ifdef ARCH_RP2040
|
#ifdef ARCH_RP2040
|
||||||
|
@ -38,6 +38,12 @@ extern bool isUSBPowered;
|
|||||||
extern ATECCX08A atecc;
|
extern ATECCX08A atecc;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
#include <Adafruit_DRV2605.h>
|
||||||
|
extern Adafruit_DRV2605 drv;
|
||||||
|
#endif
|
||||||
|
extern bool isVibrating;
|
||||||
|
|
||||||
extern int TCPPort; // set by Portduino
|
extern int TCPPort; // set by Portduino
|
||||||
|
|
||||||
// Global Screen singleton.
|
// Global Screen singleton.
|
||||||
|
@ -168,6 +168,7 @@ void NodeDB::installDefaultConfig()
|
|||||||
config.has_network = true;
|
config.has_network = true;
|
||||||
config.has_bluetooth = true;
|
config.has_bluetooth = true;
|
||||||
config.device.rebroadcast_mode = meshtastic_Config_DeviceConfig_RebroadcastMode_ALL;
|
config.device.rebroadcast_mode = meshtastic_Config_DeviceConfig_RebroadcastMode_ALL;
|
||||||
|
|
||||||
config.lora.sx126x_rx_boosted_gain = false;
|
config.lora.sx126x_rx_boosted_gain = false;
|
||||||
config.lora.tx_enabled =
|
config.lora.tx_enabled =
|
||||||
true; // FIXME: maybe false in the future, and setting region to enable it. (unset region forces it off)
|
true; // FIXME: maybe false in the future, and setting region to enable it. (unset region forces it off)
|
||||||
@ -198,6 +199,11 @@ void NodeDB::installDefaultConfig()
|
|||||||
config.position.position_flags =
|
config.position.position_flags =
|
||||||
(meshtastic_Config_PositionConfig_PositionFlags_ALTITUDE | meshtastic_Config_PositionConfig_PositionFlags_ALTITUDE_MSL);
|
(meshtastic_Config_PositionConfig_PositionFlags_ALTITUDE | meshtastic_Config_PositionConfig_PositionFlags_ALTITUDE_MSL);
|
||||||
|
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
config.display.screen_on_secs = 30;
|
||||||
|
config.display.wake_on_tap_or_motion = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
initConfigIntervals();
|
initConfigIntervals();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,6 +242,10 @@ void NodeDB::installDefaultModuleConfig()
|
|||||||
moduleConfig.external_notification.alert_message = true;
|
moduleConfig.external_notification.alert_message = true;
|
||||||
moduleConfig.external_notification.output_ms = 1000;
|
moduleConfig.external_notification.output_ms = 1000;
|
||||||
moduleConfig.external_notification.nag_timeout = 60;
|
moduleConfig.external_notification.nag_timeout = 60;
|
||||||
|
#endif
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
// Don't worry about the other settings, we'll use the DRV2056 behavior for notifications
|
||||||
|
moduleConfig.external_notification.enabled = true;
|
||||||
#endif
|
#endif
|
||||||
moduleConfig.has_canned_message = true;
|
moduleConfig.has_canned_message = true;
|
||||||
|
|
||||||
@ -920,4 +930,4 @@ void recordCriticalError(meshtastic_CriticalErrorCode code, uint32_t address, co
|
|||||||
LOG_ERROR("A critical failure occurred, portduino is exiting...");
|
LOG_ERROR("A critical failure occurred, portduino is exiting...");
|
||||||
exit(2);
|
exit(2);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
@ -707,7 +707,7 @@ typedef struct _meshtastic_ToRadio {
|
|||||||
(Sending this message is optional for clients) */
|
(Sending this message is optional for clients) */
|
||||||
bool disconnect;
|
bool disconnect;
|
||||||
meshtastic_XModem xmodemPacket;
|
meshtastic_XModem xmodemPacket;
|
||||||
/* MQTT Client Proxy Message */
|
/* MQTT Client Proxy Message (for client / phone subscribed to MQTT sending to device) */
|
||||||
meshtastic_MqttClientProxyMessage mqttClientProxyMessage;
|
meshtastic_MqttClientProxyMessage mqttClientProxyMessage;
|
||||||
};
|
};
|
||||||
} meshtastic_ToRadio;
|
} meshtastic_ToRadio;
|
||||||
@ -806,7 +806,7 @@ typedef struct _meshtastic_FromRadio {
|
|||||||
meshtastic_XModem xmodemPacket;
|
meshtastic_XModem xmodemPacket;
|
||||||
/* Device metadata message */
|
/* Device metadata message */
|
||||||
meshtastic_DeviceMetadata metadata;
|
meshtastic_DeviceMetadata metadata;
|
||||||
/* MQTT Client Proxy Message */
|
/* MQTT Client Proxy Message (device sending to client / phone for publishing to MQTT) */
|
||||||
meshtastic_MqttClientProxyMessage mqttClientProxyMessage;
|
meshtastic_MqttClientProxyMessage mqttClientProxyMessage;
|
||||||
};
|
};
|
||||||
} meshtastic_FromRadio;
|
} meshtastic_FromRadio;
|
||||||
|
@ -93,6 +93,10 @@ int32_t ExternalNotificationModule::runOnce()
|
|||||||
rgb.setColor(red, green, blue);
|
rgb.setColor(red, green, blue);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
drv.go();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// now let the PWM buzzer play
|
// now let the PWM buzzer play
|
||||||
@ -124,7 +128,8 @@ void ExternalNotificationModule::setExternalOn(uint8_t index)
|
|||||||
digitalWrite(moduleConfig.external_notification.output_buzzer, true);
|
digitalWrite(moduleConfig.external_notification.output_buzzer, true);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
digitalWrite(output, (moduleConfig.external_notification.active ? true : false));
|
if (output > 0)
|
||||||
|
digitalWrite(output, (moduleConfig.external_notification.active ? true : false));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef HAS_NCP5623
|
#ifdef HAS_NCP5623
|
||||||
@ -132,6 +137,9 @@ void ExternalNotificationModule::setExternalOn(uint8_t index)
|
|||||||
rgb.setColor(red, green, blue);
|
rgb.setColor(red, green, blue);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
drv.go();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExternalNotificationModule::setExternalOff(uint8_t index)
|
void ExternalNotificationModule::setExternalOff(uint8_t index)
|
||||||
@ -149,7 +157,8 @@ void ExternalNotificationModule::setExternalOff(uint8_t index)
|
|||||||
digitalWrite(moduleConfig.external_notification.output_buzzer, false);
|
digitalWrite(moduleConfig.external_notification.output_buzzer, false);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
digitalWrite(output, (moduleConfig.external_notification.active ? false : true));
|
if (output > 0)
|
||||||
|
digitalWrite(output, (moduleConfig.external_notification.active ? false : true));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,6 +170,9 @@ void ExternalNotificationModule::setExternalOff(uint8_t index)
|
|||||||
rgb.setColor(red, green, blue);
|
rgb.setColor(red, green, blue);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
drv.stop();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ExternalNotificationModule::getExternal(uint8_t index)
|
bool ExternalNotificationModule::getExternal(uint8_t index)
|
||||||
@ -174,6 +186,9 @@ void ExternalNotificationModule::stopNow()
|
|||||||
nagCycleCutoff = 1; // small value
|
nagCycleCutoff = 1; // small value
|
||||||
isNagging = false;
|
isNagging = false;
|
||||||
setIntervalFromNow(0);
|
setIntervalFromNow(0);
|
||||||
|
#ifdef T_WATCH_S3
|
||||||
|
drv.stop();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ExternalNotificationModule::ExternalNotificationModule()
|
ExternalNotificationModule::ExternalNotificationModule()
|
||||||
@ -185,7 +200,6 @@ ExternalNotificationModule::ExternalNotificationModule()
|
|||||||
without having to configure it from the PythonAPI or WebUI.
|
without having to configure it from the PythonAPI or WebUI.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// moduleConfig.external_notification.enabled = true;
|
|
||||||
// moduleConfig.external_notification.alert_message = true;
|
// moduleConfig.external_notification.alert_message = true;
|
||||||
// moduleConfig.external_notification.alert_message_buzzer = true;
|
// moduleConfig.external_notification.alert_message_buzzer = true;
|
||||||
// moduleConfig.external_notification.alert_message_vibra = true;
|
// moduleConfig.external_notification.alert_message_vibra = true;
|
||||||
@ -213,8 +227,10 @@ ExternalNotificationModule::ExternalNotificationModule()
|
|||||||
: EXT_NOTIFICATION_MODULE_OUTPUT;
|
: EXT_NOTIFICATION_MODULE_OUTPUT;
|
||||||
|
|
||||||
// Set the direction of a pin
|
// Set the direction of a pin
|
||||||
LOG_INFO("Using Pin %i in digital mode\n", output);
|
if (output > 0) {
|
||||||
pinMode(output, OUTPUT);
|
LOG_INFO("Using Pin %i in digital mode\n", output);
|
||||||
|
pinMode(output, OUTPUT);
|
||||||
|
}
|
||||||
setExternalOff(0);
|
setExternalOff(0);
|
||||||
externalTurnedOn[0] = 0;
|
externalTurnedOn[0] = 0;
|
||||||
if (moduleConfig.external_notification.output_vibra) {
|
if (moduleConfig.external_notification.output_vibra) {
|
||||||
@ -250,7 +266,12 @@ ExternalNotificationModule::ExternalNotificationModule()
|
|||||||
ProcessMessage ExternalNotificationModule::handleReceived(const meshtastic_MeshPacket &mp)
|
ProcessMessage ExternalNotificationModule::handleReceived(const meshtastic_MeshPacket &mp)
|
||||||
{
|
{
|
||||||
if (moduleConfig.external_notification.enabled) {
|
if (moduleConfig.external_notification.enabled) {
|
||||||
|
#if T_WATCH_S3
|
||||||
|
drv.setWaveform(0, 75);
|
||||||
|
drv.setWaveform(1, 56);
|
||||||
|
drv.setWaveform(2, 0);
|
||||||
|
drv.go();
|
||||||
|
#endif
|
||||||
if (getFrom(&mp) != nodeDB.getNodeNum()) {
|
if (getFrom(&mp) != nodeDB.getNodeNum()) {
|
||||||
|
|
||||||
// Check if the message contains a bell character. Don't do this loop for every pin, just once.
|
// Check if the message contains a bell character. Don't do this loop for every pin, just once.
|
||||||
@ -343,7 +364,6 @@ ProcessMessage ExternalNotificationModule::handleReceived(const meshtastic_MeshP
|
|||||||
}
|
}
|
||||||
setIntervalFromNow(0); // run once so we know if we should do something
|
setIntervalFromNow(0); // run once so we know if we should do something
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
LOG_INFO("External Notification Module Disabled\n");
|
LOG_INFO("External Notification Module Disabled\n");
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,10 @@
|
|||||||
#if defined(HAS_AXP192) || defined(HAS_AXP2101)
|
#if defined(HAS_AXP192) || defined(HAS_AXP2101)
|
||||||
#define HAS_PMU
|
#define HAS_PMU
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef PIN_BUTTON_TOUCH
|
||||||
|
#define BUTTON_PIN_TOUCH PIN_BUTTON_TOUCH
|
||||||
|
#endif
|
||||||
//
|
//
|
||||||
// set HW_VENDOR
|
// set HW_VENDOR
|
||||||
//
|
//
|
||||||
@ -83,6 +87,8 @@
|
|||||||
#define HW_VENDOR meshtastic_HardwareModel_TLORA_V2_1_1P8
|
#define HW_VENDOR meshtastic_HardwareModel_TLORA_V2_1_1P8
|
||||||
#elif defined(T_DECK)
|
#elif defined(T_DECK)
|
||||||
#define HW_VENDOR meshtastic_HardwareModel_T_DECK
|
#define HW_VENDOR meshtastic_HardwareModel_T_DECK
|
||||||
|
#elif defined(T_WATCH_S3)
|
||||||
|
#define HW_VENDOR meshtastic_HardwareModel_T_WATCH_S3
|
||||||
#elif defined(GENIEBLOCKS)
|
#elif defined(GENIEBLOCKS)
|
||||||
#define HW_VENDOR meshtastic_HardwareModel_GENIEBLOCKS
|
#define HW_VENDOR meshtastic_HardwareModel_GENIEBLOCKS
|
||||||
#elif defined(PRIVATE_HW)
|
#elif defined(PRIVATE_HW)
|
||||||
|
@ -23,11 +23,6 @@ esp_sleep_source_t wakeCause; // the reason we booted this time
|
|||||||
#define INCLUDE_vTaskSuspend 0
|
#define INCLUDE_vTaskSuspend 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAS_PMU
|
|
||||||
#include "XPowersLibInterface.hpp"
|
|
||||||
extern XPowersLibInterface *PMU;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/// Called to ask any observers if they want to veto sleep. Return 1 to veto or 0 to allow sleep to happen
|
/// Called to ask any observers if they want to veto sleep. Return 1 to veto or 0 to allow sleep to happen
|
||||||
Observable<void *> preflightSleep;
|
Observable<void *> preflightSleep;
|
||||||
|
|
||||||
@ -259,7 +254,8 @@ void doDeepSleep(uint32_t msecToWake)
|
|||||||
if (HW_VENDOR == meshtastic_HardwareModel_TBEAM) {
|
if (HW_VENDOR == meshtastic_HardwareModel_TBEAM) {
|
||||||
// t-beam v1.2 radio power channel
|
// t-beam v1.2 radio power channel
|
||||||
PMU->disablePowerOutput(XPOWERS_ALDO2); // lora radio power channel
|
PMU->disablePowerOutput(XPOWERS_ALDO2); // lora radio power channel
|
||||||
} else if (HW_VENDOR == meshtastic_HardwareModel_LILYGO_TBEAM_S3_CORE) {
|
} else if (HW_VENDOR == meshtastic_HardwareModel_LILYGO_TBEAM_S3_CORE ||
|
||||||
|
HW_VENDOR == meshtastic_HardwareModel_T_WATCH_S3) {
|
||||||
PMU->disablePowerOutput(XPOWERS_ALDO3); // lora radio power channel
|
PMU->disablePowerOutput(XPOWERS_ALDO3); // lora radio power channel
|
||||||
}
|
}
|
||||||
} else if (model == XPOWERS_AXP192) {
|
} else if (model == XPOWERS_AXP192) {
|
||||||
@ -388,4 +384,4 @@ void enableModemSleep()
|
|||||||
int rv = esp_pm_configure(&esp32_config);
|
int rv = esp_pm_configure(&esp32_config);
|
||||||
LOG_DEBUG("Sleep request result %x\n", rv);
|
LOG_DEBUG("Sleep request result %x\n", rv);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
@ -12,6 +12,12 @@ esp_sleep_wakeup_cause_t doLightSleep(uint64_t msecToWake);
|
|||||||
|
|
||||||
extern esp_sleep_source_t wakeCause;
|
extern esp_sleep_source_t wakeCause;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAS_PMU
|
||||||
|
#include "XPowersLibInterface.hpp"
|
||||||
|
extern XPowersLibInterface *PMU;
|
||||||
|
#endif
|
||||||
|
|
||||||
void setGPSPower(bool on);
|
void setGPSPower(bool on);
|
||||||
void doGPSpowersave(bool on);
|
void doGPSpowersave(bool on);
|
||||||
// Perform power on init that we do on each wake from deep sleep
|
// Perform power on init that we do on each wake from deep sleep
|
||||||
|
@ -35,7 +35,10 @@
|
|||||||
#define SX126X_DIO1 LORA_DIO1
|
#define SX126X_DIO1 LORA_DIO1
|
||||||
#define SX126X_BUSY LORA_DIO2
|
#define SX126X_BUSY LORA_DIO2
|
||||||
#define SX126X_RESET LORA_RESET
|
#define SX126X_RESET LORA_RESET
|
||||||
|
#define SX126X_RXEN 14
|
||||||
|
#define SX126X_TXEN RADIOLIB_NC
|
||||||
|
#define E22_TXEN_CONNECTED_TO_DIO2 1
|
||||||
|
|
||||||
// Set lora.tx_power to 13 for Hydra or other E22 900M30S target due to PA
|
// Set lora.tx_power to 13 for Hydra or other E22 900M30S target due to PA
|
||||||
#define SX126X_MAX_POWER 13
|
#define SX126X_MAX_POWER 13
|
||||||
#define SX126X_E22
|
#define SX126X_E22
|
||||||
|
64
variants/t-watch-s3/pins_arduino.h
Normal file
64
variants/t-watch-s3/pins_arduino.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#ifndef Pins_Arduino_h
|
||||||
|
#define Pins_Arduino_h
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define EXTERNAL_NUM_INTERRUPTS 46
|
||||||
|
#define NUM_DIGITAL_PINS 48
|
||||||
|
#define NUM_ANALOG_INPUTS 20
|
||||||
|
|
||||||
|
#define analogInputToDigitalPin(p) (((p) < NUM_ANALOG_INPUTS) ? (analogChannelToDigitalPin(p)) : -1)
|
||||||
|
#define digitalPinToInterrupt(p) (((p) < NUM_DIGITAL_PINS) ? (p) : -1)
|
||||||
|
#define digitalPinHasPWM(p) (p < EXTERNAL_NUM_INTERRUPTS)
|
||||||
|
|
||||||
|
// static const uint8_t LED_BUILTIN = -1;
|
||||||
|
|
||||||
|
// static const uint8_t TX = 43;
|
||||||
|
// static const uint8_t RX = 44;
|
||||||
|
|
||||||
|
static const uint8_t SDA = 10;
|
||||||
|
static const uint8_t SCL = 11;
|
||||||
|
|
||||||
|
// Default SPI will be mapped to Radio
|
||||||
|
static const uint8_t SS = 5;
|
||||||
|
static const uint8_t MOSI = 1;
|
||||||
|
static const uint8_t MISO = 4;
|
||||||
|
static const uint8_t SCK = 3;
|
||||||
|
|
||||||
|
static const uint8_t A0 = 1;
|
||||||
|
static const uint8_t A1 = 2;
|
||||||
|
static const uint8_t A2 = 3;
|
||||||
|
static const uint8_t A3 = 4;
|
||||||
|
static const uint8_t A4 = 5;
|
||||||
|
static const uint8_t A5 = 6;
|
||||||
|
static const uint8_t A6 = 7;
|
||||||
|
static const uint8_t A7 = 8;
|
||||||
|
static const uint8_t A8 = 9;
|
||||||
|
static const uint8_t A9 = 10;
|
||||||
|
static const uint8_t A10 = 11;
|
||||||
|
static const uint8_t A11 = 12;
|
||||||
|
static const uint8_t A12 = 13;
|
||||||
|
static const uint8_t A13 = 14;
|
||||||
|
static const uint8_t A14 = 15;
|
||||||
|
static const uint8_t A15 = 16;
|
||||||
|
static const uint8_t A16 = 17;
|
||||||
|
static const uint8_t A17 = 18;
|
||||||
|
static const uint8_t A18 = 19;
|
||||||
|
static const uint8_t A19 = 20;
|
||||||
|
|
||||||
|
static const uint8_t T1 = 1;
|
||||||
|
static const uint8_t T2 = 2;
|
||||||
|
static const uint8_t T3 = 3;
|
||||||
|
static const uint8_t T4 = 4;
|
||||||
|
static const uint8_t T5 = 5;
|
||||||
|
static const uint8_t T6 = 6;
|
||||||
|
static const uint8_t T7 = 7;
|
||||||
|
static const uint8_t T8 = 8;
|
||||||
|
static const uint8_t T9 = 9;
|
||||||
|
static const uint8_t T10 = 10;
|
||||||
|
static const uint8_t T11 = 11;
|
||||||
|
static const uint8_t T12 = 12;
|
||||||
|
static const uint8_t T13 = 13;
|
||||||
|
static const uint8_t T14 = 14;
|
||||||
|
|
||||||
|
#endif /* Pins_Arduino_h */
|
17
variants/t-watch-s3/platformio.ini
Normal file
17
variants/t-watch-s3/platformio.ini
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
; LilyGo T-Watch S3
|
||||||
|
[env:t-watch-s3]
|
||||||
|
extends = esp32s3_base
|
||||||
|
board = t-watch-s3
|
||||||
|
upload_protocol = esptool
|
||||||
|
upload_speed = 115200
|
||||||
|
#upload_port = /dev/tty.usbmodem3485188D636C1
|
||||||
|
|
||||||
|
build_flags = ${esp32_base.build_flags}
|
||||||
|
-DT_WATCH_S3
|
||||||
|
-Ivariants/t-watch-s3
|
||||||
|
-DPCF8563_RTC=0x51
|
||||||
|
|
||||||
|
lib_deps = ${esp32s3_base.lib_deps}
|
||||||
|
lovyan03/LovyanGFX@^1.1.7
|
||||||
|
lewisxhe/PCF8563_Library@1.0.1
|
||||||
|
adafruit/Adafruit DRV2605 Library@^1.2.2
|
64
variants/t-watch-s3/variant.h
Normal file
64
variants/t-watch-s3/variant.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
// ST7789 TFT LCD
|
||||||
|
#define ST7789_CS 12
|
||||||
|
#define ST7789_RS 38 // DC
|
||||||
|
#define ST7789_SDA 13 // MOSI
|
||||||
|
#define ST7789_SCK 18
|
||||||
|
#define ST7789_RESET -1
|
||||||
|
#define ST7789_MISO -1
|
||||||
|
#define ST7789_BUSY -1
|
||||||
|
#define ST7789_BL 45
|
||||||
|
#define ST7789_SPI_HOST SPI3_HOST
|
||||||
|
#define ST7789_BACKLIGHT_EN 45
|
||||||
|
#define SPI_FREQUENCY 40000000
|
||||||
|
#define SPI_READ_FREQUENCY 16000000
|
||||||
|
#define TFT_HEIGHT 240
|
||||||
|
#define TFT_WIDTH 240
|
||||||
|
#define TFT_OFFSET_X 0
|
||||||
|
#define TFT_OFFSET_Y 0
|
||||||
|
#define SCREEN_ROTATE
|
||||||
|
#define SCREEN_TRANSITION_FRAMERATE 1 // fps
|
||||||
|
#define SCREEN_TOUCH_INT 16
|
||||||
|
#define SCREEN_TOUCH_USE_I2C1 1
|
||||||
|
#define TOUCH_SLAVE_ADDRESS 0x38 // GT911
|
||||||
|
|
||||||
|
#define I2C_SDA1 39 // Used for capacitive touch
|
||||||
|
#define I2C_SCL1 40 // Used for capacitive touch
|
||||||
|
|
||||||
|
#define TFT_BL ST7789_BACKLIGHT_EN
|
||||||
|
|
||||||
|
#define HAS_AXP2101
|
||||||
|
|
||||||
|
#define HAS_RTC 1
|
||||||
|
|
||||||
|
#define I2C_SDA 10 // For QMC6310 sensors and screens
|
||||||
|
#define I2C_SCL 11 // For QMC6310 sensors and screens
|
||||||
|
|
||||||
|
#define BUTTON_PIN 0
|
||||||
|
|
||||||
|
#define BMA4XX_INT 14 // Interrupt for BMA_423 axis sensor
|
||||||
|
|
||||||
|
#define HAS_GPS 0
|
||||||
|
#undef GPS_RX_PIN
|
||||||
|
#undef GPS_TX_PIN
|
||||||
|
|
||||||
|
#define USE_SX1262
|
||||||
|
#define USE_SX1268
|
||||||
|
|
||||||
|
#define RF95_SCK 3
|
||||||
|
#define RF95_MISO 4
|
||||||
|
#define RF95_MOSI 1
|
||||||
|
#define RF95_NSS 5
|
||||||
|
|
||||||
|
#define LORA_DIO0 -1 // a No connect on the SX1262 module
|
||||||
|
#define LORA_RESET 8
|
||||||
|
#define LORA_DIO1 9 // SX1262 IRQ
|
||||||
|
#define LORA_DIO2 7 // SX1262 BUSY
|
||||||
|
#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262, if DIO3 is high the TXCO is enabled
|
||||||
|
|
||||||
|
#define SX126X_CS RF95_NSS // FIXME - we really should define LORA_CS instead
|
||||||
|
#define SX126X_DIO1 LORA_DIO1
|
||||||
|
#define SX126X_BUSY LORA_DIO2
|
||||||
|
#define SX126X_RESET LORA_RESET
|
||||||
|
#define SX126X_E22 // Not really an E22 but TTGO seems to be trying to clone that
|
||||||
|
// Internally the TTGO module hooks the SX1262-DIO2 in to control the TX/RX switch (which is the default for
|
||||||
|
// the sx1262interface code)
|
@ -39,6 +39,8 @@
|
|||||||
// #define PMU_IRQ 40
|
// #define PMU_IRQ 40
|
||||||
#define HAS_AXP2101
|
#define HAS_AXP2101
|
||||||
|
|
||||||
|
#define HAS_RTC 1
|
||||||
|
|
||||||
// Specify the PMU as Wire1. In the t-beam-s3 core, PCF8563 and PMU share the bus
|
// Specify the PMU as Wire1. In the t-beam-s3 core, PCF8563 and PMU share the bus
|
||||||
#define PMU_USE_WIRE1
|
#define PMU_USE_WIRE1
|
||||||
#define RTC_USE_WIRE1
|
#define RTC_USE_WIRE1
|
||||||
@ -59,8 +61,6 @@
|
|||||||
// PCF8563 RTC Module
|
// PCF8563 RTC Module
|
||||||
// #define PCF8563_RTC 0x51 //Putting definitions in variant. h does not compile correctly
|
// #define PCF8563_RTC 0x51 //Putting definitions in variant. h does not compile correctly
|
||||||
|
|
||||||
#define HAS_RTC 1
|
|
||||||
|
|
||||||
// has 32768 Hz crystal
|
// has 32768 Hz crystal
|
||||||
#define HAS_32768HZ
|
#define HAS_32768HZ
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
[VERSION]
|
[VERSION]
|
||||||
major = 2
|
major = 2
|
||||||
minor = 1
|
minor = 1
|
||||||
build = 20
|
build = 21
|
||||||
|
Loading…
Reference in New Issue
Block a user