Commit Graph
1049 Commits
Author SHA1 Message Date
jpirnayandClaude Opus 4.6 b625b8bd26 Add paragraph index LUT for accurate KOReader position sync
Store per-page paragraph indices in section cache to enable precise
XPath-to-page and page-to-XPath mapping without reparsing XHTML.

Forward path (upload): generates XPath directly from paragraph LUT
instead of byte-offset estimation, eliminating drift in chapters
with non-uniform content density.

Reverse path (download): resolves incoming KOReader XPath p[N] to
the exact page via paragraph LUT lookup.

Paragraph counter counts all <p> elements including display:none
to match ChapterXPathIndexer and crengine's standard XPath counting.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 12:29:26 +01:00
jpirnay dccb82642d Merge branch 'feat-koysnc-xpath' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-21 20:10:23 +01:00
jpirnay 5b710e960f Fix OOM 2026-03-21 20:04:03 +01:00
Xuan-Son NguyenandZach Nelson e1b74c9db5 fix: use sleep routine from the original firmware (#1298)
## Summary

Fixes #1263

I spent half of my day(-off) reverse engineering the stock english
firmware V3.1.1, it's more or less like solving a sudoku with some known
pieces (like debug strings, known static addresses, known compiled
function, etc) and then the task is to guess the rest.

Long story short, this is the sleep routine that they use:

<img width="674" height="604" alt="image"
src="https://github.com/user-attachments/assets/6d53ce44-7bae-40c7-b4fb-24f898dbcc05"
/>

From the code above:
- They pull down GPIO13 (value = 0xd) before sleep
- They verify that power button is released by doing a delay loop of
50ms, similar to what we're doing
- `esp_sleep_config_gpio_isolate` is called but I'm not 100% sure why
- Pull up power button, note that it's likely redundant because power
button should already pulled up by `InputManager`
- `param1` and `param2` means enabling front/side buttons for wake up,
but it doesn't used in the code in reality. But I think it's physically
impossible, see the explanation below
- `param3` means "wake up from power button"
- `esp_sleep_start` is used; there is a logic to handle if it fails to
sleep, then retry recursively (no idea why!)

My observation is that they use GPIO13 so that it will be on HIGH state
when the chip is powered on, without any user space code to keep it on
that state. And once going to deep sleep, it goes into FLOATING by
default. That may explain why it need to be in LOW state before going to
sleep. (Nice trick btw)

Looking again at the circuit diagram provided
[here](https://github.com/sunwoods/Xteink-X4/blob/main/readme-img/sch.jpg)
(note: it's not official):

<img width="705" height="384" alt="image"
src="https://github.com/user-attachments/assets/b98d59fd-47ca-4d3d-a24a-94bf999e957b"
/>

It kinda make sense as the GPIO13 and VBUS (USB VCC) have the same role,
they are part of a simple "battery protection" cirtuit

Now, we may wonder, how the device wake up when there is no battery at
all?

<img width="440" height="323" alt="image"
src="https://github.com/user-attachments/assets/2981c411-239b-49a7-b9f7-9a75b6c1b6d3"
/>

It seems like power button is not just a simple switch between GPIO3 and
ground, but it also linked the POWER_CTRL, which leads to nowhere on the
diagram, but I suppose it connects the battery back for a short amount
of time, just enough for the MCU to wake up, and GPIO13 goes HIGH again.
It may also explain why power button becomes non-responsive for ~1
second after power on, as it's being pulled up by the current from
battery (remind: high = not pressed, low = pressed)

To test the theory above, I simply **comment out** the
`esp_deep_sleep_enable_gpio_wakeup`:
- On battery, power button works as nothing happen
- On USB, it doesn't wake up, I need to press RST

---

Important things about my analysis:
1. I had to name every function on the code above **manually**, but I'm
99% confident about it. The only function that I'm not sure is
`esp_wifi_bt_power_domain_off` ; Edit: it was indeed mislabeled, see
https://github.com/crosspoint-reader/crosspoint-reader/pull/1298#discussion_r2879670852
2. Some logic inside the stock firmware looks very strange, there is
almost no mention to "arduino" in the hardware, suggesting that they may
just call esp-idf functions directly, bypassing the arduino abstraction.

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? **NO**

---------

Co-authored-by: Zach Nelson <zach@zdnelson.com>
2026-03-21 13:35:38 -05:00
Adrian Wilkins-Caruana 1a1770b06b fix: Fix prewarm perf when a page contains many styles (#1451)
## Summary

**What is the goal of this PR?** (e.g., Implements the new feature for
file uploading.)

Fix prewarm perf when a page contains many styles.

The prewarm page buffer was a single slot, so each `prewarmCache` call
for a new font style freed the previous style's glyphs. On pages with
multiple styles (regular + bold + italic), only the last style was
prewarmed. The others fell through to the hot-group compaction path at
~2-3ms per glyph.

This was most visible on rich formatting (e.g. this [Czech prayer
book](https://stahuj.kancional.cz/e-kniha/kancional.epub) with bold
headings, italic liturgical text, and regular body), where page renders
took 3-5 seconds instead of ~700ms.

Fix: use up to 4 page buffer slots (one per font style) so all styles
stay prewarmed simultaneously.

Fixes #1450.

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? PARTIALLY: to diagnose and
brainstorm solutions.
2026-03-21 12:10:41 -05:00
jpirnay 959fe86216 Merge branch 'lightning-refactor' of https://github.com/znelson/crosspoint-reader into mybuild 2026-03-21 09:10:08 +01:00
jpirnay b08b576ddf Merge branch 'feat-koysnc-xpath' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-21 09:04:41 +01:00
jpirnay beeea38721 Remove cache - caused OOM in certain scenarios 2026-03-21 09:04:03 +01:00
jpirnay 70f53871f7 Fix 2 2026-03-20 18:44:30 +01:00
jpirnay 5f2aad2295 Fix 2026-03-20 18:42:27 +01:00
jpirnay b240ef1e21 Merge branch 'feat-localoverride' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-20 18:38:23 +01:00
jpirnay 484b998366 Merge branch 'fix-displaynone' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-20 18:37:04 +01:00
jpirnay fa836f3c60 Review fixes 2026-03-20 18:26:18 +01:00
jpirnay 09e65c30a3 Local overrides for css and img display 2026-03-20 18:17:34 +01:00
jpirnay 06839c11a8 Merge branch 'fix-displaynone' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-20 17:57:43 +01:00
jpirnay f8a5400a04 Fix crash 2026-03-20 17:24:57 +01:00
jpirnay 549e4e0d8d Testbook for display:none 2026-03-20 17:15:32 +01:00
jpirnay a068f76074 Fix img layout bug 2026-03-20 17:15:08 +01:00
jpirnay 9c8e64402d Recognize css display:none, fixes #1431 2026-03-20 14:48:41 +01:00
jpirnay b206a3fa8b Merge branch 'feat-sdcard-info' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-20 13:03:18 +01:00
jpirnay b354aabc44 Enrich System information 2026-03-20 13:00:38 +01:00
jpirnay b7cb9517ea Fix xpath case issue 2026-03-20 11:13:36 +01:00
jpirnay 14d1c14137 Fix xpath case issue 2026-03-20 11:12:19 +01:00
jpirnay c149700689 Merge branch 'master' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-20 09:44:34 +01:00
jpirnay b545912734 Merge branch 'feat-koysnc-xpath' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-20 09:44:21 +01:00
jpirnay 5dec3d7f95 Reuse spine 2026-03-20 09:43:26 +01:00
Zach Nelson a01bb2902e chore: Removed unused PlatformIO include directory placeholder (#1417)
## Summary

**What is the goal of this PR?**

This change deletes include/README, which is a PlatformIO boilerplate
placeholder file explaining what header files are. The include/
directory isn't used by this project (headers live in lib/ and src/), so
this is just cleanup.

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**NO**_
2026-03-19 23:20:50 -05:00
LSTARandJake Kenneally 2ab4e30b9a feat: Implement silent pre-indexing for the next chapter in EpubReaderActivity (#979)
## Summary

* A simple tweak to pre-index the next chapter silently during normal
reading.
* Triggers silent pre-indexing of the next chapter when the penultimate
page of a chapter is rendered to reduce visible interruptions.
* Keeps existing indexing with popup when a reader jumps directly into
an unindexed chapter.

## Additional Context

* Reader input is temporarily blocked during silent indexing to avoid
navigation/index state conflicts.
* The penultimate page is used because readers typically spend longer
there than on the final page.
* This change optimizes linear reading flow while preserving reliable
indexing for non-linear navigation.

## Possible Improvements

* Add a setting for First Page Indexing vs Penultimate Page Pre-indexing
* Display an indexing icon in the status bar instead of using a popup
that overlaps book text.

Tested on device:

https://www.dropbox.com/scl/fi/29g5kjqgsi5e4hgujv38u/Silent-Indexing.MOV?rlkey=yemi4mosmev5vicaa7gpe49qw&dl=0

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**YES**_

---------

Co-authored-by: Jake Kenneally <jakekenneally@gmail.com>
2026-03-19 23:20:26 -05:00
Zach Nelson 2af434cecd chore: Update SKILL.md to reflect generated i18n files are gitignored (#1423)
## Summary

**What is the goal of this PR?**

Update SKILL.md to stop instructing contributors to commit `I18nKeys.h`
and `I18nStrings.h`. All three generated i18n files have been gitignored
since 1b7dde07 and are regenerated at build time.

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**NO**_
2026-03-19 23:19:54 -05:00
Zach Nelson 7b74521672 refactor: Deduplicate battery drawing code and fix Lyra charging indicator 2026-03-19 22:56:48 -05:00
jpirnay 442b666826 feat: battery charging indicator (mirroring PR #537) (#1427)
## Summary

* **What is the goal of this PR?** All praise goes to @didacta for his
PR #537. Just picked up the reviewer comments to contain the changes as
suggested (there was no response for more than 6 weeks, so I wanted to
reanimate this feature).

Just one addition: should recognize usb cable plug ins / retractions and
update the icon immediately

* **What changes are included?**

## Additional Context

see #537 

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**< NO >**_
2026-03-19 22:33:29 -05:00
jpirnay 0bfe95c882 Use half_refresh 2026-03-19 19:09:39 +01:00
jpirnay 5d8dc56f33 Minor changes 2026-03-19 17:58:45 +01:00
jpirnay cfab6705ab Fix2 2026-03-19 17:54:19 +01:00
jpirnay 720ff24271 fix 1 2026-03-19 17:48:41 +01:00
jpirnay 33de67d23c Merge branch 'fix-ghosting' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-19 17:45:40 +01:00
jpirnay 988ba7e5d2 Fix ghosting on exit 2026-03-19 17:42:25 +01:00
jpirnay 6781ac75b5 Merge branch 'feat-page-overlay' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-19 17:25:57 +01:00
jpirnay 84044886a7 Use both .sleep and sleep directory 2026-03-19 17:25:05 +01:00
jpirnay 913c24407b case fix 2026-03-19 16:43:34 +01:00
jpirnay 48687d7911 Merge branch 'master' into feat-koysnc-xpath 2026-03-19 16:39:50 +01:00
jpirnay 6e53ab3551 Merge branch 'feat-koysnc-xpath' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-19 16:29:05 +01:00
jpirnay 6deca2b78f Use temp file approach 2026-03-19 16:28:29 +01:00
jpirnay 331e6a6c48 Merge branch 'feat-koysnc-xpath' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-19 16:01:58 +01:00
jpirnay 11e4c4b67f Simplify logic 2026-03-19 16:01:12 +01:00
jpirnay f385ffd629 Merge branch 'feat-koysnc-xpath' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-19 14:11:00 +01:00
jpirnay 7db2bcfad5 Increase stack size 2026-03-19 13:57:32 +01:00
jpirnay ec2458de41 Merge branch 'feat-koysnc-xpath' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-19 13:43:57 +01:00
jpirnay 3aa5c1b0de Reduce memory usage for parseSpineItem 2026-03-19 13:43:21 +01:00
jpirnay b44a47b9de Fix 2026-03-19 11:26:28 +01:00