Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
20bb8b1
Add Nordic UART Service BLE bridge for serial commands
loratrak Aug 2, 2026
b486710
Speed up BLE serial bridge: coalesce TX, fix link params
loratrak Aug 2, 2026
6388183
Add led serial command for RGB LED control
loratrak Aug 8, 2026
c818f1a
Merge pull request #2745 from loratrak/nus-ble-serial-bridge
pr3y Aug 17, 2026
e4a108d
Merge pull request #2772 from loratrak/feat/led-serial-command
pr3y Aug 22, 2026
7d9c1e7
fix(rf): route KeeLoq sub files to loopEmulate
vdcoolok Aug 22, 2026
baa1676
Merge pull request #2822 from Valkrycxx/main
pr3y Aug 23, 2026
baa4b41
keeloq fix
pr3y Aug 26, 2026
d564ada
Merge branch 'main' into dev
bmorcelli Aug 26, 2026
3e2d326
p4
bmorcelli Aug 27, 2026
600ac29
ble
bmorcelli Aug 27, 2026
6d46e0a
RF Scan/copy: keep every capture in a selectable list (#2747)
vnxdtzip Aug 28, 2026
ab530e8
Main menu: add a grid layout next to the icon carousel (#2749)
vnxdtzip Aug 28, 2026
29c0d22
Add theme-aware colour helpers to the display core (#2754)
vnxdtzip Aug 28, 2026
16be641
Channel Analyzer: draw a swept spectrum instead of stacked bars (#2756)
vnxdtzip Aug 28, 2026
05c55df
Jam Detect: share the Channel Analyzer spectrum view (#2757)
vnxdtzip Aug 28, 2026
4ed748c
NRF Spectrum: continuous trace, theme colours and a frequency ruler (…
vnxdtzip Aug 28, 2026
5c3182c
RF Spectrum: derive the plot area from the panel, not from a 120px sc…
vnxdtzip Aug 28, 2026
4e1e281
BLE Suite: rebuild the interface on Bruce's frame and theme (#2765)
vnxdtzip Aug 28, 2026
fccb436
Update PCAP directory structure and creation logic (#2774)
Gosheto1234 Aug 28, 2026
aa4c286
fix(wifi): pass channel and BSSID for precise AP selection (#2780)
Mysteriza Aug 28, 2026
e067f11
Add a shared spectrum-analyzer plot component (#2755)
vnxdtzip Aug 28, 2026
1f90300
Refactor HMAC-SHA1 and update PTK to KCK derivation (#2831)
Gosheto1234 Aug 28, 2026
1d555e0
fix(nesso): support Grove I2C devices (#2835)
anapeksha Aug 28, 2026
3240351
p4
bmorcelli Aug 28, 2026
b07b1f7
Merge branch 'main' into dev
bmorcelli Aug 28, 2026
76defa8
Merge branch 'tab5_1.16.1' into dev
bmorcelli Aug 28, 2026
70c2b15
envs to build
bmorcelli Aug 28, 2026
08dfd4a
Testing the feature on the beta version
hackspb0 Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/PR_All_envs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ jobs:
- { env: "m5stack-core16mb", family: "ESP32",}
- { env: "m5stack-core4mb", family: "ESP32",}
- { env: "m5stack-cores3", family: "ESP32-S3",}
- { env: "m5stack-tab5", family: "ESP32-P4",}
- { env: "esp32-s3-devkitc-1", family: "ESP32-S3",}
- { env: "esp32-c5", family: "ESP32-C5",}
- { env: "esp32-c5-tft", family: "ESP32-C5",}
Expand All @@ -35,6 +36,7 @@ jobs:
- { env: "CYD-2432W328R-or-S024R", family: "ESP32",}
- { env: "CYD-3248S035R", family: "ESP32",}
- { env: "CYD-3248S035C", family: "ESP32",}
- { env: "ES3C28P", family: "ESP32-S3",}
- { env: "LAUNCHER_CYD-2432W328R-or-S024R", family: "ESP32",}
- { env: "LAUNCHER_CYD-2432S028", family: "ESP32",}
- { env: "LAUNCHER_CYD-2USB", family: "ESP32",}
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/PR_check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ jobs:
env: "arduino-nesso-n1",
partitions: { bootloader_addr: "0x2000" },
}
- {
name: "ESP32-P4",
env: "m5stack-tab5",
partitions: { bootloader_addr: "0" },
}
steps:
- uses: actions/checkout@v4

Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/buil_parallel.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ jobs:
- { env: "m5stack-core4mb", family: "ESP32",}
- { env: "m5stack-cores3", family: "ESP32-S3",}
- { env: "m5stack-dinmeter", family: "ESP32-S3",}
- { env: "m5stack-tab5", family: "ESP32-P4",}
- { env: "esp32-s3-devkitc-1", family: "ESP32-S3",}
- { env: "esp32-s3-devkitc-1-psram", family: "ESP32-S3",}
- { env: "esp32-c5", family: "ESP32-C5",}
Expand All @@ -57,6 +58,7 @@ jobs:
- { env: "CYD-2432W328R-or-S024R", family: "ESP32",}
- { env: "CYD-3248S035R", family: "ESP32",}
- { env: "CYD-3248S035C", family: "ESP32",}
- { env: "ES3C28P", family: "ESP32-S3",}
- { env: "LAUNCHER_CYD-2432W328R-or-S024R", family: "ESP32",}
- { env: "LAUNCHER_CYD-2432S028", family: "ESP32",}
- { env: "LAUNCHER_CYD-2USB", family: "ESP32",}
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/manual_build_sel_env.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ on:
- "m5stack-core16mb"
- "m5stack-core4mb"
- "m5stack-cores3"
- "m5stack-dinmeter"
- "m5stack-tab5"
- "esp32-s3-devkitc-1"
- "esp32-c5"
- "esp32-c5-tft"
Expand All @@ -32,6 +34,7 @@ on:
- "CYD-2432W328R-or-S024R"
- "CYD-3248S035R"
- "CYD-3248S035C"
- "ES3C28P"
- "LAUNCHER_CYD-2432W328R-or-S024R"
- "LAUNCHER_CYD-2432S028"
- "LAUNCHER_CYD-2USB"
Expand Down
38 changes: 38 additions & 0 deletions boards/_boards_json/esp32p4.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"build": {
"core": "esp32",
"extra_flags": [
"-DARDUINO_RUNNING_CORE=1",
"-DARDUINO_EVENT_RUNNING_CORE=1"
],
"f_cpu": "360000000L",
"f_flash": "40000000L",
"f_psram": "200000000L",
"psram_mode": "oct",
"flash_mode": "qio",
"mcu": "esp32p4",
"chip_variant": "esp32p4",
"variant": "pinouts"
},
"connectivity": [
"bluetooth",
"openthread"
],
"debug": {
"openocd_target": "esp32p4.cfg"
},
"frameworks": [
"arduino",
"espidf"
],
"name": "Espressif ESP32-P4 (generic, rev.300 and newer)",
"upload": {
"flash_size": "16MB",
"maximum_ram_size": 512000,
"maximum_size": 16777216,
"require_upload_port": true,
"speed": 921600
},
"url": "https://docs.espressif.com",
"vendor": "Espressif"
}
38 changes: 38 additions & 0 deletions boards/_boards_json/esp32p4_es.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"build": {
"core": "esp32",
"extra_flags": [
"-DARDUINO_RUNNING_CORE=1",
"-DARDUINO_EVENT_RUNNING_CORE=1"
],
"f_cpu": "360000000L",
"f_flash": "40000000L",
"f_psram": "200000000L",
"psram_mode": "oct",
"flash_mode": "qio",
"mcu": "esp32p4",
"chip_variant": "esp32p4_es",
"variant": "pinouts"
},
"connectivity": [
"bluetooth",
"openthread"
],
"debug": {
"openocd_target": "esp32p4.cfg"
},
"frameworks": [
"arduino",
"espidf"
],
"name": "Espressif ESP32-P4 (generic, ES pre rev.300)",
"upload": {
"flash_size": "16MB",
"maximum_ram_size": 512000,
"maximum_size": 16777216,
"require_upload_port": true,
"speed": 921600
},
"url": "https://docs.espressif.com",
"vendor": "Espressif"
}
3 changes: 3 additions & 0 deletions boards/arduino-nesso-n1/interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
constexpr uint32_t kBtnBDoublePressWindowMs = 270;
constexpr uint32_t kBtnBLongPressMs = 500;

bool enableNessoGrovePower();

/***************************************************************************************
** Function name: _setup_gpio()
** Location: main.cpp
Expand All @@ -17,6 +19,7 @@ void _setup_gpio() {
// ESP32-C6 only has one general-purpose I2C controller (SOC_HP_I2C_NUM == 1), so
// I2C_NUM_1 doesn't exist in i2c_port_t here and M5.In_I2C is always on Wire/I2C_NUM_0.
setSysI2CBus(&Wire);
enableNessoGrovePower();
bruceConfig.colorInverted = 0;
M5.BtnA.setDebounceThresh(8);
M5.BtnB.setDebounceThresh(8);
Expand Down
142 changes: 142 additions & 0 deletions boards/arduino-nesso-n1/nesso_grove_i2c.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
#include "core/bus_HAL.h"
#include <Arduino.h>
#include <M5Unified.h>

namespace {
constexpr uint8_t kNessoExpanderAddress = 0x44;
constexpr uint8_t kGrovePowerBit = 2;
constexpr uint32_t kDefaultI2CFrequency = 100000;

class NessoGroveM5Wire : public TwoWire {
public:
NessoGroveM5Wire() : TwoWire(255) {}

bool begin(int sda, int scl, uint32_t frequency = kDefaultI2CFrequency) {
_freq = frequency;
return M5.Ex_I2C.begin(I2C_NUM_0, sda, scl);
}

bool begin(int sda, int scl) { return begin(sda, scl, _freq); }
bool end() override { return M5.Ex_I2C.release(); }
bool setClock(uint32_t freq) override {
_freq = freq;
return true;
}

void beginTransmission(uint8_t address) override {
_addr = address;
_error = 0;
_open = M5.Ex_I2C.start(address, false, _freq);
if (!_open) _error = 4;
}

uint8_t endTransmission(bool sendStop) override {
if (sendStop) {
if (_open && !M5.Ex_I2C.stop()) _error = 4;
_open = false;
}
return _error;
}

uint8_t endTransmission() override { return endTransmission(true); }

size_t requestFrom(uint8_t address, size_t len, bool sendStop) override {
if (len > sizeof(_rxBuf)) len = sizeof(_rxBuf);
bool ok = _open ? M5.Ex_I2C.restart(address, true, _freq) : M5.Ex_I2C.start(address, true, _freq);
_open = false;
_rxLen = _rxPos = 0;
if (ok && M5.Ex_I2C.read(_rxBuf, len, true)) _rxLen = len;
if (sendStop) M5.Ex_I2C.stop();
return _rxLen;
}

size_t requestFrom(uint8_t address, size_t len) override { return requestFrom(address, len, true); }

size_t write(uint8_t data) override {
if (!_open || !M5.Ex_I2C.write(data)) {
_error = 4;
return 0;
}
return 1;
}

size_t write(const uint8_t *data, size_t quantity) override {
if (!_open || !M5.Ex_I2C.write(data, quantity)) {
_error = 4;
return 0;
}
return quantity;
}

int available() override { return (int)(_rxLen - _rxPos); }
int read() override { return _rxPos < _rxLen ? _rxBuf[_rxPos++] : -1; }
int peek() override { return _rxPos < _rxLen ? _rxBuf[_rxPos] : -1; }

void onReceive(const std::function<void(int)> &) override {}
void onRequest(const std::function<void()> &) override {}

private:
uint32_t _freq = kDefaultI2CFrequency;
uint8_t _addr = 0;
bool _open = false;
uint8_t _error = 0;
uint8_t _rxBuf[64];
size_t _rxLen = 0;
size_t _rxPos = 0;
};


bool nessoExpanderSetBit(uint8_t reg, uint8_t bit, bool enabled) {
uint8_t value = 0;
if (!M5.In_I2C.readRegister(kNessoExpanderAddress, reg, &value, 1, kDefaultI2CFrequency)) return false;
uint8_t updated = enabled ? (value | (1 << bit)) : (value & ~(1 << bit));
if (updated == value) return true;
return M5.In_I2C.writeRegister8(kNessoExpanderAddress, reg, updated, kDefaultI2CFrequency);
}

bool nessoEnableGrovePower() {
static bool enabled = false;
if (enabled) return true;

bool ok = nessoExpanderSetBit(0x03, kGrovePowerBit, true);
ok = nessoExpanderSetBit(0x07, kGrovePowerBit, false) && ok;
ok = nessoExpanderSetBit(0x05, kGrovePowerBit, true) && ok;
if (ok) {
enabled = true;
delay(20);
}
return ok;
}

NessoGroveM5Wire &nessoGroveWire() {
static NessoGroveM5Wire wire;
return wire;
}
} // namespace

bool enableNessoGrovePower() { return nessoEnableGrovePower(); }

TwoWire *acquireBoardI2CBus(int8_t sda, int8_t scl) {
if (sda != GROVE_SDA || scl != GROVE_SCL) return nullptr;
enableNessoGrovePower();

lockSysI2CBus();
M5.In_I2C.release();

NessoGroveM5Wire &wire = nessoGroveWire();
if (!wire.begin(sda, scl, kDefaultI2CFrequency)) {
M5.In_I2C.begin(I2C_NUM_0, SYS_I2C_SDA, SYS_I2C_SCL);
unlockSysI2CBus();
return nullptr;
}
return &wire;
}

bool releaseBoardI2CBus(TwoWire *wire) {
if (wire != &nessoGroveWire()) return false;

nessoGroveWire().end();
M5.In_I2C.begin(I2C_NUM_0, SYS_I2C_SDA, SYS_I2C_SCL);
unlockSysI2CBus();
return true;
}
1 change: 1 addition & 0 deletions boards/arduino-nesso-n1/platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ build_flags =
-D GROVE_SCL=4
-D SYS_I2C_SDA=10
-D SYS_I2C_SCL=8
-D BRUCE_BOARD_HAS_SOFTWARE_I2C=1

;Features Enabled
;-DLITE_VERSION=1 ;limits some features to save space for M5Launcher Compatibility
Expand Down
Loading
Loading