mkpine.github.io-pine

External resources

Since InfiniTime 1.11 apps and watchfaces can benefit from the external flash memory to store images and fonts. This external memory is a lot bigger (4MB) than the internal memory that contains the firmware (512KB).

This page describes how the resources are integrated in InfiniTime from a developer perspective. This page explains how to install and update the external resources using companion apps.

Resources generation

Resources are generated at build time via the CMake target Generate Resources. It runs 3 Python scripts that respectively convert the fonts to binary format, convert the images to binary format and package everything in a .zip file.

The resulting file infinitime-resources-x.y.z.zip contains the images and fonts converted in binary .bin files and a JSON file resources.json.

Companion apps use this file to upload the files to the watch.

{
    "resources": [
        {
            "filename": "lv_font_dots_40.bin",
            "path": "/fonts/lv_font_dots_40.bin"
        }
    ],
    "obsolete_files": [
        {
            "path": "/example-of-obsolete-file.bin",
            "since": "1.11.0"
        }
    ]
}

The resource JSON file describes an array of resources and an array of obsolete files :

Resources update procedure

The update procedure is based on the BLE FS API. The companion app simply write the binary files to the watch FS using information from the file resources.json.

Working with external resources in the code

Load a picture from the external resources:

lv_obj_t* logo = lv_img_create(lv_scr_act(), nullptr);
lv_img_set_src(logo, "F:/images/logo.bin");

Load a font from the external resources: you first need to check that the file actually exists. LVGL will crash when trying to open a font that doesn’t exist.

lv_font_t* font_teko = nullptr;
if (filesystem.FileOpen(&f, "/fonts/font.bin", LFS_O_RDONLY) >= 0) {
    filesystem.FileClose(&f);
    font_teko = lv_font_load("F:/fonts/font.bin");
}

if(font != nullptr) {
    lv_obj_set_style_local_text_font(label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font);
}