Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
ce1f582
feat(cp0_lvgl): add signal-driven audio support
dianjixz Jun 8, 2026
b71bff8
feat(cp0_lvgl): add eventpp signal bridge and battery publisher
dianjixz Jun 9, 2026
9e64f4b
refactor(cp0_lvgl): split SDL backend modules
dianjixz Jun 9, 2026
703ebdc
Merge branch 'master' into ext_component
dianjixz Jun 9, 2026
45535b0
Add Compass app UI assets and defaults
dianjixz Jun 10, 2026
0b105cc
Expand cp0_lvgl audio capture and playback APIs
dianjixz Jun 10, 2026
f6ffb25
feat: add camera service and recorder UI flow
dianjixz Jun 11, 2026
2821b5b
feat: rework camera app preview controls
dianjixz Jun 11, 2026
0a5376d
Move APPLaunch HAL into cp0_lvgl
dianjixz Jun 11, 2026
98b7853
Merge ext-APPLaunch into NewLaunch
dianjixz Jun 11, 2026
521a580
Migrate APPLaunch to cp0_lvgl app interfaces
dianjixz Jun 11, 2026
45de5f1
Migrate APPLaunch paths to cp0_file_path
dianjixz Jun 11, 2026
b0c958e
Remove legacy cp0 app path and audio facades
dianjixz Jun 11, 2026
b612dc7
Move keyboard input facades into cp0 lvgl backends
dianjixz Jun 11, 2026
82f765c
Centralize APPLaunch hardware init in cp0_lvgl
dianjixz Jun 11, 2026
93685bf
Move APPLaunch battery polling into cp0_lvgl
dianjixz Jun 11, 2026
20616d1
Remove unused APPLaunch thpool dependency
dianjixz Jun 11, 2026
66802ed
Move APPLaunch env and volume handling into cp0_lvgl
dianjixz Jun 11, 2026
2a7686d
Remove unused APPLaunch TinyGPS dependency
dianjixz Jun 11, 2026
6ff4465
Use SDK sample logging in APPLaunch
dianjixz Jun 11, 2026
a338ae6
Add cached cp0 system audio signal
dianjixz Jun 11, 2026
8479ad5
Remove unused APPLaunch input groups
dianjixz Jun 11, 2026
ffbd68d
Migrate launcher animations and fix SDL asset paths
dianjixz Jun 11, 2026
56c4edc
Merge master and remove unused launcher pages
dianjixz Jun 11, 2026
668ed08
refactor(APPLaunch): consolidate launch page and home UI
dianjixz Jun 12, 2026
4b61bb5
refactor(APPLaunch): abstract app page base layout
dianjixz Jun 12, 2026
3dc2067
refactor(APPLaunch): centralize home input group management
dianjixz Jun 12, 2026
b4590a3
chore(APPLaunch): enable LVGL external data support
dianjixz Jun 12, 2026
5b5d95f
refactor(APPLaunch): consolidate launcher carousel UI
dianjixz Jun 12, 2026
3c2a5d7
refactor(APPLaunch): consolidate UI resources and font management
dianjixz Jun 12, 2026
25e0ae3
refactor(APPLaunch): remove launcher C callback bridge
dianjixz Jun 12, 2026
39376c9
refactor(APPLaunch): migrate UI C interfaces to C++
dianjixz Jun 12, 2026
6ced547
test(cp0_lvgl): simulate SDL battery charge cycle
dianjixz Jun 12, 2026
e73ffe9
docs(APPLaunch): add launcher project guide
dianjixz Jun 12, 2026
af4e863
Refactor launcher home to reuse app page base
dianjixz Jun 12, 2026
f350250
refactor(APPLaunch): remove local compatibility headers
dianjixz Jun 12, 2026
f120741
Refactor APPLaunch Debian packager
dianjixz Jun 12, 2026
17a5971
refactor(APPLaunch): remove launcher global UI objects
dianjixz Jun 12, 2026
9cbcea6
refactor(APPLaunch): use cp0 file paths directly
dianjixz Jun 12, 2026
15d6a65
Fix SDL battery event updates
dianjixz Jun 12, 2026
37f29c1
Fix camera page top offset
dianjixz Jun 12, 2026
5c7d3a1
fix(APPLaunch): align recorder page controls
dianjixz Jun 12, 2026
b2216bb
Use bold font for home title
dianjixz Jun 12, 2026
fbb9dae
refactor(APPLaunch): flatten UI components and add SPDX headers
dianjixz Jun 12, 2026
eff09bd
feat(cp0_lvgl): publish datetime events on timer
dianjixz Jun 12, 2026
ed05c2d
Sync APPLaunch docs with home refactor
dianjixz Jun 12, 2026
fe84f08
refactor(APPLaunch): remove Launch impl wrapper
dianjixz Jun 12, 2026
a6d46a0
Make carousel elements instance state
dianjixz Jun 12, 2026
0cad0ed
Align datetime event to minute boundary
dianjixz Jun 12, 2026
cf3df44
Refactor launcher carousel data flow
dianjixz Jun 12, 2026
c5c2c15
Use Kconfig choice for APPLaunch build target
dianjixz Jun 12, 2026
d0a8ea0
Move RadioLib into external component
dianjixz Jun 12, 2026
1286a7b
Relocate legacy doc utilities
dianjixz Jun 12, 2026
c47d7c3
Remove firmware manager script
dianjixz Jun 12, 2026
2c3e9f2
Add Windows APPLaunch build configs
dianjixz Jun 15, 2026
d59e4c5
refactor: split cp0_lvgl platform services
dianjixz Jun 15, 2026
4152149
feat: preload configurable system sounds
dianjixz Jun 15, 2026
37bfa63
refactor: call cp0 audio services from APPLaunch
dianjixz Jun 15, 2026
dd7ad57
fix: block cp0 event queue thread while idle
dianjixz Jun 15, 2026
1f7d66c
chore: update APPLaunch deploy target
dianjixz Jun 15, 2026
d1c1c4f
fix: recover system sound cache after boot
dianjixz Jun 15, 2026
c70a520
fix: retry launcher startup sound
dianjixz Jun 15, 2026
8c0f8da
Fix screenshot hint directory creation on Windows
dianjixz Jun 15, 2026
9293479
Normalize APPLaunch UI source naming and comments
dianjixz Jun 15, 2026
e5dab61
Install APPLaunch as a user systemd service
dianjixz Jun 15, 2026
7349fd9
Remove stale APPLaunch architecture notes
dianjixz Jun 15, 2026
bf85257
Add Compass magnetometer calibration
dianjixz Jun 15, 2026
4dbda4f
docs: sync APPLaunch docs and add Japanese translations
dianjixz Jun 15, 2026
f214001
Refactor LoRa app page lifecycle
dianjixz Jun 16, 2026
e5adf65
Replace console app with ST terminal
dianjixz Jun 16, 2026
7d30f9f
Sync APPLaunch ST terminal docs
dianjixz Jun 16, 2026
e426125
Update APPLaunch deploy setup
dianjixz Jun 16, 2026
2f93e9e
Merge remote-tracking branch 'origin/master' into NewLaunch
dianjixz Jun 16, 2026
bf5a880
Fix FreeType mono render mode compatibility
dianjixz Jun 16, 2026
f8c455a
Fix APPLaunch LVGL FreeType mono override
dianjixz Jun 16, 2026
ffcfd27
Disable LVGL event queue thread
dianjixz Jun 16, 2026
29ea846
Fix APPLaunch emulator LVGL runtime alignment
dianjixz Jun 16, 2026
7abd0c4
Fix emulator CI cp0 web runtime
dianjixz Jun 16, 2026
28a7367
Prepare SDK eventpp for emulator CI
dianjixz Jun 16, 2026
7993233
Fix emulator CI cross-platform build
dianjixz Jun 16, 2026
ea3c087
Fix Windows emulator cp0 runtime link
dianjixz Jun 16, 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
72 changes: 72 additions & 0 deletions .github/scripts/prepare-sdk-source.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#!/usr/bin/env bash
set -euo pipefail

