Firmware Architecture

Design Principles

  • Separation of Concerns: Each module focuses on a single responsibility—hardware, protocol, state, business logic, or UI.

  • Explicit APIs: Modules communicate through clear interfaces.

  • Scalability: Structure supports adding new features (web endpoints, hardware interfaces, state transitions) without creating spaghetti code.

  • Testability: Isolated logic is testable without hardware.

Directory Layout

The Ma Bell Gateway firmware is organized into logical modules and directories:

main/
  app/          # Application logic, state machine, and event coordination
  hardware/     # Phone line, GPIO, tones, analog/digital hardware interface
  bluetooth/    # Bluetooth stack, Hands-Free Profile (HFP), and related protocols
  network/      # Wi-Fi management and web interface (REST API, device status)
  storage/      # Persistent storage of configuration and device settings
  platform/     # ESP32/RTOS-specific glue code and project entry point
  include/      # Public headers (optional, if using)
  CMakeLists.txt

Module Responsibilities

app/
  • Contains the application’s core logic, including the state machine, event system, and all “business logic.”

  • Coordinates between hardware, Bluetooth, network, and user interfaces.

hardware/
  • Manages all interaction with the physical hardware: - Pin configuration (GPIO, PCM/I2S) - Analog phone line interfacing (off-hook/ring detect, pulse dial) - Generation of all telephony tones

  • Abstracts hardware details from application logic.

bluetooth/
  • Implements all Bluetooth functionality, including: - Stack integration - Hands-Free Profile (HFP) protocol handling - Audio routing and call event management

  • Provides a clear API for application modules to initiate or respond to Bluetooth events.

network/
  • Responsible for network connectivity and device management: - Wi-Fi provisioning, status, and reconnection - Web server and REST API endpoints for status monitoring, configuration, and control

storage/
  • Provides persistent storage for configuration data (such as paired device info and user settings)

  • Abstracts the ESP32’s NVS (non-volatile storage) details behind a simple interface

platform/
  • Contains project entry points and ESP32/RTOS glue: - Main firmware boot/init - Task registration and synchronization - Component registration (build system integration)

include/
  • Optionally holds public header files for modules that require global access

  • Helps decouple modules and simplify dependency management

Development Guidelines

  • New features should be added in the most appropriate module or directory—never spread logic across unrelated areas.

  • APIs between modules must be explicit and documented in header files.

  • Hardware and protocol details should be abstracted away from core application logic.

  • All project documentation and this architecture page should be updated as you refactor and extend the codebase.

By following this structure, the Ma Bell Gateway firmware will be maintainable, testable, and easy for new contributors to understand.