RISC-V生态开发套件解析(七):LicheeRV 86开发板快速开始Waft应用

简介: 随着RISC-V生态的蓬勃发展,相关开源开发套件也开始逐渐丰富。为了帮助开发者快速了解、玩转新推出的RISC-V开发套件,OCC推出RISC-V生态开发套件解析系列内容,详细讲解生态开发套件的功能特点与上手教程。

编辑语:

随着RISC-V生态的蓬勃发展,相关开源开发套件也开始逐渐丰富。为了帮助开发者快速了解、玩转新推出的RISC-V开发套件,OCC推出RISC-V生态开发套件解析系列内容,详细讲解生态开发套件的功能特点与上手教程。


通过上期内容的介绍,许多开发者已经初步了解了Waft应用的开发,并完成了Waft运行环境的搭建。本期内容旨在加深大家对Waft应用开发的了解,我们将通过拆解Waft应用的开发步骤,手把手教大家创建一个Waft应用。


01 开发环境支持


MacOS,Linux(Windows支持wsl、linux虚拟机)


02 waft开发流程


图片.png


03 安装waft-cli 工具


PS: 权限问题使用sudo执行即可


npm i waft-cli -g


使用 Windows 的开发者,可以安装官方推荐的wsl,推荐安装Linux虚拟机-Ubuntu(18.04、20.04), Linux 的发行版本推荐安装 Ubuntu(18.04、 20.04), 可在微软商店中下载。之后可在对应的 Linux 环境中执行开发所需命令。


wal网址:

https://docs.microsoft.com/en-us/windows/wsl/install?spm=a2cl5.25411629.0.0.2c5a180fdX4SIu



Ubuntu网址:https://www.microsoft.com/zh-cn/p/ubuntu-2004-lts/9n6svws3rx71?spm=a2cl5.25411629.0.0.2c5a180fdX4SIu&rtc=1#activetab=pivot:overviewtab


04 创建项目


通过waft脚手架初始化项目,会引导您进行项目命名等,您将得到一个新project


需要Node 14版本以上


waft init


图片.png

image.gif


这里我们选择第9个模板,平头哥天气Demo


05 启动调试服务


cd my-waft-project
npm run start


REPL命令行模式

启动后自动开启REPL模式,您可以通过.help查询支持哪些命令列表。


打包


waft>.build --aot=true --aotTarget=riscv64


编译后的产物在工程目录的build目录下,产物名称为app.aot,示例视频如下。

图片.png


文件夹及目录说明:


图片.png


06 推送


方式1(adb push):

电脑与开发板用type-c数据线连接,注意使用adb push通道,参考下图标注

image.gif图片.png


adb push build/app.aot /mnt/UDISK/wasm/


方式2(scp):

pc及开发板需要在同一个局域网内。


scp build/app.aot root@172.16.1.36:/mnt/UDISK/wasm


172.16.1.36替换为开发板的ip地址,ssh的登陆密码为:tina。


07 运行waft


通过adb shell或者串口接入开发板,在adb shell终端或者串口工具终端输入如下命令:


waft_app /mnt/UDISK/wasm/app.aot


示例运行界面:


image.gif图片.png


模拟器调试

当前只支持Mac模拟器    部分API不支持


点击面板中的启动模拟器,初次会自动下载模拟器(时间较长,需要等待一会)。


完整可以参考此文档:

https://www.yuque.com/waft/docs/dywumg_wk97d5?spm=a2cl5.25411629.0.0.77da180f7fYw5F


Web调试(Beta)

Web调试是通过将页面跨平台到Web端进行运行和渲染。由于Web端样式一致性仍在建设中,所以尽量以真机和模拟器的效果为准。


可以通过start时提示的链接打开进入。


08 布局和样式


1. 布局写法和数据绑定


Waft基于核心的响应式的数据绑定模块,来实现逻辑层修改数据,就能驱动视图层的更新的效果。


视图代码:


<div>
  <div>{{title}}</div>
  <div onTap="tapMe">示例按钮</div>
</div>


逻辑脚本:


let page: Login;
export class Login extends Page {
  constructor(props: ComponentProps) {
    super(props);
    page = this; // assemblyScript不支持闭包,在闭包中需要先赋给全局变量
    this.addEventListener('tapMe', function () {
      page.setState(`{"title":"Hello Waft"}`);
    });
  }
  onLoad(query: JSONObject): void{
    console.log('onload')
  }
}


如上所示,只要点击示例按钮,就会触发执行tapMe的函数回调,从而进行title字段的状态更新,视图因此会根据状态更新内容。


2.样式写法


Waft支持了主流的css样式,以及web规范的css写法,布局的单位为rpx,示例如下:


.title-div{
  width: 30rpx;
  height: 10rpx;
  background-color: red;
}
.title-text{
  font-size: 20rpx;
  color: #FFFFFF;
}


目前对rules规则如@media,css变量等能力暂未支持,具体可以参考ACSS规范:https://www.yuque.com/waft/docs/taglw5


3. 布局基准


默认框架的布局基准为1024px(指的是布局设计的全屏宽度像素)。


