Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
32784e6
drivers/speaker: map SF32LB volume to attenuation-only DAC gain
jplexer Jul 20, 2026
8eea38a
popups: play alarm tones at full speaker volume
jplexer Jul 20, 2026
1fabb98
services/speaker: add absolute-volume preview tone API
jplexer Jul 20, 2026
28da0c9
settings: redesign speaker volume window
jplexer Jul 20, 2026
c8e7bf6
fw/light: keep Getafix brightness presets distinct
jplexer Jul 17, 2026
6d1edcb
fw/battery: set Getafix warning percentages
jplexer Jul 17, 2026
f08b711
boards/getafix: increase shake sensitivity
jplexer Jul 17, 2026
76249c5
doxygen: deduplicate Doxyfile-all-graphs via @INCLUDE
rhaist Jul 20, 2026
513861f
doxygen: drop obsolete tags and update project name
rhaist Jul 20, 2026
62d5b50
pbl: forward menuconfig to waf
rhaist Jul 20, 2026
8fc95ba
docs: use ./pbl consistently instead of ./waf
rhaist Jul 20, 2026
9d4b436
treewide: remove unused gdb.cmd
rhaist Jul 20, 2026
dca1f76
comm/ble: request connection parameter update sooner after connect
gmarull Jul 20, 2026
5dd4e57
comm/ble: back off reconnect advertising during connection churn
gmarull Jul 20, 2026
0483717
applib/ui, settings/time: fix reboot from wrap-around onto timezone row
rhaist Jul 20, 2026
6644a8e
fw/linker: show static kernel RAM usage in the memory report
gmarull Jul 20, 2026
40ff6a5
build: prune dead packages from requirements.txt
rhaist Jul 20, 2026
c9ea3fb
docs: promote PULSEv2 protocol docs out of legacy
rhaist Jul 20, 2026
aba2c8d
docs: drop remaining legacy files
rhaist Jul 20, 2026
9c4f47d
fw: remove unused bootloader_symbols.json
gmarull Jul 20, 2026
9792a96
lib/c/pebble: move newlib guard from fw folder
gmarull Jul 20, 2026
8194356
fw/shell: discard synced watchface fit pref on unsupported boards
ericmigi Jul 20, 2026
f9b383a
ci: suppress AWS and Memfault uploads outside public repository
gmarull Jul 17, 2026
bd84cca
waftools/gitinfo: accept four-component release tags
gmarull Jul 17, 2026
289bc01
subsys: introduce subsystem concept with logging as first subsystem
gmarull Jul 20, 2026
0d4c923
subsys/logging: move public headers under include/pbl/logging
gmarull Jul 20, 2026
db0298c
services/notifications: fix cross-heap free in storage compression
jplexer Jul 21, 2026
d7bf987
services/notifications: fix leak and deleted-entry handling in rewrite
jplexer Jul 21, 2026
7628608
drivers/speaker: throttle sf32lb52 DMA refill callbacks
jplexer Jul 21, 2026
46c10a0
fw/comm/ble/ams: tolerate extra PlaybackInfo CSV fields
jplexer Jul 21, 2026
92472f4
third_party/hal_sifli: pull latest HAL
gmarull Jul 21, 2026
cd44d62
third_party/hal_sifli: use updated LCPU patch
gmarull Jul 21, 2026
b7c7e15
services/ecompass: relax calibration gates for weak geomagnetic fields
jplexer Jul 21, 2026
496bea8
services/alarms: fix user snooze delay on smart alarms
jplexer Jul 21, 2026
700b2b0
fw/services/activity: fire sleep summary notification once per sleep …
jplexer Jul 21, 2026
d3d5297
fw/services/activity: use resource-id setter for insight tiny icon
jplexer Jul 21, 2026
8dd50aa
fw/drivers/imu/lsm6dso: read FIFO status registers as one burst
gmarull Jul 21, 2026
23e9a9d
fw/drivers/imu/lsm6dso: tag no-action INT1 diagnostic with pass context
gmarull Jul 21, 2026
1fbdfe5
resources: fix '#' floating above the baseline in GOTHIC_36
vvzvlad Jul 21, 2026
b01ec56
third_party/mbedtls: add Mbed TLS 3.6.7
gmarull Jul 14, 2026
c81fe53
third_party/nimble: update NimBLE to 1.10.0
gmarull Jul 14, 2026
7bd6d13
fw/fonts: pick nearest smaller system emoji font
vvzvlad Jul 21, 2026
239e80f
fw/graphics: align substituted glyphs on the primary font baseline
vvzvlad Jul 21, 2026
3139c76
doxygen: regenerate Doxyfile with current template
rhaist Jul 22, 2026
40cfabb
docs: publish Doxygen API reference via Read the Docs
rhaist Jul 22, 2026
f751e33
docs: modernize Sphinx toolchain
rhaist Jul 22, 2026
4b94b30
docs: drop unused sphinx-quickstart scaffolding
rhaist Jul 22, 2026
cbed381
doxygen: add API reference main page
rhaist Jul 22, 2026
8581b74
doxygen: cover include, lib and subsys trees
rhaist Jul 22, 2026
3ae3b7b
docs: publish Doxygen tagfile
rhaist Jul 22, 2026
e93b96f
treewide: ignore clangd .cache directory
rhaist Jul 22, 2026
17bce1b
docs: drop stale DoxygenLayout.xml so the Topics index appears
rhaist Jul 22, 2026
dd6e0ad
docs: link the Topics index from the API reference mainpage
rhaist Jul 22, 2026
f417351
doxygen: set EXAMPLE_PATH for SDK example snippets
rhaist Jul 22, 2026
37e90de
include: fix stale doxygen comments
rhaist Jul 22, 2026
9a2afa9
applib: fix stale doxygen comments
rhaist Jul 22, 2026
2eb3fff
lib/util: add missing doxygen params in heap.c
rhaist Jul 22, 2026
5a47327
fw: fix stale doxygen comments
rhaist Jul 22, 2026
fdfc923
doxygen: fail the RTD build on warnings
rhaist Jul 22, 2026
4aaf606
fw/kernel: fix weighting_factor_inverted typo in interval_timer.h
rhaist Jul 22, 2026
3c62641
fw: deduplicate time_ms declaration
rhaist Jul 22, 2026
8d929b5
fw/drivers: move includes to include/pbl/drivers
gmarull Jul 22, 2026
c98d400
fw/kernel: commit to PRF before the factory reset wipe
jplexer Jul 22, 2026
603f175
docs: add SDK export guide, consolidating three partial copies
rhaist Jul 22, 2026
7e8c24a
docs: surface contribution guidelines on the docs site
rhaist Jul 22, 2026
41b278a
docs: fold QEMU skill knowledge into the QEMU page
rhaist Jul 22, 2026
2e1b0b6
docs: point AGENTS.md at the canonical docs pages
rhaist Jul 22, 2026
e13d06e
docs: fix dead links and broken tables in pulse2 pages
rhaist Jul 22, 2026
5b12488
ci: add weekly docs link check
rhaist Jul 22, 2026
1646f27
docs: fix stale facts found by claim audit
rhaist Jul 22, 2026
976f86d
docs: remove dead SDK mainpage stub and refresh pbl-tool README
rhaist Jul 22, 2026
5ef38b9
fw: remove power mode setting and its users
gmarull Jul 22, 2026
3ec67f2
fw/services: remove powermode service
gmarull Jul 22, 2026
a7b7565
fw/drivers: remove cpumode driver
gmarull Jul 22, 2026
ddf0597
docs: move activity health-algorithms design doc into the docs site
rhaist Jul 22, 2026
c63fd65
docs: add architecture overview page
rhaist Jul 22, 2026
8ab8942
fw/drivers: remove unused stub drivers
gmarull Jul 22, 2026
f03e2a8
lib/c: move libc assert hook from src/fw
gmarull Jul 22, 2026
2e23dbc
lib/c: default to picolibc
gmarull Jul 22, 2026
12bc210
lib/c: remove the in-tree Pebble libc
gmarull Jul 22, 2026
3ca6597
fw/comm/ble: Add log when ppog can't allocate packet
sjp4 Jul 22, 2026
e1b6639
sync: merge upstream/main (2026-07-21)
claude Jul 22, 2026
4467190
health: make card navigation loop follow launch direction
jplexer Jul 22, 2026
aa66164
quick launch: remove health gate
jplexer Jul 22, 2026
f741108
quick launch: hide timeline full from tap
jplexer Jul 22, 2026
2310229
health: match quick launch animations to launch direction
jplexer Jul 22, 2026
34fa918
sync: merge upstream/main (2026-07-23)
claude Jul 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
69 changes: 8 additions & 61 deletions .agents/skills/working-with-qemu/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,66 +5,13 @@ description: Use when building, launching, debugging, or capturing screenshots o

