Skip to content

Releases: hthoene/paperpaw

PaperPaw 0.5.0-beta.12

Choose a tag to compare

@github-actions github-actions released this 28 Oct 16:24
ed9f957

Changed

  • X4 (with an SSD1677 panel, as most have): a setting, Fast changes (Display), says how menus and a moved focus
    are shown: the panel's own waveform (500 ms, the cleanest) or a quicker
    one of 8, 6 or 4 frames (found in the waveform lab; about 160 ms with 4),
    which leave more ghosting that the next full refresh clears. It is
    The panel's own (the slowest, the cleanest) by default; page turns are as before.
    Black-and-white refreshes (screens that ask for fastest, such as games)
    take about 100 ms, with 1 frame. The frames and the kick of both are
    settings of the developer group (x4.ssd1677.fast-frames, x4.ssd1677.fast-kick,
    x4.ssd1677.mono-frames, x4.ssd1677.mono-kick, offered only where the panel's
    controller is an SSD1677; the fast ones where Fast changes is
    Own values), so a plugin without code can set them in its settings.ini
    or by an action; the firmware keeps them in the order of the modes (fast
    at most 20 frames, black and white no more than fast).

Added

  • X4 Pro (a UC8179 controller): the fastest refresh (screens that ask for fastest,
    such as games) has numbers of its own, the developer settings x4.uc8179.mono-frames
    (12), x4.uc8179.mono-hold (0) and x4.uc8179.mono-rate (200 Hz): about 175 ms
    by the formula (3 frames at 100 Hz were far too grey, 6 nearly clean: the drive
    needs about 60 ms, whatever the rate). The frame rates go up to 200 Hz (110, 130,
    150, 200 added); the log says how long the setup and the refresh waited for the
    controller. It took the step of Fast changes (7 frames, hold 3,
    about 330 ms, no ghosts) before. The numbers are a guess, to tune on a device.

  • X4 Pro (a UC8179 controller): a developer setting, x4.uc8179.transfer, says how much
    of the picture goes to the controller for a fast change: the whole (what the
    stock firmware sends), only the rows and columns that changed (into both
    memories), or only into the new memory, leaving the controller's own copy to
    make the old one (the default: about 50 ms less a fast change, 329 instead of
    379 ms at 7 frames, judged right on a device). The refresh itself
    still covers the whole display, so the hold keeps working. The whole picture
    goes again after a start, a sleep, grays and the slow refreshes.

  • X4 Pro (a UC8179 controller): Fast changes (Display) says how menus and a moved
    focus are shown, as on the X4: the panel's own waveform (625 ms) or a quicker
    one of the controller's registers, run at the voltages of the panel's own
    waveform (read from its OTP at start, about 65 ms more): 6, 7 or 10 (the panel's own is the default)
    frames with 3 held (about 360, 380 and 440 ms), or own values in the developer
    settings (x4.uc8179.*). Found with the waveform lab on a device.

  • The waveform lab's direct drive on the X4 Pro can hold the pixels that stay (0 to 3
    frames driven to their own colour, as the controller's own fast waveform does
    for one frame), which keeps the ghosts of earlier frames down.

  • The waveform lab's direct drive on the X4 Pro runs at the voltages and VCOM of the
    controller's own waveform (read from its OTP at start), not the reset values
    of its registers (VDH and VDL 14.0 V, VCOM_DC next to nothing); and the lab can
    show the panel's own waveform at a temperature (up to 120 degrees) on a UC8179
    too.

  • Developer firmware of the X4 Pro (x4pro builds) reads the controller's OTP at start (a
    UC8179, about 100 ms) and tells the log what its own waveforms are: the
    temperature ranges, their frame rate, voltages and VCOM, and the states of the
    ranges 25 and 90 degrees select (otp: lines).

  • The waveform lab also runs on the X4 Pro (a UC8179 controller): a direct drive
    made of the controller's waveform registers, with the frames, the kick, the
    frame rate (20 to 100 Hz), the repeat and the levels of white and black to try,
    at the controller's own voltages. Developer firmware (x4pro builds).

  • tools/flash-x4.py builds the checked-out source and flashes it to an X4,
    X4 Pro, X4 Classic or X3 over USB, with a check of the tools, an optional
    backup of the reader's flash and a dry run.

  • The developer firmware of the X4 has a Waveform lab under Tools, for
    trying how the panel is driven: its own tables at a temperature, or a
    direct drive with the frames and the kick chosen on the screen.