component="${1:?usage: prepare-sdk-source.sh <component> [expected-file]}"
expected="${2:-}"
repo_root="$(git rev-parse --show-toplevel)"
sdk_dir="${SDK_DIR:-${repo_root}/SDK}"
target="${sdk_dir}/github_source/${component}"

if [[ -n "${expected}" && -f "${target}/${expected}" ]]; then
exit 0
fi

if [[ -z "${expected}" && -e "${target}" ]]; then
exit 0
fi

export SDK_PATH="${sdk_dir}"
export GIT_REPO_PATH="${sdk_dir}/github_source"
export CONFIG_REPO_AUTOMATION="${CONFIG_REPO_AUTOMATION:-y}"

"${PYTHON:-python3}" - "${component}" <<'PY'
import os
import sys
from pathlib import Path

component = sys.argv[1]
sdk = Path(os.environ["SDK_PATH"])
source_list = sdk / "github_source" / "source-list.sh"

if not source_list.exists():
raise SystemExit(f"SDK source list not found: {source_list}")

class Env(dict):
def Fatal(self, message):
raise RuntimeError(message)

env = Env()
env["PROJECT_TOOL_S"] = str(sdk / "tools" / "scons" / "SConstruct_tool.py")
env["component_dir"] = os.getcwd()
env["GIT_REPO_LISTS"] = {}
env["COMPONENTS"] = []