# Working with QEMU

PebbleOS can run under a custom QEMU version shipped with the PebbleOS SDK.
Read `docs/development/qemu.md` — it documents the full workflow: qemu_*
boards, `./pbl qemu` (monitor sockets, serial ports, uart1.log), `./pbl
console`, `./pbl screenshot`, programmatic key input via `sendkey`, and
`./pbl debug`.

## Configure & build
Agent notes:

```sh
./pbl configure --board $BOARD
./pbl build
```

where `$BOARD` is any of the `qemu_*` boards:

- `qemu_emery`
- `qemu_flint`
- `qemu_gabbro`

QEMU boards target a specific platform, e.g. `qemu_emery` targets the Emery platform, which is the platform used by Pebble Time 2.

## Launch

```sh
./pbl qemu
```

The launched QEMU exposes:

- Interactive QEMU monitor on the launching terminal (`-monitor stdio`)
- Programmatic socket monitor (`-monitor unix:build/qemu-mon.sock`)
- Serial console over TCP on `localhost:12345` (console) and `localhost:12344` (pebble-tool)

UART1 output is also captured to `build/uart1.log`.

## Console

```sh
./pbl console
```

Requires QEMU to be running.
Uses the TCP serial port to connect to the QEMU console, and provides a prompt for sending commands and receiving responses.

