Javascript 支持

思澈SDK选用QuickJS作为JS的开发运行平台。QuickJS是一个轻量的可嵌入的 JavaScript 引擎,支持包括模块、异步生成器、proxies、BigInt 等功能在内的 ES2020 标准。QuickJS 也选择性地支持数学扩展,例如大十进制浮点数(BigDecimal)、大二进制浮点数(BigFloat)和运算符重载。

SDK将QuickJS和思澈的应用程序框架以及表盘框架做了集成,可以和现有的以C语言为基础开发的应用和表盘共存。在watch_demo中,提供了JS的示例。其中 SDK_ROOT/example/watch_demo/project/jsroot 里面的JS运行在开发版中,需要通过project里面的 jsroot.bat 下载到开发板中运行,例如ec-lb555开发板, SDK_ROOT/example/watch_demo/project/ec-lb555/jsroot.bat 会将 SDK_ROOT/example/watch_demo/project/jsroot 里面的所有内容打包为一个文件系统,下载到开发版中。 SDK_ROOT/example/watch_demo/project/simulator/disk 下面的JS时模拟器运行的JS代码,和开发版中的代码相同,但是使用的资源格式不一样, 模拟器不支持思澈芯片特有的EZIP格式。

1. QuickJS 的初始化

目前QucikJS的初始化是在第一个JS的应用或者表盘启动的时候完成的,初始化由SDK内部应用
表盘框架JS适配模块调用,所有JS的应用
表盘共享同一个JS运行上下文环境。为了和LVGL的单线程环境匹配,QuickJS也是单线程运行在LVGL的线程中。 SDK QuickJS 目前需要:

  • 4K bytes 栈,

  • 512K的运行堆。具体使用多少堆的内存,取决于运行的应用和表盘。

  • 210K 的基础库ROM

  • 其他扩展库,包括应用框架,以及LVGL支持, 需要 10K ROM,6K RAM.

2. 应用框架和表盘框架支持

在Quick JS标准的class支持之上,SDK添加了应用框架和表盘框架支持,当系统启动的时候,会自动扫描文件系统的根目录,如果:

-发现目录以JA_开头, JA_<app_name>

  这个是Javascript的应用,目录中main.js是应用的主程序,需要定义一个class,名字app_name,继承自app class,并注册在JS全局变量中。Thumb.bin是APP的图标。

-发现目录以JW_开头, JW_<watchface_name>

  这个是Javascript的表盘,目录中 _main.js_ 是表盘的主程序,需要定义一个class,名字watchface_name,继承自app class,并注册在JS全局变量中。

备注

表盘和APP JS有区别在constructor: java     //这个表盘的 main.js应该在/JW_wf8目录下     class wf8 extends app{  //定义表盘         constructor() {             super(1);   // 表盘需要设置参数1, 其他应用使用0(默认值)         }         ...     }    

3. 应用框架函数包装

SDK 在lv 模块中,也包装了应用框架的gui_app_xxx 函数, 包括:

  • \ref gui_app_cleanup

  • \ref gui_app_cleanup_now

  • \ref gui_app_exit

  • \ref gui_app_get_clock_parent

  • \ref gui_app_get_intent

  • \ref gui_app_get_page_userdata

  • \ref gui_app_get_running_apps

  • \ref gui_app_goback

  • \ref gui_app_goback_to_page

  • \ref gui_app_init

  • \ref gui_app_is_actived

  • \ref gui_app_is_all_closed

  • \ref gui_app_manual_goback_anim

  • \ref gui_app_remove_page

  • \ref gui_app_run

  • \ref gui_app_run_now

  • \ref gui_app_self_exit

  • \ref gui_app_set_page_userdata

4. LVGL 支持

SDK提供了LVGL的JS支持,其中

  • lv.obj lv.obj 是基础LVGL控件, 每一个成员函数和lv_obj_xxx对应,为了节省内存,SDK仅仅输出了部分lv_obj_xxx函数作为lv.obj的成员, 目前包括:

    • create

    • align_to

    • get_x

    • get_y

    • set_pos

    • set_size

    • set_local_font

    • set_page_glue

    • align

    • get_height

    • get_width

    • add_flag

    • move_foreground

    • move_background

    • delete
      此外, lv.obj还增加了:

    • set_obj
      这个函数在继承自lv.obj的控件创建时,设置已经创建的lv obj(c语言指针),这样基类就不需要重复创建了。

    • bind
      这个函数把控件和一个已知数据类型绑定,当数据产生时,可以调用回掉

    • set_event_cb
      这个函数在控件接收lv event时候,调用回掉函数。

  • 继承自lv.obj的LV 控件

    • img
      由LVGL提供的图像控件

    • label
      由LVGL提供的Label控件

    • analogclk
      思澈开发的模拟表盘控件

    • idximg
      思澈开发的多图像切换控件,图像有共同的文件头,以00-99为文件名尾,进行循环切换。

    • lvsfapng
      思澈特有的压缩图像动画格式,尽在58x芯片支持

    • lvsfbarcode
      思澈开发的条码控件

    • lvsfcomp
      思澈开发的苹果风格组合控件

    • lvsfcorner
      思澈开发的苹果风格四角控件

    • lvsfcurve
      思澈开发的弯曲字符串显示控件

    • qrcode
      LVGL提供的二维码控件

    • rlottie
      思澈集成的lottie动画控件

  • 图片资源 Javascript的代码中,可能需要使用一些图片。思澈提供特有的图像压缩格式,可以帮助用户节省flash控件。思澈芯片采用硬件加速解码,可以达到流畅的用户体验。 SDK有工具将PNG文件转换为私有格式,工具在 /tools/png2ezip/ezip.exe。
    其中,用于:

    • 模拟器:

      • ezip -convert xxx\yyy.png -rgb565 -binfile 1
        转换单个文件,颜色格式RGB565

      • ezip -dir xxx -rgb565 -binfile 1
        转换目录中所有PNG文件,颜色格式RGB565

    • 开发板:

      • ezip -convert xxx\yyy.png -rgb565 -binfile 2
        转换单个文件,颜色格式RGB565

      • ezip -dir xxx -rgb565 -binfile 2
        转换目录中所有PNG文件,颜色格式RGB565 生成的文件在当前目录下output子目录.

5. 数据业务支持

SDK提供了LVGL的控件和数据业务的绑定,通过lv.obj的bind函数,可以在JS代码中,处理收到的数据。 底层C代码在收到数据的时候,可以通过对绑定的lv obj, 发送LV_EVENT_REFRESH事件,将数据作为参数,这样JS的回掉就会被调用处理。 数据格式的定义请参考 $SDK_ROOT/external/quickjs/lvgl/gui_app_data.h , SDK会把C的结构转换为相应的JS object.