feat(BibleVerse): immersive offline bible app - ESP32 color screen
- Single verse fullscreen, auto-advances every minute, tap toggles chrome
- Offline WEB bible split per-book: books.json + 66 bin/idx pairs (~4.1MB)
- bin = NUL-terminated UTF-8 concatenation, idx = {offset,cnum,vnum}
- RAM tiny: loads one book at a time, biggest Psalms ~215KB vs 3.8MB monolith
- Adaptive text scaling by length: <40 ultra-large (Jesus wept), <100 large,
100-200 default, 200-350 small, 350+ compact (Esther 8:9 492c)
- Persistence via user_data_path: progress.txt + favorites.txt (like BookPlayer)
- LVGL fixes: use lvgl_get_text_font(FONT_SIZE_*) - direct montserrat not exported,
no gradients (bg_grad_color not exported), LV_OPA_95 -> OPA_COVER, format-truncation werror silenced
- Deploys to 192.168.68.112 via PUT /api/apps/install (dashboard port 80, dev 6666 closed)
Tested: build esp32s3 local-sdk 0 missing symbols, 4.2MB .app, screenshot Gen 2:10
Refs: tools/convert_bible.py regenerates assets from WEB source
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||
|
||||
if (DEFINED ENV{TACTILITY_SDK_PATH})
|
||||
set(TACTILITY_SDK_PATH $ENV{TACTILITY_SDK_PATH})
|
||||
else()
|
||||
set(TACTILITY_SDK_PATH "../../release/TactilitySDK")
|
||||
message(WARNING "TACTILITY_SDK_PATH environment variable is not set, defaulting to ${TACTILITY_SDK_PATH}")
|
||||
endif()
|
||||
|
||||
include("${TACTILITY_SDK_PATH}/TactilitySDK.cmake")
|
||||
set(EXTRA_COMPONENT_DIRS ${TACTILITY_SDK_PATH})
|
||||
|
||||
project(BibleVerse)
|
||||
tactility_project(BibleVerse)
|
||||
@@ -0,0 +1,84 @@
|
||||
# BibleVerse for Tactility
|
||||
|
||||
Single-verse bible reader. Shows one verse fullscreen, auto-advances every minute. Tap to toggle controls.
|
||||
|
||||
## UX
|
||||
|
||||
- **Default view (no chrome)**: immersive context — just the verse text + reference, centered, large font. Like BookPlayer image-only view.
|
||||
- **Tap**: shows header (current ref + position) and footer controls:
|
||||
- Close X, Prev, Pause/Play (auto-advance), Next, Highlight (star), Audio memo placeholder.
|
||||
- Highlighted verses saved to `favorites.txt` in app user data. Long-term: record voice memo, read aloud TTS.
|
||||
|
||||
## Bible data format (split per book)
|
||||
|
||||
We fetch public domain bibles from https://github.com/sajeevavahini/bibles (Zefania XML).
|
||||
|
||||
Offline conversion:
|
||||
|
||||
```
|
||||
python3 tools/convert_bible.py --src "World English Bible.xml" --dst assets/bible
|
||||
```
|
||||
|
||||
Result structure:
|
||||
|
||||
```
|
||||
assets/bible/
|
||||
books.json # {"books":[{"bnumber":1,"bname":"Genesis","verses":1533,...}], total_verses, translation, version}
|
||||
01.bin / 01.idx # Genesis
|
||||
02.bin / 02.idx # Exodus
|
||||
...
|
||||
66.bin / 66.idx
|
||||
```
|
||||
|
||||
- `.bin`: concatenated NUL-terminated UTF8 verse texts. No parsing needed, low RAM.
|
||||
- `.idx`: header 10 bytes: magic 'BIBK', uint16 version, uint32 count. Then per entry 8 bytes: uint32 offset, uint16 cnum, uint16 vnum.
|
||||
|
||||
This split makes memory footprint tiny for ESP32:
|
||||
- Only one book loaded at a time (max ~215KB for Psalms, typical 12-100KB).
|
||||
- Index ~19KB max for Psalms, typically <5KB.
|
||||
|
||||
## SD card fallback
|
||||
|
||||
App also scans:
|
||||
|
||||
- `/sdcard/bibles/` and `/sdcard/bible/`
|
||||
|
||||
If `books.json` not found in assets, it will try to use SD folder. This lets users drop extra translations offline.
|
||||
|
||||
## Settings persistence
|
||||
|
||||
Same pattern as EpubReader / BookPlayer (but those two didn't persist in BookPlayer, EpubReader does):
|
||||
|
||||
Using Tactility app user data paths:
|
||||
|
||||
- `tt_app_get_user_data_path()` -> e.g. `/sdcard/user/app/one.tactility.bibleverse`
|
||||
- `progress.txt`: stores global verse index + b/c/v for debug
|
||||
```
|
||||
1234
|
||||
1 1 1
|
||||
0 0
|
||||
```
|
||||
- `favorites.txt`: list of global indices, one per line.
|
||||
|
||||
This lives on SD card (or internal data partition), survives app reinstalls.
|
||||
|
||||
## Build (color screen device, esp32s3)
|
||||
|
||||
Same as BookPlayer — external app, compiled for esp32s3 target (covers CYD-2432s028r, m5stack-cores3, etc).
|
||||
|
||||
```bash
|
||||
# source IDF (example)
|
||||
source ~/esp/esp-idf/export.sh
|
||||
export TACTILITY_SDK_PATH=/path/to/TactilitySDK # or use --local-sdk
|
||||
|
||||
python3 tactility.py Apps/BibleVerse build esp32s3 --local-sdk
|
||||
```
|
||||
|
||||
Output: `build/BibleVerse.app` installable via Tactility file manager or `tactility.py ... install <ip>`
|
||||
|
||||
## Future extensions
|
||||
|
||||
- Voice memo: record to `/sdcard/bible_memos/<global>.wav` using same I2S code as BookPlayer
|
||||
- TTS read aloud: use esp tts or pre-generated mp3 like BookPlayer pages
|
||||
- Book picker UI (like BookPlayer picker but for bible books)
|
||||
- Highlight color, search, jump to reference dialog
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user