## Screenshot

```sh
./pbl screenshot # defaults to build/screenshot.png
./pbl screenshot --screenshot-output /tmp/foo.png
```

Requires QEMU to be running.
Uses the programmatic socket monitor to capture a screenshot of the QEMU display and save it to disk.
Useful to validate or iterate on UI changes.

## Interaction

Keyboard input is captured by QEMU, so you can interact with the PebbleOS UI.
Keys can also be send programmatically over the socket monitor using the `sendkey` command.
They key mapping is:

| QEMU key | PebbleOS key |
| -------- | ------------ |
| `left` | `back` |
| `right` | `select` |
| `up` | `up` |
| `down` | `down` |
- Use `./pbl screenshot` to validate UI changes; read the resulting PNG.
- Drive the UI over the socket monitor (`build/qemu-mon.sock`) with
`sendkey` rather than the interactive QEMU window.
30 changes: 30 additions & 0 deletions .github/workflows/docs-linkcheck.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# SPDX-FileCopyrightText: 2026 Core Devices LLC
# SPDX-License-Identifier: Apache-2.0

# Weekly sweep for dead external links in the documentation. Scheduled
# rather than PR-gating so transient outages of third-party sites do not
# block unrelated PRs.
name: Docs Link Check

on:
schedule:
- cron: "0 6 * * 1"
workflow_dispatch:

jobs:
linkcheck:
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v7

- name: Set up Python
uses: actions/setup-python@v7
with:
python-version: "3.13"

- name: Install dependencies
run: pip install -r docs/requirements.txt

- name: Check links
run: sphinx-build -b linkcheck docs _linkcheck
8 changes: 2 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -212,9 +212,7 @@ jobs:
path: artifacts

- name: Upload symbols to Memfault
# Only the upstream project has Memfault secrets; skip on forks so a
# release build doesn't fail on the missing org token.
if: github.repository == 'coredevices/PebbleOS'
if: ${{ github.repository == 'coredevices/PebbleOS' }}
run: |
pip install memfault-cli==${MEMFAULT_CLI_VERSION}