全屏应用:可以在app.json配置中自定义应用的基准。比如天猫精灵全屏的应用可以配置为1024。


{
  "pages": [
    "pages/index/index"
  ],
  "widgets":[
    "widgets/weather/weather"
  ]
  "window": {
    "defaultTitle": "Hello Waft"
  },
  "viewport": 1024
}


widget:需要在具体的某个widget的.json文件下配置,如果样式基准为300px来布局,可以配置viewport字段为300,如下:


{
  "usingComponents": {
    "card-layout": "waft-ui/src/components/card-layout/card-layout"
  },
  "viewport": 300
}


09 页面逻辑写法

页面逻辑的写法示例如下:


1. Function写法


import { JSON, JSONArray, JSONObject } from "waft-json";
import { getDataSource, log, FuncPage } from "waft";
let thisPage: FuncPage;
export function Index(page: FuncPage): void{
  thisPage = page;
  // 设置默认state
  page.setState(getDataSource().toString());
  page.onload = function (query: string) {
    log('--> onload:' + query);
  };
  page.onshow = function (event: string) {
    log('--> onshow:' + event);
  };
  page.onhide = function (event: string) {
    log('--> onhide:' + event);
  };
  page.onunload = function (event: string) {
    log('--> onunload:' + event);
  };
  page.addEventListener('tapTitle', function (event: string) {
    log('--> tapTitle event:' + event);
    thisPage.setState(`{"title":"Hello Waft"}`);
  });
}


2. Class写法


import { JSON, JSONObject } from "waft-json";
import { console, getDataSource, Page, ComponentProps, BaseEvent } from "waft";
let thisPage: Page;
export class Index extends Page {
  constructor(props: ComponentProps){
    super(props);
    thisPage = this;
    // 设置默认的state
    this.setState(JSON.stringify(getDataSource()));
    this.addEventListener('tapTitle', function (event: BaseEvent) {
      console.log('tapTitle event');
      thisPage.setState(`{"title":"Hello Waft"}`);
    });
  }
  onShow(): void{
    // 页面显示
    console.log('page onShow');
  }
  onLoad(query: JSONObject): void{
    // 页面加载后
    console.log('page onLoad:' + JSON.stringify(query));
  }
  onHide(): void{
    // 页面隐藏
    console.log('page onHide');
  }
  onUnLoad(): void{
    // 页面销毁
    console.log('page onUnLoad');
  }
  onMessage(data: JSONObject): void{
    // 信息推送更新
    console.log('page onMessage:' + JSON.stringify(data));
  }
  onError(error: Error): void{
    // 错误
    console.log('page onError');
  }
}


10 Page开发示例


根据模板创建页面

在src/pages下新建页面demo,包含了demo.axml,demo.acss,demo.ts,demo.json4个文件


在app.json中配置页面


{
  "pages": [
    "pages/demo/demo"
  ],
  "window": {
    "defaultTitle": "Hello Waft"
  }
}


【可选】在app.json配置页面渲染基准:

waft支持配置viewport。viewport代表了视觉布局的卡片总宽度基准(手机上都按750px布局),如果你的页面设计宽度总像素是按1024px布局,那只要设置viewport为1024,css即可按照1024rpx来写。(可以不配置,默认waft会按1024px来布局)


{
  "pages": [
    "pages/demo/demo"
  ],
  "window": {
    "defaultTitle": "Hello Waft"
  }
  "viewport": 1024
}


【可选】在mock.json中配置页面mock启动参数:

启动参数包含了以下值:

  • path: 启动页面路径;(默认为首页)
  • query: 启动的query参数
  • dataSource:启动的额外下发数据 (如服务端预先请求完数据,会放到dataSource下)


可以在src目录下的mock.json文件中配置数据,该数据可以在运行环境中通过 getLaunchData() 函数调用。


会在实际下发时按照实际运行,该参数只影响调试环境,不影响生产运行环境。


{
  "path": "pages/demo/demo",
  "query": {
    "id": "123456"
  }
  "dataSource":{
    "title": "hello"
  }
}


在axml文件中开发界面:

开发界面和数据绑定


<div>
  <div>{{title}}</div>
</div>


在ts文件中开发逻辑:

  • 可以在页面初始化时,通过全局的getLaunchData()方法,获取到应用启动的信息

  • 取出其中的dataSource字段,设置到默认的state
  • 在生命周期中,可以进行您的定制操作


import { JSON, JSONObject } from "waft-json";
import { console, getDataSource, WaftPage, ComponentProps } from "waft";
export class Index extends WaftPage {
  constructor(props: ComponentProps){
    super(props);
    this.setState(JSON.stringify(getDataSource()));
  }
  onShow(): void{
    console.log('page onShow');
  }
  onLoad(query: JSONObject): void{
    console.log('page onLoad:' + JSON.stringify(query));
  }
  onHide(): void{
    console.log('page onHide');
  }
  onUnLoad(): void{
    console.log('page onUnLoad');
  }
  onMessage(data: JSONObject): void{
    console.log('page onMessage:' + JSON.stringify(data));
  }
  onError(error: Error): void{
    console.log('page onError');
  }
}