for line in source_list.read_text().splitlines():
stripped = line.strip()
if not stripped or stripped.startswith("#"):
continue
parts = stripped.split()
if len(parts) < 3 or parts[0] != "git_clone_and_checkout_commit":
continue
url, commit = parts[1], parts[2]
name = url.rstrip("/").removesuffix(".git").split("/")[-1]
env["GIT_REPO_LISTS"][name] = {
"url": url,
"commit": commit,
"path": str(sdk / "github_source" / name),
}

def Dir(path):
return path

def File(path):
return path

def Glob(path):
return []

with open(env["PROJECT_TOOL_S"], encoding="utf-8") as f:
exec(f.read(), globals(), globals())

check_component(component)
PY
33 changes: 33 additions & 0 deletions .github/workflows/emulator-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@ jobs:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Initialize SDK submodule
run: git submodule update --init --depth=1 SDK
- name: Install SDK Python dependencies
run: python3 -m pip install --user --break-system-packages parse requests tqdm
- name: Prepare SDK eventpp source
run: |
cd projects/APPLaunch
bash ../../.github/scripts/prepare-sdk-source.sh eventpp include/eventpp/callbacklist.h
- name: Clone LVGL
run: |
git clone --depth 1 --branch v9.5.0 https://github.com/lvgl/lvgl.git projects/CardputerZero-Emulator/lib/lvgl
Expand Down Expand Up @@ -49,6 +57,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Initialize SDK submodule
run: git submodule update --init --depth=1 SDK
- name: Install SDK Python dependencies
run: python3 -m pip install --user --break-system-packages parse requests tqdm
- name: Prepare SDK eventpp source
run: |
cd projects/APPLaunch
bash ../../.github/scripts/prepare-sdk-source.sh eventpp include/eventpp/callbacklist.h
- name: Clone LVGL
run: |
git clone --depth 1 --branch v9.5.0 https://github.com/lvgl/lvgl.git projects/CardputerZero-Emulator/lib/lvgl
Expand Down Expand Up @@ -93,9 +109,18 @@ jobs:
mingw-w64-x86_64-SDL2_image
mingw-w64-x86_64-freetype
mingw-w64-x86_64-winpthreads-git
mingw-w64-x86_64-python-pip
make
git
- uses: actions/checkout@v4
- name: Initialize SDK submodule
run: git submodule update --init --depth=1 SDK
- name: Install SDK Python dependencies
run: python -m pip install --break-system-packages parse requests tqdm
- name: Prepare SDK eventpp source
run: |
cd projects/APPLaunch
PYTHON=python bash ../../.github/scripts/prepare-sdk-source.sh eventpp include/eventpp/callbacklist.h
- name: Clone LVGL
run: |
git clone --depth 1 --branch v9.5.0 https://github.com/lvgl/lvgl.git projects/CardputerZero-Emulator/lib/lvgl
Expand Down Expand Up @@ -127,6 +152,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Initialize SDK submodule
run: git submodule update --init --depth=1 SDK
- name: Install SDK Python dependencies
run: python3 -m pip install --user --break-system-packages parse requests tqdm
- name: Prepare SDK eventpp source
run: |
cd projects/APPLaunch
bash ../../.github/scripts/prepare-sdk-source.sh eventpp include/eventpp/callbacklist.h
- name: Clone LVGL
run: |
git clone --depth 1 --branch v9.5.0 https://github.com/lvgl/lvgl.git projects/CardputerZero-Emulator/lib/lvgl
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/launcher-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ on:
- 'SDK/**'
- '.gitmodules'
- '.github/workflows/launcher-build.yml'
- 'scripts/debian_packager.py'
pull_request:
branches: [master]
workflow_dispatch:
Expand Down Expand Up @@ -99,8 +100,7 @@ jobs:

- name: Build .deb package
run: |
cd projects/APPLaunch/tools
python3 llm_pack.py
python3 scripts/debian_packager.py

