Description
I have problems with loading images from file on ESP32. When I open file manualy, image is shown on screen, but when I try to open file via img.set_src('/image.bin')
, nothing happened.
Deep investigation points to problem with opening files by lvgl on ESP’s internal FS. All lv.fs*
functions ends with ret code 3 (LV_FS_RES_FS_ERR
)
Platform
ESP32
Question:
If I understand well, I must define file driver (lv.fs_drv_t()
) to be able access files on internal FS?
Code:
Non-functional code:
import lvgl as lv
lv.init()
from ili9341 import ili9341
from xpt2046 import xpt2046
disp = ili9341()
touch = xpt2046(cal_x0=441, cal_y0=3810, cal_x1=3406, cal_y1=443)
scr = lv.obj()
lv.scr_load(scr)
lv.img.cache_set_size(16)
img = lv.img(scr)
img.set_src('/vz2.bin')
img.align(scr, lv.ALIGN.CENTER, 0, 0)
This code DO NOT load image onto screen.
This is output on console:
Info: lv_init ready (../../lib/lv_bindings/lvgl/src/lv_core/lv_obj.c #121)
Warn: lv_init: already inited (../../lib/lv_bindings/lvgl/src/lv_core/lv_obj.c #83)
ILI9341 initialization completed
Enable backlight
Double buffer
Info: Screen create ready (../../lib/lv_bindings/lvgl/src/lv_core/lv_obj.c #234)
Info: Screen create ready (../../lib/lv_bindings/lvgl/src/lv_core/lv_obj.c #234)
Info: Screen create ready (../../lib/lv_bindings/lvgl/src/lv_core/lv_obj.c #234)
Info: Screen create ready (../../lib/lv_bindings/lvgl/src/lv_core/lv_obj.c #234)
Info: image created (../../lib/lv_bindings/lvgl/src/lv_objx/lv_img.c #110)
Info: image draw: cache miss, cached to an empty entry (../../lib/lv_bindings/lvgl/src/lv_draw/lv_img_cache.c #120)
Warn: Image draw cannot open the image resource (../../lib/lv_bindings/lvgl/src/lv_draw/lv_img_cache.c #129)
Warn: Image draw error (../../lib/lv_bindings/lvgl/src/lv_draw/lv_draw_img.c #62)
Info: image draw: cache miss, cached to an empty entry (../../lib/lv_bindings/lvgl/src/lv_draw/lv_img_cache.c #120)
Warn: Image draw cannot open the image resource (../../lib/lv_bindings/lvgl/src/lv_draw/lv_img_cache.c #129)
Warn: Image draw error (../../lib/lv_bindings/lvgl/src/lv_draw/lv_draw_img.c #62)
Info: image draw: cache miss, cached to an empty entry (../../lib/lv_bindings/lvgl/src/lv_draw/lv_img_cache.c #120)
Warn: Image draw cannot open the image resource (../../lib/lv_bindings/lvgl/src/lv_draw/lv_img_cache.c #129)
Warn: Image draw error (../../lib/lv_bindings/lvgl/src/lv_draw/lv_draw_img.c #62)
Info: image draw: cache miss, cached to an empty entry (../../lib/lv_bindings/lvgl/src/lv_draw/lv_img_cache.c #120)
Warn: Image draw cannot open the image resource (../../lib/lv_bindings/lvgl/src/lv_draw/lv_img_cache.c #129)
Warn: Image draw error (../../lib/lv_bindings/lvgl/src/lv_draw/lv_draw_img.c #62)
It looks like unable to open file.
Working code:
is based on load png example, but implements only header reader:
def get_img_info(decoder, src, header):
# Only decode header from image
if lv.img.src_get_type(src) != lv.img.SRC.VARIABLE:
return lv.RES.INV
img_header = bytes(lv.img_dsc_t.cast(src).data.__dereference__(4))
hdr = struct.unpack(">L", img_header)[0]
cf = (hdr >> 24) & 0x1f
w = (hdr >> 18) & 0x3f | (hdr & 0x1f00) >> 2
h = (hdr >> 13) & 0x07 | (hdr & 0xff) << 3
header.always_zero = 0
header.w = w
header.h = h
header.cf = cf
print("width=%d, height=%d, cf=%d" % (header.w, header.h, header.cf))
return lv.RES.OK
def show_img(lv_img, path):
# wrapper to load image via one function call
with open(path,'rb') as f:
img_data = f.read()
f.close()
img_dsc = lv.img_dsc_t()
img_dsc.data = img_data
img_dsc.data_size = len(img_data)
raw_dsc = lv.img_dsc_t()
get_img_info(None, img_dsc, raw_dsc.header)
raw_dsc.data = img_data[4:] # stripped header
raw_dsc.data_size = raw_dsc.header.w * raw_dsc.header.h * lv.color_t.SIZE
lv_img.set_src(raw_dsc)
disp = ili9341()
touch = xpt2046(cal_x0=441, cal_y0=3810, cal_x1=3406, cal_y1=443)
scr = lv.obj()
lv.scr_load(scr)
lv.img.cache_set_size(2)
img = lv.img(scr)
lp.show_img(img, '/vz2.bin')
img.align(scr, lv.ALIGN.CENTER, 0, 0)
Same image is displayed…