Table of contents
ESP32-7SEG: An embedded clock with network setup
ESP32-7SEG connects an ESP32 clock display to network configuration and an HTTP interface. The firmware startup decides whether saved Wi-Fi settings can be reused or whether the device needs its setup path.
- Languages
- 3Code breakdown
- Documented components
- 2Explore modules
- Source documents
- 2Read the instructions
Repository languagesKotlin 58.26%3
Shares calculated from GitHub Linguist bytes.
| Language | % | Bytes |
|---|---|---|
| Kotlin | 62,877 | |
| C++ | 42,693 | |
| C | 2,350 |
1. Overview
1.1. Why it exists
Embedded microcontroller firmware and mobile controller for driving multi-digit 7-segment displays.
1.2. Best fit
Physical computing status dashboards and hardware displays.
2. Use cases
ESP32 firmware and an Android app that drive an I2C 7-segment display as a countdown or stopwatch over Wi-Fi.
- Join the board to Wi-Fi
- Timer operatorESP32 + 7-seg display
Without saved credentials, wifi.cpp starts an access point named ESPTimer; the / page then serves the setup form, and POST /connect stores the SSID and password in NVS.
- Start a countdown or stopwatch
- Timer operatorESP32 + 7-seg display
POST /timer-action with action, mode, minutes and seconds starts, pauses or stops a FreeRTOS task (COUNTDOWN or STOPWATCH) in display.cpp.
- Set the digits directly
- Timer operatorESP32 + 7-seg display
POST /update-display with minutes and seconds calls updateDisplay() and pushes a displayUpdated message.
- Follow updates live
- Android appESP32 + 7-seg display
The /ws WebSocket broadcasts timerStarted, timerStopped and displayUpdated JSON; the Android WebSocketClient listens to it.
- Control it from Android
- Timer operatorAndroid app
TimerApiService.kt maps the same endpoints with Retrofit (/timer-action, /connect, /scan, /update-display, /device-info) behind the TimerControl and WiFiConnect fragments.
2.1. Scenario: Setting up a 5-minute countdown on a fresh board
- Wire the Adafruit I2C backpack to SDA, SCL, VCC and GND, then flash the firmware with pio run -t upload (env firebeetle).
- On first boot no credentials are in NVS, so join the ESPTimer access point and open the board's page.
- Pick a network from /scan and submit it to /connect; the board saves it and joins the LAN.
- Read the new IP in the serial monitor at 115200 baud and open it in a browser or the Android app.
- Send action=start, mode=countdown, minutes=5, seconds=0 to /timer-action; the display counts down and /ws reports each update.
Files readREADME.mdplatformio.inisrc/main.cppsrc/wifi.cppsrc/web_server.cppsrc/display.cppinclude/display.handroid/app/src/main/java/com/esptimer/api/TimerApiService.kt.github/workflows/firmware.yml
3. Getting started
These commands come from the repository documentation. They were not run during this review.
4. Repository references
Excerpts from the repository’s guides, in their original language. Links open the inspected source revision.
Prerequisites and first run
4.1. Prerequisites
README.md
- Hardware: ESP32 FireBeetle board (v1.0), Adafruit 7-segment display (I2C backpack), breadboard, and jumper wires.
- Software: Git, PlatformIO or Arduino IDE, and necessary ESP32 libraries.
4.2. Software Installation
README.md
- Clone the Repository:
- Open and Configure the Project: Load the project into PlatformIO or the Arduino IDE. Install any required libraries as specified in platformio.ini or the project documentation.
- Upload to the ESP32: Compile and upload the code to your ESP32 board to start the project.
4.3. Software Installation (readme.md)
readme.md
- Clone the repository to your local machine.
- Open the project with your preferred IDE or editor that supports PlatformIO or the Arduino IDE.
- Install the necessary libraries mentioned in the platformio.ini file or the Arduino project.
- Upload the code to your ESP32 FireBeetle board.
Configuration and usage
4.4. Hardware Setup
README.md
- Display Connections: Connect the Adafruit 7-segment display to the ESP32 using the I2C interface. Make sure to connect the SCL and SDA pins correctly, along with VCC and GND for power.
- Power Supply: Power the ESP32 board through USB or an external power supply to ensure stable operation.
4.5. Usage
README.md
- Access the Web Server: After booting, the ESP32 launches a web server. Find its IP address in the serial monitor and navigate to it using a web browser.
- Update Display via Web Interface: Use the web interface to input and submit the content you want to be displayed. The ESP32 will update the 7-segment display in real-time.
4.6. Hardware Setup (readme.md)
readme.md
- Connect the 7-segment display to the ESP32 according to the provided wiring diagram.
- Ensure a stable power supply for the ESP32 board.
4.7. Usage (readme.md)
readme.md
After uploading the code to your ESP32 board:
- Connect the ESP32 to a power source.
- The ESP32 starts a web server accessible within your local network.
- Find the ESP32’s IP address from your serial monitor and visit the provided IP using a web browser.
- Use the web interface to update the 7-segment display’s content.
Development and contributions
4.8. Contributing
README.md
4.9. Contributing (readme.md)
readme.md
5. Features and components 2
- Boot and connectivity
- setup initializes NVS and checks its result. It loads saved credentials, attempts a connection and falls back to setupWiFi if needed. The same fallback runs when no saved credentials exist.
- Display and web modules
- After connectivity setup, main.cpp calls startClockDisplay and setupWebServer. display.cpp, wifi.cpp and web_server.cpp keep hardware display, connection management and HTTP handling in separate modules.
6. Architecture
Expand a component to follow its connections, or explore the full diagram.
ESP32 boot
NVS saved settings
- From ESP32 boot
- To Connect or setup Wi-Fi
Connect or setup Wi-Fi
Clock display
HTTP interface
Mermaid Interactive diagram
System overview of the components and connections verified in the repository.

