Merge remote-tracking branch 'origin/master' into develop

This commit is contained in:
Ben Meadors
2026-05-13 09:40:16 -05:00
14 changed files with 200 additions and 42 deletions
+7 -3
View File
@@ -8,17 +8,21 @@
"features": { "features": {
"ghcr.io/devcontainers/features/python:1": { "ghcr.io/devcontainers/features/python:1": {
"installTools": true, "installTools": true,
"version": "3.14" "version": "3.13"
} }
}, },
"customizations": { "customizations": {
"vscode": { "vscode": {
"extensions": [ "extensions": [
"ms-vscode.cpptools", "ms-vscode.cpptools",
"platformio.platformio-ide", "Jason2866.esp-decoder",
"pioarduino.pioarduino-ide",
"Trunk.io" "Trunk.io"
], ],
"unwantedRecommendations": ["ms-azuretools.vscode-docker"], "unwantedRecommendations": [
"ms-azuretools.vscode-docker",
"platformio.platformio-ide"
],
"settings": { "settings": {
"extensions.ignoreRecommendations": true "extensions.ignoreRecommendations": true
} }
+1 -1
View File
@@ -11,7 +11,7 @@ lint:
- checkov@3.2.528 - checkov@3.2.528
- renovate@43.150.0 - renovate@43.150.0
- prettier@3.8.3 - prettier@3.8.3
- trufflehog@3.95.2 - trufflehog@3.95.3
- yamllint@1.38.0 - yamllint@1.38.0
- bandit@1.9.4 - bandit@1.9.4
- trivy@0.70.0 - trivy@0.70.0
+4 -4
View File
@@ -1,10 +1,10 @@
{ {
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [ "recommendations": [
"platformio.platformio-ide" "Jason2866.esp-decoder",
"pioarduino.pioarduino-ide"
], ],
"unwantedRecommendations": [ "unwantedRecommendations": [
"ms-vscode.cpptools-extension-pack" "ms-vscode.cpptools-extension-pack",
"platformio.platformio-ide"
] ]
} }
+18
View File
@@ -0,0 +1,18 @@
# Station G3 motherboard with a Raspberry Pi Zero 2W as the MCU daughterboard.
# Verify spidev / I2C device paths for your OS — they may differ.
Meta:
name: Station G3
support: community
compatible:
- raspberry-pi
Lora:
Module: sx1262
IRQ: 22 # BCM pin — wiki spec
Reset: 16 # BCM pin — wiki spec
Busy: 24 # BCM pin — wiki spec
# CS: 8 # BCM 8 = SPI0 CE0 (default); uncomment only to override
DIO2_AS_RF_SWITCH: true
DIO3_TCXO_VOLTAGE: true
spidev: spidev0.0
# SX126X_MAX_POWER: 19 # matches Station G2 firmware cap; raise carefully per PA jumper mode
+41
View File
@@ -0,0 +1,41 @@
{
"build": {
"arduino": {
"ldscript": "esp32s3_out.ld",
"memory_type": "qio_opi"
},
"core": "esp32",
"extra_flags": [
"-DBOARD_HAS_PSRAM",
"-DARDUINO_USB_CDC_ON_BOOT=1",
"-DARDUINO_USB_MODE=1",
"-DARDUINO_RUNNING_CORE=1",
"-DARDUINO_EVENT_RUNNING_CORE=0"
],
"f_cpu": "240000000L",
"f_flash": "80000000L",
"flash_mode": "qio",
"hwids": [["0x303A", "0x1001"]],
"mcu": "esp32s3",
"variant": "station-g3"
},
"connectivity": ["wifi", "bluetooth", "lora"],
"debug": {
"default_tool": "esp-builtin",
"onboard_tools": ["esp-builtin"],
"openocd_target": "esp32s3.cfg"
},
"frameworks": ["arduino", "espidf"],
"name": "BQ Station G3",
"upload": {
"flash_size": "16MB",
"maximum_ram_size": 327680,
"maximum_size": 16777216,
"use_1200bps_touch": true,
"wait_for_upload_port": true,
"require_upload_port": true,
"speed": 921600
},
"url": "",
"vendor": "BQ Consulting"
}
+1 -1
View File
@@ -138,7 +138,7 @@ lib_deps =
# renovate: datasource=github-tags depName=Adafruit GFX packageName=adafruit/Adafruit-GFX-Library # renovate: datasource=github-tags depName=Adafruit GFX packageName=adafruit/Adafruit-GFX-Library
https://github.com/adafruit/Adafruit-GFX-Library/archive/refs/tags/1.12.6.zip https://github.com/adafruit/Adafruit-GFX-Library/archive/refs/tags/1.12.6.zip
# renovate: datasource=github-tags depName=NeoPixel packageName=adafruit/Adafruit_NeoPixel # renovate: datasource=github-tags depName=NeoPixel packageName=adafruit/Adafruit_NeoPixel
https://github.com/adafruit/Adafruit_NeoPixel/archive/refs/tags/1.15.4.zip https://github.com/adafruit/Adafruit_NeoPixel/archive/1.15.5.zip
# renovate: datasource=github-tags depName=Adafruit SSD1306 packageName=adafruit/Adafruit_SSD1306 # renovate: datasource=github-tags depName=Adafruit SSD1306 packageName=adafruit/Adafruit_SSD1306
https://github.com/adafruit/Adafruit_SSD1306/archive/refs/tags/2.5.16.zip https://github.com/adafruit/Adafruit_SSD1306/archive/refs/tags/2.5.16.zip
# renovate: datasource=github-tags depName=Adafruit BMP280 packageName=adafruit/Adafruit_BMP280_Library # renovate: datasource=github-tags depName=Adafruit BMP280 packageName=adafruit/Adafruit_BMP280_Library
+10 -1
View File
@@ -904,7 +904,16 @@ void Power::readPowerStatus()
// Notify any status instances that are observing us // Notify any status instances that are observing us
const PowerStatus powerStatus2 = PowerStatus(hasBattery, usbPowered, isChargingNow, batteryVoltageMv, batteryChargePercent); const PowerStatus powerStatus2 = PowerStatus(hasBattery, usbPowered, isChargingNow, batteryVoltageMv, batteryChargePercent);
if (millis() > lastLogTime + 50 * 1000) {
// Log battery-presence transitions once; skip OptUnknown so we don't lie before the first probe.
static OptionalBool prevHasBattery = OptUnknown;
if (hasBattery != OptUnknown && hasBattery != prevHasBattery) {
LOG_INFO("Power: battery hardware %s", hasBattery == OptTrue ? "detected" : "absent (USB-only)");
prevHasBattery = hasBattery;
}
// Periodic telemetry only emits when a battery is actually present (otherwise values are constant -1/0).
if (hasBattery == OptTrue && !Throttle::isWithinTimespanMs(lastLogTime, 50 * 1000)) {
LOG_DEBUG("Battery: usbPower=%d, isCharging=%d, batMv=%d, batPct=%d", powerStatus2.getHasUSB(), LOG_DEBUG("Battery: usbPower=%d, isCharging=%d, batMv=%d, batPct=%d", powerStatus2.getHasUSB(),
powerStatus2.getIsCharging(), powerStatus2.getBatteryVoltageMv(), powerStatus2.getBatteryChargePercent()); powerStatus2.getIsCharging(), powerStatus2.getBatteryVoltageMv(), powerStatus2.getBatteryChargePercent());
lastLogTime = millis(); lastLogTime = millis();
+2
View File
@@ -158,6 +158,8 @@
#define HW_VENDOR meshtastic_HardwareModel_CHATTER_2 #define HW_VENDOR meshtastic_HardwareModel_CHATTER_2
#elif defined(STATION_G2) #elif defined(STATION_G2)
#define HW_VENDOR meshtastic_HardwareModel_STATION_G2 #define HW_VENDOR meshtastic_HardwareModel_STATION_G2
#elif defined(STATION_G3)
#define HW_VENDOR meshtastic_HardwareModel_STATION_G3
#elif defined(UNPHONE) #elif defined(UNPHONE)
#define HW_VENDOR meshtastic_HardwareModel_UNPHONE #define HW_VENDOR meshtastic_HardwareModel_UNPHONE
#elif defined(WIPHONE) #elif defined(WIPHONE)
@@ -0,0 +1,38 @@
// Shared pin/feature defines for BQ Station G2 and G3.
// Boards differ only in PA output power (SX126X_MAX_POWER) and the wiki URL.
#pragma once
// Station G2/G3 may not have GPS installed, but have a GROVE GPS Socket for an optional GPS module
#define GPS_RX_PIN 7
#define GPS_TX_PIN 15
// 1.3 inch OLED Screen
#define USE_SH1107_128_64
#define I2C_SDA 5
#define I2C_SCL 6
#define BUTTON_PIN 38 // Program button
#define BUTTON_NEED_PULLUP
#define USE_SX1262
#define LORA_MISO 14
#define LORA_SCK 12
#define LORA_MOSI 13
#define LORA_CS 11
#define LORA_RESET 21
#define LORA_DIO1 48
#ifdef USE_SX1262
#define SX126X_CS LORA_CS // Compatibility alias; prefer LORA_CS in board definitions.
#define SX126X_DIO1 LORA_DIO1
#define SX126X_BUSY 47
#define SX126X_RESET LORA_RESET
// DIO2 controls an antenna switch and the TCXO voltage is controlled by DIO3
#define SX126X_DIO2_AS_RF_SWITCH
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
// NOTE: SX126X_MAX_POWER is intentionally NOT defined here — each board sets it.
#endif
@@ -26,6 +26,7 @@ build_flags =
${esp32s3_base.build_flags} ${esp32s3_base.build_flags}
-D STATION_G2 -D STATION_G2
-I variants/esp32s3/station-g2 -I variants/esp32s3/station-g2
-I variants/esp32s3/station-common
-DBOARD_HAS_PSRAM -DBOARD_HAS_PSRAM
-DSTATION_G2 -DSTATION_G2
-DARDUINO_USB_MODE=1 -DARDUINO_USB_MODE=1
+1 -31
View File
@@ -2,39 +2,9 @@
Board Information: https://wiki.uniteng.com/en/meshtastic/station-g2 Board Information: https://wiki.uniteng.com/en/meshtastic/station-g2
*/ */
// Station G2 may not have GPS installed, but it has a GROVE GPS Socket for Optional GPS Module #include "station_common.h"
#define GPS_RX_PIN 7
#define GPS_TX_PIN 15
// Station G2 has 1.3 inch OLED Screen
#define USE_SH1107_128_64
#define I2C_SDA 5 // I2C pins for this board
#define I2C_SCL 6
#define BUTTON_PIN 38 // This is the Program Button
#define BUTTON_NEED_PULLUP
#define USE_SX1262
#define LORA_MISO 14
#define LORA_SCK 12
#define LORA_MOSI 13
#define LORA_CS 11
#define LORA_RESET 21
#define LORA_DIO1 48
#ifdef USE_SX1262 #ifdef USE_SX1262
#define SX126X_CS LORA_CS // FIXME - we really should define LORA_CS instead
#define SX126X_DIO1 LORA_DIO1
#define SX126X_BUSY 47
#define SX126X_RESET LORA_RESET
// DIO2 controlls an antenna switch and the TCXO voltage is controlled by DIO3
#define SX126X_DIO2_AS_RF_SWITCH
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
// Ensure the PA does not exceed the saturation output power. More // Ensure the PA does not exceed the saturation output power. More
// Info:https://wiki.uniteng.com/en/meshtastic/station-g2#summary-for-lora-power-amplifier-conduction-test // Info:https://wiki.uniteng.com/en/meshtastic/station-g2#summary-for-lora-power-amplifier-conduction-test
#define SX126X_MAX_POWER 19 #define SX126X_MAX_POWER 19
@@ -0,0 +1,21 @@
#ifndef Pins_Arduino_h
#define Pins_Arduino_h
#include <stdint.h>
#define USB_VID 0x303a
#define USB_PID 0x1001
// GPIO48 Reference: https://github.com/espressif/arduino-esp32/pull/8600
// The default Wire will be mapped to Screen and Sensors
static const uint8_t SDA = 5;
static const uint8_t SCL = 6;
// Default SPI will be mapped to Radio
static const uint8_t MISO = 14;
static const uint8_t SCK = 12;
static const uint8_t MOSI = 13;
static const uint8_t SS = 11;
#endif /* Pins_Arduino_h */
@@ -0,0 +1,32 @@
[env:station-g3]
custom_meshtastic_hw_model = 134
custom_meshtastic_hw_model_slug = STATION_G3
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 2
custom_meshtastic_display_name = Station G3
custom_meshtastic_images = station-g3.svg
custom_meshtastic_tags = B&Q
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 16MB
extends = esp32s3_base
board = station-g3
board_level = pr
board_check = true
board_build.partitions = default_16MB.csv
board_build.mcu = esp32s3
upload_protocol = esptool
;upload_port = /dev/ttyACM0
upload_speed = 921600
build_unflags =
${esp32s3_base.build_unflags}
-DARDUINO_USB_MODE=0
build_flags =
${esp32s3_base.build_flags}
-D STATION_G3
-I variants/esp32s3/station-g3
-I variants/esp32s3/station-common
-DBOARD_HAS_PSRAM
-DSTATION_G3
-DARDUINO_USB_MODE=1
+22
View File
@@ -0,0 +1,22 @@
#include "station_common.h"
#ifdef USE_SX1262
// Station G3 reuses the same Fast-Transient DC-DC PA design as G2 (BQ35LORA900V1M).
// PA Operating Mode is set in hardware via the PA-PL1 / PA-PL2 jumpers.
// 19 matches the G2 cap (SX1262 19 dBm in → ~31 dBm PA out at Power Level 1, ISM compliant).
// Raise (max 22) only if running a higher PA Power Level and you can stay within local band limits.
#define SX126X_MAX_POWER 19
#endif
/*
#define BATTERY_PIN 4 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
#define ADC_CHANNEL ADC1_GPIO4_CHANNEL
#define ADC_MULTIPLIER 4
#define BATTERY_SENSE_SAMPLES 15 // Set the number of samples, It has an effect of increasing sensitivity.
#define BAT_FULLVOLT 8400
#define BAT_EMPTYVOLT 5000
#define BAT_CHARGINGVOLT 8400
#define BAT_NOBATVOLT 4460
#define CELL_TYPE_LION // same curve for liion/lipo
#define NUM_CELLS 2
*/