- name: Collect artifacts
run: |
Expand Down
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ doc
tools
setup.ini
pi
projects/APPLaunch/main/ui/components/page_app.h
projects/APPLaunch/main/ui/page_app.h
.agents
dist.bak
data
docs/*.html
skills-lock.json
*.bak
*.bak
projects/APPLaunch/docs/UILaunchPage_carousel_animation.html
95 changes: 69 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# launcher

[中文](./README_ZH.md)
[中文](./README_ZH.md) | [日本語](./README_JA.md)

A collection of M5CardputerZero applications developed with the [M5Stack_Linux_Libs](https://github.com/m5stack/M5Stack_Linux_Libs) SDK. This project demonstrates how to build graphical UI applications with **LVGL 9.5** on the M5CardputerZero (AArch64 Linux) device.

Expand All @@ -26,30 +26,30 @@ launcher/
│ │ ├── SConstruct # Top-level project build script
│ │ ├── config_defaults.mk # Default build config (Linux Framebuffer mode)
│ │ ├── darwin_config_defaults.mk # macOS build config
│ │ ├── win_x86_sdl2_config_defaults.mk # Windows SDL2 simulator config
│ │ ├── win_x86_cross_config_defaults.mk # Windows-to-device cross config
│ │ ├── setup.ini # SSH deployment config
│ │ └── main/ # Main application source
│ │ ├── SConstruct # Component build script
│ │ ├── src/
│ │ │ └── main.cpp # Program entry point
│ │ ├── include/ # Public headers (battery, keyboard_input, etc.)
│ │ ├── hal/ # Hardware abstraction layer
│ │ │ ├── sdl/ # SDL2 platform implementation (PC debugging)
│ │ │ └── linux/ # Linux platform implementation (device side)
│ │ └── ui/ # UI code
│ │ ├── ui.h / ui.c # UI initialization
│ │ ├── screens/ # Screen definitions
│ │ ├── components/ # Custom components (app pages, launcher, etc.)
│ │ ├── widgets/ # Custom widgets (carousel component, etc.)
│ │ ├── Animation/ # Animation effects
│ │ ├── fonts/ # Font assets
│ │ └── images/ # Image assets
│ │ ├── ui.h / ui.cpp # UI initialization
│ │ ├── launch.cpp / launch.h # App list and launch logic
│ │ ├── app_registry.* # Built-in app enable/disable registry
│ │ ├── ui_launch_page.* # Home carousel UI
│ │ ├── launcher_ui_runtime.* # LVGL runtime/home bootstrap
│ │ ├── animation/ # Animation effects
│ │ └── page_app/ # Built-in app pages
│ ├── Calculator/ # Calculator
│ ├── AppStore/ # App store
│ └── HelloWorld/ # Hello World example
├── ext_components/ # External components (Miniaudio, etc.)
├── doc/ # Documentation resources
├── ext_components/ # External components (Miniaudio, RadioLib, etc.)
├── docs/ # Project documentation
├── scripts/ # Repository helper tools
├── README.md
└── README_ZH.md
├── README_ZH.md
└── README_JA.md
```

---
Expand All @@ -68,7 +68,7 @@ launcher/
### APPLaunch Features

- Application launcher UI with multi-app navigation (carousel page switching)
- Built-in app pages: Stock, Music, Camera, LoRa, SSH, GPIO, MIDI, Console, Mesh, and more
- Built-in app pages: CLI/ST terminal, Game, Setting, Compass, IP Panel, File, SSH, Mesh, Rec, Camera, LoRa, and Tank Battle, plus command/external entries such as Python, Store, and Math
- LoRa communication (based on RadioLib SX1262)
- Audio playback (based on Miniaudio)
- Battery status monitoring and display
Expand Down Expand Up @@ -207,6 +207,47 @@ scons distclean
scons -j8
```

### Windows

Windows builds use the same SCons entry point under `projects/APPLaunch`. Use an MSYS2 MinGW shell for the native SDL2 simulator build so that `gcc`, `g++`, `pkg-config`, SDL2, and FreeType are available in `PATH`.

#### Install Dependencies (MSYS2 UCRT64 example)

```bash
pacman -S --needed \
mingw-w64-ucrt-x86_64-gcc \
mingw-w64-ucrt-x86_64-pkgconf \
mingw-w64-ucrt-x86_64-SDL2 \
mingw-w64-ucrt-x86_64-freetype \
mingw-w64-ucrt-x86_64-python-pip

python -m pip install parse scons requests tqdm setuptools-rust paramiko scp
```

#### Build the APPLaunch SDL2 Simulator

```bash
cd projects/APPLaunch
scons distclean
export CONFIG_DEFAULT_FILE=win_x86_sdl2_config_defaults.mk
scons -j8
cd dist
./M5CardputerZero-APPLaunch.exe
```

#### Cross-Compile APPLaunch for the Device

Install the SysGCC Raspberry64 Windows AArch64 Linux cross toolchain from `https://sysprogs.com/getfile/2542/raspberry64-gcc14.2.0.exe`, and update `CONFIG_TOOLCHAIN_PATH` in `projects/APPLaunch/win_x86_cross_config_defaults.mk` if it is not installed at `D:\app\SysGCC\bin`.

```bash
cd projects/APPLaunch
scons distclean
export CONFIG_DEFAULT_FILE=win_x86_cross_config_defaults.mk
scons -j8
```

The cross-build output is `dist/M5CardputerZero-APPLaunch` and runs on the CardputerZero device. The first cross-build may download the SDK sysroot package into `SDK/github_source/static_lib_v0.0.4`.

### Configuration Management Commands

```bash
Expand All @@ -232,14 +273,13 @@ This program is a desktop UI application running on the CardputerZero device. It

### Build

Refer to the HelloWorld build instructions.
For device builds, SDL2 simulator builds, and cross-compilation, use the platform-specific build commands above with `cd projects/APPLaunch`. APPLaunch provides its own configuration files, including `linux_x86_sdl2_config_defaults.mk`, `linux_x86_cross_cp0_config_defaults.mk`, `mac_cross_cp0_config_defaults.mk`, `win_x86_sdl2_config_defaults.mk`, and `win_x86_cross_config_defaults.mk`.

### Package

```bash
# brew install dpkg # mac install dpkg tool.
cd projects/APPLaunch/tools
./llm_pack.py
# Optional: install dpkg to use dpkg-deb; otherwise the Python builder is used.
python3 scripts/debian_packager.py
```

This command generates a DEB installation package. After transferring the package to the device with `scp`, install it with `sudo dpkg -i ./***.deb`.
Expand All @@ -248,23 +288,23 @@ This command generates a DEB installation package. After transferring the packag

#### Auto Run

After installing the DEB package with `dpkg`, the program is automatically started by the `APPLaunch.service` systemd service.
After installing the DEB package with `dpkg`, the program is automatically started by the `APPLaunch.service` systemd user service.

After installation, use `systemd` commands to view and control it:

```bash
pi@pi:~ $ sudo systemctl status APPLaunch.service
pi@pi:~ $ systemctl --user status APPLaunch.service
● APPLaunch.service - APPLaunch Service
Loaded: loaded (/usr/lib/systemd/system/APPLaunch.service; enabled; preset: enabled)
Loaded: loaded (/usr/lib/systemd/user/APPLaunch.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-06-08 15:58:19 CST; 23min ago
Invocation: aa5c4e3ca94742deb2fe0dc67467e670
Main PID: 664 (M5CardputerZero)
Tasks: 7 (limit: 448)
CPU: 1min 19.265s
CGroup: /system.slice/APPLaunch.service
CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/APPLaunch.service
└─664 /usr/share/APPLaunch/bin/M5CardputerZero-APPLaunch

Jun 08 15:58:19 pi systemd[1]: Started APPLaunch.service - APPLaunch Service.
Jun 08 15:58:19 pi systemd[664]: Started APPLaunch.service - APPLaunch Service.
```

#### Manual Run
Expand Down Expand Up @@ -296,10 +336,13 @@ The UI is designed and generated by SquareLine Studio 1.5.0, with a resolution o
| Main content area | Application carousel pages (left/right page navigation) |
| Global hints | ESC / Shift / SYM shortcut hint overlay |

Built-in app pages include: Stock, Music, Camera, LoRa, SSH, GPIO, MIDI, Console, Mesh, Gallery, Email, File, Hack, Rec, Setup, Store, UnitEnv, IpPanel, LovyanGFX, HikePod, Tank Battle, and more.
Built-in app pages include: CLI/ST terminal, Game, Setting, Compass, IP Panel, File, SSH, Mesh, Rec, Camera, LoRa, and Tank Battle. APPLaunch can also expose command or external-process entries such as Python, Store, and Math.

## Related Resources

- [Japanese Project Guide](./docs/launcher-project-guide-ja.md)
- [Japanese APPLaunch App Packaging Guide](./docs/APPLaunch-App-packaging-guide-ja.md)
- [Japanese macOS Docker Build Guide](./docs/macos-docker-build-ja.md)
- [M5Stack_Linux_Libs SDK](https://github.com/m5stack/M5Stack_Linux_Libs)
- [LVGL Documentation](https://docs.lvgl.io/)
- [SquareLine Studio](https://squareline.io/)
Expand Down
Loading
Loading