flowchart LR
node_operator(("User"))
node_browser(("Browser"))
node_display_hw{{"7-segment display"}}
subgraph group_firmware["ESP32 firmware"]
node_boot["Firmware startup<br/>[main.cpp]"]
node_wifi["Wi-Fi setup<br/>[wifi.cpp]"]
node_credentials[("Wi-Fi credentials<br/>[wifi.cpp]")]
node_timer_display["Timer display<br/>[display.cpp]"]
end
subgraph group_web["Web control"]
node_http_server["HTTP and WebSocket server<br/>[web_server.cpp]"]
node_web_pages["Browser interface<br/>[web_page.h]"]
end
subgraph group_android["Android app"]
node_android_entry["Android navigation<br/>[MainActivity.kt]"]
node_timer_ui["Timer controls"]
node_wifi_ui["Wi-Fi onboarding"]
node_settings_ui["Settings"]
node_browser_ui["Embedded browser view"]
node_stop_receiver["Timer stop receiver"]
node_settings_adapter["Settings list adapter<br/>[SettingsAdapter.kt]"]
end
subgraph group_android_net["Android networking"]
node_timer_api["Timer API contract<br/>[TimerApiService.kt]"]
node_retrofit["HTTP client setup"]
node_ws_client["WebSocket client<br/>[WebSocketClient.kt]"]
node_preferences[("App preferences")]
end
node_operator -->|"controls"| node_browser
node_browser -->|"submits controls"| node_http_server
node_boot -->|"loads or configures"| node_wifi
node_boot -->|"starts display"| node_timer_display
node_boot -->|"starts server"| node_http_server
node_wifi -->|"reads and writes"| node_credentials
node_http_server -->|"handles Wi-Fi routes"| node_wifi
node_http_server -->|"dispatches timer updates"| node_timer_display
node_http_server -->|"serves pages"| node_web_pages
node_timer_display -->|"drives display"| node_display_hw
node_operator -.->|"uses app"| node_android_entry
node_settings_ui -->|"uses adapter"| node_settings_adapter
node_retrofit -->|"creates service"| node_timer_api
node_retrofit -->|"initializes preferences"| node_preferences
node_timer_ui -->|"registers timer events"| node_stop_receiver
node_timer_api -.->|"calls matching routes"| node_http_server
node_ws_client -.->|"connects to socket"| node_http_server
group_android --> group_android_net
class node_boot,node_wifi,node_credentials,node_timer_display,node_operator,node_browser toneBlue
class node_http_server,node_web_pages toneAmber
class node_android_entry,node_timer_ui,node_wifi_ui,node_settings_ui,node_browser_ui,node_stop_receiver,node_settings_adapter toneMint
class node_timer_api,node_retrofit,node_ws_client,node_preferences toneRose
class node_display_hw toneIndigo
ESP32 firmware for a network-controlled seven-segment timer with an Android companion app. Firmware startup loads Wi-Fi, starts the display and web server, while browser and Android controls send timer and onboarding requests.
- Components
- 20
- Connections
- 21
- Evidence-backed links
- 18/21
Text version of the diagram
The diagram merges parallel links between groups, so it shows 18 of 21. Full list:
- User → Browser (controls)
- Browser → HTTP and WebSocket server (submits controls)
- Firmware startup → Wi-Fi setup (loads or configures)
- Firmware startup → Timer display (starts display)
- Firmware startup → HTTP and WebSocket server (starts server)
- Wi-Fi setup → Wi-Fi credentials (reads and writes)
- HTTP and WebSocket server → Wi-Fi setup (handles Wi-Fi routes)
- HTTP and WebSocket server → Timer display (dispatches timer updates)
- HTTP and WebSocket server → Browser interface (serves pages)
- Timer display → 7-segment display (drives display)
- User → Android navigation (uses app)
- Timer controls → HTTP client setup (requests timer actions)
- Timer controls → WebSocket client (opens timer socket)
- Wi-Fi onboarding → HTTP client setup (sends credentials)
- Settings → Settings list adapter (uses adapter)
- Settings → HTTP client setup (loads device data)
- HTTP client setup → Timer API contract (creates service)
- HTTP client setup → App preferences (initializes preferences)
- Timer controls → Timer stop receiver (registers timer events)
- Timer API contract → HTTP and WebSocket server (calls matching routes)
- WebSocket client → HTTP and WebSocket server (connects to socket)
Follow one path through the code
Follow the saved-credentials branch in setup. A stored network is attempted first, but failure still reaches setupWiFi. Only after that branch does the code start the display and web server.
7. Technical dossier
Built from the source at commit 6cac20e (39 files). Each item comes from a pattern match in the code, so open the linked file before relying on it.
7.1. Layers and modules
Folders are sorted into layers by name, from the user interface down to data access. Because the sorting uses names only, the diagram says nothing about calls between layers.
Mermaid Layered view
flowchart TB
subgraph L_presentation["Presentation"]
direction TB
presentation_0["android/res<br/>39 files"]
end
subgraph L_interface["Entry points and API"]
direction TB
interface_0["android/esptimer<br/>3 files"]
interface_1["src<br/>2 files"]
interface_2["include<br/>1 file"]
end
subgraph L_application["Application services"]
direction TB
application_0["android/esptimer<br/>8 files"]
application_1["android/example<br/>2 files"]
application_2["android/main<br/>1 file"]
end
subgraph L_core["Core source"]
direction TB
core_0["include<br/>5 files"]
core_1["src<br/>3 files"]
end
subgraph L_tests["Tests"]
direction TB
tests_0["android<br/>4 files"]
end
subgraph L_hosting["Build, CI and hosting"]
direction TB
hosting_0["(root)<br/>1 file"]
hosting_1[".github<br/>1 file"]
end
L_presentation ~~~ L_interface
L_interface ~~~ L_application
L_application ~~~ L_core
L_core ~~~ L_tests
L_core ~~~ L_hosting
| Module | Layer | Files | Types | Extensions |
|---|---|---|---|---|
android/res | Presentation | 39 | 0 | .xml |
android/esptimer | Application services | 11 | 14 | .kt |
include | Core source | 6 | 0 | .h |
src | Core source | 5 | 1 | .cpp |
android/example | Application services | 2 | 2 | .kt |
android/main | Application services | 1 | 0 | .xml |
7.2. C4 model
From system context to code declarations. Each level reflects the available source evidence.
UML 1 · System context
The widest C4 view: who uses the project and which outside systems and data stores it relies on. Rendered with uml-mcp.
PlantUML source
@startuml
!include <C4/C4_Context>
LAYOUT_LEFT_RIGHT()
System(SYS, "ESP32-7SEG", "ESP32-7SEG connects an ESP32 clock display to network configuration a…")
@enduml
UML 2 · Containers
One level closer: the parts that run separately inside the project, their main language and how calls flow between them. Rendered with uml-mcp.
PlantUML source
@startuml
!include <C4/C4_Container>
LAYOUT_LEFT_RIGHT()
System_Boundary(SYS, "ESP32-7SEG") {
Container(APP, "ESP32-7SEG", "Kotlin")
}
@enduml
UML 3 · Components and layers
Modules grouped by source-layer classification. Boundaries show organization, not runtime isolation or call relationships. Rendered with uml-mcp.
PlantUML source
@startuml
!include <C4/C4_Component>
LAYOUT_TOP_DOWN()
System_Boundary(SYS, "ESP32-7SEG") {
Boundary(L0, "Presentation", "layer") {
Component(M0_0, "android/res", ".xml", "39 files")
}
Boundary(L1, "Entry points and API", "layer") {
Component(M1_0, "android/esptimer", "Kotlin", "3 files")
Component(M1_1, "src", "C++", "2 files")
Component(M1_2, "include", "C/C++", "1 files")
}
Boundary(L2, "Application services", "layer") {
Component(M2_0, "android/esptimer", "Kotlin", "8 files")
Component(M2_1, "android/example", "Kotlin", "2 files")
Component(M2_2, "android/main", ".xml", "1 files")
}
Boundary(L3, "Core source", "layer") {
Component(M3_0, "include", "C/C++", "5 files")
Component(M3_1, "src", "C++", "3 files")
}
Boundary(L4, "Tests", "layer") {
Component(M4_0, "android", "Kotlin", "4 files")
}
Boundary(L5, "Build, CI and hosting", "layer") {
Component(M5_0, "(root)", ".ini", "1 files")
Component(M5_1, ".github", ".yml", "1 files")
}
}
@enduml
UML 4 · Code
Selected declarations, fields and methods grouped by source file. No inheritance or call edges are inferred. Rendered with uml-mcp.
PlantUML source
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
top to bottom direction
hide empty members
package "ESP32-7SEG" {
package "android/app/src/main/java/com/esptimer/fragment/TimerControlFragment.kt" as F0 {
class "TimerControlFragment" as T0_0 {
onCreateView()
onViewCreated()
onStart()
onStop()
setupUI()
showPopupMenu()
}
}
package "android/app/src/main/java/com/esptimer/fragment/WiFiConnectFragment.kt" as F1 {
class "WiFiConnectFragment" as T1_0 {
onCreateView()
onViewCreated()
requestLocationPermission()
checkLocationServiceAndInitiateWifiScan()
isLocationEnabled()
askToEnableLocation()
}
}
package "android/app/src/main/java/com/esptimer/fragment/SettingsFragment.kt" as F2 {
class "SettingsFragment" as T2_0 {
onCreateView()
onViewCreated()
fetchDeviceInfo()
checkWifiPermissionAndFetchSSID()
onRequestPermissionsResult()
fetchWifiSSID()
}
}
package "android/app/src/main/java/com/example/esptimer/MainActivity.kt" as F3 {
class "MainActivity" as T3_0 {
onCreate()
onRequestPermissionsResult()
loadWifiNetworks()
connectToWifi()
onDestroy()
}
}
package "android/app/src/main/java/com/esptimer/fragment/WebBrowserFragment.kt" as F4 {
class "WebBrowserFragment" as T4_0 {
onCreate()
onCreateView()
onDestroyView()
}
}
package "android/app/src/main/java/com/example/esptimer/TimerControl.kt" as F5 {
class "TimerControl" as T5_0 {
onCreate()
callApi()
}
}
package "android/app/src/main/java/com/esptimer/api/WebSocketClient.kt" as F6 {
class "WebSocketEventListener" as T6_0 {
onOpen()
onMessage()
onClosing()
onFailure()
}
}
package "android/app/src/main/java/com/esptimer/adapter/SettingsAdapter.kt" as F7 {
class "SettingItem" as T7_0 {
}
}
package "src/display.cpp" as F8 {
class "Callbacks" as T8_0 {
timerCallback
displayCallback
callbacks
}
}
}
@enduml
7.3. Data flow
The calls from the GitDiagram graph, in the order you meet them from the entry points. GitDiagram generates the graph with AI; the file paths it cites were checked against the repository tree.
Mermaid Sequence diagram
sequenceDiagram
autonumber
participant P0 as Firmware startup
participant P1 as Wi-Fi setup
participant P2 as Timer display
participant P3 as HTTP and WebSocket server
participant P4 as Timer controls
participant P5 as HTTP client setup
participant P6 as WebSocket client
participant P7 as Timer stop receiver
participant P8 as Wi-Fi onboarding
participant P9 as Settings
participant P10 as Settings list adapter
participant P11 as User
participant P12 as Browser
participant P13 as Android navigation
participant P14 as Wi-Fi credentials
participant P15 as 7-segment display
participant P16 as Browser interface
P0->>P1: loads or configures
P0->>P2: starts display
P0->>P3: starts server
P4->>P5: requests timer actions
P4->>P6: opens timer socket
P4->>P7: registers timer events
P8->>P5: sends credentials
P9->>P10: uses adapter
P9->>P5: loads device data
P11->>P12: controls
P11--)P13: uses app
P1->>P14: reads and writes
P2->>P15: drives display
P3->>P1: handles Wi-Fi routes
P3->>P2: dispatches timer updates
P3->>P16: serves pages
Steps as text
- Firmware startup to Wi-Fi setup loads or configures
- Firmware startup to Timer display starts display
- Firmware startup to HTTP and WebSocket server starts server
- Timer controls to HTTP client setup requests timer actions
- Timer controls to WebSocket client opens timer socket
- Timer controls to Timer stop receiver registers timer events
- Wi-Fi onboarding to HTTP client setup sends credentials
- Settings to Settings list adapter uses adapter
- Settings to HTTP client setup loads device data
- User to Browser controls
- User to Android navigation uses app
- Wi-Fi setup to Wi-Fi credentials reads and writes
- Timer display to 7-segment display drives display
- HTTP and WebSocket server to Wi-Fi setup handles Wi-Fi routes
- HTTP and WebSocket server to Timer display dispatches timer updates
- HTTP and WebSocket server to Browser interface serves pages
- HTTP client setup to Timer API contract creates service
- HTTP client setup to App preferences initializes preferences
- WebSocket client to HTTP and WebSocket server connects to socket
- Browser to HTTP and WebSocket server submits controls
- Timer API contract to HTTP and WebSocket server calls matching routes
7.4. Public interface
Outside code can use everything listed here. The project also declares 17 public types.
Entry points
src/main.cppentry file
Public headers 6
include/ble.h include/config.h include/display.h include/web_page.h include/web_server.h include/wifi.h
7.5. Private interface
These names are internal by the language’s conventions: a leading underscore, private, static or pub(crate).
- private / internal method
- 42
setupNavigationUIandroid/app/src/main/java/com/esptimer/MainActivity.kt:63hasPermissionsandroid/app/src/main/java/com/esptimer/MainActivity.kt:73fetchDeviceInfoandroid/app/src/main/java/com/esptimer/fragment/SettingsFragment.kt:41
7.6. Services
Adapter 1
SettingsAdapteronCreateViewHolder, onBindViewHolder, getItemCount
Service 1
TimerApiServiceperformTimerAction, resetWifiCredentials, connectToWiFi and 4 more
Client 1
WebSocketClientconnect, send, close
7.7. Entities and data model 2
Mermaid Entity class diagram
classDiagram
direction LR
class E0["SettingItem"] {
}
class E1["Callbacks"] {
+TimerCallback timerCallback
+DisplayCallback displayCallback
+static callbacks
}
An arrow links a field to the entity its type names.
| Entity | Kind | First fields |
|---|---|---|
SettingItem | Record or interface | |
Callbacks | Data struct | timerCallback, displayCallback, callbacks |
7.8. Business logic
Once UI code and the services and entities above are set aside, these classes have the most methods.
TimerControlFragmentApplication services, 27 methodsonCreateView, onViewCreated, onStart, onStop, setupUI, showPopupMenuWiFiConnectFragmentApplication services, 15 methodsonCreateView, onViewCreated, requestLocationPermission, checkLocationServiceAndInitiateWifiScan, isLocationEnabled, askToEnableLocationSettingsFragmentApplication services, 9 methodsonCreateView, onViewCreated, fetchDeviceInfo, checkWifiPermissionAndFetchSSID, onRequestPermissionsResult, fetchWifiSSIDMainActivityApplication services, 5 methodsonCreate, onRequestPermissionsResult, loadWifiNetworks, connectToWifi, onDestroyWebBrowserFragmentApplication services, 3 methodsonCreate, onCreateView, onDestroyViewTimerControlApplication services, 2 methodsonCreate, callApiWebSocketEventListenerEntry points and API, 4 methodsonOpen, onMessage, onClosing, onFailure
7.9. Database and persistence
7.10. External integrations
HTTP clients
Hosts named in the code
esptimer.local3 filesandroid/app/src/main/java/com/esptimer/api/RetrofitInstance.kt:13
7.11. Stack and dependencies
Embedded (PlatformIO) platformio.ini 1 runtime
platform espressif32 board esp32dev framework arduino
JVM (Gradle) android/app/build.gradle.kts 19 runtime, 3 dev
compileSdk 34 minSdk 24 targetSdk 34 jvmTarget 1
External dependencies
19 declared packages (16 runtime, 3 development) in platformio.ini, android/app/build.gradle.kts.
Package table 19
| Package | Version | Scope | Purpose | Registry |
|---|---|---|---|---|
bblanchon/ArduinoJson | — | runtime | — | registry.platformio.org |
androidx.core:core-ktx:1.12.0 | — | runtime | — | central.sonatype.com |
androidx.appcompat:appcompat:1.6.1 | — | runtime | — | central.sonatype.com |
androidx.preference:preference:1.2.1 | — | runtime | — | central.sonatype.com |
com.google.android.material:material:1.11.0 | — | runtime | — | central.sonatype.com |
androidx.constraintlayout:constraintlayout:2.1.4 | — | runtime | — | central.sonatype.com |
com.squareup.okhttp3:okhttp:4.12.0 | — | runtime | — | central.sonatype.com |
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0 | — | runtime | — | central.sonatype.com |
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 | — | runtime | — | central.sonatype.com |
androidx.cardview:cardview:1.0.0 | — | runtime | — | central.sonatype.com |
androidx.navigation:navigation-fragment-ktx:2.7.7 | — | runtime | — | central.sonatype.com |
androidx.navigation:navigation-ui-ktx:2.7.7 | — | runtime | — | central.sonatype.com |
com.squareup.retrofit2:retrofit:2.9.0 | — | runtime | — | central.sonatype.com |
com.squareup.retrofit2:converter-gson:2.9.0 | — | runtime | — | central.sonatype.com |
com.squareup.retrofit2:converter-scalars:2.9.0 | — | runtime | — | central.sonatype.com |
com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2 | — | runtime | — | central.sonatype.com |
junit:junit:4.13.2 | — | development | — | central.sonatype.com |
androidx.test.ext:junit:1.1.5 | — | development | — | central.sonatype.com |
androidx.test.espresso:espresso-core:3.5.1 | — | development | — | central.sonatype.com |
7.12. CI/CD pipeline
1 GitHub Actions workflow, 2 jobs. Each box is a job; double-bordered boxes publish or deploy, and arrows follow needs.
Mermaid Pipeline flow
flowchart LR
subgraph wf0["Build and Release Firmware"]
direction LR
wf0_build[["build<br/>ubuntu-latest"]]
wf0_release[["release<br/>ubuntu-latest"]]
end
t0(["push"])
d0[("GitHub Releases")]
t0 --> wf0_build
wf0_build --> wf0_release
wf0_release -.-> d0
| Workflow | Triggers | Jobs | Publishes to |
|---|---|---|---|
Build and Release Firmware.github/workflows/firmware.yml | push |
| GitHub Releases |
7.13. Deployment
Mermaid Deployment diagram
flowchart LR
repo[("GitHub repository")]
ci[["GitHub Actions<br/>1 workflow"]]
pub_GitHub_Releases[("GitHub Releases")]
repo -->|"push or pull request"| ci
ci -->|"publishes"| pub_GitHub_Releases
UML Deployment
The outer node is where the code runs. Each base image points to what it builds, solid arrows lead to databases and dashed ones to outside services. Rendered with uml-mcp.
PlantUML source
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
node "PlatformIO firmware build" as H {
artifact "ESP32-7SEG" as APP
}
cloud "WebSocket" as E0
APP ..> E0
@enduml
Where it runs
Published to
7.14. Monitoring
What the code logs, measures and exposes to tell whether it is working.
7.15. Security
Controls
Supply chain
7.16. Testing
- Test files
- 4
- Source files
- 64
- Test cases, about
- 4
- Unit tests
- 4
No measured coverage report in the analyzed sources.
Where the tests are
android/app/src/androidTest/java/com/esptimer 1 android/app/src/androidTest/java/com/example/esptimer 1 android/app/src/test/java/com/esptimer 1 android/app/src/test/java/com/example/esptimer 1
8. Types and file structure
21 declared types, with 12 in the base-relationship overview.
Type diagram
classDiagram
direction TB
class t0f7089087495["Callbacks"] {
<<struct>>
}
class tc0b1722c8a7f["ExampleInstrumentedTest"] {
useAppContext()
}
class taaaa0937cb8a["ExampleInstrumentedTest"] {
useAppContext()
}
class t0fd594821bdd["MainActivity"] {
onCreate()
setupNavigationUI()
hasPermissions()
onRequestPermissionsResult()
}
class tf36f30cd8e65["SettingsAdapter"] {
onCreateViewHolder()
onBindViewHolder()
getItemCount()
}
class tb59d4cfbe0b1["SettingsViewHolder"] {
}
class tc5d344b351ed["SettingItem"] {
}
class tce24fcf8fc6e["TimerApiService"] {
performTimerAction()
resetWifiCredentials()
connectToWiFi()
scanForNetworks()
}
class t64725d5d3582["WebSocketClient"] {
connect()
send()
close()
}
class t181736c31b5e["WebSocketEventListener"] {
onOpen()
onMessage()
onClosing()
onFailure()
}
class tf5e33f3603df["PreferencesHelper"] {
}
class t1902f7090575["SettingsFragment"] {
onCreateView()
onViewCreated()
fetchDeviceInfo()
checkWifiPermissionAndFetchSSID()
}
class b4be9ca085545["AppCompatActivity"] {
<<unresolved_base>>
}
t0fd594821bdd ..> b4be9ca085545 : declared base
class bc58b80af594e["RecyclerView"] {
<<unresolved_base>>
}
tf36f30cd8e65 ..> bc58b80af594e : declared base
tb59d4cfbe0b1 ..> bc58b80af594e : declared base
class b995bb1f4b9f4["Fragment"] {
<<unresolved_base>>
}
t1902f7090575 ..> b995bb1f4b9f4 : declared base
Unresolved bases remain labelled; full signatures are not reconstructed.
9. Reference
36 / 36 eligible files read (113 in the tree); 0 oversized, 0 failed reads and 1 syntax diagnostics.
What the scan covers
Known dependency/build folders, credential files and binaries are excluded. The scan covers READMEs, recognized manifests and parser-supported source files.
Linguist statistics cover the whole repository and may include other languages.
11. Files to read 4
12. Glossary
Repository
The versioned source files, configuration, and history of a project.
README
The repository’s entry document, usually covering its purpose and initial setup.
Dependency
A library, tool, or service that another component needs to build or run.
HTTP
A request-and-response protocol used by browsers and web services. A method, path, headers, and optional body describe a request.
Published port
A host port mapped to a service’s container port. Publishing a port can expose that service beyond its container network.
Build
The steps that turn source files and dependencies into a runnable program or distributable artifact.
Firmware
Software running on a device or microcontroller to control its hardware and communication.
13. References
- antoinebou12. (2026, November 5). ESP32-7SEG. [Software repository] github.com.
- antoinebou12. (2026, November 5). ESP32-7SEG: README. [Repository documentation] github.com.
- antoinebou12. (2026, November 5). src/main.cpp. [Source file] github.com.
- antoinebou12. (2026, November 5). src/display.cpp. [Source file] github.com.
- antoinebou12. (2026, November 5). src/web_server.cpp. [Source file] github.com.
- antoinebou12. (2026, November 5). platformio.ini. [Source file] github.com.
- Boucher, A. (2026, April 13). ESP32-7SEG. [Project article] antoineboucher.info.
- Boucher, A. (2026, October 23). ESP32-7SEG: An embedded clock with network setup. [Project article] antoineboucher.info.
Sources without a publication date show the date they were last checked, November 5, 2026. File links retain the inspected revision where available.