Changed

  • X4 (with an SSD1677 panel, as most have): a setting, Fast changes (Display), says how menus and a moved focus
    are shown: the panel's own waveform (500 ms, the cleanest) or a quicker
    one of 8, 6 or 4 frames (found in the waveform lab; about 160 ms with 4),
    which leave more ghosting that the next full refresh clears. It is
    Quicker, some ghosting (6 frames) by default; page turns are as before.
    Black-and-white refreshes (screens that ask for fastest, such as games)
    take about 100 ms, with 1 frame. The frames and the kick of both are
    settings of the developer group (x4.ssd1677.fast-frames, x4.ssd1677.fast-kick,
    x4.ssd1677.mono-frames, x4.ssd1677.mono-kick, offered only where the panel's
    controller is an SSD1677; the fast ones where Fast changes is
    Own values), so a plugin without code can set them in its settings.ini
    or by an action; the firmware keeps them in the order of the modes (fast
    at most 20 frames, black and white no more than fast).
  • EPUB chapters convert and pages read faster, books open with fewer file
    lookups, and skimming to the next or previous chapter no longer converts
    every chapter of the book first.
  • Folders on the SD card are read faster, and reading a large file at
    scattered places no longer walks its clusters from the start each time.
  • Page turns finish sooner: the X4 Pro and X4 Classic no longer send each
    frame a second time after its refresh, and released firmware no longer
    checks every frame it sends.
  • Text, light separator lines and shaded highlights draw faster in black and
    white and in grays, with the same pixels as before.
  • Menus, settings pages and the home screen spend less time on their texts
    and settings, and a start reads the translations faster: a message is
    looked for only in the catalogs that can hold it.
  • Large libraries open faster: the library's shelves and its index read
    the catalog once, a shelf shown again after a book or its actions is not
    read anew when nothing changed, home keeps its covers made small, and
    the vocabulary list reads only the words of the page shown.
  • Book pages draw faster: lines outside the part of the screen being drawn
    are skipped instead of measured word by word. Searching a book needs less
    memory.
  • Turning a page waits less for the card: the reading position and
    today's reading are written once the pages rest for a moment, the book
    closes or the device sleeps, and the book's details are read only when
    its shown percentage changes.
  • Pages are laid out faster: hyphenation stops looking for patterns that
    cannot match, and characters are found in font packs with fewer lookups.
    Lines break exactly as before.
  • Lists, menus and settings pages draw faster on readers that draw the
    screen in bands, such as the X4: rows, headers and status lines outside
    the band being drawn are skipped instead of laid out again for each band.
  • A page turns as soon as its button goes down: holding a page button
    for the next or previous chapter is now off by default and can be
    switched on in the settings under Controls ("Hold for next chapter",
    an advanced setting).
  • Button response on the X4s has a third choice, Saving: the processor
    sleeps up to 50 ms between readings of the buttons on battery (30 ms
    as Normal, 10 ms as Faster), for a little less current; a tap
    shorter than that may be missed. Normal stays as it was.
  • Rules: the list to choose an action, a switch or a number from comes by
    plugin where it is longer than a page (some six pages of actions on the
    X4): first the plugins, with how many each brings, then its own, and
    back goes out of a plugin again. Every action stays on offer, also those
    that work on the screen shown.

Fixed

  • X4 and X4 Pro: a screen that runs at a pace (ScreenMode::frame_every) showed its
    frames with the waveform the last frame before it had left on the panel, not that of
    its own refresh mode. A game with ScreenMode::fastest and grays(2) kept the panel's
    own waveform (500 ms) until a frame that did not wait for the panel (a game-over
    card, say) set the quick one, and so seemed to be fast only after the first restart.
    Paced frames now set the waveform and the transfer as every other frame does.
  • X4 Pro: the sleep screen with a cover, a picture or the cat (shown in grays) is made
    after a refresh of every pixel, as the others are (a page with pictures is not: it
    keeps the quicker first stage, also at its periodic full refresh); before, the grays were put over a fast
    refresh, which leaves a little ghosting of the screen shown before it. The fast
    refresh before any grays also no longer takes a quicker waveform that a game or
    a menu left set.
  • Moving the focus between two items far apart on the home screen (the edit pencil
    and a Continue reading widget with a cover) no longer refreshes the whole panel
    in full at every step. The kernel took the rectangle round the two items for a page
    (half the screen or more) and, with a large picture on the screen, refreshed it in
    full; it also counted every such step towards the full refresh every few pages. It
    now goes by what was drawn (the areas added up), not by the rectangle round them;
    a whole screen drawn anew, a page, is as before. A widget of half the screen or
    more (the Continue reading widget with its cover) is a page by itself, and
    every focus step still showed the screen in four grays (about 1.7 s): a focus step
    in the widget grid now sets its refresh exactly (fast), as the kernel takes it for
    a step and not...