Expand Down Expand Up @@ -262,9 +260,7 @@ jobs:
files: artifacts-*/*

- name: Deploy Memfault release
# Only the upstream project has Memfault secrets; skip on forks so a
# release build stays green without them.
if: github.repository == 'coredevices/PebbleOS'
if: ${{ github.repository == 'coredevices/PebbleOS' }}
run: |
pip install memfault-cli==${MEMFAULT_CLI_VERSION}

Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,15 @@ analyze_mcu_flash_usage_treemap.jsonp

.vscode
.venv
.cache/
*.egg-info

waflib.zip
*~

docs/_build
docs/_apidoc
doxygen-awesome-css/
artifacts/

.claude/settings.local.json
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,6 @@
[submodule "third_party/picolibc"]
path = third_party/picolibc
url = https://github.com/picolibc/picolibc.git
[submodule "third_party/mbedtls/mbedtls"]
path = third_party/mbedtls/mbedtls
url = https://github.com/Mbed-TLS/mbedtls.git
13 changes: 11 additions & 2 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,27 @@
version: 2

build:
os: ubuntu-24.04
os: ubuntu-26.04
tools:
python: "3.13"
apt_packages:
- doxygen
jobs:
post_checkout:
# Skip build if there are no doc changes in a PR
# Ref. https://docs.readthedocs.com/platform/stable/build-customization.html#cancel-build-based-on-a-condition
- |
if [ "$READTHEDOCS_VERSION_TYPE" = "external" ] && git diff --quiet origin/main -- docs/ .readthedocs.yaml;
if [ "$READTHEDOCS_VERSION_TYPE" = "external" ] && git diff --quiet origin/main -- docs/ include/ lib/ src/ subsys/ Doxyfile Doxyfile.rtd .readthedocs.yaml;
then
exit 183;
fi
pre_build:
# Build the Doxygen API reference, published under /apidoc/ via
# html_extra_path (see docs/conf.py)
# v2.4.2, pinned by commit
- git clone https://github.com/jothepro/doxygen-awesome-css.git &&
git -C doxygen-awesome-css checkout d52eafe3e9303399fda15661f3d7bb8fe3d7eabc
- doxygen Doxyfile.rtd

sphinx:
configuration: docs/conf.py
Expand Down
35 changes: 14 additions & 21 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ PebbleOS is the operating system running on Pebble smartwatches.
- `resources`: firmware resources (icons, fonts, etc.)
- `sdk`: application SDK generation files
- `src`: firmware source
- `subsys`: OS subsystems, e.g. logging
- `tests`: tests
- `third_party`: third-party code in git submodules, also includes glue code
- `tools`: a variety of tools or scripts used in multiple areas, from build
Expand All @@ -16,6 +17,14 @@ PebbleOS is the operating system running on Pebble smartwatches.
console, etc.
- `tools/waf`: scripts used by the waf build system

## Documentation

Contributor documentation lives in `docs/` (published at
https://pebbleos-core.readthedocs.io). Prefer pointing to or extending those
pages over duplicating knowledge here: `docs/development/contributing.md`
(DCO, commit and AI-usage rules), `docs/development/sdk_export.md` (SDK
export machinery), `docs/development/qemu.md` (emulator workflow).

## Code style

- clang-format for C code
Expand Down Expand Up @@ -48,27 +57,11 @@ PebbleOS is the operating system running on Pebble smartwatches.

## Adding a new SDK function

When exposing a new function to third-party apps (i.e. anything declared
in an `applib/` header that user apps can call), three things must change
together — the firmware build alone won't surface it to apps:

1. **Implement the applib wrapper and syscall** — add the function to the
appropriate `src/fw/applib/.../<area>.c/.h`, declare the syscall in
`src/fw/syscall/syscall.h`, and define it with `DEFINE_SYSCALL` in
`src/fw/syscall/syscall_<area>.c`.
2. **Register the symbol** in
`tools/generate_native_sdk/exported_symbols.json` under the matching
group, with an `addedRevision` matching the new SDK revision.
3. **Bump the SDK revision** in
`src/fw/process_management/pebble_process_info.h`: increment
`PROCESS_INFO_CURRENT_SDK_VERSION_MINOR` and add a `// sdk.major:0xN
.minor:0xM -- <description> (rev <N+1>)` comment line above the
`#define`. The revision number in the comment must match
`addedRevision` from step 2.

Forgetting steps 2 or 3 means the function compiles into the firmware
but is invisible to the app SDK build, so third-party apps can't link
against it.
Exposing a function to third-party apps requires three coordinated changes
(applib wrapper + syscall, `exported_symbols.json` registration, SDK
revision bump) — the firmware build alone won't surface it to apps. Follow
`docs/development/sdk_export.md` whenever an `applib/` function should
become callable from user apps.

## Git rules

Expand Down
4 changes: 4 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

Thank you for your interest in contributing to PebbleOS! We welcome contributions of all kinds, including bug fixes, new features, documentation improvements, and more. To ensure a smooth contribution process, please follow the guidelines outlined below.

Developer documentation — building the firmware, running it in QEMU, exporting
SDK functions, and more — lives in the `docs/` directory and is published at
<https://pebbleos-core.readthedocs.io>.

## Developer Certification of Origin (DCO)

To make a good faith effort to ensure licensing criteria are met, this
Expand Down
Loading