Skip to content
Back to skills

Firmware Core

ASecurity

Core firmware context for the Megahub ESP32 project. Use when working on PlatformIO configuration, build scripts, library structure, main.cpp, or general ESP32 firmware development. Covers build system, project structure, common pitfalls, and debugging.

  • 7 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 1, 2026
developmentgobashdebugginggitapifrontend

Works with

  • api

Security analysis

A100/100

Scanned September 1, 2026

npx -y skills add mirkosertic/Megahub --skill firmware-core --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Firmware Core?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Firmware Core
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/mirkosertic-firmware-core/badge)](https://www.skillsdirectory.com/skills/mirkosertic-firmware-core)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: firmware-core
description: Core firmware context for the Megahub ESP32 project. Use when working on PlatformIO configuration, build scripts, library structure, main.cpp, or general ESP32 firmware development. Covers build system, project structure, common pitfalls, and debugging.
---

# Firmware Core — Megahub ESP32

## Build System

**PlatformIO configuration** — see `platformio.ini`:
- Environment: `esp-wrover-kit`
- Framework: Arduino + ESP-IDF hybrid
- Partition table: `custom_4mb_noota.csv` (no OTA, maximizes app partition)
- Pre-build scripts (in order):
  1. `gitversion.py` — injects git hash into firmware
  2. `buildfrontend.py` — runs `npm run build` for the selected frontend mode
  3. `embedfiles.py` — gzips and embeds frontend files into firmware as C arrays

**Serial monitor**: 115200 baud. Log level controlled by `CORE_DEBUG_LEVEL` (currently 2).

**Logging macros** — always use these, never `Serial.print()`:
```cpp
INFO("Free heap: %d bytes", ESP.getFreeHeap());
WARN("Something unexpected: %d", value);
ERROR("Critical failure in %s", __func__);
```

---

## Library Structure

```
lib/
  btremote/       BLE server (Web Bluetooth API) + Classic BT HID host (gamepads)
  commands/       Command processing system — all device operations use this pattern
  configuration/  WiFi & system configuration persistence
  hubwebserver/   HTTP server using PsychicHttp library
  imu/            MPU6050 IMU — I²C, requires proper init sequence
  lpfuart/        LEGO Powered Up UART protocol implementation
  lua/            Lua 5.4 interpreter (embedded, constrained memory)
  megahub/        Main application — wires all libraries together
  portstatus/     Port status tracking and JSON serialization
  inputdevices/   Gamepad/HID input device abstraction
  statusmonitor/  System health monitoring (heap, tasks)
```

## Key Architecture: Command Pattern

All device operations go through `lib/commands/`. This provides:
- Serialization of requests from multiple sources (BLE, Web)
- Consistent error handling and response formatting
- Command queuing for rate-limited devices

---

## Common Pitfalls

| Pitfall | Fix |
|---------|-----|
| BLE race condition | Use proper task synchronization (mutex/queue) |
| Stack overflow | Use `uxTaskGetStackHighWaterMark()`, move large vars to heap |
| String heap fragmentation | Use `std::string::reserve()` or fixed buffers |
| Blocking in BLE callback | Post to a queue, handle in application task |
| Lua crash | Wrap ALL Lua execution in `lua_pcall()` |
| LEGO device timeout | Send keepalive commands, handle wake-up sequence |
| IMU init failure | Always include required delays in MPU6050 init sequence |
| Memory leak | Every `new`/`malloc` must have matching `delete`/`free` |

---

## Debugging

```bash
pio device monitor --baud 115200   # Serial monitor
pio test                           # Run unit tests
pio run                            # Build only (no upload)
```

**Crash analysis**: Enable ESP32 exception decoder in PlatformIO. Stack traces decode to source lines.

**Runtime monitoring**:
```cpp
INFO("Free heap: %d bytes, Free PSRAM: %d bytes",
     ESP.getFreeHeap(), ESP.getFreePsram());
INFO("Task stack HWM: %d words", uxTaskGetStackHighWaterMark(NULL));
```

**Known heap budget** (from real device logs):
- After IMU init: ~170KB free heap
- After Lua state creation: ~140KB free heap
- After BT stack start: ~75KB free heap
- PSRAM: ~4.1MB available (confirmed present on this board)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.