Read more

PaperPaw 0.5.0-beta.9

Choose a tag to compare

@github-actions github-actions released this 26 Oct 02:36
8976e3e

Fixed

  • Every restart shows a translated restart notice before saving state
    and resetting the reader, whichever menu requested it.

  • The USB development helper reads current format 3 plugin digests when
    trusting a local build, while still accepting format 2 files.

  • Plugins selected in the web flasher keep their Store origin after
    installation, so the plugin store can update them automatically.
    Manually installed plugins keep their local origin.

  • First startup shows plugin checking, installation progress and startup
    preparation while the web flasher's bundle is copied to the SD card.

  • Settings distinguish Manage plugins from Plugin settings, rather
    than showing two entries named Plugins.

  • Resetting settings changes only explicitly stored values, avoiding
    repeated font and layout reloads for defaults that were never changed.
    Book-specific resets leave global values intact.

  • The plugin store shows when it refreshes a saved plugin list, while
    keeping that list available until the request finishes.

  • Crates.io releases use new versions for changed built-in plugins, so packaged applications compile against the matching plugin sources.

  • A text shortened to its room (ui::fit, rows' titles and values)
    counts kerning as it is drawn: pairs set apart (f\ in the UI font)
    could take it up to a few pixels past its room, into the value beside
    it.

PaperPaw 0.5.0-beta.11

Choose a tag to compare

@github-actions github-actions released this 26 Oct 19:24

Added

  • X4 Pro firmware includes Bluetooth LE for HID page-turners and
    keyboards, pairing on the reader, and plugin GATT clients. Remotes
    remain manual by default; active Bluetooth prevents processor light
    sleep, and device sleep shuts the radio down. Other readers are
    unchanged. Advertising and plugin GATT servers remain unavailable.

Fixed

  • Bluetooth applies the requested remote connection parameters before HID
    discovery, so setup no longer blocks that change. Idle power policy is unchanged.
  • Bluetooth reconnects known devices when the controller reports their resolved
    identity or a new private address, while retaining the existing paired entry.

PaperPaw 0.5.0-beta.10

Choose a tag to compare

@github-actions github-actions released this 26 Oct 17:17

Fixed

  • Justified text keeps bounded word spacing when font size or word
    spacing changes, without abruptly switching whole lines to tight
    spaces. Balanced line breaking considers the gaps it can distribute.
    The settings preview and book pages use the same behavior.
  • X4 plugin-cache indexes are read with the current entry size, so a
    restart reuses verified cached code instead of rewriting every plugin.
  • Xteink readers enter hardware sleep even when USB or charging is
    detected, instead of keeping the processor awake behind the sleep
    screen. Press the physical power button to wake them.
  • A sleep request survives redrawing the screen after a grayscale image.
  • X4 light-sleep transitions cannot overlap the button ADC interrupt's
    access to the internal analog bus.
  • The X4 Pro holds battery power before memory, diagnostics and OTA
    startup work, so a short power press need not span that work.
  • Screens that hide button hints, including the sleep screen, cannot
    retain a temporary hint row from the previous screen.

Changed

  • Xteink readers show a startup message before loading plugins on normal
    starts too. Its panel refresh overlaps plugin loading.
  • X4 Pro and X4 Classic verify native plugin digests with the chip's
    SHA-256 engine. The same header, image and relocation bytes are checked
    before any plugin code runs.
  • Kernel startup reads installed native-plugin digests once for the plugins
    it will load, after recovering pending installs. The bounded snapshot is
    discarded after loading; the plugin interface is unchanged.

Added

  • Text layout callers can add a cost for the unused width and internal
    spaces of a candidate balanced line with
    wrap_lines_balanced_kerned_with_cost. Existing calls keep their layout.

Compatibility

  • The native plugin interface remains i4, with the same pinned compilers.
    Existing compatible plugins continue to run. Reader layout caches are
    rebuilt for the updated justification behavior.

PaperPaw 0.5.0-beta.8

Choose a tag to compare

@github-actions github-actions released this 25 Oct 22:48

Changed

  • Wi-Fi joins the saved network picked last on the Wi-Fi page first,
    when it is in reach, instead of the strongest: after a restart the
    reader stays in the network one chose. Join first (Last picked,
    Strongest) sets it.
  • Code plugins must be built again for beta.8. The plugin interface
    is now 4: what crosses changed for a book's formatting and kerning
    (Block, TextStyle, Typesetter, layout::Style, FontHandle),
    the settings' pages (SettingGroupSpec), screens that run in real
    time, screens opened once, static registration (Actions::get,
    Env::menus, Env::screens) and lists that draw only what a step
    changes (ListChange), with room for what comes later (the developer
    link, Command::Extended), and room between the lines for page
    layers (Block::leading_above, PageLine::leading,
    LineBox::leading, PageView::words, PageLayerSpec::words),
    blocks filters insert (Block::inserted, PageLine::inserted),
    input on layers (PageLayerSpec::items, LayerItem,
    PageLayerTapped::item) and room for annotations
    (Block::annotations, PageLine::annotations).
    PaperPaw's own store plugins come as updates.
  • Moving through the settings with the buttons is quicker: a step draws
    only the row left and the row reached, no longer the whole screen (on
    the X4 a sixth to a third of it), in every list of the settings.
  • The firmware is leaner, so updates keep room: German hyphenation is a
    plugin of the store (hyphenation-de), as the other languages are,
    and the built-in one keeps English; Literata Bold Italic is no longer
    built into the firmware (bold stands in for it; the emulator and the
    app keep it), and its faces go up to 32 px there (about 10 pt). A data
    plugin may bring faces of a family without its regular one, and a pack
    that extends a face with larger sizes draws text that large (the font
    size goes as far), so the font library brings both back
    (tools/literata-packs.py). At the largest size, its help says where
    larger ones are found.
  • The release keeps room for the updates to come: paperpaw-sign check-image prints the margin an image leaves in the smallest app
    slot (its own or CrossPoint's), warns below 512 KB and fails below
    256 KB.
  • A step with the buttons draws only what it changes, on every screen
    with a list, a grid or buttons to move between: the item the focus
    left and the one it came to, no longer the whole screen (on the X4 a
    sixth to a third of a frame). ListChange::Focus carries the two
    items, so ListChange::request asks for them alone; ListView,
    Rows and Sections give focus_change for a focus that only came
    to show, ListChange::focus serves focuses of a screen's own and
    ui::button_reach says where a focused button draws. Their request
    methods are gone: change.request(cx) does it. A screen whose focus
    changes more than its items asks for that part too.
  • The store finds its way in a library of thousands: its start shows
    what the library picks (Recommended, New, Popular now, Recently
    updated, Discover) between the search and the groups, and a group
    lists its plugins in the library's fair mix of the day, so that every
    plugin gets seen. A to Z stays a choice, sorted on the device a run at
    a time, and long groups go to a letter (Go to letter, a grid of A to
    Z for buttons and fingers). The list still streams to the card. A
    library without picks shows the start and the order as before.
  • Plugins that work with another product say what they do with it:
    KOReader highlights, Calibre connection, Readwise export, Wallabag
    articles, Wikipedia lookup and Joplin notes (their ids stay, and so do their
    settings and data).
  • Literata's sizes above 32 px and its Bold Italic, which the X4's
    firmware leaves out, are plugins of the store: the release builds
    PaperPaw's own data plugins (tools/plugin-files/data.toml) and
    publishes them with the others, versions checked as theirs.
  • With buttons alone (the X4) the keyboard keeps a computer keyboard's
    rows at every size (qwertyuiop above asdfghjkl); the size makes keys
    higher and their letters larger, and a row is split only where its
    letters would not fit. Up and down keep to the column one came along.
    Typing takes about as many presses as before (627 against 633 for the
    sample texts in plugins/keyboard/tests/presses.rs), capitals fewer.
  • Its keys are wider with buttons alone: the focus fills a key instead
    of framing it, so two pixels between keys do (on the X4 a letter's key
    is 39 pixels wide, was 25). On touch screens the room between keys
    follows the screen's size (0.6 mm). The plain X4s start with the
    keyboard at Small, the X4 Pro at Large; a size chosen stays. "Hold: ö"
    in place of "Hold for ö" leaves the field's title whole.
  • Settings where readers look for them: Date and time (the clock, the
    first day of the week, the time zone), Plugins (each plugin's
    network) and Words are groups of their own; the auto sleep is under
    Power, the device's name under Wi-Fi, the sleep screen's logo with
    the sleep screen, the widgets' frame with the home screen. Reading's
    settings have shorter names (Invert pictures, Paragraph spacing,
    Top and bottom margins …).

Added

  • Plugins write between a book's lines, an interlinear reading with a
    translation above each line: a text filter asks for room above every
    line of a block (Block::leading_above, hundredths of an em, at most
    four), which the layout adds to the line's height so pages break with
    it, and each line tells it (PageLine::leading, LineBox::leading);
    a page layer that asks (PageLayerSpec::words) gets the page's words
    with their boxes and places (PageView::words, reading::WordBox,
    now without the feature unstable), measured once a page and only
    where a layer asks.
  • Text filters insert blocks after the one they get
    (Block::insert_after: a translation after each paragraph, a gloss,
    a note), at most four with 4 KiB of text: shown after it, never apart
    from its last line, with no place in the book (PageLine::inserted),
    so positions, progress, bookmarks, highlights, search and the page's
    words stay the book's.
  • Page layers take input on what they draw: a layer says where its items
    are (PageLayerSpec::items, LayerItem); a tap on one, or Select on
    one chosen with the buttons as links are, comes to its plugin
    (PAGE_LAYER_TAPPED with item), and every other tap and button
    stays the reader's. The room above a line counts as the line's
    (PageView::line_at).
  • Room for annotations over words (ruby, furigana, phonetics, glosses):
    Block::annotations and PageLine::annotations, empty until the
    layout sets them (ADR 0032).
  • A sample plugin, samples/interlinear: a translation above each line
    that opens on a tap, or after each paragraph.
  • With buttons alone, holding Back finishes typing and keeps the text,
    wherever the focus is (Back alone cancels); the field says so. Holding
    Select still finishes on any key that is no letter.
  • The keyboard locks capitals with Shift pressed twice in a row (the
    key filled until pressed again), and a long press on a letter offers
    its capital first, chosen: with buttons a long press and Select type
    it. Automatic capitals (off by default) starts a text and each
    sentence with one, not in passwords, numbers and addresses.
  • SDK: ask::TextQuestion::url() and email() ask for a web or e-mail
    address (modes url and email), typed as it is. The browser,
    catalogs, news, KOReader sync, Joplin, Wallabag and the statistics'
    sync ask for their addresses so.
  • Plugins can run in real time: games, emulators, animations
    (ADR 0030). A screen says how
    it runs in one place (Screen::mode, realtime::ScreenMode): full
    screen, buttons pressed and released (Screen::on_key,
    Env::keys_held; holding Back, or a finger in the top left corner,
    two seconds always leaves), its own refreshes, the fastest refresh,
    the grays enough, a pace, staying awake longer, and the memory it
    needs. The device says what it can do and how the last frame went
    (Env::panel, PanelInfo, FrameReport), so faster panels make
    plugins faster without a new build. Canvas::blit draws packed
    bitmaps at a whole scale, memory::vec_in keeps data in internal RAM
    or PSRAM, and code plugins get Api::alloc_in. On the X4 the main
    loop goes on while the panel refreshes for such a screen, and every
    frame's times are measured. samples/frame-test shows it all. The
    first time such a screen opens, a notice says how to leave it.
  • Room for a screen that needs memory: the kernel lets caches go, holds
    background work back, switches Wi-Fi and Bluetooth off where the
    screen does not need them, asks the screens below to let go of what
    they make again (the reader its book, keeping its place;
    Screen::on_squeeze, RoomSteps::SQUEEZED) and closes them where
    that is not enough, until there is enough; everything comes back once
    it closes (ScreenMode::memory, Env::room).
  • A screen opened again while it is open is gone back to, not stacked
    (several Transfer over Wi-Fi screens one over another took as many
    presses of Back): the screens above it close and it hears the
    params (Screen::on_reopen). Each screen says how many of it may be
    open (ScreenSpec::instances, Instances): one for each set of
    params (the default), one at most (the transfer, Wi-Fi, Bluetooth,
    store and diagnostics screens and other roots) or many (the
    keyboard). Params are alike in any order.
  • Plugins see what the buttons are good for: Capability::PAGE_KEYS
    and Capability::BUTTONS (enough for every screen without touch),
    from the buttons the shell lists.
  • Less memory at rest: actions, screens, menu entries and icons can be
    static lists that stay in flash (`FixedActio...
Read more

PaperPaw 0.5.0-beta.7

Choose a tag to compare

@github-actions github-actions released this 25 Oct 16:21

Added

  • The notices of everything PaperPaw ships: the crates of the firmware
    and of the apps, each under its licence with its copyright lines and
    each licence's text once, and Mbed TLS, ESP-IDF's radio libraries and
    bootloader, the FreeInk and OpenX4 display code and Papyrix. Made from
    the lockfiles by tools/licences/build.py into NOTICE and About
    PaperPaw, Licences (packed, written out to read part by part); CI
    fails where a crate that ships is missing. The web, emulator,
    handbook and core library archives carry LICENSE and NOTICE.
  • Weather names Open-Meteo, Wikipedia names each article below its
    summary, with their licences.
  • The emulator starts online with --wifi online (over --stdio,
    "wifi": "online" in start): the X4s on USB, their radio on and in
  • The emulator starts online with --wifi online (also given before
    --stdio, for the devices it starts; or "wifi": "online" in
    start): the X4s on USB, their radio on and in
    a network Workshop Wi-Fi joined before, so plugins' requests go out
    at once; Wi-Fi switches off and on in the settings as on a device.
    Without it, nothing changes.
  • Plugins can be published from GitHub: tag a release in the plugin's
    own repository (topic paperpaw-plugin) and paperpaw.org lists it as
    "Community, unreviewed". tools/dev/templates has the release
    workflow that zips the folder, builds and signs a code plugin and
    makes the release; the handbook and the plugin skill explain it.
  • paperpaw-dev check-publish (and paperpaw-sign check-publish)
    checks a plugin's repository and its release files by the plugin
    store's rules, the site's own (tools/publish/store-rules.json, served
    by paperpaw.org too), and says what to change; the release workflow
    runs it before it builds and on the files it made, and releases
    nothing where it fails. paperpaw-dev new --github <id> makes a
    repository that passes it, the workflow included.
  • Community plugins: the store's new setting Community plugins
    (Settings, System, off at first) also lists plugins that their authors
    published on GitHub, which nobody reviewed. They are marked
    Unreviewed, with the repository they come from; a code plugin's page
    shows the key it is signed with.

Changed

  • Keyboard size works on readers with buttons alone too: Large splits
    the rows into short ones (few presses along each, as before and the
    X4s' default), Medium splits the longest, Small keeps them whole as on
    touch screens (a lower keyboard, more presses).
  • The on-screen keyboard: on readers with buttons alone (the X4s, the X3)
    the focus starts on Phone, where the text can be typed on a phone
    instead of a letter at a time; on the X4 Pro the keys are large by
    default (a size chosen before stays).
  • On the Xteink readers the interface font, drawn from bitmap packs made
    from Source Sans 3, is PaperPaw Sans: its licence reserves the name
    for the unchanged font. A reading or status font chosen as Source Sans
    3 is kept. The unchanged font keeps its name where it is drawn as it
    is.
  • A code plugin's key is trusted from its first install: an update or a
    new install after a removal signed by another key is refused with a
    short warning, from any library; there is no Install anyway any
    more.
  • Firmware is installed only with the battery at 20 % or more, or on
    USB: below it the kernel refuses any install (the update, another
    firmware), checked as the writing would begin, and Update says
    "Charge to 20 % or plug in to install." Downloading goes on. SDK:
    InstallFailure::LowBattery, firmware::INSTALL_BATTERY,
    firmware::battery_allows_install.
  • No surprise restart after an update: while the new firmware runs on
    trial, without its code plugins, the X4 shows "Finishing the
    update…" with a bar that fills, takes no input meanwhile, and starts
    again from there once the update is kept, with its code plugins. SDK:
    builtin::screens::FINISHING_UPDATE.
  • Devices are counted without being known: the update search says
    whether the reader asked (trigger: auto or manual) and of which
    periods it is the device's first search (first: day, week,
    month, in UTC; left out while the clock is not set). No id and no
    request of its own; the device keeps only the date of its last search.
  • Back to CrossPoint without a computer: Update installs another
    firmware's image from the card (not signed, only as chosen, with a
    warning), checked whole for this device first. SDK:
    FirmwareCommand::InstallForeign, firmware::ForeignImage and
    firmware::ForeignCheck.
  • Bluetooth Low Energy for plugins (ADR 0027): paperpaw_sdk::bluetooth
    scans, connects and reads, writes and subscribes to a device's
    characteristics, pairs (always confirmed by the reader in the kernel's
    own question), advertises and serves GATT services, for plugins that
    declare Uses::BLUETOOTH. The kernel owns the radio, shares it
    between plugins, lets each see only the devices it found or was given,
    keeps bonds with the passwords and keys and switches the radio off
    when nothing needs it. Cheap by default: scans and advertising end
    after a while, passive and seldom unless asked, links at long
    intervals, the radio at the cheapest power that serves every plugin,
    and its time on counted (Usage::bluetooth_ms). A bonded remote's or keyboard's keys are
    buttons of the key maps (button.hid.right, button.hid.page-down …,
    pages turned by default). The emulator has made-up devices for the X4
    Pro's profile: a page-turner (ble-key:right in scripts) and a
    heart-rate belt.
  • Bluetooth page (Settings, where there is Bluetooth): the devices bonded
    with the reader, Add a device (a search, then pairing confirmed on the
    reader), forgetting one (the menu button or a long press), which
    plugins may use a sensor, and Remotes: when a remote's or a keyboard's
    keys work (when switched on, while reading, or always). A remote that
    falls asleep connects again by itself when it wakes, as long as its
    keys are wanted.
  • Code plugins must be built again. The plugin interface is now 3
    (Command, Env, Capabilities, MenuNeed, Usage, Work and
    FirmwareCommand changed, for Bluetooth and another firmware): a code
    plugin built for an earlier release does not run on this one until it
    is built again with this release's SDK, and the plugin manager says
    so. PaperPaw's own store plugins come as updates. Work's network
    and charging became needs (Needs::NETWORK | Needs::CHARGING).

Fixed

  • Uploads over Wi-Fi no longer stall when the card fails to take a part:
    the X4s answer at once, while the file still comes (500 where the
    card failed, 507 where it is full), instead of holding the upload
    until it timed out. The X4 Pro tries a write to a card still busy
    writing more often before it gives up, as some cards are while the
    radio sends.
  • Status lines stand every item on one line: the battery, icons and bars
    centred on the figures of the time, the page and the percentage, and
    those in the middle of the line, to the pixel. The battery stood a
    pixel higher than its percentage.
  • Customise menus names the menus of the font choosers (their way to
    more fonts) as the settings are named, e.g. Status lines › Font,
    instead of showing core.status-font and core.reading-font. A test
    walks the menu editor, every settings page and chooser and every
    menu in each language shipped and fails on an id shown as a name.
  • Test builds for the X4 Pro and the X4 Classic (with remote control
    over USB) took no updates over the air ("OTA: no partitions for
    updates"): their image's two data segments hid which half of the
    flash runs. The firmware now finds it either way. Released firmware
    was not affected. The release now fails for an image that could not
    take the next update (paperpaw-sign check-image: two app slots in
    its table, one data segment, room in either slot and CrossPoint's),
    and host tests run whole updates with every partition table shipped
    and CrossPoint's.

PaperPaw 0.5.0-beta.6

Choose a tag to compare

@github-actions github-actions released this 25 Oct 00:46

Added

  • The web flasher can put every store plugin on a reader at once: it
    writes the plugins chosen into the reader's empty second app
    partition, where all of them fit (about 4.8 MB on the X4), instead of
    the room behind the firmware (about 1.9 MB). PaperPaw installs them
    onto the card at its first start and only then frees the partition
    for updates; a power cut in between installs them at the next start.
    The room behind the firmware is still read, for older flashers.

PaperPaw 0.5.0-beta.5

PaperPaw 0.5.0-beta.5 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Oct 23:39

Fixed

  • After the Wi-Fi link is lost and joined again, the X4s count as
    online only once the router gave their address again. Before, they
    were online at once with the old one, which the router's answer then
    took back, so a request made in between failed.
  • Touch lock: the way out it explains (tap twice, hold the second tap)
    unlocks; it wanted a third touch held after two taps, which still
    works too.
  • Choosing another Wi-Fi network while joined to one works on the X4s:
    they leave the first network before joining, instead of failing with
    "did not answer". Networks are joined with the security the scan found
    (WPA and mixed WPA/WPA2 ones too), and a password that was not taken
    for another reason than being wrong is offered again, not typed anew.
  • News: articles with a long body in a CDATA section (WordPress feeds, The
    Verge) show their whole text; the reader dropped any section over 4 KiB
    and fell back to the summary. The XML reader now passes a long CDATA
    section on in pieces, in the same small memory. Dates, Atom
    and RSS, show short as the language writes them (Sat 24 Oct 2026).

Added

  • Switching from CrossPoint without a computer: each release has an
    install file per device (paperpaw-<device>-<version>-install.bin)
    for CrossPoint's SD firmware update, and CI fails a build that no
    longer fits CrossPoint's app slot. PaperPaw runs in the partitions it
    finds; where no room for code plugins is left there (the X4), the
    store says so and refuses them.
  • The X4 Classic's firmware comes with each release, marked
    experimental: built, not yet tried on a real device. It follows its
    stock firmware where the FreeInk SDK and Papyrix agree: the panel at
    10 MHz with its factory frame rate, its controller as the factory's
    NVS names it (else as it answers, else a UC8279), the charging pin
    high while charging, the card started up to four times, and its
    power kept on through sleep. Its partitions keep the factory's NVS
    whole.
  • The Xteink X3's firmware comes with each release too (cargo x3),
    experimental and not yet tried on one, without store plugins yet: the
    X4's chip and buttons, its UC8253 panel at 792 x 528 in black and
    white, a fuel gauge and a clock; an emulator profile too. What is not
    known without a device is listed in shells/xteink.
  • The plugin store has five more groups, so every kind of plugin has a
    place: notes, learning, news, tools and games, before system. Of
    PaperPaw's own plugins, vocabulary moved to learning; news, wallabag
    and the browser to news; readwise and joplin to notes.
  • paperpaw-dev checks the group in store/store.ini (package.store-group).

PaperPaw 0.5.0-beta.4

PaperPaw 0.5.0-beta.4 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Oct 17:15

A beta for updates over the air, from testing the update to beta.2 on
the X4 and X4 Pro, and for the largest interface text, which every
screen now takes. Code plugins built for earlier betas run unchanged:
the plugin interface stays 2.

Fixed

  • After an update passed its first minute on trial, the X4s restart by
    themselves, so that code plugins (store tools) are there again; before,
    they were missing until the next start.
  • A download that got no answer at all (seen on the second connection
    after the update check, until a restart) is tried once more with the
    radio started anew.
  • After an update the device no longer asks to make Diagnostics the home
    screen: it no longer binds the home slot, and the plugin manager offers
    a new screen for a slot only when it is bound as high as the one in use.

Added

  • SDK: UiStyle::noted_row_for makes a list's rows as high as its
    notes need, up to NOTE_LINES_MOST (4) lines, and
    ListView::set_row sizes them anew; a row's note shows as many lines
    as its row holds.

Fixed

  • After an update the device no longer asks whether to make Diagnostics
    (or any screen bound only as a fallback) the home screen: Diagnostics
    binds no slot, and a newly offered screen is asked about only where it
    binds the slot as high as the one in use. Env::slot_screens lists
    the highest priority first.
  • At the largest interface text on small screens the notes of About,
    Keys, News, a catalog's fields, Plugins, Profiles, Cards and Wi-Fi
    show whole.
  • After an update over the air the plugins installed from the store
    (statistics, widgets, the syncs) work again by themselves: once the
    update ran its 30 seconds of trial, which go without them, the X4s
    start again, at once or once the book open is left. Before, an update
    that kept the plugins' builds left them off until the next start.
  • A download that gets no answer at all (seen with updates on the X4
    and the X4 Pro: connected, then nothing until a restart) is made once
    more after the X4s start their radio anew, instead of failing with
    "The update could not be downloaded". Its log line says where it was
    connected and how much memory was free.

PaperPaw 0.5.0-beta.3

PaperPaw 0.5.0-beta.3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Oct 16:13

A beta with fixes from testing beta.2: a press made while a new screen
still refreshes is no longer lost, and more screens fit at the largest
interface text. Code plugins built for earlier betas run unchanged: the
plugin interface stays 2.

Fixed

  • A press made while a new screen was still being refreshed (opening
    Settings on the X4 takes a full refresh) was dropped, so the first
    press after opening a screen sometimes did nothing. The X4s now count
    a screen as shown when its refresh begins.
  • At the largest interface text more screens fit: the statistics'
    calendar (its days no longer shrink to dots) and overview, the device
    check, the store's plugin page and source, the Calibre hint, the file
    finder and catalogs, the phone step of Wi-Fi, the statistics' sync
    and the profiles. Store plugins changed so carry version 1.0.1.
  • Vocabulary 1.0.1: a card answered Again waits its ten minutes before
    it comes back (also published on its own, between betas).
  • A store plugin released on its own is built for the X4 Classic too.