Codebase Architecture
This document provides a high-level overview of the PictoStick source code structure.
Directory Structure
src/: Contains all the C++ source code for the firmware. *main.cpp: The main entry point of the application. Handles initialization and the main loop. *ui*.cpp: Source files related to the user interface, built with the LVGL library. *system.cpp: Manages system-level functions like time, battery, and WiFi. *fs_helpers.cpp: Helper functions for interacting with the SPIFFS filesystem. *PSpref.cpp: Manages persistent storage of settings in NVS (Non-Volatile Storage).include/: Contains all the header files (.h) corresponding to the source files in src/.data/: Contains all files that will be uploaded to the device’s filesystem (SPIFFS). *picto/: The library of all available PNG picto images. *index.html,style.css: The web interface for managing activities. *data_*.json: The JSON files where the weekly activity schedules are stored.lib/: This directory is managed by PlatformIO and contains all the external libraries the project depends on.platformio.ini: The main configuration file for PlatformIO. It defines the board, framework, libraries, and build flags.
Core Components
Main Loop
The main.cpp file contains the setup() and loop() functions, which are standard in the Arduino framework.
setup(): Initializes hardware (display, buttons), filesystems, WiFi, and the user interface. It determines which mode the device should boot into (Normal, WiFi Config, Web Admin).loop(): The main application loop. It primarily calls the LVGL task handler (lv_timer_handler()) which manages all UI rendering and interaction. It also handles button presses and power management.
User Interface (LVGL)
The user interface is built using the LVGL (Light and Versatile Graphics Library).
uimain.cppis responsible for creating and managing the main screen, including the picto display, labels, and progress dots.uisetup.cpphandles the on-device setup menu.uiconfig.cppmanages the WiFi and Web Admin mode screens.
Data Flow
The activity schedules are stored as JSON files in the data/ directory.
When in Web Administration mode, the web server (ESPAsyncWebServer) serves the
index.htmlandstyle.cssfiles.The web interface fetches the
data_*.jsonfiles to display the current schedules.When the caretaker saves the configuration, the web interface sends the new schedule data back to the device, which overwrites the corresponding
data_*.jsonfiles on the filesystem.In normal mode, the device reads the appropriate
data_*.jsonfile for the current day to load and display the activities.
Power Management
To conserve battery, the device makes use of several strategies:
Light Sleep: The ESP32 enters a light sleep mode when the screen is off.
WiFi Off: WiFi is only enabled when actively needed (initial time sync, web admin mode) and is turned off otherwise.
Screen Timeout: The screen backlight is turned off after a short period of inactivity.