11 waft-router


waft框架提供了多页路由的api。


在目录里新建多个页面,并在app.json中配置

image.gif

图片.png


在app.json中配置页面,和默认启动页

图片.png


在页面中使用history API跳转

push

跳转路由界面


const query = new JSONObject();
query.set("id", 123);
// query可以省略 或用 null 或 new JSONObject()
history.pushState({url : 'pages/detail/detail', query: query });


replace

替换当前页面,换为路由界面


// query可以省略 或用 null 或 new JSONObject()
history.replaceState({url : 'pages/detail/detail', query: JSON.parseObject(`{"id":"123456"}`)});


goBack

返回上一页


history.goBack();


12 waft-store

waft提供了全局状态store。


store数据获取


improt { store } from 'waft';
const globalData = store.getGlobalData();


store设置数据


import { store } from 'waft'
store.dispatch('state', new JSONObject())


store更新订阅

在component或者page中,可以通过this.observer方法监听全局store的更改。


immediate参数标识是否默认立即返回初始的状态。


export class Login extends Page {
  constructor(props: ComponentProps) {
    super(props);
    // 监听全局store变化
    this.observer(['menuData'], (key:string, data: JSONObject)=>{
      console.log('menuData change:' + data.toString());
    }, {
      immediate: true
    });
  }
}


store默认映射到当前页面的state

在component或者page中,可以通过this.connect方法把store中的内容订阅并同步到page的state上。


第二个参数可以传入一个reducer,修改参数再返回。return null时不处理。


export class Login extends Page {
  constructor(props: ComponentProps) {
    super(props);
    // 自动把store的key内容同步到page的state
    this.connect(['menuData']);
    // 监听全局store变化,并修改; 
    this.connect(['menuData'], (key:string, data: JSONObject, oldData: JSONObject | null)=>{
      return data;
    });
  }
}


附:

waft开发手册:https://www.yuque.com/waft/docs/ubi8k4


13 下期预告


本期内容就介绍到这里,下期我们将带大家上手Button的使用,欢迎大家持续关注RISC-V生态开发套件系列内容。

相关文章
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
72 10
|
1天前
|
安全 API 数据安全/隐私保护
速卖通AliExpress商品详情API接口深度解析与实战应用
速卖通(AliExpress)作为全球化电商的重要平台,提供了丰富的商品资源和便捷的购物体验。为了提升用户体验和优化商品管理,速卖通开放了API接口,其中商品详情API尤为关键。本文介绍如何获取API密钥、调用商品详情API接口,并处理API响应数据,帮助开发者和商家高效利用这些工具。通过合理规划API调用策略和确保合法合规使用,开发者可以更好地获取商品信息,优化管理和营销策略。
|
21天前
|
安全 前端开发 Android开发
探索移动应用与系统:从开发到操作系统的深度解析
在数字化时代的浪潮中,移动应用和操作系统成为了我们日常生活的重要组成部分。本文将深入探讨移动应用的开发流程、关键技术和最佳实践,同时分析移动操作系统的核心功能、架构和安全性。通过实际案例和代码示例,我们将揭示如何构建高效、安全且用户友好的移动应用,并理解不同操作系统之间的差异及其对应用开发的影响。无论你是开发者还是对移动技术感兴趣的读者,这篇文章都将为你提供宝贵的见解和知识。
|
27天前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
22天前
|
机器学习/深度学习 搜索推荐 API
淘宝/天猫按图搜索(拍立淘)API的深度解析与应用实践
在数字化时代,电商行业迅速发展,个性化、便捷性和高效性成为消费者新需求。淘宝/天猫推出的拍立淘API,利用图像识别技术,提供精准的购物搜索体验。本文深入探讨其原理、优势、应用场景及实现方法,助力电商技术和用户体验提升。
|
25天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
28天前
|
编译器 PHP 开发者
PHP 8新特性解析与实战应用####
随着PHP 8的发布,这一经典编程语言迎来了诸多令人瞩目的新特性和性能优化。本文将深入探讨PHP 8中的几个关键新功能,包括命名参数、JIT编译器、新的字符串处理函数以及错误处理改进等。通过实际代码示例,展示如何在现有项目中有效利用这些新特性来提升代码的可读性、维护性和执行效率。无论你是PHP新手还是经验丰富的开发者,本文都将为你提供实用的技术洞察和最佳实践指导。 ####
30 1
|
28天前
|
前端开发 Android开发 UED
移动应用与系统:从开发到优化的全面解析####
本文深入探讨了移动应用开发的全过程,从最初的构思到最终的发布,并详细阐述了移动操作系统对应用性能和用户体验的影响。通过分析当前主流移动操作系统的特性及差异,本文旨在为开发者提供一套全面的开发与优化指南,确保应用在不同平台上均能实现最佳表现。 ####
28 0
|
29天前
|
存储 供应链 算法
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
56 0
|
1月前
|
存储 监控 API
深入解析微服务架构及其在现代应用中的实践
深入解析微服务架构及其在现代应用中的实践
41 0

热门文章

最新文章

推荐镜像

更多